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

Artifact 230a367c50d84f15e92545f3d468acf192726696:


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: 34 32 20 32 30 30 35 2f 31 32 2f 33 30 20 31 36  42 2005/12/30 16
01c0: 3a 32 38 3a 30 32 20 64 61 6e 69 65 6c 6b 31 39  :28:02 danielk19
01d0: 37 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69 66 6e  77 Exp $.*/.#ifn
01e0: 64 65 66 20 4e 4f 5f 54 43 4c 20 20 20 20 20 2f  def NO_TCL     /
01f0: 2a 20 4f 6d 69 74 20 74 68 69 73 20 77 68 6f 6c  * Omit this whol
0200: 65 20 66 69 6c 65 20 69 66 20 54 43 4c 20 69 73  e file if TCL is
0210: 20 75 6e 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a   unavailable */.
0220: 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74  .#include "sqlit
0230: 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65  eInt.h".#include
0240: 20 22 68 61 73 68 2e 68 22 0a 23 69 6e 63 6c 75   "hash.h".#inclu
0250: 64 65 20 22 74 63 6c 2e 68 22 0a 23 69 6e 63 6c  de "tcl.h".#incl
0260: 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23  ude <stdlib.h>.#
0270: 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e  include <string.
0280: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73  h>.#include <ass
0290: 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ert.h>.#include 
02a0: 3c 63 74 79 70 65 2e 68 3e 0a 0a 2f 2a 0a 20 2a  <ctype.h>../*. *
02b0: 20 57 69 6e 64 6f 77 73 20 6e 65 65 64 73 20 74   Windows needs t
02c0: 6f 20 6b 6e 6f 77 20 77 68 69 63 68 20 73 79 6d  o know which sym
02d0: 62 6f 6c 73 20 74 6f 20 65 78 70 6f 72 74 2e 20  bols to export. 
02e0: 20 55 6e 69 78 20 64 6f 65 73 20 6e 6f 74 2e 0a   Unix does not..
02f0: 20 2a 20 42 55 49 4c 44 5f 73 71 6c 69 74 65 20   * BUILD_sqlite 
0300: 73 68 6f 75 6c 64 20 62 65 20 75 6e 64 65 66 69  should be undefi
0310: 6e 65 64 20 66 6f 72 20 55 6e 69 78 2e 0a 20 2a  ned for Unix.. *
0320: 2f 0a 0a 23 69 66 64 65 66 20 42 55 49 4c 44 5f  /..#ifdef BUILD_
0330: 73 71 6c 69 74 65 0a 23 75 6e 64 65 66 20 54 43  sqlite.#undef TC
0340: 4c 5f 53 54 4f 52 41 47 45 5f 43 4c 41 53 53 0a  L_STORAGE_CLASS.
0350: 23 64 65 66 69 6e 65 20 54 43 4c 5f 53 54 4f 52  #define TCL_STOR
0360: 41 47 45 5f 43 4c 41 53 53 20 44 4c 4c 45 58 50  AGE_CLASS DLLEXP
0370: 4f 52 54 0a 23 65 6e 64 69 66 20 2f 2a 20 42 55  ORT.#endif /* BU
0380: 49 4c 44 5f 73 71 6c 69 74 65 20 2a 2f 0a 0a 23  ILD_sqlite */..#
0390: 64 65 66 69 6e 65 20 4e 55 4d 5f 50 52 45 50 41  define NUM_PREPA
03a0: 52 45 44 5f 53 54 4d 54 53 20 31 30 0a 23 64 65  RED_STMTS 10.#de
03b0: 66 69 6e 65 20 4d 41 58 5f 50 52 45 50 41 52 45  fine MAX_PREPARE
03c0: 44 5f 53 54 4d 54 53 20 31 30 30 0a 0a 2f 2a 0a  D_STMTS 100../*.
03d0: 2a 2a 20 49 66 20 54 43 4c 20 75 73 65 73 20 55  ** If TCL uses U
03e0: 54 46 2d 38 20 61 6e 64 20 53 51 4c 69 74 65 20  TF-8 and SQLite 
03f0: 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f  is configured to
0400: 20 75 73 65 20 69 73 6f 38 38 35 39 2c 20 74 68   use iso8859, th
0410: 65 6e 20 77 65 0a 2a 2a 20 68 61 76 65 20 74 6f  en we.** have to
0420: 20 64 6f 20 61 20 74 72 61 6e 73 6c 61 74 69 6f   do a translatio
0430: 6e 20 77 68 65 6e 20 67 6f 69 6e 67 20 62 65 74  n when going bet
0440: 77 65 65 6e 20 74 68 65 20 74 77 6f 2e 20 20 53  ween the two.  S
0450: 65 74 20 74 68 65 20 0a 2a 2a 20 55 54 46 5f 54  et the .** UTF_T
0460: 52 41 4e 53 4c 41 54 49 4f 4e 5f 4e 45 45 44 45  RANSLATION_NEEDE
0470: 44 20 6d 61 63 72 6f 20 74 6f 20 69 6e 64 69 63  D macro to indic
0480: 61 74 65 20 74 68 61 74 20 77 65 20 6e 65 65 64  ate that we need
0490: 20 74 6f 20 64 6f 0a 2a 2a 20 74 68 69 73 20 74   to do.** this t
04a0: 72 61 6e 73 6c 61 74 69 6f 6e 2e 20 20 0a 2a 2f  ranslation.  .*/
04b0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 54 43 4c  .#if defined(TCL
04c0: 5f 55 54 46 5f 4d 41 58 29 20 26 26 20 21 64 65  _UTF_MAX) && !de
04d0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 55 54 46  fined(SQLITE_UTF
04e0: 38 29 0a 23 20 64 65 66 69 6e 65 20 55 54 46 5f  8).# define UTF_
04f0: 54 52 41 4e 53 4c 41 54 49 4f 4e 5f 4e 45 45 44  TRANSLATION_NEED
0500: 45 44 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ED 1.#endif../*.
0510: 2a 2a 20 4e 65 77 20 53 51 4c 20 66 75 6e 63 74  ** New SQL funct
0520: 69 6f 6e 73 20 63 61 6e 20 62 65 20 63 72 65 61  ions can be crea
0530: 74 65 64 20 61 73 20 54 43 4c 20 73 63 72 69 70  ted as TCL scrip
0540: 74 73 2e 20 20 45 61 63 68 20 73 75 63 68 20 66  ts.  Each such f
0550: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 64 65  unction.** is de
0560: 73 63 72 69 62 65 64 20 62 79 20 61 6e 20 69 6e  scribed by an in
0570: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
0580: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
0590: 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  e..*/.typedef st
05a0: 72 75 63 74 20 53 71 6c 46 75 6e 63 20 53 71 6c  ruct SqlFunc Sql
05b0: 46 75 6e 63 3b 0a 73 74 72 75 63 74 20 53 71 6c  Func;.struct Sql
05c0: 46 75 6e 63 20 7b 0a 20 20 54 63 6c 5f 49 6e 74  Func {.  Tcl_Int
05d0: 65 72 70 20 2a 69 6e 74 65 72 70 3b 20 20 20 2f  erp *interp;   /
05e0: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
05f0: 72 65 74 20 74 6f 20 65 78 65 63 75 74 65 20 74  ret to execute t
0600: 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  he function */. 
0610: 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70   Tcl_Obj *pScrip
0620: 74 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 54 63  t;     /* The Tc
0630: 6c 5f 4f 62 6a 20 72 65 70 72 65 73 65 6e 74 61  l_Obj representa
0640: 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 63 72 69  tion of the scri
0650: 70 74 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65 45  pt */.  int useE
0660: 76 61 6c 4f 62 6a 76 3b 20 20 20 20 20 20 2f 2a  valObjv;      /*
0670: 20 54 72 75 65 20 69 66 20 69 74 20 69 73 20 73   True if it is s
0680: 61 66 65 20 74 6f 20 75 73 65 20 54 63 6c 5f 45  afe to use Tcl_E
0690: 76 61 6c 4f 62 6a 76 20 2a 2f 0a 20 20 63 68 61  valObjv */.  cha
06a0: 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20  r *zName;       
06b0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
06c0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
06d0: 20 53 71 6c 46 75 6e 63 20 2a 70 4e 65 78 74 3b   SqlFunc *pNext;
06e0: 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 66         /* Next f
06f0: 75 6e 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 6c  unction on the l
0700: 69 73 74 20 6f 66 20 74 68 65 6d 20 61 6c 6c 20  ist of them all 
0710: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4e 65 77  */.};../*.** New
0720: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
0730: 6e 63 65 73 20 66 75 6e 63 74 69 6f 6e 20 63 61  nces function ca
0740: 6e 20 62 65 20 63 72 65 61 74 65 64 20 61 73 20  n be created as 
0750: 54 43 4c 20 73 63 72 69 70 74 73 2e 20 20 45 61  TCL scripts.  Ea
0760: 63 68 20 73 75 63 68 0a 2a 2a 20 66 75 6e 63 74  ch such.** funct
0770: 69 6f 6e 20 69 73 20 64 65 73 63 72 69 62 65 64  ion is described
0780: 20 62 79 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   by an instance 
0790: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
07a0: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 74   structure..*/.t
07b0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53 71  ypedef struct Sq
07c0: 6c 43 6f 6c 6c 61 74 65 20 53 71 6c 43 6f 6c 6c  lCollate SqlColl
07d0: 61 74 65 3b 0a 73 74 72 75 63 74 20 53 71 6c 43  ate;.struct SqlC
07e0: 6f 6c 6c 61 74 65 20 7b 0a 20 20 54 63 6c 5f 49  ollate {.  Tcl_I
07f0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 20 20  nterp *interp;  
0800: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
0810: 72 70 72 65 74 20 74 6f 20 65 78 65 63 75 74 65  rpret to execute
0820: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f   the function */
0830: 0a 20 20 63 68 61 72 20 2a 7a 53 63 72 69 70 74  .  char *zScript
0840: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
0850: 73 63 72 69 70 74 20 74 6f 20 62 65 20 72 75 6e  script to be run
0860: 20 2a 2f 0a 20 20 53 71 6c 43 6f 6c 6c 61 74 65   */.  SqlCollate
0870: 20 2a 70 4e 65 78 74 3b 20 20 20 20 2f 2a 20 4e   *pNext;    /* N
0880: 65 78 74 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 20  ext function on 
0890: 74 68 65 20 6c 69 73 74 20 6f 66 20 74 68 65 6d  the list of them
08a0: 20 61 6c 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a   all */.};../*.*
08b0: 2a 20 50 72 65 70 61 72 65 64 20 73 74 61 74 65  * Prepared state
08c0: 6d 65 6e 74 73 20 61 72 65 20 63 61 63 68 65 64  ments are cached
08d0: 20 66 6f 72 20 66 61 73 74 65 72 20 65 78 65 63   for faster exec
08e0: 75 74 69 6f 6e 2e 20 20 45 61 63 68 20 70 72 65  ution.  Each pre
08f0: 70 61 72 65 64 0a 2a 2a 20 73 74 61 74 65 6d 65  pared.** stateme
0900: 6e 74 20 69 73 20 64 65 73 63 72 69 62 65 64 20  nt is described 
0910: 62 79 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  by an instance o
0920: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
0930: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79  structure..*/.ty
0940: 70 65 64 65 66 20 73 74 72 75 63 74 20 53 71 6c  pedef struct Sql
0950: 50 72 65 70 61 72 65 64 53 74 6d 74 20 53 71 6c  PreparedStmt Sql
0960: 50 72 65 70 61 72 65 64 53 74 6d 74 3b 0a 73 74  PreparedStmt;.st
0970: 72 75 63 74 20 53 71 6c 50 72 65 70 61 72 65 64  ruct SqlPrepared
0980: 53 74 6d 74 20 7b 0a 20 20 53 71 6c 50 72 65 70  Stmt {.  SqlPrep
0990: 61 72 65 64 53 74 6d 74 20 2a 70 4e 65 78 74 3b  aredStmt *pNext;
09a0: 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 6c 69 6e    /* Next in lin
09b0: 6b 65 64 20 6c 69 73 74 20 2a 2f 0a 20 20 53 71  ked list */.  Sq
09c0: 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70  lPreparedStmt *p
09d0: 50 72 65 76 3b 20 20 2f 2a 20 50 72 65 76 69 6f  Prev;  /* Previo
09e0: 75 73 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 2a  us on the list *
09f0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
0a00: 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 2f 2a 20   *pStmt;     /* 
0a10: 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  The prepared sta
0a20: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
0a30: 6e 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20  nSql;           
0a40: 20 20 20 20 20 2f 2a 20 63 68 61 72 73 20 69 6e       /* chars in
0a50: 20 7a 53 71 6c 5b 5d 20 2a 2f 0a 20 20 63 68 61   zSql[] */.  cha
0a60: 72 20 7a 53 71 6c 5b 31 5d 3b 20 20 20 20 20 20  r zSql[1];      
0a70: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
0a80: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
0a90: 6e 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  nt */.};../*.** 
0aa0: 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73  There is one ins
0ab0: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74  tance of this st
0ac0: 72 75 63 74 75 72 65 20 66 6f 72 20 65 61 63 68  ructure for each
0ad0: 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
0ae0: 0a 2a 2a 20 74 68 61 74 20 68 61 73 20 62 65 65  .** that has bee
0af0: 6e 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20  n opened by the 
0b00: 53 51 4c 69 74 65 20 54 43 4c 20 69 6e 74 65 72  SQLite TCL inter
0b10: 66 61 63 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  face..*/.typedef
0b20: 20 73 74 72 75 63 74 20 53 71 6c 69 74 65 44 62   struct SqliteDb
0b30: 20 53 71 6c 69 74 65 44 62 3b 0a 73 74 72 75 63   SqliteDb;.struc
0b40: 74 20 53 71 6c 69 74 65 44 62 20 7b 0a 20 20 73  t SqliteDb {.  s
0b50: 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
0b60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
0b70: 20 22 72 65 61 6c 22 20 64 61 74 61 62 61 73 65   "real" database
0b80: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
0b90: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
0ba0: 72 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  rp;        /* Th
0bb0: 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 75 73  e interpreter us
0bc0: 65 64 20 66 6f 72 20 74 68 69 73 20 64 61 74 61  ed for this data
0bd0: 62 61 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  base */.  char *
0be0: 7a 42 75 73 79 3b 20 20 20 20 20 20 20 20 20 20  zBusy;          
0bf0: 20 20 20 20 20 2f 2a 20 54 68 65 20 62 75 73 79       /* The busy
0c00: 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e   callback routin
0c10: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f  e */.  char *zCo
0c20: 6d 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  mmit;           
0c30: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 69 74 20    /* The commit 
0c40: 68 6f 6f 6b 20 63 61 6c 6c 62 61 63 6b 20 72 6f  hook callback ro
0c50: 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20  utine */.  char 
0c60: 2a 7a 54 72 61 63 65 3b 20 20 20 20 20 20 20 20  *zTrace;        
0c70: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 61        /* The tra
0c80: 63 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74  ce callback rout
0c90: 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ine */.  char *z
0ca0: 50 72 6f 66 69 6c 65 3b 20 20 20 20 20 20 20 20  Profile;        
0cb0: 20 20 20 20 2f 2a 20 54 68 65 20 70 72 6f 66 69      /* The profi
0cc0: 6c 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74  le callback rout
0cd0: 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ine */.  char *z
0ce0: 50 72 6f 67 72 65 73 73 3b 20 20 20 20 20 20 20  Progress;       
0cf0: 20 20 20 20 2f 2a 20 54 68 65 20 70 72 6f 67 72      /* The progr
0d00: 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75  ess callback rou
0d10: 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tine */.  char *
0d20: 7a 41 75 74 68 3b 20 20 20 20 20 20 20 20 20 20  zAuth;          
0d30: 20 20 20 20 20 2f 2a 20 54 68 65 20 61 75 74 68       /* The auth
0d40: 6f 72 69 7a 61 74 69 6f 6e 20 63 61 6c 6c 62 61  orization callba
0d50: 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  ck routine */.  
0d60: 63 68 61 72 20 2a 7a 4e 75 6c 6c 3b 20 20 20 20  char *zNull;    
0d70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
0d80: 78 74 20 74 6f 20 73 75 62 73 74 69 74 75 74 65  xt to substitute
0d90: 20 66 6f 72 20 61 6e 20 53 51 4c 20 4e 55 4c 4c   for an SQL NULL
0da0: 20 76 61 6c 75 65 20 2a 2f 0a 20 20 53 71 6c 46   value */.  SqlF
0db0: 75 6e 63 20 2a 70 46 75 6e 63 3b 20 20 20 20 20  unc *pFunc;     
0dc0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
0dd0: 66 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20  f SQL functions 
0de0: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 55  */.  Tcl_Obj *pU
0df0: 70 64 61 74 65 48 6f 6f 6b 3b 20 20 20 20 20 20  pdateHook;      
0e00: 2f 2a 20 55 70 64 61 74 65 20 68 6f 6f 6b 20 73  /* Update hook s
0e10: 63 72 69 70 74 20 28 69 66 20 61 6e 79 29 20 2a  cript (if any) *
0e20: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 6f  /.  Tcl_Obj *pRo
0e30: 6c 6c 62 61 63 6b 48 6f 6f 6b 3b 20 20 20 20 2f  llbackHook;    /
0e40: 2a 20 52 6f 6c 6c 62 61 63 6b 20 68 6f 6f 6b 20  * Rollback hook 
0e50: 73 63 72 69 70 74 20 28 69 66 20 61 6e 79 29 20  script (if any) 
0e60: 2a 2f 0a 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20  */.  SqlCollate 
0e70: 2a 70 43 6f 6c 6c 61 74 65 3b 20 20 20 20 20 20  *pCollate;      
0e80: 2f 2a 20 4c 69 73 74 20 6f 66 20 53 51 4c 20 63  /* List of SQL c
0e90: 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f  ollation functio
0ea0: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ns */.  int rc; 
0eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ec0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
0ed0: 65 20 6f 66 20 6d 6f 73 74 20 72 65 63 65 6e 74  e of most recent
0ee0: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20   sqlite3_exec() 
0ef0: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43  */.  Tcl_Obj *pC
0f00: 6f 6c 6c 61 74 65 4e 65 65 64 65 64 3b 20 20 20  ollateNeeded;   
0f10: 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65  /* Collation nee
0f20: 64 65 64 20 73 63 72 69 70 74 20 2a 2f 0a 20 20  ded script */.  
0f30: 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20  SqlPreparedStmt 
0f40: 2a 73 74 6d 74 4c 69 73 74 3b 20 2f 2a 20 4c 69  *stmtList; /* Li
0f50: 73 74 20 6f 66 20 70 72 65 70 61 72 65 64 20 73  st of prepared s
0f60: 74 61 74 65 6d 65 6e 74 73 2a 2f 0a 20 20 53 71  tatements*/.  Sq
0f70: 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 73  lPreparedStmt *s
0f80: 74 6d 74 4c 61 73 74 3b 20 2f 2a 20 4c 61 73 74  tmtLast; /* Last
0f90: 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 74 68   statement in th
0fa0: 65 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  e list */.  int 
0fb0: 6d 61 78 53 74 6d 74 3b 20 20 20 20 20 20 20 20  maxStmt;        
0fc0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65         /* The ne
0fd0: 78 74 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  xt maximum numbe
0fe0: 72 20 6f 66 20 73 74 6d 74 4c 69 73 74 20 2a 2f  r of stmtList */
0ff0: 0a 20 20 69 6e 74 20 6e 53 74 6d 74 3b 20 20 20  .  int nStmt;   
1000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1010: 20 4e 75 6d 62 65 72 20 6f 66 20 73 74 61 74 65   Number of state
1020: 6d 65 6e 74 73 20 69 6e 20 73 74 6d 74 4c 69 73  ments in stmtLis
1030: 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4c  t */.};../*.** L
1040: 6f 6f 6b 20 61 74 20 74 68 65 20 73 63 72 69 70  ook at the scrip
1050: 74 20 70 72 65 66 69 78 20 69 6e 20 70 43 6d 64  t prefix in pCmd
1060: 2e 20 20 57 65 20 77 69 6c 6c 20 62 65 20 65 78  .  We will be ex
1070: 65 63 75 74 69 6e 67 20 74 68 69 73 20 73 63 72  ecuting this scr
1080: 69 70 74 0a 2a 2a 20 61 66 74 65 72 20 66 69 72  ipt.** after fir
1090: 73 74 20 61 70 70 65 6e 64 69 6e 67 20 6f 6e 65  st appending one
10a0: 20 6f 72 20 6d 6f 72 65 20 61 72 67 75 6d 65 6e   or more argumen
10b0: 74 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ts.  This routin
10c0: 65 20 61 6e 61 6c 79 7a 65 73 0a 2a 2a 20 74 68  e analyzes.** th
10d0: 65 20 73 63 72 69 70 74 20 74 6f 20 73 65 65 20  e script to see 
10e0: 69 66 20 69 74 20 69 73 20 73 61 66 65 20 74 6f  if it is safe to
10f0: 20 75 73 65 20 54 63 6c 5f 45 76 61 6c 4f 62 6a   use Tcl_EvalObj
1100: 76 28 29 20 6f 6e 20 74 68 65 20 73 63 72 69 70  v() on the scrip
1110: 74 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e  t.** rather than
1120: 20 74 68 65 20 6d 6f 72 65 20 67 65 6e 65 72 61   the more genera
1130: 6c 20 54 63 6c 5f 45 76 61 6c 45 78 28 29 2e 20  l Tcl_EvalEx(). 
1140: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20   Tcl_EvalObjv() 
1150: 69 73 20 6d 75 63 68 0a 2a 2a 20 66 61 73 74 65  is much.** faste
1160: 72 2e 0a 2a 2a 0a 2a 2a 20 53 63 72 69 70 74 73  r..**.** Scripts
1170: 20 74 68 61 74 20 61 72 65 20 73 61 66 65 20 74   that are safe t
1180: 6f 20 75 73 65 20 77 69 74 68 20 54 63 6c 5f 45  o use with Tcl_E
1190: 76 61 6c 4f 62 6a 76 28 29 20 63 6f 6e 73 69 73  valObjv() consis
11a0: 74 73 20 6f 66 20 61 0a 2a 2a 20 63 6f 6d 6d 61  ts of a.** comma
11b0: 6e 64 20 6e 61 6d 65 20 66 6f 6c 6c 6f 77 65 64  nd name followed
11c0: 20 62 79 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65   by zero or more
11d0: 20 61 72 67 75 6d 65 6e 74 73 20 77 69 74 68 20   arguments with 
11e0: 6e 6f 20 5b 2e 2e 2e 5d 20 6f 72 20 24 0a 2a 2a  no [...] or $.**
11f0: 20 6f 72 20 7b 2e 2e 2e 7d 20 6f 72 20 3b 20 74   or {...} or ; t
1200: 6f 20 62 65 20 73 65 65 6e 20 61 6e 79 77 68 65  o be seen anywhe
1210: 72 65 2e 20 20 4d 6f 73 74 20 63 61 6c 6c 62 61  re.  Most callba
1220: 63 6b 20 73 63 72 69 70 74 73 20 63 6f 6e 73 69  ck scripts consi
1230: 73 74 0a 2a 2a 20 6f 66 20 6a 75 73 74 20 61 20  st.** of just a 
1240: 73 69 6e 67 6c 65 20 70 72 6f 63 65 64 75 72 65  single procedure
1250: 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 79 20 6d   name and they m
1260: 65 65 74 20 74 68 69 73 20 72 65 71 75 69 72 65  eet this require
1270: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
1280: 69 6e 74 20 73 61 66 65 54 6f 55 73 65 45 76 61  int safeToUseEva
1290: 6c 4f 62 6a 76 28 54 63 6c 5f 49 6e 74 65 72 70  lObjv(Tcl_Interp
12a0: 20 2a 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62   *interp, Tcl_Ob
12b0: 6a 20 2a 70 43 6d 64 29 7b 0a 20 20 2f 2a 20 57  j *pCmd){.  /* W
12c0: 65 20 63 6f 75 6c 64 20 74 72 79 20 74 6f 20 64  e could try to d
12d0: 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77 69 74 68  o something with
12e0: 20 54 63 6c 5f 50 61 72 73 65 28 29 2e 20 20 42   Tcl_Parse().  B
12f0: 75 74 20 77 65 20 77 69 6c 6c 20 69 6e 73 74 65  ut we will inste
1300: 61 64 0a 20 20 2a 2a 20 6a 75 73 74 20 64 6f 20  ad.  ** just do 
1310: 61 20 73 65 61 72 63 68 20 66 6f 72 20 66 6f 72  a search for for
1320: 62 69 64 64 65 6e 20 63 68 61 72 61 63 74 65 72  bidden character
1330: 73 2e 20 20 49 66 20 61 6e 79 20 6f 66 20 74 68  s.  If any of th
1340: 65 20 66 6f 72 62 69 64 64 65 6e 0a 20 20 2a 2a  e forbidden.  **
1350: 20 63 68 61 72 61 63 74 65 72 73 20 61 70 70 65   characters appe
1360: 61 72 20 69 6e 20 70 43 6d 64 2c 20 77 65 20 77  ar in pCmd, we w
1370: 69 6c 6c 20 72 65 70 6f 72 74 20 74 68 65 20 73  ill report the s
1380: 74 72 69 6e 67 20 61 73 20 75 6e 73 61 66 65 2e  tring as unsafe.
1390: 0a 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  .  */.  const ch
13a0: 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e 3b 0a  ar *z;.  int n;.
13b0: 20 20 7a 20 3d 20 54 63 6c 5f 47 65 74 53 74 72    z = Tcl_GetStr
13c0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 43 6d 64 2c  ingFromObj(pCmd,
13d0: 20 26 6e 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e   &n);.  while( n
13e0: 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20 69 6e  -- > 0 ){.    in
13f0: 74 20 63 20 3d 20 2a 28 7a 2b 2b 29 3b 0a 20 20  t c = *(z++);.  
1400: 20 20 69 66 28 20 63 3d 3d 27 24 27 20 7c 7c 20    if( c=='$' || 
1410: 63 3d 3d 27 5b 27 20 7c 7c 20 63 3d 3d 27 3b 27  c=='[' || c==';'
1420: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d   ) return 0;.  }
1430: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
1440: 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 6e 20 53 71  /*.** Find an Sq
1450: 6c 46 75 6e 63 20 73 74 72 75 63 74 75 72 65 20  lFunc structure 
1460: 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 6e  with the given n
1470: 61 6d 65 2e 20 20 4f 72 20 63 72 65 61 74 65 20  ame.  Or create 
1480: 61 20 6e 65 77 0a 2a 2a 20 6f 6e 65 20 69 66 20  a new.** one if 
1490: 61 6e 20 65 78 69 73 74 69 6e 67 20 6f 6e 65 20  an existing one 
14a0: 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e  cannot be found.
14b0: 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
14c0: 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 73 74 72  er to the.** str
14d0: 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ucture..*/.stati
14e0: 63 20 53 71 6c 46 75 6e 63 20 2a 66 69 6e 64 53  c SqlFunc *findS
14f0: 71 6c 46 75 6e 63 28 53 71 6c 69 74 65 44 62 20  qlFunc(SqliteDb 
1500: 2a 70 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72  *pDb, const char
1510: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 53 71 6c 46   *zName){.  SqlF
1520: 75 6e 63 20 2a 70 2c 20 2a 70 4e 65 77 3b 0a 20  unc *p, *pNew;. 
1530: 20 69 6e 74 20 69 3b 0a 20 20 70 4e 65 77 20 3d   int i;.  pNew =
1540: 20 28 53 71 6c 46 75 6e 63 2a 29 54 63 6c 5f 41   (SqlFunc*)Tcl_A
1550: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e  lloc( sizeof(*pN
1560: 65 77 29 20 2b 20 73 74 72 6c 65 6e 28 7a 4e 61  ew) + strlen(zNa
1570: 6d 65 29 20 2b 20 31 20 29 3b 0a 20 20 70 4e 65  me) + 1 );.  pNe
1580: 77 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72  w->zName = (char
1590: 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 66 6f  *)&pNew[1];.  fo
15a0: 72 28 69 3d 30 3b 20 7a 4e 61 6d 65 5b 69 5d 3b  r(i=0; zName[i];
15b0: 20 69 2b 2b 29 7b 20 70 4e 65 77 2d 3e 7a 4e 61   i++){ pNew->zNa
15c0: 6d 65 5b 69 5d 20 3d 20 74 6f 6c 6f 77 65 72 28  me[i] = tolower(
15d0: 7a 4e 61 6d 65 5b 69 5d 29 3b 20 7d 0a 20 20 70  zName[i]); }.  p
15e0: 4e 65 77 2d 3e 7a 4e 61 6d 65 5b 69 5d 20 3d 20  New->zName[i] = 
15f0: 30 3b 0a 20 20 66 6f 72 28 70 3d 70 44 62 2d 3e  0;.  for(p=pDb->
1600: 70 46 75 6e 63 3b 20 70 3b 20 70 3d 70 2d 3e 70  pFunc; p; p=p->p
1610: 4e 65 78 74 29 7b 20 0a 20 20 20 20 69 66 28 20  Next){ .    if( 
1620: 73 74 72 63 6d 70 28 70 2d 3e 7a 4e 61 6d 65 2c  strcmp(p->zName,
1630: 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 29 3d 3d 30   pNew->zName)==0
1640: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 46 72   ){.      Tcl_Fr
1650: 65 65 28 28 63 68 61 72 2a 29 70 4e 65 77 29 3b  ee((char*)pNew);
1660: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 3b  .      return p;
1670: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e 65  .    }.  }.  pNe
1680: 77 2d 3e 69 6e 74 65 72 70 20 3d 20 70 44 62 2d  w->interp = pDb-
1690: 3e 69 6e 74 65 72 70 3b 0a 20 20 70 4e 65 77 2d  >interp;.  pNew-
16a0: 3e 70 53 63 72 69 70 74 20 3d 20 30 3b 0a 20 20  >pScript = 0;.  
16b0: 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70 44  pNew->pNext = pD
16c0: 62 2d 3e 70 46 75 6e 63 3b 0a 20 20 70 44 62 2d  b->pFunc;.  pDb-
16d0: 3e 70 46 75 6e 63 20 3d 20 70 4e 65 77 3b 0a 20  >pFunc = pNew;. 
16e0: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
16f0: 0a 2f 2a 0a 2a 2a 20 46 69 6e 61 6c 69 7a 65 20  ./*.** Finalize 
1700: 61 6e 64 20 66 72 65 65 20 61 20 6c 69 73 74 20  and free a list 
1710: 6f 66 20 70 72 65 70 61 72 65 64 20 73 74 61 74  of prepared stat
1720: 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63  ements.*/.static
1730: 20 76 6f 69 64 20 66 6c 75 73 68 53 74 6d 74 43   void flushStmtC
1740: 61 63 68 65 28 20 53 71 6c 69 74 65 44 62 20 2a  ache( SqliteDb *
1750: 70 44 62 20 29 7b 0a 20 20 53 71 6c 50 72 65 70  pDb ){.  SqlPrep
1760: 61 72 65 64 53 74 6d 74 20 2a 70 50 72 65 53 74  aredStmt *pPreSt
1770: 6d 74 3b 0a 0a 20 20 77 68 69 6c 65 28 20 20 70  mt;..  while(  p
1780: 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 29 7b 0a  Db->stmtList ){.
1790: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
17a0: 6c 69 7a 65 28 20 70 44 62 2d 3e 73 74 6d 74 4c  lize( pDb->stmtL
17b0: 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20  ist->pStmt );.  
17c0: 20 20 70 50 72 65 53 74 6d 74 20 3d 20 70 44 62    pPreStmt = pDb
17d0: 2d 3e 73 74 6d 74 4c 69 73 74 3b 0a 20 20 20 20  ->stmtList;.    
17e0: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 3d 20  pDb->stmtList = 
17f0: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 2d 3e 70  pDb->stmtList->p
1800: 4e 65 78 74 3b 0a 20 20 20 20 54 63 6c 5f 46 72  Next;.    Tcl_Fr
1810: 65 65 28 20 28 63 68 61 72 2a 29 70 50 72 65 53  ee( (char*)pPreS
1820: 74 6d 74 20 29 3b 0a 20 20 7d 0a 20 20 70 44 62  tmt );.  }.  pDb
1830: 2d 3e 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70  ->nStmt = 0;.  p
1840: 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20 30  Db->stmtLast = 0
1850: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 43 4c 20 63  ;.}../*.** TCL c
1860: 61 6c 6c 73 20 74 68 69 73 20 70 72 6f 63 65 64  alls this proced
1870: 75 72 65 20 77 68 65 6e 20 61 6e 20 73 71 6c 69  ure when an sqli
1880: 74 65 33 20 64 61 74 61 62 61 73 65 20 63 6f 6d  te3 database com
1890: 6d 61 6e 64 20 69 73 0a 2a 2a 20 64 65 6c 65 74  mand is.** delet
18a0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
18b0: 69 64 20 44 62 44 65 6c 65 74 65 43 6d 64 28 76  id DbDeleteCmd(v
18c0: 6f 69 64 20 2a 64 62 29 7b 0a 20 20 53 71 6c 69  oid *db){.  Sqli
18d0: 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c  teDb *pDb = (Sql
18e0: 69 74 65 44 62 2a 29 64 62 3b 0a 20 20 66 6c 75  iteDb*)db;.  flu
18f0: 73 68 53 74 6d 74 43 61 63 68 65 28 70 44 62 29  shStmtCache(pDb)
1900: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73  ;.  sqlite3_clos
1910: 65 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20 77 68  e(pDb->db);.  wh
1920: 69 6c 65 28 20 70 44 62 2d 3e 70 46 75 6e 63 20  ile( pDb->pFunc 
1930: 29 7b 0a 20 20 20 20 53 71 6c 46 75 6e 63 20 2a  ){.    SqlFunc *
1940: 70 46 75 6e 63 20 3d 20 70 44 62 2d 3e 70 46 75  pFunc = pDb->pFu
1950: 6e 63 3b 0a 20 20 20 20 70 44 62 2d 3e 70 46 75  nc;.    pDb->pFu
1960: 6e 63 20 3d 20 70 46 75 6e 63 2d 3e 70 4e 65 78  nc = pFunc->pNex
1970: 74 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52  t;.    Tcl_DecrR
1980: 65 66 43 6f 75 6e 74 28 70 46 75 6e 63 2d 3e 70  efCount(pFunc->p
1990: 53 63 72 69 70 74 29 3b 0a 20 20 20 20 54 63 6c  Script);.    Tcl
19a0: 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 46 75  _Free((char*)pFu
19b0: 6e 63 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65  nc);.  }.  while
19c0: 28 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 20  ( pDb->pCollate 
19d0: 29 7b 0a 20 20 20 20 53 71 6c 43 6f 6c 6c 61 74  ){.    SqlCollat
19e0: 65 20 2a 70 43 6f 6c 6c 61 74 65 20 3d 20 70 44  e *pCollate = pD
19f0: 62 2d 3e 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20  b->pCollate;.   
1a00: 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 20 3d   pDb->pCollate =
1a10: 20 70 43 6f 6c 6c 61 74 65 2d 3e 70 4e 65 78 74   pCollate->pNext
1a20: 3b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28  ;.    Tcl_Free((
1a30: 63 68 61 72 2a 29 70 43 6f 6c 6c 61 74 65 29 3b  char*)pCollate);
1a40: 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e  .  }.  if( pDb->
1a50: 7a 42 75 73 79 20 29 7b 0a 20 20 20 20 54 63 6c  zBusy ){.    Tcl
1a60: 5f 46 72 65 65 28 70 44 62 2d 3e 7a 42 75 73 79  _Free(pDb->zBusy
1a70: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62  );.  }.  if( pDb
1a80: 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20 20 20  ->zTrace ){.    
1a90: 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 54  Tcl_Free(pDb->zT
1aa0: 72 61 63 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  race);.  }.  if(
1ab0: 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29   pDb->zProfile )
1ac0: 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70  {.    Tcl_Free(p
1ad0: 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 29 3b 0a 20  Db->zProfile);. 
1ae0: 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 41   }.  if( pDb->zA
1af0: 75 74 68 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46  uth ){.    Tcl_F
1b00: 72 65 65 28 70 44 62 2d 3e 7a 41 75 74 68 29 3b  ree(pDb->zAuth);
1b10: 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e  .  }.  if( pDb->
1b20: 7a 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 54 63 6c  zNull ){.    Tcl
1b30: 5f 46 72 65 65 28 70 44 62 2d 3e 7a 4e 75 6c 6c  _Free(pDb->zNull
1b40: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62  );.  }.  if( pDb
1b50: 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b 20 29 7b  ->pUpdateHook ){
1b60: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
1b70: 43 6f 75 6e 74 28 70 44 62 2d 3e 70 55 70 64 61  Count(pDb->pUpda
1b80: 74 65 48 6f 6f 6b 29 3b 0a 20 20 7d 0a 20 20 69  teHook);.  }.  i
1b90: 66 28 20 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63  f( pDb->pRollbac
1ba0: 6b 48 6f 6f 6b 20 29 7b 0a 20 20 20 20 54 63 6c  kHook ){.    Tcl
1bb0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44  _DecrRefCount(pD
1bc0: 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b  b->pRollbackHook
1bd0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62  );.  }.  if( pDb
1be0: 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64  ->pCollateNeeded
1bf0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72   ){.    Tcl_Decr
1c00: 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 43  RefCount(pDb->pC
1c10: 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20  ollateNeeded);. 
1c20: 20 7d 0a 20 20 54 63 6c 5f 46 72 65 65 28 28 63   }.  Tcl_Free((c
1c30: 68 61 72 2a 29 70 44 62 29 3b 0a 7d 0a 0a 2f 2a  har*)pDb);.}../*
1c40: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1c50: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
1c60: 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
1c70: 69 73 20 6c 6f 63 6b 65 64 20 77 68 69 6c 65 20  is locked while 
1c80: 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 65 78 65  trying.** to exe
1c90: 63 75 74 65 20 53 51 4c 2e 0a 2a 2f 0a 73 74 61  cute SQL..*/.sta
1ca0: 74 69 63 20 69 6e 74 20 44 62 42 75 73 79 48 61  tic int DbBusyHa
1cb0: 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 2c 20  ndler(void *cd, 
1cc0: 69 6e 74 20 6e 54 72 69 65 73 29 7b 0a 20 20 53  int nTries){.  S
1cd0: 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28  qliteDb *pDb = (
1ce0: 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20  SqliteDb*)cd;.  
1cf0: 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 7a  int rc;.  char z
1d00: 56 61 6c 5b 33 30 5d 3b 0a 0a 20 20 73 70 72 69  Val[30];..  spri
1d10: 6e 74 66 28 7a 56 61 6c 2c 20 22 25 64 22 2c 20  ntf(zVal, "%d", 
1d20: 6e 54 72 69 65 73 29 3b 0a 20 20 72 63 20 3d 20  nTries);.  rc = 
1d30: 54 63 6c 5f 56 61 72 45 76 61 6c 28 70 44 62 2d  Tcl_VarEval(pDb-
1d40: 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 42  >interp, pDb->zB
1d50: 75 73 79 2c 20 22 20 22 2c 20 7a 56 61 6c 2c 20  usy, " ", zVal, 
1d60: 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 69 66 28  (char*)0);.  if(
1d70: 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61   rc!=TCL_OK || a
1d80: 74 6f 69 28 54 63 6c 5f 47 65 74 53 74 72 69 6e  toi(Tcl_GetStrin
1d90: 67 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74  gResult(pDb->int
1da0: 65 72 70 29 29 20 29 7b 0a 20 20 20 20 72 65 74  erp)) ){.    ret
1db0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
1dc0: 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 1;.}../*.** 
1dd0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1de0: 69 6e 76 6f 6b 65 64 20 61 73 20 74 68 65 20 27  invoked as the '
1df0: 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63  progress callbac
1e00: 6b 27 20 66 6f 72 20 74 68 65 20 64 61 74 61 62  k' for the datab
1e10: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ase..*/.static i
1e20: 6e 74 20 44 62 50 72 6f 67 72 65 73 73 48 61 6e  nt DbProgressHan
1e30: 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 29 7b 0a  dler(void *cd){.
1e40: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
1e50: 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b  = (SqliteDb*)cd;
1e60: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
1e70: 73 65 72 74 28 20 70 44 62 2d 3e 7a 50 72 6f 67  sert( pDb->zProg
1e80: 72 65 73 73 20 29 3b 0a 20 20 72 63 20 3d 20 54  ress );.  rc = T
1e90: 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74  cl_Eval(pDb->int
1ea0: 65 72 70 2c 20 70 44 62 2d 3e 7a 50 72 6f 67 72  erp, pDb->zProgr
1eb0: 65 73 73 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ess);.  if( rc!=
1ec0: 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28 54  TCL_OK || atoi(T
1ed0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
1ee0: 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 29  lt(pDb->interp))
1ef0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
1f00: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
1f10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1f20: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
1f30: 64 20 62 79 20 74 68 65 20 53 51 4c 69 74 65 20  d by the SQLite 
1f40: 74 72 61 63 65 20 68 61 6e 64 6c 65 72 20 77 68  trace handler wh
1f50: 65 6e 65 76 65 72 20 61 20 6e 65 77 0a 2a 2a 20  enever a new.** 
1f60: 62 6c 6f 63 6b 20 6f 66 20 53 51 4c 20 69 73 20  block of SQL is 
1f70: 65 78 65 63 75 74 65 64 2e 20 20 54 68 65 20 54  executed.  The T
1f80: 43 4c 20 73 63 72 69 70 74 20 69 6e 20 70 44 62  CL script in pDb
1f90: 2d 3e 7a 54 72 61 63 65 20 69 73 20 65 78 65 63  ->zTrace is exec
1fa0: 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uted..*/.static 
1fb0: 76 6f 69 64 20 44 62 54 72 61 63 65 48 61 6e 64  void DbTraceHand
1fc0: 6c 65 72 28 76 6f 69 64 20 2a 63 64 2c 20 63 6f  ler(void *cd, co
1fd0: 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 29 7b  nst char *zSql){
1fe0: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
1ff0: 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64   = (SqliteDb*)cd
2000: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20  ;.  Tcl_DString 
2010: 73 74 72 3b 0a 0a 20 20 54 63 6c 5f 44 53 74 72  str;..  Tcl_DStr
2020: 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20  ingInit(&str);. 
2030: 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65   Tcl_DStringAppe
2040: 6e 64 28 26 73 74 72 2c 20 70 44 62 2d 3e 7a 54  nd(&str, pDb->zT
2050: 72 61 63 65 2c 20 2d 31 29 3b 0a 20 20 54 63 6c  race, -1);.  Tcl
2060: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c  _DStringAppendEl
2070: 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 53 71 6c  ement(&str, zSql
2080: 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 28 70 44  );.  Tcl_Eval(pD
2090: 62 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44  b->interp, Tcl_D
20a0: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72  StringValue(&str
20b0: 29 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  ));.  Tcl_DStrin
20c0: 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20 54  gFree(&str);.  T
20d0: 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 70  cl_ResetResult(p
20e0: 44 62 2d 3e 69 6e 74 65 72 70 29 3b 0a 7d 0a 0a  Db->interp);.}..
20f0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
2100: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
2110: 74 68 65 20 53 51 4c 69 74 65 20 70 72 6f 66 69  the SQLite profi
2120: 6c 65 20 68 61 6e 64 6c 65 72 20 61 66 74 65 72  le handler after
2130: 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20   a statement.** 
2140: 53 51 4c 20 68 61 73 20 65 78 65 63 75 74 65 64  SQL has executed
2150: 2e 20 20 54 68 65 20 54 43 4c 20 73 63 72 69 70  .  The TCL scrip
2160: 74 20 69 6e 20 70 44 62 2d 3e 7a 50 72 6f 66 69  t in pDb->zProfi
2170: 6c 65 20 69 73 20 65 76 61 6c 75 61 74 65 64 2e  le is evaluated.
2180: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2190: 44 62 50 72 6f 66 69 6c 65 48 61 6e 64 6c 65 72  DbProfileHandler
21a0: 28 76 6f 69 64 20 2a 63 64 2c 20 63 6f 6e 73 74  (void *cd, const
21b0: 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 73 71 6c   char *zSql, sql
21c0: 69 74 65 5f 75 69 6e 74 36 34 20 74 6d 29 7b 0a  ite_uint64 tm){.
21d0: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
21e0: 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b  = (SqliteDb*)cd;
21f0: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73  .  Tcl_DString s
2200: 74 72 3b 0a 20 20 63 68 61 72 20 7a 54 6d 5b 31  tr;.  char zTm[1
2210: 30 30 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  00];..  sqlite3_
2220: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
2230: 7a 54 6d 29 2d 31 2c 20 7a 54 6d 2c 20 22 25 6c  zTm)-1, zTm, "%l
2240: 6c 64 22 2c 20 74 6d 29 3b 0a 20 20 54 63 6c 5f  ld", tm);.  Tcl_
2250: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72  DStringInit(&str
2260: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
2270: 41 70 70 65 6e 64 28 26 73 74 72 2c 20 70 44 62  Append(&str, pDb
2280: 2d 3e 7a 50 72 6f 66 69 6c 65 2c 20 2d 31 29 3b  ->zProfile, -1);
2290: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70  .  Tcl_DStringAp
22a0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72  pendElement(&str
22b0: 2c 20 7a 53 71 6c 29 3b 0a 20 20 54 63 6c 5f 44  , zSql);.  Tcl_D
22c0: 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d  StringAppendElem
22d0: 65 6e 74 28 26 73 74 72 2c 20 7a 54 6d 29 3b 0a  ent(&str, zTm);.
22e0: 20 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e    Tcl_Eval(pDb->
22f0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44 53 74 72  interp, Tcl_DStr
2300: 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29 29 3b  ingValue(&str));
2310: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72  .  Tcl_DStringFr
2320: 65 65 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f  ee(&str);.  Tcl_
2330: 52 65 73 65 74 52 65 73 75 6c 74 28 70 44 62 2d  ResetResult(pDb-
2340: 3e 69 6e 74 65 72 70 29 3b 0a 7d 0a 0a 2f 2a 0a  >interp);.}../*.
2350: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2360: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  is called when a
2370: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
2380: 63 6f 6d 6d 69 74 74 65 64 2e 20 20 54 68 65 0a  committed.  The.
2390: 2a 2a 20 54 43 4c 20 73 63 72 69 70 74 20 69 6e  ** TCL script in
23a0: 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 69 73   pDb->zCommit is
23b0: 20 65 78 65 63 75 74 65 64 2e 20 20 49 66 20 69   executed.  If i
23c0: 74 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65  t returns non-ze
23d0: 72 6f 20 6f 72 0a 2a 2a 20 69 66 20 69 74 20 74  ro or.** if it t
23e0: 68 72 6f 77 73 20 61 6e 20 65 78 63 65 70 74 69  hrows an excepti
23f0: 6f 6e 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74  on, the transact
2400: 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
2410: 63 6b 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66  ck instead.** of
2420: 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64   being committed
2430: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2440: 44 62 43 6f 6d 6d 69 74 48 61 6e 64 6c 65 72 28  DbCommitHandler(
2450: 76 6f 69 64 20 2a 63 64 29 7b 0a 20 20 53 71 6c  void *cd){.  Sql
2460: 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71  iteDb *pDb = (Sq
2470: 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69 6e  liteDb*)cd;.  in
2480: 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 54 63  t rc;..  rc = Tc
2490: 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65  l_Eval(pDb->inte
24a0: 72 70 2c 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74  rp, pDb->zCommit
24b0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c  );.  if( rc!=TCL
24c0: 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28 54 63 6c 5f  _OK || atoi(Tcl_
24d0: 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28  GetStringResult(
24e0: 70 44 62 2d 3e 69 6e 74 65 72 70 29 29 20 29 7b  pDb->interp)) ){
24f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
2500: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
2510: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 44 62  ..static void Db
2520: 52 6f 6c 6c 62 61 63 6b 48 61 6e 64 6c 65 72 28  RollbackHandler(
2530: 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61  void *clientData
2540: 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  ){.  SqliteDb *p
2550: 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29  Db = (SqliteDb*)
2560: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 61 73  clientData;.  as
2570: 73 65 72 74 28 70 44 62 2d 3e 70 52 6f 6c 6c 62  sert(pDb->pRollb
2580: 61 63 6b 48 6f 6f 6b 29 3b 0a 20 20 69 66 28 20  ackHook);.  if( 
2590: 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 45 76 61 6c  TCL_OK!=Tcl_Eval
25a0: 4f 62 6a 45 78 28 70 44 62 2d 3e 69 6e 74 65 72  ObjEx(pDb->inter
25b0: 70 2c 20 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63  p, pDb->pRollbac
25c0: 6b 48 6f 6f 6b 2c 20 30 29 20 29 7b 0a 20 20 20  kHook, 0) ){.   
25d0: 20 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45   Tcl_BackgroundE
25e0: 72 72 6f 72 28 70 44 62 2d 3e 69 6e 74 65 72 70  rror(pDb->interp
25f0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  );.  }.}..static
2600: 20 76 6f 69 64 20 44 62 55 70 64 61 74 65 48 61   void DbUpdateHa
2610: 6e 64 6c 65 72 28 0a 20 20 76 6f 69 64 20 2a 70  ndler(.  void *p
2620: 2c 20 0a 20 20 69 6e 74 20 6f 70 2c 0a 20 20 63  , .  int op,.  c
2630: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20  onst char *zDb, 
2640: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2650: 54 62 6c 2c 20 0a 20 20 73 71 6c 69 74 65 5f 69  Tbl, .  sqlite_i
2660: 6e 74 36 34 20 72 6f 77 69 64 0a 29 7b 0a 20 20  nt64 rowid.){.  
2670: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20  SqliteDb *pDb = 
2680: 28 53 71 6c 69 74 65 44 62 20 2a 29 70 3b 0a 20  (SqliteDb *)p;. 
2690: 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a   Tcl_Obj *pCmd;.
26a0: 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e  .  assert( pDb->
26b0: 70 55 70 64 61 74 65 48 6f 6f 6b 20 29 3b 0a 20  pUpdateHook );. 
26c0: 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 51 4c   assert( op==SQL
26d0: 49 54 45 5f 49 4e 53 45 52 54 20 7c 7c 20 6f 70  ITE_INSERT || op
26e0: 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20  ==SQLITE_UPDATE 
26f0: 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 44 45  || op==SQLITE_DE
2700: 4c 45 54 45 20 29 3b 0a 0a 20 20 70 43 6d 64 20  LETE );..  pCmd 
2710: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
2720: 62 6a 28 70 44 62 2d 3e 70 55 70 64 61 74 65 48  bj(pDb->pUpdateH
2730: 6f 6f 6b 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72  ook);.  Tcl_Incr
2740: 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a  RefCount(pCmd);.
2750: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
2760: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43  endElement(0, pC
2770: 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  md, Tcl_NewStrin
2780: 67 4f 62 6a 28 0a 20 20 20 20 28 20 28 6f 70 3d  gObj(.    ( (op=
2790: 3d 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 29 3f  =SQLITE_INSERT)?
27a0: 22 49 4e 53 45 52 54 22 3a 28 6f 70 3d 3d 53 51  "INSERT":(op==SQ
27b0: 4c 49 54 45 5f 55 50 44 41 54 45 29 3f 22 55 50  LITE_UPDATE)?"UP
27c0: 44 41 54 45 22 3a 22 44 45 4c 45 54 45 22 29 2c  DATE":"DELETE"),
27d0: 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73   -1));.  Tcl_Lis
27e0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
27f0: 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e  t(0, pCmd, Tcl_N
2800: 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 44 62 2c  ewStringObj(zDb,
2810: 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73   -1));.  Tcl_Lis
2820: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
2830: 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e  t(0, pCmd, Tcl_N
2840: 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54 62 6c  ewStringObj(zTbl
2850: 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
2860: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
2870: 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f  nt(0, pCmd, Tcl_
2880: 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 72 6f  NewWideIntObj(ro
2890: 77 69 64 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61  wid));.  Tcl_Eva
28a0: 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69 6e 74 65  lObjEx(pDb->inte
28b0: 72 70 2c 20 70 43 6d 64 2c 20 54 43 4c 5f 45 56  rp, pCmd, TCL_EV
28c0: 41 4c 5f 44 49 52 45 43 54 29 3b 0a 7d 0a 0a 73  AL_DIRECT);.}..s
28d0: 74 61 74 69 63 20 76 6f 69 64 20 74 63 6c 43 6f  tatic void tclCo
28e0: 6c 6c 61 74 65 4e 65 65 64 65 64 28 0a 20 20 76  llateNeeded(.  v
28f0: 6f 69 64 20 2a 70 43 74 78 2c 0a 20 20 73 71 6c  oid *pCtx,.  sql
2900: 69 74 65 33 20 2a 64 62 2c 0a 20 20 69 6e 74 20  ite3 *db,.  int 
2910: 65 6e 63 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  enc,.  const cha
2920: 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 53 71  r *zName.){.  Sq
2930: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53  liteDb *pDb = (S
2940: 71 6c 69 74 65 44 62 20 2a 29 70 43 74 78 3b 0a  qliteDb *)pCtx;.
2950: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69    Tcl_Obj *pScri
2960: 70 74 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  pt = Tcl_Duplica
2970: 74 65 4f 62 6a 28 70 44 62 2d 3e 70 43 6f 6c 6c  teObj(pDb->pColl
2980: 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 54 63  ateNeeded);.  Tc
2990: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
29a0: 53 63 72 69 70 74 29 3b 0a 20 20 54 63 6c 5f 4c  Script);.  Tcl_L
29b0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
29c0: 65 6e 74 28 30 2c 20 70 53 63 72 69 70 74 2c 20  ent(0, pScript, 
29d0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
29e0: 28 7a 4e 61 6d 65 2c 20 2d 31 29 29 3b 0a 20 20  (zName, -1));.  
29f0: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44  Tcl_EvalObjEx(pD
2a00: 62 2d 3e 69 6e 74 65 72 70 2c 20 70 53 63 72 69  b->interp, pScri
2a10: 70 74 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65  pt, 0);.  Tcl_De
2a20: 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69  crRefCount(pScri
2a30: 70 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  pt);.}../*.** Th
2a40: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
2a50: 6c 6c 65 64 20 74 6f 20 65 76 61 6c 75 61 74 65  lled to evaluate
2a60: 20 61 6e 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f   an SQL collatio
2a70: 6e 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65  n function imple
2a80: 6d 65 6e 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20  mented.** using 
2a90: 54 43 4c 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 73  TCL script..*/.s
2aa0: 74 61 74 69 63 20 69 6e 74 20 74 63 6c 53 71 6c  tatic int tclSql
2ab0: 43 6f 6c 6c 61 74 65 28 0a 20 20 76 6f 69 64 20  Collate(.  void 
2ac0: 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e 41 2c  *pCtx,.  int nA,
2ad0: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
2ae0: 41 2c 0a 20 20 69 6e 74 20 6e 42 2c 0a 20 20 63  A,.  int nB,.  c
2af0: 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 0a 29 7b  onst void *zB.){
2b00: 0a 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70  .  SqlCollate *p
2b10: 20 3d 20 28 53 71 6c 43 6f 6c 6c 61 74 65 20 2a   = (SqlCollate *
2b20: 29 70 43 74 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a  )pCtx;.  Tcl_Obj
2b30: 20 2a 70 43 6d 64 3b 0a 0a 20 20 70 43 6d 64 20   *pCmd;..  pCmd 
2b40: 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  = Tcl_NewStringO
2b50: 62 6a 28 70 2d 3e 7a 53 63 72 69 70 74 2c 20 2d  bj(p->zScript, -
2b60: 31 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65  1);.  Tcl_IncrRe
2b70: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20  fCount(pCmd);.  
2b80: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2b90: 64 45 6c 65 6d 65 6e 74 28 70 2d 3e 69 6e 74 65  dElement(p->inte
2ba0: 72 70 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65  rp, pCmd, Tcl_Ne
2bb0: 77 53 74 72 69 6e 67 4f 62 6a 28 7a 41 2c 20 6e  wStringObj(zA, n
2bc0: 41 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  A));.  Tcl_ListO
2bd0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
2be0: 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c  p->interp, pCmd,
2bf0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
2c00: 6a 28 7a 42 2c 20 6e 42 29 29 3b 0a 20 20 54 63  j(zB, nB));.  Tc
2c10: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69  l_EvalObjEx(p->i
2c20: 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 43 4c  nterp, pCmd, TCL
2c30: 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20  _EVAL_DIRECT);. 
2c40: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
2c50: 74 28 70 43 6d 64 29 3b 0a 20 20 72 65 74 75 72  t(pCmd);.  retur
2c60: 6e 20 28 61 74 6f 69 28 54 63 6c 5f 47 65 74 53  n (atoi(Tcl_GetS
2c70: 74 72 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69  tringResult(p->i
2c80: 6e 74 65 72 70 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a  nterp)));.}../*.
2c90: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2ca0: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 65 76 61  is called to eva
2cb0: 6c 75 61 74 65 20 61 6e 20 53 51 4c 20 66 75 6e  luate an SQL fun
2cc0: 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 65  ction implemente
2cd0: 64 0a 2a 2a 20 75 73 69 6e 67 20 54 43 4c 20 73  d.** using TCL s
2ce0: 63 72 69 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  cript..*/.static
2cf0: 20 76 6f 69 64 20 74 63 6c 53 71 6c 46 75 6e 63   void tclSqlFunc
2d00: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
2d10: 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61   *context, int a
2d20: 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  rgc, sqlite3_val
2d30: 75 65 2a 2a 61 72 67 76 29 7b 0a 20 20 53 71 6c  ue**argv){.  Sql
2d40: 46 75 6e 63 20 2a 70 20 3d 20 73 71 6c 69 74 65  Func *p = sqlite
2d50: 33 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74  3_user_data(cont
2d60: 65 78 74 29 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  ext);.  Tcl_Obj 
2d70: 2a 70 43 6d 64 3b 0a 20 20 69 6e 74 20 69 3b 0a  *pCmd;.  int i;.
2d80: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
2d90: 20 61 72 67 63 3d 3d 30 20 29 7b 0a 20 20 20 20   argc==0 ){.    
2da0: 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
2db0: 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  no arguments to 
2dc0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 2c 20 63 61  the function, ca
2dd0: 6c 6c 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78  ll Tcl_EvalObjEx
2de0: 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 73   on the.    ** s
2df0: 63 72 69 70 74 20 6f 62 6a 65 63 74 20 64 69 72  cript object dir
2e00: 65 63 74 6c 79 2e 20 20 54 68 69 73 20 61 6c 6c  ectly.  This all
2e10: 6f 77 73 20 74 68 65 20 54 43 4c 20 63 6f 6d 70  ows the TCL comp
2e20: 69 6c 65 72 20 74 6f 20 67 65 6e 65 72 61 74 65  iler to generate
2e30: 0a 20 20 20 20 2a 2a 20 62 79 74 65 63 6f 64 65  .    ** bytecode
2e40: 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 61 6e 64   for the command
2e50: 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 69 6e   on the first in
2e60: 76 6f 63 61 74 69 6f 6e 20 61 6e 64 20 74 68 75  vocation and thu
2e70: 73 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75  s make.    ** su
2e80: 62 73 65 71 75 65 6e 74 20 69 6e 76 6f 63 61 74  bsequent invocat
2e90: 69 6f 6e 73 20 6d 75 63 68 20 66 61 73 74 65 72  ions much faster
2ea0: 2e 20 2a 2f 0a 20 20 20 20 70 43 6d 64 20 3d 20  . */.    pCmd = 
2eb0: 70 2d 3e 70 53 63 72 69 70 74 3b 0a 20 20 20 20  p->pScript;.    
2ec0: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
2ed0: 28 70 43 6d 64 29 3b 0a 20 20 20 20 72 63 20 3d  (pCmd);.    rc =
2ee0: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70   Tcl_EvalObjEx(p
2ef0: 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20  ->interp, pCmd, 
2f00: 30 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72  0);.    Tcl_Decr
2f10: 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a  RefCount(pCmd);.
2f20: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
2f30: 49 66 20 74 68 65 72 65 20 61 72 65 20 61 72 67  If there are arg
2f40: 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 66 75  uments to the fu
2f50: 6e 63 74 69 6f 6e 2c 20 6d 61 6b 65 20 61 20 73  nction, make a s
2f60: 68 61 6c 6c 6f 77 20 63 6f 70 79 20 6f 66 20 74  hallow copy of t
2f70: 68 65 0a 20 20 20 20 2a 2a 20 73 63 72 69 70 74  he.    ** script
2f80: 20 6f 62 6a 65 63 74 2c 20 6c 61 70 70 65 6e 64   object, lappend
2f90: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 2c 20   the arguments, 
2fa0: 74 68 65 6e 20 65 76 61 6c 75 61 74 65 20 74 68  then evaluate th
2fb0: 65 20 63 6f 70 79 2e 0a 20 20 20 20 2a 2a 0a 20  e copy..    **. 
2fc0: 20 20 20 2a 2a 20 42 79 20 22 73 68 61 6c 6c 6f     ** By "shallo
2fd0: 77 22 20 63 6f 70 79 2c 20 77 65 20 6d 65 61 6e  w" copy, we mean
2fe0: 20 61 20 6f 6e 6c 79 20 74 68 65 20 6f 75 74 65   a only the oute
2ff0: 72 20 6c 69 73 74 20 54 63 6c 5f 4f 62 6a 20 69  r list Tcl_Obj i
3000: 73 20 64 75 70 6c 69 63 61 74 65 64 2e 0a 20 20  s duplicated..  
3010: 20 20 2a 2a 20 54 68 65 20 6e 65 77 20 54 63 6c    ** The new Tcl
3020: 5f 4f 62 6a 20 63 6f 6e 74 61 69 6e 73 20 70 6f  _Obj contains po
3030: 69 6e 74 65 72 73 20 74 6f 20 74 68 65 20 6f 72  inters to the or
3040: 69 67 69 6e 61 6c 20 6c 69 73 74 20 65 6c 65 6d  iginal list elem
3050: 65 6e 74 73 2e 20 0a 20 20 20 20 2a 2a 20 54 68  ents. .    ** Th
3060: 61 74 20 77 61 79 2c 20 77 68 65 6e 20 54 63 6c  at way, when Tcl
3070: 5f 45 76 61 6c 4f 62 6a 76 28 29 20 69 73 20 72  _EvalObjv() is r
3080: 75 6e 20 61 6e 64 20 73 68 69 6d 6d 65 72 73 20  un and shimmers 
3090: 74 68 65 20 66 69 72 73 74 20 65 6c 65 6d 65 6e  the first elemen
30a0: 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  t.    ** of the 
30b0: 6c 69 73 74 20 74 6f 20 74 63 6c 43 6d 64 4e 61  list to tclCmdNa
30c0: 6d 65 54 79 70 65 2c 20 74 68 61 74 20 61 6c 74  meType, that alt
30d0: 65 72 6e 61 74 65 20 72 65 70 72 65 73 65 6e 74  ernate represent
30e0: 61 74 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a  ation will.    *
30f0: 2a 20 62 65 20 70 72 65 73 65 72 76 65 64 20 61  * be preserved a
3100: 6e 64 20 72 65 75 73 65 64 20 6f 6e 20 74 68 65  nd reused on the
3110: 20 6e 65 78 74 20 69 6e 76 6f 63 61 74 69 6f 6e   next invocation
3120: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c  ..    */.    Tcl
3130: 5f 4f 62 6a 20 2a 2a 61 41 72 67 3b 0a 20 20 20  _Obj **aArg;.   
3140: 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69   int nArg;.    i
3150: 66 28 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65  f( Tcl_ListObjGe
3160: 74 45 6c 65 6d 65 6e 74 73 28 70 2d 3e 69 6e 74  tElements(p->int
3170: 65 72 70 2c 20 70 2d 3e 70 53 63 72 69 70 74 2c  erp, p->pScript,
3180: 20 26 6e 41 72 67 2c 20 26 61 41 72 67 29 20 29   &nArg, &aArg) )
3190: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
31a0: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e  result_error(con
31b0: 74 65 78 74 2c 20 54 63 6c 5f 47 65 74 53 74 72  text, Tcl_GetStr
31c0: 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74  ingResult(p->int
31d0: 65 72 70 29 2c 20 2d 31 29 3b 20 0a 20 20 20 20  erp), -1); .    
31e0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 20    return;.    } 
31f0: 20 20 20 20 0a 20 20 20 20 70 43 6d 64 20 3d 20      .    pCmd = 
3200: 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 6e  Tcl_NewListObj(n
3210: 41 72 67 2c 20 61 41 72 67 29 3b 0a 20 20 20 20  Arg, aArg);.    
3220: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
3230: 28 70 43 6d 64 29 3b 0a 20 20 20 20 66 6f 72 28  (pCmd);.    for(
3240: 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b  i=0; i<argc; i++
3250: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
3260: 5f 76 61 6c 75 65 20 2a 70 49 6e 20 3d 20 61 72  _value *pIn = ar
3270: 67 76 5b 69 5d 3b 0a 20 20 20 20 20 20 54 63 6c  gv[i];.      Tcl
3280: 5f 4f 62 6a 20 2a 70 56 61 6c 3b 0a 20 20 20 20  _Obj *pVal;.    
3290: 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f          .      /
32a0: 2a 20 53 65 74 20 70 56 61 6c 20 74 6f 20 63 6f  * Set pVal to co
32b0: 6e 74 61 69 6e 20 74 68 65 20 69 27 74 68 20 63  ntain the i'th c
32c0: 6f 6c 75 6d 6e 20 6f 66 20 74 68 69 73 20 72 6f  olumn of this ro
32d0: 77 2e 20 2a 2f 0a 20 20 20 20 20 20 73 77 69 74  w. */.      swit
32e0: 63 68 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ch( sqlite3_valu
32f0: 65 5f 74 79 70 65 28 70 49 6e 29 20 29 7b 0a 20  e_type(pIn) ){. 
3300: 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
3310: 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20  TE_BLOB: {.     
3320: 20 20 20 20 20 69 6e 74 20 62 79 74 65 73 20 3d       int bytes =
3330: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
3340: 79 74 65 73 28 70 49 6e 29 3b 0a 20 20 20 20 20  ytes(pIn);.     
3350: 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f       pVal = Tcl_
3360: 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28  NewByteArrayObj(
3370: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
3380: 6f 62 28 70 49 6e 29 2c 20 62 79 74 65 73 29 3b  ob(pIn), bytes);
3390: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
33a0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
33b0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
33c0: 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20  INTEGER: {.     
33d0: 20 20 20 20 20 73 71 6c 69 74 65 5f 69 6e 74 36       sqlite_int6
33e0: 34 20 76 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  4 v = sqlite3_va
33f0: 6c 75 65 5f 69 6e 74 36 34 28 70 49 6e 29 3b 0a  lue_int64(pIn);.
3400: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 76 3e            if( v>
3410: 3d 2d 32 31 34 37 34 38 33 36 34 37 20 26 26 20  =-2147483647 && 
3420: 76 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29 7b  v<=2147483647 ){
3430: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 56 61  .            pVa
3440: 6c 20 3d 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  l = Tcl_NewIntOb
3450: 6a 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  j(v);.          
3460: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
3470: 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65     pVal = Tcl_Ne
3480: 77 57 69 64 65 49 6e 74 4f 62 6a 28 76 29 3b 0a  wWideIntObj(v);.
3490: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
34a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
34b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63       }.        c
34c0: 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54  ase SQLITE_FLOAT
34d0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 64 6f  : {.          do
34e0: 75 62 6c 65 20 72 20 3d 20 73 71 6c 69 74 65 33  uble r = sqlite3
34f0: 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 70 49  _value_double(pI
3500: 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 56  n);.          pV
3510: 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 44 6f 75 62  al = Tcl_NewDoub
3520: 6c 65 4f 62 6a 28 72 29 3b 0a 20 20 20 20 20 20  leObj(r);.      
3530: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
3540: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73     }.        cas
3550: 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b  e SQLITE_NULL: {
3560: 0a 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20  .          pVal 
3570: 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  = Tcl_NewStringO
3580: 62 6a 28 22 22 2c 20 30 29 3b 0a 20 20 20 20 20  bj("", 0);.     
3590: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
35a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 64 65      }.        de
35b0: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20  fault: {.       
35c0: 20 20 20 69 6e 74 20 62 79 74 65 73 20 3d 20 73     int bytes = s
35d0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
35e0: 65 73 28 70 49 6e 29 3b 0a 20 20 20 20 20 20 20  es(pIn);.       
35f0: 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65     pVal = Tcl_Ne
3600: 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72  wStringObj((char
3610: 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   *)sqlite3_value
3620: 5f 74 65 78 74 28 70 49 6e 29 2c 20 62 79 74 65  _text(pIn), byte
3630: 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  s);.          br
3640: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
3650: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
3660: 3d 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  = Tcl_ListObjApp
3670: 65 6e 64 45 6c 65 6d 65 6e 74 28 70 2d 3e 69 6e  endElement(p->in
3680: 74 65 72 70 2c 20 70 43 6d 64 2c 20 70 56 61 6c  terp, pCmd, pVal
3690: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
36a0: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 44  ){.        Tcl_D
36b0: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64  ecrRefCount(pCmd
36c0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
36d0: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
36e0: 63 6f 6e 74 65 78 74 2c 20 54 63 6c 5f 47 65 74  context, Tcl_Get
36f0: 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e  StringResult(p->
3700: 69 6e 74 65 72 70 29 2c 20 2d 31 29 3b 20 0a 20  interp), -1); . 
3710: 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
3720: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
3730: 20 69 66 28 20 21 70 2d 3e 75 73 65 45 76 61 6c   if( !p->useEval
3740: 4f 62 6a 76 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Objv ){.      /*
3750: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 29   Tcl_EvalObjEx()
3760: 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61   will automatica
3770: 6c 6c 79 20 63 61 6c 6c 20 54 63 6c 5f 45 76 61  lly call Tcl_Eva
3780: 6c 4f 62 6a 76 28 29 20 69 66 20 70 43 6d 64 0a  lObjv() if pCmd.
3790: 20 20 20 20 20 20 2a 2a 20 69 73 20 61 20 6c 69        ** is a li
37a0: 73 74 20 77 69 74 68 6f 75 74 20 61 20 73 74 72  st without a str
37b0: 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69  ing representati
37c0: 6f 6e 2e 20 20 54 6f 20 70 72 65 76 65 6e 74 20  on.  To prevent 
37d0: 74 68 69 73 20 66 72 6f 6d 0a 20 20 20 20 20 20  this from.      
37e0: 2a 2a 20 68 61 70 70 65 6e 69 6e 67 2c 20 6d 61  ** happening, ma
37f0: 6b 65 20 73 75 72 65 20 70 43 6d 64 20 68 61 73  ke sure pCmd has
3800: 20 61 20 76 61 6c 69 64 20 73 74 72 69 6e 67 20   a valid string 
3810: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 2a  representation *
3820: 2f 0a 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  /.      Tcl_GetS
3830: 74 72 69 6e 67 28 70 43 6d 64 29 3b 0a 20 20 20  tring(pCmd);.   
3840: 20 7d 0a 20 20 20 20 72 63 20 3d 20 54 63 6c 5f   }.    rc = Tcl_
3850: 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74  EvalObjEx(p->int
3860: 65 72 70 2c 20 70 43 6d 64 2c 20 54 43 4c 5f 45  erp, pCmd, TCL_E
3870: 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20 20  VAL_DIRECT);.   
3880: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
3890: 74 28 70 43 6d 64 29 3b 0a 20 20 7d 0a 0a 20 20  t(pCmd);.  }..  
38a0: 69 66 28 20 72 63 20 26 26 20 72 63 21 3d 54 43  if( rc && rc!=TC
38b0: 4c 5f 52 45 54 55 52 4e 20 29 7b 0a 20 20 20 20  L_RETURN ){.    
38c0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
38d0: 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 54 63  rror(context, Tc
38e0: 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
38f0: 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c 20 2d 31  t(p->interp), -1
3900: 29 3b 20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ); .  }else{.   
3910: 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 72 20 3d   Tcl_Obj *pVar =
3920: 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c   Tcl_GetObjResul
3930: 74 28 70 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20  t(p->interp);.  
3940: 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 75 38 20    int n;.    u8 
3950: 2a 64 61 74 61 3b 0a 20 20 20 20 63 68 61 72 20  *data;.    char 
3960: 2a 7a 54 79 70 65 20 3d 20 70 56 61 72 2d 3e 74  *zType = pVar->t
3970: 79 70 65 50 74 72 20 3f 20 70 56 61 72 2d 3e 74  ypePtr ? pVar->t
3980: 79 70 65 50 74 72 2d 3e 6e 61 6d 65 20 3a 20 22  ypePtr->name : "
3990: 22 3b 0a 20 20 20 20 63 68 61 72 20 63 20 3d 20  ";.    char c = 
39a0: 7a 54 79 70 65 5b 30 5d 3b 0a 20 20 20 20 69 66  zType[0];.    if
39b0: 28 20 63 3d 3d 27 62 27 20 26 26 20 73 74 72 63  ( c=='b' && strc
39c0: 6d 70 28 7a 54 79 70 65 2c 22 62 79 74 65 61 72  mp(zType,"bytear
39d0: 72 61 79 22 29 3d 3d 30 20 26 26 20 70 56 61 72  ray")==0 && pVar
39e0: 2d 3e 62 79 74 65 73 3d 3d 30 20 29 7b 0a 20 20  ->bytes==0 ){.  
39f0: 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 72 65 74 75      /* Only retu
3a00: 72 6e 20 61 20 42 4c 4f 42 20 74 79 70 65 20 69  rn a BLOB type i
3a10: 66 20 74 68 65 20 54 63 6c 20 76 61 72 69 61 62  f the Tcl variab
3a20: 6c 65 20 69 73 20 61 20 62 79 74 65 61 72 72 61  le is a bytearra
3a30: 79 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 68  y and.      ** h
3a40: 61 73 20 6e 6f 20 73 74 72 69 6e 67 20 72 65 70  as no string rep
3a50: 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20 2a 2f 0a  resentation. */.
3a60: 20 20 20 20 20 20 64 61 74 61 20 3d 20 54 63 6c        data = Tcl
3a70: 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f  _GetByteArrayFro
3a80: 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a  mObj(pVar, &n);.
3a90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
3aa0: 73 75 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78  sult_blob(contex
3ab0: 74 2c 20 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49  t, data, n, SQLI
3ac0: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
3ad0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 63 3d     }else if( (c=
3ae0: 3d 27 62 27 20 26 26 20 73 74 72 63 6d 70 28 7a  ='b' && strcmp(z
3af0: 54 79 70 65 2c 22 62 6f 6f 6c 65 61 6e 22 29 3d  Type,"boolean")=
3b00: 3d 30 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  =0) ||.         
3b10: 20 28 63 3d 3d 27 69 27 20 26 26 20 73 74 72 63   (c=='i' && strc
3b20: 6d 70 28 7a 54 79 70 65 2c 22 69 6e 74 22 29 3d  mp(zType,"int")=
3b30: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  =0) ){.      Tcl
3b40: 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 30  _GetIntFromObj(0
3b50: 2c 20 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20  , pVar, &n);.   
3b60: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
3b70: 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 6e  t_int(context, n
3b80: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
3b90: 20 63 3d 3d 27 64 27 20 26 26 20 73 74 72 63 6d   c=='d' && strcm
3ba0: 70 28 7a 54 79 70 65 2c 22 64 6f 75 62 6c 65 22  p(zType,"double"
3bb0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 6f  )==0 ){.      do
3bc0: 75 62 6c 65 20 72 3b 0a 20 20 20 20 20 20 54 63  uble r;.      Tc
3bd0: 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f  l_GetDoubleFromO
3be0: 62 6a 28 30 2c 20 70 56 61 72 2c 20 26 72 29 3b  bj(0, pVar, &r);
3bf0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
3c00: 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e  esult_double(con
3c10: 74 65 78 74 2c 20 72 29 3b 0a 20 20 20 20 7d 65  text, r);.    }e
3c20: 6c 73 65 20 69 66 28 20 63 3d 3d 27 77 27 20 26  lse if( c=='w' &
3c30: 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22  & strcmp(zType,"
3c40: 77 69 64 65 49 6e 74 22 29 3d 3d 30 20 29 7b 0a  wideInt")==0 ){.
3c50: 20 20 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e        Tcl_WideIn
3c60: 74 20 76 3b 0a 20 20 20 20 20 20 54 63 6c 5f 47  t v;.      Tcl_G
3c70: 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a  etWideIntFromObj
3c80: 28 30 2c 20 70 56 61 72 2c 20 26 76 29 3b 0a 20  (0, pVar, &v);. 
3c90: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
3ca0: 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78  ult_int64(contex
3cb0: 74 2c 20 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t, v);.    }else
3cc0: 7b 0a 20 20 20 20 20 20 64 61 74 61 20 3d 20 28  {.      data = (
3cd0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
3ce0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
3cf0: 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a  mObj(pVar, &n);.
3d00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
3d10: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
3d20: 74 2c 20 28 63 68 61 72 20 2a 29 64 61 74 61 2c  t, (char *)data,
3d30: 20 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53   n, SQLITE_TRANS
3d40: 49 45 4e 54 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  IENT);.    }.  }
3d50: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
3d60: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
3d70: 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ATION./*.** This
3d80: 20 69 73 20 74 68 65 20 61 75 74 68 65 6e 74 69   is the authenti
3d90: 63 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 2e  cation function.
3da0: 20 20 49 74 20 61 70 70 65 6e 64 73 20 74 68 65    It appends the
3db0: 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 0a   authentication.
3dc0: 2a 2a 20 74 79 70 65 20 63 6f 64 65 20 61 6e 64  ** type code and
3dd0: 20 74 68 65 20 74 77 6f 20 61 72 67 75 6d 65 6e   the two argumen
3de0: 74 73 20 74 6f 20 7a 43 6d 64 5b 5d 20 74 68 65  ts to zCmd[] the
3df0: 6e 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 72 65  n invokes the re
3e00: 73 75 6c 74 0a 2a 2a 20 6f 6e 20 74 68 65 20 69  sult.** on the i
3e10: 6e 74 65 72 70 72 65 74 65 72 2e 20 20 54 68 65  nterpreter.  The
3e20: 20 72 65 70 6c 79 20 69 73 20 65 78 61 6d 69 6e   reply is examin
3e30: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
3e40: 69 66 20 74 68 65 0a 2a 2a 20 61 75 74 68 65 6e  if the.** authen
3e50: 74 69 63 61 74 69 6f 6e 20 66 61 69 6c 73 20 6f  tication fails o
3e60: 72 20 73 75 63 63 65 65 64 73 2e 0a 2a 2f 0a 73  r succeeds..*/.s
3e70: 74 61 74 69 63 20 69 6e 74 20 61 75 74 68 5f 63  tatic int auth_c
3e80: 61 6c 6c 62 61 63 6b 28 0a 20 20 76 6f 69 64 20  allback(.  void 
3e90: 2a 70 41 72 67 2c 0a 20 20 69 6e 74 20 63 6f 64  *pArg,.  int cod
3ea0: 65 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e,.  const char 
3eb0: 2a 7a 41 72 67 31 2c 0a 20 20 63 6f 6e 73 74 20  *zArg1,.  const 
3ec0: 63 68 61 72 20 2a 7a 41 72 67 32 2c 0a 20 20 63  char *zArg2,.  c
3ed0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 33  onst char *zArg3
3ee0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
3ef0: 7a 41 72 67 34 0a 29 7b 0a 20 20 63 68 61 72 20  zArg4.){.  char 
3f00: 2a 7a 43 6f 64 65 3b 0a 20 20 54 63 6c 5f 44 53  *zCode;.  Tcl_DS
3f10: 74 72 69 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74  tring str;.  int
3f20: 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61   rc;.  const cha
3f30: 72 20 2a 7a 52 65 70 6c 79 3b 0a 20 20 53 71 6c  r *zReply;.  Sql
3f40: 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71  iteDb *pDb = (Sq
3f50: 6c 69 74 65 44 62 2a 29 70 41 72 67 3b 0a 0a 20  liteDb*)pArg;.. 
3f60: 20 73 77 69 74 63 68 28 20 63 6f 64 65 20 29 7b   switch( code ){
3f70: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
3f80: 5f 43 4f 50 59 20 20 20 20 20 20 20 20 20 20 20  _COPY           
3f90: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
3fa0: 54 45 5f 43 4f 50 59 22 3b 20 62 72 65 61 6b 3b  TE_COPY"; break;
3fb0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
3fc0: 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 20 20 20  _CREATE_INDEX   
3fd0: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
3fe0: 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 22  TE_CREATE_INDEX"
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: 54 41 42 4c 45 20 20 20 20 20 20 3a 20 7a 43 6f  TABLE      : zCo
4020: 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54  de="SQLITE_CREAT
4030: 45 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b  E_TABLE"; 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 45 4d 50 5f 49 4e 44  _CREATE_TEMP_IND
4060: 45 58 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49  EX : zCode="SQLI
4070: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49  TE_CREATE_TEMP_I
4080: 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20  NDEX"; break;.  
4090: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52    case SQLITE_CR
40a0: 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 20  EATE_TEMP_TABLE 
40b0: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
40c0: 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c  CREATE_TEMP_TABL
40d0: 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  E"; break;.    c
40e0: 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54  ase SQLITE_CREAT
40f0: 45 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 3a 20  E_TEMP_TRIGGER: 
4100: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52  zCode="SQLITE_CR
4110: 45 41 54 45 5f 54 45 4d 50 5f 54 52 49 47 47 45  EATE_TEMP_TRIGGE
4120: 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  R"; break;.    c
4130: 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54  ase SQLITE_CREAT
4140: 45 5f 54 45 4d 50 5f 56 49 45 57 20 20 3a 20 7a  E_TEMP_VIEW  : z
4150: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45  Code="SQLITE_CRE
4160: 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 22 3b 20  ATE_TEMP_VIEW"; 
4170: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
4180: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 52  SQLITE_CREATE_TR
4190: 49 47 47 45 52 20 20 20 20 3a 20 7a 43 6f 64 65  IGGER    : zCode
41a0: 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  ="SQLITE_CREATE_
41b0: 54 52 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b  TRIGGER"; break;
41c0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
41d0: 5f 43 52 45 41 54 45 5f 56 49 45 57 20 20 20 20  _CREATE_VIEW    
41e0: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
41f0: 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57 22 3b  TE_CREATE_VIEW";
4200: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
4210: 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 20 20   SQLITE_DELETE  
4220: 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64            : zCod
4230: 65 3d 22 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  e="SQLITE_DELETE
4240: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
4250: 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49  se SQLITE_DROP_I
4260: 4e 44 45 58 20 20 20 20 20 20 20 20 3a 20 7a 43  NDEX        : zC
4270: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50  ode="SQLITE_DROP
4280: 5f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a  _INDEX"; break;.
4290: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
42a0: 44 52 4f 50 5f 54 41 42 4c 45 20 20 20 20 20 20  DROP_TABLE      
42b0: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
42c0: 45 5f 44 52 4f 50 5f 54 41 42 4c 45 22 3b 20 62  E_DROP_TABLE"; b
42d0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
42e0: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
42f0: 49 4e 44 45 58 20 20 20 3a 20 7a 43 6f 64 65 3d  INDEX   : zCode=
4300: 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d  "SQLITE_DROP_TEM
4310: 50 5f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b  P_INDEX"; break;
4320: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
4330: 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45  _DROP_TEMP_TABLE
4340: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
4350: 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42  TE_DROP_TEMP_TAB
4360: 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  LE"; break;.    
4370: 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50  case SQLITE_DROP
4380: 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 20 3a 20  _TEMP_TRIGGER : 
4390: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52  zCode="SQLITE_DR
43a0: 4f 50 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 22  OP_TEMP_TRIGGER"
43b0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
43c0: 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  e SQLITE_DROP_TE
43d0: 4d 50 5f 56 49 45 57 20 20 20 20 3a 20 7a 43 6f  MP_VIEW    : zCo
43e0: 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f  de="SQLITE_DROP_
43f0: 54 45 4d 50 5f 56 49 45 57 22 3b 20 62 72 65 61  TEMP_VIEW"; brea
4400: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
4410: 54 45 5f 44 52 4f 50 5f 54 52 49 47 47 45 52 20  TE_DROP_TRIGGER 
4420: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
4430: 4c 49 54 45 5f 44 52 4f 50 5f 54 52 49 47 47 45  LITE_DROP_TRIGGE
4440: 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  R"; break;.    c
4450: 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  ase SQLITE_DROP_
4460: 56 49 45 57 20 20 20 20 20 20 20 20 20 3a 20 7a  VIEW         : z
4470: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f  Code="SQLITE_DRO
4480: 50 5f 56 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a  P_VIEW"; break;.
4490: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
44a0: 49 4e 53 45 52 54 20 20 20 20 20 20 20 20 20 20  INSERT          
44b0: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
44c0: 45 5f 49 4e 53 45 52 54 22 3b 20 62 72 65 61 6b  E_INSERT"; break
44d0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
44e0: 45 5f 50 52 41 47 4d 41 20 20 20 20 20 20 20 20  E_PRAGMA        
44f0: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
4500: 49 54 45 5f 50 52 41 47 4d 41 22 3b 20 62 72 65  ITE_PRAGMA"; bre
4510: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
4520: 49 54 45 5f 52 45 41 44 20 20 20 20 20 20 20 20  ITE_READ        
4530: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
4540: 51 4c 49 54 45 5f 52 45 41 44 22 3b 20 62 72 65  QLITE_READ"; bre
4550: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
4560: 49 54 45 5f 53 45 4c 45 43 54 20 20 20 20 20 20  ITE_SELECT      
4570: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
4580: 51 4c 49 54 45 5f 53 45 4c 45 43 54 22 3b 20 62  QLITE_SELECT"; b
4590: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
45a0: 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f  QLITE_TRANSACTIO
45b0: 4e 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d  N       : zCode=
45c0: 22 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54  "SQLITE_TRANSACT
45d0: 49 4f 4e 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ION"; break;.   
45e0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 55 50 44   case SQLITE_UPD
45f0: 41 54 45 20 20 20 20 20 20 20 20 20 20 20 20 3a  ATE            :
4600: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 55   zCode="SQLITE_U
4610: 50 44 41 54 45 22 3b 20 62 72 65 61 6b 3b 0a 20  PDATE"; break;. 
4620: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
4630: 54 54 41 43 48 20 20 20 20 20 20 20 20 20 20 20  TTACH           
4640: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
4650: 5f 41 54 54 41 43 48 22 3b 20 62 72 65 61 6b 3b  _ATTACH"; break;
4660: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
4670: 5f 44 45 54 41 43 48 20 20 20 20 20 20 20 20 20  _DETACH         
4680: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
4690: 54 45 5f 44 45 54 41 43 48 22 3b 20 62 72 65 61  TE_DETACH"; brea
46a0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
46b0: 54 45 5f 41 4c 54 45 52 5f 54 41 42 4c 45 20 20  TE_ALTER_TABLE  
46c0: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
46d0: 4c 49 54 45 5f 41 4c 54 45 52 5f 54 41 42 4c 45  LITE_ALTER_TABLE
46e0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
46f0: 73 65 20 53 51 4c 49 54 45 5f 52 45 49 4e 44 45  se SQLITE_REINDE
4700: 58 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43  X           : zC
4710: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 52 45 49 4e  ode="SQLITE_REIN
4720: 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  DEX"; break;.   
4730: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 4e 41   case SQLITE_ANA
4740: 4c 59 5a 45 20 20 20 20 20 20 20 20 20 20 20 3a  LYZE           :
4750: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 41   zCode="SQLITE_A
4760: 4e 41 4c 59 5a 45 22 3b 20 62 72 65 61 6b 3b 0a  NALYZE"; break;.
4770: 20 20 20 20 64 65 66 61 75 6c 74 20 20 20 20 20      default     
4780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4790: 20 20 3a 20 7a 43 6f 64 65 3d 22 3f 3f 3f 3f 22    : zCode="????"
47a0: 3b 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 54  ; break;.  }.  T
47b0: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
47c0: 73 74 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72  str);.  Tcl_DStr
47d0: 69 6e 67 41 70 70 65 6e 64 28 26 73 74 72 2c 20  ingAppend(&str, 
47e0: 70 44 62 2d 3e 7a 41 75 74 68 2c 20 2d 31 29 3b  pDb->zAuth, -1);
47f0: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70  .  Tcl_DStringAp
4800: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72  pendElement(&str
4810: 2c 20 7a 43 6f 64 65 29 3b 0a 20 20 54 63 6c 5f  , zCode);.  Tcl_
4820: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65  DStringAppendEle
4830: 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41 72 67 31  ment(&str, zArg1
4840: 20 3f 20 7a 41 72 67 31 20 3a 20 22 22 29 3b 0a   ? zArg1 : "");.
4850: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
4860: 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c  endElement(&str,
4870: 20 7a 41 72 67 32 20 3f 20 7a 41 72 67 32 20 3a   zArg2 ? zArg2 :
4880: 20 22 22 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72   "");.  Tcl_DStr
4890: 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ingAppendElement
48a0: 28 26 73 74 72 2c 20 7a 41 72 67 33 20 3f 20 7a  (&str, zArg3 ? z
48b0: 41 72 67 33 20 3a 20 22 22 29 3b 0a 20 20 54 63  Arg3 : "");.  Tc
48c0: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45  l_DStringAppendE
48d0: 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41 72  lement(&str, zAr
48e0: 67 34 20 3f 20 7a 41 72 67 34 20 3a 20 22 22 29  g4 ? zArg4 : "")
48f0: 3b 0a 20 20 72 63 20 3d 20 54 63 6c 5f 47 6c 6f  ;.  rc = Tcl_Glo
4900: 62 61 6c 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74  balEval(pDb->int
4910: 65 72 70 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67  erp, Tcl_DString
4920: 56 61 6c 75 65 28 26 73 74 72 29 29 3b 0a 20 20  Value(&str));.  
4930: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
4940: 26 73 74 72 29 3b 0a 20 20 7a 52 65 70 6c 79 20  &str);.  zReply 
4950: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52  = Tcl_GetStringR
4960: 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72  esult(pDb->inter
4970: 70 29 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70  p);.  if( strcmp
4980: 28 7a 52 65 70 6c 79 2c 22 53 51 4c 49 54 45 5f  (zReply,"SQLITE_
4990: 4f 4b 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  OK")==0 ){.    r
49a0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
49b0: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
49c0: 70 28 7a 52 65 70 6c 79 2c 22 53 51 4c 49 54 45  p(zReply,"SQLITE
49d0: 5f 44 45 4e 59 22 29 3d 3d 30 20 29 7b 0a 20 20  _DENY")==0 ){.  
49e0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 45    rc = SQLITE_DE
49f0: 4e 59 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  NY;.  }else if( 
4a00: 73 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22 53  strcmp(zReply,"S
4a10: 51 4c 49 54 45 5f 49 47 4e 4f 52 45 22 29 3d 3d  QLITE_IGNORE")==
4a20: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
4a30: 4c 49 54 45 5f 49 47 4e 4f 52 45 3b 0a 20 20 7d  LITE_IGNORE;.  }
4a40: 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 39  else{.    rc = 9
4a50: 39 39 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  99;.  }.  return
4a60: 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
4a70: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
4a80: 48 4f 52 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 2f  HORIZATION */../
4a90: 2a 0a 2a 2a 20 7a 54 65 78 74 20 69 73 20 61 20  *.** zText is a 
4aa0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 65 78 74 20  pointer to text 
4ab0: 6f 62 74 61 69 6e 65 64 20 76 69 61 20 61 6e 20  obtained via an 
4ac0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
4ad0: 65 78 74 28 29 0a 2a 2a 20 6f 72 20 73 69 6d 69  ext().** or simi
4ae0: 6c 61 72 20 69 6e 74 65 72 66 61 63 65 2e 20 54  lar interface. T
4af0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
4b00: 72 6e 73 20 61 20 54 63 6c 20 73 74 72 69 6e 67  rns a Tcl string
4b10: 20 6f 62 6a 65 63 74 2c 20 0a 2a 2a 20 72 65 66   object, .** ref
4b20: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 73 65 74  erence count set
4b30: 20 74 6f 20 30 2c 20 63 6f 6e 74 61 69 6e 69 6e   to 0, containin
4b40: 67 20 74 68 65 20 74 65 78 74 2e 20 49 66 20 61  g the text. If a
4b50: 20 74 72 61 6e 73 6c 61 74 69 6f 6e 0a 2a 2a 20   translation.** 
4b60: 62 65 74 77 65 65 6e 20 69 73 6f 38 38 35 39 20  between iso8859 
4b70: 61 6e 64 20 55 54 46 2d 38 20 69 73 20 72 65 71  and UTF-8 is req
4b80: 75 69 72 65 64 2c 20 69 74 20 69 73 20 70 72 65  uired, it is pre
4b90: 66 6f 72 6d 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  formed..*/.stati
4ba0: 63 20 54 63 6c 5f 4f 62 6a 20 2a 64 62 54 65 78  c Tcl_Obj *dbTex
4bb0: 74 54 6f 4f 62 6a 28 63 68 61 72 20 63 6f 6e 73  tToObj(char cons
4bc0: 74 20 2a 7a 54 65 78 74 29 7b 0a 20 20 54 63 6c  t *zText){.  Tcl
4bd0: 5f 4f 62 6a 20 2a 70 56 61 6c 3b 0a 23 69 66 64  _Obj *pVal;.#ifd
4be0: 65 66 20 55 54 46 5f 54 52 41 4e 53 4c 41 54 49  ef UTF_TRANSLATI
4bf0: 4f 4e 5f 4e 45 45 44 45 44 0a 20 20 54 63 6c 5f  ON_NEEDED.  Tcl_
4c00: 44 53 74 72 69 6e 67 20 64 43 6f 6c 3b 0a 20 20  DString dCol;.  
4c10: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28  Tcl_DStringInit(
4c20: 26 64 43 6f 6c 29 3b 0a 20 20 54 63 6c 5f 45 78  &dCol);.  Tcl_Ex
4c30: 74 65 72 6e 61 6c 54 6f 55 74 66 44 53 74 72 69  ternalToUtfDStri
4c40: 6e 67 28 4e 55 4c 4c 2c 20 7a 54 65 78 74 2c 20  ng(NULL, zText, 
4c50: 2d 31 2c 20 26 64 43 6f 6c 29 3b 0a 20 20 70 56  -1, &dCol);.  pV
4c60: 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69  al = Tcl_NewStri
4c70: 6e 67 4f 62 6a 28 54 63 6c 5f 44 53 74 72 69 6e  ngObj(Tcl_DStrin
4c80: 67 56 61 6c 75 65 28 26 64 43 6f 6c 29 2c 20 2d  gValue(&dCol), -
4c90: 31 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  1);.  Tcl_DStrin
4ca0: 67 46 72 65 65 28 26 64 43 6f 6c 29 3b 0a 23 65  gFree(&dCol);.#e
4cb0: 6c 73 65 0a 20 20 70 56 61 6c 20 3d 20 54 63 6c  lse.  pVal = Tcl
4cc0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54  _NewStringObj(zT
4cd0: 65 78 74 2c 20 2d 31 29 3b 0a 23 65 6e 64 69 66  ext, -1);.#endif
4ce0: 0a 20 20 72 65 74 75 72 6e 20 70 56 61 6c 3b 0a  .  return pVal;.
4cf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
4d00: 75 74 69 6e 65 20 72 65 61 64 73 20 61 20 6c 69  utine reads a li
4d10: 6e 65 20 6f 66 20 74 65 78 74 20 66 72 6f 6d 20  ne of text from 
4d20: 46 49 4c 45 20 69 6e 2c 20 73 74 6f 72 65 73 0a  FILE in, stores.
4d30: 2a 2a 20 74 68 65 20 74 65 78 74 20 69 6e 20 6d  ** the text in m
4d40: 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
4d50: 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20 61 6e 64  rom malloc() and
4d60: 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74   returns a point
4d70: 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 74 65 78  er.** to the tex
4d80: 74 2e 20 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  t.  NULL is retu
4d90: 72 6e 65 64 20 61 74 20 65 6e 64 20 6f 66 20 66  rned at end of f
4da0: 69 6c 65 2c 20 6f 72 20 69 66 20 6d 61 6c 6c 6f  ile, or if mallo
4db0: 63 28 29 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2a  c().** fails..**
4dc0: 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61 63  .** The interfac
4dd0: 65 20 69 73 20 6c 69 6b 65 20 22 72 65 61 64 6c  e is like "readl
4de0: 69 6e 65 22 20 62 75 74 20 6e 6f 20 63 6f 6d 6d  ine" but no comm
4df0: 61 6e 64 2d 6c 69 6e 65 20 65 64 69 74 69 6e 67  and-line editing
4e00: 0a 2a 2a 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a  .** is done..**.
4e10: 2a 2a 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 73  ** copied from s
4e20: 68 65 6c 6c 2e 63 20 66 72 6f 6d 20 27 2e 69 6d  hell.c from '.im
4e30: 70 6f 72 74 27 20 63 6f 6d 6d 61 6e 64 0a 2a 2f  port' command.*/
4e40: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 6c 6f  .static char *lo
4e50: 63 61 6c 5f 67 65 74 6c 69 6e 65 28 63 68 61 72  cal_getline(char
4e60: 20 2a 7a 50 72 6f 6d 70 74 2c 20 46 49 4c 45 20   *zPrompt, FILE 
4e70: 2a 69 6e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4c  *in){.  char *zL
4e80: 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 4c 69 6e 65  ine;.  int nLine
4e90: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74  ;.  int n;.  int
4ea0: 20 65 6f 6c 3b 0a 0a 20 20 6e 4c 69 6e 65 20 3d   eol;..  nLine =
4eb0: 20 31 30 30 3b 0a 20 20 7a 4c 69 6e 65 20 3d 20   100;.  zLine = 
4ec0: 6d 61 6c 6c 6f 63 28 20 6e 4c 69 6e 65 20 29 3b  malloc( nLine );
4ed0: 0a 20 20 69 66 28 20 7a 4c 69 6e 65 3d 3d 30 20  .  if( zLine==0 
4ee0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 20  ) return 0;.  n 
4ef0: 3d 20 30 3b 0a 20 20 65 6f 6c 20 3d 20 30 3b 0a  = 0;.  eol = 0;.
4f00: 20 20 77 68 69 6c 65 28 20 21 65 6f 6c 20 29 7b    while( !eol ){
4f10: 0a 20 20 20 20 69 66 28 20 6e 2b 31 30 30 3e 6e  .    if( n+100>n
4f20: 4c 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 6e 4c  Line ){.      nL
4f30: 69 6e 65 20 3d 20 6e 4c 69 6e 65 2a 32 20 2b 20  ine = nLine*2 + 
4f40: 31 30 30 3b 0a 20 20 20 20 20 20 7a 4c 69 6e 65  100;.      zLine
4f50: 20 3d 20 72 65 61 6c 6c 6f 63 28 7a 4c 69 6e 65   = realloc(zLine
4f60: 2c 20 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20  , nLine);.      
4f70: 69 66 28 20 7a 4c 69 6e 65 3d 3d 30 20 29 20 72  if( zLine==0 ) r
4f80: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
4f90: 20 20 20 69 66 28 20 66 67 65 74 73 28 26 7a 4c     if( fgets(&zL
4fa0: 69 6e 65 5b 6e 5d 2c 20 6e 4c 69 6e 65 20 2d 20  ine[n], nLine - 
4fb0: 6e 2c 20 69 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  n, in)==0 ){.   
4fc0: 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20     if( n==0 ){. 
4fd0: 20 20 20 20 20 20 20 66 72 65 65 28 7a 4c 69 6e         free(zLin
4fe0: 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  e);.        retu
4ff0: 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
5000: 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30      zLine[n] = 0
5010: 3b 0a 20 20 20 20 20 20 65 6f 6c 20 3d 20 31 3b  ;.      eol = 1;
5020: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5030: 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 7a    }.    while( z
5040: 4c 69 6e 65 5b 6e 5d 20 29 7b 20 6e 2b 2b 3b 20  Line[n] ){ n++; 
5050: 7d 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26  }.    if( n>0 &&
5060: 20 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 6e   zLine[n-1]=='\n
5070: 27 20 29 7b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a  ' ){.      n--;.
5080: 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d        zLine[n] =
5090: 20 30 3b 0a 20 20 20 20 20 20 65 6f 6c 20 3d 20   0;.      eol = 
50a0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a  1;.    }.  }.  z
50b0: 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28 20  Line = realloc( 
50c0: 7a 4c 69 6e 65 2c 20 6e 2b 31 20 29 3b 0a 20 20  zLine, n+1 );.  
50d0: 72 65 74 75 72 6e 20 7a 4c 69 6e 65 3b 0a 7d 0a  return zLine;.}.
50e0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 22 73 71 6c 69  ./*.** The "sqli
50f0: 74 65 22 20 63 6f 6d 6d 61 6e 64 20 62 65 6c 6f  te" command belo
5100: 77 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 20  w creates a new 
5110: 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 66 6f 72 20  Tcl command for 
5120: 65 61 63 68 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  each.** connecti
5130: 6f 6e 20 69 74 20 6f 70 65 6e 73 20 74 6f 20 61  on it opens to a
5140: 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  n SQLite databas
5150: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
5160: 20 69 73 20 69 6e 76 6f 6b 65 64 0a 2a 2a 20 77   is invoked.** w
5170: 68 65 6e 65 76 65 72 20 6f 6e 65 20 6f 66 20 74  henever one of t
5180: 68 6f 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2d  hose connection-
5190: 73 70 65 63 69 66 69 63 20 63 6f 6d 6d 61 6e 64  specific command
51a0: 73 20 69 73 20 65 78 65 63 75 74 65 64 0a 2a 2a  s is executed.**
51b0: 20 69 6e 20 54 63 6c 2e 20 20 46 6f 72 20 65 78   in Tcl.  For ex
51c0: 61 6d 70 6c 65 2c 20 69 66 20 79 6f 75 20 72 75  ample, if you ru
51d0: 6e 20 54 63 6c 20 63 6f 64 65 20 6c 69 6b 65 20  n Tcl code like 
51e0: 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
51f0: 20 20 73 71 6c 69 74 65 33 20 64 62 31 20 20 22    sqlite3 db1  "
5200: 6d 79 5f 64 61 74 61 62 61 73 65 22 0a 2a 2a 20  my_database".** 
5210: 20 20 20 20 20 20 64 62 31 20 63 6c 6f 73 65 0a        db1 close.
5220: 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
5230: 63 6f 6d 6d 61 6e 64 20 6f 70 65 6e 73 20 61 20  command opens a 
5240: 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68  connection to th
5250: 65 20 22 6d 79 5f 64 61 74 61 62 61 73 65 22 20  e "my_database" 
5260: 64 61 74 61 62 61 73 65 0a 2a 2a 20 61 6e 64 20  database.** and 
5270: 63 61 6c 6c 73 20 74 68 61 74 20 63 6f 6e 6e 65  calls that conne
5280: 63 74 69 6f 6e 20 22 64 62 31 22 2e 20 20 54 68  ction "db1".  Th
5290: 65 20 73 65 63 6f 6e 64 20 63 6f 6d 6d 61 6e 64  e second command
52a0: 20 63 61 75 73 65 73 20 74 68 69 73 0a 2a 2a 20   causes this.** 
52b0: 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 62 65  subroutine to be
52c0: 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a 73 74 61   invoked..*/.sta
52d0: 74 69 63 20 69 6e 74 20 44 62 4f 62 6a 43 6d 64  tic int DbObjCmd
52e0: 28 76 6f 69 64 20 2a 63 64 2c 20 54 63 6c 5f 49  (void *cd, Tcl_I
52f0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
5300: 6e 74 20 6f 62 6a 63 2c 54 63 6c 5f 4f 62 6a 20  nt objc,Tcl_Obj 
5310: 2a 63 6f 6e 73 74 2a 6f 62 6a 76 29 7b 0a 20 20  *const*objv){.  
5320: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20  SqliteDb *pDb = 
5330: 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20  (SqliteDb*)cd;. 
5340: 20 69 6e 74 20 63 68 6f 69 63 65 3b 0a 20 20 69   int choice;.  i
5350: 6e 74 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a  nt rc = TCL_OK;.
5360: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
5370: 68 61 72 20 2a 44 42 5f 73 74 72 73 5b 5d 20 3d  har *DB_strs[] =
5380: 20 7b 0a 20 20 20 20 22 61 75 74 68 6f 72 69 7a   {.    "authoriz
5390: 65 72 22 2c 20 20 20 20 20 20 20 20 20 22 62 75  er",         "bu
53a0: 73 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  sy",            
53b0: 20 20 22 63 61 63 68 65 22 2c 0a 20 20 20 20 22    "cache",.    "
53c0: 63 68 61 6e 67 65 73 22 2c 20 20 20 20 20 20 20  changes",       
53d0: 20 20 20 20 20 22 63 6c 6f 73 65 22 2c 20 20 20       "close",   
53e0: 20 20 20 20 20 20 20 20 20 20 22 63 6f 6c 6c 61            "colla
53f0: 74 65 22 2c 0a 20 20 20 20 22 63 6f 6c 6c 61 74  te",.    "collat
5400: 69 6f 6e 5f 6e 65 65 64 65 64 22 2c 20 20 20 22  ion_needed",   "
5410: 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 22 2c 20 20 20  commit_hook",   
5420: 20 20 20 20 22 63 6f 6d 70 6c 65 74 65 22 2c 0a      "complete",.
5430: 20 20 20 20 22 63 6f 70 79 22 2c 20 20 20 20 20      "copy",     
5440: 20 20 20 20 20 20 20 20 20 20 22 65 72 72 6f 72            "error
5450: 63 6f 64 65 22 2c 20 20 20 20 20 20 20 20 20 22  code",         "
5460: 65 76 61 6c 22 2c 0a 20 20 20 20 22 65 78 69 73  eval",.    "exis
5470: 74 73 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ts",            
5480: 20 22 66 75 6e 63 74 69 6f 6e 22 2c 20 20 20 20   "function",    
5490: 20 20 20 20 20 20 22 6c 61 73 74 5f 69 6e 73 65        "last_inse
54a0: 72 74 5f 72 6f 77 69 64 22 2c 0a 20 20 20 20 22  rt_rowid",.    "
54b0: 6e 75 6c 6c 76 61 6c 75 65 22 2c 20 20 20 20 20  nullvalue",     
54c0: 20 20 20 20 20 22 6f 6e 65 63 6f 6c 75 6d 6e 22       "onecolumn"
54d0: 2c 20 20 20 20 20 20 20 20 20 22 70 72 6f 66 69  ,         "profi
54e0: 6c 65 22 2c 0a 20 20 20 20 22 70 72 6f 67 72 65  le",.    "progre
54f0: 73 73 22 2c 20 20 20 20 20 20 20 20 20 20 20 22  ss",           "
5500: 72 65 6b 65 79 22 2c 20 20 20 20 20 20 20 20 20  rekey",         
5510: 20 20 20 20 22 72 6f 6c 6c 62 61 63 6b 5f 68 6f      "rollback_ho
5520: 6f 6b 22 2c 0a 20 20 20 20 22 72 65 6c 65 61 73  ok",.    "releas
5530: 65 5f 6d 65 6d 6f 72 79 22 2c 20 20 20 20 20 22  e_memory",     "
5540: 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 22  soft_heap_limit"
5550: 2c 20 20 20 22 74 69 6d 65 6f 75 74 22 2c 0a 20  ,   "timeout",. 
5560: 20 20 20 22 74 6f 74 61 6c 5f 63 68 61 6e 67 65     "total_change
5570: 73 22 2c 20 20 20 20 20 20 22 74 72 61 63 65 22  s",      "trace"
5580: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 22 74  ,             "t
5590: 72 61 6e 73 61 63 74 69 6f 6e 22 2c 0a 20 20 20  ransaction",.   
55a0: 20 22 75 70 64 61 74 65 5f 68 6f 6f 6b 22 2c 20   "update_hook", 
55b0: 20 20 20 20 20 20 20 22 76 65 72 73 69 6f 6e 22         "version"
55c0: 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20  ,           0   
55d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55e0: 20 0a 20 20 7d 3b 0a 20 20 65 6e 75 6d 20 44 42   .  };.  enum DB
55f0: 5f 65 6e 75 6d 20 7b 0a 20 20 20 20 44 42 5f 41  _enum {.    DB_A
5600: 55 54 48 4f 52 49 5a 45 52 2c 20 20 20 20 20 20  UTHORIZER,      
5610: 20 20 44 42 5f 42 55 53 59 2c 20 20 20 20 20 20    DB_BUSY,      
5620: 20 20 20 20 20 20 20 44 42 5f 43 41 43 48 45 2c         DB_CACHE,
5630: 0a 20 20 20 20 44 42 5f 43 48 41 4e 47 45 53 2c  .    DB_CHANGES,
5640: 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 43 4c             DB_CL
5650: 4f 53 45 2c 20 20 20 20 20 20 20 20 20 20 20 20  OSE,            
5660: 44 42 5f 43 4f 4c 4c 41 54 45 2c 0a 20 20 20 20  DB_COLLATE,.    
5670: 44 42 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4e 45 45  DB_COLLATION_NEE
5680: 44 45 44 2c 20 20 44 42 5f 43 4f 4d 4d 49 54 5f  DED,  DB_COMMIT_
5690: 48 4f 4f 4b 2c 20 20 20 20 20 20 44 42 5f 43 4f  HOOK,      DB_CO
56a0: 4d 50 4c 45 54 45 2c 0a 20 20 20 20 44 42 5f 43  MPLETE,.    DB_C
56b0: 4f 50 59 2c 20 20 20 20 20 20 20 20 20 20 20 20  OPY,            
56c0: 20 20 44 42 5f 45 52 52 4f 52 43 4f 44 45 2c 20    DB_ERRORCODE, 
56d0: 20 20 20 20 20 20 20 44 42 5f 45 56 41 4c 2c 0a         DB_EVAL,.
56e0: 20 20 20 20 44 42 5f 45 58 49 53 54 53 2c 20 20      DB_EXISTS,  
56f0: 20 20 20 20 20 20 20 20 20 20 44 42 5f 46 55 4e            DB_FUN
5700: 43 54 49 4f 4e 2c 20 20 20 20 20 20 20 20 20 44  CTION,         D
5710: 42 5f 4c 41 53 54 5f 49 4e 53 45 52 54 5f 52 4f  B_LAST_INSERT_RO
5720: 57 49 44 2c 0a 20 20 20 20 44 42 5f 4e 55 4c 4c  WID,.    DB_NULL
5730: 56 41 4c 55 45 2c 20 20 20 20 20 20 20 20 20 44  VALUE,         D
5740: 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 2c 20 20 20 20  B_ONECOLUMN,    
5750: 20 20 20 20 44 42 5f 50 52 4f 46 49 4c 45 2c 0a      DB_PROFILE,.
5760: 20 20 20 20 44 42 5f 50 52 4f 47 52 45 53 53 2c      DB_PROGRESS,
5770: 20 20 20 20 20 20 20 20 20 20 44 42 5f 52 45 4b            DB_REK
5780: 45 59 2c 20 20 20 20 20 20 20 20 20 20 20 20 44  EY,            D
5790: 42 5f 52 4f 4c 4c 42 41 43 4b 5f 48 4f 4f 4b 2c  B_ROLLBACK_HOOK,
57a0: 0a 20 20 20 20 44 42 5f 52 45 4c 45 41 53 45 5f  .    DB_RELEASE_
57b0: 4d 45 4d 4f 52 59 2c 20 20 20 20 44 42 5f 53 4f  MEMORY,    DB_SO
57c0: 46 54 5f 48 45 41 50 5f 4c 49 4d 49 54 2c 20 20  FT_HEAP_LIMIT,  
57d0: 44 42 5f 54 49 4d 45 4f 55 54 2c 0a 20 20 20 20  DB_TIMEOUT,.    
57e0: 44 42 5f 54 4f 54 41 4c 5f 43 48 41 4e 47 45 53  DB_TOTAL_CHANGES
57f0: 2c 20 20 20 20 20 44 42 5f 54 52 41 43 45 2c 20  ,     DB_TRACE, 
5800: 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 54 52             DB_TR
5810: 41 4e 53 41 43 54 49 4f 4e 2c 0a 20 20 20 20 44  ANSACTION,.    D
5820: 42 5f 55 50 44 41 54 45 5f 48 4f 4f 4b 2c 20 20  B_UPDATE_HOOK,  
5830: 20 20 20 20 20 44 42 5f 56 45 52 53 49 4f 4e 0a       DB_VERSION.
5840: 20 20 7d 3b 0a 20 20 2f 2a 20 64 6f 6e 27 74 20    };.  /* don't 
5850: 6c 65 61 76 65 20 74 72 61 69 6c 69 6e 67 20 63  leave trailing c
5860: 6f 6d 6d 61 73 20 6f 6e 20 44 42 5f 65 6e 75 6d  ommas on DB_enum
5870: 2c 20 69 74 20 63 6f 6e 66 75 73 65 73 20 74 68  , it confuses th
5880: 65 20 41 49 58 20 78 6c 63 20 63 6f 6d 70 69 6c  e AIX xlc compil
5890: 65 72 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62 6a  er */..  if( obj
58a0: 63 3c 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  c<2 ){.    Tcl_W
58b0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
58c0: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 55  rp, 1, objv, "SU
58d0: 42 43 4f 4d 4d 41 4e 44 20 2e 2e 2e 22 29 3b 0a  BCOMMAND ...");.
58e0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
58f0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
5900: 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d  Tcl_GetIndexFrom
5910: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
5920: 5b 31 5d 2c 20 44 42 5f 73 74 72 73 2c 20 22 6f  [1], DB_strs, "o
5930: 70 74 69 6f 6e 22 2c 20 30 2c 20 26 63 68 6f 69  ption", 0, &choi
5940: 63 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ce) ){.    retur
5950: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
5960: 0a 0a 20 20 73 77 69 74 63 68 28 20 28 65 6e 75  ..  switch( (enu
5970: 6d 20 44 42 5f 65 6e 75 6d 29 63 68 6f 69 63 65  m DB_enum)choice
5980: 20 29 7b 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62   ){..  /*    $db
5990: 20 61 75 74 68 6f 72 69 7a 65 72 20 3f 43 41 4c   authorizer ?CAL
59a0: 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a  LBACK?.  **.  **
59b0: 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65   Invoke the give
59c0: 6e 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61 75  n callback to au
59d0: 74 68 6f 72 69 7a 65 20 65 61 63 68 20 53 51 4c  thorize each SQL
59e0: 20 6f 70 65 72 61 74 69 6f 6e 20 61 73 20 69 74   operation as it
59f0: 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 69 6c 65   is.  ** compile
5a00: 64 2e 20 20 35 20 61 72 67 75 6d 65 6e 74 73 20  d.  5 arguments 
5a10: 61 72 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20  are appended to 
5a20: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 62 65 66  the callback bef
5a30: 6f 72 65 20 69 74 20 69 73 0a 20 20 2a 2a 20 69  ore it is.  ** i
5a40: 6e 76 6f 6b 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  nvoked:.  **.  *
5a50: 2a 20 20 20 28 31 29 20 54 68 65 20 61 75 74 68  *   (1) The auth
5a60: 6f 72 69 7a 61 74 69 6f 6e 20 74 79 70 65 20 28  orization type (
5a70: 65 78 3a 20 53 51 4c 49 54 45 5f 43 52 45 41 54  ex: SQLITE_CREAT
5a80: 45 5f 54 41 42 4c 45 2c 20 53 51 4c 49 54 45 5f  E_TABLE, SQLITE_
5a90: 49 4e 53 45 52 54 2c 20 2e 2e 2e 29 0a 20 20 2a  INSERT, ...).  *
5aa0: 2a 20 20 20 28 32 29 20 46 69 72 73 74 20 64 65  *   (2) First de
5ab0: 73 63 72 69 70 74 69 76 65 20 6e 61 6d 65 20 28  scriptive name (
5ac0: 64 65 70 65 6e 64 73 20 6f 6e 20 61 75 74 68 6f  depends on autho
5ad0: 72 69 7a 61 74 69 6f 6e 20 74 79 70 65 29 0a 20  rization type). 
5ae0: 20 2a 2a 20 20 20 28 33 29 20 53 65 63 6f 6e 64   **   (3) Second
5af0: 20 64 65 73 63 72 69 70 74 69 76 65 20 6e 61 6d   descriptive nam
5b00: 65 0a 20 20 2a 2a 20 20 20 28 34 29 20 4e 61 6d  e.  **   (4) Nam
5b10: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
5b20: 65 20 28 65 78 3a 20 22 6d 61 69 6e 22 2c 20 22  e (ex: "main", "
5b30: 74 65 6d 70 22 29 0a 20 20 2a 2a 20 20 20 28 35  temp").  **   (5
5b40: 29 20 4e 61 6d 65 20 6f 66 20 74 72 69 67 67 65  ) Name of trigge
5b50: 72 20 74 68 61 74 20 69 73 20 64 6f 69 6e 67 20  r that is doing 
5b60: 74 68 65 20 61 63 63 65 73 73 0a 20 20 2a 2a 0a  the access.  **.
5b70: 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61 63    ** The callbac
5b80: 6b 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20  k should return 
5b90: 6f 6e 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  on of the follow
5ba0: 69 6e 67 20 73 74 72 69 6e 67 73 3a 20 53 51 4c  ing strings: SQL
5bb0: 49 54 45 5f 4f 4b 2c 0a 20 20 2a 2a 20 53 51 4c  ITE_OK,.  ** SQL
5bc0: 49 54 45 5f 49 47 4e 4f 52 45 2c 20 6f 72 20 53  ITE_IGNORE, or S
5bd0: 51 4c 49 54 45 5f 44 45 4e 59 2e 20 20 41 6e 79  QLITE_DENY.  Any
5be0: 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76 61   other return va
5bf0: 6c 75 65 20 69 73 20 61 6e 20 65 72 72 6f 72 2e  lue is an error.
5c00: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
5c10: 69 73 20 6d 65 74 68 6f 64 20 69 73 20 69 6e 76  is method is inv
5c20: 6f 6b 65 64 20 77 69 74 68 20 6e 6f 20 61 72 67  oked with no arg
5c30: 75 6d 65 6e 74 73 2c 20 74 68 65 20 63 75 72 72  uments, the curr
5c40: 65 6e 74 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  ent authorizatio
5c50: 6e 0a 20 20 2a 2a 20 63 61 6c 6c 62 61 63 6b 20  n.  ** callback 
5c60: 73 74 72 69 6e 67 20 69 73 20 72 65 74 75 72 6e  string is return
5c70: 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ed..  */.  case 
5c80: 44 42 5f 41 55 54 48 4f 52 49 5a 45 52 3a 20 7b  DB_AUTHORIZER: {
5c90: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
5ca0: 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
5cb0: 4e 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  N.    Tcl_Append
5cc0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
5cd0: 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 6e 6f  authorization no
5ce0: 74 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74  t available in t
5cf0: 68 69 73 20 62 75 69 6c 64 22 2c 20 30 29 3b 0a  his build", 0);.
5d00: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
5d10: 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 20 20  RROR;.#else.    
5d20: 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20  if( objc>3 ){.  
5d30: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
5d40: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
5d50: 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b  objv, "?CALLBACK
5d60: 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ?");.      retur
5d70: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
5d80: 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d   }else if( objc=
5d90: 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =2 ){.      if( 
5da0: 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20  pDb->zAuth ){.  
5db0: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
5dc0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
5dd0: 44 62 2d 3e 7a 41 75 74 68 2c 20 30 29 3b 0a 20  Db->zAuth, 0);. 
5de0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
5df0: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 41  {.      char *zA
5e00: 75 74 68 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c  uth;.      int l
5e10: 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44  en;.      if( pD
5e20: 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20  b->zAuth ){.    
5e30: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
5e40: 2d 3e 7a 41 75 74 68 29 3b 0a 20 20 20 20 20 20  ->zAuth);.      
5e50: 7d 0a 20 20 20 20 20 20 7a 41 75 74 68 20 3d 20  }.      zAuth = 
5e60: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
5e70: 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c  mObj(objv[2], &l
5e80: 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  en);.      if( z
5e90: 41 75 74 68 20 26 26 20 6c 65 6e 3e 30 20 29 7b  Auth && len>0 ){
5ea0: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 41  .        pDb->zA
5eb0: 75 74 68 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28  uth = Tcl_Alloc(
5ec0: 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20   len + 1 );.    
5ed0: 20 20 20 20 73 74 72 63 70 79 28 70 44 62 2d 3e      strcpy(pDb->
5ee0: 7a 41 75 74 68 2c 20 7a 41 75 74 68 29 3b 0a 20  zAuth, zAuth);. 
5ef0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
5f00: 20 20 20 20 70 44 62 2d 3e 7a 41 75 74 68 20 3d      pDb->zAuth =
5f10: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
5f20: 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74 68    if( pDb->zAuth
5f30: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
5f40: 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  >interp = interp
5f50: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
5f60: 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65 72  3_set_authorizer
5f70: 28 70 44 62 2d 3e 64 62 2c 20 61 75 74 68 5f 63  (pDb->db, auth_c
5f80: 61 6c 6c 62 61 63 6b 2c 20 70 44 62 29 3b 0a 20  allback, pDb);. 
5f90: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
5fa0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f      sqlite3_set_
5fb0: 61 75 74 68 6f 72 69 7a 65 72 28 70 44 62 2d 3e  authorizer(pDb->
5fc0: 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  db, 0, 0);.     
5fd0: 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
5fe0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
5ff0: 20 20 2f 2a 20 20 20 20 24 64 62 20 62 75 73 79    /*    $db busy
6000: 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a   ?CALLBACK?.  **
6010: 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  .  ** Invoke the
6020: 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20   given callback 
6030: 69 66 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d  if an SQL statem
6040: 65 6e 74 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ent attempts to 
6050: 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 6c 6f 63 6b  open.  ** a lock
6060: 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ed database file
6070: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
6080: 5f 42 55 53 59 3a 20 7b 0a 20 20 20 20 69 66 28  _BUSY: {.    if(
6090: 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20   objc>3 ){.     
60a0: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
60b0: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
60c0: 76 2c 20 22 43 41 4c 4c 42 41 43 4b 22 29 3b 0a  v, "CALLBACK");.
60d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
60e0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73  _ERROR;.    }els
60f0: 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b  e if( objc==2 ){
6100: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
6110: 7a 42 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20  zBusy ){.       
6120: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
6130: 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a  t(interp, pDb->z
6140: 42 75 73 79 2c 20 30 29 3b 0a 20 20 20 20 20 20  Busy, 0);.      
6150: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
6160: 20 20 20 63 68 61 72 20 2a 7a 42 75 73 79 3b 0a     char *zBusy;.
6170: 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20        int len;. 
6180: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 42       if( pDb->zB
6190: 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20 54  usy ){.        T
61a0: 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 42 75  cl_Free(pDb->zBu
61b0: 73 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  sy);.      }.   
61c0: 20 20 20 7a 42 75 73 79 20 3d 20 54 63 6c 5f 47     zBusy = Tcl_G
61d0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
61e0: 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a  objv[2], &len);.
61f0: 20 20 20 20 20 20 69 66 28 20 7a 42 75 73 79 20        if( zBusy 
6200: 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20  && len>0 ){.    
6210: 20 20 20 20 70 44 62 2d 3e 7a 42 75 73 79 20 3d      pDb->zBusy =
6220: 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20   Tcl_Alloc( len 
6230: 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 73  + 1 );.        s
6240: 74 72 63 70 79 28 70 44 62 2d 3e 7a 42 75 73 79  trcpy(pDb->zBusy
6250: 2c 20 7a 42 75 73 79 29 3b 0a 20 20 20 20 20 20  , zBusy);.      
6260: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
6270: 44 62 2d 3e 7a 42 75 73 79 20 3d 20 30 3b 0a 20  Db->zBusy = 0;. 
6280: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
6290: 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20   pDb->zBusy ){. 
62a0: 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65         pDb->inte
62b0: 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20  rp = interp;.   
62c0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73       sqlite3_bus
62d0: 79 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64  y_handler(pDb->d
62e0: 62 2c 20 44 62 42 75 73 79 48 61 6e 64 6c 65 72  b, DbBusyHandler
62f0: 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65  , pDb);.      }e
6300: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
6310: 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65  ite3_busy_handle
6320: 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29  r(pDb->db, 0, 0)
6330: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6340: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
6350: 20 20 2f 2a 20 20 20 20 20 24 64 62 20 63 61 63    /*     $db cac
6360: 68 65 20 66 6c 75 73 68 0a 20 20 2a 2a 20 20 20  he flush.  **   
6370: 20 20 24 64 62 20 63 61 63 68 65 20 73 69 7a 65    $db cache size
6380: 20 6e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6c 75   n.  **.  ** Flu
6390: 73 68 20 74 68 65 20 70 72 65 70 61 72 65 64 20  sh the prepared 
63a0: 73 74 61 74 65 6d 65 6e 74 20 63 61 63 68 65 2c  statement cache,
63b0: 20 6f 72 20 73 65 74 20 74 68 65 20 6d 61 78 69   or set the maxi
63c0: 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  mum number of.  
63d0: 2a 2a 20 63 61 63 68 65 64 20 73 74 61 74 65 6d  ** cached statem
63e0: 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  ents..  */.  cas
63f0: 65 20 44 42 5f 43 41 43 48 45 3a 20 7b 0a 20 20  e DB_CACHE: {.  
6400: 20 20 63 68 61 72 20 2a 73 75 62 43 6d 64 3b 0a    char *subCmd;.
6410: 20 20 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 20 20      int n;..    
6420: 69 66 28 20 6f 62 6a 63 3c 3d 32 20 29 7b 0a 20  if( objc<=2 ){. 
6430: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
6440: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
6450: 20 6f 62 6a 76 2c 20 22 63 61 63 68 65 20 6f 70   objv, "cache op
6460: 74 69 6f 6e 20 3f 61 72 67 3f 22 29 3b 0a 20 20  tion ?arg?");.  
6470: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
6480: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
6490: 73 75 62 43 6d 64 20 3d 20 54 63 6c 5f 47 65 74  subCmd = Tcl_Get
64a0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 20 6f  StringFromObj( o
64b0: 62 6a 76 5b 32 5d 2c 20 30 20 29 3b 0a 20 20 20  bjv[2], 0 );.   
64c0: 20 69 66 28 20 2a 73 75 62 43 6d 64 3d 3d 27 66   if( *subCmd=='f
64d0: 27 20 26 26 20 73 74 72 63 6d 70 28 73 75 62 43  ' && strcmp(subC
64e0: 6d 64 2c 22 66 6c 75 73 68 22 29 3d 3d 30 20 29  md,"flush")==0 )
64f0: 7b 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63  {.      if( objc
6500: 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 54  !=3 ){.        T
6510: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
6520: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
6530: 20 22 66 6c 75 73 68 22 29 3b 0a 20 20 20 20 20   "flush");.     
6540: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
6550: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ROR;.      }else
6560: 7b 0a 20 20 20 20 20 20 20 20 66 6c 75 73 68 53  {.        flushS
6570: 74 6d 74 43 61 63 68 65 28 20 70 44 62 20 29 3b  tmtCache( pDb );
6580: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
6590: 73 65 20 69 66 28 20 2a 73 75 62 43 6d 64 3d 3d  se if( *subCmd==
65a0: 27 73 27 20 26 26 20 73 74 72 63 6d 70 28 73 75  's' && strcmp(su
65b0: 62 43 6d 64 2c 22 73 69 7a 65 22 29 3d 3d 30 20  bCmd,"size")==0 
65c0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a  ){.      if( obj
65d0: 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20  c!=4 ){.        
65e0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
65f0: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
6600: 2c 20 22 73 69 7a 65 20 6e 22 29 3b 0a 20 20 20  , "size n");.   
6610: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
6620: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c  ERROR;.      }el
6630: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  se{.        if( 
6640: 54 43 4c 5f 45 52 52 4f 52 3d 3d 54 63 6c 5f 47  TCL_ERROR==Tcl_G
6650: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
6660: 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e  erp, objv[3], &n
6670: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  ) ){.          T
6680: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
6690: 20 69 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f 74   interp, "cannot
66a0: 20 63 6f 6e 76 65 72 74 20 5c 22 22 2c 20 0a 20   convert \"", . 
66b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63                Tc
66c0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
66d0: 62 6a 28 6f 62 6a 76 5b 33 5d 2c 30 29 2c 20 22  bj(objv[3],0), "
66e0: 5c 22 20 74 6f 20 69 6e 74 65 67 65 72 22 2c 20  \" to integer", 
66f0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  0);.          re
6700: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
6710: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
6720: 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 3c 30           if( n<0
6730: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
6740: 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28 20  flushStmtCache( 
6750: 70 44 62 20 29 3b 0a 20 20 20 20 20 20 20 20 20  pDb );.         
6760: 20 20 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20     n = 0;.      
6770: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3e      }else if( n>
6780: 4d 41 58 5f 50 52 45 50 41 52 45 44 5f 53 54 4d  MAX_PREPARED_STM
6790: 54 53 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  TS ){.          
67a0: 20 20 6e 20 3d 20 4d 41 58 5f 50 52 45 50 41 52    n = MAX_PREPAR
67b0: 45 44 5f 53 54 4d 54 53 3b 0a 20 20 20 20 20 20  ED_STMTS;.      
67c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
67d0: 70 44 62 2d 3e 6d 61 78 53 74 6d 74 20 3d 20 6e  pDb->maxStmt = n
67e0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
67f0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
6800: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
6810: 65 73 75 6c 74 28 20 69 6e 74 65 72 70 2c 20 22  esult( interp, "
6820: 62 61 64 20 6f 70 74 69 6f 6e 20 5c 22 22 2c 20  bad option \"", 
6830: 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47  .          Tcl_G
6840: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
6850: 6f 62 6a 76 5b 30 5d 2c 30 29 2c 20 22 5c 22 3a  objv[0],0), "\":
6860: 20 6d 75 73 74 20 62 65 20 66 6c 75 73 68 20 6f   must be flush o
6870: 72 20 73 69 7a 65 22 2c 20 30 29 3b 0a 20 20 20  r size", 0);.   
6880: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
6890: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  ROR;.    }.    b
68a0: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  reak;.  }..  /* 
68b0: 20 20 20 20 24 64 62 20 63 68 61 6e 67 65 73 0a      $db changes.
68c0: 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e    **.  ** Return
68d0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
68e0: 6f 77 73 20 74 68 61 74 20 77 65 72 65 20 6d 6f  ows that were mo
68f0: 64 69 66 69 65 64 2c 20 69 6e 73 65 72 74 65 64  dified, inserted
6900: 2c 20 6f 72 20 64 65 6c 65 74 65 64 20 62 79 0a  , or deleted by.
6910: 20 20 2a 2a 20 74 68 65 20 6d 6f 73 74 20 72 65    ** the most re
6920: 63 65 6e 74 20 49 4e 53 45 52 54 2c 20 55 50 44  cent INSERT, UPD
6930: 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74  ATE or DELETE st
6940: 61 74 65 6d 65 6e 74 2c 20 6e 6f 74 20 69 6e 63  atement, not inc
6950: 6c 75 64 69 6e 67 20 0a 20 20 2a 2a 20 61 6e 79  luding .  ** any
6960: 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79   changes made by
6970: 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d   trigger program
6980: 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  s..  */.  case D
6990: 42 5f 43 48 41 4e 47 45 53 3a 20 7b 0a 20 20 20  B_CHANGES: {.   
69a0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c   Tcl_Obj *pResul
69b0: 74 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  t;.    if( objc!
69c0: 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =2 ){.      Tcl_
69d0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
69e0: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 22  erp, 2, objv, ""
69f0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
6a00: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
6a10: 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54  .    pResult = T
6a20: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_GetObjResult(
6a30: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c  interp);.    Tcl
6a40: 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52 65 73 75  _SetIntObj(pResu
6a50: 6c 74 2c 20 73 71 6c 69 74 65 33 5f 63 68 61 6e  lt, sqlite3_chan
6a60: 67 65 73 28 70 44 62 2d 3e 64 62 29 29 3b 0a 20  ges(pDb->db));. 
6a70: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
6a80: 20 2f 2a 20 20 20 20 24 64 62 20 63 6c 6f 73 65   /*    $db close
6a90: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 68 75 74 64  .  **.  ** Shutd
6aa0: 6f 77 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  own the database
6ab0: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
6ac0: 43 4c 4f 53 45 3a 20 7b 0a 20 20 20 20 54 63 6c  CLOSE: {.    Tcl
6ad0: 5f 44 65 6c 65 74 65 43 6f 6d 6d 61 6e 64 28 69  _DeleteCommand(i
6ae0: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
6af0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
6b00: 5b 30 5d 2c 20 30 29 29 3b 0a 20 20 20 20 62 72  [0], 0));.    br
6b10: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
6b20: 20 2a 2a 20 20 20 20 20 24 64 62 20 63 6f 6c 6c   **     $db coll
6b30: 61 74 65 20 4e 41 4d 45 20 53 43 52 49 50 54 0a  ate NAME SCRIPT.
6b40: 20 20 2a 2a 0a 20 20 2a 2a 20 43 72 65 61 74 65    **.  ** Create
6b50: 20 61 20 6e 65 77 20 53 51 4c 20 63 6f 6c 6c 61   a new SQL colla
6b60: 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 63 61  tion function ca
6b70: 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 57 68 65 6e  lled NAME.  When
6b80: 65 76 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 66  ever.  ** that f
6b90: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
6ba0: 64 2c 20 69 6e 76 6f 6b 65 20 53 43 52 49 50 54  d, invoke SCRIPT
6bb0: 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65   to evaluate the
6bc0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a   function..  */.
6bd0: 20 20 63 61 73 65 20 44 42 5f 43 4f 4c 4c 41 54    case DB_COLLAT
6be0: 45 3a 20 7b 0a 20 20 20 20 53 71 6c 43 6f 6c 6c  E: {.    SqlColl
6bf0: 61 74 65 20 2a 70 43 6f 6c 6c 61 74 65 3b 0a 20  ate *pCollate;. 
6c00: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a     char *zName;.
6c10: 20 20 20 20 63 68 61 72 20 2a 7a 53 63 72 69 70      char *zScrip
6c20: 74 3b 0a 20 20 20 20 69 6e 74 20 6e 53 63 72 69  t;.    int nScri
6c30: 70 74 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  pt;.    if( objc
6c40: 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=4 ){.      Tcl
6c50: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
6c60: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
6c70: 4e 41 4d 45 20 53 43 52 49 50 54 22 29 3b 0a 20  NAME SCRIPT");. 
6c80: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
6c90: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
6ca0: 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74   zName = Tcl_Get
6cb0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
6cc0: 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20 7a  jv[2], 0);.    z
6cd0: 53 63 72 69 70 74 20 3d 20 54 63 6c 5f 47 65 74  Script = Tcl_Get
6ce0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
6cf0: 6a 76 5b 33 5d 2c 20 26 6e 53 63 72 69 70 74 29  jv[3], &nScript)
6d00: 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65 20 3d  ;.    pCollate =
6d10: 20 28 53 71 6c 43 6f 6c 6c 61 74 65 2a 29 54 63   (SqlCollate*)Tc
6d20: 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  l_Alloc( sizeof(
6d30: 2a 70 43 6f 6c 6c 61 74 65 29 20 2b 20 6e 53 63  *pCollate) + nSc
6d40: 72 69 70 74 20 2b 20 31 20 29 3b 0a 20 20 20 20  ript + 1 );.    
6d50: 69 66 28 20 70 43 6f 6c 6c 61 74 65 3d 3d 30 20  if( pCollate==0 
6d60: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
6d70: 4f 52 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65  OR;.    pCollate
6d80: 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72  ->interp = inter
6d90: 70 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65 2d  p;.    pCollate-
6da0: 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e 70 43  >pNext = pDb->pC
6db0: 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 70 43 6f 6c  ollate;.    pCol
6dc0: 6c 61 74 65 2d 3e 7a 53 63 72 69 70 74 20 3d 20  late->zScript = 
6dd0: 28 63 68 61 72 2a 29 26 70 43 6f 6c 6c 61 74 65  (char*)&pCollate
6de0: 5b 31 5d 3b 0a 20 20 20 20 70 44 62 2d 3e 70 43  [1];.    pDb->pC
6df0: 6f 6c 6c 61 74 65 20 3d 20 70 43 6f 6c 6c 61 74  ollate = pCollat
6e00: 65 3b 0a 20 20 20 20 73 74 72 63 70 79 28 70 43  e;.    strcpy(pC
6e10: 6f 6c 6c 61 74 65 2d 3e 7a 53 63 72 69 70 74 2c  ollate->zScript,
6e20: 20 7a 53 63 72 69 70 74 29 3b 0a 20 20 20 20 69   zScript);.    i
6e30: 66 28 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  f( sqlite3_creat
6e40: 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 70 44 62 2d  e_collation(pDb-
6e50: 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49  >db, zName, SQLI
6e60: 54 45 5f 55 54 46 38 2c 20 0a 20 20 20 20 20 20  TE_UTF8, .      
6e70: 20 20 70 43 6f 6c 6c 61 74 65 2c 20 74 63 6c 53    pCollate, tclS
6e80: 71 6c 43 6f 6c 6c 61 74 65 29 20 29 7b 0a 20 20  qlCollate) ){.  
6e90: 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
6ea0: 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
6eb0: 2a 29 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  *)sqlite3_errmsg
6ec0: 28 70 44 62 2d 3e 64 62 29 2c 20 54 43 4c 5f 56  (pDb->db), TCL_V
6ed0: 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 20 20  OLATILE);.      
6ee0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
6ef0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  ;.    }.    brea
6f00: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
6f10: 2a 20 20 20 20 20 24 64 62 20 63 6f 6c 6c 61 74  *     $db collat
6f20: 69 6f 6e 5f 6e 65 65 64 65 64 20 53 43 52 49 50  ion_needed SCRIP
6f30: 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 72 65 61  T.  **.  ** Crea
6f40: 74 65 20 61 20 6e 65 77 20 53 51 4c 20 63 6f 6c  te a new SQL col
6f50: 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  lation function 
6f60: 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 57 68  called NAME.  Wh
6f70: 65 6e 65 76 65 72 0a 20 20 2a 2a 20 74 68 61 74  enever.  ** that
6f80: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
6f90: 6c 65 64 2c 20 69 6e 76 6f 6b 65 20 53 43 52 49  led, invoke SCRI
6fa0: 50 54 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  PT to evaluate t
6fb0: 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a  he function..  *
6fc0: 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f 4c 4c  /.  case DB_COLL
6fd0: 41 54 49 4f 4e 5f 4e 45 45 44 45 44 3a 20 7b 0a  ATION_NEEDED: {.
6fe0: 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20      if( objc!=3 
6ff0: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
7000: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
7010: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 43 52 49  , 2, objv, "SCRI
7020: 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  PT");.      retu
7030: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
7040: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 44 62 2d    }.    if( pDb-
7050: 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 20  >pCollateNeeded 
7060: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63  ){.      Tcl_Dec
7070: 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70  rRefCount(pDb->p
7080: 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a  CollateNeeded);.
7090: 20 20 20 20 7d 0a 20 20 20 20 70 44 62 2d 3e 70      }.    pDb->p
70a0: 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 20 3d 20  CollateNeeded = 
70b0: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
70c0: 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 54  (objv[2]);.    T
70d0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
70e0: 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65  pDb->pCollateNee
70f0: 64 65 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ded);.    sqlite
7100: 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64  3_collation_need
7110: 65 64 28 70 44 62 2d 3e 64 62 2c 20 70 44 62 2c  ed(pDb->db, pDb,
7120: 20 74 63 6c 43 6f 6c 6c 61 74 65 4e 65 65 64 65   tclCollateNeede
7130: 64 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  d);.    break;. 
7140: 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20   }..  /*    $db 
7150: 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 20 3f 43 41 4c  commit_hook ?CAL
7160: 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a  LBACK?.  **.  **
7170: 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65   Invoke the give
7180: 6e 20 63 61 6c 6c 62 61 63 6b 20 6a 75 73 74 20  n callback just 
7190: 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e  before committin
71a0: 67 20 65 76 65 72 79 20 53 51 4c 20 74 72 61 6e  g every SQL tran
71b0: 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 49 66  saction..  ** If
71c0: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 74 68   the callback th
71d0: 72 6f 77 73 20 61 6e 20 65 78 63 65 70 74 69 6f  rows an exceptio
71e0: 6e 20 6f 72 20 72 65 74 75 72 6e 73 20 6e 6f 6e  n or returns non
71f0: 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a  -zero, then the.
7200: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
7210: 20 69 73 20 61 62 6f 72 74 65 64 2e 20 20 49 66   is aborted.  If
7220: 20 43 41 4c 4c 42 41 43 4b 20 69 73 20 61 6e 20   CALLBACK is an 
7230: 65 6d 70 74 79 20 73 74 72 69 6e 67 2c 20 74 68  empty string, th
7240: 65 20 63 61 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  e callback.  ** 
7250: 69 73 20 64 69 73 61 62 6c 65 64 2e 0a 20 20 2a  is disabled..  *
7260: 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f 4d 4d  /.  case DB_COMM
7270: 49 54 5f 48 4f 4f 4b 3a 20 7b 0a 20 20 20 20 69  IT_HOOK: {.    i
7280: 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20  f( objc>3 ){.   
7290: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
72a0: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
72b0: 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f  bjv, "?CALLBACK?
72c0: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
72d0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
72e0: 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d  }else if( objc==
72f0: 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  2 ){.      if( p
7300: 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20  Db->zCommit ){. 
7310: 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
7320: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
7330: 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 2c 20 30 29  pDb->zCommit, 0)
7340: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
7350: 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20  lse{.      char 
7360: 2a 7a 43 6f 6d 6d 69 74 3b 0a 20 20 20 20 20 20  *zCommit;.      
7370: 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69  int len;.      i
7380: 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20  f( pDb->zCommit 
7390: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46  ){.        Tcl_F
73a0: 72 65 65 28 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74  ree(pDb->zCommit
73b0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
73c0: 20 7a 43 6f 6d 6d 69 74 20 3d 20 54 63 6c 5f 47   zCommit = Tcl_G
73d0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
73e0: 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a  objv[2], &len);.
73f0: 20 20 20 20 20 20 69 66 28 20 7a 43 6f 6d 6d 69        if( zCommi
7400: 74 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20  t && len>0 ){.  
7410: 20 20 20 20 20 20 70 44 62 2d 3e 7a 43 6f 6d 6d        pDb->zComm
7420: 69 74 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20  it = Tcl_Alloc( 
7430: 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20  len + 1 );.     
7440: 20 20 20 73 74 72 63 70 79 28 70 44 62 2d 3e 7a     strcpy(pDb->z
7450: 43 6f 6d 6d 69 74 2c 20 7a 43 6f 6d 6d 69 74 29  Commit, zCommit)
7460: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
7470: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 43 6f 6d         pDb->zCom
7480: 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  mit = 0;.      }
7490: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
74a0: 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20  zCommit ){.     
74b0: 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d     pDb->interp =
74c0: 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20   interp;.       
74d0: 20 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f   sqlite3_commit_
74e0: 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 20 44 62  hook(pDb->db, Db
74f0: 43 6f 6d 6d 69 74 48 61 6e 64 6c 65 72 2c 20 70  CommitHandler, p
7500: 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Db);.      }else
7510: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
7520: 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 70 44  3_commit_hook(pD
7530: 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  b->db, 0, 0);.  
7540: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
7550: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
7560: 20 20 20 20 24 64 62 20 63 6f 6d 70 6c 65 74 65      $db complete
7570: 20 53 51 4c 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52   SQL.  **.  ** R
7580: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 53 51  eturn TRUE if SQ
7590: 4c 20 69 73 20 61 20 63 6f 6d 70 6c 65 74 65 20  L is a complete 
75a0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  SQL statement.  
75b0: 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 0a  Return FALSE if.
75c0: 20 20 2a 2a 20 61 64 64 69 74 69 6f 6e 61 6c 20    ** additional 
75d0: 6c 69 6e 65 73 20 6f 66 20 69 6e 70 75 74 20 61  lines of input a
75e0: 72 65 20 6e 65 65 64 65 64 2e 20 20 54 68 69 73  re needed.  This
75f0: 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74   is similar to t
7600: 68 65 0a 20 20 2a 2a 20 62 75 69 6c 74 2d 69 6e  he.  ** built-in
7610: 20 22 69 6e 66 6f 20 63 6f 6d 70 6c 65 74 65 22   "info complete"
7620: 20 63 6f 6d 6d 61 6e 64 20 6f 66 20 54 63 6c 2e   command of Tcl.
7630: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
7640: 43 4f 4d 50 4c 45 54 45 3a 20 7b 0a 23 69 66 6e  COMPLETE: {.#ifn
7650: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7660: 43 4f 4d 50 4c 45 54 45 0a 20 20 20 20 54 63 6c  COMPLETE.    Tcl
7670: 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20  _Obj *pResult;. 
7680: 20 20 20 69 6e 74 20 69 73 43 6f 6d 70 6c 65 74     int isComplet
7690: 65 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  e;.    if( objc!
76a0: 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =3 ){.      Tcl_
76b0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
76c0: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53  erp, 2, objv, "S
76d0: 51 4c 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  QL");.      retu
76e0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
76f0: 20 20 7d 0a 20 20 20 20 69 73 43 6f 6d 70 6c 65    }.    isComple
7700: 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6d  te = sqlite3_com
7710: 70 6c 65 74 65 28 20 54 63 6c 5f 47 65 74 53 74  plete( Tcl_GetSt
7720: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
7730: 5b 32 5d 2c 20 30 29 20 29 3b 0a 20 20 20 20 70  [2], 0) );.    p
7740: 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74  Result = Tcl_Get
7750: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
7760: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 42 6f  );.    Tcl_SetBo
7770: 6f 6c 65 61 6e 4f 62 6a 28 70 52 65 73 75 6c 74  oleanObj(pResult
7780: 2c 20 69 73 43 6f 6d 70 6c 65 74 65 29 3b 0a 23  , isComplete);.#
7790: 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b  endif.    break;
77a0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64  .  }..  /*    $d
77b0: 62 20 63 6f 70 79 20 63 6f 6e 66 6c 69 63 74 2d  b copy conflict-
77c0: 61 6c 67 6f 72 69 74 68 6d 20 74 61 62 6c 65 20  algorithm table 
77d0: 66 69 6c 65 6e 61 6d 65 20 3f 53 45 50 41 52 41  filename ?SEPARA
77e0: 54 4f 52 3f 20 3f 4e 55 4c 4c 49 4e 44 49 43 41  TOR? ?NULLINDICA
77f0: 54 4f 52 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43  TOR?.  **.  ** C
7800: 6f 70 79 20 64 61 74 61 20 69 6e 74 6f 20 74 61  opy data into ta
7810: 62 6c 65 20 66 72 6f 6d 20 66 69 6c 65 6e 61 6d  ble from filenam
7820: 65 2c 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 75 73  e, optionally us
7830: 69 6e 67 20 53 45 50 41 52 41 54 4f 52 0a 20 20  ing SEPARATOR.  
7840: 2a 2a 20 61 73 20 63 6f 6c 75 6d 6e 20 73 65 70  ** as column sep
7850: 61 72 61 74 6f 72 73 2e 20 20 49 66 20 61 20 63  arators.  If a c
7860: 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61  olumn contains a
7870: 20 6e 75 6c 6c 20 73 74 72 69 6e 67 2c 20 6f 72   null string, or
7880: 20 74 68 65 0a 20 20 2a 2a 20 76 61 6c 75 65 20   the.  ** value 
7890: 6f 66 20 4e 55 4c 4c 49 4e 44 49 43 41 54 4f 52  of NULLINDICATOR
78a0: 2c 20 61 20 4e 55 4c 4c 20 69 73 20 69 6e 73 65  , a NULL is inse
78b0: 72 74 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6c  rted for the col
78c0: 75 6d 6e 2e 0a 20 20 2a 2a 20 63 6f 6e 66 6c 69  umn..  ** confli
78d0: 63 74 2d 61 6c 67 6f 72 69 74 68 6d 20 69 73 20  ct-algorithm is 
78e0: 6f 6e 65 20 6f 66 20 74 68 65 20 73 71 6c 69 74  one of the sqlit
78f0: 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c 67 6f 72  e conflict algor
7900: 69 74 68 6d 73 3a 0a 20 20 2a 2a 20 20 20 20 72  ithms:.  **    r
7910: 6f 6c 6c 62 61 63 6b 2c 20 61 62 6f 72 74 2c 20  ollback, abort, 
7920: 66 61 69 6c 2c 20 69 67 6e 6f 72 65 2c 20 72 65  fail, ignore, re
7930: 70 6c 61 63 65 0a 20 20 2a 2a 20 4f 6e 20 73 75  place.  ** On su
7940: 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20 74 68  ccess, return th
7950: 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 69 6e 65  e number of line
7960: 73 20 70 72 6f 63 65 73 73 65 64 2c 20 6e 6f 74  s processed, not
7970: 20 6e 65 63 65 73 73 61 72 69 6c 79 20 73 61 6d   necessarily sam
7980: 65 0a 20 20 2a 2a 20 61 73 20 27 64 62 20 63 68  e.  ** as 'db ch
7990: 61 6e 67 65 73 27 20 64 75 65 20 74 6f 20 63 6f  anges' due to co
79a0: 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d  nflict-algorithm
79b0: 20 73 65 6c 65 63 74 65 64 2e 0a 20 20 2a 2a 0a   selected..  **.
79c0: 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 69    ** This code i
79d0: 73 20 62 61 73 69 63 61 6c 6c 79 20 61 6e 20 69  s basically an i
79e0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2f 65 6e  mplementation/en
79f0: 68 61 6e 63 65 6d 65 6e 74 20 6f 66 0a 20 20 2a  hancement of.  *
7a00: 2a 20 74 68 65 20 73 71 6c 69 74 65 33 20 73 68  * the sqlite3 sh
7a10: 65 6c 6c 2e 63 20 22 2e 69 6d 70 6f 72 74 22 20  ell.c ".import" 
7a20: 63 6f 6d 6d 61 6e 64 2e 0a 20 20 2a 2a 0a 20 20  command..  **.  
7a30: 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ** This command 
7a40: 75 73 61 67 65 20 69 73 20 65 71 75 69 76 61 6c  usage is equival
7a50: 65 6e 74 20 74 6f 20 74 68 65 20 73 71 6c 69 74  ent to the sqlit
7a60: 65 32 2e 78 20 43 4f 50 59 20 73 74 61 74 65 6d  e2.x COPY statem
7a70: 65 6e 74 2c 0a 20 20 2a 2a 20 77 68 69 63 68 20  ent,.  ** which 
7a80: 69 6d 70 6f 72 74 73 20 66 69 6c 65 20 64 61 74  imports file dat
7a90: 61 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 75  a into a table u
7aa0: 73 69 6e 67 20 74 68 65 20 50 6f 73 74 67 72 65  sing the Postgre
7ab0: 53 51 4c 20 43 4f 50 59 20 66 69 6c 65 20 66 6f  SQL COPY file fo
7ac0: 72 6d 61 74 3a 0a 20 20 2a 2a 20 20 20 24 64 62  rmat:.  **   $db
7ad0: 20 63 6f 70 79 20 24 63 6f 6e 66 6c 69 74 5f 61   copy $conflit_a
7ae0: 6c 67 6f 20 24 74 61 62 6c 65 5f 6e 61 6d 65 20  lgo $table_name 
7af0: 24 66 69 6c 65 6e 61 6d 65 20 5c 74 20 5c 5c 4e  $filename \t \\N
7b00: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
7b10: 43 4f 50 59 3a 20 7b 0a 20 20 20 20 63 68 61 72  COPY: {.    char
7b20: 20 2a 7a 54 61 62 6c 65 3b 20 20 20 20 20 20 20   *zTable;       
7b30: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72          /* Inser
7b40: 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68 69 73  t data into this
7b50: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 63 68   table */.    ch
7b60: 61 72 20 2a 7a 46 69 6c 65 3b 20 20 20 20 20 20  ar *zFile;      
7b70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
7b80: 20 66 69 6c 65 20 66 72 6f 6d 20 77 68 69 63 68   file from which
7b90: 20 74 6f 20 65 78 74 72 61 63 74 20 64 61 74 61   to extract data
7ba0: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 43   */.    char *zC
7bb0: 6f 6e 66 6c 69 63 74 3b 20 20 20 20 20 20 20 20  onflict;        
7bc0: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 66 6c      /* The confl
7bd0: 69 63 74 20 61 6c 67 6f 72 69 74 68 6d 20 74 6f  ict algorithm to
7be0: 20 75 73 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69   use */.    sqli
7bf0: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
7c00: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 74 61          /* A sta
7c10: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e  tement */.    in
7c20: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
7c30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
7c40: 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 20 20  ult code */.    
7c50: 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20  int nCol;       
7c60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
7c70: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
7c80: 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   in the table */
7c90: 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 20  .    int nByte; 
7ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7cb0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
7cc0: 74 65 73 20 69 6e 20 61 6e 20 53 51 4c 20 73 74  tes in an SQL st
7cd0: 72 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ring */.    int 
7ce0: 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
7cf0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
7d00: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 20 20  counters */.    
7d10: 69 6e 74 20 6e 53 65 70 3b 20 20 20 20 20 20 20  int nSep;       
7d20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
7d30: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
7d40: 6e 20 7a 53 65 70 5b 5d 20 2a 2f 0a 20 20 20 20  n zSep[] */.    
7d50: 69 6e 74 20 6e 4e 75 6c 6c 3b 20 20 20 20 20 20  int nNull;      
7d60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
7d70: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
7d80: 6e 20 7a 4e 75 6c 6c 5b 5d 20 2a 2f 0a 20 20 20  n zNull[] */.   
7d90: 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20   char *zSql;    
7da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7db0: 41 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  An SQL statement
7dc0: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4c   */.    char *zL
7dd0: 69 6e 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ine;            
7de0: 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
7df0: 6c 69 6e 65 20 6f 66 20 69 6e 70 75 74 20 66 72  line of input fr
7e00: 6f 6d 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20  om the file */. 
7e10: 20 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 3b     char **azCol;
7e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7e30: 2a 20 7a 4c 69 6e 65 5b 5d 20 62 72 6f 6b 65 6e  * zLine[] broken
7e40: 20 75 70 20 69 6e 74 6f 20 63 6f 6c 75 6d 6e 73   up into columns
7e50: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 43   */.    char *zC
7e60: 6f 6d 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20  ommit;          
7e70: 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 63 6f      /* How to co
7e80: 6d 6d 69 74 20 63 68 61 6e 67 65 73 20 2a 2f 0a  mmit changes */.
7e90: 20 20 20 20 46 49 4c 45 20 2a 69 6e 3b 20 20 20      FILE *in;   
7ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7eb0: 2f 2a 20 54 68 65 20 69 6e 70 75 74 20 66 69 6c  /* The input fil
7ec0: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 69 6e  e */.    int lin
7ed0: 65 6e 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20  eno = 0;        
7ee0: 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d       /* Line num
7ef0: 62 65 72 20 6f 66 20 69 6e 70 75 74 20 66 69 6c  ber of input fil
7f00: 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 7a 4c  e */.    char zL
7f10: 69 6e 65 4e 75 6d 5b 38 30 5d 3b 20 20 20 20 20  ineNum[80];     
7f20: 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d       /* Line num
7f30: 62 65 72 20 70 72 69 6e 74 20 62 75 66 66 65 72  ber print buffer
7f40: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20   */.    Tcl_Obj 
7f50: 2a 70 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20  *pResult;       
7f60: 20 20 20 20 2f 2a 20 69 6e 74 65 72 70 20 72 65      /* interp re
7f70: 73 75 6c 74 20 2a 2f 0a 0a 20 20 20 20 63 68 61  sult */..    cha
7f80: 72 20 2a 7a 53 65 70 3b 0a 20 20 20 20 63 68 61  r *zSep;.    cha
7f90: 72 20 2a 7a 4e 75 6c 6c 3b 0a 20 20 20 20 69 66  r *zNull;.    if
7fa0: 28 20 6f 62 6a 63 3c 35 20 7c 7c 20 6f 62 6a 63  ( objc<5 || objc
7fb0: 3e 37 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  >7 ){.      Tcl_
7fc0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
7fd0: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 0a 20  erp, 2, objv, . 
7fe0: 20 20 20 20 20 20 20 20 22 43 4f 4e 46 4c 49 43          "CONFLIC
7ff0: 54 2d 41 4c 47 4f 52 49 54 48 4d 20 54 41 42 4c  T-ALGORITHM TABL
8000: 45 20 46 49 4c 45 4e 41 4d 45 20 3f 53 45 50 41  E FILENAME ?SEPA
8010: 52 41 54 4f 52 3f 20 3f 4e 55 4c 4c 49 4e 44 49  RATOR? ?NULLINDI
8020: 43 41 54 4f 52 3f 22 29 3b 0a 20 20 20 20 20 20  CATOR?");.      
8030: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
8040: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
8050: 6f 62 6a 63 3e 3d 36 20 29 7b 0a 20 20 20 20 20  objc>=6 ){.     
8060: 20 7a 53 65 70 20 3d 20 54 63 6c 5f 47 65 74 53   zSep = Tcl_GetS
8070: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
8080: 76 5b 35 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 65  v[5], 0);.    }e
8090: 6c 73 65 7b 0a 20 20 20 20 20 20 7a 53 65 70 20  lse{.      zSep 
80a0: 3d 20 22 5c 74 22 3b 0a 20 20 20 20 7d 0a 20 20  = "\t";.    }.  
80b0: 20 20 69 66 28 20 6f 62 6a 63 3e 3d 37 20 29 7b    if( objc>=7 ){
80c0: 0a 20 20 20 20 20 20 7a 4e 75 6c 6c 20 3d 20 54  .      zNull = T
80d0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
80e0: 4f 62 6a 28 6f 62 6a 76 5b 36 5d 2c 20 30 29 3b  Obj(objv[6], 0);
80f0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8100: 20 20 7a 4e 75 6c 6c 20 3d 20 22 22 3b 0a 20 20    zNull = "";.  
8110: 20 20 7d 0a 20 20 20 20 7a 43 6f 6e 66 6c 69 63    }.    zConflic
8120: 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  t = Tcl_GetStrin
8130: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
8140: 2c 20 30 29 3b 0a 20 20 20 20 7a 54 61 62 6c 65  , 0);.    zTable
8150: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
8160: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c  FromObj(objv[3],
8170: 20 30 29 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d   0);.    zFile =
8180: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
8190: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 34 5d 2c 20 30  omObj(objv[4], 0
81a0: 29 3b 0a 20 20 20 20 6e 53 65 70 20 3d 20 73 74  );.    nSep = st
81b0: 72 6c 65 6e 28 7a 53 65 70 29 3b 0a 20 20 20 20  rlen(zSep);.    
81c0: 6e 4e 75 6c 6c 20 3d 20 73 74 72 6c 65 6e 28 7a  nNull = strlen(z
81d0: 4e 75 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 6e  Null);.    if( n
81e0: 53 65 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Sep==0 ){.      
81f0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
8200: 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a  (interp, "Error:
8210: 20 6e 6f 6e 2d 6e 75 6c 6c 20 73 65 70 61 72 61   non-null separa
8220: 74 6f 72 20 72 65 71 75 69 72 65 64 20 66 6f 72  tor required for
8230: 20 63 6f 70 79 22 2c 20 30 29 3b 0a 20 20 20 20   copy", 0);.    
8240: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
8250: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OR;.    }.    if
8260: 28 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  (sqlite3StrICmp(
8270: 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 72 6f 6c 6c  zConflict, "roll
8280: 62 61 63 6b 22 29 20 21 3d 20 30 20 26 26 0a 20  back") != 0 &&. 
8290: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72        sqlite3Str
82a0: 49 43 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20  ICmp(zConflict, 
82b0: 22 61 62 6f 72 74 22 20 20 20 29 20 21 3d 20 30  "abort"   ) != 0
82c0: 20 26 26 0a 20 20 20 20 20 20 20 73 71 6c 69 74   &&.       sqlit
82d0: 65 33 53 74 72 49 43 6d 70 28 7a 43 6f 6e 66 6c  e3StrICmp(zConfl
82e0: 69 63 74 2c 20 22 66 61 69 6c 22 20 20 20 20 29  ict, "fail"    )
82f0: 20 21 3d 20 30 20 26 26 0a 20 20 20 20 20 20 20   != 0 &&.       
8300: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
8310: 43 6f 6e 66 6c 69 63 74 2c 20 22 69 67 6e 6f 72  Conflict, "ignor
8320: 65 22 20 20 29 20 21 3d 20 30 20 26 26 0a 20 20  e"  ) != 0 &&.  
8330: 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 49       sqlite3StrI
8340: 43 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22  Cmp(zConflict, "
8350: 72 65 70 6c 61 63 65 22 20 29 20 21 3d 20 30 20  replace" ) != 0 
8360: 29 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  ) {.      Tcl_Ap
8370: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
8380: 70 2c 20 22 45 72 72 6f 72 3a 20 5c 22 22 2c 20  p, "Error: \"", 
8390: 7a 43 6f 6e 66 6c 69 63 74 2c 20 0a 20 20 20 20  zConflict, .    
83a0: 20 20 20 20 20 20 20 20 22 5c 22 2c 20 63 6f 6e          "\", con
83b0: 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d 20  flict-algorithm 
83c0: 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 3a 20  must be one of: 
83d0: 72 6f 6c 6c 62 61 63 6b 2c 20 22 0a 20 20 20 20  rollback, ".    
83e0: 20 20 20 20 20 20 20 20 22 61 62 6f 72 74 2c 20          "abort, 
83f0: 66 61 69 6c 2c 20 69 67 6e 6f 72 65 2c 20 6f 72  fail, ignore, or
8400: 20 72 65 70 6c 61 63 65 22 2c 20 30 29 3b 0a 20   replace", 0);. 
8410: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
8420: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
8430: 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
8440: 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20  mprintf("SELECT 
8450: 2a 20 46 52 4f 4d 20 27 25 71 27 22 2c 20 7a 54  * FROM '%q'", zT
8460: 61 62 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 7a  able);.    if( z
8470: 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Sql==0 ){.      
8480: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
8490: 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a  (interp, "Error:
84a0: 20 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20   no such table: 
84b0: 22 2c 20 7a 54 61 62 6c 65 2c 20 30 29 3b 0a 20  ", zTable, 0);. 
84c0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
84d0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
84e0: 20 6e 42 79 74 65 20 3d 20 73 74 72 6c 65 6e 28   nByte = strlen(
84f0: 7a 53 71 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20  zSql);.    rc = 
8500: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28  sqlite3_prepare(
8510: 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 30  pDb->db, zSql, 0
8520: 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
8530: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
8540: 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Sql);.    if( rc
8550: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
8560: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
8570: 70 2c 20 22 45 72 72 6f 72 3a 20 22 2c 20 73 71  p, "Error: ", sq
8580: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62  lite3_errmsg(pDb
8590: 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 20  ->db), 0);.     
85a0: 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7d   nCol = 0;.    }
85b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 43 6f 6c  else{.      nCol
85c0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
85d0: 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a  n_count(pStmt);.
85e0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
85f0: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
8600: 29 3b 0a 20 20 20 20 69 66 28 20 6e 43 6f 6c 3d  );.    if( nCol=
8610: 3d 30 20 29 20 7b 0a 20 20 20 20 20 20 72 65 74  =0 ) {.      ret
8620: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
8630: 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d 20     }.    zSql = 
8640: 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 2b 20  malloc( nByte + 
8650: 35 30 20 2b 20 6e 43 6f 6c 2a 32 20 29 3b 0a 20  50 + nCol*2 );. 
8660: 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29     if( zSql==0 )
8670: 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70   {.      Tcl_App
8680: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
8690: 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 27 74 20  , "Error: can't 
86a0: 6d 61 6c 6c 6f 63 28 29 22 2c 20 30 29 3b 0a 20  malloc()", 0);. 
86b0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
86c0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
86d0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
86e0: 66 28 6e 42 79 74 65 2b 35 30 2c 20 7a 53 71 6c  f(nByte+50, zSql
86f0: 2c 20 22 49 4e 53 45 52 54 20 4f 52 20 25 71 20  , "INSERT OR %q 
8700: 49 4e 54 4f 20 27 25 71 27 20 56 41 4c 55 45 53  INTO '%q' VALUES
8710: 28 3f 22 2c 0a 20 20 20 20 20 20 20 20 20 7a 43  (?",.         zC
8720: 6f 6e 66 6c 69 63 74 2c 20 7a 54 61 62 6c 65 29  onflict, zTable)
8730: 3b 0a 20 20 20 20 6a 20 3d 20 73 74 72 6c 65 6e  ;.    j = strlen
8740: 28 7a 53 71 6c 29 3b 0a 20 20 20 20 66 6f 72 28  (zSql);.    for(
8750: 69 3d 31 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=1; i<nCol; i++
8760: 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b  ){.      zSql[j+
8770: 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20  +] = ',';.      
8780: 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 3f 27 3b  zSql[j++] = '?';
8790: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 5b  .    }.    zSql[
87a0: 6a 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20  j++] = ')';.    
87b0: 7a 53 71 6c 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20  zSql[j] = 0;.   
87c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
87d0: 65 70 61 72 65 28 70 44 62 2d 3e 64 62 2c 20 7a  epare(pDb->db, z
87e0: 53 71 6c 2c 20 30 2c 20 26 70 53 74 6d 74 2c 20  Sql, 0, &pStmt, 
87f0: 30 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 53 71  0);.    free(zSq
8800: 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  l);.    if( rc )
8810: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
8820: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
8830: 20 22 45 72 72 6f 72 3a 20 22 2c 20 73 71 6c 69   "Error: ", sqli
8840: 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e  te3_errmsg(pDb->
8850: 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  db), 0);.      s
8860: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
8870: 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 65  pStmt);.      re
8880: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
8890: 20 20 20 20 7d 0a 20 20 20 20 69 6e 20 3d 20 66      }.    in = f
88a0: 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 22 72 62 22  open(zFile, "rb"
88b0: 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 3d 3d 30  );.    if( in==0
88c0: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
88d0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
88e0: 70 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f  p, "Error: canno
88f0: 74 20 6f 70 65 6e 20 66 69 6c 65 3a 20 22 2c 20  t open file: ", 
8900: 7a 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 20 20  zFile, NULL);.  
8910: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
8920: 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
8930: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
8940: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  ROR;.    }.    a
8950: 7a 43 6f 6c 20 3d 20 6d 61 6c 6c 6f 63 28 20 73  zCol = malloc( s
8960: 69 7a 65 6f 66 28 61 7a 43 6f 6c 5b 30 5d 29 2a  izeof(azCol[0])*
8970: 28 6e 43 6f 6c 2b 31 29 20 29 3b 0a 20 20 20 20  (nCol+1) );.    
8980: 69 66 28 20 61 7a 43 6f 6c 3d 3d 30 20 29 20 7b  if( azCol==0 ) {
8990: 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
89a0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
89b0: 22 45 72 72 6f 72 3a 20 63 61 6e 27 74 20 6d 61  "Error: can't ma
89c0: 6c 6c 6f 63 28 29 22 2c 20 30 29 3b 0a 20 20 20  lloc()", 0);.   
89d0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
89e0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ROR;.    }.    s
89f0: 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d  qlite3_exec(pDb-
8a00: 3e 64 62 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c  >db, "BEGIN", 0,
8a10: 20 30 2c 20 30 29 3b 0a 20 20 20 20 7a 43 6f 6d   0, 0);.    zCom
8a20: 6d 69 74 20 3d 20 22 43 4f 4d 4d 49 54 22 3b 0a  mit = "COMMIT";.
8a30: 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4c 69 6e      while( (zLin
8a40: 65 20 3d 20 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e  e = local_getlin
8a50: 65 28 30 2c 20 69 6e 29 29 21 3d 30 20 29 7b 0a  e(0, in))!=0 ){.
8a60: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20        char *z;. 
8a70: 20 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 20 20       i = 0;.    
8a80: 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20    lineno++;.    
8a90: 20 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20 7a 4c 69    azCol[0] = zLi
8aa0: 6e 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ne;.      for(i=
8ab0: 30 2c 20 7a 3d 7a 4c 69 6e 65 3b 20 2a 7a 3b 20  0, z=zLine; *z; 
8ac0: 7a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  z++){.        if
8ad0: 28 20 2a 7a 3d 3d 7a 53 65 70 5b 30 5d 20 26 26  ( *z==zSep[0] &&
8ae0: 20 73 74 72 6e 63 6d 70 28 7a 2c 20 7a 53 65 70   strncmp(z, zSep
8af0: 2c 20 6e 53 65 70 29 3d 3d 30 20 29 7b 0a 20 20  , nSep)==0 ){.  
8b00: 20 20 20 20 20 20 20 20 2a 7a 20 3d 20 30 3b 0a          *z = 0;.
8b10: 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20            i++;. 
8b20: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e           if( i<n
8b30: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Col ){.         
8b40: 20 20 20 61 7a 43 6f 6c 5b 69 5d 20 3d 20 26 7a     azCol[i] = &z
8b50: 5b 6e 53 65 70 5d 3b 0a 20 20 20 20 20 20 20 20  [nSep];.        
8b60: 20 20 20 20 7a 20 2b 3d 20 6e 53 65 70 2d 31 3b      z += nSep-1;
8b70: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
8b80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
8b90: 20 20 20 20 20 69 66 28 20 69 2b 31 21 3d 6e 43       if( i+1!=nC
8ba0: 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  ol ){.        ch
8bb0: 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20 20 20  ar *zErr;.      
8bc0: 20 20 7a 45 72 72 20 3d 20 6d 61 6c 6c 6f 63 28    zErr = malloc(
8bd0: 32 30 30 20 2b 20 73 74 72 6c 65 6e 28 7a 46 69  200 + strlen(zFi
8be0: 6c 65 29 29 3b 0a 20 20 20 20 20 20 20 20 73 70  le));.        sp
8bf0: 72 69 6e 74 66 28 7a 45 72 72 2c 22 45 72 72 6f  rintf(zErr,"Erro
8c00: 72 3a 20 25 73 20 6c 69 6e 65 20 25 64 3a 20 65  r: %s line %d: e
8c10: 78 70 65 63 74 65 64 20 25 64 20 63 6f 6c 75 6d  xpected %d colum
8c20: 6e 73 20 6f 66 20 64 61 74 61 20 62 75 74 20 66  ns of data but f
8c30: 6f 75 6e 64 20 25 64 22 2c 0a 20 20 20 20 20 20  ound %d",.      
8c40: 20 20 20 20 20 7a 46 69 6c 65 2c 20 6c 69 6e 65       zFile, line
8c50: 6e 6f 2c 20 6e 43 6f 6c 2c 20 69 2b 31 29 3b 0a  no, nCol, i+1);.
8c60: 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65          Tcl_Appe
8c70: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
8c80: 20 7a 45 72 72 2c 20 30 29 3b 0a 20 20 20 20 20   zErr, 0);.     
8c90: 20 20 20 66 72 65 65 28 7a 45 72 72 29 3b 0a 20     free(zErr);. 
8ca0: 20 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d         zCommit =
8cb0: 20 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20   "ROLLBACK";.   
8cc0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8cd0: 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d    }.      for(i=
8ce0: 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
8cf0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 63 68 65 63  .        /* chec
8d00: 6b 20 66 6f 72 20 6e 75 6c 6c 20 64 61 74 61 2c  k for null data,
8d10: 20 69 66 20 73 6f 2c 20 62 69 6e 64 20 61 73 20   if so, bind as 
8d20: 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20  null */.        
8d30: 69 66 20 28 28 6e 4e 75 6c 6c 3e 30 20 26 26 20  if ((nNull>0 && 
8d40: 73 74 72 63 6d 70 28 61 7a 43 6f 6c 5b 69 5d 2c  strcmp(azCol[i],
8d50: 20 7a 4e 75 6c 6c 29 3d 3d 30 29 20 7c 7c 20 73   zNull)==0) || s
8d60: 74 72 6c 65 6e 28 61 7a 43 6f 6c 5b 69 5d 29 3d  trlen(azCol[i])=
8d70: 3d 30 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  =0) {.          
8d80: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c  sqlite3_bind_nul
8d90: 6c 28 70 53 74 6d 74 2c 20 69 2b 31 29 3b 0a 20  l(pStmt, i+1);. 
8da0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
8db0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
8dc0: 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c  bind_text(pStmt,
8dd0: 20 69 2b 31 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 20   i+1, azCol[i], 
8de0: 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  -1, SQLITE_STATI
8df0: 43 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  C);.        }.  
8e00: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
8e10: 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b  te3_step(pStmt);
8e20: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
8e30: 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29  te3_reset(pStmt)
8e40: 3b 0a 20 20 20 20 20 20 66 72 65 65 28 7a 4c 69  ;.      free(zLi
8e50: 6e 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ne);.      if( r
8e60: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
8e70: 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65          Tcl_Appe
8e80: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
8e90: 22 45 72 72 6f 72 3a 20 22 2c 20 73 71 6c 69 74  "Error: ", sqlit
8ea0: 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64  e3_errmsg(pDb->d
8eb0: 62 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  b), 0);.        
8ec0: 7a 43 6f 6d 6d 69 74 20 3d 20 22 52 4f 4c 4c 42  zCommit = "ROLLB
8ed0: 41 43 4b 22 3b 0a 20 20 20 20 20 20 20 20 62 72  ACK";.        br
8ee0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
8ef0: 20 7d 0a 20 20 20 20 66 72 65 65 28 61 7a 43 6f   }.    free(azCo
8f00: 6c 29 3b 0a 20 20 20 20 66 63 6c 6f 73 65 28 69  l);.    fclose(i
8f10: 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  n);.    sqlite3_
8f20: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
8f30: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65  .    sqlite3_exe
8f40: 63 28 70 44 62 2d 3e 64 62 2c 20 7a 43 6f 6d 6d  c(pDb->db, zComm
8f50: 69 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 0a 20  it, 0, 0, 0);.. 
8f60: 20 20 20 69 66 28 20 7a 43 6f 6d 6d 69 74 5b 30     if( zCommit[0
8f70: 5d 20 3d 3d 20 27 43 27 20 29 7b 0a 20 20 20 20  ] == 'C' ){.    
8f80: 20 20 2f 2a 20 73 75 63 63 65 73 73 2c 20 73 65    /* success, se
8f90: 74 20 72 65 73 75 6c 74 20 61 73 20 6e 75 6d 62  t result as numb
8fa0: 65 72 20 6f 66 20 6c 69 6e 65 73 20 70 72 6f 63  er of lines proc
8fb0: 65 73 73 65 64 20 2a 2f 0a 20 20 20 20 20 20 70  essed */.      p
8fc0: 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74  Result = Tcl_Get
8fd0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
8fe0: 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  );.      Tcl_Set
8ff0: 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20  IntObj(pResult, 
9000: 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20 72  lineno);.      r
9010: 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20  c = TCL_OK;.    
9020: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
9030: 66 61 69 6c 75 72 65 2c 20 61 70 70 65 6e 64 20  failure, append 
9040: 6c 69 6e 65 6e 6f 20 77 68 65 72 65 20 66 61 69  lineno where fai
9050: 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 73 70 72  led */.      spr
9060: 69 6e 74 66 28 7a 4c 69 6e 65 4e 75 6d 2c 22 25  intf(zLineNum,"%
9070: 64 22 2c 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20  d",lineno);.    
9080: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
9090: 6c 74 28 69 6e 74 65 72 70 2c 22 2c 20 66 61 69  lt(interp,", fai
90a0: 6c 65 64 20 77 68 69 6c 65 20 70 72 6f 63 65 73  led while proces
90b0: 73 69 6e 67 20 6c 69 6e 65 3a 20 22 2c 7a 4c 69  sing line: ",zLi
90c0: 6e 65 4e 75 6d 2c 30 29 3b 0a 20 20 20 20 20 20  neNum,0);.      
90d0: 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  rc = TCL_ERROR;.
90e0: 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
90f0: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
9100: 20 20 20 24 64 62 20 65 72 72 6f 72 63 6f 64 65     $db errorcode
9110: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72  .  **.  ** Retur
9120: 6e 20 74 68 65 20 6e 75 6d 65 72 69 63 20 65 72  n the numeric er
9130: 72 6f 72 20 63 6f 64 65 20 74 68 61 74 20 77 61  ror code that wa
9140: 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  s returned by th
9150: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 20 20  e most recent.  
9160: 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  ** call to sqlit
9170: 65 33 5f 65 78 65 63 28 29 2e 0a 20 20 2a 2f 0a  e3_exec()..  */.
9180: 20 20 63 61 73 65 20 44 42 5f 45 52 52 4f 52 43    case DB_ERRORC
9190: 4f 44 45 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 53  ODE: {.    Tcl_S
91a0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
91b0: 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
91c0: 6a 28 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  j(sqlite3_errcod
91d0: 65 28 70 44 62 2d 3e 64 62 29 29 29 3b 0a 20 20  e(pDb->db)));.  
91e0: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 20    break;.  }.   
91f0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64  .  /*.  **    $d
9200: 62 20 65 76 61 6c 20 24 73 71 6c 20 3f 61 72 72  b eval $sql ?arr
9210: 61 79 3f 20 3f 7b 20 20 2e 2e 2e 63 6f 64 65 2e  ay? ?{  ...code.
9220: 2e 2e 20 7d 3f 0a 20 20 2a 2a 20 20 20 20 24 64  .. }?.  **    $d
9230: 62 20 6f 6e 65 63 6f 6c 75 6d 6e 20 24 73 71 6c  b onecolumn $sql
9240: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 53  .  **.  ** The S
9250: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  QL statement in 
9260: 24 73 71 6c 20 69 73 20 65 76 61 6c 75 61 74 65  $sql is evaluate
9270: 64 2e 20 20 46 6f 72 20 65 61 63 68 20 72 6f 77  d.  For each row
9280: 2c 20 74 68 65 20 76 61 6c 75 65 73 20 61 72 65  , the values are
9290: 0a 20 20 2a 2a 20 70 6c 61 63 65 64 20 69 6e 20  .  ** placed in 
92a0: 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  elements of the 
92b0: 61 72 72 61 79 20 6e 61 6d 65 64 20 22 61 72 72  array named "arr
92c0: 61 79 22 20 61 6e 64 20 2e 2e 2e 63 6f 64 65 2e  ay" and ...code.
92d0: 2e 2e 20 69 73 20 65 78 65 63 75 74 65 64 2e 0a  .. is executed..
92e0: 20 20 2a 2a 20 49 66 20 22 61 72 72 61 79 22 20    ** If "array" 
92f0: 61 6e 64 20 22 63 6f 64 65 22 20 61 72 65 20 6f  and "code" are o
9300: 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 6e 6f 20  mitted, then no 
9310: 63 61 6c 6c 62 61 63 6b 20 69 73 20 65 76 65 72  callback is ever
9320: 79 20 69 6e 76 6f 6b 65 64 2e 0a 20 20 2a 2a 20  y invoked..  ** 
9330: 49 66 20 22 61 72 72 61 79 22 20 69 73 20 61 6e  If "array" is an
9340: 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c 20 74   empty string, t
9350: 68 65 6e 20 74 68 65 20 76 61 6c 75 65 73 20 61  hen the values a
9360: 72 65 20 70 6c 61 63 65 64 20 69 6e 20 76 61 72  re placed in var
9370: 69 61 62 6c 65 73 0a 20 20 2a 2a 20 74 68 61 74  iables.  ** that
9380: 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e   have the same n
9390: 61 6d 65 20 61 73 20 74 68 65 20 66 69 65 6c 64  ame as the field
93a0: 73 20 65 78 74 72 61 63 74 65 64 20 62 79 20 74  s extracted by t
93b0: 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20  he query..  **. 
93c0: 20 2a 2a 20 54 68 65 20 6f 6e 65 63 6f 6c 75 6d   ** The onecolum
93d0: 6e 20 6d 65 74 68 6f 64 20 69 73 20 74 68 65 20  n method is the 
93e0: 65 71 75 69 76 61 6c 65 6e 74 20 6f 66 3a 0a 20  equivalent of:. 
93f0: 20 2a 2a 20 20 20 20 20 6c 69 6e 64 65 78 20 5b   **     lindex [
9400: 24 64 62 20 65 76 61 6c 20 24 73 71 6c 5d 20 30  $db eval $sql] 0
9410: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
9420: 4f 4e 45 43 4f 4c 55 4d 4e 3a 0a 20 20 63 61 73  ONECOLUMN:.  cas
9430: 65 20 44 42 5f 45 56 41 4c 3a 0a 20 20 63 61 73  e DB_EVAL:.  cas
9440: 65 20 44 42 5f 45 58 49 53 54 53 3a 20 7b 0a 20  e DB_EXISTS: {. 
9450: 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a     char const *z
9460: 53 71 6c 3b 20 20 20 20 20 20 2f 2a 20 4e 65 78  Sql;      /* Nex
9470: 74 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  t SQL statement 
9480: 74 6f 20 65 78 65 63 75 74 65 20 2a 2f 0a 20 20  to execute */.  
9490: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4c    char const *zL
94a0: 65 66 74 3b 20 20 20 20 20 2f 2a 20 57 68 61 74  eft;     /* What
94b0: 20 69 73 20 6c 65 66 74 20 61 66 74 65 72 20 66   is left after f
94c0: 69 72 73 74 20 73 74 6d 74 20 69 6e 20 7a 53 71  irst stmt in zSq
94d0: 6c 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  l */.    sqlite3
94e0: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20  _stmt *pStmt;   
94f0: 2f 2a 20 43 6f 6d 70 69 6c 65 64 20 53 51 4c 20  /* Compiled SQL 
9500: 73 74 61 74 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  statment */.    
9510: 54 63 6c 5f 4f 62 6a 20 2a 70 41 72 72 61 79 3b  Tcl_Obj *pArray;
9520: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
9530: 66 20 61 72 72 61 79 20 69 6e 74 6f 20 77 68 69  f array into whi
9540: 63 68 20 72 65 73 75 6c 74 73 20 61 72 65 20 77  ch results are w
9550: 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 54 63  ritten */.    Tc
9560: 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 20  l_Obj *pScript; 
9570: 20 20 20 20 20 2f 2a 20 53 63 72 69 70 74 20 74       /* Script t
9580: 6f 20 72 75 6e 20 66 6f 72 20 65 61 63 68 20 72  o run for each r
9590: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20  esult set */.   
95a0: 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 50 61 72   Tcl_Obj **apPar
95b0: 6d 3b 20 20 20 20 20 20 2f 2a 20 50 61 72 61 6d  m;      /* Param
95c0: 65 74 65 72 73 20 74 68 61 74 20 6e 65 65 64 20  eters that need 
95d0: 61 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75  a Tcl_DecrRefCou
95e0: 6e 74 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20  nt() */.    int 
95f0: 6e 50 61 72 6d 3b 20 20 20 20 20 20 20 20 20 20  nParm;          
9600: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
9610: 65 6e 74 72 69 65 73 20 75 73 65 64 20 69 6e 20  entries used in 
9620: 61 70 50 61 72 6d 5b 5d 20 2a 2f 0a 20 20 20 20  apParm[] */.    
9630: 54 63 6c 5f 4f 62 6a 20 2a 61 50 61 72 6d 5b 31  Tcl_Obj *aParm[1
9640: 30 5d 3b 20 20 20 20 2f 2a 20 53 74 61 74 69 63  0];    /* Static
9650: 20 73 70 61 63 65 20 66 6f 72 20 61 70 50 61 72   space for apPar
9660: 6d 5b 5d 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f  m[] in the commo
9670: 6e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 54 63  n case */.    Tc
9680: 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 20 20 20 20  l_Obj *pRet;    
9690: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f       /* Value to
96a0: 20 62 65 20 72 65 74 75 72 6e 65 64 20 2a 2f 0a   be returned */.
96b0: 20 20 20 20 53 71 6c 50 72 65 70 61 72 65 64 53      SqlPreparedS
96c0: 74 6d 74 20 2a 70 50 72 65 53 74 6d 74 3b 20 20  tmt *pPreStmt;  
96d0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20  /* Pointer to a 
96e0: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
96f0: 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63  nt */.    int rc
9700: 32 3b 0a 0a 20 20 20 20 69 66 28 20 63 68 6f 69  2;..    if( choi
9710: 63 65 3d 3d 44 42 5f 45 56 41 4c 20 29 7b 0a 20  ce==DB_EVAL ){. 
9720: 20 20 20 20 20 69 66 28 20 6f 62 6a 63 3c 33 20       if( objc<3 
9730: 7c 7c 20 6f 62 6a 63 3e 35 20 29 7b 0a 20 20 20  || objc>5 ){.   
9740: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
9750: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
9760: 20 6f 62 6a 76 2c 20 22 53 51 4c 20 3f 41 52 52   objv, "SQL ?ARR
9770: 41 59 2d 4e 41 4d 45 3f 20 3f 53 43 52 49 50 54  AY-NAME? ?SCRIPT
9780: 3f 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ?");.        ret
9790: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
97a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 52 65       }.      pRe
97b0: 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29  t = Tcl_NewObj()
97c0: 3b 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72  ;.      Tcl_Incr
97d0: 52 65 66 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a  RefCount(pRet);.
97e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
97f0: 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
9800: 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e          Tcl_Wron
9810: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
9820: 20 32 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 22 29   2, objv, "SQL")
9830: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
9840: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
9850: 20 20 7d 0a 20 20 20 20 20 20 70 52 65 74 20 3d    }.      pRet =
9860: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 63 68   0;.      if( ch
9870: 6f 69 63 65 3d 3d 44 42 5f 45 58 49 53 54 53 20  oice==DB_EXISTS 
9880: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 53  ){.        Tcl_S
9890: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
98a0: 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65  rp, Tcl_NewBoole
98b0: 61 6e 4f 62 6a 28 30 29 29 3b 0a 20 20 20 20 20  anObj(0));.     
98c0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
98d0: 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20   objc==3 ){.    
98e0: 20 20 70 41 72 72 61 79 20 3d 20 70 53 63 72 69    pArray = pScri
98f0: 70 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  pt = 0;.    }els
9900: 65 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b  e if( objc==4 ){
9910: 0a 20 20 20 20 20 20 70 41 72 72 61 79 20 3d 20  .      pArray = 
9920: 30 3b 0a 20 20 20 20 20 20 70 53 63 72 69 70 74  0;.      pScript
9930: 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20 20   = objv[3];.    
9940: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 41 72  }else{.      pAr
9950: 72 61 79 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20  ray = objv[3];. 
9960: 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74       if( Tcl_Get
9970: 53 74 72 69 6e 67 28 70 41 72 72 61 79 29 5b 30  String(pArray)[0
9980: 5d 3d 3d 30 20 29 20 70 41 72 72 61 79 20 3d 20  ]==0 ) pArray = 
9990: 30 3b 0a 20 20 20 20 20 20 70 53 63 72 69 70 74  0;.      pScript
99a0: 20 3d 20 6f 62 6a 76 5b 34 5d 3b 0a 20 20 20 20   = objv[4];.    
99b0: 7d 0a 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  }..    Tcl_IncrR
99c0: 65 66 43 6f 75 6e 74 28 6f 62 6a 76 5b 32 5d 29  efCount(objv[2])
99d0: 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 54 63 6c  ;.    zSql = Tcl
99e0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
99f0: 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20  j(objv[2], 0);. 
9a00: 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 54 43     while( rc==TC
9a10: 4c 5f 4f 4b 20 26 26 20 7a 53 71 6c 5b 30 5d 20  L_OK && zSql[0] 
9a20: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20  ){.      int i; 
9a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a40: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
9a50: 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ter */.      int
9a60: 20 6e 56 61 72 3b 20 20 20 20 20 20 20 20 20 20   nVar;          
9a70: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
9a80: 72 20 6f 66 20 62 69 6e 64 20 70 61 72 61 6d 65  r of bind parame
9a90: 74 65 72 73 20 69 6e 20 74 68 65 20 70 53 74 6d  ters in the pStm
9aa0: 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  t */.      int n
9ab0: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
9ac0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
9ad0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
9ae0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
9af0: 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a        Tcl_Obj **
9b00: 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 30 3b 20 20  apColName = 0;  
9b10: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 6f 6c   /* Array of col
9b20: 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 20  umn names */.   
9b30: 20 20 20 69 6e 74 20 6c 65 6e 3b 20 20 20 20 20     int len;     
9b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9b50: 20 53 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 6f   String length o
9b60: 66 20 7a 53 71 6c 20 2a 2f 0a 20 20 0a 20 20 20  f zSql */.  .   
9b70: 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e     /* Try to fin
9b80: 64 20 61 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  d a SQL statemen
9b90: 74 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61  t that has alrea
9ba0: 64 79 20 62 65 65 6e 20 63 6f 6d 70 69 6c 65 64  dy been compiled
9bb0: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 77 68   and.      ** wh
9bc0: 69 63 68 20 6d 61 74 63 68 65 73 20 74 68 65 20  ich matches the 
9bd0: 6e 65 78 74 20 73 65 71 75 65 6e 63 65 20 6f 66  next sequence of
9be0: 20 53 51 4c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20   SQL..      */. 
9bf0: 20 20 20 20 20 70 53 74 6d 74 20 3d 20 30 3b 0a       pStmt = 0;.
9c00: 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 20 3d        pPreStmt =
9c10: 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 3b 0a   pDb->stmtList;.
9c20: 20 20 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c        len = strl
9c30: 65 6e 28 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20  en(zSql);.      
9c40: 69 66 28 20 70 50 72 65 53 74 6d 74 20 26 26 20  if( pPreStmt && 
9c50: 73 71 6c 69 74 65 33 5f 65 78 70 69 72 65 64 28  sqlite3_expired(
9c60: 70 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74 29  pPreStmt->pStmt)
9c70: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 75 73   ){.        flus
9c80: 68 53 74 6d 74 43 61 63 68 65 28 70 44 62 29 3b  hStmtCache(pDb);
9c90: 0a 20 20 20 20 20 20 20 20 70 50 72 65 53 74 6d  .        pPreStm
9ca0: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 0;.      }. 
9cb0: 20 20 20 20 20 66 6f 72 28 3b 20 70 50 72 65 53       for(; pPreS
9cc0: 74 6d 74 3b 20 70 50 72 65 53 74 6d 74 3d 70 50  tmt; pPreStmt=pP
9cd0: 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 29 7b 0a  reStmt->pNext){.
9ce0: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20          int n = 
9cf0: 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 3b 0a  pPreStmt->nSql;.
9d00: 20 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3e          if( len>
9d10: 3d 6e 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  =n .            
9d20: 26 26 20 6d 65 6d 63 6d 70 28 70 50 72 65 53 74  && memcmp(pPreSt
9d30: 6d 74 2d 3e 7a 53 71 6c 2c 20 7a 53 71 6c 2c 20  mt->zSql, zSql, 
9d40: 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  n)==0.          
9d50: 20 20 26 26 20 28 7a 53 71 6c 5b 6e 5d 3d 3d 30    && (zSql[n]==0
9d60: 20 7c 7c 20 7a 53 71 6c 5b 6e 2d 31 5d 3d 3d 27   || zSql[n-1]=='
9d70: 3b 27 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  ;').        ){. 
9d80: 20 20 20 20 20 20 20 20 20 70 53 74 6d 74 20 3d           pStmt =
9d90: 20 70 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74   pPreStmt->pStmt
9da0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4c 65 66  ;.          zLef
9db0: 74 20 3d 20 26 7a 53 71 6c 5b 70 50 72 65 53 74  t = &zSql[pPreSt
9dc0: 6d 74 2d 3e 6e 53 71 6c 5d 3b 0a 0a 20 20 20 20  mt->nSql];..    
9dd0: 20 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 20        /* When a 
9de0: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
9df0: 6e 74 20 69 73 20 66 6f 75 6e 64 2c 20 75 6e 6c  nt is found, unl
9e00: 69 6e 6b 20 69 74 20 66 72 6f 6d 20 74 68 65 0a  ink it from the.
9e10: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 63            ** cac
9e20: 68 65 20 6c 69 73 74 2e 20 20 49 74 20 77 69 6c  he list.  It wil
9e30: 6c 20 6c 61 74 65 72 20 62 65 20 61 64 64 65 64  l later be added
9e40: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 62 65 67   back to the beg
9e50: 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 20 20 20  inning.         
9e60: 20 2a 2a 20 6f 66 20 74 68 65 20 63 61 63 68 65   ** of the cache
9e70: 20 6c 69 73 74 20 69 6e 20 6f 72 64 65 72 20 74   list in order t
9e80: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 4c 52 55 20  o implement LRU 
9e90: 72 65 70 6c 61 63 65 6d 65 6e 74 2e 0a 20 20 20  replacement..   
9ea0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
9eb0: 20 20 20 20 69 66 28 20 70 50 72 65 53 74 6d 74      if( pPreStmt
9ec0: 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20  ->pPrev ){.     
9ed0: 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d         pPreStmt-
9ee0: 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
9ef0: 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 3b  pPreStmt->pNext;
9f00: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
9f10: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 44  {.            pD
9f20: 62 2d 3e 73 74 6d 74 4c 69 73 74 20 3d 20 70 50  b->stmtList = pP
9f30: 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 3b 0a 20  reStmt->pNext;. 
9f40: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
9f50: 20 20 20 20 20 69 66 28 20 70 50 72 65 53 74 6d       if( pPreStm
9f60: 74 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  t->pNext ){.    
9f70: 20 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74          pPreStmt
9f80: 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
9f90: 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76   pPreStmt->pPrev
9fa0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
9fb0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e{.            p
9fc0: 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20 70  Db->stmtLast = p
9fd0: 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 3b 0a  PreStmt->pPrev;.
9fe0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
9ff0: 20 20 20 20 20 20 70 44 62 2d 3e 6e 53 74 6d 74        pDb->nStmt
a000: 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  --;.          br
a010: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
a020: 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
a030: 2f 2a 20 49 66 20 6e 6f 20 70 72 65 70 61 72 65  /* If no prepare
a040: 64 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20  d statement was 
a050: 66 6f 75 6e 64 2e 20 20 43 6f 6d 70 69 6c 65 20  found.  Compile 
a060: 74 68 65 20 53 51 4c 20 74 65 78 74 0a 20 20 20  the SQL text.   
a070: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
a080: 70 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pStmt==0 ){.    
a090: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
a0a0: 4b 21 3d 73 71 6c 69 74 65 33 5f 70 72 65 70 61  K!=sqlite3_prepa
a0b0: 72 65 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c  re(pDb->db, zSql
a0c0: 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 26 7a  , -1, &pStmt, &z
a0d0: 4c 65 66 74 29 20 29 7b 0a 20 20 20 20 20 20 20  Left) ){.       
a0e0: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
a0f0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 64 62 54 65  ult(interp, dbTe
a100: 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65 33 5f  xtToObj(sqlite3_
a110: 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 29  errmsg(pDb->db))
a120: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
a130: 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  = TCL_ERROR;.   
a140: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
a150: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
a160: 69 66 28 20 70 53 74 6d 74 3d 3d 30 20 29 7b 0a  if( pStmt==0 ){.
a170: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 53 51            if( SQ
a180: 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
a190: 5f 65 72 72 63 6f 64 65 28 70 44 62 2d 3e 64 62  _errcode(pDb->db
a1a0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
a1b0: 20 2f 2a 20 41 20 63 6f 6d 70 69 6c 65 2d 74 69   /* A compile-ti
a1c0: 6d 65 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20  me error in the 
a1d0: 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20  statement.      
a1e0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
a1f0: 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52       Tcl_SetObjR
a200: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 64 62  esult(interp, db
a210: 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65  TextToObj(sqlite
a220: 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62  3_errmsg(pDb->db
a230: 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  )));.           
a240: 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b   rc = TCL_ERROR;
a250: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
a260: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ak;.          }e
a270: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
a280: 20 2f 2a 20 54 68 65 20 73 74 61 74 65 6d 65 6e   /* The statemen
a290: 74 20 77 61 73 20 61 20 6e 6f 2d 6f 70 2e 20 20  t was a no-op.  
a2a0: 43 6f 6e 74 69 6e 75 65 20 74 6f 20 74 68 65 20  Continue to the 
a2b0: 6e 65 78 74 20 73 74 61 74 65 6d 65 6e 74 0a 20  next statement. 
a2c0: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e             ** in
a2d0: 20 74 68 65 20 53 51 4c 20 73 74 72 69 6e 67 2e   the SQL string.
a2e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  .            */.
a2f0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 53 71 6c              zSql
a300: 20 3d 20 7a 4c 65 66 74 3b 0a 20 20 20 20 20 20   = zLeft;.      
a310: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
a320: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
a330: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
a340: 73 65 72 74 28 20 70 50 72 65 53 74 6d 74 3d 3d  sert( pPreStmt==
a350: 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  0 );.      }..  
a360: 20 20 20 20 2f 2a 20 42 69 6e 64 20 76 61 6c 75      /* Bind valu
a370: 65 73 20 74 6f 20 70 61 72 61 6d 65 74 65 72 73  es to parameters
a380: 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68   that begin with
a390: 20 24 20 6f 72 20 3a 0a 20 20 20 20 20 20 2a 2f   $ or :.      */
a3a0: 20 20 0a 20 20 20 20 20 20 6e 56 61 72 20 3d 20    .      nVar = 
a3b0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72  sqlite3_bind_par
a3c0: 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28 70 53 74  ameter_count(pSt
a3d0: 6d 74 29 3b 0a 20 20 20 20 20 20 6e 50 61 72 6d  mt);.      nParm
a3e0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
a3f0: 6e 56 61 72 3e 73 69 7a 65 6f 66 28 61 50 61 72  nVar>sizeof(aPar
a400: 6d 29 2f 73 69 7a 65 6f 66 28 61 50 61 72 6d 5b  m)/sizeof(aParm[
a410: 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61  0]) ){.        a
a420: 70 50 61 72 6d 20 3d 20 28 54 63 6c 5f 4f 62 6a  pParm = (Tcl_Obj
a430: 2a 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 6e 56 61  **)Tcl_Alloc(nVa
a440: 72 2a 73 69 7a 65 6f 66 28 61 70 50 61 72 6d 5b  r*sizeof(apParm[
a450: 30 5d 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  0]));.      }els
a460: 65 7b 0a 20 20 20 20 20 20 20 20 61 70 50 61 72  e{.        apPar
a470: 6d 20 3d 20 61 50 61 72 6d 3b 0a 20 20 20 20 20  m = aParm;.     
a480: 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31   }.      for(i=1
a490: 3b 20 69 3c 3d 6e 56 61 72 3b 20 69 2b 2b 29 7b  ; i<=nVar; i++){
a4a0: 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
a4b0: 68 61 72 20 2a 7a 56 61 72 20 3d 20 73 71 6c 69  har *zVar = sqli
a4c0: 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  te3_bind_paramet
a4d0: 65 72 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 20 69  er_name(pStmt, i
a4e0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  );.        if( z
a4f0: 56 61 72 21 3d 30 20 26 26 20 28 7a 56 61 72 5b  Var!=0 && (zVar[
a500: 30 5d 3d 3d 27 24 27 20 7c 7c 20 7a 56 61 72 5b  0]=='$' || zVar[
a510: 30 5d 3d 3d 27 3a 27 29 20 29 7b 0a 20 20 20 20  0]==':') ){.    
a520: 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70        Tcl_Obj *p
a530: 56 61 72 20 3d 20 54 63 6c 5f 47 65 74 56 61 72  Var = Tcl_GetVar
a540: 32 45 78 28 69 6e 74 65 72 70 2c 20 26 7a 56 61  2Ex(interp, &zVa
a550: 72 5b 31 5d 2c 20 30 2c 20 30 29 3b 0a 20 20 20  r[1], 0, 0);.   
a560: 20 20 20 20 20 20 20 69 66 28 20 70 56 61 72 20         if( pVar 
a570: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
a580: 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  nt n;.          
a590: 20 20 75 38 20 2a 64 61 74 61 3b 0a 20 20 20 20    u8 *data;.    
a5a0: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
a5b0: 79 70 65 20 3d 20 70 56 61 72 2d 3e 74 79 70 65  ype = pVar->type
a5c0: 50 74 72 20 3f 20 70 56 61 72 2d 3e 74 79 70 65  Ptr ? pVar->type
a5d0: 50 74 72 2d 3e 6e 61 6d 65 20 3a 20 22 22 3b 0a  Ptr->name : "";.
a5e0: 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
a5f0: 20 63 20 3d 20 7a 54 79 70 65 5b 30 5d 3b 0a 20   c = zType[0];. 
a600: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63             if( c
a610: 3d 3d 27 62 27 20 26 26 20 73 74 72 63 6d 70 28  =='b' && strcmp(
a620: 7a 54 79 70 65 2c 22 62 79 74 65 61 72 72 61 79  zType,"bytearray
a630: 22 29 3d 3d 30 20 26 26 20 70 56 61 72 2d 3e 62  ")==0 && pVar->b
a640: 79 74 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ytes==0 ){.     
a650: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79           /* Only
a660: 20 6c 6f 61 64 20 61 20 42 4c 4f 42 20 74 79 70   load a BLOB typ
a670: 65 20 69 66 20 74 68 65 20 54 63 6c 20 76 61 72  e if the Tcl var
a680: 69 61 62 6c 65 20 69 73 20 61 20 62 79 74 65 61  iable is a bytea
a690: 72 72 61 79 20 61 6e 64 0a 20 20 20 20 20 20 20  rray and.       
a6a0: 20 20 20 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f         ** has no
a6b0: 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e   string represen
a6c0: 74 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20  tation. */.     
a6d0: 20 20 20 20 20 20 20 20 20 64 61 74 61 20 3d 20           data = 
a6e0: 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79  Tcl_GetByteArray
a6f0: 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e  FromObj(pVar, &n
a700: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
a710: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c   sqlite3_bind_bl
a720: 6f 62 28 70 53 74 6d 74 2c 20 69 2c 20 64 61 74  ob(pStmt, i, dat
a730: 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41  a, n, SQLITE_STA
a740: 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20  TIC);.          
a750: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
a760: 6f 75 6e 74 28 70 56 61 72 29 3b 0a 20 20 20 20  ount(pVar);.    
a770: 20 20 20 20 20 20 20 20 20 20 61 70 50 61 72 6d            apParm
a780: 5b 6e 50 61 72 6d 2b 2b 5d 20 3d 20 70 56 61 72  [nParm++] = pVar
a790: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
a7a0: 6c 73 65 20 69 66 28 20 28 63 3d 3d 27 62 27 20  lse if( (c=='b' 
a7b0: 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c  && strcmp(zType,
a7c0: 22 62 6f 6f 6c 65 61 6e 22 29 3d 3d 30 29 20 7c  "boolean")==0) |
a7d0: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
a7e0: 20 20 20 20 28 63 3d 3d 27 69 27 20 26 26 20 73      (c=='i' && s
a7f0: 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 69 6e 74  trcmp(zType,"int
a800: 22 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  ")==0) ){.      
a810: 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 49          Tcl_GetI
a820: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
a830: 2c 20 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20  , pVar, &n);.   
a840: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
a850: 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d  e3_bind_int(pStm
a860: 74 2c 20 69 2c 20 6e 29 3b 0a 20 20 20 20 20 20  t, i, n);.      
a870: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
a880: 63 3d 3d 27 64 27 20 26 26 20 73 74 72 63 6d 70  c=='d' && strcmp
a890: 28 7a 54 79 70 65 2c 22 64 6f 75 62 6c 65 22 29  (zType,"double")
a8a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
a8b0: 20 20 20 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20       double r;. 
a8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c               Tcl
a8d0: 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62  _GetDoubleFromOb
a8e0: 6a 28 69 6e 74 65 72 70 2c 20 70 56 61 72 2c 20  j(interp, pVar, 
a8f0: 26 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  &r);.           
a900: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
a910: 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20 69 2c  double(pStmt, i,
a920: 20 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   r);.           
a930: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 77   }else if( c=='w
a940: 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70  ' && strcmp(zTyp
a950: 65 2c 22 77 69 64 65 49 6e 74 22 29 3d 3d 30 20  e,"wideInt")==0 
a960: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
a970: 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 76 3b 0a   Tcl_WideInt v;.
a980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63                Tc
a990: 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d  l_GetWideIntFrom
a9a0: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 56 61 72  Obj(interp, pVar
a9b0: 2c 20 26 76 29 3b 0a 20 20 20 20 20 20 20 20 20  , &v);.         
a9c0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
a9d0: 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 69  d_int64(pStmt, i
a9e0: 2c 20 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , v);.          
a9f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
aa00: 20 20 20 20 20 20 20 64 61 74 61 20 3d 20 28 75         data = (u
aa10: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 54  nsigned char *)T
aa20: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
aa30: 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a 20  Obj(pVar, &n);. 
aa40: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
aa50: 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70  ite3_bind_text(p
aa60: 53 74 6d 74 2c 20 69 2c 20 28 63 68 61 72 20 2a  Stmt, i, (char *
aa70: 29 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45  )data, n, SQLITE
aa80: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
aa90: 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72          Tcl_Incr
aaa0: 52 65 66 43 6f 75 6e 74 28 70 56 61 72 29 3b 0a  RefCount(pVar);.
aab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70                ap
aac0: 50 61 72 6d 5b 6e 50 61 72 6d 2b 2b 5d 20 3d 20  Parm[nParm++] = 
aad0: 70 56 61 72 3b 0a 20 20 20 20 20 20 20 20 20 20  pVar;.          
aae0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65    }.          }e
aaf0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
ab00: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75   sqlite3_bind_nu
ab10: 6c 6c 28 20 70 53 74 6d 74 2c 20 69 20 29 3b 0a  ll( pStmt, i );.
ab20: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
ab30: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
ab40: 20 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20       /* Compute 
ab50: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a  column names */.
ab60: 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c        nCol = sql
ab70: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
ab80: 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  t(pStmt);.      
ab90: 69 66 28 20 70 53 63 72 69 70 74 20 29 7b 0a 20  if( pScript ){. 
aba0: 20 20 20 20 20 20 20 61 70 43 6f 6c 4e 61 6d 65         apColName
abb0: 20 3d 20 28 54 63 6c 5f 4f 62 6a 2a 2a 29 54 63   = (Tcl_Obj**)Tc
abc0: 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  l_Alloc( sizeof(
abd0: 54 63 6c 5f 4f 62 6a 2a 29 2a 6e 43 6f 6c 20 29  Tcl_Obj*)*nCol )
abe0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 70  ;.        if( ap
abf0: 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65  ColName==0 ) bre
ac00: 61 6b 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  ak;.        for(
ac10: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
ac20: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 43  ){.          apC
ac30: 6f 6c 4e 61 6d 65 5b 69 5d 20 3d 20 64 62 54 65  olName[i] = dbTe
ac40: 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65 33 5f  xtToObj(sqlite3_
ac50: 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d  column_name(pStm
ac60: 74 2c 69 29 29 3b 0a 20 20 20 20 20 20 20 20 20  t,i));.         
ac70: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
ac80: 74 28 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b  t(apColName[i]);
ac90: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
aca0: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
acb0: 72 65 73 75 6c 74 73 20 61 72 65 20 62 65 69 6e  results are bein
acc0: 67 20 73 74 6f 72 65 64 20 69 6e 20 61 6e 20 61  g stored in an a
acd0: 72 72 61 79 20 76 61 72 69 61 62 6c 65 2c 20 74  rray variable, t
ace0: 68 65 6e 20 63 72 65 61 74 65 0a 20 20 20 20 20  hen create.     
acf0: 20 2a 2a 20 74 68 65 20 61 72 72 61 79 28 2a 29   ** the array(*)
ad00: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 61 74 20   entry for that 
ad10: 61 72 72 61 79 0a 20 20 20 20 20 20 2a 2f 0a 20  array.      */. 
ad20: 20 20 20 20 20 69 66 28 20 70 41 72 72 61 79 20       if( pArray 
ad30: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4f  ){.        Tcl_O
ad40: 62 6a 20 2a 70 43 6f 6c 4c 69 73 74 20 3d 20 54  bj *pColList = T
ad50: 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20  cl_NewObj();.   
ad60: 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53       Tcl_Obj *pS
ad70: 74 61 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72  tar = Tcl_NewStr
ad80: 69 6e 67 4f 62 6a 28 22 2a 22 2c 20 2d 31 29 3b  ingObj("*", -1);
ad90: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63  .        Tcl_Inc
ada0: 72 52 65 66 43 6f 75 6e 74 28 70 43 6f 6c 4c 69  rRefCount(pColLi
adb0: 73 74 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  st);.        for
adc0: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
add0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63  +){.          Tc
ade0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
adf0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70  lement(interp, p
ae00: 43 6f 6c 4c 69 73 74 2c 20 61 70 43 6f 6c 4e 61  ColList, apColNa
ae10: 6d 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  me[i]);.        
ae20: 7d 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62  }.        Tcl_Ob
ae30: 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c  jSetVar2(interp,
ae40: 20 70 41 72 72 61 79 2c 20 70 53 74 61 72 2c 20   pArray, pStar, 
ae50: 70 43 6f 6c 4c 69 73 74 2c 30 29 3b 0a 20 20 20  pColList,0);.   
ae60: 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66       Tcl_DecrRef
ae70: 43 6f 75 6e 74 28 70 43 6f 6c 4c 69 73 74 29 3b  Count(pColList);
ae80: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63  .        Tcl_Dec
ae90: 72 52 65 66 43 6f 75 6e 74 28 70 53 74 61 72 29  rRefCount(pStar)
aea0: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
aeb0: 20 2f 2a 20 45 78 65 63 75 74 65 20 74 68 65 20   /* Execute the 
aec0: 53 51 4c 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  SQL.      */.   
aed0: 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 54 43     while( rc==TC
aee0: 4c 5f 4f 4b 20 26 26 20 70 53 74 6d 74 20 26 26  L_OK && pStmt &&
aef0: 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
af00: 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
af10: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   ){.        for(
af20: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
af30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  ){.          Tcl
af40: 5f 4f 62 6a 20 2a 70 56 61 6c 3b 0a 20 20 20 20  _Obj *pVal;.    
af50: 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20        .         
af60: 20 2f 2a 20 53 65 74 20 70 56 61 6c 20 74 6f 20   /* Set pVal to 
af70: 63 6f 6e 74 61 69 6e 20 74 68 65 20 69 27 74 68  contain the i'th
af80: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 69 73 20   column of this 
af90: 72 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  row. */.        
afa0: 20 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65    switch( sqlite
afb0: 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53  3_column_type(pS
afc0: 74 6d 74 2c 20 69 29 20 29 7b 0a 20 20 20 20 20  tmt, i) ){.     
afd0: 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
afe0: 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20  TE_BLOB: {.     
aff0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 62 79 74           int byt
b000: 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  es = sqlite3_col
b010: 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c  umn_bytes(pStmt,
b020: 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   i);.           
b030: 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65     pVal = Tcl_Ne
b040: 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 73 71  wByteArrayObj(sq
b050: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f  lite3_column_blo
b060: 62 28 70 53 74 6d 74 2c 20 69 29 2c 20 62 79 74  b(pStmt, i), byt
b070: 65 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  es);.           
b080: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b090: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
b0a0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b0b0: 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20  INTEGER: {.     
b0c0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 5f           sqlite_
b0d0: 69 6e 74 36 34 20 76 20 3d 20 73 71 6c 69 74 65  int64 v = sqlite
b0e0: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70  3_column_int64(p
b0f0: 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Stmt, i);.      
b100: 20 20 20 20 20 20 20 20 69 66 28 20 76 3e 3d 2d          if( v>=-
b110: 32 31 34 37 34 38 33 36 34 37 20 26 26 20 76 3c  2147483647 && v<
b120: 3d 32 31 34 37 34 38 33 36 34 37 20 29 7b 0a 20  =2147483647 ){. 
b130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
b140: 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 49 6e 74  Val = Tcl_NewInt
b150: 4f 62 6a 28 76 29 3b 0a 20 20 20 20 20 20 20 20  Obj(v);.        
b160: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
b170: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56 61               pVa
b180: 6c 20 3d 20 54 63 6c 5f 4e 65 77 57 69 64 65 49  l = Tcl_NewWideI
b190: 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20 20 20 20  ntObj(v);.      
b1a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b1b0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
b1c0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
b1d0: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51           case SQ
b1e0: 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20  LITE_FLOAT: {.  
b1f0: 20 20 20 20 20 20 20 20 20 20 20 20 64 6f 75 62              doub
b200: 6c 65 20 72 20 3d 20 73 71 6c 69 74 65 33 5f 63  le r = sqlite3_c
b210: 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 53 74  olumn_double(pSt
b220: 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  mt, i);.        
b230: 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c        pVal = Tcl
b240: 5f 4e 65 77 44 6f 75 62 6c 65 4f 62 6a 28 72 29  _NewDoubleObj(r)
b250: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
b260: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
b270: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
b280: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c   case SQLITE_NUL
b290: 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  L: {.           
b2a0: 20 20 20 70 56 61 6c 20 3d 20 64 62 54 65 78 74     pVal = dbText
b2b0: 54 6f 4f 62 6a 28 70 44 62 2d 3e 7a 4e 75 6c 6c  ToObj(pDb->zNull
b2c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
b2d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
b2e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
b2f0: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
b300: 20 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20             pVal 
b310: 3d 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 28 63  = dbTextToObj((c
b320: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f  har *)sqlite3_co
b330: 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
b340: 20 69 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20   i));.          
b350: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b360: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
b370: 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20     }.  .        
b380: 20 20 69 66 28 20 70 53 63 72 69 70 74 20 29 7b    if( pScript ){
b390: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
b3a0: 20 70 41 72 72 61 79 3d 3d 30 20 29 7b 0a 20 20   pArray==0 ){.  
b3b0: 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
b3c0: 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72  ObjSetVar2(inter
b3d0: 70 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 2c  p, apColName[i],
b3e0: 20 30 2c 20 70 56 61 6c 2c 20 30 29 3b 0a 20 20   0, pVal, 0);.  
b3f0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
b400: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54  .              T
b410: 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e  cl_ObjSetVar2(in
b420: 74 65 72 70 2c 20 70 41 72 72 61 79 2c 20 61 70  terp, pArray, ap
b430: 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20 70 56 61 6c  ColName[i], pVal
b440: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
b450: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65    }.          }e
b460: 6c 73 65 20 69 66 28 20 63 68 6f 69 63 65 3d 3d  lse if( choice==
b470: 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 20 29 7b 0a  DB_ONECOLUMN ){.
b480: 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
b490: 72 74 28 20 70 52 65 74 3d 3d 30 20 29 3b 0a 20  rt( pRet==0 );. 
b4a0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
b4b0: 52 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ret==0 ){.      
b4c0: 20 20 20 20 20 20 20 20 70 52 65 74 20 3d 20 70          pRet = p
b4d0: 56 61 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Val;.           
b4e0: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
b4f0: 75 6e 74 28 70 52 65 74 29 3b 0a 20 20 20 20 20  unt(pRet);.     
b500: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
b510: 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 42 52       rc = TCL_BR
b520: 45 41 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  EAK;.           
b530: 20 69 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20 20   i = nCol;.     
b540: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
b550: 68 6f 69 63 65 3d 3d 44 42 5f 45 58 49 53 54 53  hoice==DB_EXISTS
b560: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
b570: 61 73 73 65 72 74 28 20 70 52 65 74 3d 3d 30 20  assert( pRet==0 
b580: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 54  );.            T
b590: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
b5a0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42  interp, Tcl_NewB
b5b0: 6f 6f 6c 65 61 6e 4f 62 6a 28 31 29 29 3b 0a 20  ooleanObj(1));. 
b5c0: 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
b5d0: 54 43 4c 5f 42 52 45 41 4b 3b 0a 20 20 20 20 20  TCL_BREAK;.     
b5e0: 20 20 20 20 20 20 20 69 20 3d 20 6e 43 6f 6c 3b         i = nCol;
b5f0: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
b600: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 63  {.            Tc
b610: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
b620: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70  lement(interp, p
b630: 52 65 74 2c 20 70 56 61 6c 29 3b 0a 20 20 20 20  Ret, pVal);.    
b640: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
b650: 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 69 66 28  }.  .        if(
b660: 20 70 53 63 72 69 70 74 20 29 7b 0a 20 20 20 20   pScript ){.    
b670: 20 20 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 45        rc = Tcl_E
b680: 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c  valObjEx(interp,
b690: 20 70 53 63 72 69 70 74 2c 20 30 29 3b 0a 20 20   pScript, 0);.  
b6a0: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
b6b0: 54 43 4c 5f 43 4f 4e 54 49 4e 55 45 20 29 7b 0a  TCL_CONTINUE ){.
b6c0: 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
b6d0: 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 20   TCL_OK;.       
b6e0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
b6f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
b700: 20 72 63 3d 3d 54 43 4c 5f 42 52 45 41 4b 20 29   rc==TCL_BREAK )
b710: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 54  {.        rc = T
b720: 43 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 0a  CL_OK;.      }..
b730: 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 74 68        /* Free th
b740: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6f 62  e column name ob
b750: 6a 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 69  jects */.      i
b760: 66 28 20 70 53 63 72 69 70 74 20 29 7b 0a 20 20  f( pScript ){.  
b770: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
b780: 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
b790: 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52         Tcl_DecrR
b7a0: 65 66 43 6f 75 6e 74 28 61 70 43 6f 6c 4e 61 6d  efCount(apColNam
b7b0: 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  e[i]);.        }
b7c0: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65  .        Tcl_Fre
b7d0: 65 28 28 63 68 61 72 2a 29 61 70 43 6f 6c 4e 61  e((char*)apColNa
b7e0: 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  me);.      }..  
b7f0: 20 20 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20      /* Free the 
b800: 62 6f 75 6e 64 20 73 74 72 69 6e 67 20 61 6e 64  bound string and
b810: 20 62 6c 6f 62 20 70 61 72 61 6d 65 74 65 72 73   blob parameters
b820: 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   */.      for(i=
b830: 30 3b 20 69 3c 6e 50 61 72 6d 3b 20 69 2b 2b 29  0; i<nParm; i++)
b840: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65  {.        Tcl_De
b850: 63 72 52 65 66 43 6f 75 6e 74 28 61 70 50 61 72  crRefCount(apPar
b860: 6d 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  m[i]);.      }. 
b870: 20 20 20 20 20 69 66 28 20 61 70 50 61 72 6d 21       if( apParm!
b880: 3d 61 50 61 72 6d 20 29 7b 0a 20 20 20 20 20 20  =aParm ){.      
b890: 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72    Tcl_Free((char
b8a0: 2a 29 61 70 50 61 72 6d 29 3b 0a 20 20 20 20 20  *)apParm);.     
b8b0: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 52 65 73   }..      /* Res
b8c0: 65 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  et the statement
b8d0: 2e 20 20 49 66 20 74 68 65 20 72 65 73 75 6c 74  .  If the result
b8e0: 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f   code is SQLITE_
b8f0: 53 43 48 45 4d 41 2c 20 74 68 65 6e 0a 20 20 20  SCHEMA, then.   
b900: 20 20 20 2a 2a 20 66 6c 75 73 68 20 74 68 65 20     ** flush the 
b910: 73 74 61 74 65 6d 65 6e 74 20 63 61 63 68 65 20  statement cache 
b920: 61 6e 64 20 74 72 79 20 74 68 65 20 73 74 61 74  and try the stat
b930: 65 6d 65 6e 74 20 61 67 61 69 6e 2e 0a 20 20 20  ement again..   
b940: 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 32 20     */.      rc2 
b950: 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
b960: 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 69 66  pStmt);.      if
b970: 28 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 3d  ( SQLITE_SCHEMA=
b980: 3d 72 63 32 20 29 7b 0a 20 20 20 20 20 20 20 20  =rc2 ){.        
b990: 2f 2a 20 41 66 74 65 72 20 61 20 73 63 68 65 6d  /* After a schem
b9a0: 61 20 63 68 61 6e 67 65 2c 20 66 6c 75 73 68 20  a change, flush 
b9b0: 74 68 65 20 63 61 63 68 65 20 61 6e 64 20 74 72  the cache and tr
b9c0: 79 20 74 6f 20 72 75 6e 20 74 68 65 0a 20 20 20  y to run the.   
b9d0: 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e       ** statemen
b9e0: 74 20 61 67 61 69 6e 0a 20 20 20 20 20 20 20 20  t again.        
b9f0: 2a 2f 0a 20 20 20 20 20 20 20 20 66 6c 75 73 68  */.        flush
ba00: 53 74 6d 74 43 61 63 68 65 28 20 70 44 62 20 29  StmtCache( pDb )
ba10: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
ba20: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
ba30: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
ba40: 50 72 65 53 74 6d 74 20 29 20 54 63 6c 5f 46 72  PreStmt ) Tcl_Fr
ba50: 65 65 28 28 63 68 61 72 2a 29 70 50 72 65 53 74  ee((char*)pPreSt
ba60: 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  mt);.        con
ba70: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c  tinue;.      }el
ba80: 73 65 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  se if( SQLITE_OK
ba90: 21 3d 72 63 32 20 29 7b 0a 20 20 20 20 20 20 20  !=rc2 ){.       
baa0: 20 2f 2a 20 49 66 20 61 20 72 75 6e 2d 74 69 6d   /* If a run-tim
bab0: 65 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  e error occurs, 
bac0: 72 65 70 6f 72 74 20 74 68 65 20 65 72 72 6f 72  report the error
bad0: 20 61 6e 64 20 73 74 6f 70 20 72 65 61 64 69 6e   and stop readin
bae0: 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  g.        ** the
baf0: 20 53 51 4c 0a 20 20 20 20 20 20 20 20 2a 2f 0a   SQL.        */.
bb00: 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f          Tcl_SetO
bb10: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
bb20: 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c   dbTextToObj(sql
bb30: 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d  ite3_errmsg(pDb-
bb40: 3e 64 62 29 29 29 3b 0a 20 20 20 20 20 20 20 20  >db)));.        
bb50: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
bb60: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20  (pStmt);.       
bb70: 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b   rc = TCL_ERROR;
bb80: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72  .        if( pPr
bb90: 65 53 74 6d 74 20 29 20 54 63 6c 5f 46 72 65 65  eStmt ) Tcl_Free
bba0: 28 28 63 68 61 72 2a 29 70 50 72 65 53 74 6d 74  ((char*)pPreStmt
bbb0: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
bbc0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
bbd0: 28 20 70 44 62 2d 3e 6d 61 78 53 74 6d 74 3c 3d  ( pDb->maxStmt<=
bbe0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
bbf0: 49 66 20 74 68 65 20 63 61 63 68 65 20 69 73 20  If the cache is 
bc00: 74 75 72 6e 65 64 20 6f 66 66 2c 20 64 65 61 6c  turned off, deal
bc10: 6c 6f 63 61 74 65 64 20 74 68 65 20 73 74 61 74  located the stat
bc20: 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20  ement */.       
bc30: 20 69 66 28 20 70 50 72 65 53 74 6d 74 20 29 20   if( pPreStmt ) 
bc40: 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29  Tcl_Free((char*)
bc50: 70 50 72 65 53 74 6d 74 29 3b 0a 20 20 20 20 20  pPreStmt);.     
bc60: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
bc70: 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
bc80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
bc90: 20 2f 2a 20 45 76 65 72 79 74 68 69 6e 67 20 77   /* Everything w
bca0: 6f 72 6b 65 64 20 61 6e 64 20 74 68 65 20 63 61  orked and the ca
bcb0: 63 68 65 20 69 73 20 6f 70 65 72 61 74 69 6f 6e  che is operation
bcc0: 61 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 43  al..        ** C
bcd0: 72 65 61 74 65 20 61 20 6e 65 77 20 53 71 6c 50  reate a new SqlP
bce0: 72 65 70 61 72 65 64 53 74 6d 74 20 73 74 72 75  reparedStmt stru
bcf0: 63 74 75 72 65 20 69 66 20 77 65 20 6e 65 65 64  cture if we need
bd00: 20 6f 6e 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a   one..        **
bd10: 20 28 49 66 20 77 65 20 61 6c 72 65 61 64 79 20   (If we already 
bd20: 68 61 76 65 20 6f 6e 65 20 77 65 20 63 61 6e 20  have one we can 
bd30: 6a 75 73 74 20 72 65 75 73 65 20 69 74 2e 29 0a  just reuse it.).
bd40: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
bd50: 20 20 20 69 66 28 20 70 50 72 65 53 74 6d 74 3d     if( pPreStmt=
bd60: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
bd70: 6c 65 6e 20 3d 20 7a 4c 65 66 74 20 2d 20 7a 53  len = zLeft - zS
bd80: 71 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  ql;.          pP
bd90: 72 65 53 74 6d 74 20 3d 20 28 53 71 6c 50 72 65  reStmt = (SqlPre
bda0: 70 61 72 65 64 53 74 6d 74 2a 29 54 63 6c 5f 41  paredStmt*)Tcl_A
bdb0: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 50  lloc( sizeof(*pP
bdc0: 72 65 53 74 6d 74 29 20 2b 20 6c 65 6e 20 29 3b  reStmt) + len );
bdd0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
bde0: 50 72 65 53 74 6d 74 3d 3d 30 20 29 20 72 65 74  PreStmt==0 ) ret
bdf0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
be00: 20 20 20 20 20 20 20 20 20 70 50 72 65 53 74 6d           pPreStm
be10: 74 2d 3e 70 53 74 6d 74 20 3d 20 70 53 74 6d 74  t->pStmt = pStmt
be20: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 72 65  ;.          pPre
be30: 53 74 6d 74 2d 3e 6e 53 71 6c 20 3d 20 6c 65 6e  Stmt->nSql = len
be40: 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  ;.          memc
be50: 70 79 28 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71  py(pPreStmt->zSq
be60: 6c 2c 20 7a 53 71 6c 2c 20 6c 65 6e 29 3b 0a 20  l, zSql, len);. 
be70: 20 20 20 20 20 20 20 20 20 70 50 72 65 53 74 6d           pPreStm
be80: 74 2d 3e 7a 53 71 6c 5b 6c 65 6e 5d 20 3d 20 30  t->zSql[len] = 0
be90: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
bea0: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20       /* Add the 
beb0: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
bec0: 6e 74 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  nt to the beginn
bed0: 69 6e 67 20 6f 66 20 74 68 65 20 63 61 63 68 65  ing of the cache
bee0: 20 6c 69 73 74 0a 20 20 20 20 20 20 20 20 2a 2f   list.        */
bef0: 0a 20 20 20 20 20 20 20 20 70 50 72 65 53 74 6d  .        pPreStm
bf00: 74 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e  t->pNext = pDb->
bf10: 73 74 6d 74 4c 69 73 74 3b 0a 20 20 20 20 20 20  stmtList;.      
bf20: 20 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72 65    pPreStmt->pPre
bf30: 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  v = 0;.        i
bf40: 66 28 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74  f( pDb->stmtList
bf50: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 70 44 62   ){.         pDb
bf60: 2d 3e 73 74 6d 74 4c 69 73 74 2d 3e 70 50 72 65  ->stmtList->pPre
bf70: 76 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a 20 20  v = pPreStmt;.  
bf80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
bf90: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 3d 20  pDb->stmtList = 
bfa0: 70 50 72 65 53 74 6d 74 3b 0a 20 20 20 20 20 20  pPreStmt;.      
bfb0: 20 20 69 66 28 20 70 44 62 2d 3e 73 74 6d 74 4c    if( pDb->stmtL
bfc0: 61 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ast==0 ){.      
bfd0: 20 20 20 20 61 73 73 65 72 74 28 20 70 44 62 2d      assert( pDb-
bfe0: 3e 6e 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20  >nStmt==0 );.   
bff0: 20 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74         pDb->stmt
c000: 4c 61 73 74 20 3d 20 70 50 72 65 53 74 6d 74 3b  Last = pPreStmt;
c010: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
c020: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
c030: 28 20 70 44 62 2d 3e 6e 53 74 6d 74 3e 30 20 29  ( pDb->nStmt>0 )
c040: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
c050: 20 20 20 20 70 44 62 2d 3e 6e 53 74 6d 74 2b 2b      pDb->nStmt++
c060: 3b 0a 20 20 20 0a 20 20 20 20 20 20 20 20 2f 2a  ;.   .        /*
c070: 20 49 66 20 77 65 20 68 61 76 65 20 74 6f 6f 20   If we have too 
c080: 6d 61 6e 79 20 73 74 61 74 65 6d 65 6e 74 20 69  many statement i
c090: 6e 20 63 61 63 68 65 2c 20 72 65 6d 6f 76 65 20  n cache, remove 
c0a0: 74 68 65 20 73 75 72 70 6c 75 73 20 66 72 6f 6d  the surplus from
c0b0: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
c0c0: 65 6e 64 20 6f 66 20 74 68 65 20 63 61 63 68 65  end of the cache
c0d0: 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 20 20 2a   list..        *
c0e0: 2f 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  /.        while(
c0f0: 20 70 44 62 2d 3e 6e 53 74 6d 74 3e 70 44 62 2d   pDb->nStmt>pDb-
c100: 3e 6d 61 78 53 74 6d 74 20 29 7b 0a 20 20 20 20  >maxStmt ){.    
c110: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
c120: 6e 61 6c 69 7a 65 28 70 44 62 2d 3e 73 74 6d 74  nalize(pDb->stmt
c130: 4c 61 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20  Last->pStmt);.  
c140: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d          pDb->stm
c150: 74 4c 61 73 74 20 3d 20 70 44 62 2d 3e 73 74 6d  tLast = pDb->stm
c160: 74 4c 61 73 74 2d 3e 70 50 72 65 76 3b 0a 20 20  tLast->pPrev;.  
c170: 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65          Tcl_Free
c180: 28 28 63 68 61 72 2a 29 70 44 62 2d 3e 73 74 6d  ((char*)pDb->stm
c190: 74 4c 61 73 74 2d 3e 70 4e 65 78 74 29 3b 0a 20  tLast->pNext);. 
c1a0: 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73 74           pDb->st
c1b0: 6d 74 4c 61 73 74 2d 3e 70 4e 65 78 74 20 3d 20  mtLast->pNext = 
c1c0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44 62  0;.          pDb
c1d0: 2d 3e 6e 53 74 6d 74 2d 2d 3b 0a 20 20 20 20 20  ->nStmt--;.     
c1e0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
c1f0: 20 20 20 20 2f 2a 20 50 72 6f 63 65 65 64 20 74      /* Proceed t
c200: 6f 20 74 68 65 20 6e 65 78 74 20 73 74 61 74 65  o the next state
c210: 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 7a 53  ment */.      zS
c220: 71 6c 20 3d 20 7a 4c 65 66 74 3b 0a 20 20 20 20  ql = zLeft;.    
c230: 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  }.    Tcl_DecrRe
c240: 66 43 6f 75 6e 74 28 6f 62 6a 76 5b 32 5d 29 3b  fCount(objv[2]);
c250: 0a 0a 20 20 20 20 69 66 28 20 70 52 65 74 20 29  ..    if( pRet )
c260: 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  {.      if( rc==
c270: 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  TCL_OK ){.      
c280: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
c290: 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29  lt(interp, pRet)
c2a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c2b0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
c2c0: 28 70 52 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20  (pRet);.    }.  
c2d0: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
c2e0: 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20  /*.  **     $db 
c2f0: 66 75 6e 63 74 69 6f 6e 20 4e 41 4d 45 20 53 43  function NAME SC
c300: 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43  RIPT.  **.  ** C
c310: 72 65 61 74 65 20 61 20 6e 65 77 20 53 51 4c 20  reate a new SQL 
c320: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20  function called 
c330: 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76 65 72 20  NAME.  Whenever 
c340: 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 69 73  that function is
c350: 0a 20 20 2a 2a 20 63 61 6c 6c 65 64 2c 20 69 6e  .  ** called, in
c360: 76 6f 6b 65 20 53 43 52 49 50 54 20 74 6f 20 65  voke SCRIPT to e
c370: 76 61 6c 75 61 74 65 20 74 68 65 20 66 75 6e 63  valuate the func
c380: 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  tion..  */.  cas
c390: 65 20 44 42 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b  e DB_FUNCTION: {
c3a0: 0a 20 20 20 20 53 71 6c 46 75 6e 63 20 2a 70 46  .    SqlFunc *pF
c3b0: 75 6e 63 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  unc;.    Tcl_Obj
c3c0: 20 2a 70 53 63 72 69 70 74 3b 0a 20 20 20 20 63   *pScript;.    c
c3d0: 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20  har *zName;.    
c3e0: 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20  if( objc!=4 ){. 
c3f0: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
c400: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
c410: 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 20 53 43 52   objv, "NAME SCR
c420: 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65 74  IPT");.      ret
c430: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
c440: 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d     }.    zName =
c450: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
c460: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30  omObj(objv[2], 0
c470: 29 3b 0a 20 20 20 20 70 53 63 72 69 70 74 20 3d  );.    pScript =
c480: 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20 20 70 46   objv[3];.    pF
c490: 75 6e 63 20 3d 20 66 69 6e 64 53 71 6c 46 75 6e  unc = findSqlFun
c4a0: 63 28 70 44 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  c(pDb, zName);. 
c4b0: 20 20 20 69 66 28 20 70 46 75 6e 63 3d 3d 30 20     if( pFunc==0 
c4c0: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
c4d0: 4f 52 3b 0a 20 20 20 20 69 66 28 20 70 46 75 6e  OR;.    if( pFun
c4e0: 63 2d 3e 70 53 63 72 69 70 74 20 29 7b 0a 20 20  c->pScript ){.  
c4f0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
c500: 6f 75 6e 74 28 70 46 75 6e 63 2d 3e 70 53 63 72  ount(pFunc->pScr
c510: 69 70 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ipt);.    }.    
c520: 70 46 75 6e 63 2d 3e 70 53 63 72 69 70 74 20 3d  pFunc->pScript =
c530: 20 70 53 63 72 69 70 74 3b 0a 20 20 20 20 54 63   pScript;.    Tc
c540: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
c550: 53 63 72 69 70 74 29 3b 0a 20 20 20 20 70 46 75  Script);.    pFu
c560: 6e 63 2d 3e 75 73 65 45 76 61 6c 4f 62 6a 76 20  nc->useEvalObjv 
c570: 3d 20 73 61 66 65 54 6f 55 73 65 45 76 61 6c 4f  = safeToUseEvalO
c580: 62 6a 76 28 69 6e 74 65 72 70 2c 20 70 53 63 72  bjv(interp, pScr
c590: 69 70 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  ipt);.    rc = s
c5a0: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
c5b0: 6e 63 74 69 6f 6e 28 70 44 62 2d 3e 64 62 2c 20  nction(pDb->db, 
c5c0: 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54  zName, -1, SQLIT
c5d0: 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 20 20  E_UTF8,.        
c5e0: 70 46 75 6e 63 2c 20 74 63 6c 53 71 6c 46 75 6e  pFunc, tclSqlFun
c5f0: 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  c, 0, 0);.    if
c600: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
c610: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43  ){.      rc = TC
c620: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 54  L_ERROR;.      T
c630: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
c640: 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c  erp, (char *)sql
c650: 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d  ite3_errmsg(pDb-
c660: 3e 64 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49  >db), TCL_VOLATI
c670: 4c 45 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  LE);.    }else{.
c680: 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 66 6c        /* Must fl
c690: 75 73 68 20 61 6e 79 20 63 61 63 68 65 64 20 73  ush any cached s
c6a0: 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  tatements */.   
c6b0: 20 20 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68     flushStmtCach
c6c0: 65 28 20 70 44 62 20 29 3b 0a 20 20 20 20 7d 0a  e( pDb );.    }.
c6d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
c6e0: 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64    /*.  **     $d
c6f0: 62 20 6e 75 6c 6c 76 61 6c 75 65 20 3f 53 54 52  b nullvalue ?STR
c700: 49 4e 47 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43  ING?.  **.  ** C
c710: 68 61 6e 67 65 20 74 65 78 74 20 75 73 65 64 20  hange text used 
c720: 77 68 65 6e 20 61 20 4e 55 4c 4c 20 63 6f 6d 65  when a NULL come
c730: 73 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  s back from the 
c740: 64 61 74 61 62 61 73 65 2e 20 49 66 20 3f 53 54  database. If ?ST
c750: 52 49 4e 47 3f 0a 20 20 2a 2a 20 69 73 20 6e 6f  RING?.  ** is no
c760: 74 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20  t present, then 
c770: 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 72 69  the current stri
c780: 6e 67 20 75 73 65 64 20 66 6f 72 20 4e 55 4c 4c  ng used for NULL
c790: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 20 20   is returned..  
c7a0: 2a 2a 20 49 66 20 53 54 52 49 4e 47 20 69 73 20  ** If STRING is 
c7b0: 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 53 54  present, then ST
c7c0: 52 49 4e 47 20 69 73 20 72 65 74 75 72 6e 65 64  RING is returned
c7d0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2f 0a 20 20 63 61  ..  **.  */.  ca
c7e0: 73 65 20 44 42 5f 4e 55 4c 4c 56 41 4c 55 45 3a  se DB_NULLVALUE:
c7f0: 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21   {.    if( objc!
c800: 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b  =2 && objc!=3 ){
c810: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
c820: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
c830: 32 2c 20 6f 62 6a 76 2c 20 22 4e 55 4c 4c 56 41  2, objv, "NULLVA
c840: 4c 55 45 22 29 3b 0a 20 20 20 20 20 20 72 65 74  LUE");.      ret
c850: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
c860: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a     }.    if( obj
c870: 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 69 6e  c==3 ){.      in
c880: 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 63 68 61  t len;.      cha
c890: 72 20 2a 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f 47  r *zNull = Tcl_G
c8a0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
c8b0: 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a  objv[2], &len);.
c8c0: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
c8d0: 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Null ){.        
c8e0: 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 4e  Tcl_Free(pDb->zN
c8f0: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ull);.      }.  
c900: 20 20 20 20 69 66 28 20 7a 4e 75 6c 6c 20 26 26      if( zNull &&
c910: 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20   len>0 ){.      
c920: 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 3d 20 54    pDb->zNull = T
c930: 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20  cl_Alloc( len + 
c940: 31 20 29 3b 0a 20 20 20 20 20 20 20 20 73 74 72  1 );.        str
c950: 6e 63 70 79 28 70 44 62 2d 3e 7a 4e 75 6c 6c 2c  ncpy(pDb->zNull,
c960: 20 7a 4e 75 6c 6c 2c 20 6c 65 6e 29 3b 0a 20 20   zNull, len);.  
c970: 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c        pDb->zNull
c980: 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  [len] = '\0';.  
c990: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c9a0: 20 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 3d 20     pDb->zNull = 
c9b0: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
c9c0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
c9d0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 64 62  esult(interp, db
c9e0: 54 65 78 74 54 6f 4f 62 6a 28 70 44 62 2d 3e 7a  TextToObj(pDb->z
c9f0: 4e 75 6c 6c 29 29 3b 0a 20 20 20 20 62 72 65 61  Null));.    brea
ca00: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
ca10: 2a 20 20 20 20 20 24 64 62 20 6c 61 73 74 5f 69  *     $db last_i
ca20: 6e 73 65 72 74 5f 72 6f 77 69 64 20 0a 20 20 2a  nsert_rowid .  *
ca30: 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 61 6e  *.  ** Return an
ca40: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
ca50: 73 20 74 68 65 20 52 4f 57 49 44 20 66 6f 72 20  s the ROWID for 
ca60: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
ca70: 69 6e 73 65 72 74 2e 0a 20 20 2a 2f 0a 20 20 63  insert..  */.  c
ca80: 61 73 65 20 44 42 5f 4c 41 53 54 5f 49 4e 53 45  ase DB_LAST_INSE
ca90: 52 54 5f 52 4f 57 49 44 3a 20 7b 0a 20 20 20 20  RT_ROWID: {.    
caa0: 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74  Tcl_Obj *pResult
cab0: 3b 0a 20 20 20 20 69 6e 74 20 72 6f 77 69 64 3b  ;.    int rowid;
cac0: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  .    if( objc!=2
cad0: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
cae0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
caf0: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 22 29 3b  p, 2, objv, "");
cb00: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
cb10: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
cb20: 20 20 20 72 6f 77 69 64 20 3d 20 73 71 6c 69 74     rowid = sqlit
cb30: 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  e3_last_insert_r
cb40: 6f 77 69 64 28 70 44 62 2d 3e 64 62 29 3b 0a 20  owid(pDb->db);. 
cb50: 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c     pResult = Tcl
cb60: 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _GetObjResult(in
cb70: 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53  terp);.    Tcl_S
cb80: 65 74 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74  etIntObj(pResult
cb90: 2c 20 72 6f 77 69 64 29 3b 0a 20 20 20 20 62 72  , rowid);.    br
cba0: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
cbb0: 20 2a 2a 20 54 68 65 20 44 42 5f 4f 4e 45 43 4f   ** The DB_ONECO
cbc0: 4c 55 4d 4e 20 6d 65 74 68 6f 64 20 69 73 20 69  LUMN method is i
cbd0: 6d 70 6c 65 6d 65 6e 74 65 64 20 74 6f 67 65 74  mplemented toget
cbe0: 68 65 72 20 77 69 74 68 20 44 42 5f 45 56 41 4c  her with DB_EVAL
cbf0: 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 20 20 20  ..  */..  /*    
cc00: 24 64 62 20 70 72 6f 67 72 65 73 73 20 3f 4e 20  $db progress ?N 
cc10: 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 20 0a  CALLBACK?.  ** .
cc20: 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20    ** Invoke the 
cc30: 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 65  given callback e
cc40: 76 65 72 79 20 4e 20 76 69 72 74 75 61 6c 20 6d  very N virtual m
cc50: 61 63 68 69 6e 65 20 6f 70 63 6f 64 65 73 20 77  achine opcodes w
cc60: 68 69 6c 65 20 65 78 65 63 75 74 69 6e 67 0a 20  hile executing. 
cc70: 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20 20 2a   ** queries..  *
cc80: 2f 0a 20 20 63 61 73 65 20 44 42 5f 50 52 4f 47  /.  case DB_PROG
cc90: 52 45 53 53 3a 20 7b 0a 20 20 20 20 69 66 28 20  RESS: {.    if( 
cca0: 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20  objc==2 ){.     
ccb0: 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72   if( pDb->zProgr
ccc0: 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20 54  ess ){.        T
ccd0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
cce0: 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 50 72  interp, pDb->zPr
ccf0: 6f 67 72 65 73 73 2c 20 30 29 3b 0a 20 20 20 20  ogress, 0);.    
cd00: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
cd10: 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20  ( objc==4 ){.   
cd20: 20 20 20 63 68 61 72 20 2a 7a 50 72 6f 67 72 65     char *zProgre
cd30: 73 73 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65  ss;.      int le
cd40: 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 4e 3b 0a  n;.      int N;.
cd50: 20 20 20 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b        if( TCL_OK
cd60: 21 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  !=Tcl_GetIntFrom
cd70: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
cd80: 5b 32 5d 2c 20 26 4e 29 20 29 7b 0a 09 72 65 74  [2], &N) ){..ret
cd90: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
cda0: 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 69 66       };.      if
cdb0: 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73  ( pDb->zProgress
cdc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
cdd0: 46 72 65 65 28 70 44 62 2d 3e 7a 50 72 6f 67 72  Free(pDb->zProgr
cde0: 65 73 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ess);.      }.  
cdf0: 20 20 20 20 7a 50 72 6f 67 72 65 73 73 20 3d 20      zProgress = 
ce00: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
ce10: 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6c  mObj(objv[3], &l
ce20: 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  en);.      if( z
ce30: 50 72 6f 67 72 65 73 73 20 26 26 20 6c 65 6e 3e  Progress && len>
ce40: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  0 ){.        pDb
ce50: 2d 3e 7a 50 72 6f 67 72 65 73 73 20 3d 20 54 63  ->zProgress = Tc
ce60: 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31  l_Alloc( len + 1
ce70: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 74 72 63   );.        strc
ce80: 70 79 28 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73  py(pDb->zProgres
ce90: 73 2c 20 7a 50 72 6f 67 72 65 73 73 29 3b 0a 20  s, zProgress);. 
cea0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
ceb0: 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65      pDb->zProgre
cec0: 73 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ss = 0;.      }.
ced0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
cee0: 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c  MIT_PROGRESS_CAL
cef0: 4c 42 41 43 4b 0a 20 20 20 20 20 20 69 66 28 20  LBACK.      if( 
cf00: 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29  pDb->zProgress )
cf10: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69  {.        pDb->i
cf20: 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a  nterp = interp;.
cf30: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
cf40: 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65 72  progress_handler
cf50: 28 70 44 62 2d 3e 64 62 2c 20 4e 2c 20 44 62 50  (pDb->db, N, DbP
cf60: 72 6f 67 72 65 73 73 48 61 6e 64 6c 65 72 2c 20  rogressHandler, 
cf70: 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  pDb);.      }els
cf80: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
cf90: 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e 64  e3_progress_hand
cfa0: 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20  ler(pDb->db, 0, 
cfb0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23  0, 0);.      }.#
cfc0: 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b  endif.    }else{
cfd0: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
cfe0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
cff0: 32 2c 20 6f 62 6a 76 2c 20 22 4e 20 43 41 4c 4c  2, objv, "N CALL
d000: 42 41 43 4b 22 29 3b 0a 20 20 20 20 20 20 72 65  BACK");.      re
d010: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
d020: 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
d030: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64  .  }..  /*    $d
d040: 62 20 70 72 6f 66 69 6c 65 20 3f 43 41 4c 4c 42  b profile ?CALLB
d050: 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d  ACK?.  **.  ** M
d060: 61 6b 65 20 61 72 72 61 6e 67 65 6d 65 6e 74 73  ake arrangements
d070: 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 43   to invoke the C
d080: 41 4c 4c 42 41 43 4b 20 72 6f 75 74 69 6e 65 20  ALLBACK routine 
d090: 61 66 74 65 72 20 65 61 63 68 20 53 51 4c 20 73  after each SQL s
d0a0: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68  tatement.  ** th
d0b0: 61 74 20 68 61 73 20 72 75 6e 2e 20 20 54 68 65  at has run.  The
d0c0: 20 74 65 78 74 20 6f 66 20 74 68 65 20 53 51 4c   text of the SQL
d0d0: 20 61 6e 64 20 74 68 65 20 61 6d 6f 75 6e 74 20   and the amount 
d0e0: 6f 66 20 65 6c 61 70 73 65 20 74 69 6d 65 20 61  of elapse time a
d0f0: 72 65 0a 20 20 2a 2a 20 61 70 70 65 6e 64 65 64  re.  ** appended
d100: 20 74 6f 20 43 41 4c 4c 42 41 43 4b 20 62 65 66   to CALLBACK bef
d110: 6f 72 65 20 74 68 65 20 73 63 72 69 70 74 20 69  ore the script i
d120: 73 20 72 75 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61  s run..  */.  ca
d130: 73 65 20 44 42 5f 50 52 4f 46 49 4c 45 3a 20 7b  se DB_PROFILE: {
d140: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20  .    if( objc>3 
d150: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
d160: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
d170: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c  , 2, objv, "?CAL
d180: 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20  LBACK?");.      
d190: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
d1a0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
d1b0: 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20  objc==2 ){.     
d1c0: 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69   if( pDb->zProfi
d1d0: 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  le ){.        Tc
d1e0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
d1f0: 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 50 72 6f  nterp, pDb->zPro
d200: 66 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  file, 0);.      
d210: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
d220: 20 20 20 63 68 61 72 20 2a 7a 50 72 6f 66 69 6c     char *zProfil
d230: 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  e;.      int len
d240: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  ;.      if( pDb-
d250: 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20  >zProfile ){.   
d260: 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44       Tcl_Free(pD
d270: 62 2d 3e 7a 50 72 6f 66 69 6c 65 29 3b 0a 20 20  b->zProfile);.  
d280: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 50 72 6f      }.      zPro
d290: 66 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  file = Tcl_GetSt
d2a0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
d2b0: 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20  [2], &len);.    
d2c0: 20 20 69 66 28 20 7a 50 72 6f 66 69 6c 65 20 26    if( zProfile &
d2d0: 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20  & len>0 ){.     
d2e0: 20 20 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65     pDb->zProfile
d2f0: 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65   = Tcl_Alloc( le
d300: 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20  n + 1 );.       
d310: 20 73 74 72 63 70 79 28 70 44 62 2d 3e 7a 50 72   strcpy(pDb->zPr
d320: 6f 66 69 6c 65 2c 20 7a 50 72 6f 66 69 6c 65 29  ofile, zProfile)
d330: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
d340: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f         pDb->zPro
d350: 66 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  file = 0;.      
d360: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
d370: 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20 20 20  _OMIT_TRACE.    
d380: 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66    if( pDb->zProf
d390: 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ile ){.        p
d3a0: 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74  Db->interp = int
d3b0: 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  erp;.        sql
d3c0: 69 74 65 33 5f 70 72 6f 66 69 6c 65 28 70 44 62  ite3_profile(pDb
d3d0: 2d 3e 64 62 2c 20 44 62 50 72 6f 66 69 6c 65 48  ->db, DbProfileH
d3e0: 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20  andler, pDb);.  
d3f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d400: 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 66 69     sqlite3_profi
d410: 6c 65 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30  le(pDb->db, 0, 0
d420: 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
d430: 66 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  f.    }.    brea
d440: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
d450: 2a 20 20 20 20 20 24 64 62 20 72 65 6b 65 79 20  *     $db rekey 
d460: 4b 45 59 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 68  KEY.  **.  ** Ch
d470: 61 6e 67 65 20 74 68 65 20 65 6e 63 72 79 70 74  ange the encrypt
d480: 69 6f 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 63  ion key on the c
d490: 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20 64 61  urrently open da
d4a0: 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63  tabase..  */.  c
d4b0: 61 73 65 20 44 42 5f 52 45 4b 45 59 3a 20 7b 0a  ase DB_REKEY: {.
d4c0: 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20      int nKey;.  
d4d0: 20 20 76 6f 69 64 20 2a 70 4b 65 79 3b 0a 20 20    void *pKey;.  
d4e0: 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
d4f0: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
d500: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
d510: 32 2c 20 6f 62 6a 76 2c 20 22 4b 45 59 22 29 3b  2, objv, "KEY");
d520: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
d530: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
d540: 20 20 20 70 4b 65 79 20 3d 20 54 63 6c 5f 47 65     pKey = Tcl_Ge
d550: 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62  tByteArrayFromOb
d560: 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6e 4b 65 79  j(objv[2], &nKey
d570: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
d580: 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 72  _HAS_CODEC.    r
d590: 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 6b 65  c = sqlite3_reke
d5a0: 79 28 70 44 62 2d 3e 64 62 2c 20 70 4b 65 79 2c  y(pDb->db, pKey,
d5b0: 20 6e 4b 65 79 29 3b 0a 20 20 20 20 69 66 28 20   nKey);.    if( 
d5c0: 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  rc ){.      Tcl_
d5d0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
d5e0: 65 72 70 2c 20 73 71 6c 69 74 65 33 45 72 72 53  erp, sqlite3ErrS
d5f0: 74 72 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20  tr(rc), 0);.    
d600: 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52    rc = TCL_ERROR
d610: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
d620: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
d630: 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62   /*.  **     $db
d640: 20 74 69 6d 65 6f 75 74 20 4d 49 4c 4c 45 53 45   timeout MILLESE
d650: 43 4f 4e 44 53 0a 20 20 2a 2a 0a 20 20 2a 2a 20  CONDS.  **.  ** 
d660: 44 65 6c 61 79 20 66 6f 72 20 74 68 65 20 6e 75  Delay for the nu
d670: 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63  mber of millisec
d680: 6f 6e 64 73 20 73 70 65 63 69 66 69 65 64 20 77  onds specified w
d690: 68 65 6e 20 61 20 66 69 6c 65 20 69 73 20 6c 6f  hen a file is lo
d6a0: 63 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  cked..  */.  cas
d6b0: 65 20 44 42 5f 54 49 4d 45 4f 55 54 3a 20 7b 0a  e DB_TIMEOUT: {.
d6c0: 20 20 20 20 69 6e 74 20 6d 73 3b 0a 20 20 20 20      int ms;.    
d6d0: 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
d6e0: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
d6f0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
d700: 20 6f 62 6a 76 2c 20 22 4d 49 4c 4c 49 53 45 43   objv, "MILLISEC
d710: 4f 4e 44 53 22 29 3b 0a 20 20 20 20 20 20 72 65  ONDS");.      re
d720: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
d730: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 54 63      }.    if( Tc
d740: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
d750: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
d760: 20 26 6d 73 29 20 29 20 72 65 74 75 72 6e 20 54   &ms) ) return T
d770: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71  CL_ERROR;.    sq
d780: 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f  lite3_busy_timeo
d790: 75 74 28 70 44 62 2d 3e 64 62 2c 20 6d 73 29 3b  ut(pDb->db, ms);
d7a0: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
d7b0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24  .  /*.  **     $
d7c0: 64 62 20 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d  db soft_heap_lim
d7d0: 69 74 20 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53  it N.  **.  ** S
d7e0: 65 74 20 74 68 65 20 73 6f 66 74 2d 68 65 61 70  et the soft-heap
d7f0: 2d 6c 69 6d 69 74 20 66 6f 72 20 74 68 69 73 20  -limit for this 
d800: 74 68 72 65 61 64 2e 20 4e 6f 74 65 20 74 68 61  thread. Note tha
d810: 74 20 74 68 65 20 6c 69 6d 69 74 20 69 73 20 0a  t the limit is .
d820: 20 20 2a 2a 20 70 65 72 2d 74 68 72 65 61 64 2c    ** per-thread,
d830: 20 6e 6f 74 20 70 65 72 2d 64 61 74 61 62 61 73   not per-databas
d840: 65 2e 20 54 68 65 20 70 72 65 76 69 6f 75 73 20  e. The previous 
d850: 6c 69 6d 69 74 20 69 73 20 72 65 74 75 72 6e 65  limit is returne
d860: 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  d..  */.  case D
d870: 42 5f 53 4f 46 54 5f 48 45 41 50 5f 4c 49 4d 49  B_SOFT_HEAP_LIMI
d880: 54 3a 20 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  T: {.#ifndef SQL
d890: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 5f  ITE_OMIT_MEMORY_
d8a0: 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 20 20 69  MANAGEMENT.    i
d8b0: 6e 74 20 6e 3b 0a 20 20 20 20 69 6e 74 20 72 65  nt n;.    int re
d8c0: 74 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  t;.    if( objc!
d8d0: 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =3 ){.      Tcl_
d8e0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
d8f0: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 42  erp, 2, objv, "B
d900: 59 54 45 53 22 29 3b 0a 20 20 20 20 20 20 72 65  YTES");.      re
d910: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
d920: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 54 63      }.    if( Tc
d930: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
d940: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
d950: 20 26 6e 29 20 29 7b 0a 20 20 20 20 20 20 72 65   &n) ){.      re
d960: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
d970: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 20 3d 20      }.    ret = 
d980: 73 71 6c 69 74 65 33 54 73 64 28 29 2d 3e 6e 53  sqlite3Tsd()->nS
d990: 6f 66 74 48 65 61 70 4c 69 6d 69 74 3b 0a 20 20  oftHeapLimit;.  
d9a0: 20 20 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68    sqlite3_soft_h
d9b0: 65 61 70 5f 6c 69 6d 69 74 28 6e 29 3b 0a 20 20  eap_limit(n);.  
d9c0: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
d9d0: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
d9e0: 65 77 49 6e 74 4f 62 6a 28 72 65 74 29 29 3b 0a  ewIntObj(ret));.
d9f0: 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b  #endif.    break
da00: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
da10: 20 20 20 20 20 24 64 62 20 72 65 6c 65 61 73 65       $db release
da20: 5f 6d 65 6d 6f 72 79 20 3f 4e 3f 0a 20 20 2a 2a  _memory ?N?.  **
da30: 0a 20 20 2a 2a 20 54 72 79 20 74 6f 20 72 65 6c  .  ** Try to rel
da40: 65 61 73 65 20 6d 65 6d 6f 72 79 20 63 75 72 72  ease memory curr
da50: 65 6e 74 6c 79 20 68 65 6c 64 20 28 62 75 74 20  ently held (but 
da60: 6e 6f 74 20 72 65 61 6c 6c 79 20 72 65 71 75 69  not really requi
da70: 72 65 64 29 20 62 79 20 0a 20 20 2a 2a 20 53 51  red) by .  ** SQ
da80: 4c 69 74 65 20 64 61 74 61 62 61 73 65 20 63 6f  Lite database co
da90: 6e 6e 65 63 74 69 6f 6e 73 20 6f 70 65 6e 65 64  nnections opened
daa0: 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20   by the current 
dab0: 74 68 72 65 61 64 2e 20 49 66 20 61 6e 0a 20 20  thread. If an.  
dac0: 2a 2a 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d  ** integer argum
dad0: 65 6e 74 20 69 73 20 73 75 70 70 6c 69 65 64 2c  ent is supplied,
dae0: 20 74 68 65 6e 20 53 51 4c 69 74 65 20 73 74 6f   then SQLite sto
daf0: 70 73 20 74 72 79 69 6e 67 20 74 6f 20 66 72 65  ps trying to fre
db00: 65 20 6d 65 6d 6f 72 79 0a 20 20 2a 2a 20 61 66  e memory.  ** af
db10: 74 65 72 20 4e 20 62 79 74 65 73 20 68 61 76 65  ter N bytes have
db20: 20 62 65 65 6e 20 66 72 65 65 64 2e 0a 20 20 2a   been freed..  *
db30: 2a 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65  *.  ** The value
db40: 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65   returned is the
db50: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
db60: 20 61 63 74 75 61 6c 6c 79 20 66 72 65 65 64 2e   actually freed.
db70: 0a 20 20 2a 2a 2f 0a 20 20 63 61 73 65 20 44 42  .  **/.  case DB
db80: 5f 52 45 4c 45 41 53 45 5f 4d 45 4d 4f 52 59 3a  _RELEASE_MEMORY:
db90: 20 7b 0a 20 20 20 20 69 6e 74 20 6e 52 65 6c 65   {.    int nRele
dba0: 61 73 65 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ase = 0;.    int
dbb0: 20 4e 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28   N = -1;.    if(
dbc0: 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63   objc!=2 && objc
dbd0: 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=3 ){.      Tcl
dbe0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
dbf0: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
dc00: 3f 4e 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74  ?N?");.      ret
dc10: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
dc20: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
dc30: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 5f  ITE_OMIT_MEMORY_
dc40: 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 20 20 69  MANAGEMENT.    i
dc50: 66 28 20 6f 62 6a 63 3d 3d 33 20 26 26 20 54 43  f( objc==3 && TC
dc60: 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 74  L_OK!=Tcl_GetInt
dc70: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
dc80: 6f 62 6a 76 5b 32 5d 2c 20 26 4e 29 20 29 7b 0a  objv[2], &N) ){.
dc90: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
dca0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
dcb0: 20 20 6e 52 65 6c 65 61 73 65 20 3d 20 73 71 6c    nRelease = sql
dcc0: 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d  ite3_release_mem
dcd0: 6f 72 79 28 4e 29 3b 0a 23 65 6e 64 69 66 0a 20  ory(N);.#endif. 
dce0: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
dcf0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
dd00: 4e 65 77 49 6e 74 4f 62 6a 28 6e 52 65 6c 65 61  NewIntObj(nRelea
dd10: 73 65 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  se));.    break;
dd20: 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a  .  }.  .  /*.  *
dd30: 2a 20 20 20 20 20 24 64 62 20 74 6f 74 61 6c 5f  *     $db total_
dd40: 63 68 61 6e 67 65 73 0a 20 20 2a 2a 0a 20 20 2a  changes.  **.  *
dd50: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
dd60: 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74  ber of rows that
dd70: 20 77 65 72 65 20 6d 6f 64 69 66 69 65 64 2c 20   were modified, 
dd80: 69 6e 73 65 72 74 65 64 2c 20 6f 72 20 64 65 6c  inserted, or del
dd90: 65 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65  eted .  ** since
dda0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
ddb0: 6e 64 6c 65 20 77 61 73 20 63 72 65 61 74 65 64  ndle was created
ddc0: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
ddd0: 5f 54 4f 54 41 4c 5f 43 48 41 4e 47 45 53 3a 20  _TOTAL_CHANGES: 
dde0: 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  {.    Tcl_Obj *p
ddf0: 52 65 73 75 6c 74 3b 0a 20 20 20 20 69 66 28 20  Result;.    if( 
de00: 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 20  objc!=2 ){.     
de10: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
de20: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
de30: 76 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 72 65  v, "");.      re
de40: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
de50: 20 20 20 20 7d 0a 20 20 20 20 70 52 65 73 75 6c      }.    pResul
de60: 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65  t = Tcl_GetObjRe
de70: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  sult(interp);.  
de80: 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f 62 6a 28    Tcl_SetIntObj(
de90: 70 52 65 73 75 6c 74 2c 20 73 71 6c 69 74 65 33  pResult, sqlite3
dea0: 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 70  _total_changes(p
deb0: 44 62 2d 3e 64 62 29 29 3b 0a 20 20 20 20 62 72  Db->db));.    br
dec0: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
ded0: 20 20 24 64 62 20 74 72 61 63 65 20 3f 43 41 4c    $db trace ?CAL
dee0: 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a  LBACK?.  **.  **
def0: 20 4d 61 6b 65 20 61 72 72 61 6e 67 65 6d 65 6e   Make arrangemen
df00: 74 73 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65  ts to invoke the
df10: 20 43 41 4c 4c 42 41 43 4b 20 72 6f 75 74 69 6e   CALLBACK routin
df20: 65 20 66 6f 72 20 65 61 63 68 20 53 51 4c 20 73  e for each SQL s
df30: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68  tatement.  ** th
df40: 61 74 20 69 73 20 65 78 65 63 75 74 65 64 2e 20  at is executed. 
df50: 20 54 68 65 20 74 65 78 74 20 6f 66 20 74 68 65   The text of the
df60: 20 53 51 4c 20 69 73 20 61 70 70 65 6e 64 65 64   SQL is appended
df70: 20 74 6f 20 43 41 4c 4c 42 41 43 4b 20 62 65 66   to CALLBACK bef
df80: 6f 72 65 0a 20 20 2a 2a 20 69 74 20 69 73 20 65  ore.  ** it is e
df90: 78 65 63 75 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  xecuted..  */.  
dfa0: 63 61 73 65 20 44 42 5f 54 52 41 43 45 3a 20 7b  case DB_TRACE: {
dfb0: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20  .    if( objc>3 
dfc0: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
dfd0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
dfe0: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c  , 2, objv, "?CAL
dff0: 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20  LBACK?");.      
e000: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
e010: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
e020: 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20  objc==2 ){.     
e030: 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65   if( pDb->zTrace
e040: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
e050: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
e060: 65 72 70 2c 20 70 44 62 2d 3e 7a 54 72 61 63 65  erp, pDb->zTrace
e070: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
e080: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
e090: 68 61 72 20 2a 7a 54 72 61 63 65 3b 0a 20 20 20  har *zTrace;.   
e0a0: 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
e0b0: 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63    if( pDb->zTrac
e0c0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  e ){.        Tcl
e0d0: 5f 46 72 65 65 28 70 44 62 2d 3e 7a 54 72 61 63  _Free(pDb->zTrac
e0e0: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
e0f0: 20 20 7a 54 72 61 63 65 20 3d 20 54 63 6c 5f 47    zTrace = Tcl_G
e100: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
e110: 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a  objv[2], &len);.
e120: 20 20 20 20 20 20 69 66 28 20 7a 54 72 61 63 65        if( zTrace
e130: 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20   && len>0 ){.   
e140: 20 20 20 20 20 70 44 62 2d 3e 7a 54 72 61 63 65       pDb->zTrace
e150: 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65   = Tcl_Alloc( le
e160: 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20  n + 1 );.       
e170: 20 73 74 72 63 70 79 28 70 44 62 2d 3e 7a 54 72   strcpy(pDb->zTr
e180: 61 63 65 2c 20 7a 54 72 61 63 65 29 3b 0a 20 20  ace, zTrace);.  
e190: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e1a0: 20 20 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 3d     pDb->zTrace =
e1b0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e   0;.      }.#ifn
e1c0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e1d0: 54 52 41 43 45 0a 20 20 20 20 20 20 69 66 28 20  TRACE.      if( 
e1e0: 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20  pDb->zTrace ){. 
e1f0: 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65         pDb->inte
e200: 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20  rp = interp;.   
e210: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 72 61       sqlite3_tra
e220: 63 65 28 70 44 62 2d 3e 64 62 2c 20 44 62 54 72  ce(pDb->db, DbTr
e230: 61 63 65 48 61 6e 64 6c 65 72 2c 20 70 44 62 29  aceHandler, pDb)
e240: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
e250: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74         sqlite3_t
e260: 72 61 63 65 28 70 44 62 2d 3e 64 62 2c 20 30 2c  race(pDb->db, 0,
e270: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e   0);.      }.#en
e280: 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 62 72  dif.    }.    br
e290: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
e2a0: 20 20 24 64 62 20 74 72 61 6e 73 61 63 74 69 6f    $db transactio
e2b0: 6e 20 5b 2d 64 65 66 65 72 72 65 64 7c 2d 69 6d  n [-deferred|-im
e2c0: 6d 65 64 69 61 74 65 7c 2d 65 78 63 6c 75 73 69  mediate|-exclusi
e2d0: 76 65 5d 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a  ve] SCRIPT.  **.
e2e0: 20 20 2a 2a 20 53 74 61 72 74 20 61 20 6e 65 77    ** Start a new
e2f0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 66   transaction (if
e300: 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65   we are not alre
e310: 61 64 79 20 69 6e 20 74 68 65 20 6d 69 64 73 74  ady in the midst
e320: 20 6f 66 20 61 0a 20 20 2a 2a 20 74 72 61 6e 73   of a.  ** trans
e330: 61 63 74 69 6f 6e 29 20 61 6e 64 20 65 78 65 63  action) and exec
e340: 75 74 65 20 74 68 65 20 54 43 4c 20 73 63 72 69  ute the TCL scri
e350: 70 74 20 53 43 52 49 50 54 2e 20 20 41 66 74 65  pt SCRIPT.  Afte
e360: 72 20 53 43 52 49 50 54 0a 20 20 2a 2a 20 63 6f  r SCRIPT.  ** co
e370: 6d 70 6c 65 74 65 73 2c 20 65 69 74 68 65 72 20  mpletes, either 
e380: 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  commit the trans
e390: 61 63 74 69 6f 6e 20 6f 72 20 72 6f 6c 6c 20 69  action or roll i
e3a0: 74 20 62 61 63 6b 20 69 66 20 53 43 52 49 50 54  t back if SCRIPT
e3b0: 0a 20 20 2a 2a 20 74 68 72 6f 77 73 20 61 6e 20  .  ** throws an 
e3c0: 65 78 63 65 70 74 69 6f 6e 2e 20 20 4f 72 20 69  exception.  Or i
e3d0: 66 20 6e 6f 20 6e 65 77 20 74 72 61 6e 73 61 74  f no new transat
e3e0: 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64 2c  ion was started,
e3f0: 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 20 20 2a   do nothing..  *
e400: 2a 20 70 61 73 73 20 74 68 65 20 65 78 63 65 70  * pass the excep
e410: 74 69 6f 6e 20 6f 6e 20 75 70 20 74 68 65 20 73  tion on up the s
e420: 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  tack..  **.  ** 
e430: 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 77 61 73  This command was
e440: 20 69 6e 73 70 69 72 65 64 20 62 79 20 44 61 76   inspired by Dav
e450: 65 20 54 68 6f 6d 61 73 27 73 20 74 61 6c 6b 20  e Thomas's talk 
e460: 6f 6e 20 52 75 62 79 20 61 74 20 74 68 65 0a 20  on Ruby at the. 
e470: 20 2a 2a 20 32 30 30 35 20 4f 27 52 65 69 6c 6c   ** 2005 O'Reill
e480: 79 20 4f 70 65 6e 20 53 6f 75 72 63 65 20 43 6f  y Open Source Co
e490: 6e 76 65 6e 74 69 6f 6e 20 28 4f 53 43 4f 4e 29  nvention (OSCON)
e4a0: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
e4b0: 5f 54 52 41 4e 53 41 43 54 49 4f 4e 3a 20 7b 0a  _TRANSACTION: {.
e4c0: 20 20 20 20 69 6e 74 20 69 6e 54 72 61 6e 73 3b      int inTrans;
e4d0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53  .    Tcl_Obj *pS
e4e0: 63 72 69 70 74 3b 0a 20 20 20 20 63 6f 6e 73 74  cript;.    const
e4f0: 20 63 68 61 72 20 2a 7a 42 65 67 69 6e 20 3d 20   char *zBegin = 
e500: 22 42 45 47 49 4e 22 3b 0a 20 20 20 20 69 66 28  "BEGIN";.    if(
e510: 20 6f 62 6a 63 21 3d 33 20 26 26 20 6f 62 6a 63   objc!=3 && objc
e520: 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=4 ){.      Tcl
e530: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
e540: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
e550: 5b 54 59 50 45 5d 20 53 43 52 49 50 54 22 29 3b  [TYPE] SCRIPT");
e560: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
e570: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
e580: 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29     if( objc==3 )
e590: 7b 0a 20 20 20 20 20 20 70 53 63 72 69 70 74 20  {.      pScript 
e5a0: 3d 20 6f 62 6a 76 5b 32 5d 3b 0a 20 20 20 20 7d  = objv[2];.    }
e5b0: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 73 74   else {.      st
e5c0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
e5d0: 2a 54 54 59 50 45 5f 73 74 72 73 5b 5d 20 3d 20  *TTYPE_strs[] = 
e5e0: 7b 0a 20 20 20 20 20 20 20 20 22 64 65 66 65 72  {.        "defer
e5f0: 72 65 64 22 2c 20 20 20 22 65 78 63 6c 75 73 69  red",   "exclusi
e600: 76 65 22 2c 20 20 22 69 6d 6d 65 64 69 61 74 65  ve",  "immediate
e610: 22 2c 20 30 0a 20 20 20 20 20 20 7d 3b 0a 20 20  ", 0.      };.  
e620: 20 20 20 20 65 6e 75 6d 20 54 54 59 50 45 5f 65      enum TTYPE_e
e630: 6e 75 6d 20 7b 0a 20 20 20 20 20 20 20 20 54 54  num {.        TT
e640: 59 50 45 5f 44 45 46 45 52 52 45 44 2c 20 54 54  YPE_DEFERRED, TT
e650: 59 50 45 5f 45 58 43 4c 55 53 49 56 45 2c 20 54  YPE_EXCLUSIVE, T
e660: 54 59 50 45 5f 49 4d 4d 45 44 49 41 54 45 0a 20  TYPE_IMMEDIATE. 
e670: 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 69 6e       };.      in
e680: 74 20 74 74 79 70 65 3b 0a 20 20 20 20 20 20 69  t ttype;.      i
e690: 66 28 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46  f( Tcl_GetIndexF
e6a0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
e6b0: 62 6a 76 5b 32 5d 2c 20 54 54 59 50 45 5f 73 74  bjv[2], TTYPE_st
e6c0: 72 73 2c 20 22 74 72 61 6e 73 61 63 74 69 6f 6e  rs, "transaction
e6d0: 20 74 79 70 65 22 2c 0a 20 20 20 20 20 20 20 20   type",.        
e6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6f0: 20 20 20 20 20 20 30 2c 20 26 74 74 79 70 65 29        0, &ttype)
e700: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
e710: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
e720: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 77 69 74      }.      swit
e730: 63 68 28 20 28 65 6e 75 6d 20 54 54 59 50 45 5f  ch( (enum TTYPE_
e740: 65 6e 75 6d 29 74 74 79 70 65 20 29 7b 0a 20 20  enum)ttype ){.  
e750: 20 20 20 20 20 20 63 61 73 65 20 54 54 59 50 45        case TTYPE
e760: 5f 44 45 46 45 52 52 45 44 3a 20 20 20 20 2f 2a  _DEFERRED:    /*
e770: 20 6e 6f 2d 6f 70 20 2a 2f 3b 20 20 20 20 20 20   no-op */;      
e780: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
e790: 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 54  ;.        case T
e7a0: 54 59 50 45 5f 45 58 43 4c 55 53 49 56 45 3a 20  TYPE_EXCLUSIVE: 
e7b0: 20 20 7a 42 65 67 69 6e 20 3d 20 22 42 45 47 49    zBegin = "BEGI
e7c0: 4e 20 45 58 43 4c 55 53 49 56 45 22 3b 20 20 62  N EXCLUSIVE";  b
e7d0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
e7e0: 73 65 20 54 54 59 50 45 5f 49 4d 4d 45 44 49 41  se TTYPE_IMMEDIA
e7f0: 54 45 3a 20 20 20 7a 42 65 67 69 6e 20 3d 20 22  TE:   zBegin = "
e800: 42 45 47 49 4e 20 49 4d 4d 45 44 49 41 54 45 22  BEGIN IMMEDIATE"
e810: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  ;  break;.      
e820: 7d 0a 20 20 20 20 20 20 70 53 63 72 69 70 74 20  }.      pScript 
e830: 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20 20 7d  = objv[3];.    }
e840: 0a 20 20 20 20 69 6e 54 72 61 6e 73 20 3d 20 21  .    inTrans = !
e850: 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f  sqlite3_get_auto
e860: 63 6f 6d 6d 69 74 28 70 44 62 2d 3e 64 62 29 3b  commit(pDb->db);
e870: 0a 20 20 20 20 69 66 28 20 21 69 6e 54 72 61 6e  .    if( !inTran
e880: 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  s ){.      sqlit
e890: 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62 2c  e3_exec(pDb->db,
e8a0: 20 7a 42 65 67 69 6e 2c 20 30 2c 20 30 2c 20 30   zBegin, 0, 0, 0
e8b0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  );.    }.    rc 
e8c0: 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28  = Tcl_EvalObjEx(
e8d0: 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c  interp, pScript,
e8e0: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 21 69 6e   0);.    if( !in
e8f0: 54 72 61 6e 73 20 29 7b 0a 20 20 20 20 20 20 63  Trans ){.      c
e900: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e 64 3b  onst char *zEnd;
e910: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 54  .      if( rc==T
e920: 43 4c 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20  CL_ERROR ){.    
e930: 20 20 20 20 7a 45 6e 64 20 3d 20 22 52 4f 4c 4c      zEnd = "ROLL
e940: 42 41 43 4b 22 3b 0a 20 20 20 20 20 20 7d 20 65  BACK";.      } e
e950: 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 7a 45  lse {.        zE
e960: 6e 64 20 3d 20 22 43 4f 4d 4d 49 54 22 3b 0a 20  nd = "COMMIT";. 
e970: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
e980: 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64  ite3_exec(pDb->d
e990: 62 2c 20 7a 45 6e 64 2c 20 30 2c 20 30 2c 20 30  b, zEnd, 0, 0, 0
e9a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65  );.    }.    bre
e9b0: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
e9c0: 2a 2a 20 20 20 20 24 64 62 20 75 70 64 61 74 65  **    $db update
e9d0: 5f 68 6f 6f 6b 20 3f 73 63 72 69 70 74 3f 0a 20  _hook ?script?. 
e9e0: 20 2a 2a 20 20 20 20 24 64 62 20 72 6f 6c 6c 62   **    $db rollb
e9f0: 61 63 6b 5f 68 6f 6f 6b 20 3f 73 63 72 69 70 74  ack_hook ?script
ea00: 3f 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ?.  */.  case DB
ea10: 5f 55 50 44 41 54 45 5f 48 4f 4f 4b 3a 20 0a 20  _UPDATE_HOOK: . 
ea20: 20 63 61 73 65 20 44 42 5f 52 4f 4c 4c 42 41 43   case DB_ROLLBAC
ea30: 4b 5f 48 4f 4f 4b 3a 20 7b 0a 0a 20 20 20 20 2f  K_HOOK: {..    /
ea40: 2a 20 73 65 74 20 70 70 48 6f 6f 6b 20 74 6f 20  * set ppHook to 
ea50: 70 6f 69 6e 74 20 61 74 20 70 55 70 64 61 74 65  point at pUpdate
ea60: 48 6f 6f 6b 20 6f 72 20 70 52 6f 6c 6c 62 61 63  Hook or pRollbac
ea70: 6b 48 6f 6f 6b 2c 20 64 65 70 65 6e 64 69 6e 67  kHook, depending
ea80: 20 6f 6e 20 0a 20 20 20 20 2a 2a 20 77 68 65 74   on .    ** whet
ea90: 68 65 72 20 5b 24 64 62 20 75 70 64 61 74 65 5f  her [$db update_
eaa0: 68 6f 6f 6b 5d 20 6f 72 20 5b 24 64 62 20 72 6f  hook] or [$db ro
eab0: 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 5d 20 77 61 73  llback_hook] was
eac0: 20 69 6e 76 6f 6b 65 64 2e 0a 20 20 20 20 2a 2f   invoked..    */
ead0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 70  .    Tcl_Obj **p
eae0: 70 48 6f 6f 6b 3b 20 0a 20 20 20 20 69 66 28 20  pHook; .    if( 
eaf0: 63 68 6f 69 63 65 3d 3d 44 42 5f 55 50 44 41 54  choice==DB_UPDAT
eb00: 45 5f 48 4f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  E_HOOK ){.      
eb10: 70 70 48 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e 70  ppHook = &pDb->p
eb20: 55 70 64 61 74 65 48 6f 6f 6b 3b 0a 20 20 20 20  UpdateHook;.    
eb30: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 48  }else{.      ppH
eb40: 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e 70 52 6f 6c  ook = &pDb->pRol
eb50: 6c 62 61 63 6b 48 6f 6f 6b 3b 0a 20 20 20 20 7d  lbackHook;.    }
eb60: 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ..    if( objc!=
eb70: 32 20 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a  2 && objc!=3 ){.
eb80: 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67         Tcl_Wrong
eb90: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
eba0: 32 2c 20 6f 62 6a 76 2c 20 22 3f 53 43 52 49 50  2, objv, "?SCRIP
ebb0: 54 3f 22 29 3b 0a 20 20 20 20 20 20 20 72 65 74  T?");.       ret
ebc0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
ebd0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 2a 70 70     }.    if( *pp
ebe0: 48 6f 6f 6b 20 29 7b 0a 20 20 20 20 20 20 54 63  Hook ){.      Tc
ebf0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
ec00: 6e 74 65 72 70 2c 20 2a 70 70 48 6f 6f 6b 29 3b  nterp, *ppHook);
ec10: 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 3d  .      if( objc=
ec20: 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  =3 ){.        Tc
ec30: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 2a  l_DecrRefCount(*
ec40: 70 70 48 6f 6f 6b 29 3b 0a 20 20 20 20 20 20 20  ppHook);.       
ec50: 20 2a 70 70 48 6f 6f 6b 20 3d 20 30 3b 0a 20 20   *ppHook = 0;.  
ec60: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
ec70: 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20  if( objc==3 ){. 
ec80: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 28 2a       assert( !(*
ec90: 70 70 48 6f 6f 6b 29 20 29 3b 0a 20 20 20 20 20  ppHook) );.     
eca0: 20 69 66 28 20 54 63 6c 5f 47 65 74 43 68 61 72   if( Tcl_GetChar
ecb0: 4c 65 6e 67 74 68 28 6f 62 6a 76 5b 32 5d 29 3e  Length(objv[2])>
ecc0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 70  0 ){.        *pp
ecd0: 48 6f 6f 6b 20 3d 20 6f 62 6a 76 5b 32 5d 3b 0a  Hook = objv[2];.
ece0: 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72          Tcl_Incr
ecf0: 52 65 66 43 6f 75 6e 74 28 2a 70 70 48 6f 6f 6b  RefCount(*ppHook
ed00: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
ed10: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 75 70  ..    sqlite3_up
ed20: 64 61 74 65 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64  date_hook(pDb->d
ed30: 62 2c 20 28 70 44 62 2d 3e 70 55 70 64 61 74 65  b, (pDb->pUpdate
ed40: 48 6f 6f 6b 3f 44 62 55 70 64 61 74 65 48 61 6e  Hook?DbUpdateHan
ed50: 64 6c 65 72 3a 30 29 2c 20 70 44 62 29 3b 0a 20  dler:0), pDb);. 
ed60: 20 20 20 73 71 6c 69 74 65 33 5f 72 6f 6c 6c 62     sqlite3_rollb
ed70: 61 63 6b 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62  ack_hook(pDb->db
ed80: 2c 28 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b  ,(pDb->pRollback
ed90: 48 6f 6f 6b 3f 44 62 52 6f 6c 6c 62 61 63 6b 48  Hook?DbRollbackH
eda0: 61 6e 64 6c 65 72 3a 30 29 2c 70 44 62 29 3b 0a  andler:0),pDb);.
edb0: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
edc0: 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 76 65 72  .  /*    $db ver
edd0: 73 69 6f 6e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52  sion.  **.  ** R
ede0: 65 74 75 72 6e 20 74 68 65 20 76 65 72 73 69 6f  eturn the versio
edf0: 6e 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68 69  n string for thi
ee00: 73 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  s database..  */
ee10: 0a 20 20 63 61 73 65 20 44 42 5f 56 45 52 53 49  .  case DB_VERSI
ee20: 4f 4e 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 53 65  ON: {.    Tcl_Se
ee30: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
ee40: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
ee50: 6c 69 62 76 65 72 73 69 6f 6e 28 29 2c 20 54 43  libversion(), TC
ee60: 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 62  L_STATIC);.    b
ee70: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 7d 20  reak;.  }...  } 
ee80: 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 53 57  /* End of the SW
ee90: 49 54 43 48 20 73 74 61 74 65 6d 65 6e 74 20 2a  ITCH statement *
eea0: 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  /.  return rc;.}
eeb0: 0a 0a 2f 2a 0a 2a 2a 20 20 20 73 71 6c 69 74 65  ../*.**   sqlite
eec0: 33 20 44 42 4e 41 4d 45 20 46 49 4c 45 4e 41 4d  3 DBNAME FILENAM
eed0: 45 20 3f 4d 4f 44 45 3f 20 3f 2d 6b 65 79 20 4b  E ?MODE? ?-key K
eee0: 45 59 3f 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  EY?.**.** This i
eef0: 73 20 74 68 65 20 6d 61 69 6e 20 54 63 6c 20 63  s the main Tcl c
ef00: 6f 6d 6d 61 6e 64 2e 20 20 57 68 65 6e 20 74 68  ommand.  When th
ef10: 65 20 22 73 71 6c 69 74 65 22 20 54 63 6c 20 63  e "sqlite" Tcl c
ef20: 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 69 6e 76  ommand is.** inv
ef30: 6f 6b 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69  oked, this routi
ef40: 6e 65 20 72 75 6e 73 20 74 6f 20 70 72 6f 63 65  ne runs to proce
ef50: 73 73 20 74 68 61 74 20 63 6f 6d 6d 61 6e 64 2e  ss that command.
ef60: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
ef70: 20 61 72 67 75 6d 65 6e 74 2c 20 44 42 4e 41 4d   argument, DBNAM
ef80: 45 2c 20 69 73 20 61 6e 20 61 72 62 69 74 72 61  E, is an arbitra
ef90: 72 79 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65  ry name for a ne
efa0: 77 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f  w.** database co
efb0: 6e 6e 65 63 74 69 6f 6e 2e 20 20 54 68 69 73 20  nnection.  This 
efc0: 63 6f 6d 6d 61 6e 64 20 63 72 65 61 74 65 73 20  command creates 
efd0: 61 20 6e 65 77 20 63 6f 6d 6d 61 6e 64 20 6e 61  a new command na
efe0: 6d 65 64 0a 2a 2a 20 44 42 4e 41 4d 45 20 74 68  med.** DBNAME th
eff0: 61 74 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f  at is used to co
f000: 6e 74 72 6f 6c 20 74 68 61 74 20 63 6f 6e 6e 65  ntrol that conne
f010: 63 74 69 6f 6e 2e 20 20 54 68 65 20 64 61 74 61  ction.  The data
f020: 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  base.** connecti
f030: 6f 6e 20 69 73 20 64 65 6c 65 74 65 64 20 77 68  on is deleted wh
f040: 65 6e 20 74 68 65 20 44 42 4e 41 4d 45 20 63 6f  en the DBNAME co
f050: 6d 6d 61 6e 64 20 69 73 20 64 65 6c 65 74 65 64  mmand is deleted
f060: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f  ..**.** The seco
f070: 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  nd argument is t
f080: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
f090: 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f  irectory that co
f0a0: 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20 73 71  ntains.** the sq
f0b0: 6c 69 74 65 20 64 61 74 61 62 61 73 65 20 74 68  lite database th
f0c0: 61 74 20 69 73 20 74 6f 20 62 65 20 61 63 63 65  at is to be acce
f0d0: 73 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  ssed..**.** For 
f0e0: 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73  testing purposes
f0f0: 2c 20 77 65 20 61 6c 73 6f 20 73 75 70 70 6f 72  , we also suppor
f100: 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  t the following:
f110: 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69 74 65 33 20  .**.**  sqlite3 
f120: 2d 65 6e 63 6f 64 69 6e 67 0a 2a 2a 0a 2a 2a 20  -encoding.**.** 
f130: 20 20 20 20 20 20 52 65 74 75 72 6e 20 74 68 65        Return the
f140: 20 65 6e 63 6f 64 69 6e 67 20 75 73 65 64 20 62   encoding used b
f150: 79 20 4c 49 4b 45 20 61 6e 64 20 47 4c 4f 42 20  y LIKE and GLOB 
f160: 6f 70 65 72 61 74 6f 72 73 2e 20 20 43 68 6f 69  operators.  Choi
f170: 63 65 73 0a 2a 2a 20 20 20 20 20 20 20 61 72 65  ces.**       are
f180: 20 55 54 46 2d 38 20 61 6e 64 20 69 73 6f 38 38   UTF-8 and iso88
f190: 35 39 2e 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69 74  59..**.**  sqlit
f1a0: 65 33 20 2d 76 65 72 73 69 6f 6e 0a 2a 2a 0a 2a  e3 -version.**.*
f1b0: 2a 20 20 20 20 20 20 20 52 65 74 75 72 6e 20 74  *       Return t
f1c0: 68 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65  he version numbe
f1d0: 72 20 6f 66 20 74 68 65 20 53 51 4c 69 74 65 20  r of the SQLite 
f1e0: 6c 69 62 72 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 20  library..**.**  
f1f0: 73 71 6c 69 74 65 33 20 2d 74 63 6c 2d 75 73 65  sqlite3 -tcl-use
f200: 73 2d 75 74 66 0a 2a 2a 0a 2a 2a 20 20 20 20 20  s-utf.**.**     
f210: 20 20 52 65 74 75 72 6e 20 22 31 22 20 69 66 20    Return "1" if 
f220: 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 61 20  compiled with a 
f230: 54 63 6c 20 75 73 65 73 20 55 54 46 2d 38 2e 20  Tcl uses UTF-8. 
f240: 20 52 65 74 75 72 6e 20 22 30 22 20 69 66 0a 2a   Return "0" if.*
f250: 2a 20 20 20 20 20 20 20 6e 6f 74 2e 20 20 55 73  *       not.  Us
f260: 65 64 20 62 79 20 74 65 73 74 73 20 74 6f 20 6d  ed by tests to m
f270: 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 69 62  ake sure the lib
f280: 72 61 72 79 20 77 61 73 20 63 6f 6d 70 69 6c 65  rary was compile
f290: 64 20 0a 2a 2a 20 20 20 20 20 20 20 63 6f 72 72  d .**       corr
f2a0: 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ectly..*/.static
f2b0: 20 69 6e 74 20 44 62 4d 61 69 6e 28 76 6f 69 64   int DbMain(void
f2c0: 20 2a 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70   *cd, Tcl_Interp
f2d0: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62   *interp, int ob
f2e0: 6a 63 2c 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73  jc,Tcl_Obj *cons
f2f0: 74 2a 6f 62 6a 76 29 7b 0a 20 20 53 71 6c 69 74  t*objv){.  Sqlit
f300: 65 44 62 20 2a 70 3b 0a 20 20 76 6f 69 64 20 2a  eDb *p;.  void *
f310: 70 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20  pKey = 0;.  int 
f320: 6e 4b 65 79 20 3d 20 30 3b 0a 20 20 63 6f 6e 73  nKey = 0;.  cons
f330: 74 20 63 68 61 72 20 2a 7a 41 72 67 3b 0a 20 20  t char *zArg;.  
f340: 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 3b 0a 20  char *zErrMsg;. 
f350: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
f360: 6c 65 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b  le;.  char zBuf[
f370: 38 30 5d 3b 0a 20 20 69 66 28 20 6f 62 6a 63 3d  80];.  if( objc=
f380: 3d 32 20 29 7b 0a 20 20 20 20 7a 41 72 67 20 3d  =2 ){.    zArg =
f390: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
f3a0: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30  omObj(objv[1], 0
f3b0: 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  );.    if( strcm
f3c0: 70 28 7a 41 72 67 2c 22 2d 76 65 72 73 69 6f 6e  p(zArg,"-version
f3d0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54  ")==0 ){.      T
f3e0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
f3f0: 69 6e 74 65 72 70 2c 73 71 6c 69 74 65 33 5f 76  interp,sqlite3_v
f400: 65 72 73 69 6f 6e 2c 30 29 3b 0a 20 20 20 20 20  ersion,0);.     
f410: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
f420: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74      }.    if( st
f430: 72 63 6d 70 28 7a 41 72 67 2c 22 2d 68 61 73 2d  rcmp(zArg,"-has-
f440: 63 6f 64 65 63 22 29 3d 3d 30 20 29 7b 0a 23 69  codec")==0 ){.#i
f450: 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
f460: 43 4f 44 45 43 0a 20 20 20 20 20 20 54 63 6c 5f  CODEC.      Tcl_
f470: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
f480: 65 72 70 2c 22 31 22 2c 30 29 3b 0a 23 65 6c 73  erp,"1",0);.#els
f490: 65 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  e.      Tcl_Appe
f4a0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
f4b0: 22 30 22 2c 30 29 3b 0a 23 65 6e 64 69 66 0a 20  "0",0);.#endif. 
f4c0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
f4d0: 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OK;.    }.    if
f4e0: 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d  ( strcmp(zArg,"-
f4f0: 74 63 6c 2d 75 73 65 73 2d 75 74 66 22 29 3d 3d  tcl-uses-utf")==
f500: 30 20 29 7b 0a 23 69 66 64 65 66 20 54 43 4c 5f  0 ){.#ifdef TCL_
f510: 55 54 46 5f 4d 41 58 0a 20 20 20 20 20 20 54 63  UTF_MAX.      Tc
f520: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
f530: 6e 74 65 72 70 2c 22 31 22 2c 30 29 3b 0a 23 65  nterp,"1",0);.#e
f540: 6c 73 65 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  lse.      Tcl_Ap
f550: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
f560: 70 2c 22 30 22 2c 30 29 3b 0a 23 65 6e 64 69 66  p,"0",0);.#endif
f570: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
f580: 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  L_OK;.    }.  }.
f590: 20 20 69 66 28 20 6f 62 6a 63 3d 3d 35 20 7c 7c    if( objc==5 ||
f5a0: 20 6f 62 6a 63 3d 3d 36 20 29 7b 0a 20 20 20 20   objc==6 ){.    
f5b0: 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65 74 53 74  zArg = Tcl_GetSt
f5c0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
f5d0: 5b 6f 62 6a 63 2d 32 5d 2c 20 30 29 3b 0a 20 20  [objc-2], 0);.  
f5e0: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72    if( strcmp(zAr
f5f0: 67 2c 22 2d 6b 65 79 22 29 3d 3d 30 20 29 7b 0a  g,"-key")==0 ){.
f600: 20 20 20 20 20 20 70 4b 65 79 20 3d 20 54 63 6c        pKey = Tcl
f610: 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f  _GetByteArrayFro
f620: 6d 4f 62 6a 28 6f 62 6a 76 5b 6f 62 6a 63 2d 31  mObj(objv[objc-1
f630: 5d 2c 20 26 6e 4b 65 79 29 3b 0a 20 20 20 20 20  ], &nKey);.     
f640: 20 6f 62 6a 63 20 2d 3d 20 32 3b 0a 20 20 20 20   objc -= 2;.    
f650: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63  }.  }.  if( objc
f660: 21 3d 33 20 26 26 20 6f 62 6a 63 21 3d 34 20 29  !=3 && objc!=4 )
f670: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
f680: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
f690: 2c 20 6f 62 6a 76 2c 20 0a 23 69 66 64 65 66 20  , objv, .#ifdef 
f6a0: 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
f6b0: 0a 20 20 20 20 20 20 22 48 41 4e 44 4c 45 20 46  .      "HANDLE F
f6c0: 49 4c 45 4e 41 4d 45 20 3f 2d 6b 65 79 20 43 4f  ILENAME ?-key CO
f6d0: 44 45 43 2d 4b 45 59 3f 22 0a 23 65 6c 73 65 0a  DEC-KEY?".#else.
f6e0: 20 20 20 20 20 20 22 48 41 4e 44 4c 45 20 46 49        "HANDLE FI
f6f0: 4c 45 4e 41 4d 45 20 3f 4d 4f 44 45 3f 22 0a 23  LENAME ?MODE?".#
f700: 65 6e 64 69 66 0a 20 20 20 20 29 3b 0a 20 20 20  endif.    );.   
f710: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
f720: 52 3b 0a 20 20 7d 0a 20 20 7a 45 72 72 4d 73 67  R;.  }.  zErrMsg
f730: 20 3d 20 30 3b 0a 20 20 70 20 3d 20 28 53 71 6c   = 0;.  p = (Sql
f740: 69 74 65 44 62 2a 29 54 63 6c 5f 41 6c 6c 6f 63  iteDb*)Tcl_Alloc
f750: 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a  ( sizeof(*p) );.
f760: 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
f770: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
f780: 69 6e 74 65 72 70 2c 20 22 6d 61 6c 6c 6f 63 20  interp, "malloc 
f790: 66 61 69 6c 65 64 22 2c 20 54 43 4c 5f 53 54 41  failed", TCL_STA
f7a0: 54 49 43 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  TIC);.    return
f7b0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
f7c0: 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73    memset(p, 0, s
f7d0: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 7a 46  izeof(*p));.  zF
f7e0: 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ile = Tcl_GetStr
f7f0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
f800: 32 5d 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  2], 0);.  sqlite
f810: 33 5f 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 26 70  3_open(zFile, &p
f820: 2d 3e 64 62 29 3b 0a 20 20 69 66 28 20 53 51 4c  ->db);.  if( SQL
f830: 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f  ITE_OK!=sqlite3_
f840: 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29 20 29  errcode(p->db) )
f850: 7b 0a 20 20 20 20 7a 45 72 72 4d 73 67 20 3d 20  {.    zErrMsg = 
f860: 73 74 72 64 75 70 28 73 71 6c 69 74 65 33 5f 65  strdup(sqlite3_e
f870: 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20  rrmsg(p->db));. 
f880: 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
f890: 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 70 2d 3e  (p->db);.    p->
f8a0: 64 62 20 3d 20 30 3b 0a 20 20 7d 0a 23 69 66 64  db = 0;.  }.#ifd
f8b0: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
f8c0: 44 45 43 0a 20 20 73 71 6c 69 74 65 33 5f 6b 65  DEC.  sqlite3_ke
f8d0: 79 28 70 2d 3e 64 62 2c 20 70 4b 65 79 2c 20 6e  y(p->db, pKey, n
f8e0: 4b 65 79 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69  Key);.#endif.  i
f8f0: 66 28 20 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20  f( p->db==0 ){. 
f900: 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
f910: 28 69 6e 74 65 72 70 2c 20 7a 45 72 72 4d 73 67  (interp, zErrMsg
f920: 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b  , TCL_VOLATILE);
f930: 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63  .    Tcl_Free((c
f940: 68 61 72 2a 29 70 29 3b 0a 20 20 20 20 66 72 65  har*)p);.    fre
f950: 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  e(zErrMsg);.    
f960: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
f970: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 78 53 74  ;.  }.  p->maxSt
f980: 6d 74 20 3d 20 4e 55 4d 5f 50 52 45 50 41 52 45  mt = NUM_PREPARE
f990: 44 5f 53 54 4d 54 53 3b 0a 20 20 7a 41 72 67 20  D_STMTS;.  zArg 
f9a0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
f9b0: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20  romObj(objv[1], 
f9c0: 30 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65  0);.  Tcl_Create
f9d0: 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
f9e0: 70 2c 20 7a 41 72 67 2c 20 44 62 4f 62 6a 43 6d  p, zArg, DbObjCm
f9f0: 64 2c 20 28 63 68 61 72 2a 29 70 2c 20 44 62 44  d, (char*)p, DbD
fa00: 65 6c 65 74 65 43 6d 64 29 3b 0a 0a 20 20 2f 2a  eleteCmd);..  /*
fa10: 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
fa20: 65 20 69 73 20 74 68 65 20 76 61 6c 75 65 20 6f  e is the value o
fa30: 66 20 74 68 65 20 73 71 6c 69 74 65 2a 20 70 6f  f the sqlite* po
fa40: 69 6e 74 65 72 0a 20 20 2a 2f 0a 20 20 73 70 72  inter.  */.  spr
fa50: 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 70 22 2c  intf(zBuf, "%p",
fa60: 20 70 2d 3e 64 62 29 3b 0a 20 20 69 66 28 20 73   p->db);.  if( s
fa70: 74 72 6e 63 6d 70 28 7a 42 75 66 2c 22 30 78 22  trncmp(zBuf,"0x"
fa80: 2c 32 29 20 29 7b 0a 20 20 20 20 73 70 72 69 6e  ,2) ){.    sprin
fa90: 74 66 28 7a 42 75 66 2c 20 22 30 78 25 70 22 2c  tf(zBuf, "0x%p",
faa0: 20 70 2d 3e 64 62 29 3b 0a 20 20 7d 0a 20 20 54   p->db);.  }.  T
fab0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
fac0: 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29  interp, zBuf, 0)
fad0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6d 70 69  ;..  /* If compi
fae0: 6c 65 64 20 77 69 74 68 20 53 51 4c 49 54 45 5f  led with SQLITE_
faf0: 54 45 53 54 20 74 75 72 6e 65 64 20 6f 6e 2c 20  TEST turned on, 
fb00: 74 68 65 6e 20 72 65 67 69 73 74 65 72 20 74 68  then register th
fb10: 65 20 22 6d 64 35 73 75 6d 22 0a 20 20 2a 2a 20  e "md5sum".  ** 
fb20: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20  SQL function..  
fb30: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
fb40: 5f 54 45 53 54 0a 20 20 7b 0a 20 20 20 20 65 78  _TEST.  {.    ex
fb50: 74 65 72 6e 20 76 6f 69 64 20 4d 64 35 5f 52 65  tern void Md5_Re
fb60: 67 69 73 74 65 72 28 73 71 6c 69 74 65 33 2a 29  gister(sqlite3*)
fb70: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
fb80: 4d 45 4d 44 45 42 55 47 0a 20 20 20 20 69 6e 74  MEMDEBUG.    int
fb90: 20 6d 61 6c 6c 6f 63 66 61 69 6c 20 3d 20 73 71   mallocfail = sq
fba0: 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46 61 69  lite3_iMallocFai
fbb0: 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  l;.    sqlite3_i
fbc0: 4d 61 6c 6c 6f 63 46 61 69 6c 20 3d 20 30 3b 0a  MallocFail = 0;.
fbd0: 23 65 6e 64 69 66 0a 20 20 20 20 4d 64 35 5f 52  #endif.    Md5_R
fbe0: 65 67 69 73 74 65 72 28 70 2d 3e 64 62 29 3b 0a  egister(p->db);.
fbf0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 45  #ifdef SQLITE_ME
fc00: 4d 44 45 42 55 47 0a 20 20 20 20 73 71 6c 69 74  MDEBUG.    sqlit
fc10: 65 33 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c 20 3d  e3_iMallocFail =
fc20: 20 6d 61 6c 6c 6f 63 66 61 69 6c 3b 0a 23 65 6e   mallocfail;.#en
fc30: 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 20 20  dif.  }.#endif  
fc40: 0a 20 20 70 2d 3e 69 6e 74 65 72 70 20 3d 20 69  .  p->interp = i
fc50: 6e 74 65 72 70 3b 0a 20 20 72 65 74 75 72 6e 20  nterp;.  return 
fc60: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
fc70: 20 50 72 6f 76 69 64 65 20 61 20 64 75 6d 6d 79   Provide a dummy
fc80: 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 20 69   Tcl_InitStubs i
fc90: 66 20 77 65 20 61 72 65 20 75 73 69 6e 67 20 74  f we are using t
fca0: 68 69 73 20 61 73 20 61 20 73 74 61 74 69 63 0a  his as a static.
fcb0: 2a 2a 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23  ** library..*/.#
fcc0: 69 66 6e 64 65 66 20 55 53 45 5f 54 43 4c 5f 53  ifndef USE_TCL_S
fcd0: 54 55 42 53 0a 23 20 75 6e 64 65 66 20 20 54 63  TUBS.# undef  Tc
fce0: 6c 5f 49 6e 69 74 53 74 75 62 73 0a 23 20 64 65  l_InitStubs.# de
fcf0: 66 69 6e 65 20 54 63 6c 5f 49 6e 69 74 53 74 75  fine Tcl_InitStu
fd00: 62 73 28 61 2c 62 2c 63 29 0a 23 65 6e 64 69 66  bs(a,b,c).#endif
fd10: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
fd20: 65 20 77 65 20 68 61 76 65 20 61 20 50 41 43 4b  e we have a PACK
fd30: 41 47 45 5f 56 45 52 53 49 4f 4e 20 6d 61 63 72  AGE_VERSION macr
fd40: 6f 20 64 65 66 69 6e 65 64 2e 20 20 54 68 69 73  o defined.  This
fd50: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 66 69   will be.** defi
fd60: 6e 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ned automaticall
fd70: 79 20 62 79 20 74 68 65 20 54 45 41 20 6d 61 6b  y by the TEA mak
fd80: 65 66 69 6c 65 2e 20 20 42 75 74 20 6f 74 68 65  efile.  But othe
fd90: 72 20 6d 61 6b 65 66 69 6c 65 73 0a 2a 2a 20 64  r makefiles.** d
fda0: 6f 20 6e 6f 74 20 64 65 66 69 6e 65 20 69 74 2e  o not define it.
fdb0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 50 41 43 4b  .*/.#ifndef PACK
fdc0: 41 47 45 5f 56 45 52 53 49 4f 4e 0a 23 20 64 65  AGE_VERSION.# de
fdd0: 66 69 6e 65 20 50 41 43 4b 41 47 45 5f 56 45 52  fine PACKAGE_VER
fde0: 53 49 4f 4e 20 53 51 4c 49 54 45 5f 56 45 52 53  SION SQLITE_VERS
fdf0: 49 4f 4e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ION.#endif../*.*
fe00: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 69  * Initialize thi
fe10: 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2a 0a 2a 2a 20  s module..**.** 
fe20: 54 68 69 73 20 54 63 6c 20 6d 6f 64 75 6c 65 20  This Tcl module 
fe30: 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 61 20  contains only a 
fe40: 73 69 6e 67 6c 65 20 6e 65 77 20 54 63 6c 20 63  single new Tcl c
fe50: 6f 6d 6d 61 6e 64 20 6e 61 6d 65 64 20 22 73 71  ommand named "sq
fe60: 6c 69 74 65 22 2e 0a 2a 2a 20 28 48 65 6e 63 65  lite"..** (Hence
fe70: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 61 6d   there is no nam
fe80: 65 73 70 61 63 65 2e 20 20 54 68 65 72 65 20 69  espace.  There i
fe90: 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 75 73  s no point in us
fea0: 69 6e 67 20 61 20 6e 61 6d 65 73 70 61 63 65 0a  ing a namespace.
feb0: 2a 2a 20 69 66 20 74 68 65 20 65 78 74 65 6e 73  ** if the extens
fec0: 69 6f 6e 20 6f 6e 6c 79 20 73 75 70 70 6c 69 65  ion only supplie
fed0: 73 20 6f 6e 65 20 6e 65 77 20 6e 61 6d 65 21 29  s one new name!)
fee0: 20 20 54 68 65 20 22 73 71 6c 69 74 65 22 20 63    The "sqlite" c
fef0: 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 75 73 65  ommand is.** use
ff00: 64 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20  d to open a new 
ff10: 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e  SQLite database.
ff20: 20 20 53 65 65 20 74 68 65 20 44 62 4d 61 69 6e    See the DbMain
ff30: 28 29 20 72 6f 75 74 69 6e 65 20 61 62 6f 76 65  () routine above
ff40: 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .** for addition
ff50: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
ff60: 2a 2f 0a 45 58 54 45 52 4e 20 69 6e 74 20 53 71  */.EXTERN int Sq
ff70: 6c 69 74 65 33 5f 49 6e 69 74 28 54 63 6c 5f 49  lite3_Init(Tcl_I
ff80: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a  nterp *interp){.
ff90: 20 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28    Tcl_InitStubs(
ffa0: 69 6e 74 65 72 70 2c 20 22 38 2e 34 22 2c 20 30  interp, "8.4", 0
ffb0: 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  );.  Tcl_CreateO
ffc0: 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
ffd0: 2c 20 22 73 71 6c 69 74 65 33 22 2c 20 28 54 63  , "sqlite3", (Tc
ffe0: 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 2a 29 44 62  l_ObjCmdProc*)Db
fff0: 4d 61 69 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 54  Main, 0, 0);.  T
10000 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e  cl_PkgProvide(in
10010 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33 22 2c  terp, "sqlite3",
10020 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e   PACKAGE_VERSION
10030 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  );.  Tcl_CreateO
10040 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
10050 2c 20 22 73 71 6c 69 74 65 22 2c 20 28 54 63 6c  , "sqlite", (Tcl
10060 5f 4f 62 6a 43 6d 64 50 72 6f 63 2a 29 44 62 4d  _ObjCmdProc*)DbM
10070 61 69 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 54 63  ain, 0, 0);.  Tc
10080 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74  l_PkgProvide(int
10090 65 72 70 2c 20 22 73 71 6c 69 74 65 22 2c 20 50  erp, "sqlite", P
100a0 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29 3b  ACKAGE_VERSION);
100b0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
100c0 3b 0a 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 54  ;.}.EXTERN int T
100d0 63 6c 73 71 6c 69 74 65 33 5f 49 6e 69 74 28 54  clsqlite3_Init(T
100e0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
100f0 70 29 7b 20 72 65 74 75 72 6e 20 53 71 6c 69 74  p){ return Sqlit
10100 65 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  e3_Init(interp);
10110 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 53 71   }.EXTERN int Sq
10120 6c 69 74 65 33 5f 53 61 66 65 49 6e 69 74 28 54  lite3_SafeInit(T
10130 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
10140 70 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  p){ return TCL_O
10150 4b 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20  K; }.EXTERN int 
10160 54 63 6c 73 71 6c 69 74 65 33 5f 53 61 66 65 49  Tclsqlite3_SafeI
10170 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nit(Tcl_Interp *
10180 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20  interp){ return 
10190 54 43 4c 5f 4f 4b 3b 20 7d 0a 0a 23 69 66 6e 64  TCL_OK; }..#ifnd
101a0 65 66 20 53 51 4c 49 54 45 5f 33 5f 53 55 46 46  ef SQLITE_3_SUFF
101b0 49 58 5f 4f 4e 4c 59 0a 45 58 54 45 52 4e 20 69  IX_ONLY.EXTERN i
101c0 6e 74 20 53 71 6c 69 74 65 5f 49 6e 69 74 28 54  nt Sqlite_Init(T
101d0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
101e0 70 29 7b 20 72 65 74 75 72 6e 20 53 71 6c 69 74  p){ return Sqlit
101f0 65 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  e3_Init(interp);
10200 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 54 63   }.EXTERN int Tc
10210 6c 73 71 6c 69 74 65 5f 49 6e 69 74 28 54 63 6c  lsqlite_Init(Tcl
10220 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
10230 7b 20 72 65 74 75 72 6e 20 53 71 6c 69 74 65 33  { return Sqlite3
10240 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 20 7d  _Init(interp); }
10250 0a 45 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69  .EXTERN int Sqli
10260 74 65 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f  te_SafeInit(Tcl_
10270 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b  Interp *interp){
10280 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20   return TCL_OK; 
10290 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 54 63 6c  }.EXTERN int Tcl
102a0 73 71 6c 69 74 65 5f 53 61 66 65 49 6e 69 74 28  sqlite_SafeInit(
102b0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
102c0 72 70 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f  rp){ return TCL_
102d0 4f 4b 3b 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  OK; }.#endif..#i
102e0 66 64 65 66 20 54 43 4c 53 48 0a 2f 2a 2a 2a 2a  fdef TCLSH./****
102f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10330 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65  *********.** The
10340 20 63 6f 64 65 20 74 68 61 74 20 66 6f 6c 6c 6f   code that follo
10350 77 73 20 69 73 20 75 73 65 64 20 74 6f 20 62 75  ws is used to bu
10360 69 6c 64 20 73 74 61 6e 64 61 6c 6f 6e 65 20 54  ild standalone T
10370 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 73 0a  CL interpreters.
10380 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  */../*.** If the
10390 20 6d 61 63 72 6f 20 54 43 4c 53 48 20 69 73 20   macro TCLSH is 
103a0 6f 6e 65 2c 20 74 68 65 6e 20 70 75 74 20 69 6e  one, then put in
103b0 20 63 6f 64 65 20 74 68 69 73 20 66 6f 72 20 74   code this for t
103c0 68 65 0a 2a 2a 20 22 6d 61 69 6e 22 20 72 6f 75  he.** "main" rou
103d0 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 69  tine that will i
103e0 6e 69 74 69 61 6c 69 7a 65 20 54 63 6c 20 61 6e  nitialize Tcl an
103f0 64 20 74 61 6b 65 20 69 6e 70 75 74 20 66 72 6f  d take input fro
10400 6d 0a 2a 2a 20 73 74 61 6e 64 61 72 64 20 69 6e  m.** standard in
10410 70 75 74 2e 0a 2a 2f 0a 23 69 66 20 54 43 4c 53  put..*/.#if TCLS
10420 48 3d 3d 31 0a 73 74 61 74 69 63 20 63 68 61 72  H==1.static char
10430 20 7a 4d 61 69 6e 6c 6f 6f 70 5b 5d 20 3d 0a 20   zMainloop[] =. 
10440 20 22 73 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e 22   "set line {}\n"
10450 0a 20 20 22 77 68 69 6c 65 20 7b 21 5b 65 6f 66  .  "while {![eof
10460 20 73 74 64 69 6e 5d 7d 20 7b 5c 6e 22 0a 20 20   stdin]} {\n".  
10470 20 20 22 69 66 20 7b 24 6c 69 6e 65 21 3d 5c 22    "if {$line!=\"
10480 5c 22 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22  \"} {\n".      "
10490 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20  puts -nonewline 
104a0 5c 22 3e 20 5c 22 5c 6e 22 0a 20 20 20 20 22 7d  \"> \"\n".    "}
104b0 20 65 6c 73 65 20 7b 5c 6e 22 0a 20 20 20 20 20   else {\n".     
104c0 20 22 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e   "puts -nonewlin
104d0 65 20 5c 22 25 20 5c 22 5c 6e 22 0a 20 20 20 20  e \"% \"\n".    
104e0 22 7d 5c 6e 22 0a 20 20 20 20 22 66 6c 75 73 68  "}\n".    "flush
104f0 20 73 74 64 6f 75 74 5c 6e 22 0a 20 20 20 20 22   stdout\n".    "
10500 61 70 70 65 6e 64 20 6c 69 6e 65 20 5b 67 65 74  append line [get
10510 73 20 73 74 64 69 6e 5d 5c 6e 22 0a 20 20 20 20  s stdin]\n".    
10520 22 69 66 20 7b 5b 69 6e 66 6f 20 63 6f 6d 70 6c  "if {[info compl
10530 65 74 65 20 24 6c 69 6e 65 5d 7d 20 7b 5c 6e 22  ete $line]} {\n"
10540 0a 20 20 20 20 20 20 22 69 66 20 7b 5b 63 61 74  .      "if {[cat
10550 63 68 20 7b 75 70 6c 65 76 65 6c 20 23 30 20 24  ch {uplevel #0 $
10560 6c 69 6e 65 7d 20 72 65 73 75 6c 74 5d 7d 20 7b  line} result]} {
10570 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 70 75 74  \n".        "put
10580 73 20 73 74 64 65 72 72 20 5c 22 45 72 72 6f 72  s stderr \"Error
10590 3a 20 24 72 65 73 75 6c 74 5c 22 5c 6e 22 0a 20  : $result\"\n". 
105a0 20 20 20 20 20 22 7d 20 65 6c 73 65 69 66 20 7b       "} elseif {
105b0 24 72 65 73 75 6c 74 21 3d 5c 22 5c 22 7d 20 7b  $result!=\"\"} {
105c0 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 70 75 74  \n".        "put
105d0 73 20 24 72 65 73 75 6c 74 5c 6e 22 0a 20 20 20  s $result\n".   
105e0 20 20 20 22 7d 5c 6e 22 0a 20 20 20 20 20 20 22     "}\n".      "
105f0 73 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e 22 0a 20  set line {}\n". 
10600 20 20 20 22 7d 20 65 6c 73 65 20 7b 5c 6e 22 0a     "} else {\n".
10610 20 20 20 20 20 20 22 61 70 70 65 6e 64 20 6c 69        "append li
10620 6e 65 20 5c 5c 6e 5c 6e 22 0a 20 20 20 20 22 7d  ne \\n\n".    "}
10630 5c 6e 22 0a 20 20 22 7d 5c 6e 22 0a 3b 0a 23 65  \n".  "}\n".;.#e
10640 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ndif../*.** If t
10650 68 65 20 6d 61 63 72 6f 20 54 43 4c 53 48 20 69  he macro TCLSH i
10660 73 20 74 77 6f 2c 20 74 68 65 6e 20 67 65 74 20  s two, then get 
10670 74 68 65 20 6d 61 69 6e 20 6c 6f 6f 70 20 63 6f  the main loop co
10680 64 65 20 6f 75 74 20 6f 66 0a 2a 2a 20 74 68 65  de out of.** the
10690 20 73 65 70 61 72 61 74 65 20 66 69 6c 65 20 22   separate file "
106a0 73 70 61 63 65 61 6e 61 6c 5f 74 63 6c 2e 68 22  spaceanal_tcl.h"
106b0 2e 0a 2a 2f 0a 23 69 66 20 54 43 4c 53 48 3d 3d  ..*/.#if TCLSH==
106c0 32 0a 73 74 61 74 69 63 20 63 68 61 72 20 7a 4d  2.static char zM
106d0 61 69 6e 6c 6f 6f 70 5b 5d 20 3d 20 0a 23 69 6e  ainloop[] = .#in
106e0 63 6c 75 64 65 20 22 73 70 61 63 65 61 6e 61 6c  clude "spaceanal
106f0 5f 74 63 6c 2e 68 22 0a 3b 0a 23 65 6e 64 69 66  _tcl.h".;.#endif
10700 0a 0a 23 64 65 66 69 6e 65 20 54 43 4c 53 48 5f  ..#define TCLSH_
10710 4d 41 49 4e 20 6d 61 69 6e 20 20 20 2f 2a 20 4e  MAIN main   /* N
10720 65 65 64 65 64 20 74 6f 20 66 61 6b 65 20 6f 75  eeded to fake ou
10730 74 20 6d 6b 74 63 6c 61 70 70 20 2a 2f 0a 69 6e  t mktclapp */.in
10740 74 20 54 43 4c 53 48 5f 4d 41 49 4e 28 69 6e 74  t TCLSH_MAIN(int
10750 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72   argc, char **ar
10760 67 76 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72  gv){.  Tcl_Inter
10770 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c  p *interp;.  Tcl
10780 5f 46 69 6e 64 45 78 65 63 75 74 61 62 6c 65 28  _FindExecutable(
10790 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 6e 74 65  argv[0]);.  inte
107a0 72 70 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 49  rp = Tcl_CreateI
107b0 6e 74 65 72 70 28 29 3b 0a 20 20 53 71 6c 69 74  nterp();.  Sqlit
107c0 65 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  e3_Init(interp);
107d0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
107e0 45 53 54 0a 20 20 7b 0a 20 20 20 20 65 78 74 65  EST.  {.    exte
107f0 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
10800 74 31 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  t1_Init(Tcl_Inte
10810 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
10820 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 32   int Sqlitetest2
10830 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
10840 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
10850 6e 74 20 53 71 6c 69 74 65 74 65 73 74 33 5f 49  nt Sqlitetest3_I
10860 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
10870 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
10880 20 53 71 6c 69 74 65 74 65 73 74 34 5f 49 6e 69   Sqlitetest4_Ini
10890 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
108a0 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
108b0 71 6c 69 74 65 74 65 73 74 35 5f 49 6e 69 74 28  qlitetest5_Init(
108c0 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
108d0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
108e0 69 74 65 74 65 73 74 36 5f 49 6e 69 74 28 54 63  itetest6_Init(Tc
108f0 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
10900 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
10910 65 74 65 73 74 61 73 79 6e 63 5f 49 6e 69 74 28  etestasync_Init(
10920 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
10930 20 20 65 78 74 65 72 6e 20 69 6e 74 20 4d 64 35    extern int Md5
10940 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
10950 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
10960 6e 74 20 53 71 6c 69 74 65 74 65 73 74 73 73 65  nt Sqlitetestsse
10970 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
10980 2a 29 3b 0a 0a 20 20 20 20 53 71 6c 69 74 65 74  *);..    Sqlitet
10990 65 73 74 31 5f 49 6e 69 74 28 69 6e 74 65 72 70  est1_Init(interp
109a0 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
109b0 74 32 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  t2_Init(interp);
109c0 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 33  .    Sqlitetest3
109d0 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
109e0 20 20 20 53 71 6c 69 74 65 74 65 73 74 34 5f 49     Sqlitetest4_I
109f0 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
10a00 20 53 71 6c 69 74 65 74 65 73 74 35 5f 49 6e 69   Sqlitetest5_Ini
10a10 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
10a20 71 6c 69 74 65 74 65 73 74 36 5f 49 6e 69 74 28  qlitetest6_Init(
10a30 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 2f 2a 20  interp);.    /* 
10a40 53 71 6c 69 74 65 74 65 73 74 61 73 79 6e 63 5f  Sqlitetestasync_
10a50 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 20 2a 2f  Init(interp); */
10a60 0a 20 20 20 20 4d 64 35 5f 49 6e 69 74 28 69 6e  .    Md5_Init(in
10a70 74 65 72 70 29 3b 0a 23 69 66 64 65 66 20 53 51  terp);.#ifdef SQ
10a80 4c 49 54 45 5f 53 53 45 0a 20 20 20 20 53 71 6c  LITE_SSE.    Sql
10a90 69 74 65 74 65 73 74 73 73 65 5f 49 6e 69 74 28  itetestsse_Init(
10aa0 69 6e 74 65 72 70 29 3b 0a 23 65 6e 64 69 66 0a  interp);.#endif.
10ab0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
10ac0 20 61 72 67 63 3e 3d 32 20 7c 7c 20 54 43 4c 53   argc>=2 || TCLS
10ad0 48 3d 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74 20  H==2 ){.    int 
10ae0 69 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 56 61  i;.    Tcl_SetVa
10af0 72 28 69 6e 74 65 72 70 2c 22 61 72 67 76 30 22  r(interp,"argv0"
10b00 2c 61 72 67 76 5b 31 5d 2c 54 43 4c 5f 47 4c 4f  ,argv[1],TCL_GLO
10b10 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 54  BAL_ONLY);.    T
10b20 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70  cl_SetVar(interp
10b30 2c 22 61 72 67 76 22 2c 20 22 22 2c 20 54 43 4c  ,"argv", "", TCL
10b40 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20  _GLOBAL_ONLY);. 
10b50 20 20 20 66 6f 72 28 69 3d 33 2d 54 43 4c 53 48     for(i=3-TCLSH
10b60 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a  ; i<argc; i++){.
10b70 20 20 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72        Tcl_SetVar
10b80 28 69 6e 74 65 72 70 2c 20 22 61 72 67 76 22 2c  (interp, "argv",
10b90 20 61 72 67 76 5b 69 5d 2c 0a 20 20 20 20 20 20   argv[i],.      
10ba0 20 20 20 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f      TCL_GLOBAL_O
10bb0 4e 4c 59 20 7c 20 54 43 4c 5f 4c 49 53 54 5f 45  NLY | TCL_LIST_E
10bc0 4c 45 4d 45 4e 54 20 7c 20 54 43 4c 5f 41 50 50  LEMENT | TCL_APP
10bd0 45 4e 44 5f 56 41 4c 55 45 29 3b 0a 20 20 20 20  END_VALUE);.    
10be0 7d 0a 20 20 20 20 69 66 28 20 54 43 4c 53 48 3d  }.    if( TCLSH=
10bf0 3d 31 20 26 26 20 54 63 6c 5f 45 76 61 6c 46 69  =1 && Tcl_EvalFi
10c00 6c 65 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  le(interp, argv[
10c10 31 5d 29 21 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20  1])!=TCL_OK ){. 
10c20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
10c30 2a 7a 49 6e 66 6f 20 3d 20 54 63 6c 5f 47 65 74  *zInfo = Tcl_Get
10c40 56 61 72 28 69 6e 74 65 72 70 2c 20 22 65 72 72  Var(interp, "err
10c50 6f 72 49 6e 66 6f 22 2c 20 54 43 4c 5f 47 4c 4f  orInfo", TCL_GLO
10c60 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 20  BAL_ONLY);.     
10c70 20 69 66 28 20 7a 49 6e 66 6f 3d 3d 30 20 29 20   if( zInfo==0 ) 
10c80 7a 49 6e 66 6f 20 3d 20 69 6e 74 65 72 70 2d 3e  zInfo = interp->
10c90 72 65 73 75 6c 74 3b 0a 20 20 20 20 20 20 66 70  result;.      fp
10ca0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25 73  rintf(stderr,"%s
10cb0 3a 20 25 73 5c 6e 22 2c 20 2a 61 72 67 76 2c 20  : %s\n", *argv, 
10cc0 7a 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 72 65  zInfo);.      re
10cd0 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
10ce0 7d 0a 20 20 69 66 28 20 61 72 67 63 3c 3d 31 20  }.  if( argc<=1 
10cf0 7c 7c 20 54 43 4c 53 48 3d 3d 32 20 29 7b 0a 20  || TCLSH==2 ){. 
10d00 20 20 20 54 63 6c 5f 47 6c 6f 62 61 6c 45 76 61     Tcl_GlobalEva
10d10 6c 28 69 6e 74 65 72 70 2c 20 7a 4d 61 69 6e 6c  l(interp, zMainl
10d20 6f 6f 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  oop);.  }.  retu
10d30 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 0;.}.#endif /
10d40 2a 20 54 43 4c 53 48 20 2a 2f 0a 0a 23 65 6e 64  * TCLSH */..#end
10d50 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 4e  if /* !defined(N
10d60 4f 5f 54 43 4c 29 20 2a 2f 0a                    O_TCL) */.