/ Hex Artifact Content
Login

Artifact 124f822d6c55c5d95420672bf39fe3ba60ae1f76:


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 33 20 32 30 30 36 2f 30 31 2f 30 33 20 30 30  43 2006/01/03 00
01c0: 3a 33 33 3a 35 30 20 64 72 68 20 45 78 70 20 24  :33:50 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 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 22  "release_memory"
5540: 2c 20 20 20 20 20 22 73 6f 66 74 5f 68 65 61 70  ,     "soft_heap
5550: 5f 6c 69 6d 69 74 22 2c 20 20 20 22 74 69 6d 65  _limit",   "time
5560: 6f 75 74 22 2c 0a 20 20 20 20 22 74 6f 74 61 6c  out",.    "total
5570: 5f 63 68 61 6e 67 65 73 22 2c 20 20 20 20 20 20  _changes",      
5580: 22 74 72 61 63 65 22 2c 20 20 20 20 20 20 20 20  "trace",        
5590: 20 20 20 20 20 22 74 72 61 6e 73 61 63 74 69 6f       "transactio
55a0: 6e 22 2c 0a 20 20 20 20 22 75 70 64 61 74 65 5f  n",.    "update_
55b0: 68 6f 6f 6b 22 2c 20 20 20 20 20 20 20 20 22 76  hook",        "v
55c0: 65 72 73 69 6f 6e 22 2c 20 20 20 20 20 20 20 20  ersion",        
55d0: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
55e0: 20 20 20 20 20 20 20 20 0a 20 20 7d 3b 0a 20 20          .  };.  
55f0: 65 6e 75 6d 20 44 42 5f 65 6e 75 6d 20 7b 0a 20  enum DB_enum {. 
5600: 20 20 20 44 42 5f 41 55 54 48 4f 52 49 5a 45 52     DB_AUTHORIZER
5610: 2c 20 20 20 20 20 20 20 20 44 42 5f 42 55 53 59  ,        DB_BUSY
5620: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 44 42  ,             DB
5630: 5f 43 41 43 48 45 2c 0a 20 20 20 20 44 42 5f 43  _CACHE,.    DB_C
5640: 48 41 4e 47 45 53 2c 20 20 20 20 20 20 20 20 20  HANGES,         
5650: 20 20 44 42 5f 43 4c 4f 53 45 2c 20 20 20 20 20    DB_CLOSE,     
5660: 20 20 20 20 20 20 20 44 42 5f 43 4f 4c 4c 41 54         DB_COLLAT
5670: 45 2c 0a 20 20 20 20 44 42 5f 43 4f 4c 4c 41 54  E,.    DB_COLLAT
5680: 49 4f 4e 5f 4e 45 45 44 45 44 2c 20 20 44 42 5f  ION_NEEDED,  DB_
5690: 43 4f 4d 4d 49 54 5f 48 4f 4f 4b 2c 20 20 20 20  COMMIT_HOOK,    
56a0: 20 20 44 42 5f 43 4f 4d 50 4c 45 54 45 2c 0a 20    DB_COMPLETE,. 
56b0: 20 20 20 44 42 5f 43 4f 50 59 2c 20 20 20 20 20     DB_COPY,     
56c0: 20 20 20 20 20 20 20 20 20 44 42 5f 45 52 52 4f           DB_ERRO
56d0: 52 43 4f 44 45 2c 20 20 20 20 20 20 20 20 44 42  RCODE,        DB
56e0: 5f 45 56 41 4c 2c 0a 20 20 20 20 44 42 5f 45 58  _EVAL,.    DB_EX
56f0: 49 53 54 53 2c 20 20 20 20 20 20 20 20 20 20 20  ISTS,           
5700: 20 44 42 5f 46 55 4e 43 54 49 4f 4e 2c 20 20 20   DB_FUNCTION,   
5710: 20 20 20 20 20 20 44 42 5f 4c 41 53 54 5f 49 4e        DB_LAST_IN
5720: 53 45 52 54 5f 52 4f 57 49 44 2c 0a 20 20 20 20  SERT_ROWID,.    
5730: 44 42 5f 4e 55 4c 4c 56 41 4c 55 45 2c 20 20 20  DB_NULLVALUE,   
5740: 20 20 20 20 20 20 44 42 5f 4f 4e 45 43 4f 4c 55        DB_ONECOLU
5750: 4d 4e 2c 20 20 20 20 20 20 20 20 44 42 5f 50 52  MN,        DB_PR
5760: 4f 46 49 4c 45 2c 0a 20 20 20 20 44 42 5f 50 52  OFILE,.    DB_PR
5770: 4f 47 52 45 53 53 2c 20 20 20 20 20 20 20 20 20  OGRESS,         
5780: 20 44 42 5f 52 45 4b 45 59 2c 20 20 20 20 20 20   DB_REKEY,      
5790: 20 20 20 20 20 20 44 42 5f 52 4f 4c 4c 42 41 43        DB_ROLLBAC
57a0: 4b 5f 48 4f 4f 4b 2c 0a 20 20 20 20 44 42 5f 52  K_HOOK,.    DB_R
57b0: 45 4c 45 41 53 45 5f 4d 45 4d 4f 52 59 2c 20 20  ELEASE_MEMORY,  
57c0: 20 20 44 42 5f 53 4f 46 54 5f 48 45 41 50 5f 4c    DB_SOFT_HEAP_L
57d0: 49 4d 49 54 2c 20 20 44 42 5f 54 49 4d 45 4f 55  IMIT,  DB_TIMEOU
57e0: 54 2c 0a 20 20 20 20 44 42 5f 54 4f 54 41 4c 5f  T,.    DB_TOTAL_
57f0: 43 48 41 4e 47 45 53 2c 20 20 20 20 20 44 42 5f  CHANGES,     DB_
5800: 54 52 41 43 45 2c 20 20 20 20 20 20 20 20 20 20  TRACE,          
5810: 20 20 44 42 5f 54 52 41 4e 53 41 43 54 49 4f 4e    DB_TRANSACTION
5820: 2c 0a 20 20 20 20 44 42 5f 55 50 44 41 54 45 5f  ,.    DB_UPDATE_
5830: 48 4f 4f 4b 2c 20 20 20 20 20 20 20 44 42 5f 56  HOOK,       DB_V
5840: 45 52 53 49 4f 4e 0a 20 20 7d 3b 0a 20 20 2f 2a  ERSION.  };.  /*
5850: 20 64 6f 6e 27 74 20 6c 65 61 76 65 20 74 72 61   don't leave tra
5860: 69 6c 69 6e 67 20 63 6f 6d 6d 61 73 20 6f 6e 20  iling commas on 
5870: 44 42 5f 65 6e 75 6d 2c 20 69 74 20 63 6f 6e 66  DB_enum, it conf
5880: 75 73 65 73 20 74 68 65 20 41 49 58 20 78 6c 63  uses the AIX xlc
5890: 20 63 6f 6d 70 69 6c 65 72 20 2a 2f 0a 0a 20 20   compiler */..  
58a0: 69 66 28 20 6f 62 6a 63 3c 32 20 29 7b 0a 20 20  if( objc<2 ){.  
58b0: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
58c0: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
58d0: 6a 76 2c 20 22 53 55 42 43 4f 4d 4d 41 4e 44 20  jv, "SUBCOMMAND 
58e0: 2e 2e 2e 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ...");.    retur
58f0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
5900: 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
5910: 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  dexFromObj(inter
5920: 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 44 42 5f 73  p, objv[1], DB_s
5930: 74 72 73 2c 20 22 6f 70 74 69 6f 6e 22 2c 20 30  trs, "option", 0
5940: 2c 20 26 63 68 6f 69 63 65 29 20 29 7b 0a 20 20  , &choice) ){.  
5950: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
5960: 4f 52 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63  OR;.  }..  switc
5970: 68 28 20 28 65 6e 75 6d 20 44 42 5f 65 6e 75 6d  h( (enum DB_enum
5980: 29 63 68 6f 69 63 65 20 29 7b 0a 0a 20 20 2f 2a  )choice ){..  /*
5990: 20 20 20 20 24 64 62 20 61 75 74 68 6f 72 69 7a      $db authoriz
59a0: 65 72 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20  er ?CALLBACK?.  
59b0: 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74  **.  ** Invoke t
59c0: 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63  he given callbac
59d0: 6b 20 74 6f 20 61 75 74 68 6f 72 69 7a 65 20 65  k to authorize e
59e0: 61 63 68 20 53 51 4c 20 6f 70 65 72 61 74 69 6f  ach SQL operatio
59f0: 6e 20 61 73 20 69 74 20 69 73 0a 20 20 2a 2a 20  n as it is.  ** 
5a00: 63 6f 6d 70 69 6c 65 64 2e 20 20 35 20 61 72 67  compiled.  5 arg
5a10: 75 6d 65 6e 74 73 20 61 72 65 20 61 70 70 65 6e  uments are appen
5a20: 64 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 62  ded to the callb
5a30: 61 63 6b 20 62 65 66 6f 72 65 20 69 74 20 69 73  ack before it is
5a40: 0a 20 20 2a 2a 20 69 6e 76 6f 6b 65 64 3a 0a 20  .  ** invoked:. 
5a50: 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 31 29 20 54   **.  **   (1) T
5a60: 68 65 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  he authorization
5a70: 20 74 79 70 65 20 28 65 78 3a 20 53 51 4c 49 54   type (ex: SQLIT
5a80: 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 2c 20  E_CREATE_TABLE, 
5a90: 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 2e  SQLITE_INSERT, .
5aa0: 2e 2e 29 0a 20 20 2a 2a 20 20 20 28 32 29 20 46  ..).  **   (2) F
5ab0: 69 72 73 74 20 64 65 73 63 72 69 70 74 69 76 65  irst descriptive
5ac0: 20 6e 61 6d 65 20 28 64 65 70 65 6e 64 73 20 6f   name (depends o
5ad0: 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  n authorization 
5ae0: 74 79 70 65 29 0a 20 20 2a 2a 20 20 20 28 33 29  type).  **   (3)
5af0: 20 53 65 63 6f 6e 64 20 64 65 73 63 72 69 70 74   Second descript
5b00: 69 76 65 20 6e 61 6d 65 0a 20 20 2a 2a 20 20 20  ive name.  **   
5b10: 28 34 29 20 4e 61 6d 65 20 6f 66 20 74 68 65 20  (4) Name of the 
5b20: 64 61 74 61 62 61 73 65 20 28 65 78 3a 20 22 6d  database (ex: "m
5b30: 61 69 6e 22 2c 20 22 74 65 6d 70 22 29 0a 20 20  ain", "temp").  
5b40: 2a 2a 20 20 20 28 35 29 20 4e 61 6d 65 20 6f 66  **   (5) Name of
5b50: 20 74 72 69 67 67 65 72 20 74 68 61 74 20 69 73   trigger that is
5b60: 20 64 6f 69 6e 67 20 74 68 65 20 61 63 63 65 73   doing the acces
5b70: 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  s.  **.  ** The 
5b80: 63 61 6c 6c 62 61 63 6b 20 73 68 6f 75 6c 64 20  callback should 
5b90: 72 65 74 75 72 6e 20 6f 6e 20 6f 66 20 74 68 65  return on of the
5ba0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 69 6e   following strin
5bb0: 67 73 3a 20 53 51 4c 49 54 45 5f 4f 4b 2c 0a 20  gs: SQLITE_OK,. 
5bc0: 20 2a 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52   ** SQLITE_IGNOR
5bd0: 45 2c 20 6f 72 20 53 51 4c 49 54 45 5f 44 45 4e  E, or SQLITE_DEN
5be0: 59 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65  Y.  Any other re
5bf0: 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61 6e  turn value is an
5c00: 20 65 72 72 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a   error..  **.  *
5c10: 2a 20 49 66 20 74 68 69 73 20 6d 65 74 68 6f 64  * If this method
5c20: 20 69 73 20 69 6e 76 6f 6b 65 64 20 77 69 74 68   is invoked with
5c30: 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 2c 20 74   no arguments, t
5c40: 68 65 20 63 75 72 72 65 6e 74 20 61 75 74 68 6f  he current autho
5c50: 72 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 63 61  rization.  ** ca
5c60: 6c 6c 62 61 63 6b 20 73 74 72 69 6e 67 20 69 73  llback string is
5c70: 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2f 0a   returned..  */.
5c80: 20 20 63 61 73 65 20 44 42 5f 41 55 54 48 4f 52    case DB_AUTHOR
5c90: 49 5a 45 52 3a 20 7b 0a 23 69 66 64 65 66 20 53  IZER: {.#ifdef S
5ca0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
5cb0: 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 54 63 6c  RIZATION.    Tcl
5cc0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
5cd0: 74 65 72 70 2c 20 22 61 75 74 68 6f 72 69 7a 61  terp, "authoriza
5ce0: 74 69 6f 6e 20 6e 6f 74 20 61 76 61 69 6c 61 62  tion not availab
5cf0: 6c 65 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64  le in this build
5d00: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
5d10: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c  n TCL_ERROR;.#el
5d20: 73 65 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e  se.    if( objc>
5d30: 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
5d40: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
5d50: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43  rp, 2, objv, "?C
5d60: 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20  ALLBACK?");.    
5d70: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
5d80: 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  OR;.    }else if
5d90: 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20  ( objc==2 ){.   
5da0: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74     if( pDb->zAut
5db0: 68 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  h ){.        Tcl
5dc0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
5dd0: 74 65 72 70 2c 20 70 44 62 2d 3e 7a 41 75 74 68  terp, pDb->zAuth
5de0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
5df0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
5e00: 68 61 72 20 2a 7a 41 75 74 68 3b 0a 20 20 20 20  har *zAuth;.    
5e10: 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20    int len;.     
5e20: 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74 68 20   if( pDb->zAuth 
5e30: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46  ){.        Tcl_F
5e40: 72 65 65 28 70 44 62 2d 3e 7a 41 75 74 68 29 3b  ree(pDb->zAuth);
5e50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
5e60: 41 75 74 68 20 3d 20 54 63 6c 5f 47 65 74 53 74  Auth = Tcl_GetSt
5e70: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
5e80: 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20  [2], &len);.    
5e90: 20 20 69 66 28 20 7a 41 75 74 68 20 26 26 20 6c    if( zAuth && l
5ea0: 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  en>0 ){.        
5eb0: 70 44 62 2d 3e 7a 41 75 74 68 20 3d 20 54 63 6c  pDb->zAuth = Tcl
5ec0: 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20  _Alloc( len + 1 
5ed0: 29 3b 0a 20 20 20 20 20 20 20 20 73 74 72 63 70  );.        strcp
5ee0: 79 28 70 44 62 2d 3e 7a 41 75 74 68 2c 20 7a 41  y(pDb->zAuth, zA
5ef0: 75 74 68 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  uth);.      }els
5f00: 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  e{.        pDb->
5f10: 7a 41 75 74 68 20 3d 20 30 3b 0a 20 20 20 20 20  zAuth = 0;.     
5f20: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44 62   }.      if( pDb
5f30: 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 20  ->zAuth ){.     
5f40: 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d     pDb->interp =
5f50: 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20   interp;.       
5f60: 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75 74   sqlite3_set_aut
5f70: 68 6f 72 69 7a 65 72 28 70 44 62 2d 3e 64 62 2c  horizer(pDb->db,
5f80: 20 61 75 74 68 5f 63 61 6c 6c 62 61 63 6b 2c 20   auth_callback, 
5f90: 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  pDb);.      }els
5fa0: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
5fb0: 65 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65  e3_set_authorize
5fc0: 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29  r(pDb->db, 0, 0)
5fd0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
5fe0: 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b  #endif.    break
5ff0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24  ;.  }..  /*    $
6000: 64 62 20 62 75 73 79 20 3f 43 41 4c 4c 42 41 43  db busy ?CALLBAC
6010: 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76  K?.  **.  ** Inv
6020: 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63 61  oke the given ca
6030: 6c 6c 62 61 63 6b 20 69 66 20 61 6e 20 53 51 4c  llback if an SQL
6040: 20 73 74 61 74 65 6d 65 6e 74 20 61 74 74 65 6d   statement attem
6050: 70 74 73 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a  pts to open.  **
6060: 20 61 20 6c 6f 63 6b 65 64 20 64 61 74 61 62 61   a locked databa
6070: 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  se file..  */.  
6080: 63 61 73 65 20 44 42 5f 42 55 53 59 3a 20 7b 0a  case DB_BUSY: {.
6090: 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29      if( objc>3 )
60a0: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
60b0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
60c0: 20 32 2c 20 6f 62 6a 76 2c 20 22 43 41 4c 4c 42   2, objv, "CALLB
60d0: 41 43 4b 22 29 3b 0a 20 20 20 20 20 20 72 65 74  ACK");.      ret
60e0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
60f0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a     }else if( obj
6100: 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66  c==2 ){.      if
6110: 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a  ( pDb->zBusy ){.
6120: 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65          Tcl_Appe
6130: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
6140: 20 70 44 62 2d 3e 7a 42 75 73 79 2c 20 30 29 3b   pDb->zBusy, 0);
6150: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
6160: 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  se{.      char *
6170: 7a 42 75 73 79 3b 0a 20 20 20 20 20 20 69 6e 74  zBusy;.      int
6180: 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20   len;.      if( 
6190: 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20  pDb->zBusy ){.  
61a0: 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70        Tcl_Free(p
61b0: 44 62 2d 3e 7a 42 75 73 79 29 3b 0a 20 20 20 20  Db->zBusy);.    
61c0: 20 20 7d 0a 20 20 20 20 20 20 7a 42 75 73 79 20    }.      zBusy 
61d0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
61e0: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
61f0: 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  &len);.      if(
6200: 20 7a 42 75 73 79 20 26 26 20 6c 65 6e 3e 30 20   zBusy && len>0 
6210: 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
6220: 7a 42 75 73 79 20 3d 20 54 63 6c 5f 41 6c 6c 6f  zBusy = Tcl_Allo
6230: 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20  c( len + 1 );.  
6240: 20 20 20 20 20 20 73 74 72 63 70 79 28 70 44 62        strcpy(pDb
6250: 2d 3e 7a 42 75 73 79 2c 20 7a 42 75 73 79 29 3b  ->zBusy, zBusy);
6260: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
6270: 20 20 20 20 20 20 70 44 62 2d 3e 7a 42 75 73 79        pDb->zBusy
6280: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
6290: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 42 75      if( pDb->zBu
62a0: 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  sy ){.        pD
62b0: 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65  b->interp = inte
62c0: 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  rp;.        sqli
62d0: 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72  te3_busy_handler
62e0: 28 70 44 62 2d 3e 64 62 2c 20 44 62 42 75 73 79  (pDb->db, DbBusy
62f0: 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20  Handler, pDb);. 
6300: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6310: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79      sqlite3_busy
6320: 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62  _handler(pDb->db
6330: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
6340: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
6350: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 20  ;.  }..  /*     
6360: 24 64 62 20 63 61 63 68 65 20 66 6c 75 73 68 0a  $db cache flush.
6370: 20 20 2a 2a 20 20 20 20 20 24 64 62 20 63 61 63    **     $db cac
6380: 68 65 20 73 69 7a 65 20 6e 0a 20 20 2a 2a 0a 20  he size n.  **. 
6390: 20 2a 2a 20 46 6c 75 73 68 20 74 68 65 20 70 72   ** Flush the pr
63a0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
63b0: 20 63 61 63 68 65 2c 20 6f 72 20 73 65 74 20 74   cache, or set t
63c0: 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
63d0: 72 20 6f 66 0a 20 20 2a 2a 20 63 61 63 68 65 64  r of.  ** cached
63e0: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a   statements..  *
63f0: 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 41 43 48  /.  case DB_CACH
6400: 45 3a 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 73  E: {.    char *s
6410: 75 62 43 6d 64 3b 0a 20 20 20 20 69 6e 74 20 6e  ubCmd;.    int n
6420: 3b 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3c  ;..    if( objc<
6430: 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =2 ){.      Tcl_
6440: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
6450: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63  erp, 1, objv, "c
6460: 61 63 68 65 20 6f 70 74 69 6f 6e 20 3f 61 72 67  ache option ?arg
6470: 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ?");.      retur
6480: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
6490: 20 7d 0a 20 20 20 20 73 75 62 43 6d 64 20 3d 20   }.    subCmd = 
64a0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
64b0: 6d 4f 62 6a 28 20 6f 62 6a 76 5b 32 5d 2c 20 30  mObj( objv[2], 0
64c0: 20 29 3b 0a 20 20 20 20 69 66 28 20 2a 73 75 62   );.    if( *sub
64d0: 43 6d 64 3d 3d 27 66 27 20 26 26 20 73 74 72 63  Cmd=='f' && strc
64e0: 6d 70 28 73 75 62 43 6d 64 2c 22 66 6c 75 73 68  mp(subCmd,"flush
64f0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
6500: 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
6510: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
6520: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
6530: 2c 20 6f 62 6a 76 2c 20 22 66 6c 75 73 68 22 29  , objv, "flush")
6540: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
6550: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
6560: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6570: 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28   flushStmtCache(
6580: 20 70 44 62 20 29 3b 0a 20 20 20 20 20 20 7d 0a   pDb );.      }.
6590: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 2a 73      }else if( *s
65a0: 75 62 43 6d 64 3d 3d 27 73 27 20 26 26 20 73 74  ubCmd=='s' && st
65b0: 72 63 6d 70 28 73 75 62 43 6d 64 2c 22 73 69 7a  rcmp(subCmd,"siz
65c0: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
65d0: 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20  if( objc!=4 ){. 
65e0: 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67         Tcl_Wrong
65f0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
6600: 32 2c 20 6f 62 6a 76 2c 20 22 73 69 7a 65 20 6e  2, objv, "size n
6610: 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ");.        retu
6620: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
6630: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6640: 20 20 20 69 66 28 20 54 43 4c 5f 45 52 52 4f 52     if( TCL_ERROR
6650: 3d 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ==Tcl_GetIntFrom
6660: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
6670: 5b 33 5d 2c 20 26 6e 29 20 29 7b 0a 20 20 20 20  [3], &n) ){.    
6680: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
6690: 52 65 73 75 6c 74 28 20 69 6e 74 65 72 70 2c 20  Result( interp, 
66a0: 22 63 61 6e 6e 6f 74 20 63 6f 6e 76 65 72 74 20  "cannot convert 
66b0: 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  \"", .          
66c0: 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
66d0: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33  ngFromObj(objv[3
66e0: 5d 2c 30 29 2c 20 22 5c 22 20 74 6f 20 69 6e 74  ],0), "\" to int
66f0: 65 67 65 72 22 2c 20 30 29 3b 0a 20 20 20 20 20  eger", 0);.     
6700: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
6710: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d  ERROR;.        }
6720: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
6730: 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 20  if( n<0 ){.     
6740: 20 20 20 20 20 20 20 66 6c 75 73 68 53 74 6d 74         flushStmt
6750: 43 61 63 68 65 28 20 70 44 62 20 29 3b 0a 20 20  Cache( pDb );.  
6760: 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 30 3b            n = 0;
6770: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
6780: 20 69 66 28 20 6e 3e 4d 41 58 5f 50 52 45 50 41   if( n>MAX_PREPA
6790: 52 45 44 5f 53 54 4d 54 53 20 29 7b 0a 20 20 20  RED_STMTS ){.   
67a0: 20 20 20 20 20 20 20 20 20 6e 20 3d 20 4d 41 58           n = MAX
67b0: 5f 50 52 45 50 41 52 45 44 5f 53 54 4d 54 53 3b  _PREPARED_STMTS;
67c0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
67d0: 20 20 20 20 20 20 20 70 44 62 2d 3e 6d 61 78 53         pDb->maxS
67e0: 74 6d 74 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20  tmt = n;.       
67f0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
6800: 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f  else{.      Tcl_
6810: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 20 69 6e  AppendResult( in
6820: 74 65 72 70 2c 20 22 62 61 64 20 6f 70 74 69 6f  terp, "bad optio
6830: 6e 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 20  n \"", .        
6840: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
6850: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 30  romObj(objv[0],0
6860: 29 2c 20 22 5c 22 3a 20 6d 75 73 74 20 62 65 20  ), "\": must be 
6870: 66 6c 75 73 68 20 6f 72 20 73 69 7a 65 22 2c 20  flush or size", 
6880: 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
6890: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
68a0: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
68b0: 0a 0a 20 20 2f 2a 20 20 20 20 20 24 64 62 20 63  ..  /*     $db c
68c0: 68 61 6e 67 65 73 0a 20 20 2a 2a 0a 20 20 2a 2a  hanges.  **.  **
68d0: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
68e0: 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  er of rows that 
68f0: 77 65 72 65 20 6d 6f 64 69 66 69 65 64 2c 20 69  were modified, i
6900: 6e 73 65 72 74 65 64 2c 20 6f 72 20 64 65 6c 65  nserted, or dele
6910: 74 65 64 20 62 79 0a 20 20 2a 2a 20 74 68 65 20  ted by.  ** the 
6920: 6d 6f 73 74 20 72 65 63 65 6e 74 20 49 4e 53 45  most recent INSE
6930: 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45  RT, UPDATE or DE
6940: 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2c 20  LETE statement, 
6950: 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67 20 0a 20  not including . 
6960: 20 2a 2a 20 61 6e 79 20 63 68 61 6e 67 65 73 20   ** any changes 
6970: 6d 61 64 65 20 62 79 20 74 72 69 67 67 65 72 20  made by trigger 
6980: 70 72 6f 67 72 61 6d 73 2e 0a 20 20 2a 2f 0a 20  programs..  */. 
6990: 20 63 61 73 65 20 44 42 5f 43 48 41 4e 47 45 53   case DB_CHANGES
69a0: 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  : {.    Tcl_Obj 
69b0: 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20 20 69 66  *pResult;.    if
69c0: 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
69d0: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
69e0: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
69f0: 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 20 20  bjv, "");.      
6a00: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
6a10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 52 65 73  ;.    }.    pRes
6a20: 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a  ult = Tcl_GetObj
6a30: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
6a40: 20 20 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f 62      Tcl_SetIntOb
6a50: 6a 28 70 52 65 73 75 6c 74 2c 20 73 71 6c 69 74  j(pResult, sqlit
6a60: 65 33 5f 63 68 61 6e 67 65 73 28 70 44 62 2d 3e  e3_changes(pDb->
6a70: 64 62 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  db));.    break;
6a80: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64  .  }..  /*    $d
6a90: 62 20 63 6c 6f 73 65 0a 20 20 2a 2a 0a 20 20 2a  b close.  **.  *
6aa0: 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 64  * Shutdown the d
6ab0: 61 74 61 62 61 73 65 0a 20 20 2a 2f 0a 20 20 63  atabase.  */.  c
6ac0: 61 73 65 20 44 42 5f 43 4c 4f 53 45 3a 20 7b 0a  ase DB_CLOSE: {.
6ad0: 20 20 20 20 54 63 6c 5f 44 65 6c 65 74 65 43 6f      Tcl_DeleteCo
6ae0: 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 54 63  mmand(interp, Tc
6af0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
6b00: 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 29 3b  bj(objv[0], 0));
6b10: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
6b20: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24  .  /*.  **     $
6b30: 64 62 20 63 6f 6c 6c 61 74 65 20 4e 41 4d 45 20  db collate NAME 
6b40: 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a  SCRIPT.  **.  **
6b50: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 51   Create a new SQ
6b60: 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63  L collation func
6b70: 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45  tion called NAME
6b80: 2e 20 20 57 68 65 6e 65 76 65 72 0a 20 20 2a 2a  .  Whenever.  **
6b90: 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 69   that function i
6ba0: 73 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65  s called, invoke
6bb0: 20 53 43 52 49 50 54 20 74 6f 20 65 76 61 6c 75   SCRIPT to evalu
6bc0: 61 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  ate the function
6bd0: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
6be0: 5f 43 4f 4c 4c 41 54 45 3a 20 7b 0a 20 20 20 20  _COLLATE: {.    
6bf0: 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 43 6f 6c  SqlCollate *pCol
6c00: 6c 61 74 65 3b 0a 20 20 20 20 63 68 61 72 20 2a  late;.    char *
6c10: 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 68 61 72 20  zName;.    char 
6c20: 2a 7a 53 63 72 69 70 74 3b 0a 20 20 20 20 69 6e  *zScript;.    in
6c30: 74 20 6e 53 63 72 69 70 74 3b 0a 20 20 20 20 69  t nScript;.    i
6c40: 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  f( objc!=4 ){.  
6c50: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
6c60: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
6c70: 6f 62 6a 76 2c 20 22 4e 41 4d 45 20 53 43 52 49  objv, "NAME SCRI
6c80: 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  PT");.      retu
6c90: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
6ca0: 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20    }.    zName = 
6cb0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
6cc0: 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29  mObj(objv[2], 0)
6cd0: 3b 0a 20 20 20 20 7a 53 63 72 69 70 74 20 3d 20  ;.    zScript = 
6ce0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
6cf0: 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6e  mObj(objv[3], &n
6d00: 53 63 72 69 70 74 29 3b 0a 20 20 20 20 70 43 6f  Script);.    pCo
6d10: 6c 6c 61 74 65 20 3d 20 28 53 71 6c 43 6f 6c 6c  llate = (SqlColl
6d20: 61 74 65 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20  ate*)Tcl_Alloc( 
6d30: 73 69 7a 65 6f 66 28 2a 70 43 6f 6c 6c 61 74 65  sizeof(*pCollate
6d40: 29 20 2b 20 6e 53 63 72 69 70 74 20 2b 20 31 20  ) + nScript + 1 
6d50: 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c  );.    if( pColl
6d60: 61 74 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ate==0 ) return 
6d70: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 70  TCL_ERROR;.    p
6d80: 43 6f 6c 6c 61 74 65 2d 3e 69 6e 74 65 72 70 20  Collate->interp 
6d90: 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 70 43  = interp;.    pC
6da0: 6f 6c 6c 61 74 65 2d 3e 70 4e 65 78 74 20 3d 20  ollate->pNext = 
6db0: 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 3b 0a 20  pDb->pCollate;. 
6dc0: 20 20 20 70 43 6f 6c 6c 61 74 65 2d 3e 7a 53 63     pCollate->zSc
6dd0: 72 69 70 74 20 3d 20 28 63 68 61 72 2a 29 26 70  ript = (char*)&p
6de0: 43 6f 6c 6c 61 74 65 5b 31 5d 3b 0a 20 20 20 20  Collate[1];.    
6df0: 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 20 3d 20  pDb->pCollate = 
6e00: 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 73 74  pCollate;.    st
6e10: 72 63 70 79 28 70 43 6f 6c 6c 61 74 65 2d 3e 7a  rcpy(pCollate->z
6e20: 53 63 72 69 70 74 2c 20 7a 53 63 72 69 70 74 29  Script, zScript)
6e30: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
6e40: 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
6e50: 6f 6e 28 70 44 62 2d 3e 64 62 2c 20 7a 4e 61 6d  on(pDb->db, zNam
6e60: 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  e, SQLITE_UTF8, 
6e70: 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 61 74  .        pCollat
6e80: 65 2c 20 74 63 6c 53 71 6c 43 6f 6c 6c 61 74 65  e, tclSqlCollate
6e90: 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53  ) ){.      Tcl_S
6ea0: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
6eb0: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
6ec0: 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29  _errmsg(pDb->db)
6ed0: 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b  , TCL_VOLATILE);
6ee0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
6ef0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
6f00: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
6f10: 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62   /*.  **     $db
6f20: 20 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65   collation_neede
6f30: 64 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20  d SCRIPT.  **.  
6f40: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
6f50: 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75  SQL collation fu
6f60: 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41  nction called NA
6f70: 4d 45 2e 20 20 57 68 65 6e 65 76 65 72 0a 20 20  ME.  Whenever.  
6f80: 2a 2a 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e  ** that function
6f90: 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f   is called, invo
6fa0: 6b 65 20 53 43 52 49 50 54 20 74 6f 20 65 76 61  ke SCRIPT to eva
6fb0: 6c 75 61 74 65 20 74 68 65 20 66 75 6e 63 74 69  luate the functi
6fc0: 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  on..  */.  case 
6fd0: 44 42 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4e 45 45  DB_COLLATION_NEE
6fe0: 44 45 44 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f  DED: {.    if( o
6ff0: 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc!=3 ){.      
7000: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
7010: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
7020: 2c 20 22 53 43 52 49 50 54 22 29 3b 0a 20 20 20  , "SCRIPT");.   
7030: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
7040: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
7050: 66 28 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65  f( pDb->pCollate
7060: 4e 65 65 64 65 64 20 29 7b 0a 20 20 20 20 20 20  Needed ){.      
7070: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
7080: 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65  (pDb->pCollateNe
7090: 65 64 65 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  eded);.    }.   
70a0: 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65   pDb->pCollateNe
70b0: 65 64 65 64 20 3d 20 54 63 6c 5f 44 75 70 6c 69  eded = Tcl_Dupli
70c0: 63 61 74 65 4f 62 6a 28 6f 62 6a 76 5b 32 5d 29  cateObj(objv[2])
70d0: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ;.    Tcl_IncrRe
70e0: 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 43 6f 6c  fCount(pDb->pCol
70f0: 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 20  lateNeeded);.   
7100: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69   sqlite3_collati
7110: 6f 6e 5f 6e 65 65 64 65 64 28 70 44 62 2d 3e 64  on_needed(pDb->d
7120: 62 2c 20 70 44 62 2c 20 74 63 6c 43 6f 6c 6c 61  b, pDb, tclColla
7130: 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 62  teNeeded);.    b
7140: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  reak;.  }..  /* 
7150: 20 20 20 24 64 62 20 63 6f 6d 6d 69 74 5f 68 6f     $db commit_ho
7160: 6f 6b 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20  ok ?CALLBACK?.  
7170: 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74  **.  ** Invoke t
7180: 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63  he given callbac
7190: 6b 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63 6f  k just before co
71a0: 6d 6d 69 74 74 69 6e 67 20 65 76 65 72 79 20 53  mmitting every S
71b0: 51 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  QL transaction..
71c0: 20 20 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c    ** If the call
71d0: 62 61 63 6b 20 74 68 72 6f 77 73 20 61 6e 20 65  back throws an e
71e0: 78 63 65 70 74 69 6f 6e 20 6f 72 20 72 65 74 75  xception or retu
71f0: 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68  rns non-zero, th
7200: 65 6e 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e  en the.  ** tran
7210: 73 61 63 74 69 6f 6e 20 69 73 20 61 62 6f 72 74  saction is abort
7220: 65 64 2e 20 20 49 66 20 43 41 4c 4c 42 41 43 4b  ed.  If CALLBACK
7230: 20 69 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72   is an empty str
7240: 69 6e 67 2c 20 74 68 65 20 63 61 6c 6c 62 61 63  ing, the callbac
7250: 6b 0a 20 20 2a 2a 20 69 73 20 64 69 73 61 62 6c  k.  ** is disabl
7260: 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ed..  */.  case 
7270: 44 42 5f 43 4f 4d 4d 49 54 5f 48 4f 4f 4b 3a 20  DB_COMMIT_HOOK: 
7280: 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33  {.    if( objc>3
7290: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
72a0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
72b0: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41  p, 2, objv, "?CA
72c0: 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20  LLBACK?");.     
72d0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
72e0: 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  R;.    }else if(
72f0: 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20   objc==2 ){.    
7300: 20 20 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d    if( pDb->zComm
7310: 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  it ){.        Tc
7320: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
7330: 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 43 6f 6d  nterp, pDb->zCom
7340: 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  mit, 0);.      }
7350: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
7360: 20 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b    char *zCommit;
7370: 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a  .      int len;.
7380: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
7390: 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  Commit ){.      
73a0: 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e    Tcl_Free(pDb->
73b0: 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20  zCommit);.      
73c0: 7d 0a 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20  }.      zCommit 
73d0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
73e0: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
73f0: 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  &len);.      if(
7400: 20 7a 43 6f 6d 6d 69 74 20 26 26 20 6c 65 6e 3e   zCommit && len>
7410: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  0 ){.        pDb
7420: 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20 54 63 6c 5f  ->zCommit = Tcl_
7430: 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29  Alloc( len + 1 )
7440: 3b 0a 20 20 20 20 20 20 20 20 73 74 72 63 70 79  ;.        strcpy
7450: 28 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 2c 20 7a  (pDb->zCommit, z
7460: 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d  Commit);.      }
7470: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44  else{.        pD
7480: 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20 30 3b 0a  b->zCommit = 0;.
7490: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
74a0: 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 29  ( pDb->zCommit )
74b0: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69  {.        pDb->i
74c0: 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a  nterp = interp;.
74d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
74e0: 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 70 44 62 2d  commit_hook(pDb-
74f0: 3e 64 62 2c 20 44 62 43 6f 6d 6d 69 74 48 61 6e  >db, DbCommitHan
7500: 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20  dler, pDb);.    
7510: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7520: 20 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f   sqlite3_commit_
7530: 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 20 30 2c  hook(pDb->db, 0,
7540: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
7550: 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
7560: 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 63  }..  /*    $db c
7570: 6f 6d 70 6c 65 74 65 20 53 51 4c 0a 20 20 2a 2a  omplete SQL.  **
7580: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  .  ** Return TRU
7590: 45 20 69 66 20 53 51 4c 20 69 73 20 61 20 63 6f  E if SQL is a co
75a0: 6d 70 6c 65 74 65 20 53 51 4c 20 73 74 61 74 65  mplete SQL state
75b0: 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 46 41  ment.  Return FA
75c0: 4c 53 45 20 69 66 0a 20 20 2a 2a 20 61 64 64 69  LSE if.  ** addi
75d0: 74 69 6f 6e 61 6c 20 6c 69 6e 65 73 20 6f 66 20  tional lines of 
75e0: 69 6e 70 75 74 20 61 72 65 20 6e 65 65 64 65 64  input are needed
75f0: 2e 20 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c  .  This is simil
7600: 61 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 62  ar to the.  ** b
7610: 75 69 6c 74 2d 69 6e 20 22 69 6e 66 6f 20 63 6f  uilt-in "info co
7620: 6d 70 6c 65 74 65 22 20 63 6f 6d 6d 61 6e 64 20  mplete" command 
7630: 6f 66 20 54 63 6c 2e 0a 20 20 2a 2f 0a 20 20 63  of Tcl..  */.  c
7640: 61 73 65 20 44 42 5f 43 4f 4d 50 4c 45 54 45 3a  ase DB_COMPLETE:
7650: 20 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   {.#ifndef SQLIT
7660: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4c 45 54 45 0a  E_OMIT_COMPLETE.
7670: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65      Tcl_Obj *pRe
7680: 73 75 6c 74 3b 0a 20 20 20 20 69 6e 74 20 69 73  sult;.    int is
7690: 43 6f 6d 70 6c 65 74 65 3b 0a 20 20 20 20 69 66  Complete;.    if
76a0: 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
76b0: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
76c0: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
76d0: 62 6a 76 2c 20 22 53 51 4c 22 29 3b 0a 20 20 20  bjv, "SQL");.   
76e0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
76f0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
7700: 73 43 6f 6d 70 6c 65 74 65 20 3d 20 73 71 6c 69  sComplete = sqli
7710: 74 65 33 5f 63 6f 6d 70 6c 65 74 65 28 20 54 63  te3_complete( Tc
7720: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
7730: 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 20 29  bj(objv[2], 0) )
7740: 3b 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20  ;.    pResult = 
7750: 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_GetObjResult
7760: 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63  (interp);.    Tc
7770: 6c 5f 53 65 74 42 6f 6f 6c 65 61 6e 4f 62 6a 28  l_SetBooleanObj(
7780: 70 52 65 73 75 6c 74 2c 20 69 73 43 6f 6d 70 6c  pResult, isCompl
7790: 65 74 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ete);.#endif.   
77a0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
77b0: 2a 20 20 20 20 24 64 62 20 63 6f 70 79 20 63 6f  *    $db copy co
77c0: 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d  nflict-algorithm
77d0: 20 74 61 62 6c 65 20 66 69 6c 65 6e 61 6d 65 20   table filename 
77e0: 3f 53 45 50 41 52 41 54 4f 52 3f 20 3f 4e 55 4c  ?SEPARATOR? ?NUL
77f0: 4c 49 4e 44 49 43 41 54 4f 52 3f 0a 20 20 2a 2a  LINDICATOR?.  **
7800: 0a 20 20 2a 2a 20 43 6f 70 79 20 64 61 74 61 20  .  ** Copy data 
7810: 69 6e 74 6f 20 74 61 62 6c 65 20 66 72 6f 6d 20  into table from 
7820: 66 69 6c 65 6e 61 6d 65 2c 20 6f 70 74 69 6f 6e  filename, option
7830: 61 6c 6c 79 20 75 73 69 6e 67 20 53 45 50 41 52  ally using SEPAR
7840: 41 54 4f 52 0a 20 20 2a 2a 20 61 73 20 63 6f 6c  ATOR.  ** as col
7850: 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 73 2e 20  umn separators. 
7860: 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 63 6f 6e   If a column con
7870: 74 61 69 6e 73 20 61 20 6e 75 6c 6c 20 73 74 72  tains a null str
7880: 69 6e 67 2c 20 6f 72 20 74 68 65 0a 20 20 2a 2a  ing, or the.  **
7890: 20 76 61 6c 75 65 20 6f 66 20 4e 55 4c 4c 49 4e   value of NULLIN
78a0: 44 49 43 41 54 4f 52 2c 20 61 20 4e 55 4c 4c 20  DICATOR, a NULL 
78b0: 69 73 20 69 6e 73 65 72 74 65 64 20 66 6f 72 20  is inserted for 
78c0: 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 2a 2a  the column..  **
78d0: 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69   conflict-algori
78e0: 74 68 6d 20 69 73 20 6f 6e 65 20 6f 66 20 74 68  thm is one of th
78f0: 65 20 73 71 6c 69 74 65 20 63 6f 6e 66 6c 69 63  e sqlite conflic
7900: 74 20 61 6c 67 6f 72 69 74 68 6d 73 3a 0a 20 20  t algorithms:.  
7910: 2a 2a 20 20 20 20 72 6f 6c 6c 62 61 63 6b 2c 20  **    rollback, 
7920: 61 62 6f 72 74 2c 20 66 61 69 6c 2c 20 69 67 6e  abort, fail, ign
7930: 6f 72 65 2c 20 72 65 70 6c 61 63 65 0a 20 20 2a  ore, replace.  *
7940: 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 72 65  * On success, re
7950: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
7960: 6f 66 20 6c 69 6e 65 73 20 70 72 6f 63 65 73 73  of lines process
7970: 65 64 2c 20 6e 6f 74 20 6e 65 63 65 73 73 61 72  ed, not necessar
7980: 69 6c 79 20 73 61 6d 65 0a 20 20 2a 2a 20 61 73  ily same.  ** as
7990: 20 27 64 62 20 63 68 61 6e 67 65 73 27 20 64 75   'db changes' du
79a0: 65 20 74 6f 20 63 6f 6e 66 6c 69 63 74 2d 61 6c  e to conflict-al
79b0: 67 6f 72 69 74 68 6d 20 73 65 6c 65 63 74 65 64  gorithm selected
79c0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
79d0: 20 63 6f 64 65 20 69 73 20 62 61 73 69 63 61 6c   code is basical
79e0: 6c 79 20 61 6e 20 69 6d 70 6c 65 6d 65 6e 74 61  ly an implementa
79f0: 74 69 6f 6e 2f 65 6e 68 61 6e 63 65 6d 65 6e 74  tion/enhancement
7a00: 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c   of.  ** the sql
7a10: 69 74 65 33 20 73 68 65 6c 6c 2e 63 20 22 2e 69  ite3 shell.c ".i
7a20: 6d 70 6f 72 74 22 20 63 6f 6d 6d 61 6e 64 2e 0a  mport" command..
7a30: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 63    **.  ** This c
7a40: 6f 6d 6d 61 6e 64 20 75 73 61 67 65 20 69 73 20  ommand usage is 
7a50: 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68  equivalent to th
7a60: 65 20 73 71 6c 69 74 65 32 2e 78 20 43 4f 50 59  e sqlite2.x COPY
7a70: 20 73 74 61 74 65 6d 65 6e 74 2c 0a 20 20 2a 2a   statement,.  **
7a80: 20 77 68 69 63 68 20 69 6d 70 6f 72 74 73 20 66   which imports f
7a90: 69 6c 65 20 64 61 74 61 20 69 6e 74 6f 20 61 20  ile data into a 
7aa0: 74 61 62 6c 65 20 75 73 69 6e 67 20 74 68 65 20  table using the 
7ab0: 50 6f 73 74 67 72 65 53 51 4c 20 43 4f 50 59 20  PostgreSQL COPY 
7ac0: 66 69 6c 65 20 66 6f 72 6d 61 74 3a 0a 20 20 2a  file format:.  *
7ad0: 2a 20 20 20 24 64 62 20 63 6f 70 79 20 24 63 6f  *   $db copy $co
7ae0: 6e 66 6c 69 74 5f 61 6c 67 6f 20 24 74 61 62 6c  nflit_algo $tabl
7af0: 65 5f 6e 61 6d 65 20 24 66 69 6c 65 6e 61 6d 65  e_name $filename
7b00: 20 5c 74 20 5c 5c 4e 0a 20 20 2a 2f 0a 20 20 63   \t \\N.  */.  c
7b10: 61 73 65 20 44 42 5f 43 4f 50 59 3a 20 7b 0a 20  ase DB_COPY: {. 
7b20: 20 20 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 3b     char *zTable;
7b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7b40: 2a 20 49 6e 73 65 72 74 20 64 61 74 61 20 69 6e  * Insert data in
7b50: 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  to this table */
7b60: 0a 20 20 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  .    char *zFile
7b70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7b80: 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 66 72 6f   /* The file fro
7b90: 6d 20 77 68 69 63 68 20 74 6f 20 65 78 74 72 61  m which to extra
7ba0: 63 74 20 64 61 74 61 20 2a 2f 0a 20 20 20 20 63  ct data */.    c
7bb0: 68 61 72 20 2a 7a 43 6f 6e 66 6c 69 63 74 3b 20  har *zConflict; 
7bc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
7bd0: 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c 67 6f 72  e conflict algor
7be0: 69 74 68 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20  ithm to use */. 
7bf0: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
7c00: 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20 20 2f  *pStmt;        /
7c10: 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  * A statement */
7c20: 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20  .    int rc;    
7c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c40: 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
7c50: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b  */.    int nCol;
7c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c70: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7c80: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74  columns in the t
7c90: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  able */.    int 
7ca0: 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20  nByte;          
7cb0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
7cc0: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61 6e  r of bytes in an
7cd0: 20 53 51 4c 20 73 74 72 69 6e 67 20 2a 2f 0a 20   SQL string */. 
7ce0: 20 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20     int i, j;    
7cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7d00: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
7d10: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 70 3b  */.    int nSep;
7d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d30: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7d40: 62 79 74 65 73 20 69 6e 20 7a 53 65 70 5b 5d 20  bytes in zSep[] 
7d50: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4e 75 6c 6c  */.    int nNull
7d60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7d70: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7d80: 62 79 74 65 73 20 69 6e 20 7a 4e 75 6c 6c 5b 5d  bytes in zNull[]
7d90: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53   */.    char *zS
7da0: 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ql;             
7db0: 20 20 20 20 2f 2a 20 41 6e 20 53 51 4c 20 73 74      /* An SQL st
7dc0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 63  atement */.    c
7dd0: 68 61 72 20 2a 7a 4c 69 6e 65 3b 20 20 20 20 20  har *zLine;     
7de0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
7df0: 73 69 6e 67 6c 65 20 6c 69 6e 65 20 6f 66 20 69  single line of i
7e00: 6e 70 75 74 20 66 72 6f 6d 20 74 68 65 20 66 69  nput from the fi
7e10: 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  le */.    char *
7e20: 2a 61 7a 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  *azCol;         
7e30: 20 20 20 20 20 20 2f 2a 20 7a 4c 69 6e 65 5b 5d        /* zLine[]
7e40: 20 62 72 6f 6b 65 6e 20 75 70 20 69 6e 74 6f 20   broken up into 
7e50: 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 63  columns */.    c
7e60: 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 20 20 20  har *zCommit;   
7e70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f             /* Ho
7e80: 77 20 74 6f 20 63 6f 6d 6d 69 74 20 63 68 61 6e  w to commit chan
7e90: 67 65 73 20 2a 2f 0a 20 20 20 20 46 49 4c 45 20  ges */.    FILE 
7ea0: 2a 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  *in;            
7eb0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
7ec0: 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  put file */.    
7ed0: 69 6e 74 20 6c 69 6e 65 6e 6f 20 3d 20 30 3b 20  int lineno = 0; 
7ee0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
7ef0: 69 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  ine number of in
7f00: 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  put file */.    
7f10: 63 68 61 72 20 7a 4c 69 6e 65 4e 75 6d 5b 38 30  char zLineNum[80
7f20: 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ];          /* L
7f30: 69 6e 65 20 6e 75 6d 62 65 72 20 70 72 69 6e 74  ine number print
7f40: 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 54   buffer */.    T
7f50: 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b  cl_Obj *pResult;
7f60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e             /* in
7f70: 74 65 72 70 20 72 65 73 75 6c 74 20 2a 2f 0a 0a  terp result */..
7f80: 20 20 20 20 63 68 61 72 20 2a 7a 53 65 70 3b 0a      char *zSep;.
7f90: 20 20 20 20 63 68 61 72 20 2a 7a 4e 75 6c 6c 3b      char *zNull;
7fa0: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3c 35 20  .    if( objc<5 
7fb0: 7c 7c 20 6f 62 6a 63 3e 37 20 29 7b 0a 20 20 20  || objc>7 ){.   
7fc0: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
7fd0: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
7fe0: 62 6a 76 2c 20 0a 20 20 20 20 20 20 20 20 20 22  bjv, .         "
7ff0: 43 4f 4e 46 4c 49 43 54 2d 41 4c 47 4f 52 49 54  CONFLICT-ALGORIT
8000: 48 4d 20 54 41 42 4c 45 20 46 49 4c 45 4e 41 4d  HM TABLE FILENAM
8010: 45 20 3f 53 45 50 41 52 41 54 4f 52 3f 20 3f 4e  E ?SEPARATOR? ?N
8020: 55 4c 4c 49 4e 44 49 43 41 54 4f 52 3f 22 29 3b  ULLINDICATOR?");
8030: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
8040: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
8050: 20 20 20 69 66 28 20 6f 62 6a 63 3e 3d 36 20 29     if( objc>=6 )
8060: 7b 0a 20 20 20 20 20 20 7a 53 65 70 20 3d 20 54  {.      zSep = T
8070: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
8080: 4f 62 6a 28 6f 62 6a 76 5b 35 5d 2c 20 30 29 3b  Obj(objv[5], 0);
8090: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
80a0: 20 20 7a 53 65 70 20 3d 20 22 5c 74 22 3b 0a 20    zSep = "\t";. 
80b0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a     }.    if( obj
80c0: 63 3e 3d 37 20 29 7b 0a 20 20 20 20 20 20 7a 4e  c>=7 ){.      zN
80d0: 75 6c 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ull = Tcl_GetStr
80e0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
80f0: 36 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  6], 0);.    }els
8100: 65 7b 0a 20 20 20 20 20 20 7a 4e 75 6c 6c 20 3d  e{.      zNull =
8110: 20 22 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a   "";.    }.    z
8120: 43 6f 6e 66 6c 69 63 74 20 3d 20 54 63 6c 5f 47  Conflict = 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 32 5d 2c 20 30 29 3b 0a 20 20 20  objv[2], 0);.   
8150: 20 7a 54 61 62 6c 65 20 3d 20 54 63 6c 5f 47 65   zTable = Tcl_Ge
8160: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
8170: 62 6a 76 5b 33 5d 2c 20 30 29 3b 0a 20 20 20 20  bjv[3], 0);.    
8180: 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53  zFile = Tcl_GetS
8190: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
81a0: 76 5b 34 5d 2c 20 30 29 3b 0a 20 20 20 20 6e 53  v[4], 0);.    nS
81b0: 65 70 20 3d 20 73 74 72 6c 65 6e 28 7a 53 65 70  ep = strlen(zSep
81c0: 29 3b 0a 20 20 20 20 6e 4e 75 6c 6c 20 3d 20 73  );.    nNull = s
81d0: 74 72 6c 65 6e 28 7a 4e 75 6c 6c 29 3b 0a 20 20  trlen(zNull);.  
81e0: 20 20 69 66 28 20 6e 53 65 70 3d 3d 30 20 29 7b    if( nSep==0 ){
81f0: 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
8200: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
8210: 22 45 72 72 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c  "Error: non-null
8220: 20 73 65 70 61 72 61 74 6f 72 20 72 65 71 75 69   separator requi
8230: 72 65 64 20 66 6f 72 20 63 6f 70 79 22 2c 20 30  red for copy", 0
8240: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
8250: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
8260: 0a 20 20 20 20 69 66 28 73 71 6c 69 74 65 33 53  .    if(sqlite3S
8270: 74 72 49 43 6d 70 28 7a 43 6f 6e 66 6c 69 63 74  trICmp(zConflict
8280: 2c 20 22 72 6f 6c 6c 62 61 63 6b 22 29 20 21 3d  , "rollback") !=
8290: 20 30 20 26 26 0a 20 20 20 20 20 20 20 73 71 6c   0 &&.       sql
82a0: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 43 6f 6e  ite3StrICmp(zCon
82b0: 66 6c 69 63 74 2c 20 22 61 62 6f 72 74 22 20 20  flict, "abort"  
82c0: 20 29 20 21 3d 20 30 20 26 26 0a 20 20 20 20 20   ) != 0 &&.     
82d0: 20 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70    sqlite3StrICmp
82e0: 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 66 61 69  (zConflict, "fai
82f0: 6c 22 20 20 20 20 29 20 21 3d 20 30 20 26 26 0a  l"    ) != 0 &&.
8300: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74         sqlite3St
8310: 72 49 43 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c  rICmp(zConflict,
8320: 20 22 69 67 6e 6f 72 65 22 20 20 29 20 21 3d 20   "ignore"  ) != 
8330: 30 20 26 26 0a 20 20 20 20 20 20 20 73 71 6c 69  0 &&.       sqli
8340: 74 65 33 53 74 72 49 43 6d 70 28 7a 43 6f 6e 66  te3StrICmp(zConf
8350: 6c 69 63 74 2c 20 22 72 65 70 6c 61 63 65 22 20  lict, "replace" 
8360: 29 20 21 3d 20 30 20 29 20 7b 0a 20 20 20 20 20  ) != 0 ) {.     
8370: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
8380: 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72  t(interp, "Error
8390: 3a 20 5c 22 22 2c 20 7a 43 6f 6e 66 6c 69 63 74  : \"", zConflict
83a0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  , .            "
83b0: 5c 22 2c 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67  \", conflict-alg
83c0: 6f 72 69 74 68 6d 20 6d 75 73 74 20 62 65 20 6f  orithm must be o
83d0: 6e 65 20 6f 66 3a 20 72 6f 6c 6c 62 61 63 6b 2c  ne of: rollback,
83e0: 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22   ".            "
83f0: 61 62 6f 72 74 2c 20 66 61 69 6c 2c 20 69 67 6e  abort, fail, ign
8400: 6f 72 65 2c 20 6f 72 20 72 65 70 6c 61 63 65 22  ore, or replace"
8410: 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , 0);.      retu
8420: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
8430: 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73    }.    zSql = s
8440: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
8450: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 27 25  SELECT * FROM '%
8460: 71 27 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20  q'", zTable);.  
8470: 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b    if( zSql==0 ){
8480: 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
8490: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
84a0: 22 45 72 72 6f 72 3a 20 6e 6f 20 73 75 63 68 20  "Error: no such 
84b0: 74 61 62 6c 65 3a 20 22 2c 20 7a 54 61 62 6c 65  table: ", zTable
84c0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , 0);.      retu
84d0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
84e0: 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d 20    }.    nByte = 
84f0: 73 74 72 6c 65 6e 28 7a 53 71 6c 29 3b 0a 20 20  strlen(zSql);.  
8500: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
8510: 72 65 70 61 72 65 28 70 44 62 2d 3e 64 62 2c 20  repare(pDb->db, 
8520: 7a 53 71 6c 2c 20 30 2c 20 26 70 53 74 6d 74 2c  zSql, 0, &pStmt,
8530: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
8540: 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20  _free(zSql);.   
8550: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
8560: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
8570: 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72  t(interp, "Error
8580: 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  : ", sqlite3_err
8590: 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 30 29  msg(pDb->db), 0)
85a0: 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 30  ;.      nCol = 0
85b0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
85c0: 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65     nCol = sqlite
85d0: 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70  3_column_count(p
85e0: 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Stmt);.    }.   
85f0: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
8600: 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66  e(pStmt);.    if
8610: 28 20 6e 43 6f 6c 3d 3d 30 20 29 20 7b 0a 20 20  ( nCol==0 ) {.  
8620: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
8630: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
8640: 7a 53 71 6c 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e  zSql = malloc( n
8650: 42 79 74 65 20 2b 20 35 30 20 2b 20 6e 43 6f 6c  Byte + 50 + nCol
8660: 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 53  *2 );.    if( zS
8670: 71 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20 20  ql==0 ) {.      
8680: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
8690: 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a  (interp, "Error:
86a0: 20 63 61 6e 27 74 20 6d 61 6c 6c 6f 63 28 29 22   can't malloc()"
86b0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , 0);.      retu
86c0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
86d0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
86e0: 73 6e 70 72 69 6e 74 66 28 6e 42 79 74 65 2b 35  snprintf(nByte+5
86f0: 30 2c 20 7a 53 71 6c 2c 20 22 49 4e 53 45 52 54  0, zSql, "INSERT
8700: 20 4f 52 20 25 71 20 49 4e 54 4f 20 27 25 71 27   OR %q INTO '%q'
8710: 20 56 41 4c 55 45 53 28 3f 22 2c 0a 20 20 20 20   VALUES(?",.    
8720: 20 20 20 20 20 7a 43 6f 6e 66 6c 69 63 74 2c 20       zConflict, 
8730: 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 6a 20 3d  zTable);.    j =
8740: 20 73 74 72 6c 65 6e 28 7a 53 71 6c 29 3b 0a 20   strlen(zSql);. 
8750: 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 43     for(i=1; i<nC
8760: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
8770: 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 2c 27 3b  zSql[j++] = ',';
8780: 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d  .      zSql[j++]
8790: 20 3d 20 27 3f 27 3b 0a 20 20 20 20 7d 0a 20 20   = '?';.    }.  
87a0: 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 29    zSql[j++] = ')
87b0: 27 3b 0a 20 20 20 20 7a 53 71 6c 5b 6a 5d 20 3d  ';.    zSql[j] =
87c0: 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   0;.    rc = sql
87d0: 69 74 65 33 5f 70 72 65 70 61 72 65 28 70 44 62  ite3_prepare(pDb
87e0: 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 26  ->db, zSql, 0, &
87f0: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 66  pStmt, 0);.    f
8800: 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69  ree(zSql);.    i
8810: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54  f( rc ){.      T
8820: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
8830: 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20  interp, "Error: 
8840: 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
8850: 67 28 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a  g(pDb->db), 0);.
8860: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
8870: 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
8880: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
8890: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
88a0: 20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 46 69 6c   in = fopen(zFil
88b0: 65 2c 20 22 72 62 22 29 3b 0a 20 20 20 20 69 66  e, "rb");.    if
88c0: 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ( in==0 ){.     
88d0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
88e0: 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72  t(interp, "Error
88f0: 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69  : cannot open fi
8900: 6c 65 3a 20 22 2c 20 7a 46 69 6c 65 2c 20 4e 55  le: ", zFile, NU
8910: 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  LL);.      sqlit
8920: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
8930: 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
8940: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
8950: 7d 0a 20 20 20 20 61 7a 43 6f 6c 20 3d 20 6d 61  }.    azCol = ma
8960: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 61 7a 43  lloc( sizeof(azC
8970: 6f 6c 5b 30 5d 29 2a 28 6e 43 6f 6c 2b 31 29 20  ol[0])*(nCol+1) 
8980: 29 3b 0a 20 20 20 20 69 66 28 20 61 7a 43 6f 6c  );.    if( azCol
8990: 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20 20 54 63  ==0 ) {.      Tc
89a0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
89b0: 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 63  nterp, "Error: c
89c0: 61 6e 27 74 20 6d 61 6c 6c 6f 63 28 29 22 2c 20  an't malloc()", 
89d0: 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
89e0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
89f0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78  }.    sqlite3_ex
8a00: 65 63 28 70 44 62 2d 3e 64 62 2c 20 22 42 45 47  ec(pDb->db, "BEG
8a10: 49 4e 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  IN", 0, 0, 0);. 
8a20: 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22 43 4f     zCommit = "CO
8a30: 4d 4d 49 54 22 3b 0a 20 20 20 20 77 68 69 6c 65  MMIT";.    while
8a40: 28 20 28 7a 4c 69 6e 65 20 3d 20 6c 6f 63 61 6c  ( (zLine = local
8a50: 5f 67 65 74 6c 69 6e 65 28 30 2c 20 69 6e 29 29  _getline(0, in))
8a60: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61  !=0 ){.      cha
8a70: 72 20 2a 7a 3b 0a 20 20 20 20 20 20 69 20 3d 20  r *z;.      i = 
8a80: 30 3b 0a 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2b  0;.      lineno+
8a90: 2b 3b 0a 20 20 20 20 20 20 61 7a 43 6f 6c 5b 30  +;.      azCol[0
8aa0: 5d 20 3d 20 7a 4c 69 6e 65 3b 0a 20 20 20 20 20  ] = zLine;.     
8ab0: 20 66 6f 72 28 69 3d 30 2c 20 7a 3d 7a 4c 69 6e   for(i=0, z=zLin
8ac0: 65 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20 20 20  e; *z; z++){.   
8ad0: 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d 7a 53 65       if( *z==zSe
8ae0: 70 5b 30 5d 20 26 26 20 73 74 72 6e 63 6d 70 28  p[0] && strncmp(
8af0: 7a 2c 20 7a 53 65 70 2c 20 6e 53 65 70 29 3d 3d  z, zSep, nSep)==
8b00: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a  0 ){.          *
8b10: 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  z = 0;.         
8b20: 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20   i++;.          
8b30: 69 66 28 20 69 3c 6e 43 6f 6c 20 29 7b 0a 20 20  if( i<nCol ){.  
8b40: 20 20 20 20 20 20 20 20 20 20 61 7a 43 6f 6c 5b            azCol[
8b50: 69 5d 20 3d 20 26 7a 5b 6e 53 65 70 5d 3b 0a 20  i] = &z[nSep];. 
8b60: 20 20 20 20 20 20 20 20 20 20 20 7a 20 2b 3d 20             z += 
8b70: 6e 53 65 70 2d 31 3b 0a 20 20 20 20 20 20 20 20  nSep-1;.        
8b80: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
8b90: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
8ba0: 69 2b 31 21 3d 6e 43 6f 6c 20 29 7b 0a 20 20 20  i+1!=nCol ){.   
8bb0: 20 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 3b       char *zErr;
8bc0: 0a 20 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20  .        zErr = 
8bd0: 6d 61 6c 6c 6f 63 28 32 30 30 20 2b 20 73 74 72  malloc(200 + str
8be0: 6c 65 6e 28 7a 46 69 6c 65 29 29 3b 0a 20 20 20  len(zFile));.   
8bf0: 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 45 72       sprintf(zEr
8c00: 72 2c 22 45 72 72 6f 72 3a 20 25 73 20 6c 69 6e  r,"Error: %s lin
8c10: 65 20 25 64 3a 20 65 78 70 65 63 74 65 64 20 25  e %d: expected %
8c20: 64 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74  d columns of dat
8c30: 61 20 62 75 74 20 66 6f 75 6e 64 20 25 64 22 2c  a but found %d",
8c40: 0a 20 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c  .           zFil
8c50: 65 2c 20 6c 69 6e 65 6e 6f 2c 20 6e 43 6f 6c 2c  e, lineno, nCol,
8c60: 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 54   i+1);.        T
8c70: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
8c80: 69 6e 74 65 72 70 2c 20 7a 45 72 72 2c 20 30 29  interp, zErr, 0)
8c90: 3b 0a 20 20 20 20 20 20 20 20 66 72 65 65 28 7a  ;.        free(z
8ca0: 45 72 72 29 3b 0a 20 20 20 20 20 20 20 20 7a 43  Err);.        zC
8cb0: 6f 6d 6d 69 74 20 3d 20 22 52 4f 4c 4c 42 41 43  ommit = "ROLLBAC
8cc0: 4b 22 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  K";.        brea
8cd0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
8ce0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
8cf0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
8d00: 2f 2a 20 63 68 65 63 6b 20 66 6f 72 20 6e 75 6c  /* check for nul
8d10: 6c 20 64 61 74 61 2c 20 69 66 20 73 6f 2c 20 62  l data, if so, b
8d20: 69 6e 64 20 61 73 20 6e 75 6c 6c 20 2a 2f 0a 20  ind as null */. 
8d30: 20 20 20 20 20 20 20 69 66 20 28 28 6e 4e 75 6c         if ((nNul
8d40: 6c 3e 30 20 26 26 20 73 74 72 63 6d 70 28 61 7a  l>0 && strcmp(az
8d50: 43 6f 6c 5b 69 5d 2c 20 7a 4e 75 6c 6c 29 3d 3d  Col[i], zNull)==
8d60: 30 29 20 7c 7c 20 73 74 72 6c 65 6e 28 61 7a 43  0) || strlen(azC
8d70: 6f 6c 5b 69 5d 29 3d 3d 30 29 20 7b 0a 20 20 20  ol[i])==0) {.   
8d80: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
8d90: 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20  ind_null(pStmt, 
8da0: 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  i+1);.        }e
8db0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
8dc0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
8dd0: 28 70 53 74 6d 74 2c 20 69 2b 31 2c 20 61 7a 43  (pStmt, i+1, azC
8de0: 6f 6c 5b 69 5d 2c 20 2d 31 2c 20 53 51 4c 49 54  ol[i], -1, SQLIT
8df0: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  E_STATIC);.     
8e00: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
8e10: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28     sqlite3_step(
8e20: 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 63  pStmt);.      rc
8e30: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
8e40: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 66  (pStmt);.      f
8e50: 72 65 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20  ree(zLine);.    
8e60: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
8e70: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 54  _OK ){.        T
8e80: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
8e90: 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 3a 20 22  interp,"Error: "
8ea0: 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
8eb0: 28 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20  (pDb->db), 0);. 
8ec0: 20 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d         zCommit =
8ed0: 20 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20   "ROLLBACK";.   
8ee0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8ef0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72    }.    }.    fr
8f00: 65 65 28 61 7a 43 6f 6c 29 3b 0a 20 20 20 20 66  ee(azCol);.    f
8f10: 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 73  close(in);.    s
8f20: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
8f30: 70 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69  pStmt);.    sqli
8f40: 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62  te3_exec(pDb->db
8f50: 2c 20 7a 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 2c  , zCommit, 0, 0,
8f60: 20 30 29 3b 0a 0a 20 20 20 20 69 66 28 20 7a 43   0);..    if( zC
8f70: 6f 6d 6d 69 74 5b 30 5d 20 3d 3d 20 27 43 27 20  ommit[0] == 'C' 
8f80: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 73 75 63 63  ){.      /* succ
8f90: 65 73 73 2c 20 73 65 74 20 72 65 73 75 6c 74 20  ess, set result 
8fa0: 61 73 20 6e 75 6d 62 65 72 20 6f 66 20 6c 69 6e  as number of lin
8fb0: 65 73 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a  es processed */.
8fc0: 20 20 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20        pResult = 
8fd0: 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_GetObjResult
8fe0: 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 20 20  (interp);.      
8ff0: 54 63 6c 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52  Tcl_SetIntObj(pR
9000: 65 73 75 6c 74 2c 20 6c 69 6e 65 6e 6f 29 3b 0a  esult, lineno);.
9010: 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f        rc = TCL_O
9020: 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
9030: 20 20 20 20 2f 2a 20 66 61 69 6c 75 72 65 2c 20      /* failure, 
9040: 61 70 70 65 6e 64 20 6c 69 6e 65 6e 6f 20 77 68  append lineno wh
9050: 65 72 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  ere failed */.  
9060: 20 20 20 20 73 70 72 69 6e 74 66 28 7a 4c 69 6e      sprintf(zLin
9070: 65 4e 75 6d 2c 22 25 64 22 2c 6c 69 6e 65 6e 6f  eNum,"%d",lineno
9080: 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  );.      Tcl_App
9090: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
90a0: 2c 22 2c 20 66 61 69 6c 65 64 20 77 68 69 6c 65  ,", failed while
90b0: 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 69 6e 65   processing line
90c0: 3a 20 22 2c 7a 4c 69 6e 65 4e 75 6d 2c 30 29 3b  : ",zLineNum,0);
90d0: 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f  .      rc = TCL_
90e0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
90f0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
9100: 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 65 72  *.  **    $db er
9110: 72 6f 72 63 6f 64 65 0a 20 20 2a 2a 0a 20 20 2a  rorcode.  **.  *
9120: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
9130: 65 72 69 63 20 65 72 72 6f 72 20 63 6f 64 65 20  eric error code 
9140: 74 68 61 74 20 77 61 73 20 72 65 74 75 72 6e 65  that was returne
9150: 64 20 62 79 20 74 68 65 20 6d 6f 73 74 20 72 65  d by the most re
9160: 63 65 6e 74 0a 20 20 2a 2a 20 63 61 6c 6c 20 74  cent.  ** call t
9170: 6f 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29  o sqlite3_exec()
9180: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
9190: 5f 45 52 52 4f 52 43 4f 44 45 3a 20 7b 0a 20 20  _ERRORCODE: {.  
91a0: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
91b0: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
91c0: 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33  ewIntObj(sqlite3
91d0: 5f 65 72 72 63 6f 64 65 28 70 44 62 2d 3e 64 62  _errcode(pDb->db
91e0: 29 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  )));.    break;.
91f0: 20 20 7d 0a 20 20 20 0a 20 20 2f 2a 0a 20 20 2a    }.   .  /*.  *
9200: 2a 20 20 20 20 24 64 62 20 65 76 61 6c 20 24 73  *    $db eval $s
9210: 71 6c 20 3f 61 72 72 61 79 3f 20 3f 7b 20 20 2e  ql ?array? ?{  .
9220: 2e 2e 63 6f 64 65 2e 2e 2e 20 7d 3f 0a 20 20 2a  ..code... }?.  *
9230: 2a 20 20 20 20 24 64 62 20 6f 6e 65 63 6f 6c 75  *    $db onecolu
9240: 6d 6e 20 24 73 71 6c 0a 20 20 2a 2a 0a 20 20 2a  mn $sql.  **.  *
9250: 2a 20 54 68 65 20 53 51 4c 20 73 74 61 74 65 6d  * The SQL statem
9260: 65 6e 74 20 69 6e 20 24 73 71 6c 20 69 73 20 65  ent in $sql is e
9270: 76 61 6c 75 61 74 65 64 2e 20 20 46 6f 72 20 65  valuated.  For e
9280: 61 63 68 20 72 6f 77 2c 20 74 68 65 20 76 61 6c  ach row, the val
9290: 75 65 73 20 61 72 65 0a 20 20 2a 2a 20 70 6c 61  ues are.  ** pla
92a0: 63 65 64 20 69 6e 20 65 6c 65 6d 65 6e 74 73 20  ced in elements 
92b0: 6f 66 20 74 68 65 20 61 72 72 61 79 20 6e 61 6d  of the array nam
92c0: 65 64 20 22 61 72 72 61 79 22 20 61 6e 64 20 2e  ed "array" and .
92d0: 2e 2e 63 6f 64 65 2e 2e 2e 20 69 73 20 65 78 65  ..code... is exe
92e0: 63 75 74 65 64 2e 0a 20 20 2a 2a 20 49 66 20 22  cuted..  ** If "
92f0: 61 72 72 61 79 22 20 61 6e 64 20 22 63 6f 64 65  array" and "code
9300: 22 20 61 72 65 20 6f 6d 69 74 74 65 64 2c 20 74  " are omitted, t
9310: 68 65 6e 20 6e 6f 20 63 61 6c 6c 62 61 63 6b 20  hen no callback 
9320: 69 73 20 65 76 65 72 79 20 69 6e 76 6f 6b 65 64  is every invoked
9330: 2e 0a 20 20 2a 2a 20 49 66 20 22 61 72 72 61 79  ..  ** If "array
9340: 22 20 69 73 20 61 6e 20 65 6d 70 74 79 20 73 74  " is an empty st
9350: 72 69 6e 67 2c 20 74 68 65 6e 20 74 68 65 20 76  ring, then the v
9360: 61 6c 75 65 73 20 61 72 65 20 70 6c 61 63 65 64  alues are placed
9370: 20 69 6e 20 76 61 72 69 61 62 6c 65 73 0a 20 20   in variables.  
9380: 2a 2a 20 74 68 61 74 20 68 61 76 65 20 74 68 65  ** that have the
9390: 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68   same name as th
93a0: 65 20 66 69 65 6c 64 73 20 65 78 74 72 61 63 74  e fields extract
93b0: 65 64 20 62 79 20 74 68 65 20 71 75 65 72 79 2e  ed by the query.
93c0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6f  .  **.  ** The o
93d0: 6e 65 63 6f 6c 75 6d 6e 20 6d 65 74 68 6f 64 20  necolumn method 
93e0: 69 73 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e  is the equivalen
93f0: 74 20 6f 66 3a 0a 20 20 2a 2a 20 20 20 20 20 6c  t of:.  **     l
9400: 69 6e 64 65 78 20 5b 24 64 62 20 65 76 61 6c 20  index [$db eval 
9410: 24 73 71 6c 5d 20 30 0a 20 20 2a 2f 0a 20 20 63  $sql] 0.  */.  c
9420: 61 73 65 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e  ase DB_ONECOLUMN
9430: 3a 0a 20 20 63 61 73 65 20 44 42 5f 45 56 41 4c  :.  case DB_EVAL
9440: 3a 0a 20 20 63 61 73 65 20 44 42 5f 45 58 49 53  :.  case DB_EXIS
9450: 54 53 3a 20 7b 0a 20 20 20 20 63 68 61 72 20 63  TS: {.    char c
9460: 6f 6e 73 74 20 2a 7a 53 71 6c 3b 20 20 20 20 20  onst *zSql;     
9470: 20 2f 2a 20 4e 65 78 74 20 53 51 4c 20 73 74 61   /* Next SQL sta
9480: 74 65 6d 65 6e 74 20 74 6f 20 65 78 65 63 75 74  tement to execut
9490: 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 63 6f  e */.    char co
94a0: 6e 73 74 20 2a 7a 4c 65 66 74 3b 20 20 20 20 20  nst *zLeft;     
94b0: 2f 2a 20 57 68 61 74 20 69 73 20 6c 65 66 74 20  /* What is left 
94c0: 61 66 74 65 72 20 66 69 72 73 74 20 73 74 6d 74  after first stmt
94d0: 20 69 6e 20 7a 53 71 6c 20 2a 2f 0a 20 20 20 20   in zSql */.    
94e0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
94f0: 74 6d 74 3b 20 20 20 2f 2a 20 43 6f 6d 70 69 6c  tmt;   /* Compil
9500: 65 64 20 53 51 4c 20 73 74 61 74 6d 65 6e 74 20  ed SQL statment 
9510: 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  */.    Tcl_Obj *
9520: 70 41 72 72 61 79 3b 20 20 20 20 20 20 20 2f 2a  pArray;       /*
9530: 20 4e 61 6d 65 20 6f 66 20 61 72 72 61 79 20 69   Name of array i
9540: 6e 74 6f 20 77 68 69 63 68 20 72 65 73 75 6c 74  nto which result
9550: 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 2a 2f  s are written */
9560: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53  .    Tcl_Obj *pS
9570: 63 72 69 70 74 3b 20 20 20 20 20 20 2f 2a 20 53  cript;      /* S
9580: 63 72 69 70 74 20 74 6f 20 72 75 6e 20 66 6f 72  cript to run for
9590: 20 65 61 63 68 20 72 65 73 75 6c 74 20 73 65 74   each result set
95a0: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20   */.    Tcl_Obj 
95b0: 2a 2a 61 70 50 61 72 6d 3b 20 20 20 20 20 20 2f  **apParm;      /
95c0: 2a 20 50 61 72 61 6d 65 74 65 72 73 20 74 68 61  * Parameters tha
95d0: 74 20 6e 65 65 64 20 61 20 54 63 6c 5f 44 65 63  t need a Tcl_Dec
95e0: 72 52 65 66 43 6f 75 6e 74 28 29 20 2a 2f 0a 20  rRefCount() */. 
95f0: 20 20 20 69 6e 74 20 6e 50 61 72 6d 3b 20 20 20     int nParm;   
9600: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
9610: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 75  ber of entries u
9620: 73 65 64 20 69 6e 20 61 70 50 61 72 6d 5b 5d 20  sed in apParm[] 
9630: 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  */.    Tcl_Obj *
9640: 61 50 61 72 6d 5b 31 30 5d 3b 20 20 20 20 2f 2a  aParm[10];    /*
9650: 20 53 74 61 74 69 63 20 73 70 61 63 65 20 66 6f   Static space fo
9660: 72 20 61 70 50 61 72 6d 5b 5d 20 69 6e 20 74 68  r apParm[] in th
9670: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f  e common case */
9680: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52  .    Tcl_Obj *pR
9690: 65 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 56  et;         /* V
96a0: 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75 72  alue to be retur
96b0: 6e 65 64 20 2a 2f 0a 20 20 20 20 53 71 6c 50 72  ned */.    SqlPr
96c0: 65 70 61 72 65 64 53 74 6d 74 20 2a 70 50 72 65  eparedStmt *pPre
96d0: 53 74 6d 74 3b 20 20 2f 2a 20 50 6f 69 6e 74 65  Stmt;  /* Pointe
96e0: 72 20 74 6f 20 61 20 70 72 65 70 61 72 65 64 20  r to a prepared 
96f0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
9700: 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20 69   int rc2;..    i
9710: 66 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f 45 56  f( choice==DB_EV
9720: 41 4c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  AL ){.      if( 
9730: 6f 62 6a 63 3c 33 20 7c 7c 20 6f 62 6a 63 3e 35  objc<3 || objc>5
9740: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
9750: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
9760: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53  erp, 2, objv, "S
9770: 51 4c 20 3f 41 52 52 41 59 2d 4e 41 4d 45 3f 20  QL ?ARRAY-NAME? 
9780: 3f 53 43 52 49 50 54 3f 22 29 3b 0a 20 20 20 20  ?SCRIPT?");.    
9790: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
97a0: 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
97b0: 20 20 20 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e      pRet = Tcl_N
97c0: 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20 20 20 54  ewObj();.      T
97d0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
97e0: 70 52 65 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pRet);.    }else
97f0: 7b 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63  {.      if( objc
9800: 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 54  !=3 ){.        T
9810: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
9820: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
9830: 20 22 53 51 4c 22 29 3b 0a 20 20 20 20 20 20 20   "SQL");.       
9840: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
9850: 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
9860: 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 20   pRet = 0;.     
9870: 20 69 66 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f   if( choice==DB_
9880: 45 58 49 53 54 53 20 29 7b 0a 20 20 20 20 20 20  EXISTS ){.      
9890: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
98a0: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
98b0: 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 30 29 29  ewBooleanObj(0))
98c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
98d0: 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20      if( objc==3 
98e0: 29 7b 0a 20 20 20 20 20 20 70 41 72 72 61 79 20  ){.      pArray 
98f0: 3d 20 70 53 63 72 69 70 74 20 3d 20 30 3b 0a 20  = pScript = 0;. 
9900: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a     }else if( obj
9910: 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 70 41  c==4 ){.      pA
9920: 72 72 61 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  rray = 0;.      
9930: 70 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 33  pScript = objv[3
9940: 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ];.    }else{.  
9950: 20 20 20 20 70 41 72 72 61 79 20 3d 20 6f 62 6a      pArray = obj
9960: 76 5b 33 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  v[3];.      if( 
9970: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 70 41  Tcl_GetString(pA
9980: 72 72 61 79 29 5b 30 5d 3d 3d 30 20 29 20 70 41  rray)[0]==0 ) pA
9990: 72 72 61 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  rray = 0;.      
99a0: 70 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 34  pScript = objv[4
99b0: 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63  ];.    }..    Tc
99c0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 6f  l_IncrRefCount(o
99d0: 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 7a 53 71  bjv[2]);.    zSq
99e0: 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  l = Tcl_GetStrin
99f0: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
9a00: 2c 20 30 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  , 0);.    while(
9a10: 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 26 26 20 7a   rc==TCL_OK && z
9a20: 53 71 6c 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  Sql[0] ){.      
9a30: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
9a40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
9a50: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
9a60: 20 20 20 20 69 6e 74 20 6e 56 61 72 3b 20 20 20      int nVar;   
9a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9a80: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 69 6e 64  * Number of bind
9a90: 20 70 61 72 61 6d 65 74 65 72 73 20 69 6e 20 74   parameters in t
9aa0: 68 65 20 70 53 74 6d 74 20 2a 2f 0a 20 20 20 20  he pStmt */.    
9ab0: 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20    int nCol;     
9ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9ad0: 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
9ae0: 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
9af0: 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 54 63 6c  set */.      Tcl
9b00: 5f 4f 62 6a 20 2a 2a 61 70 43 6f 6c 4e 61 6d 65  _Obj **apColName
9b10: 20 3d 20 30 3b 20 20 20 2f 2a 20 41 72 72 61 79   = 0;   /* Array
9b20: 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73   of column names
9b30: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6c 65   */.      int le
9b40: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
9b50: 20 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 6c       /* String l
9b60: 65 6e 67 74 68 20 6f 66 20 7a 53 71 6c 20 2a 2f  ength of zSql */
9b70: 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 54 72 79  .  .      /* Try
9b80: 20 74 6f 20 66 69 6e 64 20 61 20 53 51 4c 20 73   to find a SQL s
9b90: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 68 61  tatement that ha
9ba0: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
9bb0: 6f 6d 70 69 6c 65 64 20 61 6e 64 0a 20 20 20 20  ompiled and.    
9bc0: 20 20 2a 2a 20 77 68 69 63 68 20 6d 61 74 63 68    ** which match
9bd0: 65 73 20 74 68 65 20 6e 65 78 74 20 73 65 71 75  es the next sequ
9be0: 65 6e 63 65 20 6f 66 20 53 51 4c 2e 0a 20 20 20  ence of SQL..   
9bf0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 53 74 6d     */.      pStm
9c00: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 72  t = 0;.      pPr
9c10: 65 53 74 6d 74 20 3d 20 70 44 62 2d 3e 73 74 6d  eStmt = pDb->stm
9c20: 74 4c 69 73 74 3b 0a 20 20 20 20 20 20 6c 65 6e  tList;.      len
9c30: 20 3d 20 73 74 72 6c 65 6e 28 7a 53 71 6c 29 3b   = strlen(zSql);
9c40: 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65 53  .      if( pPreS
9c50: 74 6d 74 20 26 26 20 73 71 6c 69 74 65 33 5f 65  tmt && sqlite3_e
9c60: 78 70 69 72 65 64 28 70 50 72 65 53 74 6d 74 2d  xpired(pPreStmt-
9c70: 3e 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20  >pStmt) ){.     
9c80: 20 20 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68     flushStmtCach
9c90: 65 28 70 44 62 29 3b 0a 20 20 20 20 20 20 20 20  e(pDb);.        
9ca0: 70 50 72 65 53 74 6d 74 20 3d 20 30 3b 0a 20 20  pPreStmt = 0;.  
9cb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
9cc0: 3b 20 70 50 72 65 53 74 6d 74 3b 20 70 50 72 65  ; pPreStmt; pPre
9cd0: 53 74 6d 74 3d 70 50 72 65 53 74 6d 74 2d 3e 70  Stmt=pPreStmt->p
9ce0: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69  Next){.        i
9cf0: 6e 74 20 6e 20 3d 20 70 50 72 65 53 74 6d 74 2d  nt n = pPreStmt-
9d00: 3e 6e 53 71 6c 3b 0a 20 20 20 20 20 20 20 20 69  >nSql;.        i
9d10: 66 28 20 6c 65 6e 3e 3d 6e 20 0a 20 20 20 20 20  f( len>=n .     
9d20: 20 20 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70         && memcmp
9d30: 28 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 2c  (pPreStmt->zSql,
9d40: 20 7a 53 71 6c 2c 20 6e 29 3d 3d 30 0a 20 20 20   zSql, n)==0.   
9d50: 20 20 20 20 20 20 20 20 20 26 26 20 28 7a 53 71           && (zSq
9d60: 6c 5b 6e 5d 3d 3d 30 20 7c 7c 20 7a 53 71 6c 5b  l[n]==0 || zSql[
9d70: 6e 2d 31 5d 3d 3d 27 3b 27 29 0a 20 20 20 20 20  n-1]==';').     
9d80: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
9d90: 70 53 74 6d 74 20 3d 20 70 50 72 65 53 74 6d 74  pStmt = pPreStmt
9da0: 2d 3e 70 53 74 6d 74 3b 0a 20 20 20 20 20 20 20  ->pStmt;.       
9db0: 20 20 20 7a 4c 65 66 74 20 3d 20 26 7a 53 71 6c     zLeft = &zSql
9dc0: 5b 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 5d  [pPreStmt->nSql]
9dd0: 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;..          /* 
9de0: 57 68 65 6e 20 61 20 70 72 65 70 61 72 65 64 20  When a prepared 
9df0: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 66 6f 75  statement is fou
9e00: 6e 64 2c 20 75 6e 6c 69 6e 6b 20 69 74 20 66 72  nd, unlink it fr
9e10: 6f 6d 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  om the.         
9e20: 20 2a 2a 20 63 61 63 68 65 20 6c 69 73 74 2e 20   ** cache list. 
9e30: 20 49 74 20 77 69 6c 6c 20 6c 61 74 65 72 20 62   It will later b
9e40: 65 20 61 64 64 65 64 20 62 61 63 6b 20 74 6f 20  e added back to 
9e50: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20  the beginning.  
9e60: 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68          ** of th
9e70: 65 20 63 61 63 68 65 20 6c 69 73 74 20 69 6e 20  e cache list in 
9e80: 6f 72 64 65 72 20 74 6f 20 69 6d 70 6c 65 6d 65  order to impleme
9e90: 6e 74 20 4c 52 55 20 72 65 70 6c 61 63 65 6d 65  nt LRU replaceme
9ea0: 6e 74 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  nt..          */
9eb0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
9ec0: 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 20 29  PreStmt->pPrev )
9ed0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50  {.            pP
9ee0: 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 2d 3e 70  reStmt->pPrev->p
9ef0: 4e 65 78 74 20 3d 20 70 50 72 65 53 74 6d 74 2d  Next = pPreStmt-
9f00: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
9f10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
9f20: 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69       pDb->stmtLi
9f30: 73 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70  st = pPreStmt->p
9f40: 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
9f50: 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
9f60: 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 20  pPreStmt->pNext 
9f70: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
9f80: 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 2d 3e  PreStmt->pNext->
9f90: 70 50 72 65 76 20 3d 20 70 50 72 65 53 74 6d 74  pPrev = pPreStmt
9fa0: 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20 20  ->pPrev;.       
9fb0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9fc0: 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c        pDb->stmtL
9fd0: 61 73 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e  ast = pPreStmt->
9fe0: 70 50 72 65 76 3b 0a 20 20 20 20 20 20 20 20 20  pPrev;.         
9ff0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 44 62   }.          pDb
a000: 2d 3e 6e 53 74 6d 74 2d 2d 3b 0a 20 20 20 20 20  ->nStmt--;.     
a010: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a020: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
a030: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20  .      /* If no 
a040: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
a050: 6e 74 20 77 61 73 20 66 6f 75 6e 64 2e 20 20 43  nt was found.  C
a060: 6f 6d 70 69 6c 65 20 74 68 65 20 53 51 4c 20 74  ompile the SQL t
a070: 65 78 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ext.      */.   
a080: 20 20 20 69 66 28 20 70 53 74 6d 74 3d 3d 30 20     if( pStmt==0 
a090: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 53  ){.        if( S
a0a0: 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
a0b0: 33 5f 70 72 65 70 61 72 65 28 70 44 62 2d 3e 64  3_prepare(pDb->d
a0c0: 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53  b, zSql, -1, &pS
a0d0: 74 6d 74 2c 20 26 7a 4c 65 66 74 29 20 29 7b 0a  tmt, &zLeft) ){.
a0e0: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65            Tcl_Se
a0f0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
a100: 70 2c 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 73  p, dbTextToObj(s
a110: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44  qlite3_errmsg(pD
a120: 62 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20 20 20  b->db)));.      
a130: 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52      rc = TCL_ERR
a140: 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  OR;.          br
a150: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
a160: 20 20 20 20 20 20 20 69 66 28 20 70 53 74 6d 74         if( pStmt
a170: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
a180: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
a190: 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
a1a0: 70 44 62 2d 3e 64 62 29 20 29 7b 0a 20 20 20 20  pDb->db) ){.    
a1b0: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 6d          /* A com
a1c0: 70 69 6c 65 2d 74 69 6d 65 20 65 72 72 6f 72 20  pile-time error 
a1d0: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
a1e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  .            */.
a1f0: 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
a200: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
a210: 65 72 70 2c 20 64 62 54 65 78 74 54 6f 4f 62 6a  erp, dbTextToObj
a220: 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28  (sqlite3_errmsg(
a230: 70 44 62 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20  pDb->db)));.    
a240: 20 20 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c          rc = TCL
a250: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
a260: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
a270: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a280: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
a290: 74 61 74 65 6d 65 6e 74 20 77 61 73 20 61 20 6e  tatement was a n
a2a0: 6f 2d 6f 70 2e 20 20 43 6f 6e 74 69 6e 75 65 20  o-op.  Continue 
a2b0: 74 6f 20 74 68 65 20 6e 65 78 74 20 73 74 61 74  to the next stat
a2c0: 65 6d 65 6e 74 0a 20 20 20 20 20 20 20 20 20 20  ement.          
a2d0: 20 20 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c 20    ** in the SQL 
a2e0: 73 74 72 69 6e 67 2e 0a 20 20 20 20 20 20 20 20  string..        
a2f0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
a300: 20 20 20 7a 53 71 6c 20 3d 20 7a 4c 65 66 74 3b     zSql = zLeft;
a310: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
a320: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
a330: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
a340: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72       assert( pPr
a350: 65 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20  eStmt==0 );.    
a360: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 42 69    }..      /* Bi
a370: 6e 64 20 76 61 6c 75 65 73 20 74 6f 20 70 61 72  nd values to par
a380: 61 6d 65 74 65 72 73 20 74 68 61 74 20 62 65 67  ameters that beg
a390: 69 6e 20 77 69 74 68 20 24 20 6f 72 20 3a 0a 20  in with $ or :. 
a3a0: 20 20 20 20 20 2a 2f 20 20 0a 20 20 20 20 20 20       */  .      
a3b0: 6e 56 61 72 20 3d 20 73 71 6c 69 74 65 33 5f 62  nVar = sqlite3_b
a3c0: 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f  ind_parameter_co
a3d0: 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  unt(pStmt);.    
a3e0: 20 20 6e 50 61 72 6d 20 3d 20 30 3b 0a 20 20 20    nParm = 0;.   
a3f0: 20 20 20 69 66 28 20 6e 56 61 72 3e 73 69 7a 65     if( nVar>size
a400: 6f 66 28 61 50 61 72 6d 29 2f 73 69 7a 65 6f 66  of(aParm)/sizeof
a410: 28 61 50 61 72 6d 5b 30 5d 29 20 29 7b 0a 20 20  (aParm[0]) ){.  
a420: 20 20 20 20 20 20 61 70 50 61 72 6d 20 3d 20 28        apParm = (
a430: 54 63 6c 5f 4f 62 6a 2a 2a 29 54 63 6c 5f 41 6c  Tcl_Obj**)Tcl_Al
a440: 6c 6f 63 28 6e 56 61 72 2a 73 69 7a 65 6f 66 28  loc(nVar*sizeof(
a450: 61 70 50 61 72 6d 5b 30 5d 29 29 3b 0a 20 20 20  apParm[0]));.   
a460: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a470: 20 20 61 70 50 61 72 6d 20 3d 20 61 50 61 72 6d    apParm = aParm
a480: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a490: 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 56 61 72  for(i=1; i<=nVar
a4a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
a4b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 72  const char *zVar
a4c0: 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
a4d0: 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 70  parameter_name(p
a4e0: 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Stmt, i);.      
a4f0: 20 20 69 66 28 20 7a 56 61 72 21 3d 30 20 26 26    if( zVar!=0 &&
a500: 20 28 7a 56 61 72 5b 30 5d 3d 3d 27 24 27 20 7c   (zVar[0]=='$' |
a510: 7c 20 7a 56 61 72 5b 30 5d 3d 3d 27 3a 27 29 20  | zVar[0]==':') 
a520: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  ){.          Tcl
a530: 5f 4f 62 6a 20 2a 70 56 61 72 20 3d 20 54 63 6c  _Obj *pVar = Tcl
a540: 5f 47 65 74 56 61 72 32 45 78 28 69 6e 74 65 72  _GetVar2Ex(inter
a550: 70 2c 20 26 7a 56 61 72 5b 31 5d 2c 20 30 2c 20  p, &zVar[1], 0, 
a560: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  0);.          if
a570: 28 20 70 56 61 72 20 29 7b 0a 20 20 20 20 20 20  ( pVar ){.      
a580: 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20        int n;.   
a590: 20 20 20 20 20 20 20 20 20 75 38 20 2a 64 61 74           u8 *dat
a5a0: 61 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  a;.            c
a5b0: 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 70 56 61  har *zType = pVa
a5c0: 72 2d 3e 74 79 70 65 50 74 72 20 3f 20 70 56 61  r->typePtr ? pVa
a5d0: 72 2d 3e 74 79 70 65 50 74 72 2d 3e 6e 61 6d 65  r->typePtr->name
a5e0: 20 3a 20 22 22 3b 0a 20 20 20 20 20 20 20 20 20   : "";.         
a5f0: 20 20 20 63 68 61 72 20 63 20 3d 20 7a 54 79 70     char c = zTyp
a600: 65 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  e[0];.          
a610: 20 20 69 66 28 20 63 3d 3d 27 62 27 20 26 26 20    if( c=='b' && 
a620: 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 62 79  strcmp(zType,"by
a630: 74 65 61 72 72 61 79 22 29 3d 3d 30 20 26 26 20  tearray")==0 && 
a640: 70 56 61 72 2d 3e 62 79 74 65 73 3d 3d 30 20 29  pVar->bytes==0 )
a650: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
a660: 2f 2a 20 4f 6e 6c 79 20 6c 6f 61 64 20 61 20 42  /* Only load a B
a670: 4c 4f 42 20 74 79 70 65 20 69 66 20 74 68 65 20  LOB type if the 
a680: 54 63 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20  Tcl variable is 
a690: 61 20 62 79 74 65 61 72 72 61 79 20 61 6e 64 0a  a bytearray and.
a6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
a6b0: 20 68 61 73 20 6e 6f 20 73 74 72 69 6e 67 20 72   has no string r
a6c0: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20 2a  epresentation. *
a6d0: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
a6e0: 64 61 74 61 20 3d 20 54 63 6c 5f 47 65 74 42 79  data = Tcl_GetBy
a6f0: 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 70  teArrayFromObj(p
a700: 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20  Var, &n);.      
a710: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
a720: 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d 74 2c  bind_blob(pStmt,
a730: 20 69 2c 20 64 61 74 61 2c 20 6e 2c 20 53 51 4c   i, data, n, SQL
a740: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
a750: 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49             Tcl_I
a760: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 56 61 72  ncrRefCount(pVar
a770: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
a780: 20 61 70 50 61 72 6d 5b 6e 50 61 72 6d 2b 2b 5d   apParm[nParm++]
a790: 20 3d 20 70 56 61 72 3b 0a 20 20 20 20 20 20 20   = pVar;.       
a7a0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
a7b0: 63 3d 3d 27 62 27 20 26 26 20 73 74 72 63 6d 70  c=='b' && strcmp
a7c0: 28 7a 54 79 70 65 2c 22 62 6f 6f 6c 65 61 6e 22  (zType,"boolean"
a7d0: 29 3d 3d 30 29 20 7c 7c 0a 20 20 20 20 20 20 20  )==0) ||.       
a7e0: 20 20 20 20 20 20 20 20 20 20 20 28 63 3d 3d 27             (c=='
a7f0: 69 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79  i' && strcmp(zTy
a800: 70 65 2c 22 69 6e 74 22 29 3d 3d 30 29 20 29 7b  pe,"int")==0) ){
a810: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54  .              T
a820: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
a830: 28 69 6e 74 65 72 70 2c 20 70 56 61 72 2c 20 26  (interp, pVar, &
a840: 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
a850: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
a860: 6e 74 28 70 53 74 6d 74 2c 20 69 2c 20 6e 29 3b  nt(pStmt, i, n);
a870: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
a880: 73 65 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26  se if( c=='d' &&
a890: 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 64   strcmp(zType,"d
a8a0: 6f 75 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20  ouble")==0 ){.  
a8b0: 20 20 20 20 20 20 20 20 20 20 20 20 64 6f 75 62              doub
a8c0: 6c 65 20 72 3b 0a 20 20 20 20 20 20 20 20 20 20  le r;.          
a8d0: 20 20 20 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c      Tcl_GetDoubl
a8e0: 65 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  eFromObj(interp,
a8f0: 20 70 56 61 72 2c 20 26 72 29 3b 0a 20 20 20 20   pVar, &r);.    
a900: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
a910: 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28 70 53  3_bind_double(pS
a920: 74 6d 74 2c 20 69 2c 20 72 29 3b 0a 20 20 20 20  tmt, i, r);.    
a930: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
a940: 28 20 63 3d 3d 27 77 27 20 26 26 20 73 74 72 63  ( c=='w' && strc
a950: 6d 70 28 7a 54 79 70 65 2c 22 77 69 64 65 49 6e  mp(zType,"wideIn
a960: 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  t")==0 ){.      
a970: 20 20 20 20 20 20 20 20 54 63 6c 5f 57 69 64 65          Tcl_Wide
a980: 49 6e 74 20 76 3b 0a 20 20 20 20 20 20 20 20 20  Int v;.         
a990: 20 20 20 20 20 54 63 6c 5f 47 65 74 57 69 64 65       Tcl_GetWide
a9a0: 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
a9b0: 70 2c 20 70 56 61 72 2c 20 26 76 29 3b 0a 20 20  p, pVar, &v);.  
a9c0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
a9d0: 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
a9e0: 53 74 6d 74 2c 20 69 2c 20 76 29 3b 0a 20 20 20  Stmt, i, v);.   
a9f0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
aa00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
aa10: 74 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  ta = (unsigned c
aa20: 68 61 72 20 2a 29 54 63 6c 5f 47 65 74 53 74 72  har *)Tcl_GetStr
aa30: 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c  ingFromObj(pVar,
aa40: 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20   &n);.          
aa50: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
aa60: 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 2c 20  _text(pStmt, i, 
aa70: 28 63 68 61 72 20 2a 29 64 61 74 61 2c 20 6e 2c  (char *)data, n,
aa80: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
aa90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54  .              T
aaa0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
aab0: 70 56 61 72 29 3b 0a 20 20 20 20 20 20 20 20 20  pVar);.         
aac0: 20 20 20 20 20 61 70 50 61 72 6d 5b 6e 50 61 72       apParm[nPar
aad0: 6d 2b 2b 5d 20 3d 20 70 56 61 72 3b 0a 20 20 20  m++] = pVar;.   
aae0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
aaf0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
ab00: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
ab10: 62 69 6e 64 5f 6e 75 6c 6c 28 20 70 53 74 6d 74  bind_null( pStmt
ab20: 2c 20 69 20 29 3b 0a 20 20 20 20 20 20 20 20 20  , i );.         
ab30: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
ab40: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
ab50: 6f 6d 70 75 74 65 20 63 6f 6c 75 6d 6e 20 6e 61  ompute column na
ab60: 6d 65 73 20 2a 2f 0a 20 20 20 20 20 20 6e 43 6f  mes */.      nCo
ab70: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  l = sqlite3_colu
ab80: 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b  mn_count(pStmt);
ab90: 0a 20 20 20 20 20 20 69 66 28 20 70 53 63 72 69  .      if( pScri
aba0: 70 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70  pt ){.        ap
abb0: 43 6f 6c 4e 61 6d 65 20 3d 20 28 54 63 6c 5f 4f  ColName = (Tcl_O
abc0: 62 6a 2a 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20  bj**)Tcl_Alloc( 
abd0: 73 69 7a 65 6f 66 28 54 63 6c 5f 4f 62 6a 2a 29  sizeof(Tcl_Obj*)
abe0: 2a 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 20  *nCol );.       
abf0: 20 69 66 28 20 61 70 43 6f 6c 4e 61 6d 65 3d 3d   if( apColName==
ac00: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
ac10: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
ac20: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
ac30: 20 20 20 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d      apColName[i]
ac40: 20 3d 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 73   = dbTextToObj(s
ac50: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61  qlite3_column_na
ac60: 6d 65 28 70 53 74 6d 74 2c 69 29 29 3b 0a 20 20  me(pStmt,i));.  
ac70: 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72          Tcl_Incr
ac80: 52 65 66 43 6f 75 6e 74 28 61 70 43 6f 6c 4e 61  RefCount(apColNa
ac90: 6d 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  me[i]);.        
aca0: 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
acb0: 20 2f 2a 20 49 66 20 72 65 73 75 6c 74 73 20 61   /* If results a
acc0: 72 65 20 62 65 69 6e 67 20 73 74 6f 72 65 64 20  re being stored 
acd0: 69 6e 20 61 6e 20 61 72 72 61 79 20 76 61 72 69  in an array vari
ace0: 61 62 6c 65 2c 20 74 68 65 6e 20 63 72 65 61 74  able, then creat
acf0: 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 61  e.      ** the a
ad00: 72 72 61 79 28 2a 29 20 65 6e 74 72 79 20 66 6f  rray(*) entry fo
ad10: 72 20 74 68 61 74 20 61 72 72 61 79 0a 20 20 20  r that array.   
ad20: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
ad30: 70 41 72 72 61 79 20 29 7b 0a 20 20 20 20 20 20  pArray ){.      
ad40: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6f 6c 4c    Tcl_Obj *pColL
ad50: 69 73 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a  ist = Tcl_NewObj
ad60: 28 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  ();.        Tcl_
ad70: 4f 62 6a 20 2a 70 53 74 61 72 20 3d 20 54 63 6c  Obj *pStar = Tcl
ad80: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 2a  _NewStringObj("*
ad90: 22 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  ", -1);.        
ada0: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
adb0: 28 70 43 6f 6c 4c 69 73 74 29 3b 0a 20 20 20 20  (pColList);.    
adc0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
add0: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
ade0: 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a       Tcl_ListObj
adf0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
ae00: 74 65 72 70 2c 20 70 43 6f 6c 4c 69 73 74 2c 20  terp, pColList, 
ae10: 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20  apColName[i]);. 
ae20: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ae30: 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28   Tcl_ObjSetVar2(
ae40: 69 6e 74 65 72 70 2c 20 70 41 72 72 61 79 2c 20  interp, pArray, 
ae50: 70 53 74 61 72 2c 20 70 43 6f 6c 4c 69 73 74 2c  pStar, pColList,
ae60: 30 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  0);.        Tcl_
ae70: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6f  DecrRefCount(pCo
ae80: 6c 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20  lList);.        
ae90: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
aea0: 28 70 53 74 61 72 29 3b 0a 20 20 20 20 20 20 7d  (pStar);.      }
aeb0: 0a 0a 20 20 20 20 20 20 2f 2a 20 45 78 65 63 75  ..      /* Execu
aec0: 74 65 20 74 68 65 20 53 51 4c 0a 20 20 20 20 20  te the SQL.     
aed0: 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28   */.      while(
aee0: 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 26 26 20 70   rc==TCL_OK && p
aef0: 53 74 6d 74 20 26 26 20 53 51 4c 49 54 45 5f 52  Stmt && SQLITE_R
af00: 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
af10: 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20  (pStmt) ){.     
af20: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
af30: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
af40: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61      Tcl_Obj *pVa
af50: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 0a 20 20  l;.          .  
af60: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 70          /* Set p
af70: 56 61 6c 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  Val to contain t
af80: 68 65 20 69 27 74 68 20 63 6f 6c 75 6d 6e 20 6f  he i'th column o
af90: 66 20 74 68 69 73 20 72 6f 77 2e 20 2a 2f 0a 20  f this row. */. 
afa0: 20 20 20 20 20 20 20 20 20 73 77 69 74 63 68 28           switch(
afb0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
afc0: 74 79 70 65 28 70 53 74 6d 74 2c 20 69 29 20 29  type(pStmt, i) )
afd0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61  {.            ca
afe0: 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20  se SQLITE_BLOB: 
aff0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
b000: 69 6e 74 20 62 79 74 65 73 20 3d 20 73 71 6c 69  int bytes = sqli
b010: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73  te3_column_bytes
b020: 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20  (pStmt, i);.    
b030: 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d            pVal =
b040: 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61   Tcl_NewByteArra
b050: 79 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 6f 6c  yObj(sqlite3_col
b060: 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20  umn_blob(pStmt, 
b070: 69 29 2c 20 62 79 74 65 73 29 3b 0a 20 20 20 20  i), bytes);.    
b080: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
b090: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
b0a0: 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20             case 
b0b0: 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20  SQLITE_INTEGER: 
b0c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
b0d0: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 76 20 3d  sqlite_int64 v =
b0e0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
b0f0: 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 69 29 3b  int64(pStmt, i);
b100: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
b110: 66 28 20 76 3e 3d 2d 32 31 34 37 34 38 33 36 34  f( v>=-214748364
b120: 37 20 26 26 20 76 3c 3d 32 31 34 37 34 38 33 36  7 && v<=21474836
b130: 34 37 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  47 ){.          
b140: 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c        pVal = Tcl
b150: 5f 4e 65 77 49 6e 74 4f 62 6a 28 76 29 3b 0a 20  _NewIntObj(v);. 
b160: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c               }el
b170: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
b180: 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e      pVal = Tcl_N
b190: 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 76 29 3b  ewWideIntObj(v);
b1a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
b1b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
b1c0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
b1d0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
b1e0: 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41  case SQLITE_FLOA
b1f0: 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  T: {.           
b200: 20 20 20 64 6f 75 62 6c 65 20 72 20 3d 20 73 71     double r = sq
b210: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75  lite3_column_dou
b220: 62 6c 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20  ble(pStmt, i);. 
b230: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56 61               pVa
b240: 6c 20 3d 20 54 63 6c 5f 4e 65 77 44 6f 75 62 6c  l = Tcl_NewDoubl
b250: 65 4f 62 6a 28 72 29 3b 0a 20 20 20 20 20 20 20  eObj(r);.       
b260: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b270: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
b280: 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
b290: 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  ITE_NULL: {.    
b2a0: 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d            pVal =
b2b0: 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 70 44 62   dbTextToObj(pDb
b2c0: 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  ->zNull);.      
b2d0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
b2e0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
b2f0: 20 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74           default
b300: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  : {.            
b310: 20 20 70 56 61 6c 20 3d 20 64 62 54 65 78 74 54    pVal = dbTextT
b320: 6f 4f 62 6a 28 28 63 68 61 72 20 2a 29 73 71 6c  oObj((char *)sql
b330: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
b340: 28 70 53 74 6d 74 2c 20 69 29 29 3b 0a 20 20 20  (pStmt, i));.   
b350: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
b360: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
b370: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20            }.  . 
b380: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 63           if( pSc
b390: 72 69 70 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ript ){.        
b3a0: 20 20 20 20 69 66 28 20 70 41 72 72 61 79 3d 3d      if( pArray==
b3b0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
b3c0: 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72     Tcl_ObjSetVar
b3d0: 32 28 69 6e 74 65 72 70 2c 20 61 70 43 6f 6c 4e  2(interp, apColN
b3e0: 61 6d 65 5b 69 5d 2c 20 30 2c 20 70 56 61 6c 2c  ame[i], 0, pVal,
b3f0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
b400: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
b410: 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74        Tcl_ObjSet
b420: 56 61 72 32 28 69 6e 74 65 72 70 2c 20 70 41 72  Var2(interp, pAr
b430: 72 61 79 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b 69  ray, apColName[i
b440: 5d 2c 20 70 56 61 6c 2c 20 30 29 3b 0a 20 20 20  ], pVal, 0);.   
b450: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
b460: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
b470: 68 6f 69 63 65 3d 3d 44 42 5f 4f 4e 45 43 4f 4c  hoice==DB_ONECOL
b480: 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  UMN ){.         
b490: 20 20 20 61 73 73 65 72 74 28 20 70 52 65 74 3d     assert( pRet=
b4a0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
b4b0: 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20 29 7b    if( pRet==0 ){
b4c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
b4d0: 52 65 74 20 3d 20 70 56 61 6c 3b 0a 20 20 20 20  Ret = pVal;.    
b4e0: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e            Tcl_In
b4f0: 63 72 52 65 66 43 6f 75 6e 74 28 70 52 65 74 29  crRefCount(pRet)
b500: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
b510: 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
b520: 20 54 43 4c 5f 42 52 45 41 4b 3b 0a 20 20 20 20   TCL_BREAK;.    
b530: 20 20 20 20 20 20 20 20 69 20 3d 20 6e 43 6f 6c          i = nCol
b540: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
b550: 65 20 69 66 28 20 63 68 6f 69 63 65 3d 3d 44 42  e if( choice==DB
b560: 5f 45 58 49 53 54 53 20 29 7b 0a 20 20 20 20 20  _EXISTS ){.     
b570: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
b580: 52 65 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Ret==0 );.      
b590: 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a        Tcl_SetObj
b5a0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
b5b0: 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a  cl_NewBooleanObj
b5c0: 28 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  (1));.          
b5d0: 20 20 72 63 20 3d 20 54 43 4c 5f 42 52 45 41 4b    rc = TCL_BREAK
b5e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 20  ;.            i 
b5f0: 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  = nCol;.        
b600: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
b610: 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a       Tcl_ListObj
b620: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
b630: 74 65 72 70 2c 20 70 52 65 74 2c 20 70 56 61 6c  terp, pRet, pVal
b640: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
b650: 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20         }.  .    
b660: 20 20 20 20 69 66 28 20 70 53 63 72 69 70 74 20      if( pScript 
b670: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
b680: 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28  = Tcl_EvalObjEx(
b690: 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c  interp, pScript,
b6a0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   0);.          i
b6b0: 66 28 20 72 63 3d 3d 54 43 4c 5f 43 4f 4e 54 49  f( rc==TCL_CONTI
b6c0: 4e 55 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NUE ){.         
b6d0: 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a     rc = TCL_OK;.
b6e0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
b6f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
b700: 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f      if( rc==TCL_
b710: 42 52 45 41 4b 20 29 7b 0a 20 20 20 20 20 20 20  BREAK ){.       
b720: 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20   rc = TCL_OK;.  
b730: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
b740: 46 72 65 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  Free the column 
b750: 6e 61 6d 65 20 6f 62 6a 65 63 74 73 20 2a 2f 0a  name objects */.
b760: 20 20 20 20 20 20 69 66 28 20 70 53 63 72 69 70        if( pScrip
b770: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  t ){.        for
b780: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
b790: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63  +){.          Tc
b7a0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 61  l_DecrRefCount(a
b7b0: 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20  pColName[i]);.  
b7c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
b7d0: 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29  Tcl_Free((char*)
b7e0: 61 70 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20 20  apColName);.    
b7f0: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 72    }..      /* Fr
b800: 65 65 20 74 68 65 20 62 6f 75 6e 64 20 73 74 72  ee the bound str
b810: 69 6e 67 20 61 6e 64 20 62 6c 6f 62 20 70 61 72  ing and blob par
b820: 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 20 20 20  ameters */.     
b830: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 61 72   for(i=0; i<nPar
b840: 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  m; i++){.       
b850: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
b860: 74 28 61 70 50 61 72 6d 5b 69 5d 29 3b 0a 20 20  t(apParm[i]);.  
b870: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
b880: 61 70 50 61 72 6d 21 3d 61 50 61 72 6d 20 29 7b  apParm!=aParm ){
b890: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65  .        Tcl_Fre
b8a0: 65 28 28 63 68 61 72 2a 29 61 70 50 61 72 6d 29  e((char*)apParm)
b8b0: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
b8c0: 20 2f 2a 20 52 65 73 65 74 20 74 68 65 20 73 74   /* Reset the st
b8d0: 61 74 65 6d 65 6e 74 2e 20 20 49 66 20 74 68 65  atement.  If the
b8e0: 20 72 65 73 75 6c 74 20 63 6f 64 65 20 69 73 20   result code is 
b8f0: 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 2c 20 74  SQLITE_SCHEMA, t
b900: 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6c 75  hen.      ** flu
b910: 73 68 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  sh the statement
b920: 20 63 61 63 68 65 20 61 6e 64 20 74 72 79 20 74   cache and try t
b930: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 61 67 61  he statement aga
b940: 69 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  in..      */.   
b950: 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
b960: 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20  _reset(pStmt);. 
b970: 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
b980: 53 43 48 45 4d 41 3d 3d 72 63 32 20 29 7b 0a 20  SCHEMA==rc2 ){. 
b990: 20 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20         /* After 
b9a0: 61 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2c  a schema change,
b9b0: 20 66 6c 75 73 68 20 74 68 65 20 63 61 63 68 65   flush the cache
b9c0: 20 61 6e 64 20 74 72 79 20 74 6f 20 72 75 6e 20   and try to run 
b9d0: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  the.        ** s
b9e0: 74 61 74 65 6d 65 6e 74 20 61 67 61 69 6e 0a 20  tatement again. 
b9f0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
ba00: 20 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65    flushStmtCache
ba10: 28 20 70 44 62 20 29 3b 0a 20 20 20 20 20 20 20  ( pDb );.       
ba20: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
ba30: 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  e(pStmt);.      
ba40: 20 20 69 66 28 20 70 50 72 65 53 74 6d 74 20 29    if( pPreStmt )
ba50: 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a   Tcl_Free((char*
ba60: 29 70 50 72 65 53 74 6d 74 29 3b 0a 20 20 20 20  )pPreStmt);.    
ba70: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
ba80: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 53 51      }else if( SQ
ba90: 4c 49 54 45 5f 4f 4b 21 3d 72 63 32 20 29 7b 0a  LITE_OK!=rc2 ){.
baa0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20          /* If a 
bab0: 72 75 6e 2d 74 69 6d 65 20 65 72 72 6f 72 20 6f  run-time error o
bac0: 63 63 75 72 73 2c 20 72 65 70 6f 72 74 20 74 68  ccurs, report th
bad0: 65 20 65 72 72 6f 72 20 61 6e 64 20 73 74 6f 70  e error and stop
bae0: 20 72 65 61 64 69 6e 67 0a 20 20 20 20 20 20 20   reading.       
baf0: 20 2a 2a 20 74 68 65 20 53 51 4c 0a 20 20 20 20   ** the SQL.    
bb00: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 54      */.        T
bb10: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
bb20: 69 6e 74 65 72 70 2c 20 64 62 54 65 78 74 54 6f  interp, dbTextTo
bb30: 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65 72 72 6d  Obj(sqlite3_errm
bb40: 73 67 28 70 44 62 2d 3e 64 62 29 29 29 3b 0a 20  sg(pDb->db)));. 
bb50: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
bb60: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
bb70: 20 20 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c          rc = TCL
bb80: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
bb90: 69 66 28 20 70 50 72 65 53 74 6d 74 20 29 20 54  if( pPreStmt ) T
bba0: 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70  cl_Free((char*)p
bbb0: 50 72 65 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  PreStmt);.      
bbc0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
bbd0: 65 6c 73 65 20 69 66 28 20 70 44 62 2d 3e 6d 61  else if( pDb->ma
bbe0: 78 53 74 6d 74 3c 3d 30 20 29 7b 0a 20 20 20 20  xStmt<=0 ){.    
bbf0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61      /* If the ca
bc00: 63 68 65 20 69 73 20 74 75 72 6e 65 64 20 6f 66  che is turned of
bc10: 66 2c 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 74  f, deallocated t
bc20: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  he statement */.
bc30: 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72 65          if( pPre
bc40: 53 74 6d 74 20 29 20 54 63 6c 5f 46 72 65 65 28  Stmt ) Tcl_Free(
bc50: 28 63 68 61 72 2a 29 70 50 72 65 53 74 6d 74 29  (char*)pPreStmt)
bc60: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
bc70: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
bc80: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
bc90: 20 20 20 20 20 20 20 20 2f 2a 20 45 76 65 72 79          /* Every
bca0: 74 68 69 6e 67 20 77 6f 72 6b 65 64 20 61 6e 64  thing worked and
bcb0: 20 74 68 65 20 63 61 63 68 65 20 69 73 20 6f 70   the cache is op
bcc0: 65 72 61 74 69 6f 6e 61 6c 2e 0a 20 20 20 20 20  erational..     
bcd0: 20 20 20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e     ** Create a n
bce0: 65 77 20 53 71 6c 50 72 65 70 61 72 65 64 53 74  ew SqlPreparedSt
bcf0: 6d 74 20 73 74 72 75 63 74 75 72 65 20 69 66 20  mt structure if 
bd00: 77 65 20 6e 65 65 64 20 6f 6e 65 2e 0a 20 20 20  we need one..   
bd10: 20 20 20 20 20 2a 2a 20 28 49 66 20 77 65 20 61       ** (If we a
bd20: 6c 72 65 61 64 79 20 68 61 76 65 20 6f 6e 65 20  lready have one 
bd30: 77 65 20 63 61 6e 20 6a 75 73 74 20 72 65 75 73  we can just reus
bd40: 65 20 69 74 2e 29 0a 20 20 20 20 20 20 20 20 2a  e it.).        *
bd50: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  /.        if( pP
bd60: 72 65 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20  reStmt==0 ){.   
bd70: 20 20 20 20 20 20 20 6c 65 6e 20 3d 20 7a 4c 65         len = zLe
bd80: 66 74 20 2d 20 7a 53 71 6c 3b 0a 20 20 20 20 20  ft - zSql;.     
bd90: 20 20 20 20 20 70 50 72 65 53 74 6d 74 20 3d 20       pPreStmt = 
bda0: 28 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74  (SqlPreparedStmt
bdb0: 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a  *)Tcl_Alloc( siz
bdc0: 65 6f 66 28 2a 70 50 72 65 53 74 6d 74 29 20 2b  eof(*pPreStmt) +
bdd0: 20 6c 65 6e 20 29 3b 0a 20 20 20 20 20 20 20 20   len );.        
bde0: 20 20 69 66 28 20 70 50 72 65 53 74 6d 74 3d 3d    if( pPreStmt==
bdf0: 30 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  0 ) return TCL_E
be00: 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20  RROR;.          
be10: 70 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74 20  pPreStmt->pStmt 
be20: 3d 20 70 53 74 6d 74 3b 0a 20 20 20 20 20 20 20  = pStmt;.       
be30: 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71     pPreStmt->nSq
be40: 6c 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 20  l = len;.       
be50: 20 20 20 6d 65 6d 63 70 79 28 70 50 72 65 53 74     memcpy(pPreSt
be60: 6d 74 2d 3e 7a 53 71 6c 2c 20 7a 53 71 6c 2c 20  mt->zSql, zSql, 
be70: 6c 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  len);.          
be80: 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 5b 6c  pPreStmt->zSql[l
be90: 65 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  en] = 0;.       
bea0: 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   }..        /* A
beb0: 64 64 20 74 68 65 20 70 72 65 70 61 72 65 64 20  dd the prepared 
bec0: 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 74 68 65  statement to the
bed0: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
bee0: 65 20 63 61 63 68 65 20 6c 69 73 74 0a 20 20 20  e cache list.   
bef0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
bf00: 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 20  pPreStmt->pNext 
bf10: 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 3b  = pDb->stmtList;
bf20: 0a 20 20 20 20 20 20 20 20 70 50 72 65 53 74 6d  .        pPreStm
bf30: 74 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20  t->pPrev = 0;.  
bf40: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 73        if( pDb->s
bf50: 74 6d 74 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  tmtList ){.     
bf60: 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73      pDb->stmtLis
bf70: 74 2d 3e 70 50 72 65 76 20 3d 20 70 50 72 65 53  t->pPrev = pPreS
bf80: 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  tmt;.        }. 
bf90: 20 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74         pDb->stmt
bfa0: 4c 69 73 74 20 3d 20 70 50 72 65 53 74 6d 74 3b  List = pPreStmt;
bfb0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 44 62  .        if( pDb
bfc0: 2d 3e 73 74 6d 74 4c 61 73 74 3d 3d 30 20 29 7b  ->stmtLast==0 ){
bfd0: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
bfe0: 74 28 20 70 44 62 2d 3e 6e 53 74 6d 74 3d 3d 30  t( pDb->nStmt==0
bff0: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44   );.          pD
c000: 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20 70 50  b->stmtLast = pP
c010: 72 65 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20  reStmt;.        
c020: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
c030: 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 6e 53   assert( pDb->nS
c040: 74 6d 74 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  tmt>0 );.       
c050: 20 7d 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e   }.        pDb->
c060: 6e 53 74 6d 74 2b 2b 3b 0a 20 20 20 0a 20 20 20  nStmt++;.   .   
c070: 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 68 61       /* If we ha
c080: 76 65 20 74 6f 6f 20 6d 61 6e 79 20 73 74 61 74  ve too many stat
c090: 65 6d 65 6e 74 20 69 6e 20 63 61 63 68 65 2c 20  ement in cache, 
c0a0: 72 65 6d 6f 76 65 20 74 68 65 20 73 75 72 70 6c  remove the surpl
c0b0: 75 73 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20  us from the.    
c0c0: 20 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68      ** end of th
c0d0: 65 20 63 61 63 68 65 20 6c 69 73 74 2e 0a 20 20  e cache list..  
c0e0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
c0f0: 20 77 68 69 6c 65 28 20 70 44 62 2d 3e 6e 53 74   while( pDb->nSt
c100: 6d 74 3e 70 44 62 2d 3e 6d 61 78 53 74 6d 74 20  mt>pDb->maxStmt 
c110: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
c120: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 44  ite3_finalize(pD
c130: 62 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e 70 53 74  b->stmtLast->pSt
c140: 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  mt);.          p
c150: 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20 70  Db->stmtLast = p
c160: 44 62 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e 70 50  Db->stmtLast->pP
c170: 72 65 76 3b 0a 20 20 20 20 20 20 20 20 20 20 54  rev;.          T
c180: 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70  cl_Free((char*)p
c190: 44 62 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e 70 4e  Db->stmtLast->pN
c1a0: 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ext);.          
c1b0: 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e 70  pDb->stmtLast->p
c1c0: 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Next = 0;.      
c1d0: 20 20 20 20 70 44 62 2d 3e 6e 53 74 6d 74 2d 2d      pDb->nStmt--
c1e0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
c1f0: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 50 72    }..      /* Pr
c200: 6f 63 65 65 64 20 74 6f 20 74 68 65 20 6e 65 78  oceed to the nex
c210: 74 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  t statement */. 
c220: 20 20 20 20 20 7a 53 71 6c 20 3d 20 7a 4c 65 66       zSql = zLef
c230: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c  t;.    }.    Tcl
c240: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 6f 62  _DecrRefCount(ob
c250: 6a 76 5b 32 5d 29 3b 0a 0a 20 20 20 20 69 66 28  jv[2]);..    if(
c260: 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 69   pRet ){.      i
c270: 66 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b  f( rc==TCL_OK ){
c280: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74  .        Tcl_Set
c290: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
c2a0: 2c 20 70 52 65 74 29 3b 0a 20 20 20 20 20 20 7d  , pRet);.      }
c2b0: 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52  .      Tcl_DecrR
c2c0: 65 66 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20  efCount(pRet);. 
c2d0: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
c2e0: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
c2f0: 20 20 20 24 64 62 20 66 75 6e 63 74 69 6f 6e 20     $db function 
c300: 4e 41 4d 45 20 53 43 52 49 50 54 0a 20 20 2a 2a  NAME SCRIPT.  **
c310: 0a 20 20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  .  ** Create a n
c320: 65 77 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20  ew SQL function 
c330: 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 57 68  called NAME.  Wh
c340: 65 6e 65 76 65 72 20 74 68 61 74 20 66 75 6e 63  enever that func
c350: 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 61 6c  tion is.  ** cal
c360: 6c 65 64 2c 20 69 6e 76 6f 6b 65 20 53 43 52 49  led, invoke SCRI
c370: 50 54 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  PT to evaluate t
c380: 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a  he function..  *
c390: 2f 0a 20 20 63 61 73 65 20 44 42 5f 46 55 4e 43  /.  case DB_FUNC
c3a0: 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 53 71 6c 46  TION: {.    SqlF
c3b0: 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20 20 20  unc *pFunc;.    
c3c0: 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74  Tcl_Obj *pScript
c3d0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d  ;.    char *zNam
c3e0: 65 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  e;.    if( objc!
c3f0: 3d 34 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =4 ){.      Tcl_
c400: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
c410: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e  erp, 2, objv, "N
c420: 41 4d 45 20 53 43 52 49 50 54 22 29 3b 0a 20 20  AME SCRIPT");.  
c430: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
c440: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
c450: 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53  zName = Tcl_GetS
c460: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
c470: 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20 70 53  v[2], 0);.    pS
c480: 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 33 5d 3b  cript = objv[3];
c490: 0a 20 20 20 20 70 46 75 6e 63 20 3d 20 66 69 6e  .    pFunc = fin
c4a0: 64 53 71 6c 46 75 6e 63 28 70 44 62 2c 20 7a 4e  dSqlFunc(pDb, zN
c4b0: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 46  ame);.    if( pF
c4c0: 75 6e 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  unc==0 ) return 
c4d0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 69  TCL_ERROR;.    i
c4e0: 66 28 20 70 46 75 6e 63 2d 3e 70 53 63 72 69 70  f( pFunc->pScrip
c4f0: 74 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44  t ){.      Tcl_D
c500: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 46 75 6e  ecrRefCount(pFun
c510: 63 2d 3e 70 53 63 72 69 70 74 29 3b 0a 20 20 20  c->pScript);.   
c520: 20 7d 0a 20 20 20 20 70 46 75 6e 63 2d 3e 70 53   }.    pFunc->pS
c530: 63 72 69 70 74 20 3d 20 70 53 63 72 69 70 74 3b  cript = pScript;
c540: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
c550: 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a  Count(pScript);.
c560: 20 20 20 20 70 46 75 6e 63 2d 3e 75 73 65 45 76      pFunc->useEv
c570: 61 6c 4f 62 6a 76 20 3d 20 73 61 66 65 54 6f 55  alObjv = safeToU
c580: 73 65 45 76 61 6c 4f 62 6a 76 28 69 6e 74 65 72  seEvalObjv(inter
c590: 70 2c 20 70 53 63 72 69 70 74 29 3b 0a 20 20 20  p, pScript);.   
c5a0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
c5b0: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70 44  eate_function(pD
c5c0: 62 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 2d 31  b->db, zName, -1
c5d0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20  , SQLITE_UTF8,. 
c5e0: 20 20 20 20 20 20 20 70 46 75 6e 63 2c 20 74 63         pFunc, tc
c5f0: 6c 53 71 6c 46 75 6e 63 2c 20 30 2c 20 30 29 3b  lSqlFunc, 0, 0);
c600: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
c610: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
c620: 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  rc = TCL_ERROR;.
c630: 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73        Tcl_SetRes
c640: 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
c650: 72 20 2a 29 73 71 6c 69 74 65 33 5f 65 72 72 6d  r *)sqlite3_errm
c660: 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 54 43 4c  sg(pDb->db), TCL
c670: 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20  _VOLATILE);.    
c680: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
c690: 4d 75 73 74 20 66 6c 75 73 68 20 61 6e 79 20 63  Must flush any c
c6a0: 61 63 68 65 64 20 73 74 61 74 65 6d 65 6e 74 73  ached statements
c6b0: 20 2a 2f 0a 20 20 20 20 20 20 66 6c 75 73 68 53   */.      flushS
c6c0: 74 6d 74 43 61 63 68 65 28 20 70 44 62 20 29 3b  tmtCache( pDb );
c6d0: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
c6e0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
c6f0: 20 20 20 20 20 24 64 62 20 6e 75 6c 6c 76 61 6c       $db nullval
c700: 75 65 20 3f 53 54 52 49 4e 47 3f 0a 20 20 2a 2a  ue ?STRING?.  **
c710: 0a 20 20 2a 2a 20 43 68 61 6e 67 65 20 74 65 78  .  ** Change tex
c720: 74 20 75 73 65 64 20 77 68 65 6e 20 61 20 4e 55  t used when a NU
c730: 4c 4c 20 63 6f 6d 65 73 20 62 61 63 6b 20 66 72  LL comes back fr
c740: 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  om the database.
c750: 20 49 66 20 3f 53 54 52 49 4e 47 3f 0a 20 20 2a   If ?STRING?.  *
c760: 2a 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74  * is not present
c770: 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 72 65  , then the curre
c780: 6e 74 20 73 74 72 69 6e 67 20 75 73 65 64 20 66  nt string used f
c790: 6f 72 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  or NULL is retur
c7a0: 6e 65 64 2e 0a 20 20 2a 2a 20 49 66 20 53 54 52  ned..  ** If STR
c7b0: 49 4e 47 20 69 73 20 70 72 65 73 65 6e 74 2c 20  ING is present, 
c7c0: 74 68 65 6e 20 53 54 52 49 4e 47 20 69 73 20 72  then STRING is r
c7d0: 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2a 0a 20 20  eturned..  **.  
c7e0: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 4e 55 4c  */.  case DB_NUL
c7f0: 4c 56 41 4c 55 45 3a 20 7b 0a 20 20 20 20 69 66  LVALUE: {.    if
c800: 28 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a  ( objc!=2 && obj
c810: 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=3 ){.      Tc
c820: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
c830: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
c840: 22 4e 55 4c 4c 56 41 4c 55 45 22 29 3b 0a 20 20  "NULLVALUE");.  
c850: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
c860: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
c870: 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20  if( objc==3 ){. 
c880: 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20       int len;.  
c890: 20 20 20 20 63 68 61 72 20 2a 7a 4e 75 6c 6c 20      char *zNull 
c8a0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
c8b0: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
c8c0: 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  &len);.      if(
c8d0: 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 29 7b 0a 20   pDb->zNull ){. 
c8e0: 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28         Tcl_Free(
c8f0: 70 44 62 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20 20 20  pDb->zNull);.   
c900: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a     }.      if( z
c910: 4e 75 6c 6c 20 26 26 20 6c 65 6e 3e 30 20 29 7b  Null && len>0 ){
c920: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e  .        pDb->zN
c930: 75 6c 6c 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28  ull = Tcl_Alloc(
c940: 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20   len + 1 );.    
c950: 20 20 20 20 73 74 72 6e 63 70 79 28 70 44 62 2d      strncpy(pDb-
c960: 3e 7a 4e 75 6c 6c 2c 20 7a 4e 75 6c 6c 2c 20 6c  >zNull, zNull, l
c970: 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 44 62  en);.        pDb
c980: 2d 3e 7a 4e 75 6c 6c 5b 6c 65 6e 5d 20 3d 20 27  ->zNull[len] = '
c990: 5c 30 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  \0';.      }else
c9a0: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
c9b0: 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  Null = 0;.      
c9c0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f  }.    }.    Tcl_
c9d0: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
c9e0: 65 72 70 2c 20 64 62 54 65 78 74 54 6f 4f 62 6a  erp, dbTextToObj
c9f0: 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29 29 3b 0a 20  (pDb->zNull));. 
ca00: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
ca10: 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62   /*.  **     $db
ca20: 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77   last_insert_row
ca30: 69 64 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65  id .  **.  ** Re
ca40: 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20  turn an integer 
ca50: 77 68 69 63 68 20 69 73 20 74 68 65 20 52 4f 57  which is the ROW
ca60: 49 44 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20  ID for the most 
ca70: 72 65 63 65 6e 74 20 69 6e 73 65 72 74 2e 0a 20  recent insert.. 
ca80: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 4c 41   */.  case DB_LA
ca90: 53 54 5f 49 4e 53 45 52 54 5f 52 4f 57 49 44 3a  ST_INSERT_ROWID:
caa0: 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a   {.    Tcl_Obj *
cab0: 70 52 65 73 75 6c 74 3b 0a 20 20 20 20 69 6e 74  pResult;.    int
cac0: 20 72 6f 77 69 64 3b 0a 20 20 20 20 69 66 28 20   rowid;.    if( 
cad0: 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 20  objc!=2 ){.     
cae0: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
caf0: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
cb00: 76 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 72 65  v, "");.      re
cb10: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
cb20: 20 20 20 20 7d 0a 20 20 20 20 72 6f 77 69 64 20      }.    rowid 
cb30: 3d 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69  = sqlite3_last_i
cb40: 6e 73 65 72 74 5f 72 6f 77 69 64 28 70 44 62 2d  nsert_rowid(pDb-
cb50: 3e 64 62 29 3b 0a 20 20 20 20 70 52 65 73 75 6c  >db);.    pResul
cb60: 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65  t = Tcl_GetObjRe
cb70: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  sult(interp);.  
cb80: 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f 62 6a 28    Tcl_SetIntObj(
cb90: 70 52 65 73 75 6c 74 2c 20 72 6f 77 69 64 29 3b  pResult, rowid);
cba0: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
cbb0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 44  .  /*.  ** The D
cbc0: 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 20 6d 65 74 68  B_ONECOLUMN meth
cbd0: 6f 64 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  od is implemente
cbe0: 64 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 20  d together with 
cbf0: 44 42 5f 45 56 41 4c 2e 0a 20 20 2a 2f 0a 0a 20  DB_EVAL..  */.. 
cc00: 20 2f 2a 20 20 20 20 24 64 62 20 70 72 6f 67 72   /*    $db progr
cc10: 65 73 73 20 3f 4e 20 43 41 4c 4c 42 41 43 4b 3f  ess ?N CALLBACK?
cc20: 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 49 6e 76 6f  .  ** .  ** Invo
cc30: 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c  ke the given cal
cc40: 6c 62 61 63 6b 20 65 76 65 72 79 20 4e 20 76 69  lback every N vi
cc50: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 6f 70  rtual machine op
cc60: 63 6f 64 65 73 20 77 68 69 6c 65 20 65 78 65 63  codes while exec
cc70: 75 74 69 6e 67 0a 20 20 2a 2a 20 71 75 65 72 69  uting.  ** queri
cc80: 65 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  es..  */.  case 
cc90: 44 42 5f 50 52 4f 47 52 45 53 53 3a 20 7b 0a 20  DB_PROGRESS: {. 
cca0: 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29     if( objc==2 )
ccb0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  {.      if( pDb-
ccc0: 3e 7a 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20  >zProgress ){.  
ccd0: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
cce0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
ccf0: 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 2c 20 30  Db->zProgress, 0
cd00: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
cd10: 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 34  else if( objc==4
cd20: 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
cd30: 7a 50 72 6f 67 72 65 73 73 3b 0a 20 20 20 20 20  zProgress;.     
cd40: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20   int len;.      
cd50: 69 6e 74 20 4e 3b 0a 20 20 20 20 20 20 69 66 28  int N;.      if(
cd60: 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74   TCL_OK!=Tcl_Get
cd70: 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
cd80: 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 4e 29 20  p, objv[2], &N) 
cd90: 29 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  ){..return TCL_E
cda0: 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 3b 0a 20  RROR;.      };. 
cdb0: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50       if( pDb->zP
cdc0: 72 6f 67 72 65 73 73 20 29 7b 0a 20 20 20 20 20  rogress ){.     
cdd0: 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d     Tcl_Free(pDb-
cde0: 3e 7a 50 72 6f 67 72 65 73 73 29 3b 0a 20 20 20  >zProgress);.   
cdf0: 20 20 20 7d 0a 20 20 20 20 20 20 7a 50 72 6f 67     }.      zProg
ce00: 72 65 73 73 20 3d 20 54 63 6c 5f 47 65 74 53 74  ress = Tcl_GetSt
ce10: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
ce20: 5b 33 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20  [3], &len);.    
ce30: 20 20 69 66 28 20 7a 50 72 6f 67 72 65 73 73 20    if( zProgress 
ce40: 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20  && len>0 ){.    
ce50: 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65      pDb->zProgre
ce60: 73 73 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20  ss = Tcl_Alloc( 
ce70: 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20  len + 1 );.     
ce80: 20 20 20 73 74 72 63 70 79 28 70 44 62 2d 3e 7a     strcpy(pDb->z
ce90: 50 72 6f 67 72 65 73 73 2c 20 7a 50 72 6f 67 72  Progress, zProgr
cea0: 65 73 73 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ess);.      }els
ceb0: 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  e{.        pDb->
cec0: 7a 50 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20  zProgress = 0;. 
ced0: 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53       }.#ifndef S
cee0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52  QLITE_OMIT_PROGR
cef0: 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 20 20 20  ESS_CALLBACK.   
cf00: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f     if( pDb->zPro
cf10: 67 72 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20  gress ){.       
cf20: 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69   pDb->interp = i
cf30: 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73  nterp;.        s
cf40: 71 6c 69 74 65 33 5f 70 72 6f 67 72 65 73 73 5f  qlite3_progress_
cf50: 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c  handler(pDb->db,
cf60: 20 4e 2c 20 44 62 50 72 6f 67 72 65 73 73 48 61   N, DbProgressHa
cf70: 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20  ndler, pDb);.   
cf80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
cf90: 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 67 72 65    sqlite3_progre
cfa0: 73 73 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e  ss_handler(pDb->
cfb0: 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  db, 0, 0, 0);.  
cfc0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
cfd0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63   }else{.      Tc
cfe0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
cff0: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
d000: 22 4e 20 43 41 4c 4c 42 41 43 4b 22 29 3b 0a 20  "N CALLBACK");. 
d010: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
d020: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
d030: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
d040: 2a 20 20 20 20 24 64 62 20 70 72 6f 66 69 6c 65  *    $db profile
d050: 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a   ?CALLBACK?.  **
d060: 0a 20 20 2a 2a 20 4d 61 6b 65 20 61 72 72 61 6e  .  ** Make arran
d070: 67 65 6d 65 6e 74 73 20 74 6f 20 69 6e 76 6f 6b  gements to invok
d080: 65 20 74 68 65 20 43 41 4c 4c 42 41 43 4b 20 72  e the CALLBACK r
d090: 6f 75 74 69 6e 65 20 61 66 74 65 72 20 65 61 63  outine after eac
d0a0: 68 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 0a  h SQL statement.
d0b0: 20 20 2a 2a 20 74 68 61 74 20 68 61 73 20 72 75    ** that has ru
d0c0: 6e 2e 20 20 54 68 65 20 74 65 78 74 20 6f 66 20  n.  The text of 
d0d0: 74 68 65 20 53 51 4c 20 61 6e 64 20 74 68 65 20  the SQL and the 
d0e0: 61 6d 6f 75 6e 74 20 6f 66 20 65 6c 61 70 73 65  amount of elapse
d0f0: 20 74 69 6d 65 20 61 72 65 0a 20 20 2a 2a 20 61   time are.  ** a
d100: 70 70 65 6e 64 65 64 20 74 6f 20 43 41 4c 4c 42  ppended to CALLB
d110: 41 43 4b 20 62 65 66 6f 72 65 20 74 68 65 20 73  ACK before the s
d120: 63 72 69 70 74 20 69 73 20 72 75 6e 2e 0a 20 20  cript is run..  
d130: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 50 52 4f  */.  case DB_PRO
d140: 46 49 4c 45 3a 20 7b 0a 20 20 20 20 69 66 28 20  FILE: {.    if( 
d150: 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20  objc>3 ){.      
d160: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
d170: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
d180: 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b  , "?CALLBACK?");
d190: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
d1a0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c  L_ERROR;.    }el
d1b0: 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29  se if( objc==2 )
d1c0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  {.      if( pDb-
d1d0: 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20  >zProfile ){.   
d1e0: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
d1f0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44  esult(interp, pD
d200: 62 2d 3e 7a 50 72 6f 66 69 6c 65 2c 20 30 29 3b  b->zProfile, 0);
d210: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
d220: 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  se{.      char *
d230: 7a 50 72 6f 66 69 6c 65 3b 0a 20 20 20 20 20 20  zProfile;.      
d240: 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69  int len;.      i
d250: 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65  f( pDb->zProfile
d260: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
d270: 46 72 65 65 28 70 44 62 2d 3e 7a 50 72 6f 66 69  Free(pDb->zProfi
d280: 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  le);.      }.   
d290: 20 20 20 7a 50 72 6f 66 69 6c 65 20 3d 20 54 63     zProfile = Tc
d2a0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
d2b0: 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e  bj(objv[2], &len
d2c0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 72  );.      if( zPr
d2d0: 6f 66 69 6c 65 20 26 26 20 6c 65 6e 3e 30 20 29  ofile && len>0 )
d2e0: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
d2f0: 50 72 6f 66 69 6c 65 20 3d 20 54 63 6c 5f 41 6c  Profile = Tcl_Al
d300: 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a  loc( len + 1 );.
d310: 20 20 20 20 20 20 20 20 73 74 72 63 70 79 28 70          strcpy(p
d320: 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 2c 20 7a 50  Db->zProfile, zP
d330: 72 6f 66 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d  rofile);.      }
d340: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44  else{.        pD
d350: 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 3d 20 30 3b  b->zProfile = 0;
d360: 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  .      }.#ifndef
d370: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41   SQLITE_OMIT_TRA
d380: 43 45 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  CE.      if( pDb
d390: 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20  ->zProfile ){.  
d3a0: 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72        pDb->inter
d3b0: 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20  p = interp;.    
d3c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 66      sqlite3_prof
d3d0: 69 6c 65 28 70 44 62 2d 3e 64 62 2c 20 44 62 50  ile(pDb->db, DbP
d3e0: 72 6f 66 69 6c 65 48 61 6e 64 6c 65 72 2c 20 70  rofileHandler, p
d3f0: 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Db);.      }else
d400: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
d410: 33 5f 70 72 6f 66 69 6c 65 28 70 44 62 2d 3e 64  3_profile(pDb->d
d420: 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  b, 0, 0);.      
d430: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  }.#endif.    }. 
d440: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
d450: 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62   /*.  **     $db
d460: 20 72 65 6b 65 79 20 4b 45 59 0a 20 20 2a 2a 0a   rekey KEY.  **.
d470: 20 20 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20    ** Change the 
d480: 65 6e 63 72 79 70 74 69 6f 6e 20 6b 65 79 20 6f  encryption key o
d490: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20  n the currently 
d4a0: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 2e 0a 20  open database.. 
d4b0: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 52 45   */.  case DB_RE
d4c0: 4b 45 59 3a 20 7b 0a 20 20 20 20 69 6e 74 20 6e  KEY: {.    int n
d4d0: 4b 65 79 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70  Key;.    void *p
d4e0: 4b 65 79 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a  Key;.    if( obj
d4f0: 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=3 ){.      Tc
d500: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
d510: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
d520: 22 4b 45 59 22 29 3b 0a 20 20 20 20 20 20 72 65  "KEY");.      re
d530: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
d540: 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 20 3d      }.    pKey =
d550: 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61   Tcl_GetByteArra
d560: 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  yFromObj(objv[2]
d570: 2c 20 26 6e 4b 65 79 29 3b 0a 23 69 66 64 65 66  , &nKey);.#ifdef
d580: 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
d590: 43 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  C.    rc = sqlit
d5a0: 65 33 5f 72 65 6b 65 79 28 70 44 62 2d 3e 64 62  e3_rekey(pDb->db
d5b0: 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20  , pKey, nKey);. 
d5c0: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
d5d0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
d5e0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69  ult(interp, sqli
d5f0: 74 65 33 45 72 72 53 74 72 28 72 63 29 2c 20 30  te3ErrStr(rc), 0
d600: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43  );.      rc = TC
d610: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23  L_ERROR;.    }.#
d620: 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b  endif.    break;
d630: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
d640: 20 20 20 20 24 64 62 20 74 69 6d 65 6f 75 74 20      $db timeout 
d650: 4d 49 4c 4c 45 53 45 43 4f 4e 44 53 0a 20 20 2a  MILLESECONDS.  *
d660: 2a 0a 20 20 2a 2a 20 44 65 6c 61 79 20 66 6f 72  *.  ** Delay for
d670: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d   the number of m
d680: 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 70 65 63  illiseconds spec
d690: 69 66 69 65 64 20 77 68 65 6e 20 61 20 66 69 6c  ified when a fil
d6a0: 65 20 69 73 20 6c 6f 63 6b 65 64 2e 0a 20 20 2a  e is locked..  *
d6b0: 2f 0a 20 20 63 61 73 65 20 44 42 5f 54 49 4d 45  /.  case DB_TIME
d6c0: 4f 55 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20 6d  OUT: {.    int m
d6d0: 73 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  s;.    if( objc!
d6e0: 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =3 ){.      Tcl_
d6f0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
d700: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4d  erp, 2, objv, "M
d710: 49 4c 4c 49 53 45 43 4f 4e 44 53 22 29 3b 0a 20  ILLISECONDS");. 
d720: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
d730: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
d740: 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
d750: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
d760: 62 6a 76 5b 32 5d 2c 20 26 6d 73 29 20 29 20 72  bjv[2], &ms) ) r
d770: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
d780: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73  .    sqlite3_bus
d790: 79 5f 74 69 6d 65 6f 75 74 28 70 44 62 2d 3e 64  y_timeout(pDb->d
d7a0: 62 2c 20 6d 73 29 3b 0a 20 20 20 20 62 72 65 61  b, ms);.    brea
d7b0: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
d7c0: 2a 20 20 20 20 20 24 64 62 20 73 6f 66 74 5f 68  *     $db soft_h
d7d0: 65 61 70 5f 6c 69 6d 69 74 20 4e 0a 20 20 2a 2a  eap_limit N.  **
d7e0: 0a 20 20 2a 2a 20 53 65 74 20 74 68 65 20 73 6f  .  ** Set the so
d7f0: 66 74 2d 68 65 61 70 2d 6c 69 6d 69 74 20 66 6f  ft-heap-limit fo
d800: 72 20 74 68 69 73 20 74 68 72 65 61 64 2e 20 4e  r this thread. N
d810: 6f 74 65 20 74 68 61 74 20 74 68 65 20 6c 69 6d  ote that the lim
d820: 69 74 20 69 73 20 0a 20 20 2a 2a 20 70 65 72 2d  it is .  ** per-
d830: 74 68 72 65 61 64 2c 20 6e 6f 74 20 70 65 72 2d  thread, not per-
d840: 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 70 72  database. The pr
d850: 65 76 69 6f 75 73 20 6c 69 6d 69 74 20 69 73 20  evious limit is 
d860: 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2f 0a 20  returned..  */. 
d870: 20 63 61 73 65 20 44 42 5f 53 4f 46 54 5f 48 45   case DB_SOFT_HE
d880: 41 50 5f 4c 49 4d 49 54 3a 20 7b 0a 23 69 66 6e  AP_LIMIT: {.#ifn
d890: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
d8a0: 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e  MEMORY_MANAGEMEN
d8b0: 54 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  T.    int n;.   
d8c0: 20 69 6e 74 20 72 65 74 3b 0a 20 20 20 20 69 66   int ret;.    if
d8d0: 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
d8e0: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
d8f0: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
d900: 62 6a 76 2c 20 22 42 59 54 45 53 22 29 3b 0a 20  bjv, "BYTES");. 
d910: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
d920: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
d930: 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
d940: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
d950: 62 6a 76 5b 32 5d 2c 20 26 6e 29 20 29 7b 0a 20  bjv[2], &n) ){. 
d960: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
d970: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
d980: 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33 54 73   ret = sqlite3Ts
d990: 64 28 29 2d 3e 6e 53 6f 66 74 48 65 61 70 4c 69  d()->nSoftHeapLi
d9a0: 6d 69 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  mit;.    sqlite3
d9b0: 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74  _soft_heap_limit
d9c0: 28 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  (n);.    Tcl_Set
d9d0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
d9e0: 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
d9f0: 72 65 74 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ret));.#endif.  
da00: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
da10: 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20  /*.  **     $db 
da20: 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 20 3f  release_memory ?
da30: 4e 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 72 79  N?.  **.  ** Try
da40: 20 74 6f 20 72 65 6c 65 61 73 65 20 6d 65 6d 6f   to release memo
da50: 72 79 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c  ry currently hel
da60: 64 20 28 62 75 74 20 6e 6f 74 20 72 65 61 6c 6c  d (but not reall
da70: 79 20 72 65 71 75 69 72 65 64 29 20 62 79 20 0a  y required) by .
da80: 20 20 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61    ** SQLite data
da90: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
daa0: 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 63   opened by the c
dab0: 75 72 72 65 6e 74 20 74 68 72 65 61 64 2e 20 49  urrent thread. I
dac0: 66 20 61 6e 0a 20 20 2a 2a 20 69 6e 74 65 67 65  f an.  ** intege
dad0: 72 20 61 72 67 75 6d 65 6e 74 20 69 73 20 73 75  r argument is su
dae0: 70 70 6c 69 65 64 2c 20 74 68 65 6e 20 53 51 4c  pplied, then SQL
daf0: 69 74 65 20 73 74 6f 70 73 20 74 72 79 69 6e 67  ite stops trying
db00: 20 74 6f 20 66 72 65 65 20 6d 65 6d 6f 72 79 0a   to free memory.
db10: 20 20 2a 2a 20 61 66 74 65 72 20 4e 20 62 79 74    ** after N byt
db20: 65 73 20 68 61 76 65 20 62 65 65 6e 20 66 72 65  es have been fre
db30: 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ed..  **.  ** Th
db40: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
db50: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
db60: 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79  f bytes actually
db70: 20 66 72 65 65 64 2e 0a 20 20 2a 2a 2f 0a 20 20   freed..  **/.  
db80: 63 61 73 65 20 44 42 5f 52 45 4c 45 41 53 45 5f  case DB_RELEASE_
db90: 4d 45 4d 4f 52 59 3a 20 7b 0a 20 20 20 20 69 6e  MEMORY: {.    in
dba0: 74 20 6e 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a  t nRelease = 0;.
dbb0: 20 20 20 20 69 6e 74 20 4e 20 3d 20 2d 31 3b 0a      int N = -1;.
dbc0: 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20      if( objc!=2 
dbd0: 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  && objc!=3 ){.  
dbe0: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
dbf0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
dc00: 6f 62 6a 76 2c 20 22 3f 4e 3f 22 29 3b 0a 20 20  objv, "?N?");.  
dc10: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
dc20: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  RROR;.    }.#ifn
dc30: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
dc40: 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e  MEMORY_MANAGEMEN
dc50: 54 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d  T.    if( objc==
dc60: 33 20 26 26 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c  3 && TCL_OK!=Tcl
dc70: 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
dc80: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
dc90: 26 4e 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  &N) ){.      ret
dca0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
dcb0: 20 20 20 7d 0a 20 20 20 20 6e 52 65 6c 65 61 73     }.    nReleas
dcc0: 65 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 6c 65  e = sqlite3_rele
dcd0: 61 73 65 5f 6d 65 6d 6f 72 79 28 4e 29 3b 0a 23  ase_memory(N);.#
dce0: 65 6e 64 69 66 0a 20 20 20 20 54 63 6c 5f 53 65  endif.    Tcl_Se
dcf0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
dd00: 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
dd10: 28 6e 52 65 6c 65 61 73 65 29 29 3b 0a 20 20 20  (nRelease));.   
dd20: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 0a 20   break;.  }.  . 
dd30: 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62   /*.  **     $db
dd40: 20 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 0a 20   total_changes. 
dd50: 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20   **.  ** Return 
dd60: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
dd70: 77 73 20 74 68 61 74 20 77 65 72 65 20 6d 6f 64  ws that were mod
dd80: 69 66 69 65 64 2c 20 69 6e 73 65 72 74 65 64 2c  ified, inserted,
dd90: 20 6f 72 20 64 65 6c 65 74 65 64 20 0a 20 20 2a   or deleted .  *
dda0: 2a 20 73 69 6e 63 65 20 74 68 65 20 64 61 74 61  * since the data
ddb0: 62 61 73 65 20 68 61 6e 64 6c 65 20 77 61 73 20  base handle was 
ddc0: 63 72 65 61 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  created..  */.  
ddd0: 63 61 73 65 20 44 42 5f 54 4f 54 41 4c 5f 43 48  case DB_TOTAL_CH
dde0: 41 4e 47 45 53 3a 20 7b 0a 20 20 20 20 54 63 6c  ANGES: {.    Tcl
ddf0: 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20  _Obj *pResult;. 
de00: 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29     if( objc!=2 )
de10: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
de20: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
de30: 20 32 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20   2, objv, "");. 
de40: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
de50: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
de60: 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47   pResult = Tcl_G
de70: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
de80: 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  rp);.    Tcl_Set
de90: 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20  IntObj(pResult, 
dea0: 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68  sqlite3_total_ch
deb0: 61 6e 67 65 73 28 70 44 62 2d 3e 64 62 29 29 3b  anges(pDb->db));
dec0: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
ded0: 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 74 72 61  .  /*    $db tra
dee0: 63 65 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20  ce ?CALLBACK?.  
def0: 2a 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20 61 72 72  **.  ** Make arr
df00: 61 6e 67 65 6d 65 6e 74 73 20 74 6f 20 69 6e 76  angements to inv
df10: 6f 6b 65 20 74 68 65 20 43 41 4c 4c 42 41 43 4b  oke the CALLBACK
df20: 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 65 61 63   routine for eac
df30: 68 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 0a  h SQL statement.
df40: 20 20 2a 2a 20 74 68 61 74 20 69 73 20 65 78 65    ** that is exe
df50: 63 75 74 65 64 2e 20 20 54 68 65 20 74 65 78 74  cuted.  The text
df60: 20 6f 66 20 74 68 65 20 53 51 4c 20 69 73 20 61   of the SQL is a
df70: 70 70 65 6e 64 65 64 20 74 6f 20 43 41 4c 4c 42  ppended to CALLB
df80: 41 43 4b 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20  ACK before.  ** 
df90: 69 74 20 69 73 20 65 78 65 63 75 74 65 64 2e 0a  it is executed..
dfa0: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 54    */.  case DB_T
dfb0: 52 41 43 45 3a 20 7b 0a 20 20 20 20 69 66 28 20  RACE: {.    if( 
dfc0: 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20  objc>3 ){.      
dfd0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
dfe0: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
dff0: 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b  , "?CALLBACK?");
e000: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
e010: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c  L_ERROR;.    }el
e020: 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29  se if( objc==2 )
e030: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  {.      if( pDb-
e040: 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20  >zTrace ){.     
e050: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
e060: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d  ult(interp, pDb-
e070: 3e 7a 54 72 61 63 65 2c 20 30 29 3b 0a 20 20 20  >zTrace, 0);.   
e080: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
e090: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 72 61        char *zTra
e0a0: 63 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65  ce;.      int le
e0b0: 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  n;.      if( pDb
e0c0: 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20 20 20  ->zTrace ){.    
e0d0: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
e0e0: 2d 3e 7a 54 72 61 63 65 29 3b 0a 20 20 20 20 20  ->zTrace);.     
e0f0: 20 7d 0a 20 20 20 20 20 20 7a 54 72 61 63 65 20   }.      zTrace 
e100: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
e110: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
e120: 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  &len);.      if(
e130: 20 7a 54 72 61 63 65 20 26 26 20 6c 65 6e 3e 30   zTrace && len>0
e140: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
e150: 3e 7a 54 72 61 63 65 20 3d 20 54 63 6c 5f 41 6c  >zTrace = Tcl_Al
e160: 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a  loc( len + 1 );.
e170: 20 20 20 20 20 20 20 20 73 74 72 63 70 79 28 70          strcpy(p
e180: 44 62 2d 3e 7a 54 72 61 63 65 2c 20 7a 54 72 61  Db->zTrace, zTra
e190: 63 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ce);.      }else
e1a0: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
e1b0: 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 20 20 20  Trace = 0;.     
e1c0: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
e1d0: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20 20  E_OMIT_TRACE.   
e1e0: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61     if( pDb->zTra
e1f0: 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  ce ){.        pD
e200: 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65  b->interp = inte
e210: 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  rp;.        sqli
e220: 74 65 33 5f 74 72 61 63 65 28 70 44 62 2d 3e 64  te3_trace(pDb->d
e230: 62 2c 20 44 62 54 72 61 63 65 48 61 6e 64 6c 65  b, DbTraceHandle
e240: 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d  r, pDb);.      }
e250: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
e260: 6c 69 74 65 33 5f 74 72 61 63 65 28 70 44 62 2d  lite3_trace(pDb-
e270: 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  >db, 0, 0);.    
e280: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
e290: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
e2a0: 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 74 72 61  .  /*    $db tra
e2b0: 6e 73 61 63 74 69 6f 6e 20 5b 2d 64 65 66 65 72  nsaction [-defer
e2c0: 72 65 64 7c 2d 69 6d 6d 65 64 69 61 74 65 7c 2d  red|-immediate|-
e2d0: 65 78 63 6c 75 73 69 76 65 5d 20 53 43 52 49 50  exclusive] SCRIP
e2e0: 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 74 61 72  T.  **.  ** Star
e2f0: 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74  t a new transact
e300: 69 6f 6e 20 28 69 66 20 77 65 20 61 72 65 20 6e  ion (if we are n
e310: 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  ot already in th
e320: 65 20 6d 69 64 73 74 20 6f 66 20 61 0a 20 20 2a  e midst of a.  *
e330: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 20 61  * transaction) a
e340: 6e 64 20 65 78 65 63 75 74 65 20 74 68 65 20 54  nd execute the T
e350: 43 4c 20 73 63 72 69 70 74 20 53 43 52 49 50 54  CL script SCRIPT
e360: 2e 20 20 41 66 74 65 72 20 53 43 52 49 50 54 0a  .  After SCRIPT.
e370: 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 73 2c 20    ** completes, 
e380: 65 69 74 68 65 72 20 63 6f 6d 6d 69 74 20 74 68  either commit th
e390: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72  e transaction or
e3a0: 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 69 66   roll it back if
e3b0: 20 53 43 52 49 50 54 0a 20 20 2a 2a 20 74 68 72   SCRIPT.  ** thr
e3c0: 6f 77 73 20 61 6e 20 65 78 63 65 70 74 69 6f 6e  ows an exception
e3d0: 2e 20 20 4f 72 20 69 66 20 6e 6f 20 6e 65 77 20  .  Or if no new 
e3e0: 74 72 61 6e 73 61 74 69 6f 6e 20 77 61 73 20 73  transation was s
e3f0: 74 61 72 74 65 64 2c 20 64 6f 20 6e 6f 74 68 69  tarted, do nothi
e400: 6e 67 2e 0a 20 20 2a 2a 20 70 61 73 73 20 74 68  ng..  ** pass th
e410: 65 20 65 78 63 65 70 74 69 6f 6e 20 6f 6e 20 75  e exception on u
e420: 70 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 2a  p the stack..  *
e430: 2a 0a 20 20 2a 2a 20 54 68 69 73 20 63 6f 6d 6d  *.  ** This comm
e440: 61 6e 64 20 77 61 73 20 69 6e 73 70 69 72 65 64  and was inspired
e450: 20 62 79 20 44 61 76 65 20 54 68 6f 6d 61 73 27   by Dave Thomas'
e460: 73 20 74 61 6c 6b 20 6f 6e 20 52 75 62 79 20 61  s talk on Ruby a
e470: 74 20 74 68 65 0a 20 20 2a 2a 20 32 30 30 35 20  t the.  ** 2005 
e480: 4f 27 52 65 69 6c 6c 79 20 4f 70 65 6e 20 53 6f  O'Reilly Open So
e490: 75 72 63 65 20 43 6f 6e 76 65 6e 74 69 6f 6e 20  urce Convention 
e4a0: 28 4f 53 43 4f 4e 29 2e 0a 20 20 2a 2f 0a 20 20  (OSCON)..  */.  
e4b0: 63 61 73 65 20 44 42 5f 54 52 41 4e 53 41 43 54  case DB_TRANSACT
e4c0: 49 4f 4e 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69  ION: {.    int i
e4d0: 6e 54 72 61 6e 73 3b 0a 20 20 20 20 54 63 6c 5f  nTrans;.    Tcl_
e4e0: 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 0a 20 20  Obj *pScript;.  
e4f0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42    const char *zB
e500: 65 67 69 6e 20 3d 20 22 42 45 47 49 4e 22 3b 0a  egin = "BEGIN";.
e510: 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20      if( objc!=3 
e520: 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  && objc!=4 ){.  
e530: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
e540: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
e550: 6f 62 6a 76 2c 20 22 5b 54 59 50 45 5d 20 53 43  objv, "[TYPE] SC
e560: 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65  RIPT");.      re
e570: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
e580: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62      }.    if( ob
e590: 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 70  jc==3 ){.      p
e5a0: 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 32 5d  Script = objv[2]
e5b0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ;.    } else {. 
e5c0: 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
e5d0: 74 20 63 68 61 72 20 2a 54 54 59 50 45 5f 73 74  t char *TTYPE_st
e5e0: 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  rs[] = {.       
e5f0: 20 22 64 65 66 65 72 72 65 64 22 2c 20 20 20 22   "deferred",   "
e600: 65 78 63 6c 75 73 69 76 65 22 2c 20 20 22 69 6d  exclusive",  "im
e610: 6d 65 64 69 61 74 65 22 2c 20 30 0a 20 20 20 20  mediate", 0.    
e620: 20 20 7d 3b 0a 20 20 20 20 20 20 65 6e 75 6d 20    };.      enum 
e630: 54 54 59 50 45 5f 65 6e 75 6d 20 7b 0a 20 20 20  TTYPE_enum {.   
e640: 20 20 20 20 20 54 54 59 50 45 5f 44 45 46 45 52       TTYPE_DEFER
e650: 52 45 44 2c 20 54 54 59 50 45 5f 45 58 43 4c 55  RED, TTYPE_EXCLU
e660: 53 49 56 45 2c 20 54 54 59 50 45 5f 49 4d 4d 45  SIVE, TTYPE_IMME
e670: 44 49 41 54 45 0a 20 20 20 20 20 20 7d 3b 0a 20  DIATE.      };. 
e680: 20 20 20 20 20 69 6e 74 20 74 74 79 70 65 3b 0a       int ttype;.
e690: 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65        if( Tcl_Ge
e6a0: 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e  tIndexFromObj(in
e6b0: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 54  terp, objv[2], T
e6c0: 54 59 50 45 5f 73 74 72 73 2c 20 22 74 72 61 6e  TYPE_strs, "tran
e6d0: 73 61 63 74 69 6f 6e 20 74 79 70 65 22 2c 0a 20  saction type",. 
e6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
e700: 26 74 74 79 70 65 29 20 29 7b 0a 20 20 20 20 20  &ttype) ){.     
e710: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
e720: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
e730: 20 20 20 73 77 69 74 63 68 28 20 28 65 6e 75 6d     switch( (enum
e740: 20 54 54 59 50 45 5f 65 6e 75 6d 29 74 74 79 70   TTYPE_enum)ttyp
e750: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73  e ){.        cas
e760: 65 20 54 54 59 50 45 5f 44 45 46 45 52 52 45 44  e TTYPE_DEFERRED
e770: 3a 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f  :    /* no-op */
e780: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e790: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
e7a0: 20 63 61 73 65 20 54 54 59 50 45 5f 45 58 43 4c   case TTYPE_EXCL
e7b0: 55 53 49 56 45 3a 20 20 20 7a 42 65 67 69 6e 20  USIVE:   zBegin 
e7c0: 3d 20 22 42 45 47 49 4e 20 45 58 43 4c 55 53 49  = "BEGIN EXCLUSI
e7d0: 56 45 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  VE";  break;.   
e7e0: 20 20 20 20 20 63 61 73 65 20 54 54 59 50 45 5f       case TTYPE_
e7f0: 49 4d 4d 45 44 49 41 54 45 3a 20 20 20 7a 42 65  IMMEDIATE:   zBe
e800: 67 69 6e 20 3d 20 22 42 45 47 49 4e 20 49 4d 4d  gin = "BEGIN IMM
e810: 45 44 49 41 54 45 22 3b 20 20 62 72 65 61 6b 3b  EDIATE";  break;
e820: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
e830: 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 33 5d  Script = objv[3]
e840: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 6e 54 72  ;.    }.    inTr
e850: 61 6e 73 20 3d 20 21 73 71 6c 69 74 65 33 5f 67  ans = !sqlite3_g
e860: 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 70 44  et_autocommit(pD
e870: 62 2d 3e 64 62 29 3b 0a 20 20 20 20 69 66 28 20  b->db);.    if( 
e880: 21 69 6e 54 72 61 6e 73 20 29 7b 0a 20 20 20 20  !inTrans ){.    
e890: 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70    sqlite3_exec(p
e8a0: 44 62 2d 3e 64 62 2c 20 7a 42 65 67 69 6e 2c 20  Db->db, zBegin, 
e8b0: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  0, 0, 0);.    }.
e8c0: 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61      rc = Tcl_Eva
e8d0: 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 70  lObjEx(interp, p
e8e0: 53 63 72 69 70 74 2c 20 30 29 3b 0a 20 20 20 20  Script, 0);.    
e8f0: 69 66 28 20 21 69 6e 54 72 61 6e 73 20 29 7b 0a  if( !inTrans ){.
e900: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
e910: 20 2a 7a 45 6e 64 3b 0a 20 20 20 20 20 20 69 66   *zEnd;.      if
e920: 28 20 72 63 3d 3d 54 43 4c 5f 45 52 52 4f 52 20  ( rc==TCL_ERROR 
e930: 29 7b 0a 20 20 20 20 20 20 20 20 7a 45 6e 64 20  ){.        zEnd 
e940: 3d 20 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20  = "ROLLBACK";.  
e950: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
e960: 20 20 20 20 20 7a 45 6e 64 20 3d 20 22 43 4f 4d       zEnd = "COM
e970: 4d 49 54 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20  MIT";.      }.  
e980: 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63      sqlite3_exec
e990: 28 70 44 62 2d 3e 64 62 2c 20 7a 45 6e 64 2c 20  (pDb->db, zEnd, 
e9a0: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  0, 0, 0);.    }.
e9b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
e9c0: 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62    /*.  **    $db
e9d0: 20 75 70 64 61 74 65 5f 68 6f 6f 6b 20 3f 73 63   update_hook ?sc
e9e0: 72 69 70 74 3f 0a 20 20 2a 2a 20 20 20 20 24 64  ript?.  **    $d
e9f0: 62 20 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 20  b rollback_hook 
ea00: 3f 73 63 72 69 70 74 3f 0a 20 20 2a 2f 0a 20 20  ?script?.  */.  
ea10: 63 61 73 65 20 44 42 5f 55 50 44 41 54 45 5f 48  case DB_UPDATE_H
ea20: 4f 4f 4b 3a 20 0a 20 20 63 61 73 65 20 44 42 5f  OOK: .  case DB_
ea30: 52 4f 4c 4c 42 41 43 4b 5f 48 4f 4f 4b 3a 20 7b  ROLLBACK_HOOK: {
ea40: 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 70 70 48  ..    /* set ppH
ea50: 6f 6f 6b 20 74 6f 20 70 6f 69 6e 74 20 61 74 20  ook to point at 
ea60: 70 55 70 64 61 74 65 48 6f 6f 6b 20 6f 72 20 70  pUpdateHook or p
ea70: 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 2c 20 64 65  RollbackHook, de
ea80: 70 65 6e 64 69 6e 67 20 6f 6e 20 0a 20 20 20 20  pending on .    
ea90: 2a 2a 20 77 68 65 74 68 65 72 20 5b 24 64 62 20  ** whether [$db 
eaa0: 75 70 64 61 74 65 5f 68 6f 6f 6b 5d 20 6f 72 20  update_hook] or 
eab0: 5b 24 64 62 20 72 6f 6c 6c 62 61 63 6b 5f 68 6f  [$db rollback_ho
eac0: 6f 6b 5d 20 77 61 73 20 69 6e 76 6f 6b 65 64 2e  ok] was invoked.
ead0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  .    */.    Tcl_
eae0: 4f 62 6a 20 2a 2a 70 70 48 6f 6f 6b 3b 20 0a 20  Obj **ppHook; . 
eaf0: 20 20 20 69 66 28 20 63 68 6f 69 63 65 3d 3d 44     if( choice==D
eb00: 42 5f 55 50 44 41 54 45 5f 48 4f 4f 4b 20 29 7b  B_UPDATE_HOOK ){
eb10: 0a 20 20 20 20 20 20 70 70 48 6f 6f 6b 20 3d 20  .      ppHook = 
eb20: 26 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f  &pDb->pUpdateHoo
eb30: 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  k;.    }else{.  
eb40: 20 20 20 20 70 70 48 6f 6f 6b 20 3d 20 26 70 44      ppHook = &pD
eb50: 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b  b->pRollbackHook
eb60: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
eb70: 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63   objc!=2 && objc
eb80: 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 54 63  !=3 ){.       Tc
eb90: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
eba0: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
ebb0: 22 3f 53 43 52 49 50 54 3f 22 29 3b 0a 20 20 20  "?SCRIPT?");.   
ebc0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
ebd0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
ebe0: 69 66 28 20 2a 70 70 48 6f 6f 6b 20 29 7b 0a 20  if( *ppHook ){. 
ebf0: 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52       Tcl_SetObjR
ec00: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 2a 70  esult(interp, *p
ec10: 70 48 6f 6f 6b 29 3b 0a 20 20 20 20 20 20 69 66  pHook);.      if
ec20: 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20  ( objc==3 ){.   
ec30: 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66       Tcl_DecrRef
ec40: 43 6f 75 6e 74 28 2a 70 70 48 6f 6f 6b 29 3b 0a  Count(*ppHook);.
ec50: 20 20 20 20 20 20 20 20 2a 70 70 48 6f 6f 6b 20          *ppHook 
ec60: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
ec70: 20 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d   }.    if( objc=
ec80: 3d 33 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =3 ){.      asse
ec90: 72 74 28 20 21 28 2a 70 70 48 6f 6f 6b 29 20 29  rt( !(*ppHook) )
eca0: 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f  ;.      if( Tcl_
ecb0: 47 65 74 43 68 61 72 4c 65 6e 67 74 68 28 6f 62  GetCharLength(ob
ecc0: 6a 76 5b 32 5d 29 3e 30 20 29 7b 0a 20 20 20 20  jv[2])>0 ){.    
ecd0: 20 20 20 20 2a 70 70 48 6f 6f 6b 20 3d 20 6f 62      *ppHook = ob
ece0: 6a 76 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20 54  jv[2];.        T
ecf0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
ed00: 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20 20 20 20 20  *ppHook);.      
ed10: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c  }.    }..    sql
ed20: 69 74 65 33 5f 75 70 64 61 74 65 5f 68 6f 6f 6b  ite3_update_hook
ed30: 28 70 44 62 2d 3e 64 62 2c 20 28 70 44 62 2d 3e  (pDb->db, (pDb->
ed40: 70 55 70 64 61 74 65 48 6f 6f 6b 3f 44 62 55 70  pUpdateHook?DbUp
ed50: 64 61 74 65 48 61 6e 64 6c 65 72 3a 30 29 2c 20  dateHandler:0), 
ed60: 70 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pDb);.    sqlite
ed70: 33 5f 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28  3_rollback_hook(
ed80: 70 44 62 2d 3e 64 62 2c 28 70 44 62 2d 3e 70 52  pDb->db,(pDb->pR
ed90: 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3f 44 62 52 6f  ollbackHook?DbRo
eda0: 6c 6c 62 61 63 6b 48 61 6e 64 6c 65 72 3a 30 29  llbackHandler:0)
edb0: 2c 70 44 62 29 3b 0a 0a 20 20 20 20 62 72 65 61  ,pDb);..    brea
edc0: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20  k;.  }..  /*    
edd0: 24 64 62 20 76 65 72 73 69 6f 6e 0a 20 20 2a 2a  $db version.  **
ede0: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  .  ** Return the
edf0: 20 76 65 72 73 69 6f 6e 20 73 74 72 69 6e 67 20   version string 
ee00: 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73  for this databas
ee10: 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  e..  */.  case D
ee20: 42 5f 56 45 52 53 49 4f 4e 3a 20 7b 0a 20 20 20  B_VERSION: {.   
ee30: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
ee40: 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73  nterp, (char *)s
ee50: 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f  qlite3_libversio
ee60: 6e 28 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  n(), TCL_STATIC)
ee70: 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
ee80: 0a 0a 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 6f 66  ...  } /* End of
ee90: 20 74 68 65 20 53 57 49 54 43 48 20 73 74 61 74   the SWITCH stat
eea0: 65 6d 65 6e 74 20 2a 2f 0a 20 20 72 65 74 75 72  ement */.  retur
eeb0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20  n rc;.}../*.**  
eec0: 20 73 71 6c 69 74 65 33 20 44 42 4e 41 4d 45 20   sqlite3 DBNAME 
eed0: 46 49 4c 45 4e 41 4d 45 20 3f 4d 4f 44 45 3f 20  FILENAME ?MODE? 
eee0: 3f 2d 6b 65 79 20 4b 45 59 3f 0a 2a 2a 0a 2a 2a  ?-key KEY?.**.**
eef0: 20 54 68 69 73 20 69 73 20 74 68 65 20 6d 61 69   This is the mai
ef00: 6e 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 2e 20 20  n Tcl command.  
ef10: 57 68 65 6e 20 74 68 65 20 22 73 71 6c 69 74 65  When the "sqlite
ef20: 22 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 69 73  " Tcl command is
ef30: 0a 2a 2a 20 69 6e 76 6f 6b 65 64 2c 20 74 68 69  .** invoked, thi
ef40: 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20 74  s routine runs t
ef50: 6f 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63  o process that c
ef60: 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  ommand..**.** Th
ef70: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
ef80: 2c 20 44 42 4e 41 4d 45 2c 20 69 73 20 61 6e 20  , DBNAME, is an 
ef90: 61 72 62 69 74 72 61 72 79 20 6e 61 6d 65 20 66  arbitrary name f
efa0: 6f 72 20 61 20 6e 65 77 0a 2a 2a 20 64 61 74 61  or a new.** data
efb0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
efc0: 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 63    This command c
efd0: 72 65 61 74 65 73 20 61 20 6e 65 77 20 63 6f 6d  reates a new com
efe0: 6d 61 6e 64 20 6e 61 6d 65 64 0a 2a 2a 20 44 42  mand named.** DB
eff0: 4e 41 4d 45 20 74 68 61 74 20 69 73 20 75 73 65  NAME that is use
f000: 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 61  d to control tha
f010: 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 54  t connection.  T
f020: 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63  he database.** c
f030: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 64 65 6c  onnection is del
f040: 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 44 42  eted when the DB
f050: 4e 41 4d 45 20 63 6f 6d 6d 61 6e 64 20 69 73 20  NAME command is 
f060: 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  deleted..**.** T
f070: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
f080: 6e 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  nt is the name o
f090: 66 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  f the directory 
f0a0: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  that contains.**
f0b0: 20 74 68 65 20 73 71 6c 69 74 65 20 64 61 74 61   the sqlite data
f0c0: 62 61 73 65 20 74 68 61 74 20 69 73 20 74 6f 20  base that is to 
f0d0: 62 65 20 61 63 63 65 73 73 65 64 2e 0a 2a 2a 0a  be accessed..**.
f0e0: 2a 2a 20 46 6f 72 20 74 65 73 74 69 6e 67 20 70  ** For testing p
f0f0: 75 72 70 6f 73 65 73 2c 20 77 65 20 61 6c 73 6f  urposes, we also
f100: 20 73 75 70 70 6f 72 74 20 74 68 65 20 66 6f 6c   support the fol
f110: 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 73  lowing:.**.**  s
f120: 71 6c 69 74 65 33 20 2d 65 6e 63 6f 64 69 6e 67  qlite3 -encoding
f130: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 52 65 74  .**.**       Ret
f140: 75 72 6e 20 74 68 65 20 65 6e 63 6f 64 69 6e 67  urn the encoding
f150: 20 75 73 65 64 20 62 79 20 4c 49 4b 45 20 61 6e   used by LIKE an
f160: 64 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 73  d GLOB operators
f170: 2e 20 20 43 68 6f 69 63 65 73 0a 2a 2a 20 20 20  .  Choices.**   
f180: 20 20 20 20 61 72 65 20 55 54 46 2d 38 20 61 6e      are UTF-8 an
f190: 64 20 69 73 6f 38 38 35 39 2e 0a 2a 2a 0a 2a 2a  d iso8859..**.**
f1a0: 20 20 73 71 6c 69 74 65 33 20 2d 76 65 72 73 69    sqlite3 -versi
f1b0: 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 52  on.**.**       R
f1c0: 65 74 75 72 6e 20 74 68 65 20 76 65 72 73 69 6f  eturn the versio
f1d0: 6e 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  n number of the 
f1e0: 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 2e 0a  SQLite library..
f1f0: 2a 2a 0a 2a 2a 20 20 73 71 6c 69 74 65 33 20 2d  **.**  sqlite3 -
f200: 74 63 6c 2d 75 73 65 73 2d 75 74 66 0a 2a 2a 0a  tcl-uses-utf.**.
f210: 2a 2a 20 20 20 20 20 20 20 52 65 74 75 72 6e 20  **       Return 
f220: 22 31 22 20 69 66 20 63 6f 6d 70 69 6c 65 64 20  "1" if compiled 
f230: 77 69 74 68 20 61 20 54 63 6c 20 75 73 65 73 20  with a Tcl uses 
f240: 55 54 46 2d 38 2e 20 20 52 65 74 75 72 6e 20 22  UTF-8.  Return "
f250: 30 22 20 69 66 0a 2a 2a 20 20 20 20 20 20 20 6e  0" if.**       n
f260: 6f 74 2e 20 20 55 73 65 64 20 62 79 20 74 65 73  ot.  Used by tes
f270: 74 73 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ts to make sure 
f280: 74 68 65 20 6c 69 62 72 61 72 79 20 77 61 73 20  the library was 
f290: 63 6f 6d 70 69 6c 65 64 20 0a 2a 2a 20 20 20 20  compiled .**    
f2a0: 20 20 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f     correctly..*/
f2b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 4d 61  .static int DbMa
f2c0: 69 6e 28 76 6f 69 64 20 2a 63 64 2c 20 54 63 6c  in(void *cd, Tcl
f2d0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
f2e0: 20 69 6e 74 20 6f 62 6a 63 2c 54 63 6c 5f 4f 62   int objc,Tcl_Ob
f2f0: 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76 29 7b 0a  j *const*objv){.
f300: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 3b 0a 20    SqliteDb *p;. 
f310: 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d 20 30 3b   void *pKey = 0;
f320: 0a 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20 30 3b  .  int nKey = 0;
f330: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
f340: 41 72 67 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72  Arg;.  char *zEr
f350: 72 4d 73 67 3b 0a 20 20 63 6f 6e 73 74 20 63 68  rMsg;.  const ch
f360: 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 69 66 28  ar *zFile;.  if(
f370: 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20   objc==2 ){.    
f380: 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65 74 53 74  zArg = Tcl_GetSt
f390: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
f3a0: 5b 31 5d 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  [1], 0);.    if(
f3b0: 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 76   strcmp(zArg,"-v
f3c0: 65 72 73 69 6f 6e 22 29 3d 3d 30 20 29 7b 0a 20  ersion")==0 ){. 
f3d0: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
f3e0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 73 71 6c  esult(interp,sql
f3f0: 69 74 65 33 5f 76 65 72 73 69 6f 6e 2c 30 29 3b  ite3_version,0);
f400: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
f410: 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  L_OK;.    }.    
f420: 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c  if( strcmp(zArg,
f430: 22 2d 68 61 73 2d 63 6f 64 65 63 22 29 3d 3d 30  "-has-codec")==0
f440: 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   ){.#ifdef SQLIT
f450: 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20  E_HAS_CODEC.    
f460: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
f470: 6c 74 28 69 6e 74 65 72 70 2c 22 31 22 2c 30 29  lt(interp,"1",0)
f480: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 54 63  ;.#else.      Tc
f490: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
f4a0: 6e 74 65 72 70 2c 22 30 22 2c 30 29 3b 0a 23 65  nterp,"0",0);.#e
f4b0: 6e 64 69 66 0a 20 20 20 20 20 20 72 65 74 75 72  ndif.      retur
f4c0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  n TCL_OK;.    }.
f4d0: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
f4e0: 41 72 67 2c 22 2d 74 63 6c 2d 75 73 65 73 2d 75  Arg,"-tcl-uses-u
f4f0: 74 66 22 29 3d 3d 30 20 29 7b 0a 23 69 66 64 65  tf")==0 ){.#ifde
f500: 66 20 54 43 4c 5f 55 54 46 5f 4d 41 58 0a 20 20  f TCL_UTF_MAX.  
f510: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
f520: 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 31 22 2c  sult(interp,"1",
f530: 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  0);.#else.      
f540: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
f550: 28 69 6e 74 65 72 70 2c 22 30 22 2c 30 29 3b 0a  (interp,"0",0);.
f560: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 65 74  #endif.      ret
f570: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20  urn TCL_OK;.    
f580: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63  }.  }.  if( objc
f590: 3d 3d 35 20 7c 7c 20 6f 62 6a 63 3d 3d 36 20 29  ==5 || objc==6 )
f5a0: 7b 0a 20 20 20 20 7a 41 72 67 20 3d 20 54 63 6c  {.    zArg = Tcl
f5b0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
f5c0: 6a 28 6f 62 6a 76 5b 6f 62 6a 63 2d 32 5d 2c 20  j(objv[objc-2], 
f5d0: 30 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63  0);.    if( strc
f5e0: 6d 70 28 7a 41 72 67 2c 22 2d 6b 65 79 22 29 3d  mp(zArg,"-key")=
f5f0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4b 65 79  =0 ){.      pKey
f600: 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72   = Tcl_GetByteAr
f610: 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  rayFromObj(objv[
f620: 6f 62 6a 63 2d 31 5d 2c 20 26 6e 4b 65 79 29 3b  objc-1], &nKey);
f630: 0a 20 20 20 20 20 20 6f 62 6a 63 20 2d 3d 20 32  .      objc -= 2
f640: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
f650: 28 20 6f 62 6a 63 21 3d 33 20 26 26 20 6f 62 6a  ( objc!=3 && obj
f660: 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=4 ){.    Tcl_
f670: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
f680: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 0a 23  erp, 1, objv, .#
f690: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
f6a0: 5f 43 4f 44 45 43 0a 20 20 20 20 20 20 22 48 41  _CODEC.      "HA
f6b0: 4e 44 4c 45 20 46 49 4c 45 4e 41 4d 45 20 3f 2d  NDLE FILENAME ?-
f6c0: 6b 65 79 20 43 4f 44 45 43 2d 4b 45 59 3f 22 0a  key CODEC-KEY?".
f6d0: 23 65 6c 73 65 0a 20 20 20 20 20 20 22 48 41 4e  #else.      "HAN
f6e0: 44 4c 45 20 46 49 4c 45 4e 41 4d 45 20 3f 4d 4f  DLE FILENAME ?MO
f6f0: 44 45 3f 22 0a 23 65 6e 64 69 66 0a 20 20 20 20  DE?".#endif.    
f700: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
f710: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a  L_ERROR;.  }.  z
f720: 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70 20  ErrMsg = 0;.  p 
f730: 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 54 63 6c  = (SqliteDb*)Tcl
f740: 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  _Alloc( sizeof(*
f750: 70 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  p) );.  if( p==0
f760: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52   ){.    Tcl_SetR
f770: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6d  esult(interp, "m
f780: 61 6c 6c 6f 63 20 66 61 69 6c 65 64 22 2c 20 54  alloc failed", T
f790: 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  CL_STATIC);.    
f7a0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
f7b0: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70  ;.  }.  memset(p
f7c0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  , 0, sizeof(*p))
f7d0: 3b 0a 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f  ;.  zFile = Tcl_
f7e0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
f7f0: 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20  (objv[2], 0);.  
f800: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 46 69  sqlite3_open(zFi
f810: 6c 65 2c 20 26 70 2d 3e 64 62 29 3b 0a 20 20 69  le, &p->db);.  i
f820: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
f830: 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 70 2d  lite3_errcode(p-
f840: 3e 64 62 29 20 29 7b 0a 20 20 20 20 7a 45 72 72  >db) ){.    zErr
f850: 4d 73 67 20 3d 20 73 74 72 64 75 70 28 73 71 6c  Msg = strdup(sql
f860: 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64  ite3_errmsg(p->d
f870: 62 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  b));.    sqlite3
f880: 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 29 3b 0a 20  _close(p->db);. 
f890: 20 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20     p->db = 0;.  
f8a0: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
f8b0: 48 41 53 5f 43 4f 44 45 43 0a 20 20 73 71 6c 69  HAS_CODEC.  sqli
f8c0: 74 65 33 5f 6b 65 79 28 70 2d 3e 64 62 2c 20 70  te3_key(p->db, p
f8d0: 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 23 65 6e 64  Key, nKey);.#end
f8e0: 69 66 0a 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d  if.  if( p->db==
f8f0: 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  0 ){.    Tcl_Set
f900: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
f910: 45 72 72 4d 73 67 2c 20 54 43 4c 5f 56 4f 4c 41  ErrMsg, TCL_VOLA
f920: 54 49 4c 45 29 3b 0a 20 20 20 20 54 63 6c 5f 46  TILE);.    Tcl_F
f930: 72 65 65 28 28 63 68 61 72 2a 29 70 29 3b 0a 20  ree((char*)p);. 
f940: 20 20 20 66 72 65 65 28 7a 45 72 72 4d 73 67 29     free(zErrMsg)
f950: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
f960: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 2d  _ERROR;.  }.  p-
f970: 3e 6d 61 78 53 74 6d 74 20 3d 20 4e 55 4d 5f 50  >maxStmt = NUM_P
f980: 52 45 50 41 52 45 44 5f 53 54 4d 54 53 3b 0a 20  REPARED_STMTS;. 
f990: 20 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65 74 53   zArg = Tcl_GetS
f9a0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
f9b0: 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 54 63 6c 5f  v[1], 0);.  Tcl_
f9c0: 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
f9d0: 28 69 6e 74 65 72 70 2c 20 7a 41 72 67 2c 20 44  (interp, zArg, D
f9e0: 62 4f 62 6a 43 6d 64 2c 20 28 63 68 61 72 2a 29  bObjCmd, (char*)
f9f0: 70 2c 20 44 62 44 65 6c 65 74 65 43 6d 64 29 3b  p, DbDeleteCmd);
fa00: 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6d 70 69 6c  ..  /* If compil
fa10: 65 64 20 77 69 74 68 20 53 51 4c 49 54 45 5f 54  ed with SQLITE_T
fa20: 45 53 54 20 74 75 72 6e 65 64 20 6f 6e 2c 20 74  EST turned on, t
fa30: 68 65 6e 20 72 65 67 69 73 74 65 72 20 74 68 65  hen register the
fa40: 20 22 6d 64 35 73 75 6d 22 0a 20 20 2a 2a 20 53   "md5sum".  ** S
fa50: 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a  QL function..  *
fa60: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
fa70: 54 45 53 54 0a 20 20 7b 0a 20 20 20 20 65 78 74  TEST.  {.    ext
fa80: 65 72 6e 20 76 6f 69 64 20 4d 64 35 5f 52 65 67  ern void Md5_Reg
fa90: 69 73 74 65 72 28 73 71 6c 69 74 65 33 2a 29 3b  ister(sqlite3*);
faa0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d  .#ifdef SQLITE_M
fab0: 45 4d 44 45 42 55 47 0a 20 20 20 20 69 6e 74 20  EMDEBUG.    int 
fac0: 6d 61 6c 6c 6f 63 66 61 69 6c 20 3d 20 73 71 6c  mallocfail = sql
fad0: 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c  ite3_iMallocFail
fae0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 4d  ;.    sqlite3_iM
faf0: 61 6c 6c 6f 63 46 61 69 6c 20 3d 20 30 3b 0a 23  allocFail = 0;.#
fb00: 65 6e 64 69 66 0a 20 20 20 20 4d 64 35 5f 52 65  endif.    Md5_Re
fb10: 67 69 73 74 65 72 28 70 2d 3e 64 62 29 3b 0a 23  gister(p->db);.#
fb20: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 45 4d  ifdef SQLITE_MEM
fb30: 44 45 42 55 47 0a 20 20 20 20 73 71 6c 69 74 65  DEBUG.    sqlite
fb40: 33 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c 20 3d 20  3_iMallocFail = 
fb50: 6d 61 6c 6c 6f 63 66 61 69 6c 3b 0a 23 65 6e 64  mallocfail;.#end
fb60: 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 20 20 0a  if.  }.#endif  .
fb70: 20 20 70 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e    p->interp = in
fb80: 74 65 72 70 3b 0a 20 20 72 65 74 75 72 6e 20 54  terp;.  return T
fb90: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
fba0: 50 72 6f 76 69 64 65 20 61 20 64 75 6d 6d 79 20  Provide a dummy 
fbb0: 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 20 69 66  Tcl_InitStubs if
fbc0: 20 77 65 20 61 72 65 20 75 73 69 6e 67 20 74 68   we are using th
fbd0: 69 73 20 61 73 20 61 20 73 74 61 74 69 63 0a 2a  is as a static.*
fbe0: 2a 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69  * library..*/.#i
fbf0: 66 6e 64 65 66 20 55 53 45 5f 54 43 4c 5f 53 54  fndef USE_TCL_ST
fc00: 55 42 53 0a 23 20 75 6e 64 65 66 20 20 54 63 6c  UBS.# undef  Tcl
fc10: 5f 49 6e 69 74 53 74 75 62 73 0a 23 20 64 65 66  _InitStubs.# def
fc20: 69 6e 65 20 54 63 6c 5f 49 6e 69 74 53 74 75 62  ine Tcl_InitStub
fc30: 73 28 61 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a  s(a,b,c).#endif.
fc40: 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
fc50: 20 77 65 20 68 61 76 65 20 61 20 50 41 43 4b 41   we have a PACKA
fc60: 47 45 5f 56 45 52 53 49 4f 4e 20 6d 61 63 72 6f  GE_VERSION macro
fc70: 20 64 65 66 69 6e 65 64 2e 20 20 54 68 69 73 20   defined.  This 
fc80: 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 66 69 6e  will be.** defin
fc90: 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
fca0: 20 62 79 20 74 68 65 20 54 45 41 20 6d 61 6b 65   by the TEA make
fcb0: 66 69 6c 65 2e 20 20 42 75 74 20 6f 74 68 65 72  file.  But other
fcc0: 20 6d 61 6b 65 66 69 6c 65 73 0a 2a 2a 20 64 6f   makefiles.** do
fcd0: 20 6e 6f 74 20 64 65 66 69 6e 65 20 69 74 2e 0a   not define it..
fce0: 2a 2f 0a 23 69 66 6e 64 65 66 20 50 41 43 4b 41  */.#ifndef PACKA
fcf0: 47 45 5f 56 45 52 53 49 4f 4e 0a 23 20 64 65 66  GE_VERSION.# def
fd00: 69 6e 65 20 50 41 43 4b 41 47 45 5f 56 45 52 53  ine PACKAGE_VERS
fd10: 49 4f 4e 20 53 51 4c 49 54 45 5f 56 45 52 53 49  ION SQLITE_VERSI
fd20: 4f 4e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  ON.#endif../*.**
fd30: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 69 73   Initialize this
fd40: 20 6d 6f 64 75 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54   module..**.** T
fd50: 68 69 73 20 54 63 6c 20 6d 6f 64 75 6c 65 20 63  his Tcl module c
fd60: 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 61 20 73  ontains only a s
fd70: 69 6e 67 6c 65 20 6e 65 77 20 54 63 6c 20 63 6f  ingle new Tcl co
fd80: 6d 6d 61 6e 64 20 6e 61 6d 65 64 20 22 73 71 6c  mmand named "sql
fd90: 69 74 65 22 2e 0a 2a 2a 20 28 48 65 6e 63 65 20  ite"..** (Hence 
fda0: 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 61 6d 65  there is no name
fdb0: 73 70 61 63 65 2e 20 20 54 68 65 72 65 20 69 73  space.  There is
fdc0: 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 75 73 69   no point in usi
fdd0: 6e 67 20 61 20 6e 61 6d 65 73 70 61 63 65 0a 2a  ng a namespace.*
fde0: 2a 20 69 66 20 74 68 65 20 65 78 74 65 6e 73 69  * if the extensi
fdf0: 6f 6e 20 6f 6e 6c 79 20 73 75 70 70 6c 69 65 73  on only supplies
fe00: 20 6f 6e 65 20 6e 65 77 20 6e 61 6d 65 21 29 20   one new name!) 
fe10: 20 54 68 65 20 22 73 71 6c 69 74 65 22 20 63 6f   The "sqlite" co
fe20: 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 75 73 65 64  mmand is.** used
fe30: 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 53   to open a new S
fe40: 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e 20  QLite database. 
fe50: 20 53 65 65 20 74 68 65 20 44 62 4d 61 69 6e 28   See the DbMain(
fe60: 29 20 72 6f 75 74 69 6e 65 20 61 62 6f 76 65 0a  ) routine above.
fe70: 2a 2a 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  ** for additiona
fe80: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
fe90: 2f 0a 45 58 54 45 52 4e 20 69 6e 74 20 53 71 6c  /.EXTERN int Sql
fea0: 69 74 65 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  ite3_Init(Tcl_In
feb0: 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20  terp *interp){. 
fec0: 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 69   Tcl_InitStubs(i
fed0: 6e 74 65 72 70 2c 20 22 38 2e 34 22 2c 20 30 29  nterp, "8.4", 0)
fee0: 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62  ;.  Tcl_CreateOb
fef0: 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
ff00: 20 22 73 71 6c 69 74 65 33 22 2c 20 28 54 63 6c   "sqlite3", (Tcl
ff10: 5f 4f 62 6a 43 6d 64 50 72 6f 63 2a 29 44 62 4d  _ObjCmdProc*)DbM
ff20: 61 69 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 54 63  ain, 0, 0);.  Tc
ff30: 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74  l_PkgProvide(int
ff40: 65 72 70 2c 20 22 73 71 6c 69 74 65 33 22 2c 20  erp, "sqlite3", 
ff50: 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29  PACKAGE_VERSION)
ff60: 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62  ;.  Tcl_CreateOb
ff70: 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
ff80: 20 22 73 71 6c 69 74 65 22 2c 20 28 54 63 6c 5f   "sqlite", (Tcl_
ff90: 4f 62 6a 43 6d 64 50 72 6f 63 2a 29 44 62 4d 61  ObjCmdProc*)DbMa
ffa0: 69 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c  in, 0, 0);.  Tcl
ffb0: 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65  _PkgProvide(inte
ffc0: 72 70 2c 20 22 73 71 6c 69 74 65 22 2c 20 50 41  rp, "sqlite", PA
ffd0: 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29 3b 0a  CKAGE_VERSION);.
ffe0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
fff0: 0a 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 54 63  .}.EXTERN int Tc
10000 6c 73 71 6c 69 74 65 33 5f 49 6e 69 74 28 54 63  lsqlite3_Init(Tc
10010 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
10020 29 7b 20 72 65 74 75 72 6e 20 53 71 6c 69 74 65  ){ return Sqlite
10030 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 20  3_Init(interp); 
10040 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 53 71 6c  }.EXTERN int Sql
10050 69 74 65 33 5f 53 61 66 65 49 6e 69 74 28 54 63  ite3_SafeInit(Tc
10060 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
10070 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  ){ return TCL_OK
10080 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 54  ; }.EXTERN int T
10090 63 6c 73 71 6c 69 74 65 33 5f 53 61 66 65 49 6e  clsqlite3_SafeIn
100a0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  it(Tcl_Interp *i
100b0 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20 54  nterp){ return T
100c0 43 4c 5f 4f 4b 3b 20 7d 0a 0a 23 69 66 6e 64 65  CL_OK; }..#ifnde
100d0 66 20 53 51 4c 49 54 45 5f 33 5f 53 55 46 46 49  f SQLITE_3_SUFFI
100e0 58 5f 4f 4e 4c 59 0a 45 58 54 45 52 4e 20 69 6e  X_ONLY.EXTERN in
100f0 74 20 53 71 6c 69 74 65 5f 49 6e 69 74 28 54 63  t Sqlite_Init(Tc
10100 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
10110 29 7b 20 72 65 74 75 72 6e 20 53 71 6c 69 74 65  ){ return Sqlite
10120 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 20  3_Init(interp); 
10130 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 54 63 6c  }.EXTERN int Tcl
10140 73 71 6c 69 74 65 5f 49 6e 69 74 28 54 63 6c 5f  sqlite_Init(Tcl_
10150 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b  Interp *interp){
10160 20 72 65 74 75 72 6e 20 53 71 6c 69 74 65 33 5f   return Sqlite3_
10170 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a  Init(interp); }.
10180 45 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74  EXTERN int Sqlit
10190 65 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49  e_SafeInit(Tcl_I
101a0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20  nterp *interp){ 
101b0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d  return TCL_OK; }
101c0 0a 45 58 54 45 52 4e 20 69 6e 74 20 54 63 6c 73  .EXTERN int Tcls
101d0 71 6c 69 74 65 5f 53 61 66 65 49 6e 69 74 28 54  qlite_SafeInit(T
101e0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
101f0 70 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  p){ return TCL_O
10200 4b 3b 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  K; }.#endif..#if
10210 64 65 66 20 54 43 4c 53 48 0a 2f 2a 2a 2a 2a 2a  def TCLSH./*****
10220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10260 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20  ********.** The 
10270 63 6f 64 65 20 74 68 61 74 20 66 6f 6c 6c 6f 77  code that follow
10280 73 20 69 73 20 75 73 65 64 20 74 6f 20 62 75 69  s is used to bui
10290 6c 64 20 73 74 61 6e 64 61 6c 6f 6e 65 20 54 43  ld standalone TC
102a0 4c 20 69 6e 74 65 72 70 72 65 74 65 72 73 0a 2a  L interpreters.*
102b0 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  /../*.** If the 
102c0 6d 61 63 72 6f 20 54 43 4c 53 48 20 69 73 20 6f  macro TCLSH is o
102d0 6e 65 2c 20 74 68 65 6e 20 70 75 74 20 69 6e 20  ne, then put in 
102e0 63 6f 64 65 20 74 68 69 73 20 66 6f 72 20 74 68  code this for th
102f0 65 0a 2a 2a 20 22 6d 61 69 6e 22 20 72 6f 75 74  e.** "main" rout
10300 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e  ine that will in
10310 69 74 69 61 6c 69 7a 65 20 54 63 6c 20 61 6e 64  itialize Tcl and
10320 20 74 61 6b 65 20 69 6e 70 75 74 20 66 72 6f 6d   take input from
10330 0a 2a 2a 20 73 74 61 6e 64 61 72 64 20 69 6e 70  .** standard inp
10340 75 74 2e 0a 2a 2f 0a 23 69 66 20 54 43 4c 53 48  ut..*/.#if TCLSH
10350 3d 3d 31 0a 73 74 61 74 69 63 20 63 68 61 72 20  ==1.static char 
10360 7a 4d 61 69 6e 6c 6f 6f 70 5b 5d 20 3d 0a 20 20  zMainloop[] =.  
10370 22 73 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e 22 0a  "set line {}\n".
10380 20 20 22 77 68 69 6c 65 20 7b 21 5b 65 6f 66 20    "while {![eof 
10390 73 74 64 69 6e 5d 7d 20 7b 5c 6e 22 0a 20 20 20  stdin]} {\n".   
103a0 20 22 69 66 20 7b 24 6c 69 6e 65 21 3d 5c 22 5c   "if {$line!=\"\
103b0 22 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22 70  "} {\n".      "p
103c0 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 5c  uts -nonewline \
103d0 22 3e 20 5c 22 5c 6e 22 0a 20 20 20 20 22 7d 20  "> \"\n".    "} 
103e0 65 6c 73 65 20 7b 5c 6e 22 0a 20 20 20 20 20 20  else {\n".      
103f0 22 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65  "puts -nonewline
10400 20 5c 22 25 20 5c 22 5c 6e 22 0a 20 20 20 20 22   \"% \"\n".    "
10410 7d 5c 6e 22 0a 20 20 20 20 22 66 6c 75 73 68 20  }\n".    "flush 
10420 73 74 64 6f 75 74 5c 6e 22 0a 20 20 20 20 22 61  stdout\n".    "a
10430 70 70 65 6e 64 20 6c 69 6e 65 20 5b 67 65 74 73  ppend line [gets
10440 20 73 74 64 69 6e 5d 5c 6e 22 0a 20 20 20 20 22   stdin]\n".    "
10450 69 66 20 7b 5b 69 6e 66 6f 20 63 6f 6d 70 6c 65  if {[info comple
10460 74 65 20 24 6c 69 6e 65 5d 7d 20 7b 5c 6e 22 0a  te $line]} {\n".
10470 20 20 20 20 20 20 22 69 66 20 7b 5b 63 61 74 63        "if {[catc
10480 68 20 7b 75 70 6c 65 76 65 6c 20 23 30 20 24 6c  h {uplevel #0 $l
10490 69 6e 65 7d 20 72 65 73 75 6c 74 5d 7d 20 7b 5c  ine} result]} {\
104a0 6e 22 0a 20 20 20 20 20 20 20 20 22 70 75 74 73  n".        "puts
104b0 20 73 74 64 65 72 72 20 5c 22 45 72 72 6f 72 3a   stderr \"Error:
104c0 20 24 72 65 73 75 6c 74 5c 22 5c 6e 22 0a 20 20   $result\"\n".  
104d0 20 20 20 20 22 7d 20 65 6c 73 65 69 66 20 7b 24      "} elseif {$
104e0 72 65 73 75 6c 74 21 3d 5c 22 5c 22 7d 20 7b 5c  result!=\"\"} {\
104f0 6e 22 0a 20 20 20 20 20 20 20 20 22 70 75 74 73  n".        "puts
10500 20 24 72 65 73 75 6c 74 5c 6e 22 0a 20 20 20 20   $result\n".    
10510 20 20 22 7d 5c 6e 22 0a 20 20 20 20 20 20 22 73    "}\n".      "s
10520 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e 22 0a 20 20  et line {}\n".  
10530 20 20 22 7d 20 65 6c 73 65 20 7b 5c 6e 22 0a 20    "} else {\n". 
10540 20 20 20 20 20 22 61 70 70 65 6e 64 20 6c 69 6e       "append lin
10550 65 20 5c 5c 6e 5c 6e 22 0a 20 20 20 20 22 7d 5c  e \\n\n".    "}\
10560 6e 22 0a 20 20 22 7d 5c 6e 22 0a 3b 0a 23 65 6e  n".  "}\n".;.#en
10570 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  dif../*.** If th
10580 65 20 6d 61 63 72 6f 20 54 43 4c 53 48 20 69 73  e macro TCLSH is
10590 20 74 77 6f 2c 20 74 68 65 6e 20 67 65 74 20 74   two, then get t
105a0 68 65 20 6d 61 69 6e 20 6c 6f 6f 70 20 63 6f 64  he main loop cod
105b0 65 20 6f 75 74 20 6f 66 0a 2a 2a 20 74 68 65 20  e out of.** the 
105c0 73 65 70 61 72 61 74 65 20 66 69 6c 65 20 22 73  separate file "s
105d0 70 61 63 65 61 6e 61 6c 5f 74 63 6c 2e 68 22 2e  paceanal_tcl.h".
105e0 0a 2a 2f 0a 23 69 66 20 54 43 4c 53 48 3d 3d 32  .*/.#if TCLSH==2
105f0 0a 73 74 61 74 69 63 20 63 68 61 72 20 7a 4d 61  .static char zMa
10600 69 6e 6c 6f 6f 70 5b 5d 20 3d 20 0a 23 69 6e 63  inloop[] = .#inc
10610 6c 75 64 65 20 22 73 70 61 63 65 61 6e 61 6c 5f  lude "spaceanal_
10620 74 63 6c 2e 68 22 0a 3b 0a 23 65 6e 64 69 66 0a  tcl.h".;.#endif.
10630 0a 23 64 65 66 69 6e 65 20 54 43 4c 53 48 5f 4d  .#define TCLSH_M
10640 41 49 4e 20 6d 61 69 6e 20 20 20 2f 2a 20 4e 65  AIN main   /* Ne
10650 65 64 65 64 20 74 6f 20 66 61 6b 65 20 6f 75 74  eded to fake out
10660 20 6d 6b 74 63 6c 61 70 70 20 2a 2f 0a 69 6e 74   mktclapp */.int
10670 20 54 43 4c 53 48 5f 4d 41 49 4e 28 69 6e 74 20   TCLSH_MAIN(int 
10680 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67  argc, char **arg
10690 76 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  v){.  Tcl_Interp
106a0 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f   *interp;.  Tcl_
106b0 46 69 6e 64 45 78 65 63 75 74 61 62 6c 65 28 61  FindExecutable(a
106c0 72 67 76 5b 30 5d 29 3b 0a 20 20 69 6e 74 65 72  rgv[0]);.  inter
106d0 70 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 49 6e  p = Tcl_CreateIn
106e0 74 65 72 70 28 29 3b 0a 20 20 53 71 6c 69 74 65  terp();.  Sqlite
106f0 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  3_Init(interp);.
10700 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
10710 53 54 0a 20 20 7b 0a 20 20 20 20 65 78 74 65 72  ST.  {.    exter
10720 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
10730 31 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  1_Init(Tcl_Inter
10740 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
10750 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 32 5f  int Sqlitetest2_
10760 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
10770 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
10780 74 20 53 71 6c 69 74 65 74 65 73 74 33 5f 49 6e  t Sqlitetest3_In
10790 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
107a0 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
107b0 53 71 6c 69 74 65 74 65 73 74 34 5f 49 6e 69 74  Sqlitetest4_Init
107c0 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
107d0 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
107e0 6c 69 74 65 74 65 73 74 35 5f 49 6e 69 74 28 54  litetest5_Init(T
107f0 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
10800 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
10810 74 65 74 65 73 74 36 5f 49 6e 69 74 28 54 63 6c  tetest6_Init(Tcl
10820 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
10830 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
10840 74 65 73 74 61 73 79 6e 63 5f 49 6e 69 74 28 54  testasync_Init(T
10850 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
10860 20 65 78 74 65 72 6e 20 69 6e 74 20 4d 64 35 5f   extern int Md5_
10870 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
10880 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
10890 74 20 53 71 6c 69 74 65 74 65 73 74 73 73 65 5f  t Sqlitetestsse_
108a0 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
108b0 29 3b 0a 0a 20 20 20 20 53 71 6c 69 74 65 74 65  );..    Sqlitete
108c0 73 74 31 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  st1_Init(interp)
108d0 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
108e0 32 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  2_Init(interp);.
108f0 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 33 5f      Sqlitetest3_
10900 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
10910 20 20 53 71 6c 69 74 65 74 65 73 74 34 5f 49 6e    Sqlitetest4_In
10920 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
10930 53 71 6c 69 74 65 74 65 73 74 35 5f 49 6e 69 74  Sqlitetest5_Init
10940 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
10950 6c 69 74 65 74 65 73 74 36 5f 49 6e 69 74 28 69  litetest6_Init(i
10960 6e 74 65 72 70 29 3b 0a 20 20 20 20 2f 2a 20 53  nterp);.    /* S
10970 71 6c 69 74 65 74 65 73 74 61 73 79 6e 63 5f 49  qlitetestasync_I
10980 6e 69 74 28 69 6e 74 65 72 70 29 3b 20 2a 2f 0a  nit(interp); */.
10990 20 20 20 20 4d 64 35 5f 49 6e 69 74 28 69 6e 74      Md5_Init(int
109a0 65 72 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  erp);.#ifdef SQL
109b0 49 54 45 5f 53 53 45 0a 20 20 20 20 53 71 6c 69  ITE_SSE.    Sqli
109c0 74 65 74 65 73 74 73 73 65 5f 49 6e 69 74 28 69  tetestsse_Init(i
109d0 6e 74 65 72 70 29 3b 0a 23 65 6e 64 69 66 0a 20  nterp);.#endif. 
109e0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
109f0 61 72 67 63 3e 3d 32 20 7c 7c 20 54 43 4c 53 48  argc>=2 || TCLSH
10a00 3d 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ==2 ){.    int i
10a10 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72  ;.    Tcl_SetVar
10a20 28 69 6e 74 65 72 70 2c 22 61 72 67 76 30 22 2c  (interp,"argv0",
10a30 61 72 67 76 5b 31 5d 2c 54 43 4c 5f 47 4c 4f 42  argv[1],TCL_GLOB
10a40 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 54 63  AL_ONLY);.    Tc
10a50 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c  l_SetVar(interp,
10a60 22 61 72 67 76 22 2c 20 22 22 2c 20 54 43 4c 5f  "argv", "", TCL_
10a70 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20  GLOBAL_ONLY);.  
10a80 20 20 66 6f 72 28 69 3d 33 2d 54 43 4c 53 48 3b    for(i=3-TCLSH;
10a90 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20   i<argc; i++){. 
10aa0 20 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28       Tcl_SetVar(
10ab0 69 6e 74 65 72 70 2c 20 22 61 72 67 76 22 2c 20  interp, "argv", 
10ac0 61 72 67 76 5b 69 5d 2c 0a 20 20 20 20 20 20 20  argv[i],.       
10ad0 20 20 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e     TCL_GLOBAL_ON
10ae0 4c 59 20 7c 20 54 43 4c 5f 4c 49 53 54 5f 45 4c  LY | TCL_LIST_EL
10af0 45 4d 45 4e 54 20 7c 20 54 43 4c 5f 41 50 50 45  EMENT | TCL_APPE
10b00 4e 44 5f 56 41 4c 55 45 29 3b 0a 20 20 20 20 7d  ND_VALUE);.    }
10b10 0a 20 20 20 20 69 66 28 20 54 43 4c 53 48 3d 3d  .    if( TCLSH==
10b20 31 20 26 26 20 54 63 6c 5f 45 76 61 6c 46 69 6c  1 && Tcl_EvalFil
10b30 65 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  e(interp, argv[1
10b40 5d 29 21 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20  ])!=TCL_OK ){.  
10b50 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
10b60 7a 49 6e 66 6f 20 3d 20 54 63 6c 5f 47 65 74 56  zInfo = Tcl_GetV
10b70 61 72 28 69 6e 74 65 72 70 2c 20 22 65 72 72 6f  ar(interp, "erro
10b80 72 49 6e 66 6f 22 2c 20 54 43 4c 5f 47 4c 4f 42  rInfo", TCL_GLOB
10b90 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 20 20  AL_ONLY);.      
10ba0 69 66 28 20 7a 49 6e 66 6f 3d 3d 30 20 29 20 7a  if( zInfo==0 ) z
10bb0 49 6e 66 6f 20 3d 20 69 6e 74 65 72 70 2d 3e 72  Info = interp->r
10bc0 65 73 75 6c 74 3b 0a 20 20 20 20 20 20 66 70 72  esult;.      fpr
10bd0 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25 73 3a  intf(stderr,"%s:
10be0 20 25 73 5c 6e 22 2c 20 2a 61 72 67 76 2c 20 7a   %s\n", *argv, z
10bf0 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 72 65 74  Info);.      ret
10c00 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
10c10 0a 20 20 69 66 28 20 61 72 67 63 3c 3d 31 20 7c  .  if( argc<=1 |
10c20 7c 20 54 43 4c 53 48 3d 3d 32 20 29 7b 0a 20 20  | TCLSH==2 ){.  
10c30 20 20 54 63 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c    Tcl_GlobalEval
10c40 28 69 6e 74 65 72 70 2c 20 7a 4d 61 69 6e 6c 6f  (interp, zMainlo
10c50 6f 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  op);.  }.  retur
10c60 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 0;.}.#endif /*
10c70 20 54 43 4c 53 48 20 2a 2f 0a 0a 23 65 6e 64 69   TCLSH */..#endi
10c80 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 4e 4f  f /* !defined(NO
10c90 5f 54 43 4c 29 20 2a 2f 0a                       _TCL) */.