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

Artifact 42151e6c78502277be77b88c00535d53ce89b917:


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 37 20 32 30 30 36 2f 30 31 2f 30 36 20 31 34  47 2006/01/06 14
01c0: 3a 33 32 3a 32 30 20 64 72 68 20 45 78 70 20 24  :32:20 drh Exp $
01d0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 4f 5f 54  .*/.#ifndef NO_T
01e0: 43 4c 20 20 20 20 20 2f 2a 20 4f 6d 69 74 20 74  CL     /* Omit t
01f0: 68 69 73 20 77 68 6f 6c 65 20 66 69 6c 65 20 69  his whole file i
0200: 66 20 54 43 4c 20 69 73 20 75 6e 61 76 61 69 6c  f TCL is unavail
0210: 61 62 6c 65 20 2a 2f 0a 0a 23 69 6e 63 6c 75 64  able */..#includ
0220: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
0230: 23 69 6e 63 6c 75 64 65 20 22 68 61 73 68 2e 68  #include "hash.h
0240: 22 0a 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 2e  ".#include "tcl.
0250: 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64  h".#include <std
0260: 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  lib.h>.#include 
0270: 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c  <string.h>.#incl
0280: 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23  ude <assert.h>.#
0290: 69 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68  include <ctype.h
02a0: 3e 0a 0a 2f 2a 0a 20 2a 20 57 69 6e 64 6f 77 73  >../*. * Windows
02b0: 20 6e 65 65 64 73 20 74 6f 20 6b 6e 6f 77 20 77   needs to know w
02c0: 68 69 63 68 20 73 79 6d 62 6f 6c 73 20 74 6f 20  hich symbols to 
02d0: 65 78 70 6f 72 74 2e 20 20 55 6e 69 78 20 64 6f  export.  Unix do
02e0: 65 73 20 6e 6f 74 2e 0a 20 2a 20 42 55 49 4c 44  es not.. * BUILD
02f0: 5f 73 71 6c 69 74 65 20 73 68 6f 75 6c 64 20 62  _sqlite should b
0300: 65 20 75 6e 64 65 66 69 6e 65 64 20 66 6f 72 20  e undefined for 
0310: 55 6e 69 78 2e 0a 20 2a 2f 0a 0a 23 69 66 64 65  Unix.. */..#ifde
0320: 66 20 42 55 49 4c 44 5f 73 71 6c 69 74 65 0a 23  f BUILD_sqlite.#
0330: 75 6e 64 65 66 20 54 43 4c 5f 53 54 4f 52 41 47  undef TCL_STORAG
0340: 45 5f 43 4c 41 53 53 0a 23 64 65 66 69 6e 65 20  E_CLASS.#define 
0350: 54 43 4c 5f 53 54 4f 52 41 47 45 5f 43 4c 41 53  TCL_STORAGE_CLAS
0360: 53 20 44 4c 4c 45 58 50 4f 52 54 0a 23 65 6e 64  S DLLEXPORT.#end
0370: 69 66 20 2f 2a 20 42 55 49 4c 44 5f 73 71 6c 69  if /* BUILD_sqli
0380: 74 65 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 4e  te */..#define N
0390: 55 4d 5f 50 52 45 50 41 52 45 44 5f 53 54 4d 54  UM_PREPARED_STMT
03a0: 53 20 31 30 0a 23 64 65 66 69 6e 65 20 4d 41 58  S 10.#define MAX
03b0: 5f 50 52 45 50 41 52 45 44 5f 53 54 4d 54 53 20  _PREPARED_STMTS 
03c0: 31 30 30 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 54 43  100../*.** If TC
03d0: 4c 20 75 73 65 73 20 55 54 46 2d 38 20 61 6e 64  L uses UTF-8 and
03e0: 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6e 66 69   SQLite is confi
03f0: 67 75 72 65 64 20 74 6f 20 75 73 65 20 69 73 6f  gured to use iso
0400: 38 38 35 39 2c 20 74 68 65 6e 20 77 65 0a 2a 2a  8859, then we.**
0410: 20 68 61 76 65 20 74 6f 20 64 6f 20 61 20 74 72   have to do a tr
0420: 61 6e 73 6c 61 74 69 6f 6e 20 77 68 65 6e 20 67  anslation when g
0430: 6f 69 6e 67 20 62 65 74 77 65 65 6e 20 74 68 65  oing between the
0440: 20 74 77 6f 2e 20 20 53 65 74 20 74 68 65 20 0a   two.  Set the .
0450: 2a 2a 20 55 54 46 5f 54 52 41 4e 53 4c 41 54 49  ** UTF_TRANSLATI
0460: 4f 4e 5f 4e 45 45 44 45 44 20 6d 61 63 72 6f 20  ON_NEEDED macro 
0470: 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
0480: 20 77 65 20 6e 65 65 64 20 74 6f 20 64 6f 0a 2a   we need to do.*
0490: 2a 20 74 68 69 73 20 74 72 61 6e 73 6c 61 74 69  * this translati
04a0: 6f 6e 2e 20 20 0a 2a 2f 0a 23 69 66 20 64 65 66  on.  .*/.#if def
04b0: 69 6e 65 64 28 54 43 4c 5f 55 54 46 5f 4d 41 58  ined(TCL_UTF_MAX
04c0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
04d0: 4c 49 54 45 5f 55 54 46 38 29 0a 23 20 64 65 66  LITE_UTF8).# def
04e0: 69 6e 65 20 55 54 46 5f 54 52 41 4e 53 4c 41 54  ine UTF_TRANSLAT
04f0: 49 4f 4e 5f 4e 45 45 44 45 44 20 31 0a 23 65 6e  ION_NEEDED 1.#en
0500: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4e 65 77 20 53  dif../*.** New S
0510: 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20 63 61 6e  QL functions can
0520: 20 62 65 20 63 72 65 61 74 65 64 20 61 73 20 54   be created as T
0530: 43 4c 20 73 63 72 69 70 74 73 2e 20 20 45 61 63  CL scripts.  Eac
0540: 68 20 73 75 63 68 20 66 75 6e 63 74 69 6f 6e 0a  h such function.
0550: 2a 2a 20 69 73 20 64 65 73 63 72 69 62 65 64 20  ** is described 
0560: 62 79 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  by an instance o
0570: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
0580: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79  structure..*/.ty
0590: 70 65 64 65 66 20 73 74 72 75 63 74 20 53 71 6c  pedef struct Sql
05a0: 46 75 6e 63 20 53 71 6c 46 75 6e 63 3b 0a 73 74  Func SqlFunc;.st
05b0: 72 75 63 74 20 53 71 6c 46 75 6e 63 20 7b 0a 20  ruct SqlFunc {. 
05c0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
05d0: 65 72 70 3b 20 20 20 2f 2a 20 54 68 65 20 54 43  erp;   /* The TC
05e0: 4c 20 69 6e 74 65 72 70 72 65 74 20 74 6f 20 65  L interpret to e
05f0: 78 65 63 75 74 65 20 74 68 65 20 66 75 6e 63 74  xecute the funct
0600: 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  ion */.  Tcl_Obj
0610: 20 2a 70 53 63 72 69 70 74 3b 20 20 20 20 20 2f   *pScript;     /
0620: 2a 20 54 68 65 20 54 63 6c 5f 4f 62 6a 20 72 65  * The Tcl_Obj re
0630: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
0640: 74 68 65 20 73 63 72 69 70 74 20 2a 2f 0a 20 20  the script */.  
0650: 69 6e 74 20 75 73 65 45 76 61 6c 4f 62 6a 76 3b  int useEvalObjv;
0660: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
0670: 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 75   it is safe to u
0680: 73 65 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 20  se Tcl_EvalObjv 
0690: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  */.  char *zName
06a0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  ;          /* Na
06b0: 6d 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  me of this funct
06c0: 69 6f 6e 20 2a 2f 0a 20 20 53 71 6c 46 75 6e 63  ion */.  SqlFunc
06d0: 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 2f   *pNext;       /
06e0: 2a 20 4e 65 78 74 20 66 75 6e 63 74 69 6f 6e 20  * Next function 
06f0: 6f 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 74  on the list of t
0700: 68 65 6d 20 61 6c 6c 20 2a 2f 0a 7d 3b 0a 0a 2f  hem all */.};../
0710: 2a 0a 2a 2a 20 4e 65 77 20 63 6f 6c 6c 61 74 69  *.** New collati
0720: 6f 6e 20 73 65 71 75 65 6e 63 65 73 20 66 75 6e  on sequences fun
0730: 63 74 69 6f 6e 20 63 61 6e 20 62 65 20 63 72 65  ction can be cre
0740: 61 74 65 64 20 61 73 20 54 43 4c 20 73 63 72 69  ated as TCL scri
0750: 70 74 73 2e 20 20 45 61 63 68 20 73 75 63 68 0a  pts.  Each such.
0760: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 64  ** function is d
0770: 65 73 63 72 69 62 65 64 20 62 79 20 61 6e 20 69  escribed by an i
0780: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
0790: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
07a0: 72 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  re..*/.typedef s
07b0: 74 72 75 63 74 20 53 71 6c 43 6f 6c 6c 61 74 65  truct SqlCollate
07c0: 20 53 71 6c 43 6f 6c 6c 61 74 65 3b 0a 73 74 72   SqlCollate;.str
07d0: 75 63 74 20 53 71 6c 43 6f 6c 6c 61 74 65 20 7b  uct SqlCollate {
07e0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
07f0: 6e 74 65 72 70 3b 20 20 20 2f 2a 20 54 68 65 20  nterp;   /* The 
0800: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 20 74 6f  TCL interpret to
0810: 20 65 78 65 63 75 74 65 20 74 68 65 20 66 75 6e   execute the fun
0820: 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20  ction */.  char 
0830: 2a 7a 53 63 72 69 70 74 3b 20 20 20 20 20 20 20  *zScript;       
0840: 20 2f 2a 20 54 68 65 20 73 63 72 69 70 74 20 74   /* The script t
0850: 6f 20 62 65 20 72 75 6e 20 2a 2f 0a 20 20 53 71  o be run */.  Sq
0860: 6c 43 6f 6c 6c 61 74 65 20 2a 70 4e 65 78 74 3b  lCollate *pNext;
0870: 20 20 20 20 2f 2a 20 4e 65 78 74 20 66 75 6e 63      /* Next func
0880: 74 69 6f 6e 20 6f 6e 20 74 68 65 20 6c 69 73 74  tion on the list
0890: 20 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a   of them all */.
08a0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72  };../*.** Prepar
08b0: 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72  ed statements ar
08c0: 65 20 63 61 63 68 65 64 20 66 6f 72 20 66 61 73  e cached for fas
08d0: 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20  ter execution.  
08e0: 45 61 63 68 20 70 72 65 70 61 72 65 64 0a 2a 2a  Each prepared.**
08f0: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 64 65   statement is de
0900: 73 63 72 69 62 65 64 20 62 79 20 61 6e 20 69 6e  scribed by an in
0910: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
0920: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
0930: 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  e..*/.typedef st
0940: 72 75 63 74 20 53 71 6c 50 72 65 70 61 72 65 64  ruct SqlPrepared
0950: 53 74 6d 74 20 53 71 6c 50 72 65 70 61 72 65 64  Stmt SqlPrepared
0960: 53 74 6d 74 3b 0a 73 74 72 75 63 74 20 53 71 6c  Stmt;.struct Sql
0970: 50 72 65 70 61 72 65 64 53 74 6d 74 20 7b 0a 20  PreparedStmt {. 
0980: 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74   SqlPreparedStmt
0990: 20 2a 70 4e 65 78 74 3b 20 20 2f 2a 20 4e 65 78   *pNext;  /* Nex
09a0: 74 20 69 6e 20 6c 69 6e 6b 65 64 20 6c 69 73 74  t in linked list
09b0: 20 2a 2f 0a 20 20 53 71 6c 50 72 65 70 61 72 65   */.  SqlPrepare
09c0: 64 53 74 6d 74 20 2a 70 50 72 65 76 3b 20 20 2f  dStmt *pPrev;  /
09d0: 2a 20 50 72 65 76 69 6f 75 73 20 6f 6e 20 74 68  * Previous on th
09e0: 65 20 6c 69 73 74 20 2a 2f 0a 20 20 73 71 6c 69  e list */.  sqli
09f0: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
0a00: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70       /* The prep
0a10: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a  ared statement *
0a20: 2f 0a 20 20 69 6e 74 20 6e 53 71 6c 3b 20 20 20  /.  int nSql;   
0a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0a40: 63 68 61 72 73 20 69 6e 20 7a 53 71 6c 5b 5d 20  chars in zSql[] 
0a50: 2a 2f 0a 20 20 63 68 61 72 20 7a 53 71 6c 5b 31  */.  char zSql[1
0a60: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ];            /*
0a70: 20 54 65 78 74 20 6f 66 20 74 68 65 20 53 51 4c   Text of the SQL
0a80: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 7d 3b   statement */.};
0a90: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73  ../*.** There is
0aa0: 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66   one instance of
0ab0: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
0ac0: 66 6f 72 20 65 61 63 68 20 53 51 4c 69 74 65 20  for each SQLite 
0ad0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 68 61 74  database.** that
0ae0: 20 68 61 73 20 62 65 65 6e 20 6f 70 65 6e 65 64   has been opened
0af0: 20 62 79 20 74 68 65 20 53 51 4c 69 74 65 20 54   by the SQLite T
0b00: 43 4c 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f  CL interface..*/
0b10: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0b20: 53 71 6c 69 74 65 44 62 20 53 71 6c 69 74 65 44  SqliteDb SqliteD
0b30: 62 3b 0a 73 74 72 75 63 74 20 53 71 6c 69 74 65  b;.struct Sqlite
0b40: 44 62 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Db {.  sqlite3 *
0b50: 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
0b60: 20 20 2f 2a 20 54 68 65 20 22 72 65 61 6c 22 20    /* The "real" 
0b70: 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75  database structu
0b80: 72 65 2e 20 4d 55 53 54 20 42 45 20 46 49 52 53  re. MUST BE FIRS
0b90: 54 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  T */.  Tcl_Inter
0ba0: 70 20 2a 69 6e 74 65 72 70 3b 20 20 20 20 20 20  p *interp;      
0bb0: 20 20 2f 2a 20 54 68 65 20 69 6e 74 65 72 70 72    /* The interpr
0bc0: 65 74 65 72 20 75 73 65 64 20 66 6f 72 20 74 68  eter used for th
0bd0: 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  is database */. 
0be0: 20 63 68 61 72 20 2a 7a 42 75 73 79 3b 20 20 20   char *zBusy;   
0bf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
0c00: 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
0c10: 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68   routine */.  ch
0c20: 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 20 20 20 20  ar *zCommit;    
0c30: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
0c40: 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 63 61 6c 6c  commit hook call
0c50: 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a  back routine */.
0c60: 20 20 63 68 61 72 20 2a 7a 54 72 61 63 65 3b 20    char *zTrace; 
0c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0c80: 54 68 65 20 74 72 61 63 65 20 63 61 6c 6c 62 61  The trace callba
0c90: 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  ck routine */.  
0ca0: 63 68 61 72 20 2a 7a 50 72 6f 66 69 6c 65 3b 20  char *zProfile; 
0cb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
0cc0: 65 20 70 72 6f 66 69 6c 65 20 63 61 6c 6c 62 61  e profile callba
0cd0: 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  ck routine */.  
0ce0: 63 68 61 72 20 2a 7a 50 72 6f 67 72 65 73 73 3b  char *zProgress;
0cf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
0d00: 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62  e progress callb
0d10: 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  ack routine */. 
0d20: 20 63 68 61 72 20 2a 7a 41 75 74 68 3b 20 20 20   char *zAuth;   
0d30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
0d40: 68 65 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  he authorization
0d50: 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e   callback routin
0d60: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 75  e */.  char *zNu
0d70: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
0d80: 20 20 2f 2a 20 54 65 78 74 20 74 6f 20 73 75 62    /* Text to sub
0d90: 73 74 69 74 75 74 65 20 66 6f 72 20 61 6e 20 53  stitute for an S
0da0: 51 4c 20 4e 55 4c 4c 20 76 61 6c 75 65 20 2a 2f  QL NULL value */
0db0: 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70 46 75 6e  .  SqlFunc *pFun
0dc0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  c;            /*
0dd0: 20 4c 69 73 74 20 6f 66 20 53 51 4c 20 66 75 6e   List of SQL fun
0de0: 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 54 63 6c 5f  ctions */.  Tcl_
0df0: 4f 62 6a 20 2a 70 55 70 64 61 74 65 48 6f 6f 6b  Obj *pUpdateHook
0e00: 3b 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65  ;      /* Update
0e10: 20 68 6f 6f 6b 20 73 63 72 69 70 74 20 28 69 66   hook script (if
0e20: 20 61 6e 79 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f   any) */.  Tcl_O
0e30: 62 6a 20 2a 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f  bj *pRollbackHoo
0e40: 6b 3b 20 20 20 20 2f 2a 20 52 6f 6c 6c 62 61 63  k;    /* Rollbac
0e50: 6b 20 68 6f 6f 6b 20 73 63 72 69 70 74 20 28 69  k hook script (i
0e60: 66 20 61 6e 79 29 20 2a 2f 0a 20 20 53 71 6c 43  f any) */.  SqlC
0e70: 6f 6c 6c 61 74 65 20 2a 70 43 6f 6c 6c 61 74 65  ollate *pCollate
0e80: 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  ;      /* List o
0e90: 66 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20  f SQL collation 
0ea0: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  functions */.  i
0eb0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
0ec0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
0ed0: 75 72 6e 20 63 6f 64 65 20 6f 66 20 6d 6f 73 74  urn code of most
0ee0: 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f   recent sqlite3_
0ef0: 65 78 65 63 28 29 20 2a 2f 0a 20 20 54 63 6c 5f  exec() */.  Tcl_
0f00: 4f 62 6a 20 2a 70 43 6f 6c 6c 61 74 65 4e 65 65  Obj *pCollateNee
0f10: 64 65 64 3b 20 20 20 2f 2a 20 43 6f 6c 6c 61 74  ded;   /* Collat
0f20: 69 6f 6e 20 6e 65 65 64 65 64 20 73 63 72 69 70  ion needed scrip
0f30: 74 20 2a 2f 0a 20 20 53 71 6c 50 72 65 70 61 72  t */.  SqlPrepar
0f40: 65 64 53 74 6d 74 20 2a 73 74 6d 74 4c 69 73 74  edStmt *stmtList
0f50: 3b 20 2f 2a 20 4c 69 73 74 20 6f 66 20 70 72 65  ; /* List of pre
0f60: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73  pared statements
0f70: 2a 2f 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64  */.  SqlPrepared
0f80: 53 74 6d 74 20 2a 73 74 6d 74 4c 61 73 74 3b 20  Stmt *stmtLast; 
0f90: 2f 2a 20 4c 61 73 74 20 73 74 61 74 65 6d 65 6e  /* Last statemen
0fa0: 74 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f  t in the list */
0fb0: 0a 20 20 69 6e 74 20 6d 61 78 53 74 6d 74 3b 20  .  int maxStmt; 
0fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0fd0: 20 54 68 65 20 6e 65 78 74 20 6d 61 78 69 6d 75   The next maximu
0fe0: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73 74 6d 74  m number of stmt
0ff0: 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  List */.  int nS
1000: 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tmt;            
1010: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1020: 66 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20  f statements in 
1030: 73 74 6d 74 4c 69 73 74 20 2a 2f 0a 7d 3b 0a 0a  stmtList */.};..
1040: 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 61 74 20 74 68  /*.** Look at th
1050: 65 20 73 63 72 69 70 74 20 70 72 65 66 69 78 20  e script prefix 
1060: 69 6e 20 70 43 6d 64 2e 20 20 57 65 20 77 69 6c  in pCmd.  We wil
1070: 6c 20 62 65 20 65 78 65 63 75 74 69 6e 67 20 74  l be executing t
1080: 68 69 73 20 73 63 72 69 70 74 0a 2a 2a 20 61 66  his script.** af
1090: 74 65 72 20 66 69 72 73 74 20 61 70 70 65 6e 64  ter first append
10a0: 69 6e 67 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ing one or more 
10b0: 61 72 67 75 6d 65 6e 74 73 2e 20 20 54 68 69 73  arguments.  This
10c0: 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65   routine analyze
10d0: 73 0a 2a 2a 20 74 68 65 20 73 63 72 69 70 74 20  s.** the script 
10e0: 74 6f 20 73 65 65 20 69 66 20 69 74 20 69 73 20  to see if it is 
10f0: 73 61 66 65 20 74 6f 20 75 73 65 20 54 63 6c 5f  safe to use Tcl_
1100: 45 76 61 6c 4f 62 6a 76 28 29 20 6f 6e 20 74 68  EvalObjv() on th
1110: 65 20 73 63 72 69 70 74 0a 2a 2a 20 72 61 74 68  e script.** rath
1120: 65 72 20 74 68 61 6e 20 74 68 65 20 6d 6f 72 65  er than the more
1130: 20 67 65 6e 65 72 61 6c 20 54 63 6c 5f 45 76 61   general Tcl_Eva
1140: 6c 45 78 28 29 2e 20 20 54 63 6c 5f 45 76 61 6c  lEx().  Tcl_Eval
1150: 4f 62 6a 76 28 29 20 69 73 20 6d 75 63 68 0a 2a  Objv() is much.*
1160: 2a 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  * faster..**.** 
1170: 53 63 72 69 70 74 73 20 74 68 61 74 20 61 72 65  Scripts that are
1180: 20 73 61 66 65 20 74 6f 20 75 73 65 20 77 69 74   safe to use wit
1190: 68 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29  h Tcl_EvalObjv()
11a0: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a   consists of a.*
11b0: 2a 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20 66  * command name f
11c0: 6f 6c 6c 6f 77 65 64 20 62 79 20 7a 65 72 6f 20  ollowed by zero 
11d0: 6f 72 20 6d 6f 72 65 20 61 72 67 75 6d 65 6e 74  or more argument
11e0: 73 20 77 69 74 68 20 6e 6f 20 5b 2e 2e 2e 5d 20  s with no [...] 
11f0: 6f 72 20 24 0a 2a 2a 20 6f 72 20 7b 2e 2e 2e 7d  or $.** or {...}
1200: 20 6f 72 20 3b 20 74 6f 20 62 65 20 73 65 65 6e   or ; to be seen
1210: 20 61 6e 79 77 68 65 72 65 2e 20 20 4d 6f 73 74   anywhere.  Most
1220: 20 63 61 6c 6c 62 61 63 6b 20 73 63 72 69 70 74   callback script
1230: 73 20 63 6f 6e 73 69 73 74 0a 2a 2a 20 6f 66 20  s consist.** of 
1240: 6a 75 73 74 20 61 20 73 69 6e 67 6c 65 20 70 72  just a single pr
1250: 6f 63 65 64 75 72 65 20 6e 61 6d 65 20 61 6e 64  ocedure name and
1260: 20 74 68 65 79 20 6d 65 65 74 20 74 68 69 73 20   they meet this 
1270: 72 65 71 75 69 72 65 6d 65 6e 74 2e 0a 2a 2f 0a  requirement..*/.
1280: 73 74 61 74 69 63 20 69 6e 74 20 73 61 66 65 54  static int safeT
1290: 6f 55 73 65 45 76 61 6c 4f 62 6a 76 28 54 63 6c  oUseEvalObjv(Tcl
12a0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
12b0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 29 7b   Tcl_Obj *pCmd){
12c0: 0a 20 20 2f 2a 20 57 65 20 63 6f 75 6c 64 20 74  .  /* We could t
12d0: 72 79 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69  ry to do somethi
12e0: 6e 67 20 77 69 74 68 20 54 63 6c 5f 50 61 72 73  ng with Tcl_Pars
12f0: 65 28 29 2e 20 20 42 75 74 20 77 65 20 77 69 6c  e().  But we wil
1300: 6c 20 69 6e 73 74 65 61 64 0a 20 20 2a 2a 20 6a  l instead.  ** j
1310: 75 73 74 20 64 6f 20 61 20 73 65 61 72 63 68 20  ust do a search 
1320: 66 6f 72 20 66 6f 72 62 69 64 64 65 6e 20 63 68  for forbidden ch
1330: 61 72 61 63 74 65 72 73 2e 20 20 49 66 20 61 6e  aracters.  If an
1340: 79 20 6f 66 20 74 68 65 20 66 6f 72 62 69 64 64  y of the forbidd
1350: 65 6e 0a 20 20 2a 2a 20 63 68 61 72 61 63 74 65  en.  ** characte
1360: 72 73 20 61 70 70 65 61 72 20 69 6e 20 70 43 6d  rs appear in pCm
1370: 64 2c 20 77 65 20 77 69 6c 6c 20 72 65 70 6f 72  d, we will repor
1380: 74 20 74 68 65 20 73 74 72 69 6e 67 20 61 73 20  t the string as 
1390: 75 6e 73 61 66 65 2e 0a 20 20 2a 2f 0a 20 20 63  unsafe..  */.  c
13a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
13b0: 69 6e 74 20 6e 3b 0a 20 20 7a 20 3d 20 54 63 6c  int n;.  z = Tcl
13c0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
13d0: 6a 28 70 43 6d 64 2c 20 26 6e 29 3b 0a 20 20 77  j(pCmd, &n);.  w
13e0: 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b  hile( n-- > 0 ){
13f0: 0a 20 20 20 20 69 6e 74 20 63 20 3d 20 2a 28 7a  .    int c = *(z
1400: 2b 2b 29 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d  ++);.    if( c==
1410: 27 24 27 20 7c 7c 20 63 3d 3d 27 5b 27 20 7c 7c  '$' || c=='[' ||
1420: 20 63 3d 3d 27 3b 27 20 29 20 72 65 74 75 72 6e   c==';' ) return
1430: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
1440: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e   1;.}../*.** Fin
1450: 64 20 61 6e 20 53 71 6c 46 75 6e 63 20 73 74 72  d an SqlFunc str
1460: 75 63 74 75 72 65 20 77 69 74 68 20 74 68 65 20  ucture with the 
1470: 67 69 76 65 6e 20 6e 61 6d 65 2e 20 20 4f 72 20  given name.  Or 
1480: 63 72 65 61 74 65 20 61 20 6e 65 77 0a 2a 2a 20  create a new.** 
1490: 6f 6e 65 20 69 66 20 61 6e 20 65 78 69 73 74 69  one if an existi
14a0: 6e 67 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 62 65  ng one cannot be
14b0: 20 66 6f 75 6e 64 2e 20 20 52 65 74 75 72 6e 20   found.  Return 
14c0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
14d0: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  .** structure..*
14e0: 2f 0a 73 74 61 74 69 63 20 53 71 6c 46 75 6e 63  /.static SqlFunc
14f0: 20 2a 66 69 6e 64 53 71 6c 46 75 6e 63 28 53 71   *findSqlFunc(Sq
1500: 6c 69 74 65 44 62 20 2a 70 44 62 2c 20 63 6f 6e  liteDb *pDb, con
1510: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
1520: 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70 2c 20 2a  .  SqlFunc *p, *
1530: 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  pNew;.  int i;. 
1540: 20 70 4e 65 77 20 3d 20 28 53 71 6c 46 75 6e 63   pNew = (SqlFunc
1550: 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a  *)Tcl_Alloc( siz
1560: 65 6f 66 28 2a 70 4e 65 77 29 20 2b 20 73 74 72  eof(*pNew) + str
1570: 6c 65 6e 28 7a 4e 61 6d 65 29 20 2b 20 31 20 29  len(zName) + 1 )
1580: 3b 0a 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20  ;.  pNew->zName 
1590: 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31  = (char*)&pNew[1
15a0: 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4e  ];.  for(i=0; zN
15b0: 61 6d 65 5b 69 5d 3b 20 69 2b 2b 29 7b 20 70 4e  ame[i]; i++){ pN
15c0: 65 77 2d 3e 7a 4e 61 6d 65 5b 69 5d 20 3d 20 74  ew->zName[i] = t
15d0: 6f 6c 6f 77 65 72 28 7a 4e 61 6d 65 5b 69 5d 29  olower(zName[i])
15e0: 3b 20 7d 0a 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d  ; }.  pNew->zNam
15f0: 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 66 6f 72 28  e[i] = 0;.  for(
1600: 70 3d 70 44 62 2d 3e 70 46 75 6e 63 3b 20 70 3b  p=pDb->pFunc; p;
1610: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 20 0a 20   p=p->pNext){ . 
1620: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 70 2d     if( strcmp(p-
1630: 3e 7a 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 4e  >zName, pNew->zN
1640: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
1650: 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a   Tcl_Free((char*
1660: 29 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 72 65  )pNew);.      re
1670: 74 75 72 6e 20 70 3b 0a 20 20 20 20 7d 0a 20 20  turn p;.    }.  
1680: 7d 0a 20 20 70 4e 65 77 2d 3e 69 6e 74 65 72 70  }.  pNew->interp
1690: 20 3d 20 70 44 62 2d 3e 69 6e 74 65 72 70 3b 0a   = pDb->interp;.
16a0: 20 20 70 4e 65 77 2d 3e 70 53 63 72 69 70 74 20    pNew->pScript 
16b0: 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65  = 0;.  pNew->pNe
16c0: 78 74 20 3d 20 70 44 62 2d 3e 70 46 75 6e 63 3b  xt = pDb->pFunc;
16d0: 0a 20 20 70 44 62 2d 3e 70 46 75 6e 63 20 3d 20  .  pDb->pFunc = 
16e0: 70 4e 65 77 3b 0a 20 20 72 65 74 75 72 6e 20 70  pNew;.  return p
16f0: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  New;.}../*.** Fi
1700: 6e 61 6c 69 7a 65 20 61 6e 64 20 66 72 65 65 20  nalize and free 
1710: 61 20 6c 69 73 74 20 6f 66 20 70 72 65 70 61 72  a list of prepar
1720: 65 64 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2f  ed statements.*/
1730: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 6c 75  .static void flu
1740: 73 68 53 74 6d 74 43 61 63 68 65 28 20 53 71 6c  shStmtCache( Sql
1750: 69 74 65 44 62 20 2a 70 44 62 20 29 7b 0a 20 20  iteDb *pDb ){.  
1760: 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20  SqlPreparedStmt 
1770: 2a 70 50 72 65 53 74 6d 74 3b 0a 0a 20 20 77 68  *pPreStmt;..  wh
1780: 69 6c 65 28 20 20 70 44 62 2d 3e 73 74 6d 74 4c  ile(  pDb->stmtL
1790: 69 73 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ist ){.    sqlit
17a0: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 20 70 44 62  e3_finalize( pDb
17b0: 2d 3e 73 74 6d 74 4c 69 73 74 2d 3e 70 53 74 6d  ->stmtList->pStm
17c0: 74 20 29 3b 0a 20 20 20 20 70 50 72 65 53 74 6d  t );.    pPreStm
17d0: 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73  t = pDb->stmtLis
17e0: 74 3b 0a 20 20 20 20 70 44 62 2d 3e 73 74 6d 74  t;.    pDb->stmt
17f0: 4c 69 73 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74  List = pDb->stmt
1800: 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  List->pNext;.   
1810: 20 54 63 6c 5f 46 72 65 65 28 20 28 63 68 61 72   Tcl_Free( (char
1820: 2a 29 70 50 72 65 53 74 6d 74 20 29 3b 0a 20 20  *)pPreStmt );.  
1830: 7d 0a 20 20 70 44 62 2d 3e 6e 53 74 6d 74 20 3d  }.  pDb->nStmt =
1840: 20 30 3b 0a 20 20 70 44 62 2d 3e 73 74 6d 74 4c   0;.  pDb->stmtL
1850: 61 73 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ast = 0;.}../*.*
1860: 2a 20 54 43 4c 20 63 61 6c 6c 73 20 74 68 69 73  * TCL calls this
1870: 20 70 72 6f 63 65 64 75 72 65 20 77 68 65 6e 20   procedure when 
1880: 61 6e 20 73 71 6c 69 74 65 33 20 64 61 74 61 62  an sqlite3 datab
1890: 61 73 65 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a  ase command is.*
18a0: 2a 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74  * deleted..*/.st
18b0: 61 74 69 63 20 76 6f 69 64 20 44 62 44 65 6c 65  atic void DbDele
18c0: 74 65 43 6d 64 28 76 6f 69 64 20 2a 64 62 29 7b  teCmd(void *db){
18d0: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
18e0: 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 64 62   = (SqliteDb*)db
18f0: 3b 0a 20 20 66 6c 75 73 68 53 74 6d 74 43 61 63  ;.  flushStmtCac
1900: 68 65 28 70 44 62 29 3b 0a 20 20 73 71 6c 69 74  he(pDb);.  sqlit
1910: 65 33 5f 63 6c 6f 73 65 28 70 44 62 2d 3e 64 62  e3_close(pDb->db
1920: 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 44 62 2d  );.  while( pDb-
1930: 3e 70 46 75 6e 63 20 29 7b 0a 20 20 20 20 53 71  >pFunc ){.    Sq
1940: 6c 46 75 6e 63 20 2a 70 46 75 6e 63 20 3d 20 70  lFunc *pFunc = p
1950: 44 62 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 70  Db->pFunc;.    p
1960: 44 62 2d 3e 70 46 75 6e 63 20 3d 20 70 46 75 6e  Db->pFunc = pFun
1970: 63 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 54 63  c->pNext;.    Tc
1980: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
1990: 46 75 6e 63 2d 3e 70 53 63 72 69 70 74 29 3b 0a  Func->pScript);.
19a0: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68      Tcl_Free((ch
19b0: 61 72 2a 29 70 46 75 6e 63 29 3b 0a 20 20 7d 0a  ar*)pFunc);.  }.
19c0: 20 20 77 68 69 6c 65 28 20 70 44 62 2d 3e 70 43    while( pDb->pC
19d0: 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 53 71  ollate ){.    Sq
19e0: 6c 43 6f 6c 6c 61 74 65 20 2a 70 43 6f 6c 6c 61  lCollate *pColla
19f0: 74 65 20 3d 20 70 44 62 2d 3e 70 43 6f 6c 6c 61  te = pDb->pColla
1a00: 74 65 3b 0a 20 20 20 20 70 44 62 2d 3e 70 43 6f  te;.    pDb->pCo
1a10: 6c 6c 61 74 65 20 3d 20 70 43 6f 6c 6c 61 74 65  llate = pCollate
1a20: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 54 63 6c  ->pNext;.    Tcl
1a30: 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 43 6f  _Free((char*)pCo
1a40: 6c 6c 61 74 65 29 3b 0a 20 20 7d 0a 20 20 69 66  llate);.  }.  if
1a50: 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a  ( pDb->zBusy ){.
1a60: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
1a70: 2d 3e 7a 42 75 73 79 29 3b 0a 20 20 7d 0a 20 20  ->zBusy);.  }.  
1a80: 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 20  if( pDb->zTrace 
1a90: 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28  ){.    Tcl_Free(
1aa0: 70 44 62 2d 3e 7a 54 72 61 63 65 29 3b 0a 20 20  pDb->zTrace);.  
1ab0: 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72  }.  if( pDb->zPr
1ac0: 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20 54 63 6c  ofile ){.    Tcl
1ad0: 5f 46 72 65 65 28 70 44 62 2d 3e 7a 50 72 6f 66  _Free(pDb->zProf
1ae0: 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ile);.  }.  if( 
1af0: 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20  pDb->zAuth ){.  
1b00: 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e    Tcl_Free(pDb->
1b10: 7a 41 75 74 68 29 3b 0a 20 20 7d 0a 20 20 69 66  zAuth);.  }.  if
1b20: 28 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 29 7b 0a  ( pDb->zNull ){.
1b30: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
1b40: 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20  ->zNull);.  }.  
1b50: 69 66 28 20 70 44 62 2d 3e 70 55 70 64 61 74 65  if( pDb->pUpdate
1b60: 48 6f 6f 6b 20 29 7b 0a 20 20 20 20 54 63 6c 5f  Hook ){.    Tcl_
1b70: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62  DecrRefCount(pDb
1b80: 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b 29 3b 0a  ->pUpdateHook);.
1b90: 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 70    }.  if( pDb->p
1ba0: 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 20 29 7b 0a  RollbackHook ){.
1bb0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
1bc0: 6f 75 6e 74 28 70 44 62 2d 3e 70 52 6f 6c 6c 62  ount(pDb->pRollb
1bd0: 61 63 6b 48 6f 6f 6b 29 3b 0a 20 20 7d 0a 20 20  ackHook);.  }.  
1be0: 69 66 28 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74  if( pDb->pCollat
1bf0: 65 4e 65 65 64 65 64 20 29 7b 0a 20 20 20 20 54  eNeeded ){.    T
1c00: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
1c10: 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65  pDb->pCollateNee
1c20: 64 65 64 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f  ded);.  }.  Tcl_
1c30: 46 72 65 65 28 28 63 68 61 72 2a 29 70 44 62 29  Free((char*)pDb)
1c40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1c50: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
1c60: 64 20 77 68 65 6e 20 61 20 64 61 74 61 62 61 73  d when a databas
1c70: 65 20 66 69 6c 65 20 69 73 20 6c 6f 63 6b 65 64  e file is locked
1c80: 20 77 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a   while trying.**
1c90: 20 74 6f 20 65 78 65 63 75 74 65 20 53 51 4c 2e   to execute SQL.
1ca0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44  .*/.static int D
1cb0: 62 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69  bBusyHandler(voi
1cc0: 64 20 2a 63 64 2c 20 69 6e 74 20 6e 54 72 69 65  d *cd, int nTrie
1cd0: 73 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  s){.  SqliteDb *
1ce0: 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a  pDb = (SqliteDb*
1cf0: 29 63 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  )cd;.  int rc;. 
1d00: 20 63 68 61 72 20 7a 56 61 6c 5b 33 30 5d 3b 0a   char zVal[30];.
1d10: 0a 20 20 73 70 72 69 6e 74 66 28 7a 56 61 6c 2c  .  sprintf(zVal,
1d20: 20 22 25 64 22 2c 20 6e 54 72 69 65 73 29 3b 0a   "%d", nTries);.
1d30: 20 20 72 63 20 3d 20 54 63 6c 5f 56 61 72 45 76    rc = Tcl_VarEv
1d40: 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20  al(pDb->interp, 
1d50: 70 44 62 2d 3e 7a 42 75 73 79 2c 20 22 20 22 2c  pDb->zBusy, " ",
1d60: 20 7a 56 61 6c 2c 20 28 63 68 61 72 2a 29 30 29   zVal, (char*)0)
1d70: 3b 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f  ;.  if( rc!=TCL_
1d80: 4f 4b 20 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47  OK || atoi(Tcl_G
1d90: 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70  etStringResult(p
1da0: 44 62 2d 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a  Db->interp)) ){.
1db0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1dc0: 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
1dd0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1de0: 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 61  ine is invoked a
1df0: 73 20 74 68 65 20 27 70 72 6f 67 72 65 73 73 20  s the 'progress 
1e00: 63 61 6c 6c 62 61 63 6b 27 20 66 6f 72 20 74 68  callback' for th
1e10: 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73  e database..*/.s
1e20: 74 61 74 69 63 20 69 6e 74 20 44 62 50 72 6f 67  tatic int DbProg
1e30: 72 65 73 73 48 61 6e 64 6c 65 72 28 76 6f 69 64  ressHandler(void
1e40: 20 2a 63 64 29 7b 0a 20 20 53 71 6c 69 74 65 44   *cd){.  SqliteD
1e50: 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65  b *pDb = (Sqlite
1e60: 44 62 2a 29 63 64 3b 0a 20 20 69 6e 74 20 72 63  Db*)cd;.  int rc
1e70: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 44 62  ;..  assert( pDb
1e80: 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29 3b 0a 20  ->zProgress );. 
1e90: 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 28 70   rc = Tcl_Eval(p
1ea0: 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d  Db->interp, pDb-
1eb0: 3e 7a 50 72 6f 67 72 65 73 73 29 3b 0a 20 20 69  >zProgress);.  i
1ec0: 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c  f( rc!=TCL_OK ||
1ed0: 20 61 74 6f 69 28 54 63 6c 5f 47 65 74 53 74 72   atoi(Tcl_GetStr
1ee0: 69 6e 67 52 65 73 75 6c 74 28 70 44 62 2d 3e 69  ingResult(pDb->i
1ef0: 6e 74 65 72 70 29 29 20 29 7b 0a 20 20 20 20 72  nterp)) ){.    r
1f00: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
1f10: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
1f20: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
1f30: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
1f40: 53 51 4c 69 74 65 20 74 72 61 63 65 20 68 61 6e  SQLite trace han
1f50: 64 6c 65 72 20 77 68 65 6e 65 76 65 72 20 61 20  dler whenever a 
1f60: 6e 65 77 0a 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20  new.** block of 
1f70: 53 51 4c 20 69 73 20 65 78 65 63 75 74 65 64 2e  SQL is executed.
1f80: 20 20 54 68 65 20 54 43 4c 20 73 63 72 69 70 74    The TCL script
1f90: 20 69 6e 20 70 44 62 2d 3e 7a 54 72 61 63 65 20   in pDb->zTrace 
1fa0: 69 73 20 65 78 65 63 75 74 65 64 2e 0a 2a 2f 0a  is executed..*/.
1fb0: 73 74 61 74 69 63 20 76 6f 69 64 20 44 62 54 72  static void DbTr
1fc0: 61 63 65 48 61 6e 64 6c 65 72 28 76 6f 69 64 20  aceHandler(void 
1fd0: 2a 63 64 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *cd, const char 
1fe0: 2a 7a 53 71 6c 29 7b 0a 20 20 53 71 6c 69 74 65  *zSql){.  Sqlite
1ff0: 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74  Db *pDb = (Sqlit
2000: 65 44 62 2a 29 63 64 3b 0a 20 20 54 63 6c 5f 44  eDb*)cd;.  Tcl_D
2010: 53 74 72 69 6e 67 20 73 74 72 3b 0a 0a 20 20 54  String str;..  T
2020: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
2030: 73 74 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72  str);.  Tcl_DStr
2040: 69 6e 67 41 70 70 65 6e 64 28 26 73 74 72 2c 20  ingAppend(&str, 
2050: 70 44 62 2d 3e 7a 54 72 61 63 65 2c 20 2d 31 29  pDb->zTrace, -1)
2060: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41  ;.  Tcl_DStringA
2070: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74  ppendElement(&st
2080: 72 2c 20 7a 53 71 6c 29 3b 0a 20 20 54 63 6c 5f  r, zSql);.  Tcl_
2090: 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70  Eval(pDb->interp
20a0: 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c  , Tcl_DStringVal
20b0: 75 65 28 26 73 74 72 29 29 3b 0a 20 20 54 63 6c  ue(&str));.  Tcl
20c0: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 73 74  _DStringFree(&st
20d0: 72 29 3b 0a 20 20 54 63 6c 5f 52 65 73 65 74 52  r);.  Tcl_ResetR
20e0: 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72  esult(pDb->inter
20f0: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  p);.}../*.** Thi
2100: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
2110: 6c 65 64 20 62 79 20 74 68 65 20 53 51 4c 69 74  led by the SQLit
2120: 65 20 70 72 6f 66 69 6c 65 20 68 61 6e 64 6c 65  e profile handle
2130: 72 20 61 66 74 65 72 20 61 20 73 74 61 74 65 6d  r after a statem
2140: 65 6e 74 0a 2a 2a 20 53 51 4c 20 68 61 73 20 65  ent.** SQL has e
2150: 78 65 63 75 74 65 64 2e 20 20 54 68 65 20 54 43  xecuted.  The TC
2160: 4c 20 73 63 72 69 70 74 20 69 6e 20 70 44 62 2d  L script in pDb-
2170: 3e 7a 50 72 6f 66 69 6c 65 20 69 73 20 65 76 61  >zProfile is eva
2180: 6c 75 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  luated..*/.stati
2190: 63 20 76 6f 69 64 20 44 62 50 72 6f 66 69 6c 65  c void DbProfile
21a0: 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64  Handler(void *cd
21b0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53  , const char *zS
21c0: 71 6c 2c 20 73 71 6c 69 74 65 5f 75 69 6e 74 36  ql, sqlite_uint6
21d0: 34 20 74 6d 29 7b 0a 20 20 53 71 6c 69 74 65 44  4 tm){.  SqliteD
21e0: 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65  b *pDb = (Sqlite
21f0: 44 62 2a 29 63 64 3b 0a 20 20 54 63 6c 5f 44 53  Db*)cd;.  Tcl_DS
2200: 74 72 69 6e 67 20 73 74 72 3b 0a 20 20 63 68 61  tring str;.  cha
2210: 72 20 7a 54 6d 5b 31 30 30 5d 3b 0a 0a 20 20 73  r zTm[100];..  s
2220: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2230: 73 69 7a 65 6f 66 28 7a 54 6d 29 2d 31 2c 20 7a  sizeof(zTm)-1, z
2240: 54 6d 2c 20 22 25 6c 6c 64 22 2c 20 74 6d 29 3b  Tm, "%lld", tm);
2250: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e  .  Tcl_DStringIn
2260: 69 74 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f  it(&str);.  Tcl_
2270: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 73  DStringAppend(&s
2280: 74 72 2c 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c  tr, pDb->zProfil
2290: 65 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53  e, -1);.  Tcl_DS
22a0: 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65  tringAppendEleme
22b0: 6e 74 28 26 73 74 72 2c 20 7a 53 71 6c 29 3b 0a  nt(&str, zSql);.
22c0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
22d0: 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c  endElement(&str,
22e0: 20 7a 54 6d 29 3b 0a 20 20 54 63 6c 5f 45 76 61   zTm);.  Tcl_Eva
22f0: 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 54  l(pDb->interp, T
2300: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28  cl_DStringValue(
2310: 26 73 74 72 29 29 3b 0a 20 20 54 63 6c 5f 44 53  &str));.  Tcl_DS
2320: 74 72 69 6e 67 46 72 65 65 28 26 73 74 72 29 3b  tringFree(&str);
2330: 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75  .  Tcl_ResetResu
2340: 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 3b  lt(pDb->interp);
2350: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
2360: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
2370: 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
2380: 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
2390: 2e 20 20 54 68 65 0a 2a 2a 20 54 43 4c 20 73 63  .  The.** TCL sc
23a0: 72 69 70 74 20 69 6e 20 70 44 62 2d 3e 7a 43 6f  ript in pDb->zCo
23b0: 6d 6d 69 74 20 69 73 20 65 78 65 63 75 74 65 64  mmit is executed
23c0: 2e 20 20 49 66 20 69 74 20 72 65 74 75 72 6e 73  .  If it returns
23d0: 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 0a 2a 2a 20   non-zero or.** 
23e0: 69 66 20 69 74 20 74 68 72 6f 77 73 20 61 6e 20  if it throws an 
23f0: 65 78 63 65 70 74 69 6f 6e 2c 20 74 68 65 20 74  exception, the t
2400: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
2410: 6c 6c 65 64 20 62 61 63 6b 20 69 6e 73 74 65 61  lled back instea
2420: 64 0a 2a 2a 20 6f 66 20 62 65 69 6e 67 20 63 6f  d.** of being co
2430: 6d 6d 69 74 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  mmitted..*/.stat
2440: 69 63 20 69 6e 74 20 44 62 43 6f 6d 6d 69 74 48  ic int DbCommitH
2450: 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 29  andler(void *cd)
2460: 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  {.  SqliteDb *pD
2470: 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63  b = (SqliteDb*)c
2480: 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  d;.  int rc;..  
2490: 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 28 70 44  rc = Tcl_Eval(pD
24a0: 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e  b->interp, pDb->
24b0: 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20  zCommit);.  if( 
24c0: 72 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74  rc!=TCL_OK || at
24d0: 6f 69 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  oi(Tcl_GetString
24e0: 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65  Result(pDb->inte
24f0: 72 70 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75  rp)) ){.    retu
2500: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
2510: 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  rn 0;.}..static 
2520: 76 6f 69 64 20 44 62 52 6f 6c 6c 62 61 63 6b 48  void DbRollbackH
2530: 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 6c 69  andler(void *cli
2540: 65 6e 74 44 61 74 61 29 7b 0a 20 20 53 71 6c 69  entData){.  Sqli
2550: 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c  teDb *pDb = (Sql
2560: 69 74 65 44 62 2a 29 63 6c 69 65 6e 74 44 61 74  iteDb*)clientDat
2570: 61 3b 0a 20 20 61 73 73 65 72 74 28 70 44 62 2d  a;.  assert(pDb-
2580: 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 29 3b  >pRollbackHook);
2590: 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54  .  if( TCL_OK!=T
25a0: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62  cl_EvalObjEx(pDb
25b0: 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 70  ->interp, pDb->p
25c0: 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 2c 20 30 29  RollbackHook, 0)
25d0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 42 61 63 6b   ){.    Tcl_Back
25e0: 67 72 6f 75 6e 64 45 72 72 6f 72 28 70 44 62 2d  groundError(pDb-
25f0: 3e 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 7d 0a  >interp);.  }.}.
2600: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 44 62 55  .static void DbU
2610: 70 64 61 74 65 48 61 6e 64 6c 65 72 28 0a 20 20  pdateHandler(.  
2620: 76 6f 69 64 20 2a 70 2c 20 0a 20 20 69 6e 74 20  void *p, .  int 
2630: 6f 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  op,.  const char
2640: 20 2a 7a 44 62 2c 20 0a 20 20 63 6f 6e 73 74 20   *zDb, .  const 
2650: 63 68 61 72 20 2a 7a 54 62 6c 2c 20 0a 20 20 73  char *zTbl, .  s
2660: 71 6c 69 74 65 5f 69 6e 74 36 34 20 72 6f 77 69  qlite_int64 rowi
2670: 64 0a 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20  d.){.  SqliteDb 
2680: 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62  *pDb = (SqliteDb
2690: 20 2a 29 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20   *)p;.  Tcl_Obj 
26a0: 2a 70 43 6d 64 3b 0a 0a 20 20 61 73 73 65 72 74  *pCmd;..  assert
26b0: 28 20 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f  ( pDb->pUpdateHo
26c0: 6f 6b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ok );.  assert( 
26d0: 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 53 45 52  op==SQLITE_INSER
26e0: 54 20 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54 45 5f  T || op==SQLITE_
26f0: 55 50 44 41 54 45 20 7c 7c 20 6f 70 3d 3d 53 51  UPDATE || op==SQ
2700: 4c 49 54 45 5f 44 45 4c 45 54 45 20 29 3b 0a 0a  LITE_DELETE );..
2710: 20 20 70 43 6d 64 20 3d 20 54 63 6c 5f 44 75 70    pCmd = Tcl_Dup
2720: 6c 69 63 61 74 65 4f 62 6a 28 70 44 62 2d 3e 70  licateObj(pDb->p
2730: 55 70 64 61 74 65 48 6f 6f 6b 29 3b 0a 20 20 54  UpdateHook);.  T
2740: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
2750: 70 43 6d 64 29 3b 0a 20 20 54 63 6c 5f 4c 69 73  pCmd);.  Tcl_Lis
2760: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
2770: 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e  t(0, pCmd, Tcl_N
2780: 65 77 53 74 72 69 6e 67 4f 62 6a 28 0a 20 20 20  ewStringObj(.   
2790: 20 28 20 28 6f 70 3d 3d 53 51 4c 49 54 45 5f 49   ( (op==SQLITE_I
27a0: 4e 53 45 52 54 29 3f 22 49 4e 53 45 52 54 22 3a  NSERT)?"INSERT":
27b0: 28 6f 70 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41  (op==SQLITE_UPDA
27c0: 54 45 29 3f 22 55 50 44 41 54 45 22 3a 22 44 45  TE)?"UPDATE":"DE
27d0: 4c 45 54 45 22 29 2c 20 2d 31 29 29 3b 0a 20 20  LETE"), -1));.  
27e0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
27f0: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64  dElement(0, pCmd
2800: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
2810: 62 6a 28 7a 44 62 2c 20 2d 31 29 29 3b 0a 20 20  bj(zDb, -1));.  
2820: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2830: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64  dElement(0, pCmd
2840: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
2850: 62 6a 28 7a 54 62 6c 2c 20 2d 31 29 29 3b 0a 20  bj(zTbl, -1));. 
2860: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
2870: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d  ndElement(0, pCm
2880: 64 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e  d, Tcl_NewWideIn
2890: 74 4f 62 6a 28 72 6f 77 69 64 29 29 3b 0a 20 20  tObj(rowid));.  
28a0: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44  Tcl_EvalObjEx(pD
28b0: 62 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c  b->interp, pCmd,
28c0: 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54   TCL_EVAL_DIRECT
28d0: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
28e0: 64 20 74 63 6c 43 6f 6c 6c 61 74 65 4e 65 65 64  d tclCollateNeed
28f0: 65 64 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78  ed(.  void *pCtx
2900: 2c 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  ,.  sqlite3 *db,
2910: 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 63 6f  .  int enc,.  co
2920: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a  nst char *zName.
2930: 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  ){.  SqliteDb *p
2940: 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 20 2a  Db = (SqliteDb *
2950: 29 70 43 74 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a  )pCtx;.  Tcl_Obj
2960: 20 2a 70 53 63 72 69 70 74 20 3d 20 54 63 6c 5f   *pScript = Tcl_
2970: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 44 62  DuplicateObj(pDb
2980: 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64  ->pCollateNeeded
2990: 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  );.  Tcl_IncrRef
29a0: 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a  Count(pScript);.
29b0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
29c0: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 53  endElement(0, pS
29d0: 63 72 69 70 74 2c 20 54 63 6c 5f 4e 65 77 53 74  cript, Tcl_NewSt
29e0: 72 69 6e 67 4f 62 6a 28 7a 4e 61 6d 65 2c 20 2d  ringObj(zName, -
29f0: 31 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f  1));.  Tcl_EvalO
2a00: 62 6a 45 78 28 70 44 62 2d 3e 69 6e 74 65 72 70  bjEx(pDb->interp
2a10: 2c 20 70 53 63 72 69 70 74 2c 20 30 29 3b 0a 20  , pScript, 0);. 
2a20: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
2a30: 74 28 70 53 63 72 69 70 74 29 3b 0a 7d 0a 0a 2f  t(pScript);.}../
2a40: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2a50: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 65  e is called to e
2a60: 76 61 6c 75 61 74 65 20 61 6e 20 53 51 4c 20 63  valuate an SQL c
2a70: 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f  ollation functio
2a80: 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a  n implemented.**
2a90: 20 75 73 69 6e 67 20 54 43 4c 20 73 63 72 69 70   using TCL scrip
2aa0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
2ab0: 20 74 63 6c 53 71 6c 43 6f 6c 6c 61 74 65 28 0a   tclSqlCollate(.
2ac0: 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 0a 20 20    void *pCtx,.  
2ad0: 69 6e 74 20 6e 41 2c 0a 20 20 63 6f 6e 73 74 20  int nA,.  const 
2ae0: 76 6f 69 64 20 2a 7a 41 2c 0a 20 20 69 6e 74 20  void *zA,.  int 
2af0: 6e 42 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  nB,.  const void
2b00: 20 2a 7a 42 0a 29 7b 0a 20 20 53 71 6c 43 6f 6c   *zB.){.  SqlCol
2b10: 6c 61 74 65 20 2a 70 20 3d 20 28 53 71 6c 43 6f  late *p = (SqlCo
2b20: 6c 6c 61 74 65 20 2a 29 70 43 74 78 3b 0a 20 20  llate *)pCtx;.  
2b30: 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 0a  Tcl_Obj *pCmd;..
2b40: 20 20 70 43 6d 64 20 3d 20 54 63 6c 5f 4e 65 77    pCmd = Tcl_New
2b50: 53 74 72 69 6e 67 4f 62 6a 28 70 2d 3e 7a 53 63  StringObj(p->zSc
2b60: 72 69 70 74 2c 20 2d 31 29 3b 0a 20 20 54 63 6c  ript, -1);.  Tcl
2b70: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43  _IncrRefCount(pC
2b80: 6d 64 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  md);.  Tcl_ListO
2b90: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
2ba0: 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c  p->interp, pCmd,
2bb0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
2bc0: 6a 28 7a 41 2c 20 6e 41 29 29 3b 0a 20 20 54 63  j(zA, nA));.  Tc
2bd0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
2be0: 6c 65 6d 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70  lement(p->interp
2bf0: 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53  , pCmd, Tcl_NewS
2c00: 74 72 69 6e 67 4f 62 6a 28 7a 42 2c 20 6e 42 29  tringObj(zB, nB)
2c10: 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  );.  Tcl_EvalObj
2c20: 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43  Ex(p->interp, pC
2c30: 6d 64 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52  md, TCL_EVAL_DIR
2c40: 45 43 54 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72  ECT);.  Tcl_Decr
2c50: 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a  RefCount(pCmd);.
2c60: 20 20 72 65 74 75 72 6e 20 28 61 74 6f 69 28 54    return (atoi(T
2c70: 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
2c80: 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 29 29 3b  lt(p->interp)));
2c90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
2ca0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
2cb0: 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20   to evaluate an 
2cc0: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70  SQL function imp
2cd0: 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 75 73 69 6e  lemented.** usin
2ce0: 67 20 54 43 4c 20 73 63 72 69 70 74 2e 0a 2a 2f  g TCL script..*/
2cf0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 63 6c  .static void tcl
2d00: 53 71 6c 46 75 6e 63 28 73 71 6c 69 74 65 33 5f  SqlFunc(sqlite3_
2d10: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
2d20: 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69  , int argc, sqli
2d30: 74 65 33 5f 76 61 6c 75 65 2a 2a 61 72 67 76 29  te3_value**argv)
2d40: 7b 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70 20 3d  {.  SqlFunc *p =
2d50: 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61   sqlite3_user_da
2d60: 74 61 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 54  ta(context);.  T
2d70: 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 20 20  cl_Obj *pCmd;.  
2d80: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b  int i;.  int rc;
2d90: 0a 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 30 20  ..  if( argc==0 
2da0: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
2db0: 72 65 20 61 72 65 20 6e 6f 20 61 72 67 75 6d 65  re are no argume
2dc0: 6e 74 73 20 74 6f 20 74 68 65 20 66 75 6e 63 74  nts to the funct
2dd0: 69 6f 6e 2c 20 63 61 6c 6c 20 54 63 6c 5f 45 76  ion, call Tcl_Ev
2de0: 61 6c 4f 62 6a 45 78 20 6f 6e 20 74 68 65 0a 20  alObjEx on the. 
2df0: 20 20 20 2a 2a 20 73 63 72 69 70 74 20 6f 62 6a     ** script obj
2e00: 65 63 74 20 64 69 72 65 63 74 6c 79 2e 20 20 54  ect directly.  T
2e10: 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 54  his allows the T
2e20: 43 4c 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20 67  CL compiler to g
2e30: 65 6e 65 72 61 74 65 0a 20 20 20 20 2a 2a 20 62  enerate.    ** b
2e40: 79 74 65 63 6f 64 65 20 66 6f 72 20 74 68 65 20  ytecode for the 
2e50: 63 6f 6d 6d 61 6e 64 20 6f 6e 20 74 68 65 20 66  command on the f
2e60: 69 72 73 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20  irst invocation 
2e70: 61 6e 64 20 74 68 75 73 20 6d 61 6b 65 0a 20 20  and thus make.  
2e80: 20 20 2a 2a 20 73 75 62 73 65 71 75 65 6e 74 20    ** subsequent 
2e90: 69 6e 76 6f 63 61 74 69 6f 6e 73 20 6d 75 63 68  invocations much
2ea0: 20 66 61 73 74 65 72 2e 20 2a 2f 0a 20 20 20 20   faster. */.    
2eb0: 70 43 6d 64 20 3d 20 70 2d 3e 70 53 63 72 69 70  pCmd = p->pScrip
2ec0: 74 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  t;.    Tcl_IncrR
2ed0: 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20  efCount(pCmd);. 
2ee0: 20 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c     rc = Tcl_Eval
2ef0: 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c  ObjEx(p->interp,
2f00: 20 70 43 6d 64 2c 20 30 29 3b 0a 20 20 20 20 54   pCmd, 0);.    T
2f10: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
2f20: 70 43 6d 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pCmd);.  }else{.
2f30: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
2f40: 61 72 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  are arguments to
2f50: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2c 20 6d   the function, m
2f60: 61 6b 65 20 61 20 73 68 61 6c 6c 6f 77 20 63 6f  ake a shallow co
2f70: 70 79 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  py of the.    **
2f80: 20 73 63 72 69 70 74 20 6f 62 6a 65 63 74 2c 20   script object, 
2f90: 6c 61 70 70 65 6e 64 20 74 68 65 20 61 72 67 75  lappend the argu
2fa0: 6d 65 6e 74 73 2c 20 74 68 65 6e 20 65 76 61 6c  ments, then eval
2fb0: 75 61 74 65 20 74 68 65 20 63 6f 70 79 2e 0a 20  uate the copy.. 
2fc0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 42 79 20     **.    ** By 
2fd0: 22 73 68 61 6c 6c 6f 77 22 20 63 6f 70 79 2c 20  "shallow" copy, 
2fe0: 77 65 20 6d 65 61 6e 20 61 20 6f 6e 6c 79 20 74  we mean a only t
2ff0: 68 65 20 6f 75 74 65 72 20 6c 69 73 74 20 54 63  he outer list Tc
3000: 6c 5f 4f 62 6a 20 69 73 20 64 75 70 6c 69 63 61  l_Obj is duplica
3010: 74 65 64 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  ted..    ** The 
3020: 6e 65 77 20 54 63 6c 5f 4f 62 6a 20 63 6f 6e 74  new Tcl_Obj cont
3030: 61 69 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f  ains pointers to
3040: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6c 69   the original li
3050: 73 74 20 65 6c 65 6d 65 6e 74 73 2e 20 0a 20 20  st elements. .  
3060: 20 20 2a 2a 20 54 68 61 74 20 77 61 79 2c 20 77    ** That way, w
3070: 68 65 6e 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76  hen Tcl_EvalObjv
3080: 28 29 20 69 73 20 72 75 6e 20 61 6e 64 20 73 68  () is run and sh
3090: 69 6d 6d 65 72 73 20 74 68 65 20 66 69 72 73 74  immers the first
30a0: 20 65 6c 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20   element.    ** 
30b0: 6f 66 20 74 68 65 20 6c 69 73 74 20 74 6f 20 74  of the list to t
30c0: 63 6c 43 6d 64 4e 61 6d 65 54 79 70 65 2c 20 74  clCmdNameType, t
30d0: 68 61 74 20 61 6c 74 65 72 6e 61 74 65 20 72 65  hat alternate re
30e0: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 77 69 6c  presentation wil
30f0: 6c 0a 20 20 20 20 2a 2a 20 62 65 20 70 72 65 73  l.    ** be pres
3100: 65 72 76 65 64 20 61 6e 64 20 72 65 75 73 65 64  erved and reused
3110: 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 69 6e 76   on the next inv
3120: 6f 63 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  ocation..    */.
3130: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 41      Tcl_Obj **aA
3140: 72 67 3b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67  rg;.    int nArg
3150: 3b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 4c 69  ;.    if( Tcl_Li
3160: 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73  stObjGetElements
3170: 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 2d 3e 70  (p->interp, p->p
3180: 53 63 72 69 70 74 2c 20 26 6e 41 72 67 2c 20 26  Script, &nArg, &
3190: 61 41 72 67 29 20 29 7b 0a 20 20 20 20 20 20 73  aArg) ){.      s
31a0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
31b0: 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 54 63 6c  ror(context, Tcl
31c0: 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74  _GetStringResult
31d0: 28 70 2d 3e 69 6e 74 65 72 70 29 2c 20 2d 31 29  (p->interp), -1)
31e0: 3b 20 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  ; .      return;
31f0: 0a 20 20 20 20 7d 20 20 20 20 20 0a 20 20 20 20  .    }     .    
3200: 70 43 6d 64 20 3d 20 54 63 6c 5f 4e 65 77 4c 69  pCmd = Tcl_NewLi
3210: 73 74 4f 62 6a 28 6e 41 72 67 2c 20 61 41 72 67  stObj(nArg, aArg
3220: 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  );.    Tcl_IncrR
3230: 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20  efCount(pCmd);. 
3240: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72     for(i=0; i<ar
3250: 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  gc; i++){.      
3260: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
3270: 49 6e 20 3d 20 61 72 67 76 5b 69 5d 3b 0a 20 20  In = argv[i];.  
3280: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61      Tcl_Obj *pVa
3290: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 0a  l;.            .
32a0: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 70 56 61        /* Set pVa
32b0: 6c 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  l to contain the
32c0: 20 69 27 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20   i'th column of 
32d0: 74 68 69 73 20 72 6f 77 2e 20 2a 2f 0a 20 20 20  this row. */.   
32e0: 20 20 20 73 77 69 74 63 68 28 20 73 71 6c 69 74     switch( sqlit
32f0: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 49  e3_value_type(pI
3300: 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61  n) ){.        ca
3310: 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20  se SQLITE_BLOB: 
3320: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
3330: 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f  bytes = sqlite3_
3340: 76 61 6c 75 65 5f 62 79 74 65 73 28 70 49 6e 29  value_bytes(pIn)
3350: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 56 61 6c  ;.          pVal
3360: 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72   = Tcl_NewByteAr
3370: 72 61 79 4f 62 6a 28 73 71 6c 69 74 65 33 5f 76  rayObj(sqlite3_v
3380: 61 6c 75 65 5f 62 6c 6f 62 28 70 49 6e 29 2c 20  alue_blob(pIn), 
3390: 62 79 74 65 73 29 3b 0a 20 20 20 20 20 20 20 20  bytes);.        
33a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
33b0: 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20   }.        case 
33c0: 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20  SQLITE_INTEGER: 
33d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
33e0: 74 65 5f 69 6e 74 36 34 20 76 20 3d 20 73 71 6c  te_int64 v = sql
33f0: 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34  ite3_value_int64
3400: 28 70 49 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  (pIn);.         
3410: 20 69 66 28 20 76 3e 3d 2d 32 31 34 37 34 38 33   if( v>=-2147483
3420: 36 34 37 20 26 26 20 76 3c 3d 32 31 34 37 34 38  647 && v<=214748
3430: 33 36 34 37 20 29 7b 0a 20 20 20 20 20 20 20 20  3647 ){.        
3440: 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e      pVal = Tcl_N
3450: 65 77 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20  ewIntObj(v);.   
3460: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
3470: 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d            pVal =
3480: 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f   Tcl_NewWideIntO
3490: 62 6a 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  bj(v);.         
34a0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65   }.          bre
34b0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
34c0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
34d0: 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20  E_FLOAT: {.     
34e0: 20 20 20 20 20 64 6f 75 62 6c 65 20 72 20 3d 20       double r = 
34f0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f  sqlite3_value_do
3500: 75 62 6c 65 28 70 49 6e 29 3b 0a 20 20 20 20 20  uble(pIn);.     
3510: 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f       pVal = Tcl_
3520: 4e 65 77 44 6f 75 62 6c 65 4f 62 6a 28 72 29 3b  NewDoubleObj(r);
3530: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
3540: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
3550: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
3560: 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20  NULL: {.        
3570: 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77    pVal = Tcl_New
3580: 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c 20 30 29  StringObj("", 0)
3590: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
35a0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
35b0: 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a       default: {.
35c0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 62 79            int by
35d0: 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  tes = sqlite3_va
35e0: 6c 75 65 5f 62 79 74 65 73 28 70 49 6e 29 3b 0a  lue_bytes(pIn);.
35f0: 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d            pVal =
3600: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
3610: 6a 28 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  j((char *)sqlite
3620: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 49 6e  3_value_text(pIn
3630: 29 2c 20 62 79 74 65 73 29 3b 0a 20 20 20 20 20  ), bytes);.     
3640: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3650: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
3660: 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 4c 69 73      rc = Tcl_Lis
3670: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
3680: 74 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d  t(p->interp, pCm
3690: 64 2c 20 70 56 61 6c 29 3b 0a 20 20 20 20 20 20  d, pVal);.      
36a0: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
36b0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
36c0: 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20 20 20 20  nt(pCmd);.      
36d0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
36e0: 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20  _error(context, 
36f0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73  Tcl_GetStringRes
3700: 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c 20  ult(p->interp), 
3710: 2d 31 29 3b 20 0a 20 20 20 20 20 20 20 20 72 65  -1); .        re
3720: 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
3730: 20 20 7d 0a 20 20 20 20 69 66 28 20 21 70 2d 3e    }.    if( !p->
3740: 75 73 65 45 76 61 6c 4f 62 6a 76 20 29 7b 0a 20  useEvalObjv ){. 
3750: 20 20 20 20 20 2f 2a 20 54 63 6c 5f 45 76 61 6c       /* Tcl_Eval
3760: 4f 62 6a 45 78 28 29 20 77 69 6c 6c 20 61 75 74  ObjEx() will aut
3770: 6f 6d 61 74 69 63 61 6c 6c 79 20 63 61 6c 6c 20  omatically call 
3780: 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20 69  Tcl_EvalObjv() i
3790: 66 20 70 43 6d 64 0a 20 20 20 20 20 20 2a 2a 20  f pCmd.      ** 
37a0: 69 73 20 61 20 6c 69 73 74 20 77 69 74 68 6f 75  is a list withou
37b0: 74 20 61 20 73 74 72 69 6e 67 20 72 65 70 72 65  t a string repre
37c0: 73 65 6e 74 61 74 69 6f 6e 2e 20 20 54 6f 20 70  sentation.  To p
37d0: 72 65 76 65 6e 74 20 74 68 69 73 20 66 72 6f 6d  revent this from
37e0: 0a 20 20 20 20 20 20 2a 2a 20 68 61 70 70 65 6e  .      ** happen
37f0: 69 6e 67 2c 20 6d 61 6b 65 20 73 75 72 65 20 70  ing, make sure p
3800: 43 6d 64 20 68 61 73 20 61 20 76 61 6c 69 64 20  Cmd has a valid 
3810: 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74  string represent
3820: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 54  ation */.      T
3830: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 70 43 6d  cl_GetString(pCm
3840: 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  d);.    }.    rc
3850: 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78   = Tcl_EvalObjEx
3860: 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64  (p->interp, pCmd
3870: 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43  , TCL_EVAL_DIREC
3880: 54 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72  T);.    Tcl_Decr
3890: 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a  RefCount(pCmd);.
38a0: 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 20 26 26    }..  if( rc &&
38b0: 20 72 63 21 3d 54 43 4c 5f 52 45 54 55 52 4e 20   rc!=TCL_RETURN 
38c0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
38d0: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
38e0: 65 78 74 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  ext, Tcl_GetStri
38f0: 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65  ngResult(p->inte
3900: 72 70 29 2c 20 2d 31 29 3b 20 0a 20 20 7d 65 6c  rp), -1); .  }el
3910: 73 65 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  se{.    Tcl_Obj 
3920: 2a 70 56 61 72 20 3d 20 54 63 6c 5f 47 65 74 4f  *pVar = Tcl_GetO
3930: 62 6a 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65  bjResult(p->inte
3940: 72 70 29 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a  rp);.    int n;.
3950: 20 20 20 20 75 38 20 2a 64 61 74 61 3b 0a 20 20      u8 *data;.  
3960: 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20    char *zType = 
3970: 70 56 61 72 2d 3e 74 79 70 65 50 74 72 20 3f 20  pVar->typePtr ? 
3980: 70 56 61 72 2d 3e 74 79 70 65 50 74 72 2d 3e 6e  pVar->typePtr->n
3990: 61 6d 65 20 3a 20 22 22 3b 0a 20 20 20 20 63 68  ame : "";.    ch
39a0: 61 72 20 63 20 3d 20 7a 54 79 70 65 5b 30 5d 3b  ar c = zType[0];
39b0: 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 62 27 20  .    if( c=='b' 
39c0: 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c  && strcmp(zType,
39d0: 22 62 79 74 65 61 72 72 61 79 22 29 3d 3d 30 20  "bytearray")==0 
39e0: 26 26 20 70 56 61 72 2d 3e 62 79 74 65 73 3d 3d  && pVar->bytes==
39f0: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e  0 ){.      /* On
3a00: 6c 79 20 72 65 74 75 72 6e 20 61 20 42 4c 4f 42  ly return a BLOB
3a10: 20 74 79 70 65 20 69 66 20 74 68 65 20 54 63 6c   type if the Tcl
3a20: 20 76 61 72 69 61 62 6c 65 20 69 73 20 61 20 62   variable is a b
3a30: 79 74 65 61 72 72 61 79 20 61 6e 64 0a 20 20 20  ytearray and.   
3a40: 20 20 20 2a 2a 20 68 61 73 20 6e 6f 20 73 74 72     ** has no str
3a50: 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69  ing representati
3a60: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 64 61 74  on. */.      dat
3a70: 61 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41  a = Tcl_GetByteA
3a80: 72 72 61 79 46 72 6f 6d 4f 62 6a 28 70 56 61 72  rrayFromObj(pVar
3a90: 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  , &n);.      sql
3aa0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62  ite3_result_blob
3ab0: 28 63 6f 6e 74 65 78 74 2c 20 64 61 74 61 2c 20  (context, data, 
3ac0: 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  n, SQLITE_TRANSI
3ad0: 45 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ENT);.    }else 
3ae0: 69 66 28 20 28 63 3d 3d 27 62 27 20 26 26 20 73  if( (c=='b' && s
3af0: 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 62 6f 6f  trcmp(zType,"boo
3b00: 6c 65 61 6e 22 29 3d 3d 30 29 20 7c 7c 0a 20 20  lean")==0) ||.  
3b10: 20 20 20 20 20 20 20 20 28 63 3d 3d 27 69 27 20          (c=='i' 
3b20: 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c  && strcmp(zType,
3b30: 22 69 6e 74 22 29 3d 3d 30 29 20 29 7b 0a 20 20  "int")==0) ){.  
3b40: 20 20 20 20 54 63 6c 5f 47 65 74 49 6e 74 46 72      Tcl_GetIntFr
3b50: 6f 6d 4f 62 6a 28 30 2c 20 70 56 61 72 2c 20 26  omObj(0, pVar, &
3b60: 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
3b70: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e  3_result_int(con
3b80: 74 65 78 74 2c 20 6e 29 3b 0a 20 20 20 20 7d 65  text, n);.    }e
3b90: 6c 73 65 20 69 66 28 20 63 3d 3d 27 64 27 20 26  lse if( c=='d' &
3ba0: 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22  & strcmp(zType,"
3bb0: 64 6f 75 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20  double")==0 ){. 
3bc0: 20 20 20 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20       double r;. 
3bd0: 20 20 20 20 20 54 63 6c 5f 47 65 74 44 6f 75 62       Tcl_GetDoub
3be0: 6c 65 46 72 6f 6d 4f 62 6a 28 30 2c 20 70 56 61  leFromObj(0, pVa
3bf0: 72 2c 20 26 72 29 3b 0a 20 20 20 20 20 20 73 71  r, &r);.      sq
3c00: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75  lite3_result_dou
3c10: 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 72 29 3b  ble(context, r);
3c20: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
3c30: 3d 3d 27 77 27 20 26 26 20 73 74 72 63 6d 70 28  =='w' && strcmp(
3c40: 7a 54 79 70 65 2c 22 77 69 64 65 49 6e 74 22 29  zType,"wideInt")
3c50: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  ==0 ){.      Tcl
3c60: 5f 57 69 64 65 49 6e 74 20 76 3b 0a 20 20 20 20  _WideInt v;.    
3c70: 20 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74    Tcl_GetWideInt
3c80: 46 72 6f 6d 4f 62 6a 28 30 2c 20 70 56 61 72 2c  FromObj(0, pVar,
3c90: 20 26 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   &v);.      sqli
3ca0: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34  te3_result_int64
3cb0: 28 63 6f 6e 74 65 78 74 2c 20 76 29 3b 0a 20 20  (context, v);.  
3cc0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64    }else{.      d
3cd0: 61 74 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  ata = (unsigned 
3ce0: 63 68 61 72 20 2a 29 54 63 6c 5f 47 65 74 53 74  char *)Tcl_GetSt
3cf0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 56 61 72  ringFromObj(pVar
3d00: 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  , &n);.      sql
3d10: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
3d20: 28 63 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 20  (context, (char 
3d30: 2a 29 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54  *)data, n, SQLIT
3d40: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
3d50: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64    }.  }.}..#ifnd
3d60: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
3d70: 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 2f 2a 0a  UTHORIZATION./*.
3d80: 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 61  ** This is the a
3d90: 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 66 75  uthentication fu
3da0: 6e 63 74 69 6f 6e 2e 20 20 49 74 20 61 70 70 65  nction.  It appe
3db0: 6e 64 73 20 74 68 65 20 61 75 74 68 65 6e 74 69  nds the authenti
3dc0: 63 61 74 69 6f 6e 0a 2a 2a 20 74 79 70 65 20 63  cation.** type c
3dd0: 6f 64 65 20 61 6e 64 20 74 68 65 20 74 77 6f 20  ode and the two 
3de0: 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 7a 43 6d  arguments to zCm
3df0: 64 5b 5d 20 74 68 65 6e 20 69 6e 76 6f 6b 65 73  d[] then invokes
3e00: 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 6f   the result.** o
3e10: 6e 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65  n the interprete
3e20: 72 2e 20 20 54 68 65 20 72 65 70 6c 79 20 69 73  r.  The reply is
3e30: 20 65 78 61 6d 69 6e 65 64 20 74 6f 20 64 65 74   examined to det
3e40: 65 72 6d 69 6e 65 20 69 66 20 74 68 65 0a 2a 2a  ermine if the.**
3e50: 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20   authentication 
3e60: 66 61 69 6c 73 20 6f 72 20 73 75 63 63 65 65 64  fails or succeed
3e70: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
3e80: 20 61 75 74 68 5f 63 61 6c 6c 62 61 63 6b 28 0a   auth_callback(.
3e90: 20 20 76 6f 69 64 20 2a 70 41 72 67 2c 0a 20 20    void *pArg,.  
3ea0: 69 6e 74 20 63 6f 64 65 2c 0a 20 20 63 6f 6e 73  int code,.  cons
3eb0: 74 20 63 68 61 72 20 2a 7a 41 72 67 31 2c 0a 20  t char *zArg1,. 
3ec0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72   const char *zAr
3ed0: 67 32 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  g2,.  const char
3ee0: 20 2a 7a 41 72 67 33 2c 0a 20 20 63 6f 6e 73 74   *zArg3,.  const
3ef0: 20 63 68 61 72 20 2a 7a 41 72 67 34 0a 29 7b 0a   char *zArg4.){.
3f00: 20 20 63 68 61 72 20 2a 7a 43 6f 64 65 3b 0a 20    char *zCode;. 
3f10: 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72   Tcl_DString str
3f20: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f  ;.  int rc;.  co
3f30: 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 70 6c 79  nst char *zReply
3f40: 3b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  ;.  SqliteDb *pD
3f50: 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 70  b = (SqliteDb*)p
3f60: 41 72 67 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  Arg;..  switch( 
3f70: 63 6f 64 65 20 29 7b 0a 20 20 20 20 63 61 73 65  code ){.    case
3f80: 20 53 51 4c 49 54 45 5f 43 4f 50 59 20 20 20 20   SQLITE_COPY    
3f90: 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64            : zCod
3fa0: 65 3d 22 53 51 4c 49 54 45 5f 43 4f 50 59 22 3b  e="SQLITE_COPY";
3fb0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
3fc0: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49   SQLITE_CREATE_I
3fd0: 4e 44 45 58 20 20 20 20 20 20 3a 20 7a 43 6f 64  NDEX      : zCod
3fe0: 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45  e="SQLITE_CREATE
3ff0: 5f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a  _INDEX"; break;.
4000: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
4010: 43 52 45 41 54 45 5f 54 41 42 4c 45 20 20 20 20  CREATE_TABLE    
4020: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
4030: 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 22 3b  E_CREATE_TABLE";
4040: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
4050: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
4060: 45 4d 50 5f 49 4e 44 45 58 20 3a 20 7a 43 6f 64  EMP_INDEX : zCod
4070: 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45  e="SQLITE_CREATE
4080: 5f 54 45 4d 50 5f 49 4e 44 45 58 22 3b 20 62 72  _TEMP_INDEX"; br
4090: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
40a0: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50  LITE_CREATE_TEMP
40b0: 5f 54 41 42 4c 45 20 3a 20 7a 43 6f 64 65 3d 22  _TABLE : zCode="
40c0: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
40d0: 4d 50 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b  MP_TABLE"; break
40e0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
40f0: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 52  E_CREATE_TEMP_TR
4100: 49 47 47 45 52 3a 20 7a 43 6f 64 65 3d 22 53 51  IGGER: zCode="SQ
4110: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50  LITE_CREATE_TEMP
4120: 5f 54 52 49 47 47 45 52 22 3b 20 62 72 65 61 6b  _TRIGGER"; break
4130: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
4140: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49  E_CREATE_TEMP_VI
4150: 45 57 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c  EW  : zCode="SQL
4160: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
4170: 56 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20  VIEW"; break;.  
4180: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52    case SQLITE_CR
4190: 45 41 54 45 5f 54 52 49 47 47 45 52 20 20 20 20  EATE_TRIGGER    
41a0: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
41b0: 43 52 45 41 54 45 5f 54 52 49 47 47 45 52 22 3b  CREATE_TRIGGER";
41c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
41d0: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56   SQLITE_CREATE_V
41e0: 49 45 57 20 20 20 20 20 20 20 3a 20 7a 43 6f 64  IEW       : zCod
41f0: 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45  e="SQLITE_CREATE
4200: 5f 56 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20  _VIEW"; break;. 
4210: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
4220: 45 4c 45 54 45 20 20 20 20 20 20 20 20 20 20 20  ELETE           
4230: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
4240: 5f 44 45 4c 45 54 45 22 3b 20 62 72 65 61 6b 3b  _DELETE"; break;
4250: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
4260: 5f 44 52 4f 50 5f 49 4e 44 45 58 20 20 20 20 20  _DROP_INDEX     
4270: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
4280: 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58 22 3b 20  TE_DROP_INDEX"; 
4290: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
42a0: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c  SQLITE_DROP_TABL
42b0: 45 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65  E        : zCode
42c0: 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41  ="SQLITE_DROP_TA
42d0: 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  BLE"; break;.   
42e0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f   case SQLITE_DRO
42f0: 50 5f 54 45 4d 50 5f 49 4e 44 45 58 20 20 20 3a  P_TEMP_INDEX   :
4300: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44   zCode="SQLITE_D
4310: 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 22 3b  ROP_TEMP_INDEX";
4320: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
4330: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d   SQLITE_DROP_TEM
4340: 50 5f 54 41 42 4c 45 20 20 20 3a 20 7a 43 6f 64  P_TABLE   : zCod
4350: 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54  e="SQLITE_DROP_T
4360: 45 4d 50 5f 54 41 42 4c 45 22 3b 20 62 72 65 61  EMP_TABLE"; brea
4370: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
4380: 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 52 49  TE_DROP_TEMP_TRI
4390: 47 47 45 52 20 3a 20 7a 43 6f 64 65 3d 22 53 51  GGER : zCode="SQ
43a0: 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54  LITE_DROP_TEMP_T
43b0: 52 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a  RIGGER"; break;.
43c0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
43d0: 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 20 20  DROP_TEMP_VIEW  
43e0: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
43f0: 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57  E_DROP_TEMP_VIEW
4400: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
4410: 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54  se SQLITE_DROP_T
4420: 52 49 47 47 45 52 20 20 20 20 20 20 3a 20 7a 43  RIGGER      : zC
4430: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50  ode="SQLITE_DROP
4440: 5f 54 52 49 47 47 45 52 22 3b 20 62 72 65 61 6b  _TRIGGER"; break
4450: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
4460: 45 5f 44 52 4f 50 5f 56 49 45 57 20 20 20 20 20  E_DROP_VIEW     
4470: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
4480: 49 54 45 5f 44 52 4f 50 5f 56 49 45 57 22 3b 20  ITE_DROP_VIEW"; 
4490: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
44a0: 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 20 20 20  SQLITE_INSERT   
44b0: 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65           : zCode
44c0: 3d 22 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 22  ="SQLITE_INSERT"
44d0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
44e0: 65 20 53 51 4c 49 54 45 5f 50 52 41 47 4d 41 20  e SQLITE_PRAGMA 
44f0: 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f             : zCo
4500: 64 65 3d 22 53 51 4c 49 54 45 5f 50 52 41 47 4d  de="SQLITE_PRAGM
4510: 41 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  A"; break;.    c
4520: 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44 20  ase SQLITE_READ 
4530: 20 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a               : z
4540: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 52 45 41  Code="SQLITE_REA
4550: 44 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  D"; break;.    c
4560: 61 73 65 20 53 51 4c 49 54 45 5f 53 45 4c 45 43  ase SQLITE_SELEC
4570: 54 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a  T            : z
4580: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 53 45 4c  Code="SQLITE_SEL
4590: 45 43 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ECT"; break;.   
45a0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 52 41   case SQLITE_TRA
45b0: 4e 53 41 43 54 49 4f 4e 20 20 20 20 20 20 20 3a  NSACTION       :
45c0: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 54   zCode="SQLITE_T
45d0: 52 41 4e 53 41 43 54 49 4f 4e 22 3b 20 62 72 65  RANSACTION"; bre
45e0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
45f0: 49 54 45 5f 55 50 44 41 54 45 20 20 20 20 20 20  ITE_UPDATE      
4600: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
4610: 51 4c 49 54 45 5f 55 50 44 41 54 45 22 3b 20 62  QLITE_UPDATE"; b
4620: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
4630: 51 4c 49 54 45 5f 41 54 54 41 43 48 20 20 20 20  QLITE_ATTACH    
4640: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
4650: 22 53 51 4c 49 54 45 5f 41 54 54 41 43 48 22 3b  "SQLITE_ATTACH";
4660: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
4670: 20 53 51 4c 49 54 45 5f 44 45 54 41 43 48 20 20   SQLITE_DETACH  
4680: 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64            : zCod
4690: 65 3d 22 53 51 4c 49 54 45 5f 44 45 54 41 43 48  e="SQLITE_DETACH
46a0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
46b0: 73 65 20 53 51 4c 49 54 45 5f 41 4c 54 45 52 5f  se SQLITE_ALTER_
46c0: 54 41 42 4c 45 20 20 20 20 20 20 20 3a 20 7a 43  TABLE       : zC
46d0: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 41 4c 54 45  ode="SQLITE_ALTE
46e0: 52 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b  R_TABLE"; break;
46f0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
4700: 5f 52 45 49 4e 44 45 58 20 20 20 20 20 20 20 20  _REINDEX        
4710: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
4720: 54 45 5f 52 45 49 4e 44 45 58 22 3b 20 62 72 65  TE_REINDEX"; bre
4730: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
4740: 49 54 45 5f 41 4e 41 4c 59 5a 45 20 20 20 20 20  ITE_ANALYZE     
4750: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
4760: 51 4c 49 54 45 5f 41 4e 41 4c 59 5a 45 22 3b 20  QLITE_ANALYZE"; 
4770: 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
4780: 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  lt              
4790: 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65           : zCode
47a0: 3d 22 3f 3f 3f 3f 22 3b 20 62 72 65 61 6b 3b 0a  ="????"; break;.
47b0: 20 20 7d 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e    }.  Tcl_DStrin
47c0: 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 54  gInit(&str);.  T
47d0: 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64  cl_DStringAppend
47e0: 28 26 73 74 72 2c 20 70 44 62 2d 3e 7a 41 75 74  (&str, pDb->zAut
47f0: 68 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53  h, -1);.  Tcl_DS
4800: 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65  tringAppendEleme
4810: 6e 74 28 26 73 74 72 2c 20 7a 43 6f 64 65 29 3b  nt(&str, zCode);
4820: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70  .  Tcl_DStringAp
4830: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72  pendElement(&str
4840: 2c 20 7a 41 72 67 31 20 3f 20 7a 41 72 67 31 20  , zArg1 ? zArg1 
4850: 3a 20 22 22 29 3b 0a 20 20 54 63 6c 5f 44 53 74  : "");.  Tcl_DSt
4860: 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e  ringAppendElemen
4870: 74 28 26 73 74 72 2c 20 7a 41 72 67 32 20 3f 20  t(&str, zArg2 ? 
4880: 7a 41 72 67 32 20 3a 20 22 22 29 3b 0a 20 20 54  zArg2 : "");.  T
4890: 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64  cl_DStringAppend
48a0: 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41  Element(&str, zA
48b0: 72 67 33 20 3f 20 7a 41 72 67 33 20 3a 20 22 22  rg3 ? zArg3 : ""
48c0: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
48d0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73  AppendElement(&s
48e0: 74 72 2c 20 7a 41 72 67 34 20 3f 20 7a 41 72 67  tr, zArg4 ? zArg
48f0: 34 20 3a 20 22 22 29 3b 0a 20 20 72 63 20 3d 20  4 : "");.  rc = 
4900: 54 63 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c 28 70  Tcl_GlobalEval(p
4910: 44 62 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f  Db->interp, Tcl_
4920: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74  DStringValue(&st
4930: 72 29 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  r));.  Tcl_DStri
4940: 6e 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20  ngFree(&str);.  
4950: 7a 52 65 70 6c 79 20 3d 20 54 63 6c 5f 47 65 74  zReply = Tcl_Get
4960: 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44 62  StringResult(pDb
4970: 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 69 66 28  ->interp);.  if(
4980: 20 73 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22   strcmp(zReply,"
4990: 53 51 4c 49 54 45 5f 4f 4b 22 29 3d 3d 30 20 29  SQLITE_OK")==0 )
49a0: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
49b0: 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66  E_OK;.  }else if
49c0: 28 20 73 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c  ( strcmp(zReply,
49d0: 22 53 51 4c 49 54 45 5f 44 45 4e 59 22 29 3d 3d  "SQLITE_DENY")==
49e0: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
49f0: 4c 49 54 45 5f 44 45 4e 59 3b 0a 20 20 7d 65 6c  LITE_DENY;.  }el
4a00: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 52  se if( strcmp(zR
4a10: 65 70 6c 79 2c 22 53 51 4c 49 54 45 5f 49 47 4e  eply,"SQLITE_IGN
4a20: 4f 52 45 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ORE")==0 ){.    
4a30: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 47 4e 4f  rc = SQLITE_IGNO
4a40: 52 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  RE;.  }else{.   
4a50: 20 72 63 20 3d 20 39 39 39 3b 0a 20 20 7d 0a 20   rc = 999;.  }. 
4a60: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
4a70: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
4a80: 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
4a90: 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 7a 54 65 78  N */../*.** zTex
4aa0: 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  t is a pointer t
4ab0: 6f 20 74 65 78 74 20 6f 62 74 61 69 6e 65 64 20  o text obtained 
4ac0: 76 69 61 20 61 6e 20 73 71 6c 69 74 65 33 5f 72  via an sqlite3_r
4ad0: 65 73 75 6c 74 5f 74 65 78 74 28 29 0a 2a 2a 20  esult_text().** 
4ae0: 6f 72 20 73 69 6d 69 6c 61 72 20 69 6e 74 65 72  or similar inter
4af0: 66 61 63 65 2e 20 54 68 69 73 20 72 6f 75 74 69  face. This routi
4b00: 6e 65 20 72 65 74 75 72 6e 73 20 61 20 54 63 6c  ne returns a Tcl
4b10: 20 73 74 72 69 6e 67 20 6f 62 6a 65 63 74 2c 20   string object, 
4b20: 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 63 6f  .** reference co
4b30: 75 6e 74 20 73 65 74 20 74 6f 20 30 2c 20 63 6f  unt set to 0, co
4b40: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 65 78  ntaining the tex
4b50: 74 2e 20 49 66 20 61 20 74 72 61 6e 73 6c 61 74  t. If a translat
4b60: 69 6f 6e 0a 2a 2a 20 62 65 74 77 65 65 6e 20 69  ion.** between i
4b70: 73 6f 38 38 35 39 20 61 6e 64 20 55 54 46 2d 38  so8859 and UTF-8
4b80: 20 69 73 20 72 65 71 75 69 72 65 64 2c 20 69 74   is required, it
4b90: 20 69 73 20 70 72 65 66 6f 72 6d 65 64 2e 0a 2a   is preformed..*
4ba0: 2f 0a 73 74 61 74 69 63 20 54 63 6c 5f 4f 62 6a  /.static Tcl_Obj
4bb0: 20 2a 64 62 54 65 78 74 54 6f 4f 62 6a 28 63 68   *dbTextToObj(ch
4bc0: 61 72 20 63 6f 6e 73 74 20 2a 7a 54 65 78 74 29  ar const *zText)
4bd0: 7b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61  {.  Tcl_Obj *pVa
4be0: 6c 3b 0a 23 69 66 64 65 66 20 55 54 46 5f 54 52  l;.#ifdef UTF_TR
4bf0: 41 4e 53 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44  ANSLATION_NEEDED
4c00: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64  .  Tcl_DString d
4c10: 43 6f 6c 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  Col;.  Tcl_DStri
4c20: 6e 67 49 6e 69 74 28 26 64 43 6f 6c 29 3b 0a 20  ngInit(&dCol);. 
4c30: 20 54 63 6c 5f 45 78 74 65 72 6e 61 6c 54 6f 55   Tcl_ExternalToU
4c40: 74 66 44 53 74 72 69 6e 67 28 4e 55 4c 4c 2c 20  tfDString(NULL, 
4c50: 7a 54 65 78 74 2c 20 2d 31 2c 20 26 64 43 6f 6c  zText, -1, &dCol
4c60: 29 3b 0a 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f  );.  pVal = Tcl_
4c70: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c  NewStringObj(Tcl
4c80: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 64  _DStringValue(&d
4c90: 43 6f 6c 29 2c 20 2d 31 29 3b 0a 20 20 54 63 6c  Col), -1);.  Tcl
4ca0: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 43  _DStringFree(&dC
4cb0: 6f 6c 29 3b 0a 23 65 6c 73 65 0a 20 20 70 56 61  ol);.#else.  pVa
4cc0: 6c 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  l = Tcl_NewStrin
4cd0: 67 4f 62 6a 28 7a 54 65 78 74 2c 20 2d 31 29 3b  gObj(zText, -1);
4ce0: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
4cf0: 20 70 56 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pVal;.}../*.** 
4d00: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 61  This routine rea
4d10: 64 73 20 61 20 6c 69 6e 65 20 6f 66 20 74 65 78  ds a line of tex
4d20: 74 20 66 72 6f 6d 20 46 49 4c 45 20 69 6e 2c 20  t from FILE in, 
4d30: 73 74 6f 72 65 73 0a 2a 2a 20 74 68 65 20 74 65  stores.** the te
4d40: 78 74 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74  xt in memory obt
4d50: 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
4d60: 63 28 29 20 61 6e 64 20 72 65 74 75 72 6e 73 20  c() and returns 
4d70: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
4d80: 74 68 65 20 74 65 78 74 2e 20 20 4e 55 4c 4c 20  the text.  NULL 
4d90: 69 73 20 72 65 74 75 72 6e 65 64 20 61 74 20 65  is returned at e
4da0: 6e 64 20 6f 66 20 66 69 6c 65 2c 20 6f 72 20 69  nd of file, or i
4db0: 66 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 66 61  f malloc().** fa
4dc0: 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ils..**.** The i
4dd0: 6e 74 65 72 66 61 63 65 20 69 73 20 6c 69 6b 65  nterface is like
4de0: 20 22 72 65 61 64 6c 69 6e 65 22 20 62 75 74 20   "readline" but 
4df0: 6e 6f 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20  no command-line 
4e00: 65 64 69 74 69 6e 67 0a 2a 2a 20 69 73 20 64 6f  editing.** is do
4e10: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 63 6f 70 69 65 64  ne..**.** copied
4e20: 20 66 72 6f 6d 20 73 68 65 6c 6c 2e 63 20 66 72   from shell.c fr
4e30: 6f 6d 20 27 2e 69 6d 70 6f 72 74 27 20 63 6f 6d  om '.import' com
4e40: 6d 61 6e 64 0a 2a 2f 0a 73 74 61 74 69 63 20 63  mand.*/.static c
4e50: 68 61 72 20 2a 6c 6f 63 61 6c 5f 67 65 74 6c 69  har *local_getli
4e60: 6e 65 28 63 68 61 72 20 2a 7a 50 72 6f 6d 70 74  ne(char *zPrompt
4e70: 2c 20 46 49 4c 45 20 2a 69 6e 29 7b 0a 20 20 63  , FILE *in){.  c
4e80: 68 61 72 20 2a 7a 4c 69 6e 65 3b 0a 20 20 69 6e  har *zLine;.  in
4e90: 74 20 6e 4c 69 6e 65 3b 0a 20 20 69 6e 74 20 6e  t nLine;.  int n
4ea0: 3b 0a 20 20 69 6e 74 20 65 6f 6c 3b 0a 0a 20 20  ;.  int eol;..  
4eb0: 6e 4c 69 6e 65 20 3d 20 31 30 30 3b 0a 20 20 7a  nLine = 100;.  z
4ec0: 4c 69 6e 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e  Line = malloc( n
4ed0: 4c 69 6e 65 20 29 3b 0a 20 20 69 66 28 20 7a 4c  Line );.  if( zL
4ee0: 69 6e 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ine==0 ) return 
4ef0: 30 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 65 6f  0;.  n = 0;.  eo
4f00: 6c 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  l = 0;.  while( 
4f10: 21 65 6f 6c 20 29 7b 0a 20 20 20 20 69 66 28 20  !eol ){.    if( 
4f20: 6e 2b 31 30 30 3e 6e 4c 69 6e 65 20 29 7b 0a 20  n+100>nLine ){. 
4f30: 20 20 20 20 20 6e 4c 69 6e 65 20 3d 20 6e 4c 69       nLine = nLi
4f40: 6e 65 2a 32 20 2b 20 31 30 30 3b 0a 20 20 20 20  ne*2 + 100;.    
4f50: 20 20 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f    zLine = reallo
4f60: 63 28 7a 4c 69 6e 65 2c 20 6e 4c 69 6e 65 29 3b  c(zLine, nLine);
4f70: 0a 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65  .      if( zLine
4f80: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
4f90: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 67      }.    if( fg
4fa0: 65 74 73 28 26 7a 4c 69 6e 65 5b 6e 5d 2c 20 6e  ets(&zLine[n], n
4fb0: 4c 69 6e 65 20 2d 20 6e 2c 20 69 6e 29 3d 3d 30  Line - n, in)==0
4fc0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d   ){.      if( n=
4fd0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 72  =0 ){.        fr
4fe0: 65 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20  ee(zLine);.     
4ff0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
5000: 20 20 20 7d 0a 20 20 20 20 20 20 7a 4c 69 6e 65     }.      zLine
5010: 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 65  [n] = 0;.      e
5020: 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72  ol = 1;.      br
5030: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77  eak;.    }.    w
5040: 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 6e 5d 20 29  hile( zLine[n] )
5050: 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28  { n++; }.    if(
5060: 20 6e 3e 30 20 26 26 20 7a 4c 69 6e 65 5b 6e 2d   n>0 && zLine[n-
5070: 31 5d 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20  1]=='\n' ){.    
5080: 20 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a 4c 69    n--;.      zLi
5090: 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20  ne[n] = 0;.     
50a0: 20 65 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a   eol = 1;.    }.
50b0: 20 20 7d 0a 20 20 7a 4c 69 6e 65 20 3d 20 72 65    }.  zLine = re
50c0: 61 6c 6c 6f 63 28 20 7a 4c 69 6e 65 2c 20 6e 2b  alloc( zLine, n+
50d0: 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4c  1 );.  return zL
50e0: 69 6e 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ine;.}../*.** Th
50f0: 65 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d 61  e "sqlite" comma
5100: 6e 64 20 62 65 6c 6f 77 20 63 72 65 61 74 65 73  nd below creates
5110: 20 61 20 6e 65 77 20 54 63 6c 20 63 6f 6d 6d 61   a new Tcl comma
5120: 6e 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63  nd for each.** c
5130: 6f 6e 6e 65 63 74 69 6f 6e 20 69 74 20 6f 70 65  onnection it ope
5140: 6e 73 20 74 6f 20 61 6e 20 53 51 4c 69 74 65 20  ns to an SQLite 
5150: 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20  database.  This 
5160: 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b  routine is invok
5170: 65 64 0a 2a 2a 20 77 68 65 6e 65 76 65 72 20 6f  ed.** whenever o
5180: 6e 65 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e 6e  ne of those conn
5190: 65 63 74 69 6f 6e 2d 73 70 65 63 69 66 69 63 20  ection-specific 
51a0: 63 6f 6d 6d 61 6e 64 73 20 69 73 20 65 78 65 63  commands is exec
51b0: 75 74 65 64 0a 2a 2a 20 69 6e 20 54 63 6c 2e 20  uted.** in Tcl. 
51c0: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
51d0: 20 79 6f 75 20 72 75 6e 20 54 63 6c 20 63 6f 64   you run Tcl cod
51e0: 65 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  e like this:.**.
51f0: 2a 2a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  **       sqlite3
5200: 20 64 62 31 20 20 22 6d 79 5f 64 61 74 61 62 61   db1  "my_databa
5210: 73 65 22 0a 2a 2a 20 20 20 20 20 20 20 64 62 31  se".**       db1
5220: 20 63 6c 6f 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65   close.**.** The
5230: 20 66 69 72 73 74 20 63 6f 6d 6d 61 6e 64 20 6f   first command o
5240: 70 65 6e 73 20 61 20 63 6f 6e 6e 65 63 74 69 6f  pens a connectio
5250: 6e 20 74 6f 20 74 68 65 20 22 6d 79 5f 64 61 74  n to the "my_dat
5260: 61 62 61 73 65 22 20 64 61 74 61 62 61 73 65 0a  abase" database.
5270: 2a 2a 20 61 6e 64 20 63 61 6c 6c 73 20 74 68 61  ** and calls tha
5280: 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 22 64 62  t connection "db
5290: 31 22 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20  1".  The second 
52a0: 63 6f 6d 6d 61 6e 64 20 63 61 75 73 65 73 20 74  command causes t
52b0: 68 69 73 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e  his.** subroutin
52c0: 65 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 2e  e to be invoked.
52d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44  .*/.static int D
52e0: 62 4f 62 6a 43 6d 64 28 76 6f 69 64 20 2a 63 64  bObjCmd(void *cd
52f0: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
5300: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 54  terp, int objc,T
5310: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62  cl_Obj *const*ob
5320: 6a 76 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20  jv){.  SqliteDb 
5330: 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62  *pDb = (SqliteDb
5340: 2a 29 63 64 3b 0a 20 20 69 6e 74 20 63 68 6f 69  *)cd;.  int choi
5350: 63 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 54  ce;.  int rc = T
5360: 43 4c 5f 4f 4b 3b 0a 20 20 73 74 61 74 69 63 20  CL_OK;.  static 
5370: 63 6f 6e 73 74 20 63 68 61 72 20 2a 44 42 5f 73  const char *DB_s
5380: 74 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 61  trs[] = {.    "a
5390: 75 74 68 6f 72 69 7a 65 72 22 2c 20 20 20 20 20  uthorizer",     
53a0: 20 20 20 20 22 62 75 73 79 22 2c 20 20 20 20 20      "busy",     
53b0: 20 20 20 20 20 20 20 20 20 22 63 61 63 68 65 22           "cache"
53c0: 2c 0a 20 20 20 20 22 63 68 61 6e 67 65 73 22 2c  ,.    "changes",
53d0: 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6c 6f              "clo
53e0: 73 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  se",            
53f0: 20 22 63 6f 6c 6c 61 74 65 22 2c 0a 20 20 20 20   "collate",.    
5400: 22 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65  "collation_neede
5410: 64 22 2c 20 20 20 22 63 6f 6d 6d 69 74 5f 68 6f  d",   "commit_ho
5420: 6f 6b 22 2c 20 20 20 20 20 20 20 22 63 6f 6d 70  ok",       "comp
5430: 6c 65 74 65 22 2c 0a 20 20 20 20 22 63 6f 70 79  lete",.    "copy
5440: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
5450: 20 22 65 72 72 6f 72 63 6f 64 65 22 2c 20 20 20   "errorcode",   
5460: 20 20 20 20 20 20 22 65 76 61 6c 22 2c 0a 20 20        "eval",.  
5470: 20 20 22 65 78 69 73 74 73 22 2c 20 20 20 20 20    "exists",     
5480: 20 20 20 20 20 20 20 20 22 66 75 6e 63 74 69 6f          "functio
5490: 6e 22 2c 20 20 20 20 20 20 20 20 20 20 22 6c 61  n",          "la
54a0: 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 22  st_insert_rowid"
54b0: 2c 0a 20 20 20 20 22 6e 75 6c 6c 76 61 6c 75 65  ,.    "nullvalue
54c0: 22 2c 20 20 20 20 20 20 20 20 20 20 22 6f 6e 65  ",          "one
54d0: 63 6f 6c 75 6d 6e 22 2c 20 20 20 20 20 20 20 20  column",        
54e0: 20 22 70 72 6f 66 69 6c 65 22 2c 0a 20 20 20 20   "profile",.    
54f0: 22 70 72 6f 67 72 65 73 73 22 2c 20 20 20 20 20  "progress",     
5500: 20 20 20 20 20 20 22 72 65 6b 65 79 22 2c 20 20        "rekey",  
5510: 20 20 20 20 20 20 20 20 20 20 20 22 72 6f 6c 6c             "roll
5520: 62 61 63 6b 5f 68 6f 6f 6b 22 2c 0a 20 20 20 20  back_hook",.    
5530: 22 74 69 6d 65 6f 75 74 22 2c 20 20 20 20 20 20  "timeout",      
5540: 20 20 20 20 20 20 22 74 6f 74 61 6c 5f 63 68 61        "total_cha
5550: 6e 67 65 73 22 2c 20 20 20 20 20 22 74 72 61 63  nges",     "trac
5560: 65 22 2c 0a 20 20 20 20 22 74 72 61 6e 73 61 63  e",.    "transac
5570: 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 20 22 75  tion",        "u
5580: 70 64 61 74 65 5f 68 6f 6f 6b 22 2c 20 20 20 20  pdate_hook",    
5590: 20 20 20 22 76 65 72 73 69 6f 6e 22 2c 0a 20 20     "version",.  
55a0: 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
55b0: 20 20 20 20 20 20 20 0a 20 20 7d 3b 0a 20 20 65         .  };.  e
55c0: 6e 75 6d 20 44 42 5f 65 6e 75 6d 20 7b 0a 20 20  num DB_enum {.  
55d0: 20 20 44 42 5f 41 55 54 48 4f 52 49 5a 45 52 2c    DB_AUTHORIZER,
55e0: 20 20 20 20 20 20 20 20 44 42 5f 42 55 53 59 2c          DB_BUSY,
55f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f               DB_
5600: 43 41 43 48 45 2c 0a 20 20 20 20 44 42 5f 43 48  CACHE,.    DB_CH
5610: 41 4e 47 45 53 2c 20 20 20 20 20 20 20 20 20 20  ANGES,          
5620: 20 44 42 5f 43 4c 4f 53 45 2c 20 20 20 20 20 20   DB_CLOSE,      
5630: 20 20 20 20 20 20 44 42 5f 43 4f 4c 4c 41 54 45        DB_COLLATE
5640: 2c 0a 20 20 20 20 44 42 5f 43 4f 4c 4c 41 54 49  ,.    DB_COLLATI
5650: 4f 4e 5f 4e 45 45 44 45 44 2c 20 20 44 42 5f 43  ON_NEEDED,  DB_C
5660: 4f 4d 4d 49 54 5f 48 4f 4f 4b 2c 20 20 20 20 20  OMMIT_HOOK,     
5670: 20 44 42 5f 43 4f 4d 50 4c 45 54 45 2c 0a 20 20   DB_COMPLETE,.  
5680: 20 20 44 42 5f 43 4f 50 59 2c 20 20 20 20 20 20    DB_COPY,      
5690: 20 20 20 20 20 20 20 20 44 42 5f 45 52 52 4f 52          DB_ERROR
56a0: 43 4f 44 45 2c 20 20 20 20 20 20 20 20 44 42 5f  CODE,        DB_
56b0: 45 56 41 4c 2c 0a 20 20 20 20 44 42 5f 45 58 49  EVAL,.    DB_EXI
56c0: 53 54 53 2c 20 20 20 20 20 20 20 20 20 20 20 20  STS,            
56d0: 44 42 5f 46 55 4e 43 54 49 4f 4e 2c 20 20 20 20  DB_FUNCTION,    
56e0: 20 20 20 20 20 44 42 5f 4c 41 53 54 5f 49 4e 53       DB_LAST_INS
56f0: 45 52 54 5f 52 4f 57 49 44 2c 0a 20 20 20 20 44  ERT_ROWID,.    D
5700: 42 5f 4e 55 4c 4c 56 41 4c 55 45 2c 20 20 20 20  B_NULLVALUE,    
5710: 20 20 20 20 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d       DB_ONECOLUM
5720: 4e 2c 20 20 20 20 20 20 20 20 44 42 5f 50 52 4f  N,        DB_PRO
5730: 46 49 4c 45 2c 0a 20 20 20 20 44 42 5f 50 52 4f  FILE,.    DB_PRO
5740: 47 52 45 53 53 2c 20 20 20 20 20 20 20 20 20 20  GRESS,          
5750: 44 42 5f 52 45 4b 45 59 2c 20 20 20 20 20 20 20  DB_REKEY,       
5760: 20 20 20 20 20 44 42 5f 52 4f 4c 4c 42 41 43 4b       DB_ROLLBACK
5770: 5f 48 4f 4f 4b 2c 0a 20 20 20 20 44 42 5f 54 49  _HOOK,.    DB_TI
5780: 4d 45 4f 55 54 2c 20 20 20 20 20 20 20 20 20 20  MEOUT,          
5790: 20 44 42 5f 54 4f 54 41 4c 5f 43 48 41 4e 47 45   DB_TOTAL_CHANGE
57a0: 53 2c 20 20 20 20 44 42 5f 54 52 41 43 45 2c 0a  S,    DB_TRACE,.
57b0: 20 20 20 20 44 42 5f 54 52 41 4e 53 41 43 54 49      DB_TRANSACTI
57c0: 4f 4e 2c 20 20 20 20 20 20 20 44 42 5f 55 50 44  ON,       DB_UPD
57d0: 41 54 45 5f 48 4f 4f 4b 2c 20 20 20 20 20 20 44  ATE_HOOK,      D
57e0: 42 5f 56 45 52 53 49 4f 4e 0a 20 20 7d 3b 0a 20  B_VERSION.  };. 
57f0: 20 2f 2a 20 64 6f 6e 27 74 20 6c 65 61 76 65 20   /* don't leave 
5800: 74 72 61 69 6c 69 6e 67 20 63 6f 6d 6d 61 73 20  trailing commas 
5810: 6f 6e 20 44 42 5f 65 6e 75 6d 2c 20 69 74 20 63  on DB_enum, it c
5820: 6f 6e 66 75 73 65 73 20 74 68 65 20 41 49 58 20  onfuses the AIX 
5830: 78 6c 63 20 63 6f 6d 70 69 6c 65 72 20 2a 2f 0a  xlc compiler */.
5840: 0a 20 20 69 66 28 20 6f 62 6a 63 3c 32 20 29 7b  .  if( objc<2 ){
5850: 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
5860: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
5870: 20 6f 62 6a 76 2c 20 22 53 55 42 43 4f 4d 4d 41   objv, "SUBCOMMA
5880: 4e 44 20 2e 2e 2e 22 29 3b 0a 20 20 20 20 72 65  ND ...");.    re
5890: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
58a0: 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65    }.  if( Tcl_Ge
58b0: 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e  tIndexFromObj(in
58c0: 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 44  terp, objv[1], D
58d0: 42 5f 73 74 72 73 2c 20 22 6f 70 74 69 6f 6e 22  B_strs, "option"
58e0: 2c 20 30 2c 20 26 63 68 6f 69 63 65 29 20 29 7b  , 0, &choice) ){
58f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
5900: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 73 77  ERROR;.  }..  sw
5910: 69 74 63 68 28 20 28 65 6e 75 6d 20 44 42 5f 65  itch( (enum DB_e
5920: 6e 75 6d 29 63 68 6f 69 63 65 20 29 7b 0a 0a 20  num)choice ){.. 
5930: 20 2f 2a 20 20 20 20 24 64 62 20 61 75 74 68 6f   /*    $db autho
5940: 72 69 7a 65 72 20 3f 43 41 4c 4c 42 41 43 4b 3f  rizer ?CALLBACK?
5950: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b  .  **.  ** Invok
5960: 65 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c  e the given call
5970: 62 61 63 6b 20 74 6f 20 61 75 74 68 6f 72 69 7a  back to authoriz
5980: 65 20 65 61 63 68 20 53 51 4c 20 6f 70 65 72 61  e each SQL opera
5990: 74 69 6f 6e 20 61 73 20 69 74 20 69 73 0a 20 20  tion as it is.  
59a0: 2a 2a 20 63 6f 6d 70 69 6c 65 64 2e 20 20 35 20  ** compiled.  5 
59b0: 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 61 70  arguments are ap
59c0: 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 63 61  pended to the ca
59d0: 6c 6c 62 61 63 6b 20 62 65 66 6f 72 65 20 69 74  llback before it
59e0: 20 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6b 65 64   is.  ** invoked
59f0: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 31  :.  **.  **   (1
5a00: 29 20 54 68 65 20 61 75 74 68 6f 72 69 7a 61 74  ) The authorizat
5a10: 69 6f 6e 20 74 79 70 65 20 28 65 78 3a 20 53 51  ion type (ex: SQ
5a20: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c  LITE_CREATE_TABL
5a30: 45 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  E, SQLITE_INSERT
5a40: 2c 20 2e 2e 2e 29 0a 20 20 2a 2a 20 20 20 28 32  , ...).  **   (2
5a50: 29 20 46 69 72 73 74 20 64 65 73 63 72 69 70 74  ) First descript
5a60: 69 76 65 20 6e 61 6d 65 20 28 64 65 70 65 6e 64  ive name (depend
5a70: 73 20 6f 6e 20 61 75 74 68 6f 72 69 7a 61 74 69  s on authorizati
5a80: 6f 6e 20 74 79 70 65 29 0a 20 20 2a 2a 20 20 20  on type).  **   
5a90: 28 33 29 20 53 65 63 6f 6e 64 20 64 65 73 63 72  (3) Second descr
5aa0: 69 70 74 69 76 65 20 6e 61 6d 65 0a 20 20 2a 2a  iptive name.  **
5ab0: 20 20 20 28 34 29 20 4e 61 6d 65 20 6f 66 20 74     (4) Name of t
5ac0: 68 65 20 64 61 74 61 62 61 73 65 20 28 65 78 3a  he database (ex:
5ad0: 20 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 29   "main", "temp")
5ae0: 0a 20 20 2a 2a 20 20 20 28 35 29 20 4e 61 6d 65  .  **   (5) Name
5af0: 20 6f 66 20 74 72 69 67 67 65 72 20 74 68 61 74   of trigger that
5b00: 20 69 73 20 64 6f 69 6e 67 20 74 68 65 20 61 63   is doing the ac
5b10: 63 65 73 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  cess.  **.  ** T
5b20: 68 65 20 63 61 6c 6c 62 61 63 6b 20 73 68 6f 75  he callback shou
5b30: 6c 64 20 72 65 74 75 72 6e 20 6f 6e 20 6f 66 20  ld return on of 
5b40: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
5b50: 72 69 6e 67 73 3a 20 53 51 4c 49 54 45 5f 4f 4b  rings: SQLITE_OK
5b60: 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 49 47  ,.  ** SQLITE_IG
5b70: 4e 4f 52 45 2c 20 6f 72 20 53 51 4c 49 54 45 5f  NORE, or SQLITE_
5b80: 44 45 4e 59 2e 20 20 41 6e 79 20 6f 74 68 65 72  DENY.  Any other
5b90: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
5ba0: 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 2a 2a 0a   an error..  **.
5bb0: 20 20 2a 2a 20 49 66 20 74 68 69 73 20 6d 65 74    ** If this met
5bc0: 68 6f 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 77  hod is invoked w
5bd0: 69 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73  ith no arguments
5be0: 2c 20 74 68 65 20 63 75 72 72 65 6e 74 20 61 75  , the current au
5bf0: 74 68 6f 72 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a  thorization.  **
5c00: 20 63 61 6c 6c 62 61 63 6b 20 73 74 72 69 6e 67   callback string
5c10: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 20 20   is returned..  
5c20: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 41 55 54  */.  case DB_AUT
5c30: 48 4f 52 49 5a 45 52 3a 20 7b 0a 23 69 66 64 65  HORIZER: {.#ifde
5c40: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
5c50: 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20  THORIZATION.    
5c60: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
5c70: 28 69 6e 74 65 72 70 2c 20 22 61 75 74 68 6f 72  (interp, "author
5c80: 69 7a 61 74 69 6f 6e 20 6e 6f 74 20 61 76 61 69  ization not avai
5c90: 6c 61 62 6c 65 20 69 6e 20 74 68 69 73 20 62 75  lable in this bu
5ca0: 69 6c 64 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  ild", 0);.    re
5cb0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
5cc0: 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 6f 62  #else.    if( ob
5cd0: 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63  jc>3 ){.      Tc
5ce0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
5cf0: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
5d00: 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20  "?CALLBACK?");. 
5d10: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
5d20: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65  ERROR;.    }else
5d30: 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a   if( objc==2 ){.
5d40: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
5d50: 41 75 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20  Auth ){.        
5d60: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
5d70: 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 41  (interp, pDb->zA
5d80: 75 74 68 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  uth, 0);.      }
5d90: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
5da0: 20 20 63 68 61 72 20 2a 7a 41 75 74 68 3b 0a 20    char *zAuth;. 
5db0: 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20       int len;.  
5dc0: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75      if( pDb->zAu
5dd0: 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  th ){.        Tc
5de0: 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 41 75 74  l_Free(pDb->zAut
5df0: 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  h);.      }.    
5e00: 20 20 7a 41 75 74 68 20 3d 20 54 63 6c 5f 47 65    zAuth = Tcl_Ge
5e10: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
5e20: 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20  bjv[2], &len);. 
5e30: 20 20 20 20 20 69 66 28 20 7a 41 75 74 68 20 26       if( zAuth &
5e40: 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20  & len>0 ){.     
5e50: 20 20 20 70 44 62 2d 3e 7a 41 75 74 68 20 3d 20     pDb->zAuth = 
5e60: 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b  Tcl_Alloc( len +
5e70: 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 73 74   1 );.        st
5e80: 72 63 70 79 28 70 44 62 2d 3e 7a 41 75 74 68 2c  rcpy(pDb->zAuth,
5e90: 20 7a 41 75 74 68 29 3b 0a 20 20 20 20 20 20 7d   zAuth);.      }
5ea0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44  else{.        pD
5eb0: 62 2d 3e 7a 41 75 74 68 20 3d 20 30 3b 0a 20 20  b->zAuth = 0;.  
5ec0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
5ed0: 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20  pDb->zAuth ){.  
5ee0: 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72        pDb->inter
5ef0: 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20  p = interp;.    
5f00: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f      sqlite3_set_
5f10: 61 75 74 68 6f 72 69 7a 65 72 28 70 44 62 2d 3e  authorizer(pDb->
5f20: 64 62 2c 20 61 75 74 68 5f 63 61 6c 6c 62 61 63  db, auth_callbac
5f30: 6b 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d  k, pDb);.      }
5f40: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
5f50: 6c 69 74 65 33 5f 73 65 74 5f 61 75 74 68 6f 72  lite3_set_author
5f60: 69 7a 65 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c  izer(pDb->db, 0,
5f70: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
5f80: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72   }.#endif.    br
5f90: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
5fa0: 20 20 24 64 62 20 62 75 73 79 20 3f 43 41 4c 4c    $db busy ?CALL
5fb0: 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20  BACK?.  **.  ** 
5fc0: 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e  Invoke the given
5fd0: 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 61 6e 20   callback if an 
5fe0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 74  SQL statement at
5ff0: 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 0a 20  tempts to open. 
6000: 20 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 64 61 74   ** a locked dat
6010: 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f  abase file..  */
6020: 0a 20 20 63 61 73 65 20 44 42 5f 42 55 53 59 3a  .  case DB_BUSY:
6030: 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e   {.    if( objc>
6040: 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
6050: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
6060: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 43 41  rp, 2, objv, "CA
6070: 4c 4c 42 41 43 4b 22 29 3b 0a 20 20 20 20 20 20  LLBACK");.      
6080: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
6090: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
60a0: 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20  objc==2 ){.     
60b0: 20 69 66 28 20 70 44 62 2d 3e 7a 42 75 73 79 20   if( pDb->zBusy 
60c0: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41  ){.        Tcl_A
60d0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
60e0: 72 70 2c 20 70 44 62 2d 3e 7a 42 75 73 79 2c 20  rp, pDb->zBusy, 
60f0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
6100: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61  }else{.      cha
6110: 72 20 2a 7a 42 75 73 79 3b 0a 20 20 20 20 20 20  r *zBusy;.      
6120: 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69  int len;.      i
6130: 66 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b  f( pDb->zBusy ){
6140: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65  .        Tcl_Fre
6150: 65 28 70 44 62 2d 3e 7a 42 75 73 79 29 3b 0a 20  e(pDb->zBusy);. 
6160: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 42 75       }.      zBu
6170: 73 79 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  sy = Tcl_GetStri
6180: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
6190: 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20  ], &len);.      
61a0: 69 66 28 20 7a 42 75 73 79 20 26 26 20 6c 65 6e  if( zBusy && len
61b0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  >0 ){.        pD
61c0: 62 2d 3e 7a 42 75 73 79 20 3d 20 54 63 6c 5f 41  b->zBusy = Tcl_A
61d0: 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b  lloc( len + 1 );
61e0: 0a 20 20 20 20 20 20 20 20 73 74 72 63 70 79 28  .        strcpy(
61f0: 70 44 62 2d 3e 7a 42 75 73 79 2c 20 7a 42 75 73  pDb->zBusy, zBus
6200: 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  y);.      }else{
6210: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 42  .        pDb->zB
6220: 75 73 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  usy = 0;.      }
6230: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
6240: 7a 42 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20  zBusy ){.       
6250: 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69   pDb->interp = i
6260: 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73  nterp;.        s
6270: 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64  qlite3_busy_hand
6280: 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20 44 62 42  ler(pDb->db, DbB
6290: 75 73 79 48 61 6e 64 6c 65 72 2c 20 70 44 62 29  usyHandler, pDb)
62a0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
62b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
62c0: 75 73 79 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d  usy_handler(pDb-
62d0: 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  >db, 0, 0);.    
62e0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72    }.    }.    br
62f0: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
6300: 20 20 20 24 64 62 20 63 61 63 68 65 20 66 6c 75     $db cache flu
6310: 73 68 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20  sh.  **     $db 
6320: 63 61 63 68 65 20 73 69 7a 65 20 6e 0a 20 20 2a  cache size n.  *
6330: 2a 0a 20 20 2a 2a 20 46 6c 75 73 68 20 74 68 65  *.  ** Flush the
6340: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
6350: 65 6e 74 20 63 61 63 68 65 2c 20 6f 72 20 73 65  ent cache, or se
6360: 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  t the maximum nu
6370: 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 63 61 63  mber of.  ** cac
6380: 68 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  hed statements..
6390: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43    */.  case DB_C
63a0: 41 43 48 45 3a 20 7b 0a 20 20 20 20 63 68 61 72  ACHE: {.    char
63b0: 20 2a 73 75 62 43 6d 64 3b 0a 20 20 20 20 69 6e   *subCmd;.    in
63c0: 74 20 6e 3b 0a 0a 20 20 20 20 69 66 28 20 6f 62  t n;..    if( ob
63d0: 6a 63 3c 3d 32 20 29 7b 0a 20 20 20 20 20 20 54  jc<=2 ){.      T
63e0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
63f0: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
6400: 20 22 63 61 63 68 65 20 6f 70 74 69 6f 6e 20 3f   "cache option ?
6410: 61 72 67 3f 22 29 3b 0a 20 20 20 20 20 20 72 65  arg?");.      re
6420: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
6430: 20 20 20 20 7d 0a 20 20 20 20 73 75 62 43 6d 64      }.    subCmd
6440: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
6450: 46 72 6f 6d 4f 62 6a 28 20 6f 62 6a 76 5b 32 5d  FromObj( objv[2]
6460: 2c 20 30 20 29 3b 0a 20 20 20 20 69 66 28 20 2a  , 0 );.    if( *
6470: 73 75 62 43 6d 64 3d 3d 27 66 27 20 26 26 20 73  subCmd=='f' && s
6480: 74 72 63 6d 70 28 73 75 62 43 6d 64 2c 22 66 6c  trcmp(subCmd,"fl
6490: 75 73 68 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ush")==0 ){.    
64a0: 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
64b0: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  .        Tcl_Wro
64c0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
64d0: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 66 6c 75 73  , 2, objv, "flus
64e0: 68 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  h");.        ret
64f0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
6500: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6510: 20 20 20 20 66 6c 75 73 68 53 74 6d 74 43 61 63      flushStmtCac
6520: 68 65 28 20 70 44 62 20 29 3b 0a 20 20 20 20 20  he( pDb );.     
6530: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
6540: 20 2a 73 75 62 43 6d 64 3d 3d 27 73 27 20 26 26   *subCmd=='s' &&
6550: 20 73 74 72 63 6d 70 28 73 75 62 43 6d 64 2c 22   strcmp(subCmd,"
6560: 73 69 7a 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  size")==0 ){.   
6570: 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29     if( objc!=4 )
6580: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72  {.        Tcl_Wr
6590: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
65a0: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 73 69 7a  p, 2, objv, "siz
65b0: 65 20 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72  e n");.        r
65c0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
65d0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
65e0: 20 20 20 20 20 20 69 66 28 20 54 43 4c 5f 45 52        if( TCL_ER
65f0: 52 4f 52 3d 3d 54 63 6c 5f 47 65 74 49 6e 74 46  ROR==Tcl_GetIntF
6600: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
6610: 62 6a 76 5b 33 5d 2c 20 26 6e 29 20 29 7b 0a 20  bjv[3], &n) ){. 
6620: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70           Tcl_App
6630: 65 6e 64 52 65 73 75 6c 74 28 20 69 6e 74 65 72  endResult( inter
6640: 70 2c 20 22 63 61 6e 6e 6f 74 20 63 6f 6e 76 65  p, "cannot conve
6650: 72 74 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  rt \"", .       
6660: 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
6670: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
6680: 76 5b 33 5d 2c 30 29 2c 20 22 5c 22 20 74 6f 20  v[3],0), "\" to 
6690: 69 6e 74 65 67 65 72 22 2c 20 30 29 3b 0a 20 20  integer", 0);.  
66a0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
66b0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
66c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
66d0: 20 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20     if( n<0 ){.  
66e0: 20 20 20 20 20 20 20 20 20 20 66 6c 75 73 68 53            flushS
66f0: 74 6d 74 43 61 63 68 65 28 20 70 44 62 20 29 3b  tmtCache( pDb );
6700: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d  .            n =
6710: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65   0;.          }e
6720: 6c 73 65 20 69 66 28 20 6e 3e 4d 41 58 5f 50 52  lse if( n>MAX_PR
6730: 45 50 41 52 45 44 5f 53 54 4d 54 53 20 29 7b 0a  EPARED_STMTS ){.
6740: 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20              n = 
6750: 4d 41 58 5f 50 52 45 50 41 52 45 44 5f 53 54 4d  MAX_PREPARED_STM
6760: 54 53 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  TS;.          }.
6770: 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 6d            pDb->m
6780: 61 78 53 74 6d 74 20 3d 20 6e 3b 0a 20 20 20 20  axStmt = n;.    
6790: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
67a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54    }else{.      T
67b0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
67c0: 20 69 6e 74 65 72 70 2c 20 22 62 61 64 20 6f 70   interp, "bad op
67d0: 74 69 6f 6e 20 5c 22 22 2c 20 0a 20 20 20 20 20  tion \"", .     
67e0: 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
67f0: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
6800: 5d 2c 30 29 2c 20 22 5c 22 3a 20 6d 75 73 74 20  ],0), "\": must 
6810: 62 65 20 66 6c 75 73 68 20 6f 72 20 73 69 7a 65  be flush or size
6820: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74  ", 0);.      ret
6830: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
6840: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
6850: 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 20 24 64    }..  /*     $d
6860: 62 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 0a 20  b changes.  **. 
6870: 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e   ** Return the n
6880: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68  umber of rows th
6890: 61 74 20 77 65 72 65 20 6d 6f 64 69 66 69 65 64  at were modified
68a0: 2c 20 69 6e 73 65 72 74 65 64 2c 20 6f 72 20 64  , inserted, or d
68b0: 65 6c 65 74 65 64 20 62 79 0a 20 20 2a 2a 20 74  eleted by.  ** t
68c0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 49  he most recent I
68d0: 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72  NSERT, UPDATE or
68e0: 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e   DELETE statemen
68f0: 74 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67  t, not including
6900: 20 0a 20 20 2a 2a 20 61 6e 79 20 63 68 61 6e 67   .  ** any chang
6910: 65 73 20 6d 61 64 65 20 62 79 20 74 72 69 67 67  es made by trigg
6920: 65 72 20 70 72 6f 67 72 61 6d 73 2e 0a 20 20 2a  er programs..  *
6930: 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 48 41 4e  /.  case DB_CHAN
6940: 47 45 53 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f  GES: {.    Tcl_O
6950: 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20  bj *pResult;.   
6960: 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
6970: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
6980: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
6990: 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20  , objv, "");.   
69a0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
69b0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ROR;.    }.    p
69c0: 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74  Result = Tcl_Get
69d0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
69e0: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 49 6e  );.    Tcl_SetIn
69f0: 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 73 71  tObj(pResult, sq
6a00: 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 70 44  lite3_changes(pD
6a10: 62 2d 3e 64 62 29 29 3b 0a 20 20 20 20 62 72 65  b->db));.    bre
6a20: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
6a30: 20 24 64 62 20 63 6c 6f 73 65 0a 20 20 2a 2a 0a   $db close.  **.
6a40: 20 20 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68    ** Shutdown th
6a50: 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2f 0a  e database.  */.
6a60: 20 20 63 61 73 65 20 44 42 5f 43 4c 4f 53 45 3a    case DB_CLOSE:
6a70: 20 7b 0a 20 20 20 20 54 63 6c 5f 44 65 6c 65 74   {.    Tcl_Delet
6a80: 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  eCommand(interp,
6a90: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
6aa0: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
6ab0: 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  ));.    break;. 
6ac0: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
6ad0: 20 20 24 64 62 20 63 6f 6c 6c 61 74 65 20 4e 41    $db collate NA
6ae0: 4d 45 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20  ME SCRIPT.  **. 
6af0: 20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77   ** Create a new
6b00: 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   SQL collation f
6b10: 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e  unction called N
6b20: 41 4d 45 2e 20 20 57 68 65 6e 65 76 65 72 0a 20  AME.  Whenever. 
6b30: 20 2a 2a 20 74 68 61 74 20 66 75 6e 63 74 69 6f   ** that functio
6b40: 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 6e 76  n is called, inv
6b50: 6f 6b 65 20 53 43 52 49 50 54 20 74 6f 20 65 76  oke SCRIPT to ev
6b60: 61 6c 75 61 74 65 20 74 68 65 20 66 75 6e 63 74  aluate the funct
6b70: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ion..  */.  case
6b80: 20 44 42 5f 43 4f 4c 4c 41 54 45 3a 20 7b 0a 20   DB_COLLATE: {. 
6b90: 20 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70     SqlCollate *p
6ba0: 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 63 68 61  Collate;.    cha
6bb0: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 68  r *zName;.    ch
6bc0: 61 72 20 2a 7a 53 63 72 69 70 74 3b 0a 20 20 20  ar *zScript;.   
6bd0: 20 69 6e 74 20 6e 53 63 72 69 70 74 3b 0a 20 20   int nScript;.  
6be0: 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b    if( objc!=4 ){
6bf0: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
6c00: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
6c10: 32 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 20 53  2, objv, "NAME S
6c20: 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72  CRIPT");.      r
6c30: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
6c40: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65  .    }.    zName
6c50: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
6c60: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
6c70: 20 30 29 3b 0a 20 20 20 20 7a 53 63 72 69 70 74   0);.    zScript
6c80: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
6c90: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c  FromObj(objv[3],
6ca0: 20 26 6e 53 63 72 69 70 74 29 3b 0a 20 20 20 20   &nScript);.    
6cb0: 70 43 6f 6c 6c 61 74 65 20 3d 20 28 53 71 6c 43  pCollate = (SqlC
6cc0: 6f 6c 6c 61 74 65 2a 29 54 63 6c 5f 41 6c 6c 6f  ollate*)Tcl_Allo
6cd0: 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 6f 6c 6c  c( sizeof(*pColl
6ce0: 61 74 65 29 20 2b 20 6e 53 63 72 69 70 74 20 2b  ate) + nScript +
6cf0: 20 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43   1 );.    if( pC
6d00: 6f 6c 6c 61 74 65 3d 3d 30 20 29 20 72 65 74 75  ollate==0 ) retu
6d10: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
6d20: 20 20 70 43 6f 6c 6c 61 74 65 2d 3e 69 6e 74 65    pCollate->inte
6d30: 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20  rp = interp;.   
6d40: 20 70 43 6f 6c 6c 61 74 65 2d 3e 70 4e 65 78 74   pCollate->pNext
6d50: 20 3d 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65   = pDb->pCollate
6d60: 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65 2d 3e  ;.    pCollate->
6d70: 7a 53 63 72 69 70 74 20 3d 20 28 63 68 61 72 2a  zScript = (char*
6d80: 29 26 70 43 6f 6c 6c 61 74 65 5b 31 5d 3b 0a 20  )&pCollate[1];. 
6d90: 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65     pDb->pCollate
6da0: 20 3d 20 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20   = pCollate;.   
6db0: 20 73 74 72 63 70 79 28 70 43 6f 6c 6c 61 74 65   strcpy(pCollate
6dc0: 2d 3e 7a 53 63 72 69 70 74 2c 20 7a 53 63 72 69  ->zScript, zScri
6dd0: 70 74 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  pt);.    if( sql
6de0: 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
6df0: 61 74 69 6f 6e 28 70 44 62 2d 3e 64 62 2c 20 7a  ation(pDb->db, z
6e00: 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54 46  Name, SQLITE_UTF
6e10: 38 2c 20 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  8, .        pCol
6e20: 6c 61 74 65 2c 20 74 63 6c 53 71 6c 43 6f 6c 6c  late, tclSqlColl
6e30: 61 74 65 29 20 29 7b 0a 20 20 20 20 20 20 54 63  ate) ){.      Tc
6e40: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
6e50: 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69  rp, (char *)sqli
6e60: 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e  te3_errmsg(pDb->
6e70: 64 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c  db), TCL_VOLATIL
6e80: 45 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  E);.      return
6e90: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
6ea0: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
6eb0: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20  ..  /*.  **     
6ec0: 24 64 62 20 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65  $db collation_ne
6ed0: 65 64 65 64 20 53 43 52 49 50 54 0a 20 20 2a 2a  eded SCRIPT.  **
6ee0: 0a 20 20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  .  ** Create a n
6ef0: 65 77 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e  ew SQL collation
6f00: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64   function called
6f10: 20 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76 65 72   NAME.  Whenever
6f20: 0a 20 20 2a 2a 20 74 68 61 74 20 66 75 6e 63 74  .  ** that funct
6f30: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
6f40: 6e 76 6f 6b 65 20 53 43 52 49 50 54 20 74 6f 20  nvoke SCRIPT to 
6f50: 65 76 61 6c 75 61 74 65 20 74 68 65 20 66 75 6e  evaluate the fun
6f60: 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61  ction..  */.  ca
6f70: 73 65 20 44 42 5f 43 4f 4c 4c 41 54 49 4f 4e 5f  se DB_COLLATION_
6f80: 4e 45 45 44 45 44 3a 20 7b 0a 20 20 20 20 69 66  NEEDED: {.    if
6f90: 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
6fa0: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
6fb0: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
6fc0: 62 6a 76 2c 20 22 53 43 52 49 50 54 22 29 3b 0a  bjv, "SCRIPT");.
6fd0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
6fe0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
6ff0: 20 20 69 66 28 20 70 44 62 2d 3e 70 43 6f 6c 6c    if( pDb->pColl
7000: 61 74 65 4e 65 65 64 65 64 20 29 7b 0a 20 20 20  ateNeeded ){.   
7010: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
7020: 75 6e 74 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74  unt(pDb->pCollat
7030: 65 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 7d 0a  eNeeded);.    }.
7040: 20 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74      pDb->pCollat
7050: 65 4e 65 65 64 65 64 20 3d 20 54 63 6c 5f 44 75  eNeeded = Tcl_Du
7060: 70 6c 69 63 61 74 65 4f 62 6a 28 6f 62 6a 76 5b  plicateObj(objv[
7070: 32 5d 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63  2]);.    Tcl_Inc
7080: 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70  rRefCount(pDb->p
7090: 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a  CollateNeeded);.
70a0: 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c      sqlite3_coll
70b0: 61 74 69 6f 6e 5f 6e 65 65 64 65 64 28 70 44 62  ation_needed(pDb
70c0: 2d 3e 64 62 2c 20 70 44 62 2c 20 74 63 6c 43 6f  ->db, pDb, tclCo
70d0: 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20  llateNeeded);.  
70e0: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
70f0: 2f 2a 20 20 20 20 24 64 62 20 63 6f 6d 6d 69 74  /*    $db commit
7100: 5f 68 6f 6f 6b 20 3f 43 41 4c 4c 42 41 43 4b 3f  _hook ?CALLBACK?
7110: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b  .  **.  ** Invok
7120: 65 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c  e the given call
7130: 62 61 63 6b 20 6a 75 73 74 20 62 65 66 6f 72 65  back just before
7140: 20 63 6f 6d 6d 69 74 74 69 6e 67 20 65 76 65 72   committing ever
7150: 79 20 53 51 4c 20 74 72 61 6e 73 61 63 74 69 6f  y SQL transactio
7160: 6e 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 63  n..  ** If the c
7170: 61 6c 6c 62 61 63 6b 20 74 68 72 6f 77 73 20 61  allback throws a
7180: 6e 20 65 78 63 65 70 74 69 6f 6e 20 6f 72 20 72  n exception or r
7190: 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  eturns non-zero,
71a0: 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 74   then the.  ** t
71b0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 62  ransaction is ab
71c0: 6f 72 74 65 64 2e 20 20 49 66 20 43 41 4c 4c 42  orted.  If CALLB
71d0: 41 43 4b 20 69 73 20 61 6e 20 65 6d 70 74 79 20  ACK is an empty 
71e0: 73 74 72 69 6e 67 2c 20 74 68 65 20 63 61 6c 6c  string, the call
71f0: 62 61 63 6b 0a 20 20 2a 2a 20 69 73 20 64 69 73  back.  ** is dis
7200: 61 62 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61  abled..  */.  ca
7210: 73 65 20 44 42 5f 43 4f 4d 4d 49 54 5f 48 4f 4f  se DB_COMMIT_HOO
7220: 4b 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a  K: {.    if( obj
7230: 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  c>3 ){.      Tcl
7240: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
7250: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
7260: 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20  ?CALLBACK?");.  
7270: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
7280: 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20  RROR;.    }else 
7290: 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20  if( objc==2 ){. 
72a0: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 43       if( pDb->zC
72b0: 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  ommit ){.       
72c0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
72d0: 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a  t(interp, pDb->z
72e0: 43 6f 6d 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20  Commit, 0);.    
72f0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
7300: 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6d 6d       char *zComm
7310: 69 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65  it;.      int le
7320: 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  n;.      if( pDb
7330: 2d 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20  ->zCommit ){.   
7340: 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44       Tcl_Free(pD
7350: 62 2d 3e 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20 20  b->zCommit);.   
7360: 20 20 20 7d 0a 20 20 20 20 20 20 7a 43 6f 6d 6d     }.      zComm
7370: 69 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  it = Tcl_GetStri
7380: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
7390: 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20  ], &len);.      
73a0: 69 66 28 20 7a 43 6f 6d 6d 69 74 20 26 26 20 6c  if( zCommit && l
73b0: 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  en>0 ){.        
73c0: 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20 54  pDb->zCommit = T
73d0: 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20  cl_Alloc( len + 
73e0: 31 20 29 3b 0a 20 20 20 20 20 20 20 20 73 74 72  1 );.        str
73f0: 63 70 79 28 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74  cpy(pDb->zCommit
7400: 2c 20 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20  , zCommit);.    
7410: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7420: 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20   pDb->zCommit = 
7430: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
7440: 20 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69   if( pDb->zCommi
7450: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  t ){.        pDb
7460: 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72  ->interp = inter
7470: 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  p;.        sqlit
7480: 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 70  e3_commit_hook(p
7490: 44 62 2d 3e 64 62 2c 20 44 62 43 6f 6d 6d 69 74  Db->db, DbCommit
74a0: 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20  Handler, pDb);. 
74b0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
74c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6d 6d      sqlite3_comm
74d0: 69 74 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c  it_hook(pDb->db,
74e0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
74f0: 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
7500: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64  .  }..  /*    $d
7510: 62 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c 0a 20  b complete SQL. 
7520: 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20   **.  ** Return 
7530: 54 52 55 45 20 69 66 20 53 51 4c 20 69 73 20 61  TRUE if SQL is a
7540: 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c 20 73 74   complete SQL st
7550: 61 74 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e  atement.  Return
7560: 20 46 41 4c 53 45 20 69 66 0a 20 20 2a 2a 20 61   FALSE if.  ** a
7570: 64 64 69 74 69 6f 6e 61 6c 20 6c 69 6e 65 73 20  dditional lines 
7580: 6f 66 20 69 6e 70 75 74 20 61 72 65 20 6e 65 65  of input are nee
7590: 64 65 64 2e 20 20 54 68 69 73 20 69 73 20 73 69  ded.  This is si
75a0: 6d 69 6c 61 72 20 74 6f 20 74 68 65 0a 20 20 2a  milar to the.  *
75b0: 2a 20 62 75 69 6c 74 2d 69 6e 20 22 69 6e 66 6f  * built-in "info
75c0: 20 63 6f 6d 70 6c 65 74 65 22 20 63 6f 6d 6d 61   complete" comma
75d0: 6e 64 20 6f 66 20 54 63 6c 2e 0a 20 20 2a 2f 0a  nd of Tcl..  */.
75e0: 20 20 63 61 73 65 20 44 42 5f 43 4f 4d 50 4c 45    case DB_COMPLE
75f0: 54 45 3a 20 7b 0a 23 69 66 6e 64 65 66 20 53 51  TE: {.#ifndef SQ
7600: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4c 45  LITE_OMIT_COMPLE
7610: 54 45 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  TE.    Tcl_Obj *
7620: 70 52 65 73 75 6c 74 3b 0a 20 20 20 20 69 6e 74  pResult;.    int
7630: 20 69 73 43 6f 6d 70 6c 65 74 65 3b 0a 20 20 20   isComplete;.   
7640: 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
7650: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
7660: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
7670: 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 22 29 3b 0a  , objv, "SQL");.
7680: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
7690: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
76a0: 20 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 73    isComplete = s
76b0: 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 28  qlite3_complete(
76c0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
76d0: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30  omObj(objv[2], 0
76e0: 29 20 29 3b 0a 20 20 20 20 70 52 65 73 75 6c 74  ) );.    pResult
76f0: 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73   = Tcl_GetObjRes
7700: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  ult(interp);.   
7710: 20 54 63 6c 5f 53 65 74 42 6f 6f 6c 65 61 6e 4f   Tcl_SetBooleanO
7720: 62 6a 28 70 52 65 73 75 6c 74 2c 20 69 73 43 6f  bj(pResult, isCo
7730: 6d 70 6c 65 74 65 29 3b 0a 23 65 6e 64 69 66 0a  mplete);.#endif.
7740: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
7750: 20 20 2f 2a 20 20 20 20 24 64 62 20 63 6f 70 79    /*    $db copy
7760: 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69   conflict-algori
7770: 74 68 6d 20 74 61 62 6c 65 20 66 69 6c 65 6e 61  thm table filena
7780: 6d 65 20 3f 53 45 50 41 52 41 54 4f 52 3f 20 3f  me ?SEPARATOR? ?
7790: 4e 55 4c 4c 49 4e 44 49 43 41 54 4f 52 3f 0a 20  NULLINDICATOR?. 
77a0: 20 2a 2a 0a 20 20 2a 2a 20 43 6f 70 79 20 64 61   **.  ** Copy da
77b0: 74 61 20 69 6e 74 6f 20 74 61 62 6c 65 20 66 72  ta into table fr
77c0: 6f 6d 20 66 69 6c 65 6e 61 6d 65 2c 20 6f 70 74  om filename, opt
77d0: 69 6f 6e 61 6c 6c 79 20 75 73 69 6e 67 20 53 45  ionally using SE
77e0: 50 41 52 41 54 4f 52 0a 20 20 2a 2a 20 61 73 20  PARATOR.  ** as 
77f0: 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72  column separator
7800: 73 2e 20 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20  s.  If a column 
7810: 63 6f 6e 74 61 69 6e 73 20 61 20 6e 75 6c 6c 20  contains a null 
7820: 73 74 72 69 6e 67 2c 20 6f 72 20 74 68 65 0a 20  string, or the. 
7830: 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 4e 55 4c   ** value of NUL
7840: 4c 49 4e 44 49 43 41 54 4f 52 2c 20 61 20 4e 55  LINDICATOR, a NU
7850: 4c 4c 20 69 73 20 69 6e 73 65 72 74 65 64 20 66  LL is inserted f
7860: 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a 20  or the column.. 
7870: 20 2a 2a 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67   ** conflict-alg
7880: 6f 72 69 74 68 6d 20 69 73 20 6f 6e 65 20 6f 66  orithm is one of
7890: 20 74 68 65 20 73 71 6c 69 74 65 20 63 6f 6e 66   the sqlite conf
78a0: 6c 69 63 74 20 61 6c 67 6f 72 69 74 68 6d 73 3a  lict algorithms:
78b0: 0a 20 20 2a 2a 20 20 20 20 72 6f 6c 6c 62 61 63  .  **    rollbac
78c0: 6b 2c 20 61 62 6f 72 74 2c 20 66 61 69 6c 2c 20  k, abort, fail, 
78d0: 69 67 6e 6f 72 65 2c 20 72 65 70 6c 61 63 65 0a  ignore, replace.
78e0: 20 20 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c    ** On success,
78f0: 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   return the numb
7900: 65 72 20 6f 66 20 6c 69 6e 65 73 20 70 72 6f 63  er of lines proc
7910: 65 73 73 65 64 2c 20 6e 6f 74 20 6e 65 63 65 73  essed, not neces
7920: 73 61 72 69 6c 79 20 73 61 6d 65 0a 20 20 2a 2a  sarily same.  **
7930: 20 61 73 20 27 64 62 20 63 68 61 6e 67 65 73 27   as 'db changes'
7940: 20 64 75 65 20 74 6f 20 63 6f 6e 66 6c 69 63 74   due to conflict
7950: 2d 61 6c 67 6f 72 69 74 68 6d 20 73 65 6c 65 63  -algorithm selec
7960: 74 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ted..  **.  ** T
7970: 68 69 73 20 63 6f 64 65 20 69 73 20 62 61 73 69  his code is basi
7980: 63 61 6c 6c 79 20 61 6e 20 69 6d 70 6c 65 6d 65  cally an impleme
7990: 6e 74 61 74 69 6f 6e 2f 65 6e 68 61 6e 63 65 6d  ntation/enhancem
79a0: 65 6e 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  ent of.  ** the 
79b0: 73 71 6c 69 74 65 33 20 73 68 65 6c 6c 2e 63 20  sqlite3 shell.c 
79c0: 22 2e 69 6d 70 6f 72 74 22 20 63 6f 6d 6d 61 6e  ".import" comman
79d0: 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  d..  **.  ** Thi
79e0: 73 20 63 6f 6d 6d 61 6e 64 20 75 73 61 67 65 20  s command usage 
79f0: 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
7a00: 20 74 68 65 20 73 71 6c 69 74 65 32 2e 78 20 43   the sqlite2.x C
7a10: 4f 50 59 20 73 74 61 74 65 6d 65 6e 74 2c 0a 20  OPY statement,. 
7a20: 20 2a 2a 20 77 68 69 63 68 20 69 6d 70 6f 72 74   ** which import
7a30: 73 20 66 69 6c 65 20 64 61 74 61 20 69 6e 74 6f  s file data into
7a40: 20 61 20 74 61 62 6c 65 20 75 73 69 6e 67 20 74   a table using t
7a50: 68 65 20 50 6f 73 74 67 72 65 53 51 4c 20 43 4f  he PostgreSQL CO
7a60: 50 59 20 66 69 6c 65 20 66 6f 72 6d 61 74 3a 0a  PY file format:.
7a70: 20 20 2a 2a 20 20 20 24 64 62 20 63 6f 70 79 20    **   $db copy 
7a80: 24 63 6f 6e 66 6c 69 74 5f 61 6c 67 6f 20 24 74  $conflit_algo $t
7a90: 61 62 6c 65 5f 6e 61 6d 65 20 24 66 69 6c 65 6e  able_name $filen
7aa0: 61 6d 65 20 5c 74 20 5c 5c 4e 0a 20 20 2a 2f 0a  ame \t \\N.  */.
7ab0: 20 20 63 61 73 65 20 44 42 5f 43 4f 50 59 3a 20    case DB_COPY: 
7ac0: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62  {.    char *zTab
7ad0: 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
7ae0: 20 20 2f 2a 20 49 6e 73 65 72 74 20 64 61 74 61    /* Insert data
7af0: 20 69 6e 74 6f 20 74 68 69 73 20 74 61 62 6c 65   into this table
7b00: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 46   */.    char *zF
7b10: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
7b20: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
7b30: 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 65 78  from which to ex
7b40: 74 72 61 63 74 20 64 61 74 61 20 2a 2f 0a 20 20  tract data */.  
7b50: 20 20 63 68 61 72 20 2a 7a 43 6f 6e 66 6c 69 63    char *zConflic
7b60: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
7b70: 20 54 68 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c   The conflict al
7b80: 67 6f 72 69 74 68 6d 20 74 6f 20 75 73 65 20 2a  gorithm to use *
7b90: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  /.    sqlite3_st
7ba0: 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20  mt *pStmt;      
7bb0: 20 20 2f 2a 20 41 20 73 74 61 74 65 6d 65 6e 74    /* A statement
7bc0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 3b 20   */.    int rc; 
7bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7be0: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
7bf0: 64 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43  de */.    int nC
7c00: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
7c10: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7c20: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
7c30: 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69  e table */.    i
7c40: 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20  nt nByte;       
7c50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
7c60: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
7c70: 20 61 6e 20 53 51 4c 20 73 74 72 69 6e 67 20 2a   an SQL string *
7c80: 2f 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 20  /.    int i, j; 
7c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ca0: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
7cb0: 72 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53  rs */.    int nS
7cc0: 65 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ep;             
7cd0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7ce0: 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 53 65 70  of bytes in zSep
7cf0: 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4e  [] */.    int nN
7d00: 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ull;            
7d10: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7d20: 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 4e 75 6c  of bytes in zNul
7d30: 6c 5b 5d 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  l[] */.    char 
7d40: 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20  *zSql;          
7d50: 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 53 51 4c         /* An SQL
7d60: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
7d70: 20 20 63 68 61 72 20 2a 7a 4c 69 6e 65 3b 20 20    char *zLine;  
7d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7d90: 20 41 20 73 69 6e 67 6c 65 20 6c 69 6e 65 20 6f   A single line o
7da0: 66 20 69 6e 70 75 74 20 66 72 6f 6d 20 74 68 65  f input from the
7db0: 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61   file */.    cha
7dc0: 72 20 2a 2a 61 7a 43 6f 6c 3b 20 20 20 20 20 20  r **azCol;      
7dd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4c 69 6e           /* zLin
7de0: 65 5b 5d 20 62 72 6f 6b 65 6e 20 75 70 20 69 6e  e[] broken up in
7df0: 74 6f 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  to columns */.  
7e00: 20 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b    char *zCommit;
7e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7e20: 20 48 6f 77 20 74 6f 20 63 6f 6d 6d 69 74 20 63   How to commit c
7e30: 68 61 6e 67 65 73 20 2a 2f 0a 20 20 20 20 46 49  hanges */.    FI
7e40: 4c 45 20 2a 69 6e 3b 20 20 20 20 20 20 20 20 20  LE *in;         
7e50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
7e60: 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20   input file */. 
7e70: 20 20 20 69 6e 74 20 6c 69 6e 65 6e 6f 20 3d 20     int lineno = 
7e80: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
7e90: 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 6f 66  * Line number of
7ea0: 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20   input file */. 
7eb0: 20 20 20 63 68 61 72 20 7a 4c 69 6e 65 4e 75 6d     char zLineNum
7ec0: 5b 38 30 5d 3b 20 20 20 20 20 20 20 20 20 20 2f  [80];          /
7ed0: 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 70 72  * Line number pr
7ee0: 69 6e 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20  int buffer */.  
7ef0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75    Tcl_Obj *pResu
7f00: 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  lt;           /*
7f10: 20 69 6e 74 65 72 70 20 72 65 73 75 6c 74 20 2a   interp result *
7f20: 2f 0a 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 65  /..    char *zSe
7f30: 70 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 75  p;.    char *zNu
7f40: 6c 6c 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  ll;.    if( objc
7f50: 3c 35 20 7c 7c 20 6f 62 6a 63 3e 37 20 29 7b 0a  <5 || objc>7 ){.
7f60: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
7f70: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
7f80: 2c 20 6f 62 6a 76 2c 20 0a 20 20 20 20 20 20 20  , objv, .       
7f90: 20 20 22 43 4f 4e 46 4c 49 43 54 2d 41 4c 47 4f    "CONFLICT-ALGO
7fa0: 52 49 54 48 4d 20 54 41 42 4c 45 20 46 49 4c 45  RITHM TABLE FILE
7fb0: 4e 41 4d 45 20 3f 53 45 50 41 52 41 54 4f 52 3f  NAME ?SEPARATOR?
7fc0: 20 3f 4e 55 4c 4c 49 4e 44 49 43 41 54 4f 52 3f   ?NULLINDICATOR?
7fd0: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
7fe0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
7ff0: 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 3d  }.    if( objc>=
8000: 36 20 29 7b 0a 20 20 20 20 20 20 7a 53 65 70 20  6 ){.      zSep 
8010: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
8020: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 35 5d 2c 20  romObj(objv[5], 
8030: 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
8040: 20 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 74 22       zSep = "\t"
8050: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
8060: 6f 62 6a 63 3e 3d 37 20 29 7b 0a 20 20 20 20 20  objc>=7 ){.     
8070: 20 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f 47 65 74   zNull = Tcl_Get
8080: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
8090: 6a 76 5b 36 5d 2c 20 30 29 3b 0a 20 20 20 20 7d  jv[6], 0);.    }
80a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4e 75 6c  else{.      zNul
80b0: 6c 20 3d 20 22 22 3b 0a 20 20 20 20 7d 0a 20 20  l = "";.    }.  
80c0: 20 20 7a 43 6f 6e 66 6c 69 63 74 20 3d 20 54 63    zConflict = Tc
80d0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
80e0: 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a  bj(objv[2], 0);.
80f0: 20 20 20 20 7a 54 61 62 6c 65 20 3d 20 54 63 6c      zTable = Tcl
8100: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
8110: 6a 28 6f 62 6a 76 5b 33 5d 2c 20 30 29 3b 0a 20  j(objv[3], 0);. 
8120: 20 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47     zFile = Tcl_G
8130: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
8140: 6f 62 6a 76 5b 34 5d 2c 20 30 29 3b 0a 20 20 20  objv[4], 0);.   
8150: 20 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e 28 7a   nSep = strlen(z
8160: 53 65 70 29 3b 0a 20 20 20 20 6e 4e 75 6c 6c 20  Sep);.    nNull 
8170: 3d 20 73 74 72 6c 65 6e 28 7a 4e 75 6c 6c 29 3b  = strlen(zNull);
8180: 0a 20 20 20 20 69 66 28 20 6e 53 65 70 3d 3d 30  .    if( nSep==0
8190: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
81a0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
81b0: 70 2c 20 22 45 72 72 6f 72 3a 20 6e 6f 6e 2d 6e  p, "Error: non-n
81c0: 75 6c 6c 20 73 65 70 61 72 61 74 6f 72 20 72 65  ull separator re
81d0: 71 75 69 72 65 64 20 66 6f 72 20 63 6f 70 79 22  quired for copy"
81e0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , 0);.      retu
81f0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
8200: 20 20 7d 0a 20 20 20 20 69 66 28 73 71 6c 69 74    }.    if(sqlit
8210: 65 33 53 74 72 49 43 6d 70 28 7a 43 6f 6e 66 6c  e3StrICmp(zConfl
8220: 69 63 74 2c 20 22 72 6f 6c 6c 62 61 63 6b 22 29  ict, "rollback")
8230: 20 21 3d 20 30 20 26 26 0a 20 20 20 20 20 20 20   != 0 &&.       
8240: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
8250: 43 6f 6e 66 6c 69 63 74 2c 20 22 61 62 6f 72 74  Conflict, "abort
8260: 22 20 20 20 29 20 21 3d 20 30 20 26 26 0a 20 20  "   ) != 0 &&.  
8270: 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 49       sqlite3StrI
8280: 43 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22  Cmp(zConflict, "
8290: 66 61 69 6c 22 20 20 20 20 29 20 21 3d 20 30 20  fail"    ) != 0 
82a0: 26 26 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65  &&.       sqlite
82b0: 33 53 74 72 49 43 6d 70 28 7a 43 6f 6e 66 6c 69  3StrICmp(zConfli
82c0: 63 74 2c 20 22 69 67 6e 6f 72 65 22 20 20 29 20  ct, "ignore"  ) 
82d0: 21 3d 20 30 20 26 26 0a 20 20 20 20 20 20 20 73  != 0 &&.       s
82e0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 43  qlite3StrICmp(zC
82f0: 6f 6e 66 6c 69 63 74 2c 20 22 72 65 70 6c 61 63  onflict, "replac
8300: 65 22 20 29 20 21 3d 20 30 20 29 20 7b 0a 20 20  e" ) != 0 ) {.  
8310: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
8320: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72  sult(interp, "Er
8330: 72 6f 72 3a 20 5c 22 22 2c 20 7a 43 6f 6e 66 6c  ror: \"", zConfl
8340: 69 63 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ict, .          
8350: 20 20 22 5c 22 2c 20 63 6f 6e 66 6c 69 63 74 2d    "\", conflict-
8360: 61 6c 67 6f 72 69 74 68 6d 20 6d 75 73 74 20 62  algorithm must b
8370: 65 20 6f 6e 65 20 6f 66 3a 20 72 6f 6c 6c 62 61  e one of: rollba
8380: 63 6b 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20  ck, ".          
8390: 20 20 22 61 62 6f 72 74 2c 20 66 61 69 6c 2c 20    "abort, fail, 
83a0: 69 67 6e 6f 72 65 2c 20 6f 72 20 72 65 70 6c 61  ignore, or repla
83b0: 63 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  ce", 0);.      r
83c0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
83d0: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20  .    }.    zSql 
83e0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
83f0: 66 28 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  f("SELECT * FROM
8400: 20 27 25 71 27 22 2c 20 7a 54 61 62 6c 65 29 3b   '%q'", zTable);
8410: 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  .    if( zSql==0
8420: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
8430: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
8440: 70 2c 20 22 45 72 72 6f 72 3a 20 6e 6f 20 73 75  p, "Error: no su
8450: 63 68 20 74 61 62 6c 65 3a 20 22 2c 20 7a 54 61  ch table: ", zTa
8460: 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  ble, 0);.      r
8470: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8480: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65  .    }.    nByte
8490: 20 3d 20 73 74 72 6c 65 6e 28 7a 53 71 6c 29 3b   = strlen(zSql);
84a0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
84b0: 33 5f 70 72 65 70 61 72 65 28 70 44 62 2d 3e 64  3_prepare(pDb->d
84c0: 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 26 70 53 74  b, zSql, 0, &pSt
84d0: 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  mt, 0);.    sqli
84e0: 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
84f0: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
8500: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
8510: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72  sult(interp, "Er
8520: 72 6f 72 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f  ror: ", sqlite3_
8530: 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c  errmsg(pDb->db),
8540: 20 30 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 20   0);.      nCol 
8550: 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
8560: 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c        nCol = sql
8570: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
8580: 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a  t(pStmt);.    }.
8590: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
85a0: 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
85b0: 20 69 66 28 20 6e 43 6f 6c 3d 3d 30 20 29 20 7b   if( nCol==0 ) {
85c0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
85d0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
85e0: 20 20 20 7a 53 71 6c 20 3d 20 6d 61 6c 6c 6f 63     zSql = malloc
85f0: 28 20 6e 42 79 74 65 20 2b 20 35 30 20 2b 20 6e  ( nByte + 50 + n
8600: 43 6f 6c 2a 32 20 29 3b 0a 20 20 20 20 69 66 28  Col*2 );.    if(
8610: 20 7a 53 71 6c 3d 3d 30 20 29 20 7b 0a 20 20 20   zSql==0 ) {.   
8620: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
8630: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72  ult(interp, "Err
8640: 6f 72 3a 20 63 61 6e 27 74 20 6d 61 6c 6c 6f 63  or: can't malloc
8650: 28 29 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  ()", 0);.      r
8660: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8670: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
8680: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 79 74  e3_snprintf(nByt
8690: 65 2b 35 30 2c 20 7a 53 71 6c 2c 20 22 49 4e 53  e+50, zSql, "INS
86a0: 45 52 54 20 4f 52 20 25 71 20 49 4e 54 4f 20 27  ERT OR %q INTO '
86b0: 25 71 27 20 56 41 4c 55 45 53 28 3f 22 2c 0a 20  %q' VALUES(?",. 
86c0: 20 20 20 20 20 20 20 20 7a 43 6f 6e 66 6c 69 63          zConflic
86d0: 74 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20  t, zTable);.    
86e0: 6a 20 3d 20 73 74 72 6c 65 6e 28 7a 53 71 6c 29  j = strlen(zSql)
86f0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69  ;.    for(i=1; i
8700: 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
8710: 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27     zSql[j++] = '
8720: 2c 27 3b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a  ,';.      zSql[j
8730: 2b 2b 5d 20 3d 20 27 3f 27 3b 0a 20 20 20 20 7d  ++] = '?';.    }
8740: 0a 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d  .    zSql[j++] =
8750: 20 27 29 27 3b 0a 20 20 20 20 7a 53 71 6c 5b 6a   ')';.    zSql[j
8760: 5d 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  ] = 0;.    rc = 
8770: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28  sqlite3_prepare(
8780: 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 30  pDb->db, zSql, 0
8790: 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
87a0: 20 20 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20    free(zSql);.  
87b0: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
87c0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
87d0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f  lt(interp, "Erro
87e0: 72 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  r: ", sqlite3_er
87f0: 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 30  rmsg(pDb->db), 0
8800: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
8810: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
8820: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
8830: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
8840: 20 20 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a      in = fopen(z
8850: 46 69 6c 65 2c 20 22 72 62 22 29 3b 0a 20 20 20  File, "rb");.   
8860: 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20   if( in==0 ){.  
8870: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
8880: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72  sult(interp, "Er
8890: 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e  ror: cannot open
88a0: 20 66 69 6c 65 3a 20 22 2c 20 7a 46 69 6c 65 2c   file: ", zFile,
88b0: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71   NULL);.      sq
88c0: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
88d0: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74  Stmt);.      ret
88e0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
88f0: 20 20 20 7d 0a 20 20 20 20 61 7a 43 6f 6c 20 3d     }.    azCol =
8900: 20 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28   malloc( sizeof(
8910: 61 7a 43 6f 6c 5b 30 5d 29 2a 28 6e 43 6f 6c 2b  azCol[0])*(nCol+
8920: 31 29 20 29 3b 0a 20 20 20 20 69 66 28 20 61 7a  1) );.    if( az
8930: 43 6f 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20  Col==0 ) {.     
8940: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
8950: 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72  t(interp, "Error
8960: 3a 20 63 61 6e 27 74 20 6d 61 6c 6c 6f 63 28 29  : can't malloc()
8970: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74  ", 0);.      ret
8980: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
8990: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
89a0: 5f 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 22  _exec(pDb->db, "
89b0: 42 45 47 49 4e 22 2c 20 30 2c 20 30 2c 20 30 29  BEGIN", 0, 0, 0)
89c0: 3b 0a 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20  ;.    zCommit = 
89d0: 22 43 4f 4d 4d 49 54 22 3b 0a 20 20 20 20 77 68  "COMMIT";.    wh
89e0: 69 6c 65 28 20 28 7a 4c 69 6e 65 20 3d 20 6c 6f  ile( (zLine = lo
89f0: 63 61 6c 5f 67 65 74 6c 69 6e 65 28 30 2c 20 69  cal_getline(0, i
8a00: 6e 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  n))!=0 ){.      
8a10: 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 69  char *z;.      i
8a20: 20 3d 20 30 3b 0a 20 20 20 20 20 20 6c 69 6e 65   = 0;.      line
8a30: 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 61 7a 43 6f  no++;.      azCo
8a40: 6c 5b 30 5d 20 3d 20 7a 4c 69 6e 65 3b 0a 20 20  l[0] = zLine;.  
8a50: 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 7a 3d 7a      for(i=0, z=z
8a60: 4c 69 6e 65 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a  Line; *z; z++){.
8a70: 20 20 20 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d          if( *z==
8a80: 7a 53 65 70 5b 30 5d 20 26 26 20 73 74 72 6e 63  zSep[0] && strnc
8a90: 6d 70 28 7a 2c 20 7a 53 65 70 2c 20 6e 53 65 70  mp(z, zSep, nSep
8aa0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
8ab0: 20 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20    *z = 0;.      
8ac0: 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20      i++;.       
8ad0: 20 20 20 69 66 28 20 69 3c 6e 43 6f 6c 20 29 7b     if( i<nCol ){
8ae0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 43  .            azC
8af0: 6f 6c 5b 69 5d 20 3d 20 26 7a 5b 6e 53 65 70 5d  ol[i] = &z[nSep]
8b00: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20  ;.            z 
8b10: 2b 3d 20 6e 53 65 70 2d 31 3b 0a 20 20 20 20 20  += nSep-1;.     
8b20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
8b30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
8b40: 66 28 20 69 2b 31 21 3d 6e 43 6f 6c 20 29 7b 0a  f( i+1!=nCol ){.
8b50: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 45          char *zE
8b60: 72 72 3b 0a 20 20 20 20 20 20 20 20 7a 45 72 72  rr;.        zErr
8b70: 20 3d 20 6d 61 6c 6c 6f 63 28 32 30 30 20 2b 20   = malloc(200 + 
8b80: 73 74 72 6c 65 6e 28 7a 46 69 6c 65 29 29 3b 0a  strlen(zFile));.
8b90: 20 20 20 20 20 20 20 20 73 70 72 69 6e 74 66 28          sprintf(
8ba0: 7a 45 72 72 2c 22 45 72 72 6f 72 3a 20 25 73 20  zErr,"Error: %s 
8bb0: 6c 69 6e 65 20 25 64 3a 20 65 78 70 65 63 74 65  line %d: expecte
8bc0: 64 20 25 64 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  d %d columns of 
8bd0: 64 61 74 61 20 62 75 74 20 66 6f 75 6e 64 20 25  data but found %
8be0: 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 7a  d",.           z
8bf0: 46 69 6c 65 2c 20 6c 69 6e 65 6e 6f 2c 20 6e 43  File, lineno, nC
8c00: 6f 6c 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20  ol, i+1);.      
8c10: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
8c20: 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45 72 72 2c  lt(interp, zErr,
8c30: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 66 72 65   0);.        fre
8c40: 65 28 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 20  e(zErr);.       
8c50: 20 7a 43 6f 6d 6d 69 74 20 3d 20 22 52 4f 4c 4c   zCommit = "ROLL
8c60: 42 41 43 4b 22 3b 0a 20 20 20 20 20 20 20 20 62  BACK";.        b
8c70: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
8c80: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
8c90: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
8ca0: 20 20 20 2f 2a 20 63 68 65 63 6b 20 66 6f 72 20     /* check for 
8cb0: 6e 75 6c 6c 20 64 61 74 61 2c 20 69 66 20 73 6f  null data, if so
8cc0: 2c 20 62 69 6e 64 20 61 73 20 6e 75 6c 6c 20 2a  , bind as null *
8cd0: 2f 0a 20 20 20 20 20 20 20 20 69 66 20 28 28 6e  /.        if ((n
8ce0: 4e 75 6c 6c 3e 30 20 26 26 20 73 74 72 63 6d 70  Null>0 && strcmp
8cf0: 28 61 7a 43 6f 6c 5b 69 5d 2c 20 7a 4e 75 6c 6c  (azCol[i], zNull
8d00: 29 3d 3d 30 29 20 7c 7c 20 73 74 72 6c 65 6e 28  )==0) || strlen(
8d10: 61 7a 43 6f 6c 5b 69 5d 29 3d 3d 30 29 20 7b 0a  azCol[i])==0) {.
8d20: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
8d30: 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d  3_bind_null(pStm
8d40: 74 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20  t, i+1);.       
8d50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8d60: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74    sqlite3_bind_t
8d70: 65 78 74 28 70 53 74 6d 74 2c 20 69 2b 31 2c 20  ext(pStmt, i+1, 
8d80: 61 7a 43 6f 6c 5b 69 5d 2c 20 2d 31 2c 20 53 51  azCol[i], -1, SQ
8d90: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
8da0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
8db0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
8dc0: 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ep(pStmt);.     
8dd0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65   rc = sqlite3_re
8de0: 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  set(pStmt);.    
8df0: 20 20 66 72 65 65 28 7a 4c 69 6e 65 29 3b 0a 20    free(zLine);. 
8e00: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
8e10: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
8e20: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
8e30: 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72  lt(interp,"Error
8e40: 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  : ", sqlite3_err
8e50: 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 30 29  msg(pDb->db), 0)
8e60: 3b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6d 6d 69  ;.        zCommi
8e70: 74 20 3d 20 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a  t = "ROLLBACK";.
8e80: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
8e90: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
8ea0: 20 66 72 65 65 28 61 7a 43 6f 6c 29 3b 0a 20 20   free(azCol);.  
8eb0: 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20    fclose(in);.  
8ec0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
8ed0: 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 73  ze(pStmt);.    s
8ee0: 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d  qlite3_exec(pDb-
8ef0: 3e 64 62 2c 20 7a 43 6f 6d 6d 69 74 2c 20 30 2c  >db, zCommit, 0,
8f00: 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 69 66 28   0, 0);..    if(
8f10: 20 7a 43 6f 6d 6d 69 74 5b 30 5d 20 3d 3d 20 27   zCommit[0] == '
8f20: 43 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 73  C' ){.      /* s
8f30: 75 63 63 65 73 73 2c 20 73 65 74 20 72 65 73 75  uccess, set resu
8f40: 6c 74 20 61 73 20 6e 75 6d 62 65 72 20 6f 66 20  lt as number of 
8f50: 6c 69 6e 65 73 20 70 72 6f 63 65 73 73 65 64 20  lines processed 
8f60: 2a 2f 0a 20 20 20 20 20 20 70 52 65 73 75 6c 74  */.      pResult
8f70: 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73   = Tcl_GetObjRes
8f80: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  ult(interp);.   
8f90: 20 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f 62 6a     Tcl_SetIntObj
8fa0: 28 70 52 65 73 75 6c 74 2c 20 6c 69 6e 65 6e 6f  (pResult, lineno
8fb0: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43  );.      rc = TC
8fc0: 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  L_OK;.    }else{
8fd0: 0a 20 20 20 20 20 20 2f 2a 20 66 61 69 6c 75 72  .      /* failur
8fe0: 65 2c 20 61 70 70 65 6e 64 20 6c 69 6e 65 6e 6f  e, append lineno
8ff0: 20 77 68 65 72 65 20 66 61 69 6c 65 64 20 2a 2f   where failed */
9000: 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a  .      sprintf(z
9010: 4c 69 6e 65 4e 75 6d 2c 22 25 64 22 2c 6c 69 6e  LineNum,"%d",lin
9020: 65 6e 6f 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f  eno);.      Tcl_
9030: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
9040: 65 72 70 2c 22 2c 20 66 61 69 6c 65 64 20 77 68  erp,", failed wh
9050: 69 6c 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6c  ile processing l
9060: 69 6e 65 3a 20 22 2c 7a 4c 69 6e 65 4e 75 6d 2c  ine: ",zLineNum,
9070: 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54  0);.      rc = T
9080: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
9090: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
90a0: 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62    /*.  **    $db
90b0: 20 65 72 72 6f 72 63 6f 64 65 0a 20 20 2a 2a 0a   errorcode.  **.
90c0: 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20    ** Return the 
90d0: 6e 75 6d 65 72 69 63 20 65 72 72 6f 72 20 63 6f  numeric error co
90e0: 64 65 20 74 68 61 74 20 77 61 73 20 72 65 74 75  de that was retu
90f0: 72 6e 65 64 20 62 79 20 74 68 65 20 6d 6f 73 74  rned by the most
9100: 20 72 65 63 65 6e 74 0a 20 20 2a 2a 20 63 61 6c   recent.  ** cal
9110: 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 78 65  l to sqlite3_exe
9120: 63 28 29 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  c()..  */.  case
9130: 20 44 42 5f 45 52 52 4f 52 43 4f 44 45 3a 20 7b   DB_ERRORCODE: {
9140: 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
9150: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
9160: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69  l_NewIntObj(sqli
9170: 74 65 33 5f 65 72 72 63 6f 64 65 28 70 44 62 2d  te3_errcode(pDb-
9180: 3e 64 62 29 29 29 3b 0a 20 20 20 20 62 72 65 61  >db)));.    brea
9190: 6b 3b 0a 20 20 7d 0a 20 20 20 0a 20 20 2f 2a 0a  k;.  }.   .  /*.
91a0: 20 20 2a 2a 20 20 20 20 24 64 62 20 65 76 61 6c    **    $db eval
91b0: 20 24 73 71 6c 20 3f 61 72 72 61 79 3f 20 3f 7b   $sql ?array? ?{
91c0: 20 20 2e 2e 2e 63 6f 64 65 2e 2e 2e 20 7d 3f 0a    ...code... }?.
91d0: 20 20 2a 2a 20 20 20 20 24 64 62 20 6f 6e 65 63    **    $db onec
91e0: 6f 6c 75 6d 6e 20 24 73 71 6c 0a 20 20 2a 2a 0a  olumn $sql.  **.
91f0: 20 20 2a 2a 20 54 68 65 20 53 51 4c 20 73 74 61    ** The SQL sta
9200: 74 65 6d 65 6e 74 20 69 6e 20 24 73 71 6c 20 69  tement in $sql i
9210: 73 20 65 76 61 6c 75 61 74 65 64 2e 20 20 46 6f  s evaluated.  Fo
9220: 72 20 65 61 63 68 20 72 6f 77 2c 20 74 68 65 20  r each row, the 
9230: 76 61 6c 75 65 73 20 61 72 65 0a 20 20 2a 2a 20  values are.  ** 
9240: 70 6c 61 63 65 64 20 69 6e 20 65 6c 65 6d 65 6e  placed in elemen
9250: 74 73 20 6f 66 20 74 68 65 20 61 72 72 61 79 20  ts of the array 
9260: 6e 61 6d 65 64 20 22 61 72 72 61 79 22 20 61 6e  named "array" an
9270: 64 20 2e 2e 2e 63 6f 64 65 2e 2e 2e 20 69 73 20  d ...code... is 
9280: 65 78 65 63 75 74 65 64 2e 0a 20 20 2a 2a 20 49  executed..  ** I
9290: 66 20 22 61 72 72 61 79 22 20 61 6e 64 20 22 63  f "array" and "c
92a0: 6f 64 65 22 20 61 72 65 20 6f 6d 69 74 74 65 64  ode" are omitted
92b0: 2c 20 74 68 65 6e 20 6e 6f 20 63 61 6c 6c 62 61  , then no callba
92c0: 63 6b 20 69 73 20 65 76 65 72 79 20 69 6e 76 6f  ck is every invo
92d0: 6b 65 64 2e 0a 20 20 2a 2a 20 49 66 20 22 61 72  ked..  ** If "ar
92e0: 72 61 79 22 20 69 73 20 61 6e 20 65 6d 70 74 79  ray" is an empty
92f0: 20 73 74 72 69 6e 67 2c 20 74 68 65 6e 20 74 68   string, then th
9300: 65 20 76 61 6c 75 65 73 20 61 72 65 20 70 6c 61  e values are pla
9310: 63 65 64 20 69 6e 20 76 61 72 69 61 62 6c 65 73  ced in variables
9320: 0a 20 20 2a 2a 20 74 68 61 74 20 68 61 76 65 20  .  ** that have 
9330: 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73  the same name as
9340: 20 74 68 65 20 66 69 65 6c 64 73 20 65 78 74 72   the fields extr
9350: 61 63 74 65 64 20 62 79 20 74 68 65 20 71 75 65  acted by the que
9360: 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ry..  **.  ** Th
9370: 65 20 6f 6e 65 63 6f 6c 75 6d 6e 20 6d 65 74 68  e onecolumn meth
9380: 6f 64 20 69 73 20 74 68 65 20 65 71 75 69 76 61  od is the equiva
9390: 6c 65 6e 74 20 6f 66 3a 0a 20 20 2a 2a 20 20 20  lent of:.  **   
93a0: 20 20 6c 69 6e 64 65 78 20 5b 24 64 62 20 65 76    lindex [$db ev
93b0: 61 6c 20 24 73 71 6c 5d 20 30 0a 20 20 2a 2f 0a  al $sql] 0.  */.
93c0: 20 20 63 61 73 65 20 44 42 5f 4f 4e 45 43 4f 4c    case DB_ONECOL
93d0: 55 4d 4e 3a 0a 20 20 63 61 73 65 20 44 42 5f 45  UMN:.  case DB_E
93e0: 56 41 4c 3a 0a 20 20 63 61 73 65 20 44 42 5f 45  VAL:.  case DB_E
93f0: 58 49 53 54 53 3a 20 7b 0a 20 20 20 20 63 68 61  XISTS: {.    cha
9400: 72 20 63 6f 6e 73 74 20 2a 7a 53 71 6c 3b 20 20  r const *zSql;  
9410: 20 20 20 20 2f 2a 20 4e 65 78 74 20 53 51 4c 20      /* Next SQL 
9420: 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 78 65  statement to exe
9430: 63 75 74 65 20 2a 2f 0a 20 20 20 20 63 68 61 72  cute */.    char
9440: 20 63 6f 6e 73 74 20 2a 7a 4c 65 66 74 3b 20 20   const *zLeft;  
9450: 20 20 20 2f 2a 20 57 68 61 74 20 69 73 20 6c 65     /* What is le
9460: 66 74 20 61 66 74 65 72 20 66 69 72 73 74 20 73  ft after first s
9470: 74 6d 74 20 69 6e 20 7a 53 71 6c 20 2a 2f 0a 20  tmt in zSql */. 
9480: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
9490: 2a 70 53 74 6d 74 3b 20 20 20 2f 2a 20 43 6f 6d  *pStmt;   /* Com
94a0: 70 69 6c 65 64 20 53 51 4c 20 73 74 61 74 6d 65  piled SQL statme
94b0: 6e 74 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62  nt */.    Tcl_Ob
94c0: 6a 20 2a 70 41 72 72 61 79 3b 20 20 20 20 20 20  j *pArray;      
94d0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 72 72 61   /* Name of arra
94e0: 79 20 69 6e 74 6f 20 77 68 69 63 68 20 72 65 73  y into which res
94f0: 75 6c 74 73 20 61 72 65 20 77 72 69 74 74 65 6e  ults are written
9500: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20   */.    Tcl_Obj 
9510: 2a 70 53 63 72 69 70 74 3b 20 20 20 20 20 20 2f  *pScript;      /
9520: 2a 20 53 63 72 69 70 74 20 74 6f 20 72 75 6e 20  * Script to run 
9530: 66 6f 72 20 65 61 63 68 20 72 65 73 75 6c 74 20  for each result 
9540: 73 65 74 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f  set */.    Tcl_O
9550: 62 6a 20 2a 2a 61 70 50 61 72 6d 3b 20 20 20 20  bj **apParm;    
9560: 20 20 2f 2a 20 50 61 72 61 6d 65 74 65 72 73 20    /* Parameters 
9570: 74 68 61 74 20 6e 65 65 64 20 61 20 54 63 6c 5f  that need a Tcl_
9580: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 29 20 2a  DecrRefCount() *
9590: 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 72 6d 3b  /.    int nParm;
95a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
95b0: 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  Number of entrie
95c0: 73 20 75 73 65 64 20 69 6e 20 61 70 50 61 72 6d  s used in apParm
95d0: 5b 5d 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62  [] */.    Tcl_Ob
95e0: 6a 20 2a 61 50 61 72 6d 5b 31 30 5d 3b 20 20 20  j *aParm[10];   
95f0: 20 2f 2a 20 53 74 61 74 69 63 20 73 70 61 63 65   /* Static space
9600: 20 66 6f 72 20 61 70 50 61 72 6d 5b 5d 20 69 6e   for apParm[] in
9610: 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
9620: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20   */.    Tcl_Obj 
9630: 2a 70 52 65 74 3b 20 20 20 20 20 20 20 20 20 2f  *pRet;         /
9640: 2a 20 56 61 6c 75 65 20 74 6f 20 62 65 20 72 65  * Value to be re
9650: 74 75 72 6e 65 64 20 2a 2f 0a 20 20 20 20 53 71  turned */.    Sq
9660: 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70  lPreparedStmt *p
9670: 50 72 65 53 74 6d 74 3b 20 20 2f 2a 20 50 6f 69  PreStmt;  /* Poi
9680: 6e 74 65 72 20 74 6f 20 61 20 70 72 65 70 61 72  nter to a prepar
9690: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  ed statement */.
96a0: 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20      int rc2;..  
96b0: 20 20 69 66 28 20 63 68 6f 69 63 65 3d 3d 44 42    if( choice==DB
96c0: 5f 45 56 41 4c 20 29 7b 0a 20 20 20 20 20 20 69  _EVAL ){.      i
96d0: 66 28 20 6f 62 6a 63 3c 33 20 7c 7c 20 6f 62 6a  f( objc<3 || obj
96e0: 63 3e 35 20 29 7b 0a 20 20 20 20 20 20 20 20 54  c>5 ){.        T
96f0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
9700: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
9710: 20 22 53 51 4c 20 3f 41 52 52 41 59 2d 4e 41 4d   "SQL ?ARRAY-NAM
9720: 45 3f 20 3f 53 43 52 49 50 54 3f 22 29 3b 0a 20  E? ?SCRIPT?");. 
9730: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
9740: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  L_ERROR;.      }
9750: 0a 20 20 20 20 20 20 70 52 65 74 20 3d 20 54 63  .      pRet = Tc
9760: 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20  l_NewObj();.    
9770: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
9780: 6e 74 28 70 52 65 74 29 3b 0a 20 20 20 20 7d 65  nt(pRet);.    }e
9790: 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 6f  lse{.      if( o
97a0: 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc!=3 ){.      
97b0: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
97c0: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
97d0: 6a 76 2c 20 22 53 51 4c 22 29 3b 0a 20 20 20 20  jv, "SQL");.    
97e0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
97f0: 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
9800: 20 20 20 20 69 66 28 20 63 68 6f 69 63 65 3d 3d      if( choice==
9810: 44 42 5f 45 58 49 53 54 53 20 29 7b 0a 20 20 20  DB_EXISTS ){.   
9820: 20 20 20 20 20 70 52 65 74 20 3d 20 54 63 6c 5f       pRet = Tcl_
9830: 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 30 29  NewBooleanObj(0)
9840: 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e  ;.        Tcl_In
9850: 63 72 52 65 66 43 6f 75 6e 74 28 70 52 65 74 29  crRefCount(pRet)
9860: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
9870: 20 20 20 20 20 20 20 70 52 65 74 20 3d 20 30 3b         pRet = 0;
9880: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9890: 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29     if( objc==3 )
98a0: 7b 0a 20 20 20 20 20 20 70 41 72 72 61 79 20 3d  {.      pArray =
98b0: 20 70 53 63 72 69 70 74 20 3d 20 30 3b 0a 20 20   pScript = 0;.  
98c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63    }else if( objc
98d0: 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 70 41 72  ==4 ){.      pAr
98e0: 72 61 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ray = 0;.      p
98f0: 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 33 5d  Script = objv[3]
9900: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
9910: 20 20 20 70 41 72 72 61 79 20 3d 20 6f 62 6a 76     pArray = objv
9920: 5b 33 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 54  [3];.      if( T
9930: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 70 41 72  cl_GetString(pAr
9940: 72 61 79 29 5b 30 5d 3d 3d 30 20 29 20 70 41 72  ray)[0]==0 ) pAr
9950: 72 61 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ray = 0;.      p
9960: 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 34 5d  Script = objv[4]
9970: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c  ;.    }..    Tcl
9980: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 6f 62  _IncrRefCount(ob
9990: 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 7a 53 71 6c  jv[2]);.    zSql
99a0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
99b0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
99c0: 20 30 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20   0);.    while( 
99d0: 72 63 3d 3d 54 43 4c 5f 4f 4b 20 26 26 20 7a 53  rc==TCL_OK && zS
99e0: 71 6c 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 69  ql[0] ){.      i
99f0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
9a00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
9a10: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
9a20: 20 20 20 69 6e 74 20 6e 56 61 72 3b 20 20 20 20     int nVar;    
9a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9a40: 20 4e 75 6d 62 65 72 20 6f 66 20 62 69 6e 64 20   Number of bind 
9a50: 70 61 72 61 6d 65 74 65 72 73 20 69 6e 20 74 68  parameters in th
9a60: 65 20 70 53 74 6d 74 20 2a 2f 0a 20 20 20 20 20  e pStmt */.     
9a70: 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20   int nCol;      
9a80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
9a90: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
9aa0: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
9ab0: 65 74 20 2a 2f 0a 20 20 20 20 20 20 54 63 6c 5f  et */.      Tcl_
9ac0: 4f 62 6a 20 2a 2a 61 70 43 6f 6c 4e 61 6d 65 20  Obj **apColName 
9ad0: 3d 20 30 3b 20 20 20 2f 2a 20 41 72 72 61 79 20  = 0;   /* Array 
9ae0: 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  of column names 
9af0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  */.      int len
9b00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9b10: 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 6c 65      /* String le
9b20: 6e 67 74 68 20 6f 66 20 7a 53 71 6c 20 2a 2f 0a  ngth of zSql */.
9b30: 20 20 0a 20 20 20 20 20 20 2f 2a 20 54 72 79 20    .      /* Try 
9b40: 74 6f 20 66 69 6e 64 20 61 20 53 51 4c 20 73 74  to find a SQL st
9b50: 61 74 65 6d 65 6e 74 20 74 68 61 74 20 68 61 73  atement that has
9b60: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f   already been co
9b70: 6d 70 69 6c 65 64 20 61 6e 64 0a 20 20 20 20 20  mpiled and.     
9b80: 20 2a 2a 20 77 68 69 63 68 20 6d 61 74 63 68 65   ** which matche
9b90: 73 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65  s the next seque
9ba0: 6e 63 65 20 6f 66 20 53 51 4c 2e 0a 20 20 20 20  nce of SQL..    
9bb0: 20 20 2a 2f 0a 20 20 20 20 20 20 70 53 74 6d 74    */.      pStmt
9bc0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 72 65   = 0;.      pPre
9bd0: 53 74 6d 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74  Stmt = pDb->stmt
9be0: 4c 69 73 74 3b 0a 20 20 20 20 20 20 6c 65 6e 20  List;.      len 
9bf0: 3d 20 73 74 72 6c 65 6e 28 7a 53 71 6c 29 3b 0a  = strlen(zSql);.
9c00: 20 20 20 20 20 20 69 66 28 20 70 50 72 65 53 74        if( pPreSt
9c10: 6d 74 20 26 26 20 73 71 6c 69 74 65 33 5f 65 78  mt && sqlite3_ex
9c20: 70 69 72 65 64 28 70 50 72 65 53 74 6d 74 2d 3e  pired(pPreStmt->
9c30: 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20  pStmt) ){.      
9c40: 20 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65    flushStmtCache
9c50: 28 70 44 62 29 3b 0a 20 20 20 20 20 20 20 20 70  (pDb);.        p
9c60: 50 72 65 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  PreStmt = 0;.   
9c70: 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 3b     }.      for(;
9c80: 20 70 50 72 65 53 74 6d 74 3b 20 70 50 72 65 53   pPreStmt; pPreS
9c90: 74 6d 74 3d 70 50 72 65 53 74 6d 74 2d 3e 70 4e  tmt=pPreStmt->pN
9ca0: 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ext){.        in
9cb0: 74 20 6e 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e  t n = pPreStmt->
9cc0: 6e 53 71 6c 3b 0a 20 20 20 20 20 20 20 20 69 66  nSql;.        if
9cd0: 28 20 6c 65 6e 3e 3d 6e 20 0a 20 20 20 20 20 20  ( len>=n .      
9ce0: 20 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28        && memcmp(
9cf0: 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 2c 20  pPreStmt->zSql, 
9d00: 7a 53 71 6c 2c 20 6e 29 3d 3d 30 0a 20 20 20 20  zSql, n)==0.    
9d10: 20 20 20 20 20 20 20 20 26 26 20 28 7a 53 71 6c          && (zSql
9d20: 5b 6e 5d 3d 3d 30 20 7c 7c 20 7a 53 71 6c 5b 6e  [n]==0 || zSql[n
9d30: 2d 31 5d 3d 3d 27 3b 27 29 0a 20 20 20 20 20 20  -1]==';').      
9d40: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70    ){.          p
9d50: 53 74 6d 74 20 3d 20 70 50 72 65 53 74 6d 74 2d  Stmt = pPreStmt-
9d60: 3e 70 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20  >pStmt;.        
9d70: 20 20 7a 4c 65 66 74 20 3d 20 26 7a 53 71 6c 5b    zLeft = &zSql[
9d80: 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 5d 3b  pPreStmt->nSql];
9d90: 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  ..          /* W
9da0: 68 65 6e 20 61 20 70 72 65 70 61 72 65 64 20 73  hen a prepared s
9db0: 74 61 74 65 6d 65 6e 74 20 69 73 20 66 6f 75 6e  tatement is foun
9dc0: 64 2c 20 75 6e 6c 69 6e 6b 20 69 74 20 66 72 6f  d, unlink it fro
9dd0: 6d 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  m the.          
9de0: 2a 2a 20 63 61 63 68 65 20 6c 69 73 74 2e 20 20  ** cache list.  
9df0: 49 74 20 77 69 6c 6c 20 6c 61 74 65 72 20 62 65  It will later be
9e00: 20 61 64 64 65 64 20 62 61 63 6b 20 74 6f 20 74   added back to t
9e10: 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20  he beginning.   
9e20: 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65         ** of the
9e30: 20 63 61 63 68 65 20 6c 69 73 74 20 69 6e 20 6f   cache list in o
9e40: 72 64 65 72 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  rder to implemen
9e50: 74 20 4c 52 55 20 72 65 70 6c 61 63 65 6d 65 6e  t LRU replacemen
9e60: 74 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  t..          */.
9e70: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50            if( pP
9e80: 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 20 29 7b  reStmt->pPrev ){
9e90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50 72  .            pPr
9ea0: 65 53 74 6d 74 2d 3e 70 50 72 65 76 2d 3e 70 4e  eStmt->pPrev->pN
9eb0: 65 78 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e  ext = pPreStmt->
9ec0: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  pNext;.         
9ed0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
9ee0: 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73      pDb->stmtLis
9ef0: 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e  t = pPreStmt->pN
9f00: 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ext;.          }
9f10: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
9f20: 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 20 29  PreStmt->pNext )
9f30: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50  {.            pP
9f40: 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 2d 3e 70  reStmt->pNext->p
9f50: 50 72 65 76 20 3d 20 70 50 72 65 53 74 6d 74 2d  Prev = pPreStmt-
9f60: 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20 20 20  >pPrev;.        
9f70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
9f80: 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61       pDb->stmtLa
9f90: 73 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70  st = pPreStmt->p
9fa0: 50 72 65 76 3b 0a 20 20 20 20 20 20 20 20 20 20  Prev;.          
9fb0: 7d 0a 20 20 20 20 20 20 20 20 20 20 70 44 62 2d  }.          pDb-
9fc0: 3e 6e 53 74 6d 74 2d 2d 3b 0a 20 20 20 20 20 20  >nStmt--;.      
9fd0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
9fe0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 0a     }.      }.  .
9ff0: 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 70        /* If no p
a000: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
a010: 74 20 77 61 73 20 66 6f 75 6e 64 2e 20 20 43 6f  t was found.  Co
a020: 6d 70 69 6c 65 20 74 68 65 20 53 51 4c 20 74 65  mpile the SQL te
a030: 78 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  xt.      */.    
a040: 20 20 69 66 28 20 70 53 74 6d 74 3d 3d 30 20 29    if( pStmt==0 )
a050: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 53 51  {.        if( SQ
a060: 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
a070: 5f 70 72 65 70 61 72 65 28 70 44 62 2d 3e 64 62  _prepare(pDb->db
a080: 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
a090: 6d 74 2c 20 26 7a 4c 65 66 74 29 20 29 7b 0a 20  mt, &zLeft) ){. 
a0a0: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74           Tcl_Set
a0b0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
a0c0: 2c 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 73 71  , dbTextToObj(sq
a0d0: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62  lite3_errmsg(pDb
a0e0: 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20 20 20 20  ->db)));.       
a0f0: 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f     rc = TCL_ERRO
a100: 52 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  R;.          bre
a110: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
a120: 20 20 20 20 20 20 69 66 28 20 70 53 74 6d 74 3d        if( pStmt=
a130: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
a140: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
a150: 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 70  qlite3_errcode(p
a160: 44 62 2d 3e 64 62 29 20 29 7b 0a 20 20 20 20 20  Db->db) ){.     
a170: 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 6d 70         /* A comp
a180: 69 6c 65 2d 74 69 6d 65 20 65 72 72 6f 72 20 69  ile-time error i
a190: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a  n the statement.
a1a0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
a1b0: 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 53             Tcl_S
a1c0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
a1d0: 72 70 2c 20 64 62 54 65 78 74 54 6f 4f 62 6a 28  rp, dbTextToObj(
a1e0: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
a1f0: 44 62 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20 20  Db->db)));.     
a200: 20 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f         rc = TCL_
a210: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20  ERROR;.         
a220: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
a230: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a240: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 74         /* The st
a250: 61 74 65 6d 65 6e 74 20 77 61 73 20 61 20 6e 6f  atement was a no
a260: 2d 6f 70 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74  -op.  Continue t
a270: 6f 20 74 68 65 20 6e 65 78 74 20 73 74 61 74 65  o the next state
a280: 6d 65 6e 74 0a 20 20 20 20 20 20 20 20 20 20 20  ment.           
a290: 20 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c 20 73   ** in the SQL s
a2a0: 74 72 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 20  tring..         
a2b0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
a2c0: 20 20 7a 53 71 6c 20 3d 20 7a 4c 65 66 74 3b 0a    zSql = zLeft;.
a2d0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
a2e0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
a2f0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
a300: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 65      assert( pPre
a310: 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Stmt==0 );.     
a320: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 42 69 6e   }..      /* Bin
a330: 64 20 76 61 6c 75 65 73 20 74 6f 20 70 61 72 61  d values to para
a340: 6d 65 74 65 72 73 20 74 68 61 74 20 62 65 67 69  meters that begi
a350: 6e 20 77 69 74 68 20 24 20 6f 72 20 3a 0a 20 20  n with $ or :.  
a360: 20 20 20 20 2a 2f 20 20 0a 20 20 20 20 20 20 6e      */  .      n
a370: 56 61 72 20 3d 20 73 71 6c 69 74 65 33 5f 62 69  Var = sqlite3_bi
a380: 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75  nd_parameter_cou
a390: 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  nt(pStmt);.     
a3a0: 20 6e 50 61 72 6d 20 3d 20 30 3b 0a 20 20 20 20   nParm = 0;.    
a3b0: 20 20 69 66 28 20 6e 56 61 72 3e 73 69 7a 65 6f    if( nVar>sizeo
a3c0: 66 28 61 50 61 72 6d 29 2f 73 69 7a 65 6f 66 28  f(aParm)/sizeof(
a3d0: 61 50 61 72 6d 5b 30 5d 29 20 29 7b 0a 20 20 20  aParm[0]) ){.   
a3e0: 20 20 20 20 20 61 70 50 61 72 6d 20 3d 20 28 54       apParm = (T
a3f0: 63 6c 5f 4f 62 6a 2a 2a 29 54 63 6c 5f 41 6c 6c  cl_Obj**)Tcl_All
a400: 6f 63 28 6e 56 61 72 2a 73 69 7a 65 6f 66 28 61  oc(nVar*sizeof(a
a410: 70 50 61 72 6d 5b 30 5d 29 29 3b 0a 20 20 20 20  pParm[0]));.    
a420: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a430: 20 61 70 50 61 72 6d 20 3d 20 61 50 61 72 6d 3b   apParm = aParm;
a440: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
a450: 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 56 61 72 3b  or(i=1; i<=nVar;
a460: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   i++){.        c
a470: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 72 20  onst char *zVar 
a480: 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70  = sqlite3_bind_p
a490: 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 70 53  arameter_name(pS
a4a0: 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  tmt, i);.       
a4b0: 20 69 66 28 20 7a 56 61 72 21 3d 30 20 26 26 20   if( zVar!=0 && 
a4c0: 28 7a 56 61 72 5b 30 5d 3d 3d 27 24 27 20 7c 7c  (zVar[0]=='$' ||
a4d0: 20 7a 56 61 72 5b 30 5d 3d 3d 27 3a 27 29 20 29   zVar[0]==':') )
a4e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  {.          Tcl_
a4f0: 4f 62 6a 20 2a 70 56 61 72 20 3d 20 54 63 6c 5f  Obj *pVar = Tcl_
a500: 47 65 74 56 61 72 32 45 78 28 69 6e 74 65 72 70  GetVar2Ex(interp
a510: 2c 20 26 7a 56 61 72 5b 31 5d 2c 20 30 2c 20 30  , &zVar[1], 0, 0
a520: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
a530: 20 70 56 61 72 20 29 7b 0a 20 20 20 20 20 20 20   pVar ){.       
a540: 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20       int n;.    
a550: 20 20 20 20 20 20 20 20 75 38 20 2a 64 61 74 61          u8 *data
a560: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  ;.            ch
a570: 61 72 20 2a 7a 54 79 70 65 20 3d 20 70 56 61 72  ar *zType = pVar
a580: 2d 3e 74 79 70 65 50 74 72 20 3f 20 70 56 61 72  ->typePtr ? pVar
a590: 2d 3e 74 79 70 65 50 74 72 2d 3e 6e 61 6d 65 20  ->typePtr->name 
a5a0: 3a 20 22 22 3b 0a 20 20 20 20 20 20 20 20 20 20  : "";.          
a5b0: 20 20 63 68 61 72 20 63 20 3d 20 7a 54 79 70 65    char c = zType
a5c0: 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  [0];.           
a5d0: 20 69 66 28 20 63 3d 3d 27 62 27 20 26 26 20 73   if( c=='b' && s
a5e0: 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 62 79 74  trcmp(zType,"byt
a5f0: 65 61 72 72 61 79 22 29 3d 3d 30 20 26 26 20 70  earray")==0 && p
a600: 56 61 72 2d 3e 62 79 74 65 73 3d 3d 30 20 29 7b  Var->bytes==0 ){
a610: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  .              /
a620: 2a 20 4f 6e 6c 79 20 6c 6f 61 64 20 61 20 42 4c  * Only load a BL
a630: 4f 42 20 74 79 70 65 20 69 66 20 74 68 65 20 54  OB type if the T
a640: 63 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 61  cl variable is a
a650: 20 62 79 74 65 61 72 72 61 79 20 61 6e 64 0a 20   bytearray and. 
a660: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
a670: 68 61 73 20 6e 6f 20 73 74 72 69 6e 67 20 72 65  has no string re
a680: 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20 2a 2f  presentation. */
a690: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  .              d
a6a0: 61 74 61 20 3d 20 54 63 6c 5f 47 65 74 42 79 74  ata = Tcl_GetByt
a6b0: 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 70 56  eArrayFromObj(pV
a6c0: 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20  ar, &n);.       
a6d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
a6e0: 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20  ind_blob(pStmt, 
a6f0: 69 2c 20 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49  i, data, n, SQLI
a700: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
a710: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e            Tcl_In
a720: 63 72 52 65 66 43 6f 75 6e 74 28 70 56 61 72 29  crRefCount(pVar)
a730: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
a740: 61 70 50 61 72 6d 5b 6e 50 61 72 6d 2b 2b 5d 20  apParm[nParm++] 
a750: 3d 20 70 56 61 72 3b 0a 20 20 20 20 20 20 20 20  = pVar;.        
a760: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 63      }else if( (c
a770: 3d 3d 27 62 27 20 26 26 20 73 74 72 63 6d 70 28  =='b' && strcmp(
a780: 7a 54 79 70 65 2c 22 62 6f 6f 6c 65 61 6e 22 29  zType,"boolean")
a790: 3d 3d 30 29 20 7c 7c 0a 20 20 20 20 20 20 20 20  ==0) ||.        
a7a0: 20 20 20 20 20 20 20 20 20 20 28 63 3d 3d 27 69            (c=='i
a7b0: 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70  ' && strcmp(zTyp
a7c0: 65 2c 22 69 6e 74 22 29 3d 3d 30 29 20 29 7b 0a  e,"int")==0) ){.
a7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63                Tc
a7e0: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
a7f0: 69 6e 74 65 72 70 2c 20 70 56 61 72 2c 20 26 6e  interp, pVar, &n
a800: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
a810: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
a820: 74 28 70 53 74 6d 74 2c 20 69 2c 20 6e 29 3b 0a  t(pStmt, i, n);.
a830: 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
a840: 65 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20  e if( c=='d' && 
a850: 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 64 6f  strcmp(zType,"do
a860: 75 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  uble")==0 ){.   
a870: 20 20 20 20 20 20 20 20 20 20 20 64 6f 75 62 6c             doubl
a880: 65 20 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  e r;.           
a890: 20 20 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65     Tcl_GetDouble
a8a0: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
a8b0: 70 56 61 72 2c 20 26 72 29 3b 0a 20 20 20 20 20  pVar, &r);.     
a8c0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
a8d0: 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28 70 53 74  _bind_double(pSt
a8e0: 6d 74 2c 20 69 2c 20 72 29 3b 0a 20 20 20 20 20  mt, i, r);.     
a8f0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
a900: 20 63 3d 3d 27 77 27 20 26 26 20 73 74 72 63 6d   c=='w' && strcm
a910: 70 28 7a 54 79 70 65 2c 22 77 69 64 65 49 6e 74  p(zType,"wideInt
a920: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
a930: 20 20 20 20 20 20 20 54 63 6c 5f 57 69 64 65 49         Tcl_WideI
a940: 6e 74 20 76 3b 0a 20 20 20 20 20 20 20 20 20 20  nt v;.          
a950: 20 20 20 20 54 63 6c 5f 47 65 74 57 69 64 65 49      Tcl_GetWideI
a960: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
a970: 2c 20 70 56 61 72 2c 20 26 76 29 3b 0a 20 20 20  , pVar, &v);.   
a980: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
a990: 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53  e3_bind_int64(pS
a9a0: 74 6d 74 2c 20 69 2c 20 76 29 3b 0a 20 20 20 20  tmt, i, v);.    
a9b0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
a9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
a9d0: 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  a = (unsigned ch
a9e0: 61 72 20 2a 29 54 63 6c 5f 47 65 74 53 74 72 69  ar *)Tcl_GetStri
a9f0: 6e 67 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20  ngFromObj(pVar, 
aa00: 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  &n);.           
aa10: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
aa20: 74 65 78 74 28 70 53 74 6d 74 2c 20 69 2c 20 28  text(pStmt, i, (
aa30: 63 68 61 72 20 2a 29 64 61 74 61 2c 20 6e 2c 20  char *)data, n, 
aa40: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
aa50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63                Tc
aa60: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
aa70: 56 61 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Var);.          
aa80: 20 20 20 20 61 70 50 61 72 6d 5b 6e 50 61 72 6d      apParm[nParm
aa90: 2b 2b 5d 20 3d 20 70 56 61 72 3b 0a 20 20 20 20  ++] = pVar;.    
aaa0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
aab0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
aac0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
aad0: 69 6e 64 5f 6e 75 6c 6c 28 20 70 53 74 6d 74 2c  ind_null( pStmt,
aae0: 20 69 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20   i );.          
aaf0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
ab00: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f    }..      /* Co
ab10: 6d 70 75 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  mpute column nam
ab20: 65 73 20 2a 2f 0a 20 20 20 20 20 20 6e 43 6f 6c  es */.      nCol
ab30: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
ab40: 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a  n_count(pStmt);.
ab50: 20 20 20 20 20 20 69 66 28 20 70 53 63 72 69 70        if( pScrip
ab60: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70 43  t ){.        apC
ab70: 6f 6c 4e 61 6d 65 20 3d 20 28 54 63 6c 5f 4f 62  olName = (Tcl_Ob
ab80: 6a 2a 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73  j**)Tcl_Alloc( s
ab90: 69 7a 65 6f 66 28 54 63 6c 5f 4f 62 6a 2a 29 2a  izeof(Tcl_Obj*)*
aba0: 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 20 20  nCol );.        
abb0: 69 66 28 20 61 70 43 6f 6c 4e 61 6d 65 3d 3d 30  if( apColName==0
abc0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
abd0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
abe0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
abf0: 20 20 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 20     apColName[i] 
ac00: 3d 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 73 71  = dbTextToObj(sq
ac10: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d  lite3_column_nam
ac20: 65 28 70 53 74 6d 74 2c 69 29 29 3b 0a 20 20 20  e(pStmt,i));.   
ac30: 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52         Tcl_IncrR
ac40: 65 66 43 6f 75 6e 74 28 61 70 43 6f 6c 4e 61 6d  efCount(apColNam
ac50: 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  e[i]);.        }
ac60: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
ac70: 2f 2a 20 49 66 20 72 65 73 75 6c 74 73 20 61 72  /* If results ar
ac80: 65 20 62 65 69 6e 67 20 73 74 6f 72 65 64 20 69  e being stored i
ac90: 6e 20 61 6e 20 61 72 72 61 79 20 76 61 72 69 61  n an array varia
aca0: 62 6c 65 2c 20 74 68 65 6e 20 63 72 65 61 74 65  ble, then create
acb0: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 61 72  .      ** the ar
acc0: 72 61 79 28 2a 29 20 65 6e 74 72 79 20 66 6f 72  ray(*) entry for
acd0: 20 74 68 61 74 20 61 72 72 61 79 0a 20 20 20 20   that array.    
ace0: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
acf0: 41 72 72 61 79 20 29 7b 0a 20 20 20 20 20 20 20  Array ){.       
ad00: 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6f 6c 4c 69   Tcl_Obj *pColLi
ad10: 73 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28  st = Tcl_NewObj(
ad20: 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4f  );.        Tcl_O
ad30: 62 6a 20 2a 70 53 74 61 72 20 3d 20 54 63 6c 5f  bj *pStar = Tcl_
ad40: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 2a 22  NewStringObj("*"
ad50: 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 54  , -1);.        T
ad60: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
ad70: 70 43 6f 6c 4c 69 73 74 29 3b 0a 20 20 20 20 20  pColList);.     
ad80: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
ad90: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
ada0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
adb0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
adc0: 65 72 70 2c 20 70 43 6f 6c 4c 69 73 74 2c 20 61  erp, pColList, a
add0: 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20  pColName[i]);.  
ade0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
adf0: 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69  Tcl_ObjSetVar2(i
ae00: 6e 74 65 72 70 2c 20 70 41 72 72 61 79 2c 20 70  nterp, pArray, p
ae10: 53 74 61 72 2c 20 70 43 6f 6c 4c 69 73 74 2c 30  Star, pColList,0
ae20: 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 44  );.        Tcl_D
ae30: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6f 6c  ecrRefCount(pCol
ae40: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 54  List);.        T
ae50: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
ae60: 70 53 74 61 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pStar);.      }.
ae70: 0a 20 20 20 20 20 20 2f 2a 20 45 78 65 63 75 74  .      /* Execut
ae80: 65 20 74 68 65 20 53 51 4c 0a 20 20 20 20 20 20  e the SQL.      
ae90: 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  */.      while( 
aea0: 72 63 3d 3d 54 43 4c 5f 4f 4b 20 26 26 20 70 53  rc==TCL_OK && pS
aeb0: 74 6d 74 20 26 26 20 53 51 4c 49 54 45 5f 52 4f  tmt && SQLITE_RO
aec0: 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
aed0: 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20  pStmt) ){.      
aee0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
aef0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
af00: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c     Tcl_Obj *pVal
af10: 3b 0a 20 20 20 20 20 20 20 20 20 20 0a 20 20 20  ;.          .   
af20: 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 70 56         /* Set pV
af30: 61 6c 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  al to contain th
af40: 65 20 69 27 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  e i'th column of
af50: 20 74 68 69 73 20 72 6f 77 2e 20 2a 2f 0a 20 20   this row. */.  
af60: 20 20 20 20 20 20 20 20 73 77 69 74 63 68 28 20          switch( 
af70: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
af80: 79 70 65 28 70 53 74 6d 74 2c 20 69 29 20 29 7b  ype(pStmt, i) ){
af90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73  .            cas
afa0: 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b  e SQLITE_BLOB: {
afb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
afc0: 6e 74 20 62 79 74 65 73 20 3d 20 73 71 6c 69 74  nt bytes = sqlit
afd0: 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28  e3_column_bytes(
afe0: 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20  pStmt, i);.     
aff0: 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20           pVal = 
b000: 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79  Tcl_NewByteArray
b010: 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75  Obj(sqlite3_colu
b020: 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 69  mn_blob(pStmt, i
b030: 29 2c 20 62 79 74 65 73 29 3b 0a 20 20 20 20 20  ), bytes);.     
b040: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
b050: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
b060: 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53            case S
b070: 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b  QLITE_INTEGER: {
b080: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
b090: 71 6c 69 74 65 5f 69 6e 74 36 34 20 76 20 3d 20  qlite_int64 v = 
b0a0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
b0b0: 6e 74 36 34 28 70 53 74 6d 74 2c 20 69 29 3b 0a  nt64(pStmt, i);.
b0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
b0d0: 28 20 76 3e 3d 2d 32 31 34 37 34 38 33 36 34 37  ( v>=-2147483647
b0e0: 20 26 26 20 76 3c 3d 32 31 34 37 34 38 33 36 34   && v<=214748364
b0f0: 37 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  7 ){.           
b100: 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f       pVal = Tcl_
b110: 4e 65 77 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20  NewIntObj(v);.  
b120: 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
b130: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
b140: 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65     pVal = Tcl_Ne
b150: 77 57 69 64 65 49 6e 74 4f 62 6a 28 76 29 3b 0a  wWideIntObj(v);.
b160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
b170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
b180: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
b190: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63   }.            c
b1a0: 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54  ase SQLITE_FLOAT
b1b0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  : {.            
b1c0: 20 20 64 6f 75 62 6c 65 20 72 20 3d 20 73 71 6c    double r = sql
b1d0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62  ite3_column_doub
b1e0: 6c 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20  le(pStmt, i);.  
b1f0: 20 20 20 20 20 20 20 20 20 20 20 20 70 56 61 6c              pVal
b200: 20 3d 20 54 63 6c 5f 4e 65 77 44 6f 75 62 6c 65   = Tcl_NewDouble
b210: 4f 62 6a 28 72 29 3b 0a 20 20 20 20 20 20 20 20  Obj(r);.        
b220: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b230: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
b240: 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
b250: 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  TE_NULL: {.     
b260: 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20           pVal = 
b270: 64 62 54 65 78 74 54 6f 4f 62 6a 28 70 44 62 2d  dbTextToObj(pDb-
b280: 3e 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20  >zNull);.       
b290: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b2a0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
b2b0: 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a          default:
b2c0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
b2d0: 20 70 56 61 6c 20 3d 20 64 62 54 65 78 74 54 6f   pVal = dbTextTo
b2e0: 4f 62 6a 28 28 63 68 61 72 20 2a 29 73 71 6c 69  Obj((char *)sqli
b2f0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
b300: 70 53 74 6d 74 2c 20 69 29 29 3b 0a 20 20 20 20  pStmt, i));.    
b310: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
b320: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
b330: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20           }.  .  
b340: 20 20 20 20 20 20 20 20 69 66 28 20 70 53 63 72          if( pScr
b350: 69 70 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ipt ){.         
b360: 20 20 20 69 66 28 20 70 41 72 72 61 79 3d 3d 30     if( pArray==0
b370: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
b380: 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32    Tcl_ObjSetVar2
b390: 28 69 6e 74 65 72 70 2c 20 61 70 43 6f 6c 4e 61  (interp, apColNa
b3a0: 6d 65 5b 69 5d 2c 20 30 2c 20 70 56 61 6c 2c 20  me[i], 0, pVal, 
b3b0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
b3c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
b3d0: 20 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56       Tcl_ObjSetV
b3e0: 61 72 32 28 69 6e 74 65 72 70 2c 20 70 41 72 72  ar2(interp, pArr
b3f0: 61 79 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d  ay, apColName[i]
b400: 2c 20 70 56 61 6c 2c 20 30 29 3b 0a 20 20 20 20  , pVal, 0);.    
b410: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b420: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 68      }else if( ch
b430: 6f 69 63 65 3d 3d 44 42 5f 4f 4e 45 43 4f 4c 55  oice==DB_ONECOLU
b440: 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  MN ){.          
b450: 20 20 61 73 73 65 72 74 28 20 70 52 65 74 3d 3d    assert( pRet==
b460: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  0 );.           
b470: 20 69 66 28 20 70 52 65 74 3d 3d 30 20 29 7b 0a   if( pRet==0 ){.
b480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 52                pR
b490: 65 74 20 3d 20 70 56 61 6c 3b 0a 20 20 20 20 20  et = pVal;.     
b4a0: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63           Tcl_Inc
b4b0: 72 52 65 66 43 6f 75 6e 74 28 70 52 65 74 29 3b  rRefCount(pRet);
b4c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
b4d0: 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
b4e0: 54 43 4c 5f 42 52 45 41 4b 3b 0a 20 20 20 20 20  TCL_BREAK;.     
b4f0: 20 20 20 20 20 20 20 69 20 3d 20 6e 43 6f 6c 3b         i = nCol;
b500: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
b510: 20 69 66 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f   if( choice==DB_
b520: 45 58 49 53 54 53 20 29 7b 0a 20 20 20 20 20 20  EXISTS ){.      
b530: 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65        Tcl_DecrRe
b540: 66 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20 20  fCount(pRet);.  
b550: 20 20 20 20 20 20 20 20 20 20 70 52 65 74 20 3d            pRet =
b560: 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f   Tcl_NewBooleanO
b570: 62 6a 28 31 29 3b 0a 20 20 20 20 20 20 20 20 20  bj(1);.         
b580: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
b590: 75 6e 74 28 70 52 65 74 29 3b 0a 20 20 20 20 20  unt(pRet);.     
b5a0: 20 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f         rc = TCL_
b5b0: 42 52 45 41 4b 3b 0a 20 20 20 20 20 20 20 20 20  BREAK;.         
b5c0: 20 20 20 69 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20     i = nCol;.   
b5d0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
b5e0: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4c 69            Tcl_Li
b5f0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
b600: 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c  nt(interp, pRet,
b610: 20 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20   pVal);.        
b620: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
b630: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53 63  .        if( pSc
b640: 72 69 70 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ript ){.        
b650: 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f    rc = Tcl_EvalO
b660: 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 70 53 63  bjEx(interp, pSc
b670: 72 69 70 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  ript, 0);.      
b680: 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f      if( rc==TCL_
b690: 43 4f 4e 54 49 4e 55 45 20 29 7b 0a 20 20 20 20  CONTINUE ){.    
b6a0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c          rc = TCL
b6b0: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  _OK;.          }
b6c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
b6d0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
b6e0: 3d 54 43 4c 5f 42 52 45 41 4b 20 29 7b 0a 20 20  =TCL_BREAK ){.  
b6f0: 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f        rc = TCL_O
b700: 4b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  K;.      }..    
b710: 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20 63 6f    /* Free the co
b720: 6c 75 6d 6e 20 6e 61 6d 65 20 6f 62 6a 65 63 74  lumn name object
b730: 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  s */.      if( p
b740: 53 63 72 69 70 74 20 29 7b 0a 20 20 20 20 20 20  Script ){.      
b750: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
b760: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
b770: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
b780: 75 6e 74 28 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d  unt(apColName[i]
b790: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
b7a0: 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63       Tcl_Free((c
b7b0: 68 61 72 2a 29 61 70 43 6f 6c 4e 61 6d 65 29 3b  har*)apColName);
b7c0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
b7d0: 2f 2a 20 46 72 65 65 20 74 68 65 20 62 6f 75 6e  /* Free the boun
b7e0: 64 20 73 74 72 69 6e 67 20 61 6e 64 20 62 6c 6f  d string and blo
b7f0: 62 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a  b parameters */.
b800: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
b810: 3c 6e 50 61 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20  <nParm; i++){.  
b820: 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65        Tcl_DecrRe
b830: 66 43 6f 75 6e 74 28 61 70 50 61 72 6d 5b 69 5d  fCount(apParm[i]
b840: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
b850: 20 69 66 28 20 61 70 50 61 72 6d 21 3d 61 50 61   if( apParm!=aPa
b860: 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  rm ){.        Tc
b870: 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 61 70  l_Free((char*)ap
b880: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  Parm);.      }..
b890: 20 20 20 20 20 20 2f 2a 20 52 65 73 65 74 20 74        /* Reset t
b8a0: 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 49  he statement.  I
b8b0: 66 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64  f the result cod
b8c0: 65 20 69 73 20 53 51 4c 49 54 45 5f 53 43 48 45  e is SQLITE_SCHE
b8d0: 4d 41 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a  MA, then.      *
b8e0: 2a 20 66 6c 75 73 68 20 74 68 65 20 73 74 61 74  * flush the stat
b8f0: 65 6d 65 6e 74 20 63 61 63 68 65 20 61 6e 64 20  ement cache and 
b900: 74 72 79 20 74 68 65 20 73 74 61 74 65 6d 65 6e  try the statemen
b910: 74 20 61 67 61 69 6e 2e 0a 20 20 20 20 20 20 2a  t again..      *
b920: 2f 0a 20 20 20 20 20 20 72 63 32 20 3d 20 73 71  /.      rc2 = sq
b930: 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d  lite3_reset(pStm
b940: 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51  t);.      if( SQ
b950: 4c 49 54 45 5f 53 43 48 45 4d 41 3d 3d 72 63 32  LITE_SCHEMA==rc2
b960: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   ){.        /* A
b970: 66 74 65 72 20 61 20 73 63 68 65 6d 61 20 63 68  fter a schema ch
b980: 61 6e 67 65 2c 20 66 6c 75 73 68 20 74 68 65 20  ange, flush the 
b990: 63 61 63 68 65 20 61 6e 64 20 74 72 79 20 74 6f  cache and try to
b9a0: 20 72 75 6e 20 74 68 65 0a 20 20 20 20 20 20 20   run the.       
b9b0: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 61 67   ** statement ag
b9c0: 61 69 6e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ain.        */. 
b9d0: 20 20 20 20 20 20 20 66 6c 75 73 68 53 74 6d 74         flushStmt
b9e0: 43 61 63 68 65 28 20 70 44 62 20 29 3b 0a 20 20  Cache( pDb );.  
b9f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
ba00: 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
ba10: 20 20 20 20 20 20 20 69 66 28 20 70 50 72 65 53         if( pPreS
ba20: 74 6d 74 20 29 20 54 63 6c 5f 46 72 65 65 28 28  tmt ) Tcl_Free((
ba30: 63 68 61 72 2a 29 70 50 72 65 53 74 6d 74 29 3b  char*)pPreStmt);
ba40: 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
ba50: 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  e;.      }else i
ba60: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
ba70: 32 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  2 ){.        /* 
ba80: 49 66 20 61 20 72 75 6e 2d 74 69 6d 65 20 65 72  If a run-time er
ba90: 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 70 6f  ror occurs, repo
baa0: 72 74 20 74 68 65 20 65 72 72 6f 72 20 61 6e 64  rt the error and
bab0: 20 73 74 6f 70 20 72 65 61 64 69 6e 67 0a 20 20   stop reading.  
bac0: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c        ** the SQL
bad0: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
bae0: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
baf0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 64 62 54  sult(interp, dbT
bb00: 65 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65 33  extToObj(sqlite3
bb10: 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29  _errmsg(pDb->db)
bb20: 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ));.        sqli
bb30: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
bb40: 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  mt);.        rc 
bb50: 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  = TCL_ERROR;.   
bb60: 20 20 20 20 20 69 66 28 20 70 50 72 65 53 74 6d       if( pPreStm
bb70: 74 20 29 20 54 63 6c 5f 46 72 65 65 28 28 63 68  t ) Tcl_Free((ch
bb80: 61 72 2a 29 70 50 72 65 53 74 6d 74 29 3b 0a 20  ar*)pPreStmt);. 
bb90: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
bba0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 44      }else if( pD
bbb0: 62 2d 3e 6d 61 78 53 74 6d 74 3c 3d 30 20 29 7b  b->maxStmt<=0 ){
bbc0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
bbd0: 68 65 20 63 61 63 68 65 20 69 73 20 74 75 72 6e  he cache is turn
bbe0: 65 64 20 6f 66 66 2c 20 64 65 61 6c 6c 6f 63 61  ed off, dealloca
bbf0: 74 65 64 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ted the statemen
bc00: 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  t */.        if(
bc10: 20 70 50 72 65 53 74 6d 74 20 29 20 54 63 6c 5f   pPreStmt ) Tcl_
bc20: 46 72 65 65 28 28 63 68 61 72 2a 29 70 50 72 65  Free((char*)pPre
bc30: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 73  Stmt);.        s
bc40: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
bc50: 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 7d 65  pStmt);.      }e
bc60: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
bc70: 45 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65  Everything worke
bc80: 64 20 61 6e 64 20 74 68 65 20 63 61 63 68 65 20  d and the cache 
bc90: 69 73 20 6f 70 65 72 61 74 69 6f 6e 61 6c 2e 0a  is operational..
bca0: 20 20 20 20 20 20 20 20 2a 2a 20 43 72 65 61 74          ** Creat
bcb0: 65 20 61 20 6e 65 77 20 53 71 6c 50 72 65 70 61  e a new SqlPrepa
bcc0: 72 65 64 53 74 6d 74 20 73 74 72 75 63 74 75 72  redStmt structur
bcd0: 65 20 69 66 20 77 65 20 6e 65 65 64 20 6f 6e 65  e if we need one
bce0: 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 49 66  ..        ** (If
bcf0: 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76 65   we already have
bd00: 20 6f 6e 65 20 77 65 20 63 61 6e 20 6a 75 73 74   one we can just
bd10: 20 72 65 75 73 65 20 69 74 2e 29 0a 20 20 20 20   reuse it.).    
bd20: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
bd30: 66 28 20 70 50 72 65 53 74 6d 74 3d 3d 30 20 29  f( pPreStmt==0 )
bd40: 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 65 6e 20  {.          len 
bd50: 3d 20 7a 4c 65 66 74 20 2d 20 7a 53 71 6c 3b 0a  = zLeft - zSql;.
bd60: 20 20 20 20 20 20 20 20 20 20 70 50 72 65 53 74            pPreSt
bd70: 6d 74 20 3d 20 28 53 71 6c 50 72 65 70 61 72 65  mt = (SqlPrepare
bd80: 64 53 74 6d 74 2a 29 54 63 6c 5f 41 6c 6c 6f 63  dStmt*)Tcl_Alloc
bd90: 28 20 73 69 7a 65 6f 66 28 2a 70 50 72 65 53 74  ( sizeof(*pPreSt
bda0: 6d 74 29 20 2b 20 6c 65 6e 20 29 3b 0a 20 20 20  mt) + len );.   
bdb0: 20 20 20 20 20 20 20 69 66 28 20 70 50 72 65 53         if( pPreS
bdc0: 74 6d 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  tmt==0 ) return 
bdd0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
bde0: 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 70       pPreStmt->p
bdf0: 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20 20  Stmt = pStmt;.  
be00: 20 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74          pPreStmt
be10: 2d 3e 6e 53 71 6c 20 3d 20 6c 65 6e 3b 0a 20 20  ->nSql = len;.  
be20: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
be30: 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 2c 20 7a  PreStmt->zSql, z
be40: 53 71 6c 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 20  Sql, len);.     
be50: 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 7a       pPreStmt->z
be60: 53 71 6c 5b 6c 65 6e 5d 20 3d 20 30 3b 0a 20 20  Sql[len] = 0;.  
be70: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
be80: 20 2f 2a 20 41 64 64 20 74 68 65 20 70 72 65 70   /* Add the prep
be90: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 74  ared statement t
bea0: 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  o the beginning 
beb0: 6f 66 20 74 68 65 20 63 61 63 68 65 20 6c 69 73  of the cache lis
bec0: 74 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  t.        */.   
bed0: 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 70       pPreStmt->p
bee0: 4e 65 78 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74  Next = pDb->stmt
bef0: 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 70 50  List;.        pP
bf00: 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 20 3d 20  reStmt->pPrev = 
bf10: 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  0;.        if( p
bf20: 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 29 7b 0a  Db->stmtList ){.
bf30: 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73 74           pDb->st
bf40: 6d 74 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d 20  mtList->pPrev = 
bf50: 70 50 72 65 53 74 6d 74 3b 0a 20 20 20 20 20 20  pPreStmt;.      
bf60: 20 20 7d 0a 20 20 20 20 20 20 20 20 70 44 62 2d    }.        pDb-
bf70: 3e 73 74 6d 74 4c 69 73 74 20 3d 20 70 50 72 65  >stmtList = pPre
bf80: 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 69 66  Stmt;.        if
bf90: 28 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 3d  ( pDb->stmtLast=
bfa0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
bfb0: 61 73 73 65 72 74 28 20 70 44 62 2d 3e 6e 53 74  assert( pDb->nSt
bfc0: 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  mt==0 );.       
bfd0: 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74     pDb->stmtLast
bfe0: 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a 20 20 20   = pPreStmt;.   
bff0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
c000: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44        assert( pD
c010: 62 2d 3e 6e 53 74 6d 74 3e 30 20 29 3b 0a 20 20  b->nStmt>0 );.  
c020: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
c030: 70 44 62 2d 3e 6e 53 74 6d 74 2b 2b 3b 0a 20 20  pDb->nStmt++;.  
c040: 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20   .        /* If 
c050: 77 65 20 68 61 76 65 20 74 6f 6f 20 6d 61 6e 79  we have too many
c060: 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 63 61   statement in ca
c070: 63 68 65 2c 20 72 65 6d 6f 76 65 20 74 68 65 20  che, remove the 
c080: 73 75 72 70 6c 75 73 20 66 72 6f 6d 20 74 68 65  surplus from the
c090: 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 6e 64 20  .        ** end 
c0a0: 6f 66 20 74 68 65 20 63 61 63 68 65 20 6c 69 73  of the cache lis
c0b0: 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  t..        */.  
c0c0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 44 62        while( pDb
c0d0: 2d 3e 6e 53 74 6d 74 3e 70 44 62 2d 3e 6d 61 78  ->nStmt>pDb->max
c0e0: 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Stmt ){.        
c0f0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
c100: 7a 65 28 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74  ze(pDb->stmtLast
c110: 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  ->pStmt);.      
c120: 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73      pDb->stmtLas
c130: 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73  t = pDb->stmtLas
c140: 74 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20  t->pPrev;.      
c150: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68      Tcl_Free((ch
c160: 61 72 2a 29 70 44 62 2d 3e 73 74 6d 74 4c 61 73  ar*)pDb->stmtLas
c170: 74 2d 3e 70 4e 65 78 74 29 3b 0a 20 20 20 20 20  t->pNext);.     
c180: 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61       pDb->stmtLa
c190: 73 74 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  st->pNext = 0;. 
c1a0: 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 6e 53           pDb->nS
c1b0: 74 6d 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7d  tmt--;.        }
c1c0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
c1d0: 2f 2a 20 50 72 6f 63 65 65 64 20 74 6f 20 74 68  /* Proceed to th
c1e0: 65 20 6e 65 78 74 20 73 74 61 74 65 6d 65 6e 74  e next statement
c1f0: 20 2a 2f 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d   */.      zSql =
c200: 20 7a 4c 65 66 74 3b 0a 20 20 20 20 7d 0a 20 20   zLeft;.    }.  
c210: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
c220: 6e 74 28 6f 62 6a 76 5b 32 5d 29 3b 0a 0a 20 20  nt(objv[2]);..  
c230: 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20    if( pRet ){.  
c240: 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f      if( rc==TCL_
c250: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  OK ){.        Tc
c260: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
c270: 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 20 20  nterp, pRet);.  
c280: 20 20 20 20 7d 0a 20 20 20 20 20 20 54 63 6c 5f      }.      Tcl_
c290: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 52 65  DecrRefCount(pRe
c2a0: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72  t);.    }.    br
c2b0: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
c2c0: 20 2a 2a 20 20 20 20 20 24 64 62 20 66 75 6e 63   **     $db func
c2d0: 74 69 6f 6e 20 4e 41 4d 45 20 53 43 52 49 50 54  tion NAME SCRIPT
c2e0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 72 65 61 74  .  **.  ** Creat
c2f0: 65 20 61 20 6e 65 77 20 53 51 4c 20 66 75 6e 63  e a new SQL func
c300: 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45  tion called NAME
c310: 2e 20 20 57 68 65 6e 65 76 65 72 20 74 68 61 74  .  Whenever that
c320: 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 20 20 2a   function is.  *
c330: 2a 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65  * called, invoke
c340: 20 53 43 52 49 50 54 20 74 6f 20 65 76 61 6c 75   SCRIPT to evalu
c350: 61 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  ate the function
c360: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
c370: 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  _FUNCTION: {.   
c380: 20 53 71 6c 46 75 6e 63 20 2a 70 46 75 6e 63 3b   SqlFunc *pFunc;
c390: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53  .    Tcl_Obj *pS
c3a0: 63 72 69 70 74 3b 0a 20 20 20 20 63 68 61 72 20  cript;.    char 
c3b0: 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20  *zName;.    if( 
c3c0: 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 20  objc!=4 ){.     
c3d0: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
c3e0: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
c3f0: 76 2c 20 22 4e 41 4d 45 20 53 43 52 49 50 54 22  v, "NAME SCRIPT"
c400: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
c410: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
c420: 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 54 63 6c  .    zName = Tcl
c430: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
c440: 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20  j(objv[2], 0);. 
c450: 20 20 20 70 53 63 72 69 70 74 20 3d 20 6f 62 6a     pScript = obj
c460: 76 5b 33 5d 3b 0a 20 20 20 20 70 46 75 6e 63 20  v[3];.    pFunc 
c470: 3d 20 66 69 6e 64 53 71 6c 46 75 6e 63 28 70 44  = findSqlFunc(pD
c480: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69  b, zName);.    i
c490: 66 28 20 70 46 75 6e 63 3d 3d 30 20 29 20 72 65  f( pFunc==0 ) re
c4a0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
c4b0: 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 70      if( pFunc->p
c4c0: 53 63 72 69 70 74 20 29 7b 0a 20 20 20 20 20 20  Script ){.      
c4d0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
c4e0: 28 70 46 75 6e 63 2d 3e 70 53 63 72 69 70 74 29  (pFunc->pScript)
c4f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 75 6e  ;.    }.    pFun
c500: 63 2d 3e 70 53 63 72 69 70 74 20 3d 20 70 53 63  c->pScript = pSc
c510: 72 69 70 74 3b 0a 20 20 20 20 54 63 6c 5f 49 6e  ript;.    Tcl_In
c520: 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69  crRefCount(pScri
c530: 70 74 29 3b 0a 20 20 20 20 70 46 75 6e 63 2d 3e  pt);.    pFunc->
c540: 75 73 65 45 76 61 6c 4f 62 6a 76 20 3d 20 73 61  useEvalObjv = sa
c550: 66 65 54 6f 55 73 65 45 76 61 6c 4f 62 6a 76 28  feToUseEvalObjv(
c560: 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74 29  interp, pScript)
c570: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
c580: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
c590: 6f 6e 28 70 44 62 2d 3e 64 62 2c 20 7a 4e 61 6d  on(pDb->db, zNam
c5a0: 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  e, -1, SQLITE_UT
c5b0: 46 38 2c 0a 20 20 20 20 20 20 20 20 70 46 75 6e  F8,.        pFun
c5c0: 63 2c 20 74 63 6c 53 71 6c 46 75 6e 63 2c 20 30  c, tclSqlFunc, 0
c5d0: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
c5e0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
c5f0: 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52       rc = TCL_ER
c600: 52 4f 52 3b 0a 20 20 20 20 20 20 54 63 6c 5f 53  ROR;.      Tcl_S
c610: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
c620: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
c630: 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29  _errmsg(pDb->db)
c640: 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b  , TCL_VOLATILE);
c650: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
c660: 20 20 2f 2a 20 4d 75 73 74 20 66 6c 75 73 68 20    /* Must flush 
c670: 61 6e 79 20 63 61 63 68 65 64 20 73 74 61 74 65  any cached state
c680: 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 66  ments */.      f
c690: 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28 20 70  lushStmtCache( p
c6a0: 44 62 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Db );.    }.    
c6b0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
c6c0: 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 6e 75  .  **     $db nu
c6d0: 6c 6c 76 61 6c 75 65 20 3f 53 54 52 49 4e 47 3f  llvalue ?STRING?
c6e0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 68 61 6e 67  .  **.  ** Chang
c6f0: 65 20 74 65 78 74 20 75 73 65 64 20 77 68 65 6e  e text used when
c700: 20 61 20 4e 55 4c 4c 20 63 6f 6d 65 73 20 62 61   a NULL comes ba
c710: 63 6b 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ck from the data
c720: 62 61 73 65 2e 20 49 66 20 3f 53 54 52 49 4e 47  base. If ?STRING
c730: 3f 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 72  ?.  ** is not pr
c740: 65 73 65 6e 74 2c 20 74 68 65 6e 20 74 68 65 20  esent, then the 
c750: 63 75 72 72 65 6e 74 20 73 74 72 69 6e 67 20 75  current string u
c760: 73 65 64 20 66 6f 72 20 4e 55 4c 4c 20 69 73 20  sed for NULL is 
c770: 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2a 20 49  returned..  ** I
c780: 66 20 53 54 52 49 4e 47 20 69 73 20 70 72 65 73  f STRING is pres
c790: 65 6e 74 2c 20 74 68 65 6e 20 53 54 52 49 4e 47  ent, then STRING
c7a0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 20 20   is returned..  
c7b0: 2a 2a 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  **.  */.  case D
c7c0: 42 5f 4e 55 4c 4c 56 41 4c 55 45 3a 20 7b 0a 20  B_NULLVALUE: {. 
c7d0: 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 26     if( objc!=2 &
c7e0: 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  & objc!=3 ){.   
c7f0: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
c800: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
c810: 62 6a 76 2c 20 22 4e 55 4c 4c 56 41 4c 55 45 22  bjv, "NULLVALUE"
c820: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
c830: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
c840: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33  .    if( objc==3
c850: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65   ){.      int le
c860: 6e 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  n;.      char *z
c870: 4e 75 6c 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74  Null = Tcl_GetSt
c880: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
c890: 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20  [2], &len);.    
c8a0: 20 20 69 66 28 20 70 44 62 2d 3e 7a 4e 75 6c 6c    if( pDb->zNull
c8b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
c8c0: 46 72 65 65 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29  Free(pDb->zNull)
c8d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c8e0: 69 66 28 20 7a 4e 75 6c 6c 20 26 26 20 6c 65 6e  if( zNull && len
c8f0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  >0 ){.        pD
c900: 62 2d 3e 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f 41  b->zNull = Tcl_A
c910: 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b  lloc( len + 1 );
c920: 0a 20 20 20 20 20 20 20 20 73 74 72 6e 63 70 79  .        strncpy
c930: 28 70 44 62 2d 3e 7a 4e 75 6c 6c 2c 20 7a 4e 75  (pDb->zNull, zNu
c940: 6c 6c 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 20 20  ll, len);.      
c950: 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c 5b 6c 65 6e    pDb->zNull[len
c960: 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20  ] = '\0';.      
c970: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
c980: 44 62 2d 3e 7a 4e 75 6c 6c 20 3d 20 30 3b 0a 20  Db->zNull = 0;. 
c990: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
c9a0: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
c9b0: 74 28 69 6e 74 65 72 70 2c 20 64 62 54 65 78 74  t(interp, dbText
c9c0: 54 6f 4f 62 6a 28 70 44 62 2d 3e 7a 4e 75 6c 6c  ToObj(pDb->zNull
c9d0: 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  ));.    break;. 
c9e0: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
c9f0: 20 20 24 64 62 20 6c 61 73 74 5f 69 6e 73 65 72    $db last_inser
ca00: 74 5f 72 6f 77 69 64 20 0a 20 20 2a 2a 0a 20 20  t_rowid .  **.  
ca10: 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74  ** Return an int
ca20: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
ca30: 65 20 52 4f 57 49 44 20 66 6f 72 20 74 68 65 20  e ROWID for the 
ca40: 6d 6f 73 74 20 72 65 63 65 6e 74 20 69 6e 73 65  most recent inse
ca50: 72 74 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  rt..  */.  case 
ca60: 44 42 5f 4c 41 53 54 5f 49 4e 53 45 52 54 5f 52  DB_LAST_INSERT_R
ca70: 4f 57 49 44 3a 20 7b 0a 20 20 20 20 54 63 6c 5f  OWID: {.    Tcl_
ca80: 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20  Obj *pResult;.  
ca90: 20 20 69 6e 74 20 72 6f 77 69 64 3b 0a 20 20 20    int rowid;.   
caa0: 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
cab0: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
cac0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
cad0: 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20  , objv, "");.   
cae0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
caf0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ROR;.    }.    r
cb00: 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 6c  owid = sqlite3_l
cb10: 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
cb20: 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20 20 20 70  (pDb->db);.    p
cb30: 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74  Result = Tcl_Get
cb40: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
cb50: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 49 6e  );.    Tcl_SetIn
cb60: 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 72 6f  tObj(pResult, ro
cb70: 77 69 64 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  wid);.    break;
cb80: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
cb90: 54 68 65 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e  The DB_ONECOLUMN
cba0: 20 6d 65 74 68 6f 64 20 69 73 20 69 6d 70 6c 65   method is imple
cbb0: 6d 65 6e 74 65 64 20 74 6f 67 65 74 68 65 72 20  mented together 
cbc0: 77 69 74 68 20 44 42 5f 45 56 41 4c 2e 0a 20 20  with DB_EVAL..  
cbd0: 2a 2f 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20  */..  /*    $db 
cbe0: 70 72 6f 67 72 65 73 73 20 3f 4e 20 43 41 4c 4c  progress ?N CALL
cbf0: 42 41 43 4b 3f 0a 20 20 2a 2a 20 0a 20 20 2a 2a  BACK?.  ** .  **
cc00: 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65   Invoke the give
cc10: 6e 20 63 61 6c 6c 62 61 63 6b 20 65 76 65 72 79  n callback every
cc20: 20 4e 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69   N virtual machi
cc30: 6e 65 20 6f 70 63 6f 64 65 73 20 77 68 69 6c 65  ne opcodes while
cc40: 20 65 78 65 63 75 74 69 6e 67 0a 20 20 2a 2a 20   executing.  ** 
cc50: 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20  queries..  */.  
cc60: 63 61 73 65 20 44 42 5f 50 52 4f 47 52 45 53 53  case DB_PROGRESS
cc70: 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  : {.    if( objc
cc80: 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==2 ){.      if(
cc90: 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20   pDb->zProgress 
cca0: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41  ){.        Tcl_A
ccb0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
ccc0: 72 70 2c 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65  rp, pDb->zProgre
ccd0: 73 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ss, 0);.      }.
cce0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62      }else if( ob
ccf0: 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 63  jc==4 ){.      c
cd00: 68 61 72 20 2a 7a 50 72 6f 67 72 65 73 73 3b 0a  har *zProgress;.
cd10: 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20        int len;. 
cd20: 20 20 20 20 20 69 6e 74 20 4e 3b 0a 20 20 20 20       int N;.    
cd30: 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63    if( TCL_OK!=Tc
cd40: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
cd50: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
cd60: 20 26 4e 29 20 29 7b 0a 09 72 65 74 75 72 6e 20   &N) ){..return 
cd70: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
cd80: 20 7d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44   };.      if( pD
cd90: 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29 7b 0a  b->zProgress ){.
cda0: 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65          Tcl_Free
cdb0: 28 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 29  (pDb->zProgress)
cdc0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
cdd0: 7a 50 72 6f 67 72 65 73 73 20 3d 20 54 63 6c 5f  zProgress = Tcl_
cde0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
cdf0: 28 6f 62 6a 76 5b 33 5d 2c 20 26 6c 65 6e 29 3b  (objv[3], &len);
ce00: 0a 20 20 20 20 20 20 69 66 28 20 7a 50 72 6f 67  .      if( zProg
ce10: 72 65 73 73 20 26 26 20 6c 65 6e 3e 30 20 29 7b  ress && len>0 ){
ce20: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 50  .        pDb->zP
ce30: 72 6f 67 72 65 73 73 20 3d 20 54 63 6c 5f 41 6c  rogress = Tcl_Al
ce40: 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a  loc( len + 1 );.
ce50: 20 20 20 20 20 20 20 20 73 74 72 63 70 79 28 70          strcpy(p
ce60: 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 2c 20 7a  Db->zProgress, z
ce70: 50 72 6f 67 72 65 73 73 29 3b 0a 20 20 20 20 20  Progress);.     
ce80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ce90: 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 3d  pDb->zProgress =
cea0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e   0;.      }.#ifn
ceb0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
cec0: 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43  PROGRESS_CALLBAC
ced0: 4b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  K.      if( pDb-
cee0: 3e 7a 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20  >zProgress ){.  
cef0: 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72        pDb->inter
cf00: 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20  p = interp;.    
cf10: 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 67      sqlite3_prog
cf20: 72 65 73 73 5f 68 61 6e 64 6c 65 72 28 70 44 62  ress_handler(pDb
cf30: 2d 3e 64 62 2c 20 4e 2c 20 44 62 50 72 6f 67 72  ->db, N, DbProgr
cf40: 65 73 73 48 61 6e 64 6c 65 72 2c 20 70 44 62 29  essHandler, pDb)
cf50: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
cf60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70         sqlite3_p
cf70: 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65 72 28  rogress_handler(
cf80: 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 2c 20 30  pDb->db, 0, 0, 0
cf90: 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
cfa0: 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
cfb0: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
cfc0: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
cfd0: 62 6a 76 2c 20 22 4e 20 43 41 4c 4c 42 41 43 4b  bjv, "N CALLBACK
cfe0: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
cff0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
d000: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
d010: 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 70 72  ..  /*    $db pr
d020: 6f 66 69 6c 65 20 3f 43 41 4c 4c 42 41 43 4b 3f  ofile ?CALLBACK?
d030: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20  .  **.  ** Make 
d040: 61 72 72 61 6e 67 65 6d 65 6e 74 73 20 74 6f 20  arrangements to 
d050: 69 6e 76 6f 6b 65 20 74 68 65 20 43 41 4c 4c 42  invoke the CALLB
d060: 41 43 4b 20 72 6f 75 74 69 6e 65 20 61 66 74 65  ACK routine afte
d070: 72 20 65 61 63 68 20 53 51 4c 20 73 74 61 74 65  r each SQL state
d080: 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 61 74 20 68  ment.  ** that h
d090: 61 73 20 72 75 6e 2e 20 20 54 68 65 20 74 65 78  as run.  The tex
d0a0: 74 20 6f 66 20 74 68 65 20 53 51 4c 20 61 6e 64  t of the SQL and
d0b0: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 65   the amount of e
d0c0: 6c 61 70 73 65 20 74 69 6d 65 20 61 72 65 0a 20  lapse time are. 
d0d0: 20 2a 2a 20 61 70 70 65 6e 64 65 64 20 74 6f 20   ** appended to 
d0e0: 43 41 4c 4c 42 41 43 4b 20 62 65 66 6f 72 65 20  CALLBACK before 
d0f0: 74 68 65 20 73 63 72 69 70 74 20 69 73 20 72 75  the script is ru
d100: 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  n..  */.  case D
d110: 42 5f 50 52 4f 46 49 4c 45 3a 20 7b 0a 20 20 20  B_PROFILE: {.   
d120: 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20   if( objc>3 ){. 
d130: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
d140: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
d150: 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43   objv, "?CALLBAC
d160: 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  K?");.      retu
d170: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
d180: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63    }else if( objc
d190: 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==2 ){.      if(
d1a0: 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29   pDb->zProfile )
d1b0: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70  {.        Tcl_Ap
d1c0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
d1d0: 70 2c 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65  p, pDb->zProfile
d1e0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
d1f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
d200: 68 61 72 20 2a 7a 50 72 6f 66 69 6c 65 3b 0a 20  har *zProfile;. 
d210: 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20       int len;.  
d220: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72      if( pDb->zPr
d230: 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  ofile ){.       
d240: 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
d250: 50 72 6f 66 69 6c 65 29 3b 0a 20 20 20 20 20 20  Profile);.      
d260: 7d 0a 20 20 20 20 20 20 7a 50 72 6f 66 69 6c 65  }.      zProfile
d270: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
d280: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
d290: 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66   &len);.      if
d2a0: 28 20 7a 50 72 6f 66 69 6c 65 20 26 26 20 6c 65  ( zProfile && le
d2b0: 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  n>0 ){.        p
d2c0: 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 3d 20 54  Db->zProfile = T
d2d0: 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20  cl_Alloc( len + 
d2e0: 31 20 29 3b 0a 20 20 20 20 20 20 20 20 73 74 72  1 );.        str
d2f0: 63 70 79 28 70 44 62 2d 3e 7a 50 72 6f 66 69 6c  cpy(pDb->zProfil
d300: 65 2c 20 7a 50 72 6f 66 69 6c 65 29 3b 0a 20 20  e, zProfile);.  
d310: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d320: 20 20 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65     pDb->zProfile
d330: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69   = 0;.      }.#i
d340: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
d350: 54 5f 54 52 41 43 45 0a 20 20 20 20 20 20 69 66  T_TRACE.      if
d360: 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20  ( pDb->zProfile 
d370: 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
d380: 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b  interp = interp;
d390: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
d3a0: 5f 70 72 6f 66 69 6c 65 28 70 44 62 2d 3e 64 62  _profile(pDb->db
d3b0: 2c 20 44 62 50 72 6f 66 69 6c 65 48 61 6e 64 6c  , DbProfileHandl
d3c0: 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20  er, pDb);.      
d3d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
d3e0: 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65 28 70  qlite3_profile(p
d3f0: 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20  Db->db, 0, 0);. 
d400: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
d410: 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
d420: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
d430: 20 20 24 64 62 20 72 65 6b 65 79 20 4b 45 59 0a    $db rekey KEY.
d440: 20 20 2a 2a 0a 20 20 2a 2a 20 43 68 61 6e 67 65    **.  ** Change
d450: 20 74 68 65 20 65 6e 63 72 79 70 74 69 6f 6e 20   the encryption 
d460: 6b 65 79 20 6f 6e 20 74 68 65 20 63 75 72 72 65  key on the curre
d470: 6e 74 6c 79 20 6f 70 65 6e 20 64 61 74 61 62 61  ntly open databa
d480: 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  se..  */.  case 
d490: 44 42 5f 52 45 4b 45 59 3a 20 7b 0a 20 20 20 20  DB_REKEY: {.    
d4a0: 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20 76 6f  int nKey;.    vo
d4b0: 69 64 20 2a 70 4b 65 79 3b 0a 20 20 20 20 69 66  id *pKey;.    if
d4c0: 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
d4d0: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
d4e0: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
d4f0: 62 6a 76 2c 20 22 4b 45 59 22 29 3b 0a 20 20 20  bjv, "KEY");.   
d500: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
d510: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ROR;.    }.    p
d520: 4b 65 79 20 3d 20 54 63 6c 5f 47 65 74 42 79 74  Key = Tcl_GetByt
d530: 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62  eArrayFromObj(ob
d540: 6a 76 5b 32 5d 2c 20 26 6e 4b 65 79 29 3b 0a 23  jv[2], &nKey);.#
d550: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
d560: 5f 43 4f 44 45 43 0a 20 20 20 20 72 63 20 3d 20  _CODEC.    rc = 
d570: 73 71 6c 69 74 65 33 5f 72 65 6b 65 79 28 70 44  sqlite3_rekey(pD
d580: 62 2d 3e 64 62 2c 20 70 4b 65 79 2c 20 6e 4b 65  b->db, pKey, nKe
d590: 79 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  y);.    if( rc )
d5a0: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
d5b0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
d5c0: 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72   sqlite3ErrStr(r
d5d0: 63 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 63  c), 0);.      rc
d5e0: 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20   = TCL_ERROR;.  
d5f0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 62    }.#endif.    b
d600: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
d610: 20 20 2a 2a 20 20 20 20 20 24 64 62 20 74 69 6d    **     $db tim
d620: 65 6f 75 74 20 4d 49 4c 4c 45 53 45 43 4f 4e 44  eout MILLESECOND
d630: 53 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 65 6c 61  S.  **.  ** Dela
d640: 79 20 66 6f 72 20 74 68 65 20 6e 75 6d 62 65 72  y for the number
d650: 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73   of milliseconds
d660: 20 73 70 65 63 69 66 69 65 64 20 77 68 65 6e 20   specified when 
d670: 61 20 66 69 6c 65 20 69 73 20 6c 6f 63 6b 65 64  a file is locked
d680: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
d690: 5f 54 49 4d 45 4f 55 54 3a 20 7b 0a 20 20 20 20  _TIMEOUT: {.    
d6a0: 69 6e 74 20 6d 73 3b 0a 20 20 20 20 69 66 28 20  int ms;.    if( 
d6b0: 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20  objc!=3 ){.     
d6c0: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
d6d0: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
d6e0: 76 2c 20 22 4d 49 4c 4c 49 53 45 43 4f 4e 44 53  v, "MILLISECONDS
d6f0: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
d700: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
d710: 7d 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65  }.    if( Tcl_Ge
d720: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
d730: 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6d 73  rp, objv[2], &ms
d740: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
d750: 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65  RROR;.    sqlite
d760: 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 70  3_busy_timeout(p
d770: 44 62 2d 3e 64 62 2c 20 6d 73 29 3b 0a 20 20 20  Db->db, ms);.   
d780: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 0a 20   break;.  }.  . 
d790: 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62   /*.  **     $db
d7a0: 20 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 0a 20   total_changes. 
d7b0: 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20   **.  ** Return 
d7c0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
d7d0: 77 73 20 74 68 61 74 20 77 65 72 65 20 6d 6f 64  ws that were mod
d7e0: 69 66 69 65 64 2c 20 69 6e 73 65 72 74 65 64 2c  ified, inserted,
d7f0: 20 6f 72 20 64 65 6c 65 74 65 64 20 0a 20 20 2a   or deleted .  *
d800: 2a 20 73 69 6e 63 65 20 74 68 65 20 64 61 74 61  * since the data
d810: 62 61 73 65 20 68 61 6e 64 6c 65 20 77 61 73 20  base handle was 
d820: 63 72 65 61 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  created..  */.  
d830: 63 61 73 65 20 44 42 5f 54 4f 54 41 4c 5f 43 48  case DB_TOTAL_CH
d840: 41 4e 47 45 53 3a 20 7b 0a 20 20 20 20 54 63 6c  ANGES: {.    Tcl
d850: 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20  _Obj *pResult;. 
d860: 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29     if( objc!=2 )
d870: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
d880: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
d890: 20 32 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20   2, objv, "");. 
d8a0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
d8b0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
d8c0: 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47   pResult = Tcl_G
d8d0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
d8e0: 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  rp);.    Tcl_Set
d8f0: 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20  IntObj(pResult, 
d900: 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68  sqlite3_total_ch
d910: 61 6e 67 65 73 28 70 44 62 2d 3e 64 62 29 29 3b  anges(pDb->db));
d920: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
d930: 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 74 72 61  .  /*    $db tra
d940: 63 65 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20  ce ?CALLBACK?.  
d950: 2a 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20 61 72 72  **.  ** Make arr
d960: 61 6e 67 65 6d 65 6e 74 73 20 74 6f 20 69 6e 76  angements to inv
d970: 6f 6b 65 20 74 68 65 20 43 41 4c 4c 42 41 43 4b  oke the CALLBACK
d980: 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 65 61 63   routine for eac
d990: 68 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 0a  h SQL statement.
d9a0: 20 20 2a 2a 20 74 68 61 74 20 69 73 20 65 78 65    ** that is exe
d9b0: 63 75 74 65 64 2e 20 20 54 68 65 20 74 65 78 74  cuted.  The text
d9c0: 20 6f 66 20 74 68 65 20 53 51 4c 20 69 73 20 61   of the SQL is a
d9d0: 70 70 65 6e 64 65 64 20 74 6f 20 43 41 4c 4c 42  ppended to CALLB
d9e0: 41 43 4b 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20  ACK before.  ** 
d9f0: 69 74 20 69 73 20 65 78 65 63 75 74 65 64 2e 0a  it is executed..
da00: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 54    */.  case DB_T
da10: 52 41 43 45 3a 20 7b 0a 20 20 20 20 69 66 28 20  RACE: {.    if( 
da20: 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20  objc>3 ){.      
da30: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
da40: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
da50: 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b  , "?CALLBACK?");
da60: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
da70: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c  L_ERROR;.    }el
da80: 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29  se if( objc==2 )
da90: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  {.      if( pDb-
daa0: 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20  >zTrace ){.     
dab0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
dac0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d  ult(interp, pDb-
dad0: 3e 7a 54 72 61 63 65 2c 20 30 29 3b 0a 20 20 20  >zTrace, 0);.   
dae0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
daf0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 72 61        char *zTra
db00: 63 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65  ce;.      int le
db10: 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  n;.      if( pDb
db20: 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20 20 20  ->zTrace ){.    
db30: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
db40: 2d 3e 7a 54 72 61 63 65 29 3b 0a 20 20 20 20 20  ->zTrace);.     
db50: 20 7d 0a 20 20 20 20 20 20 7a 54 72 61 63 65 20   }.      zTrace 
db60: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
db70: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
db80: 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  &len);.      if(
db90: 20 7a 54 72 61 63 65 20 26 26 20 6c 65 6e 3e 30   zTrace && len>0
dba0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
dbb0: 3e 7a 54 72 61 63 65 20 3d 20 54 63 6c 5f 41 6c  >zTrace = Tcl_Al
dbc0: 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a  loc( len + 1 );.
dbd0: 20 20 20 20 20 20 20 20 73 74 72 63 70 79 28 70          strcpy(p
dbe0: 44 62 2d 3e 7a 54 72 61 63 65 2c 20 7a 54 72 61  Db->zTrace, zTra
dbf0: 63 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ce);.      }else
dc00: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
dc10: 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 20 20 20  Trace = 0;.     
dc20: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
dc30: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20 20  E_OMIT_TRACE.   
dc40: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61     if( pDb->zTra
dc50: 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  ce ){.        pD
dc60: 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65  b->interp = inte
dc70: 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  rp;.        sqli
dc80: 74 65 33 5f 74 72 61 63 65 28 70 44 62 2d 3e 64  te3_trace(pDb->d
dc90: 62 2c 20 44 62 54 72 61 63 65 48 61 6e 64 6c 65  b, DbTraceHandle
dca0: 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d  r, pDb);.      }
dcb0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
dcc0: 6c 69 74 65 33 5f 74 72 61 63 65 28 70 44 62 2d  lite3_trace(pDb-
dcd0: 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  >db, 0, 0);.    
dce0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
dcf0: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
dd00: 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 74 72 61  .  /*    $db tra
dd10: 6e 73 61 63 74 69 6f 6e 20 5b 2d 64 65 66 65 72  nsaction [-defer
dd20: 72 65 64 7c 2d 69 6d 6d 65 64 69 61 74 65 7c 2d  red|-immediate|-
dd30: 65 78 63 6c 75 73 69 76 65 5d 20 53 43 52 49 50  exclusive] SCRIP
dd40: 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 74 61 72  T.  **.  ** Star
dd50: 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74  t a new transact
dd60: 69 6f 6e 20 28 69 66 20 77 65 20 61 72 65 20 6e  ion (if we are n
dd70: 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  ot already in th
dd80: 65 20 6d 69 64 73 74 20 6f 66 20 61 0a 20 20 2a  e midst of a.  *
dd90: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 20 61  * transaction) a
dda0: 6e 64 20 65 78 65 63 75 74 65 20 74 68 65 20 54  nd execute the T
ddb0: 43 4c 20 73 63 72 69 70 74 20 53 43 52 49 50 54  CL script SCRIPT
ddc0: 2e 20 20 41 66 74 65 72 20 53 43 52 49 50 54 0a  .  After SCRIPT.
ddd0: 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 73 2c 20    ** completes, 
dde0: 65 69 74 68 65 72 20 63 6f 6d 6d 69 74 20 74 68  either commit th
ddf0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72  e transaction or
de00: 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 69 66   roll it back if
de10: 20 53 43 52 49 50 54 0a 20 20 2a 2a 20 74 68 72   SCRIPT.  ** thr
de20: 6f 77 73 20 61 6e 20 65 78 63 65 70 74 69 6f 6e  ows an exception
de30: 2e 20 20 4f 72 20 69 66 20 6e 6f 20 6e 65 77 20  .  Or if no new 
de40: 74 72 61 6e 73 61 74 69 6f 6e 20 77 61 73 20 73  transation was s
de50: 74 61 72 74 65 64 2c 20 64 6f 20 6e 6f 74 68 69  tarted, do nothi
de60: 6e 67 2e 0a 20 20 2a 2a 20 70 61 73 73 20 74 68  ng..  ** pass th
de70: 65 20 65 78 63 65 70 74 69 6f 6e 20 6f 6e 20 75  e exception on u
de80: 70 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 2a  p the stack..  *
de90: 2a 0a 20 20 2a 2a 20 54 68 69 73 20 63 6f 6d 6d  *.  ** This comm
dea0: 61 6e 64 20 77 61 73 20 69 6e 73 70 69 72 65 64  and was inspired
deb0: 20 62 79 20 44 61 76 65 20 54 68 6f 6d 61 73 27   by Dave Thomas'
dec0: 73 20 74 61 6c 6b 20 6f 6e 20 52 75 62 79 20 61  s talk on Ruby a
ded0: 74 20 74 68 65 0a 20 20 2a 2a 20 32 30 30 35 20  t the.  ** 2005 
dee0: 4f 27 52 65 69 6c 6c 79 20 4f 70 65 6e 20 53 6f  O'Reilly Open So
def0: 75 72 63 65 20 43 6f 6e 76 65 6e 74 69 6f 6e 20  urce Convention 
df00: 28 4f 53 43 4f 4e 29 2e 0a 20 20 2a 2f 0a 20 20  (OSCON)..  */.  
df10: 63 61 73 65 20 44 42 5f 54 52 41 4e 53 41 43 54  case DB_TRANSACT
df20: 49 4f 4e 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69  ION: {.    int i
df30: 6e 54 72 61 6e 73 3b 0a 20 20 20 20 54 63 6c 5f  nTrans;.    Tcl_
df40: 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 0a 20 20  Obj *pScript;.  
df50: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42    const char *zB
df60: 65 67 69 6e 20 3d 20 22 42 45 47 49 4e 22 3b 0a  egin = "BEGIN";.
df70: 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20      if( objc!=3 
df80: 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  && objc!=4 ){.  
df90: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
dfa0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
dfb0: 6f 62 6a 76 2c 20 22 5b 54 59 50 45 5d 20 53 43  objv, "[TYPE] SC
dfc0: 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65  RIPT");.      re
dfd0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
dfe0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62      }.    if( ob
dff0: 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 70  jc==3 ){.      p
e000: 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 32 5d  Script = objv[2]
e010: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ;.    } else {. 
e020: 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
e030: 74 20 63 68 61 72 20 2a 54 54 59 50 45 5f 73 74  t char *TTYPE_st
e040: 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  rs[] = {.       
e050: 20 22 64 65 66 65 72 72 65 64 22 2c 20 20 20 22   "deferred",   "
e060: 65 78 63 6c 75 73 69 76 65 22 2c 20 20 22 69 6d  exclusive",  "im
e070: 6d 65 64 69 61 74 65 22 2c 20 30 0a 20 20 20 20  mediate", 0.    
e080: 20 20 7d 3b 0a 20 20 20 20 20 20 65 6e 75 6d 20    };.      enum 
e090: 54 54 59 50 45 5f 65 6e 75 6d 20 7b 0a 20 20 20  TTYPE_enum {.   
e0a0: 20 20 20 20 20 54 54 59 50 45 5f 44 45 46 45 52       TTYPE_DEFER
e0b0: 52 45 44 2c 20 54 54 59 50 45 5f 45 58 43 4c 55  RED, TTYPE_EXCLU
e0c0: 53 49 56 45 2c 20 54 54 59 50 45 5f 49 4d 4d 45  SIVE, TTYPE_IMME
e0d0: 44 49 41 54 45 0a 20 20 20 20 20 20 7d 3b 0a 20  DIATE.      };. 
e0e0: 20 20 20 20 20 69 6e 74 20 74 74 79 70 65 3b 0a       int ttype;.
e0f0: 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65        if( Tcl_Ge
e100: 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e  tIndexFromObj(in
e110: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 54  terp, objv[2], T
e120: 54 59 50 45 5f 73 74 72 73 2c 20 22 74 72 61 6e  TYPE_strs, "tran
e130: 73 61 63 74 69 6f 6e 20 74 79 70 65 22 2c 0a 20  saction type",. 
e140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e150: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
e160: 26 74 74 79 70 65 29 20 29 7b 0a 20 20 20 20 20  &ttype) ){.     
e170: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
e180: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
e190: 20 20 20 73 77 69 74 63 68 28 20 28 65 6e 75 6d     switch( (enum
e1a0: 20 54 54 59 50 45 5f 65 6e 75 6d 29 74 74 79 70   TTYPE_enum)ttyp
e1b0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73  e ){.        cas
e1c0: 65 20 54 54 59 50 45 5f 44 45 46 45 52 52 45 44  e TTYPE_DEFERRED
e1d0: 3a 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f  :    /* no-op */
e1e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e1f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
e200: 20 63 61 73 65 20 54 54 59 50 45 5f 45 58 43 4c   case TTYPE_EXCL
e210: 55 53 49 56 45 3a 20 20 20 7a 42 65 67 69 6e 20  USIVE:   zBegin 
e220: 3d 20 22 42 45 47 49 4e 20 45 58 43 4c 55 53 49  = "BEGIN EXCLUSI
e230: 56 45 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  VE";  break;.   
e240: 20 20 20 20 20 63 61 73 65 20 54 54 59 50 45 5f       case TTYPE_
e250: 49 4d 4d 45 44 49 41 54 45 3a 20 20 20 7a 42 65  IMMEDIATE:   zBe
e260: 67 69 6e 20 3d 20 22 42 45 47 49 4e 20 49 4d 4d  gin = "BEGIN IMM
e270: 45 44 49 41 54 45 22 3b 20 20 62 72 65 61 6b 3b  EDIATE";  break;
e280: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
e290: 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 33 5d  Script = objv[3]
e2a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 6e 54 72  ;.    }.    inTr
e2b0: 61 6e 73 20 3d 20 21 73 71 6c 69 74 65 33 5f 67  ans = !sqlite3_g
e2c0: 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 70 44  et_autocommit(pD
e2d0: 62 2d 3e 64 62 29 3b 0a 20 20 20 20 69 66 28 20  b->db);.    if( 
e2e0: 21 69 6e 54 72 61 6e 73 20 29 7b 0a 20 20 20 20  !inTrans ){.    
e2f0: 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70    sqlite3_exec(p
e300: 44 62 2d 3e 64 62 2c 20 7a 42 65 67 69 6e 2c 20  Db->db, zBegin, 
e310: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  0, 0, 0);.    }.
e320: 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61      rc = Tcl_Eva
e330: 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 70  lObjEx(interp, p
e340: 53 63 72 69 70 74 2c 20 30 29 3b 0a 20 20 20 20  Script, 0);.    
e350: 69 66 28 20 21 69 6e 54 72 61 6e 73 20 29 7b 0a  if( !inTrans ){.
e360: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
e370: 20 2a 7a 45 6e 64 3b 0a 20 20 20 20 20 20 69 66   *zEnd;.      if
e380: 28 20 72 63 3d 3d 54 43 4c 5f 45 52 52 4f 52 20  ( rc==TCL_ERROR 
e390: 29 7b 0a 20 20 20 20 20 20 20 20 7a 45 6e 64 20  ){.        zEnd 
e3a0: 3d 20 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20  = "ROLLBACK";.  
e3b0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
e3c0: 20 20 20 20 20 7a 45 6e 64 20 3d 20 22 43 4f 4d       zEnd = "COM
e3d0: 4d 49 54 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20  MIT";.      }.  
e3e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63      sqlite3_exec
e3f0: 28 70 44 62 2d 3e 64 62 2c 20 7a 45 6e 64 2c 20  (pDb->db, zEnd, 
e400: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  0, 0, 0);.    }.
e410: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
e420: 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62    /*.  **    $db
e430: 20 75 70 64 61 74 65 5f 68 6f 6f 6b 20 3f 73 63   update_hook ?sc
e440: 72 69 70 74 3f 0a 20 20 2a 2a 20 20 20 20 24 64  ript?.  **    $d
e450: 62 20 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 20  b rollback_hook 
e460: 3f 73 63 72 69 70 74 3f 0a 20 20 2a 2f 0a 20 20  ?script?.  */.  
e470: 63 61 73 65 20 44 42 5f 55 50 44 41 54 45 5f 48  case DB_UPDATE_H
e480: 4f 4f 4b 3a 20 0a 20 20 63 61 73 65 20 44 42 5f  OOK: .  case DB_
e490: 52 4f 4c 4c 42 41 43 4b 5f 48 4f 4f 4b 3a 20 7b  ROLLBACK_HOOK: {
e4a0: 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 70 70 48  ..    /* set ppH
e4b0: 6f 6f 6b 20 74 6f 20 70 6f 69 6e 74 20 61 74 20  ook to point at 
e4c0: 70 55 70 64 61 74 65 48 6f 6f 6b 20 6f 72 20 70  pUpdateHook or p
e4d0: 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 2c 20 64 65  RollbackHook, de
e4e0: 70 65 6e 64 69 6e 67 20 6f 6e 20 0a 20 20 20 20  pending on .    
e4f0: 2a 2a 20 77 68 65 74 68 65 72 20 5b 24 64 62 20  ** whether [$db 
e500: 75 70 64 61 74 65 5f 68 6f 6f 6b 5d 20 6f 72 20  update_hook] or 
e510: 5b 24 64 62 20 72 6f 6c 6c 62 61 63 6b 5f 68 6f  [$db rollback_ho
e520: 6f 6b 5d 20 77 61 73 20 69 6e 76 6f 6b 65 64 2e  ok] was invoked.
e530: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  .    */.    Tcl_
e540: 4f 62 6a 20 2a 2a 70 70 48 6f 6f 6b 3b 20 0a 20  Obj **ppHook; . 
e550: 20 20 20 69 66 28 20 63 68 6f 69 63 65 3d 3d 44     if( choice==D
e560: 42 5f 55 50 44 41 54 45 5f 48 4f 4f 4b 20 29 7b  B_UPDATE_HOOK ){
e570: 0a 20 20 20 20 20 20 70 70 48 6f 6f 6b 20 3d 20  .      ppHook = 
e580: 26 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f  &pDb->pUpdateHoo
e590: 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  k;.    }else{.  
e5a0: 20 20 20 20 70 70 48 6f 6f 6b 20 3d 20 26 70 44      ppHook = &pD
e5b0: 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b  b->pRollbackHook
e5c0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
e5d0: 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63   objc!=2 && objc
e5e0: 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 54 63  !=3 ){.       Tc
e5f0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
e600: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
e610: 22 3f 53 43 52 49 50 54 3f 22 29 3b 0a 20 20 20  "?SCRIPT?");.   
e620: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
e630: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
e640: 69 66 28 20 2a 70 70 48 6f 6f 6b 20 29 7b 0a 20  if( *ppHook ){. 
e650: 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52       Tcl_SetObjR
e660: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 2a 70  esult(interp, *p
e670: 70 48 6f 6f 6b 29 3b 0a 20 20 20 20 20 20 69 66  pHook);.      if
e680: 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20  ( objc==3 ){.   
e690: 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66       Tcl_DecrRef
e6a0: 43 6f 75 6e 74 28 2a 70 70 48 6f 6f 6b 29 3b 0a  Count(*ppHook);.
e6b0: 20 20 20 20 20 20 20 20 2a 70 70 48 6f 6f 6b 20          *ppHook 
e6c0: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
e6d0: 20 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d   }.    if( objc=
e6e0: 3d 33 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =3 ){.      asse
e6f0: 72 74 28 20 21 28 2a 70 70 48 6f 6f 6b 29 20 29  rt( !(*ppHook) )
e700: 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f  ;.      if( Tcl_
e710: 47 65 74 43 68 61 72 4c 65 6e 67 74 68 28 6f 62  GetCharLength(ob
e720: 6a 76 5b 32 5d 29 3e 30 20 29 7b 0a 20 20 20 20  jv[2])>0 ){.    
e730: 20 20 20 20 2a 70 70 48 6f 6f 6b 20 3d 20 6f 62      *ppHook = ob
e740: 6a 76 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20 54  jv[2];.        T
e750: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
e760: 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20 20 20 20 20  *ppHook);.      
e770: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c  }.    }..    sql
e780: 69 74 65 33 5f 75 70 64 61 74 65 5f 68 6f 6f 6b  ite3_update_hook
e790: 28 70 44 62 2d 3e 64 62 2c 20 28 70 44 62 2d 3e  (pDb->db, (pDb->
e7a0: 70 55 70 64 61 74 65 48 6f 6f 6b 3f 44 62 55 70  pUpdateHook?DbUp
e7b0: 64 61 74 65 48 61 6e 64 6c 65 72 3a 30 29 2c 20  dateHandler:0), 
e7c0: 70 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pDb);.    sqlite
e7d0: 33 5f 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28  3_rollback_hook(
e7e0: 70 44 62 2d 3e 64 62 2c 28 70 44 62 2d 3e 70 52  pDb->db,(pDb->pR
e7f0: 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3f 44 62 52 6f  ollbackHook?DbRo
e800: 6c 6c 62 61 63 6b 48 61 6e 64 6c 65 72 3a 30 29  llbackHandler:0)
e810: 2c 70 44 62 29 3b 0a 0a 20 20 20 20 62 72 65 61  ,pDb);..    brea
e820: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20  k;.  }..  /*    
e830: 24 64 62 20 76 65 72 73 69 6f 6e 0a 20 20 2a 2a  $db version.  **
e840: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  .  ** Return the
e850: 20 76 65 72 73 69 6f 6e 20 73 74 72 69 6e 67 20   version string 
e860: 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73  for this databas
e870: 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  e..  */.  case D
e880: 42 5f 56 45 52 53 49 4f 4e 3a 20 7b 0a 20 20 20  B_VERSION: {.   
e890: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
e8a0: 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73  nterp, (char *)s
e8b0: 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f  qlite3_libversio
e8c0: 6e 28 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  n(), TCL_STATIC)
e8d0: 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
e8e0: 0a 0a 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 6f 66  ...  } /* End of
e8f0: 20 74 68 65 20 53 57 49 54 43 48 20 73 74 61 74   the SWITCH stat
e900: 65 6d 65 6e 74 20 2a 2f 0a 20 20 72 65 74 75 72  ement */.  retur
e910: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20  n rc;.}../*.**  
e920: 20 73 71 6c 69 74 65 33 20 44 42 4e 41 4d 45 20   sqlite3 DBNAME 
e930: 46 49 4c 45 4e 41 4d 45 20 3f 4d 4f 44 45 3f 20  FILENAME ?MODE? 
e940: 3f 2d 6b 65 79 20 4b 45 59 3f 0a 2a 2a 0a 2a 2a  ?-key KEY?.**.**
e950: 20 54 68 69 73 20 69 73 20 74 68 65 20 6d 61 69   This is the mai
e960: 6e 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 2e 20 20  n Tcl command.  
e970: 57 68 65 6e 20 74 68 65 20 22 73 71 6c 69 74 65  When the "sqlite
e980: 22 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 69 73  " Tcl command is
e990: 0a 2a 2a 20 69 6e 76 6f 6b 65 64 2c 20 74 68 69  .** invoked, thi
e9a0: 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20 74  s routine runs t
e9b0: 6f 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63  o process that c
e9c0: 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  ommand..**.** Th
e9d0: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
e9e0: 2c 20 44 42 4e 41 4d 45 2c 20 69 73 20 61 6e 20  , DBNAME, is an 
e9f0: 61 72 62 69 74 72 61 72 79 20 6e 61 6d 65 20 66  arbitrary name f
ea00: 6f 72 20 61 20 6e 65 77 0a 2a 2a 20 64 61 74 61  or a new.** data
ea10: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
ea20: 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 63    This command c
ea30: 72 65 61 74 65 73 20 61 20 6e 65 77 20 63 6f 6d  reates a new com
ea40: 6d 61 6e 64 20 6e 61 6d 65 64 0a 2a 2a 20 44 42  mand named.** DB
ea50: 4e 41 4d 45 20 74 68 61 74 20 69 73 20 75 73 65  NAME that is use
ea60: 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 61  d to control tha
ea70: 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 54  t connection.  T
ea80: 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63  he database.** c
ea90: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 64 65 6c  onnection is del
eaa0: 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 44 42  eted when the DB
eab0: 4e 41 4d 45 20 63 6f 6d 6d 61 6e 64 20 69 73 20  NAME command is 
eac0: 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  deleted..**.** T
ead0: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
eae0: 6e 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  nt is the name o
eaf0: 66 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  f the directory 
eb00: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  that contains.**
eb10: 20 74 68 65 20 73 71 6c 69 74 65 20 64 61 74 61   the sqlite data
eb20: 62 61 73 65 20 74 68 61 74 20 69 73 20 74 6f 20  base that is to 
eb30: 62 65 20 61 63 63 65 73 73 65 64 2e 0a 2a 2a 0a  be accessed..**.
eb40: 2a 2a 20 46 6f 72 20 74 65 73 74 69 6e 67 20 70  ** For testing p
eb50: 75 72 70 6f 73 65 73 2c 20 77 65 20 61 6c 73 6f  urposes, we also
eb60: 20 73 75 70 70 6f 72 74 20 74 68 65 20 66 6f 6c   support the fol
eb70: 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 73  lowing:.**.**  s
eb80: 71 6c 69 74 65 33 20 2d 65 6e 63 6f 64 69 6e 67  qlite3 -encoding
eb90: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 52 65 74  .**.**       Ret
eba0: 75 72 6e 20 74 68 65 20 65 6e 63 6f 64 69 6e 67  urn the encoding
ebb0: 20 75 73 65 64 20 62 79 20 4c 49 4b 45 20 61 6e   used by LIKE an
ebc0: 64 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 73  d GLOB operators
ebd0: 2e 20 20 43 68 6f 69 63 65 73 0a 2a 2a 20 20 20  .  Choices.**   
ebe0: 20 20 20 20 61 72 65 20 55 54 46 2d 38 20 61 6e      are UTF-8 an
ebf0: 64 20 69 73 6f 38 38 35 39 2e 0a 2a 2a 0a 2a 2a  d iso8859..**.**
ec00: 20 20 73 71 6c 69 74 65 33 20 2d 76 65 72 73 69    sqlite3 -versi
ec10: 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 52  on.**.**       R
ec20: 65 74 75 72 6e 20 74 68 65 20 76 65 72 73 69 6f  eturn the versio
ec30: 6e 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  n number of the 
ec40: 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 2e 0a  SQLite library..
ec50: 2a 2a 0a 2a 2a 20 20 73 71 6c 69 74 65 33 20 2d  **.**  sqlite3 -
ec60: 74 63 6c 2d 75 73 65 73 2d 75 74 66 0a 2a 2a 0a  tcl-uses-utf.**.
ec70: 2a 2a 20 20 20 20 20 20 20 52 65 74 75 72 6e 20  **       Return 
ec80: 22 31 22 20 69 66 20 63 6f 6d 70 69 6c 65 64 20  "1" if compiled 
ec90: 77 69 74 68 20 61 20 54 63 6c 20 75 73 65 73 20  with a Tcl uses 
eca0: 55 54 46 2d 38 2e 20 20 52 65 74 75 72 6e 20 22  UTF-8.  Return "
ecb0: 30 22 20 69 66 0a 2a 2a 20 20 20 20 20 20 20 6e  0" if.**       n
ecc0: 6f 74 2e 20 20 55 73 65 64 20 62 79 20 74 65 73  ot.  Used by tes
ecd0: 74 73 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ts to make sure 
ece0: 74 68 65 20 6c 69 62 72 61 72 79 20 77 61 73 20  the library was 
ecf0: 63 6f 6d 70 69 6c 65 64 20 0a 2a 2a 20 20 20 20  compiled .**    
ed00: 20 20 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f     correctly..*/
ed10: 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 4d 61  .static int DbMa
ed20: 69 6e 28 76 6f 69 64 20 2a 63 64 2c 20 54 63 6c  in(void *cd, Tcl
ed30: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
ed40: 20 69 6e 74 20 6f 62 6a 63 2c 54 63 6c 5f 4f 62   int objc,Tcl_Ob
ed50: 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76 29 7b 0a  j *const*objv){.
ed60: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 3b 0a 20    SqliteDb *p;. 
ed70: 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d 20 30 3b   void *pKey = 0;
ed80: 0a 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20 30 3b  .  int nKey = 0;
ed90: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
eda0: 41 72 67 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72  Arg;.  char *zEr
edb0: 72 4d 73 67 3b 0a 20 20 63 6f 6e 73 74 20 63 68  rMsg;.  const ch
edc0: 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 69 66 28  ar *zFile;.  if(
edd0: 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20   objc==2 ){.    
ede0: 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65 74 53 74  zArg = Tcl_GetSt
edf0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
ee00: 5b 31 5d 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  [1], 0);.    if(
ee10: 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 76   strcmp(zArg,"-v
ee20: 65 72 73 69 6f 6e 22 29 3d 3d 30 20 29 7b 0a 20  ersion")==0 ){. 
ee30: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
ee40: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 73 71 6c  esult(interp,sql
ee50: 69 74 65 33 5f 76 65 72 73 69 6f 6e 2c 30 29 3b  ite3_version,0);
ee60: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
ee70: 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  L_OK;.    }.    
ee80: 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c  if( strcmp(zArg,
ee90: 22 2d 68 61 73 2d 63 6f 64 65 63 22 29 3d 3d 30  "-has-codec")==0
eea0: 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   ){.#ifdef SQLIT
eeb0: 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20  E_HAS_CODEC.    
eec0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
eed0: 6c 74 28 69 6e 74 65 72 70 2c 22 31 22 2c 30 29  lt(interp,"1",0)
eee0: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 54 63  ;.#else.      Tc
eef0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
ef00: 6e 74 65 72 70 2c 22 30 22 2c 30 29 3b 0a 23 65  nterp,"0",0);.#e
ef10: 6e 64 69 66 0a 20 20 20 20 20 20 72 65 74 75 72  ndif.      retur
ef20: 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  n TCL_OK;.    }.
ef30: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
ef40: 41 72 67 2c 22 2d 74 63 6c 2d 75 73 65 73 2d 75  Arg,"-tcl-uses-u
ef50: 74 66 22 29 3d 3d 30 20 29 7b 0a 23 69 66 64 65  tf")==0 ){.#ifde
ef60: 66 20 54 43 4c 5f 55 54 46 5f 4d 41 58 0a 20 20  f TCL_UTF_MAX.  
ef70: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
ef80: 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 31 22 2c  sult(interp,"1",
ef90: 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  0);.#else.      
efa0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
efb0: 28 69 6e 74 65 72 70 2c 22 30 22 2c 30 29 3b 0a  (interp,"0",0);.
efc0: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 65 74  #endif.      ret
efd0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20  urn TCL_OK;.    
efe0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63  }.  }.  if( objc
eff0: 3d 3d 35 20 7c 7c 20 6f 62 6a 63 3d 3d 36 20 29  ==5 || objc==6 )
f000: 7b 0a 20 20 20 20 7a 41 72 67 20 3d 20 54 63 6c  {.    zArg = Tcl
f010: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
f020: 6a 28 6f 62 6a 76 5b 6f 62 6a 63 2d 32 5d 2c 20  j(objv[objc-2], 
f030: 30 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63  0);.    if( strc
f040: 6d 70 28 7a 41 72 67 2c 22 2d 6b 65 79 22 29 3d  mp(zArg,"-key")=
f050: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4b 65 79  =0 ){.      pKey
f060: 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72   = Tcl_GetByteAr
f070: 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  rayFromObj(objv[
f080: 6f 62 6a 63 2d 31 5d 2c 20 26 6e 4b 65 79 29 3b  objc-1], &nKey);
f090: 0a 20 20 20 20 20 20 6f 62 6a 63 20 2d 3d 20 32  .      objc -= 2
f0a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
f0b0: 28 20 6f 62 6a 63 21 3d 33 20 26 26 20 6f 62 6a  ( objc!=3 && obj
f0c0: 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=4 ){.    Tcl_
f0d0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
f0e0: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 0a 23  erp, 1, objv, .#
f0f0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
f100: 5f 43 4f 44 45 43 0a 20 20 20 20 20 20 22 48 41  _CODEC.      "HA
f110: 4e 44 4c 45 20 46 49 4c 45 4e 41 4d 45 20 3f 2d  NDLE FILENAME ?-
f120: 6b 65 79 20 43 4f 44 45 43 2d 4b 45 59 3f 22 0a  key CODEC-KEY?".
f130: 23 65 6c 73 65 0a 20 20 20 20 20 20 22 48 41 4e  #else.      "HAN
f140: 44 4c 45 20 46 49 4c 45 4e 41 4d 45 20 3f 4d 4f  DLE FILENAME ?MO
f150: 44 45 3f 22 0a 23 65 6e 64 69 66 0a 20 20 20 20  DE?".#endif.    
f160: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
f170: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a  L_ERROR;.  }.  z
f180: 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70 20  ErrMsg = 0;.  p 
f190: 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 54 63 6c  = (SqliteDb*)Tcl
f1a0: 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  _Alloc( sizeof(*
f1b0: 70 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  p) );.  if( p==0
f1c0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52   ){.    Tcl_SetR
f1d0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6d  esult(interp, "m
f1e0: 61 6c 6c 6f 63 20 66 61 69 6c 65 64 22 2c 20 54  alloc failed", T
f1f0: 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  CL_STATIC);.    
f200: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
f210: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70  ;.  }.  memset(p
f220: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  , 0, sizeof(*p))
f230: 3b 0a 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f  ;.  zFile = Tcl_
f240: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
f250: 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20  (objv[2], 0);.  
f260: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 46 69  sqlite3_open(zFi
f270: 6c 65 2c 20 26 70 2d 3e 64 62 29 3b 0a 20 20 69  le, &p->db);.  i
f280: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
f290: 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 70 2d  lite3_errcode(p-
f2a0: 3e 64 62 29 20 29 7b 0a 20 20 20 20 7a 45 72 72  >db) ){.    zErr
f2b0: 4d 73 67 20 3d 20 73 74 72 64 75 70 28 73 71 6c  Msg = strdup(sql
f2c0: 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64  ite3_errmsg(p->d
f2d0: 62 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  b));.    sqlite3
f2e0: 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 29 3b 0a 20  _close(p->db);. 
f2f0: 20 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20     p->db = 0;.  
f300: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
f310: 48 41 53 5f 43 4f 44 45 43 0a 20 20 73 71 6c 69  HAS_CODEC.  sqli
f320: 74 65 33 5f 6b 65 79 28 70 2d 3e 64 62 2c 20 70  te3_key(p->db, p
f330: 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 23 65 6e 64  Key, nKey);.#end
f340: 69 66 0a 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d  if.  if( p->db==
f350: 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  0 ){.    Tcl_Set
f360: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
f370: 45 72 72 4d 73 67 2c 20 54 43 4c 5f 56 4f 4c 41  ErrMsg, TCL_VOLA
f380: 54 49 4c 45 29 3b 0a 20 20 20 20 54 63 6c 5f 46  TILE);.    Tcl_F
f390: 72 65 65 28 28 63 68 61 72 2a 29 70 29 3b 0a 20  ree((char*)p);. 
f3a0: 20 20 20 66 72 65 65 28 7a 45 72 72 4d 73 67 29     free(zErrMsg)
f3b0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
f3c0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 2d  _ERROR;.  }.  p-
f3d0: 3e 6d 61 78 53 74 6d 74 20 3d 20 4e 55 4d 5f 50  >maxStmt = NUM_P
f3e0: 52 45 50 41 52 45 44 5f 53 54 4d 54 53 3b 0a 20  REPARED_STMTS;. 
f3f0: 20 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65 74 53   zArg = Tcl_GetS
f400: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
f410: 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 54 63 6c 5f  v[1], 0);.  Tcl_
f420: 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
f430: 28 69 6e 74 65 72 70 2c 20 7a 41 72 67 2c 20 44  (interp, zArg, D
f440: 62 4f 62 6a 43 6d 64 2c 20 28 63 68 61 72 2a 29  bObjCmd, (char*)
f450: 70 2c 20 44 62 44 65 6c 65 74 65 43 6d 64 29 3b  p, DbDeleteCmd);
f460: 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6d 70 69 6c  ..  /* If compil
f470: 65 64 20 77 69 74 68 20 53 51 4c 49 54 45 5f 54  ed with SQLITE_T
f480: 45 53 54 20 74 75 72 6e 65 64 20 6f 6e 2c 20 74  EST turned on, t
f490: 68 65 6e 20 72 65 67 69 73 74 65 72 20 74 68 65  hen register the
f4a0: 20 22 6d 64 35 73 75 6d 22 0a 20 20 2a 2a 20 53   "md5sum".  ** S
f4b0: 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a  QL function..  *
f4c0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
f4d0: 54 45 53 54 0a 20 20 7b 0a 20 20 20 20 65 78 74  TEST.  {.    ext
f4e0: 65 72 6e 20 76 6f 69 64 20 4d 64 35 5f 52 65 67  ern void Md5_Reg
f4f0: 69 73 74 65 72 28 73 71 6c 69 74 65 33 2a 29 3b  ister(sqlite3*);
f500: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d  .#ifdef SQLITE_M
f510: 45 4d 44 45 42 55 47 0a 20 20 20 20 69 6e 74 20  EMDEBUG.    int 
f520: 6d 61 6c 6c 6f 63 66 61 69 6c 20 3d 20 73 71 6c  mallocfail = sql
f530: 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c  ite3_iMallocFail
f540: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 4d  ;.    sqlite3_iM
f550: 61 6c 6c 6f 63 46 61 69 6c 20 3d 20 30 3b 0a 23  allocFail = 0;.#
f560: 65 6e 64 69 66 0a 20 20 20 20 4d 64 35 5f 52 65  endif.    Md5_Re
f570: 67 69 73 74 65 72 28 70 2d 3e 64 62 29 3b 0a 23  gister(p->db);.#
f580: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 45 4d  ifdef SQLITE_MEM
f590: 44 45 42 55 47 0a 20 20 20 20 73 71 6c 69 74 65  DEBUG.    sqlite
f5a0: 33 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c 20 3d 20  3_iMallocFail = 
f5b0: 6d 61 6c 6c 6f 63 66 61 69 6c 3b 0a 23 65 6e 64  mallocfail;.#end
f5c0: 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 20 20 0a  if.  }.#endif  .
f5d0: 20 20 70 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e    p->interp = in
f5e0: 74 65 72 70 3b 0a 20 20 72 65 74 75 72 6e 20 54  terp;.  return T
f5f0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
f600: 50 72 6f 76 69 64 65 20 61 20 64 75 6d 6d 79 20  Provide a dummy 
f610: 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 20 69 66  Tcl_InitStubs if
f620: 20 77 65 20 61 72 65 20 75 73 69 6e 67 20 74 68   we are using th
f630: 69 73 20 61 73 20 61 20 73 74 61 74 69 63 0a 2a  is as a static.*
f640: 2a 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69  * library..*/.#i
f650: 66 6e 64 65 66 20 55 53 45 5f 54 43 4c 5f 53 54  fndef USE_TCL_ST
f660: 55 42 53 0a 23 20 75 6e 64 65 66 20 20 54 63 6c  UBS.# undef  Tcl
f670: 5f 49 6e 69 74 53 74 75 62 73 0a 23 20 64 65 66  _InitStubs.# def
f680: 69 6e 65 20 54 63 6c 5f 49 6e 69 74 53 74 75 62  ine Tcl_InitStub
f690: 73 28 61 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a  s(a,b,c).#endif.
f6a0: 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
f6b0: 20 77 65 20 68 61 76 65 20 61 20 50 41 43 4b 41   we have a PACKA
f6c0: 47 45 5f 56 45 52 53 49 4f 4e 20 6d 61 63 72 6f  GE_VERSION macro
f6d0: 20 64 65 66 69 6e 65 64 2e 20 20 54 68 69 73 20   defined.  This 
f6e0: 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 66 69 6e  will be.** defin
f6f0: 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
f700: 20 62 79 20 74 68 65 20 54 45 41 20 6d 61 6b 65   by the TEA make
f710: 66 69 6c 65 2e 20 20 42 75 74 20 6f 74 68 65 72  file.  But other
f720: 20 6d 61 6b 65 66 69 6c 65 73 0a 2a 2a 20 64 6f   makefiles.** do
f730: 20 6e 6f 74 20 64 65 66 69 6e 65 20 69 74 2e 0a   not define it..
f740: 2a 2f 0a 23 69 66 6e 64 65 66 20 50 41 43 4b 41  */.#ifndef PACKA
f750: 47 45 5f 56 45 52 53 49 4f 4e 0a 23 20 64 65 66  GE_VERSION.# def
f760: 69 6e 65 20 50 41 43 4b 41 47 45 5f 56 45 52 53  ine PACKAGE_VERS
f770: 49 4f 4e 20 53 51 4c 49 54 45 5f 56 45 52 53 49  ION SQLITE_VERSI
f780: 4f 4e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  ON.#endif../*.**
f790: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 69 73   Initialize this
f7a0: 20 6d 6f 64 75 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54   module..**.** T
f7b0: 68 69 73 20 54 63 6c 20 6d 6f 64 75 6c 65 20 63  his Tcl module c
f7c0: 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 61 20 73  ontains only a s
f7d0: 69 6e 67 6c 65 20 6e 65 77 20 54 63 6c 20 63 6f  ingle new Tcl co
f7e0: 6d 6d 61 6e 64 20 6e 61 6d 65 64 20 22 73 71 6c  mmand named "sql
f7f0: 69 74 65 22 2e 0a 2a 2a 20 28 48 65 6e 63 65 20  ite"..** (Hence 
f800: 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 61 6d 65  there is no name
f810: 73 70 61 63 65 2e 20 20 54 68 65 72 65 20 69 73  space.  There is
f820: 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 75 73 69   no point in usi
f830: 6e 67 20 61 20 6e 61 6d 65 73 70 61 63 65 0a 2a  ng a namespace.*
f840: 2a 20 69 66 20 74 68 65 20 65 78 74 65 6e 73 69  * if the extensi
f850: 6f 6e 20 6f 6e 6c 79 20 73 75 70 70 6c 69 65 73  on only supplies
f860: 20 6f 6e 65 20 6e 65 77 20 6e 61 6d 65 21 29 20   one new name!) 
f870: 20 54 68 65 20 22 73 71 6c 69 74 65 22 20 63 6f   The "sqlite" co
f880: 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 75 73 65 64  mmand is.** used
f890: 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 53   to open a new S
f8a0: 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e 20  QLite database. 
f8b0: 20 53 65 65 20 74 68 65 20 44 62 4d 61 69 6e 28   See the DbMain(
f8c0: 29 20 72 6f 75 74 69 6e 65 20 61 62 6f 76 65 0a  ) routine above.
f8d0: 2a 2a 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  ** for additiona
f8e0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
f8f0: 2f 0a 45 58 54 45 52 4e 20 69 6e 74 20 53 71 6c  /.EXTERN int Sql
f900: 69 74 65 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  ite3_Init(Tcl_In
f910: 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20  terp *interp){. 
f920: 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 69   Tcl_InitStubs(i
f930: 6e 74 65 72 70 2c 20 22 38 2e 34 22 2c 20 30 29  nterp, "8.4", 0)
f940: 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62  ;.  Tcl_CreateOb
f950: 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
f960: 20 22 73 71 6c 69 74 65 33 22 2c 20 28 54 63 6c   "sqlite3", (Tcl
f970: 5f 4f 62 6a 43 6d 64 50 72 6f 63 2a 29 44 62 4d  _ObjCmdProc*)DbM
f980: 61 69 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 54 63  ain, 0, 0);.  Tc
f990: 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74  l_PkgProvide(int
f9a0: 65 72 70 2c 20 22 73 71 6c 69 74 65 33 22 2c 20  erp, "sqlite3", 
f9b0: 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29  PACKAGE_VERSION)
f9c0: 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62  ;.  Tcl_CreateOb
f9d0: 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
f9e0: 20 22 73 71 6c 69 74 65 22 2c 20 28 54 63 6c 5f   "sqlite", (Tcl_
f9f0: 4f 62 6a 43 6d 64 50 72 6f 63 2a 29 44 62 4d 61  ObjCmdProc*)DbMa
fa00: 69 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c  in, 0, 0);.  Tcl
fa10: 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65  _PkgProvide(inte
fa20: 72 70 2c 20 22 73 71 6c 69 74 65 22 2c 20 50 41  rp, "sqlite", PA
fa30: 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29 3b 0a  CKAGE_VERSION);.
fa40: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
fa50: 0a 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 54 63  .}.EXTERN int Tc
fa60: 6c 73 71 6c 69 74 65 33 5f 49 6e 69 74 28 54 63  lsqlite3_Init(Tc
fa70: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
fa80: 29 7b 20 72 65 74 75 72 6e 20 53 71 6c 69 74 65  ){ return Sqlite
fa90: 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 20  3_Init(interp); 
faa0: 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 53 71 6c  }.EXTERN int Sql
fab0: 69 74 65 33 5f 53 61 66 65 49 6e 69 74 28 54 63  ite3_SafeInit(Tc
fac0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
fad0: 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  ){ return TCL_OK
fae0: 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 54  ; }.EXTERN int T
faf0: 63 6c 73 71 6c 69 74 65 33 5f 53 61 66 65 49 6e  clsqlite3_SafeIn
fb00: 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  it(Tcl_Interp *i
fb10: 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20 54  nterp){ return T
fb20: 43 4c 5f 4f 4b 3b 20 7d 0a 0a 23 69 66 6e 64 65  CL_OK; }..#ifnde
fb30: 66 20 53 51 4c 49 54 45 5f 33 5f 53 55 46 46 49  f SQLITE_3_SUFFI
fb40: 58 5f 4f 4e 4c 59 0a 45 58 54 45 52 4e 20 69 6e  X_ONLY.EXTERN in
fb50: 74 20 53 71 6c 69 74 65 5f 49 6e 69 74 28 54 63  t Sqlite_Init(Tc
fb60: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
fb70: 29 7b 20 72 65 74 75 72 6e 20 53 71 6c 69 74 65  ){ return Sqlite
fb80: 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 20  3_Init(interp); 
fb90: 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 54 63 6c  }.EXTERN int Tcl
fba0: 73 71 6c 69 74 65 5f 49 6e 69 74 28 54 63 6c 5f  sqlite_Init(Tcl_
fbb0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b  Interp *interp){
fbc0: 20 72 65 74 75 72 6e 20 53 71 6c 69 74 65 33 5f   return Sqlite3_
fbd0: 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a  Init(interp); }.
fbe0: 45 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74  EXTERN int Sqlit
fbf0: 65 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49  e_SafeInit(Tcl_I
fc00: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20  nterp *interp){ 
fc10: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d  return TCL_OK; }
fc20: 0a 45 58 54 45 52 4e 20 69 6e 74 20 54 63 6c 73  .EXTERN int Tcls
fc30: 71 6c 69 74 65 5f 53 61 66 65 49 6e 69 74 28 54  qlite_SafeInit(T
fc40: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
fc50: 70 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  p){ return TCL_O
fc60: 4b 3b 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  K; }.#endif..#if
fc70: 64 65 66 20 54 43 4c 53 48 0a 2f 2a 2a 2a 2a 2a  def TCLSH./*****
fc80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fc90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fca0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fcb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fcc0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20  ********.** The 
fcd0: 63 6f 64 65 20 74 68 61 74 20 66 6f 6c 6c 6f 77  code that follow
fce0: 73 20 69 73 20 75 73 65 64 20 74 6f 20 62 75 69  s is used to bui
fcf0: 6c 64 20 73 74 61 6e 64 61 6c 6f 6e 65 20 54 43  ld standalone TC
fd00: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 73 0a 2a  L interpreters.*
fd10: 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  /../*.** If the 
fd20: 6d 61 63 72 6f 20 54 43 4c 53 48 20 69 73 20 6f  macro TCLSH is o
fd30: 6e 65 2c 20 74 68 65 6e 20 70 75 74 20 69 6e 20  ne, then put in 
fd40: 63 6f 64 65 20 74 68 69 73 20 66 6f 72 20 74 68  code this for th
fd50: 65 0a 2a 2a 20 22 6d 61 69 6e 22 20 72 6f 75 74  e.** "main" rout
fd60: 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e  ine that will in
fd70: 69 74 69 61 6c 69 7a 65 20 54 63 6c 20 61 6e 64  itialize Tcl and
fd80: 20 74 61 6b 65 20 69 6e 70 75 74 20 66 72 6f 6d   take input from
fd90: 0a 2a 2a 20 73 74 61 6e 64 61 72 64 20 69 6e 70  .** standard inp
fda0: 75 74 2e 0a 2a 2f 0a 23 69 66 20 54 43 4c 53 48  ut..*/.#if TCLSH
fdb0: 3d 3d 31 0a 73 74 61 74 69 63 20 63 68 61 72 20  ==1.static char 
fdc0: 7a 4d 61 69 6e 6c 6f 6f 70 5b 5d 20 3d 0a 20 20  zMainloop[] =.  
fdd0: 22 73 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e 22 0a  "set line {}\n".
fde0: 20 20 22 77 68 69 6c 65 20 7b 21 5b 65 6f 66 20    "while {![eof 
fdf0: 73 74 64 69 6e 5d 7d 20 7b 5c 6e 22 0a 20 20 20  stdin]} {\n".   
fe00: 20 22 69 66 20 7b 24 6c 69 6e 65 21 3d 5c 22 5c   "if {$line!=\"\
fe10: 22 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22 70  "} {\n".      "p
fe20: 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 5c  uts -nonewline \
fe30: 22 3e 20 5c 22 5c 6e 22 0a 20 20 20 20 22 7d 20  "> \"\n".    "} 
fe40: 65 6c 73 65 20 7b 5c 6e 22 0a 20 20 20 20 20 20  else {\n".      
fe50: 22 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65  "puts -nonewline
fe60: 20 5c 22 25 20 5c 22 5c 6e 22 0a 20 20 20 20 22   \"% \"\n".    "
fe70: 7d 5c 6e 22 0a 20 20 20 20 22 66 6c 75 73 68 20  }\n".    "flush 
fe80: 73 74 64 6f 75 74 5c 6e 22 0a 20 20 20 20 22 61  stdout\n".    "a
fe90: 70 70 65 6e 64 20 6c 69 6e 65 20 5b 67 65 74 73  ppend line [gets
fea0: 20 73 74 64 69 6e 5d 5c 6e 22 0a 20 20 20 20 22   stdin]\n".    "
feb0: 69 66 20 7b 5b 69 6e 66 6f 20 63 6f 6d 70 6c 65  if {[info comple
fec0: 74 65 20 24 6c 69 6e 65 5d 7d 20 7b 5c 6e 22 0a  te $line]} {\n".
fed0: 20 20 20 20 20 20 22 69 66 20 7b 5b 63 61 74 63        "if {[catc
fee0: 68 20 7b 75 70 6c 65 76 65 6c 20 23 30 20 24 6c  h {uplevel #0 $l
fef0: 69 6e 65 7d 20 72 65 73 75 6c 74 5d 7d 20 7b 5c  ine} result]} {\
ff00: 6e 22 0a 20 20 20 20 20 20 20 20 22 70 75 74 73  n".        "puts
ff10: 20 73 74 64 65 72 72 20 5c 22 45 72 72 6f 72 3a   stderr \"Error:
ff20: 20 24 72 65 73 75 6c 74 5c 22 5c 6e 22 0a 20 20   $result\"\n".  
ff30: 20 20 20 20 22 7d 20 65 6c 73 65 69 66 20 7b 24      "} elseif {$
ff40: 72 65 73 75 6c 74 21 3d 5c 22 5c 22 7d 20 7b 5c  result!=\"\"} {\
ff50: 6e 22 0a 20 20 20 20 20 20 20 20 22 70 75 74 73  n".        "puts
ff60: 20 24 72 65 73 75 6c 74 5c 6e 22 0a 20 20 20 20   $result\n".    
ff70: 20 20 22 7d 5c 6e 22 0a 20 20 20 20 20 20 22 73    "}\n".      "s
ff80: 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e 22 0a 20 20  et line {}\n".  
ff90: 20 20 22 7d 20 65 6c 73 65 20 7b 5c 6e 22 0a 20    "} else {\n". 
ffa0: 20 20 20 20 20 22 61 70 70 65 6e 64 20 6c 69 6e       "append lin
ffb0: 65 20 5c 5c 6e 5c 6e 22 0a 20 20 20 20 22 7d 5c  e \\n\n".    "}\
ffc0: 6e 22 0a 20 20 22 7d 5c 6e 22 0a 3b 0a 23 65 6e  n".  "}\n".;.#en
ffd0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  dif../*.** If th
ffe0: 65 20 6d 61 63 72 6f 20 54 43 4c 53 48 20 69 73  e macro TCLSH is
fff0: 20 74 77 6f 2c 20 74 68 65 6e 20 67 65 74 20 74   two, then get t
10000 68 65 20 6d 61 69 6e 20 6c 6f 6f 70 20 63 6f 64  he main loop cod
10010 65 20 6f 75 74 20 6f 66 0a 2a 2a 20 74 68 65 20  e out of.** the 
10020 73 65 70 61 72 61 74 65 20 66 69 6c 65 20 22 73  separate file "s
10030 70 61 63 65 61 6e 61 6c 5f 74 63 6c 2e 68 22 2e  paceanal_tcl.h".
10040 0a 2a 2f 0a 23 69 66 20 54 43 4c 53 48 3d 3d 32  .*/.#if TCLSH==2
10050 0a 73 74 61 74 69 63 20 63 68 61 72 20 7a 4d 61  .static char zMa
10060 69 6e 6c 6f 6f 70 5b 5d 20 3d 20 0a 23 69 6e 63  inloop[] = .#inc
10070 6c 75 64 65 20 22 73 70 61 63 65 61 6e 61 6c 5f  lude "spaceanal_
10080 74 63 6c 2e 68 22 0a 3b 0a 23 65 6e 64 69 66 0a  tcl.h".;.#endif.
10090 0a 23 64 65 66 69 6e 65 20 54 43 4c 53 48 5f 4d  .#define TCLSH_M
100a0 41 49 4e 20 6d 61 69 6e 20 20 20 2f 2a 20 4e 65  AIN main   /* Ne
100b0 65 64 65 64 20 74 6f 20 66 61 6b 65 20 6f 75 74  eded to fake out
100c0 20 6d 6b 74 63 6c 61 70 70 20 2a 2f 0a 69 6e 74   mktclapp */.int
100d0 20 54 43 4c 53 48 5f 4d 41 49 4e 28 69 6e 74 20   TCLSH_MAIN(int 
100e0 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67  argc, char **arg
100f0 76 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  v){.  Tcl_Interp
10100 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f   *interp;.  Tcl_
10110 46 69 6e 64 45 78 65 63 75 74 61 62 6c 65 28 61  FindExecutable(a
10120 72 67 76 5b 30 5d 29 3b 0a 20 20 69 6e 74 65 72  rgv[0]);.  inter
10130 70 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 49 6e  p = Tcl_CreateIn
10140 74 65 72 70 28 29 3b 0a 20 20 53 71 6c 69 74 65  terp();.  Sqlite
10150 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  3_Init(interp);.
10160 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
10170 53 54 0a 20 20 7b 0a 20 20 20 20 65 78 74 65 72  ST.  {.    exter
10180 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
10190 31 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  1_Init(Tcl_Inter
101a0 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
101b0 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 32 5f  int Sqlitetest2_
101c0 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
101d0 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
101e0 74 20 53 71 6c 69 74 65 74 65 73 74 33 5f 49 6e  t Sqlitetest3_In
101f0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
10200 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
10210 53 71 6c 69 74 65 74 65 73 74 34 5f 49 6e 69 74  Sqlitetest4_Init
10220 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
10230 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
10240 6c 69 74 65 74 65 73 74 35 5f 49 6e 69 74 28 54  litetest5_Init(T
10250 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
10260 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
10270 74 65 74 65 73 74 36 5f 49 6e 69 74 28 54 63 6c  tetest6_Init(Tcl
10280 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
10290 78 74 65 72 6e 20 69 6e 74 20 4d 64 35 5f 49 6e  xtern int Md5_In
102a0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
102b0 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
102c0 53 71 6c 69 74 65 74 65 73 74 73 73 65 5f 49 6e  Sqlitetestsse_In
102d0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
102e0 0a 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ..    Sqlitetest
102f0 31 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  1_Init(interp);.
10300 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 32 5f      Sqlitetest2_
10310 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
10320 20 20 53 71 6c 69 74 65 74 65 73 74 33 5f 49 6e    Sqlitetest3_In
10330 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
10340 53 71 6c 69 74 65 74 65 73 74 34 5f 49 6e 69 74  Sqlitetest4_Init
10350 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
10360 6c 69 74 65 74 65 73 74 35 5f 49 6e 69 74 28 69  litetest5_Init(i
10370 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
10380 74 65 74 65 73 74 36 5f 49 6e 69 74 28 69 6e 74  tetest6_Init(int
10390 65 72 70 29 3b 0a 20 20 20 20 4d 64 35 5f 49 6e  erp);.    Md5_In
103a0 69 74 28 69 6e 74 65 72 70 29 3b 0a 23 69 66 64  it(interp);.#ifd
103b0 65 66 20 53 51 4c 49 54 45 5f 53 53 45 0a 20 20  ef SQLITE_SSE.  
103c0 20 20 53 71 6c 69 74 65 74 65 73 74 73 73 65 5f    Sqlitetestsse_
103d0 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 23 65  Init(interp);.#e
103e0 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ndif.  }.#endif.
103f0 20 20 69 66 28 20 61 72 67 63 3e 3d 32 20 7c 7c    if( argc>=2 ||
10400 20 54 43 4c 53 48 3d 3d 32 20 29 7b 0a 20 20 20   TCLSH==2 ){.   
10410 20 69 6e 74 20 69 3b 0a 20 20 20 20 54 63 6c 5f   int i;.    Tcl_
10420 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 22 61  SetVar(interp,"a
10430 72 67 76 30 22 2c 61 72 67 76 5b 31 5d 2c 54 43  rgv0",argv[1],TC
10440 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a  L_GLOBAL_ONLY);.
10450 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69      Tcl_SetVar(i
10460 6e 74 65 72 70 2c 22 61 72 67 76 22 2c 20 22 22  nterp,"argv", ""
10470 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c  , TCL_GLOBAL_ONL
10480 59 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 33 2d  Y);.    for(i=3-
10490 54 43 4c 53 48 3b 20 69 3c 61 72 67 63 3b 20 69  TCLSH; i<argc; i
104a0 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53  ++){.      Tcl_S
104b0 65 74 56 61 72 28 69 6e 74 65 72 70 2c 20 22 61  etVar(interp, "a
104c0 72 67 76 22 2c 20 61 72 67 76 5b 69 5d 2c 0a 20  rgv", argv[i],. 
104d0 20 20 20 20 20 20 20 20 20 54 43 4c 5f 47 4c 4f           TCL_GLO
104e0 42 41 4c 5f 4f 4e 4c 59 20 7c 20 54 43 4c 5f 4c  BAL_ONLY | TCL_L
104f0 49 53 54 5f 45 4c 45 4d 45 4e 54 20 7c 20 54 43  IST_ELEMENT | TC
10500 4c 5f 41 50 50 45 4e 44 5f 56 41 4c 55 45 29 3b  L_APPEND_VALUE);
10510 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 54  .    }.    if( T
10520 43 4c 53 48 3d 3d 31 20 26 26 20 54 63 6c 5f 45  CLSH==1 && Tcl_E
10530 76 61 6c 46 69 6c 65 28 69 6e 74 65 72 70 2c 20  valFile(interp, 
10540 61 72 67 76 5b 31 5d 29 21 3d 54 43 4c 5f 4f 4b  argv[1])!=TCL_OK
10550 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
10560 63 68 61 72 20 2a 7a 49 6e 66 6f 20 3d 20 54 63  char *zInfo = Tc
10570 6c 5f 47 65 74 56 61 72 28 69 6e 74 65 72 70 2c  l_GetVar(interp,
10580 20 22 65 72 72 6f 72 49 6e 66 6f 22 2c 20 54 43   "errorInfo", TC
10590 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a  L_GLOBAL_ONLY);.
105a0 20 20 20 20 20 20 69 66 28 20 7a 49 6e 66 6f 3d        if( zInfo=
105b0 3d 30 20 29 20 7a 49 6e 66 6f 20 3d 20 69 6e 74  =0 ) zInfo = int
105c0 65 72 70 2d 3e 72 65 73 75 6c 74 3b 0a 20 20 20  erp->result;.   
105d0 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
105e0 72 2c 22 25 73 3a 20 25 73 5c 6e 22 2c 20 2a 61  r,"%s: %s\n", *a
105f0 72 67 76 2c 20 7a 49 6e 66 6f 29 3b 0a 20 20 20  rgv, zInfo);.   
10600 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
10610 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 61 72 67   }.  }.  if( arg
10620 63 3c 3d 31 20 7c 7c 20 54 43 4c 53 48 3d 3d 32  c<=1 || TCLSH==2
10630 20 29 7b 0a 20 20 20 20 54 63 6c 5f 47 6c 6f 62   ){.    Tcl_Glob
10640 61 6c 45 76 61 6c 28 69 6e 74 65 72 70 2c 20 7a  alEval(interp, z
10650 4d 61 69 6e 6c 6f 6f 70 29 3b 0a 20 20 7d 0a 20  Mainloop);.  }. 
10660 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
10670 64 69 66 20 2f 2a 20 54 43 4c 53 48 20 2a 2f 0a  dif /* TCLSH */.
10680 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
10690 6e 65 64 28 4e 4f 5f 54 43 4c 29 20 2a 2f 0a     ned(NO_TCL) */.