/ Hex Artifact Content
Login

Artifact 2a8f33a359a932b6be1e6b1608b4919df93ef25d:


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: 32 32 20 32 30 30 35 2f 30 34 2f 32 38 20 31 37  22 2005/04/28 17
01c0: 3a 31 38 3a 34 39 20 64 72 68 20 45 78 70 20 24  :18:49 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 0a  ude <assert.h>..
0290: 23 64 65 66 69 6e 65 20 4e 55 4d 5f 50 52 45 50  #define NUM_PREP
02a0: 41 52 45 44 5f 53 54 4d 54 53 20 31 30 0a 23 64  ARED_STMTS 10.#d
02b0: 65 66 69 6e 65 20 4d 41 58 5f 50 52 45 50 41 52  efine MAX_PREPAR
02c0: 45 44 5f 53 54 4d 54 53 20 31 30 30 0a 0a 2f 2a  ED_STMTS 100../*
02d0: 0a 2a 2a 20 49 66 20 54 43 4c 20 75 73 65 73 20  .** If TCL uses 
02e0: 55 54 46 2d 38 20 61 6e 64 20 53 51 4c 69 74 65  UTF-8 and SQLite
02f0: 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74   is configured t
0300: 6f 20 75 73 65 20 69 73 6f 38 38 35 39 2c 20 74  o use iso8859, t
0310: 68 65 6e 20 77 65 0a 2a 2a 20 68 61 76 65 20 74  hen we.** have t
0320: 6f 20 64 6f 20 61 20 74 72 61 6e 73 6c 61 74 69  o do a translati
0330: 6f 6e 20 77 68 65 6e 20 67 6f 69 6e 67 20 62 65  on when going be
0340: 74 77 65 65 6e 20 74 68 65 20 74 77 6f 2e 20 20  tween the two.  
0350: 53 65 74 20 74 68 65 20 0a 2a 2a 20 55 54 46 5f  Set the .** UTF_
0360: 54 52 41 4e 53 4c 41 54 49 4f 4e 5f 4e 45 45 44  TRANSLATION_NEED
0370: 45 44 20 6d 61 63 72 6f 20 74 6f 20 69 6e 64 69  ED macro to indi
0380: 63 61 74 65 20 74 68 61 74 20 77 65 20 6e 65 65  cate that we nee
0390: 64 20 74 6f 20 64 6f 0a 2a 2a 20 74 68 69 73 20  d to do.** this 
03a0: 74 72 61 6e 73 6c 61 74 69 6f 6e 2e 20 20 0a 2a  translation.  .*
03b0: 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 54 43  /.#if defined(TC
03c0: 4c 5f 55 54 46 5f 4d 41 58 29 20 26 26 20 21 64  L_UTF_MAX) && !d
03d0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 55 54  efined(SQLITE_UT
03e0: 46 38 29 0a 23 20 64 65 66 69 6e 65 20 55 54 46  F8).# define UTF
03f0: 5f 54 52 41 4e 53 4c 41 54 49 4f 4e 5f 4e 45 45  _TRANSLATION_NEE
0400: 44 45 44 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a  DED 1.#endif../*
0410: 0a 2a 2a 20 4e 65 77 20 53 51 4c 20 66 75 6e 63  .** New SQL func
0420: 74 69 6f 6e 73 20 63 61 6e 20 62 65 20 63 72 65  tions can be cre
0430: 61 74 65 64 20 61 73 20 54 43 4c 20 73 63 72 69  ated as TCL scri
0440: 70 74 73 2e 20 20 45 61 63 68 20 73 75 63 68 20  pts.  Each such 
0450: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 64  function.** is d
0460: 65 73 63 72 69 62 65 64 20 62 79 20 61 6e 20 69  escribed by an i
0470: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
0480: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
0490: 72 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  re..*/.typedef s
04a0: 74 72 75 63 74 20 53 71 6c 46 75 6e 63 20 53 71  truct SqlFunc Sq
04b0: 6c 46 75 6e 63 3b 0a 73 74 72 75 63 74 20 53 71  lFunc;.struct Sq
04c0: 6c 46 75 6e 63 20 7b 0a 20 20 54 63 6c 5f 49 6e  lFunc {.  Tcl_In
04d0: 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 20 20 20  terp *interp;   
04e0: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
04f0: 70 72 65 74 20 74 6f 20 65 78 65 63 75 74 65 20  pret to execute 
0500: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  the function */.
0510: 20 20 63 68 61 72 20 2a 7a 53 63 72 69 70 74 3b    char *zScript;
0520: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
0530: 63 72 69 70 74 20 74 6f 20 62 65 20 72 75 6e 20  cript to be run 
0540: 2a 2f 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70 4e  */.  SqlFunc *pN
0550: 65 78 74 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65  ext;       /* Ne
0560: 78 74 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 20 74  xt function on t
0570: 68 65 20 6c 69 73 74 20 6f 66 20 74 68 65 6d 20  he list of them 
0580: 61 6c 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  all */.};../*.**
0590: 20 4e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   New collation s
05a0: 65 71 75 65 6e 63 65 73 20 66 75 6e 63 74 69 6f  equences functio
05b0: 6e 20 63 61 6e 20 62 65 20 63 72 65 61 74 65 64  n can be created
05c0: 20 61 73 20 54 43 4c 20 73 63 72 69 70 74 73 2e   as TCL scripts.
05d0: 20 20 45 61 63 68 20 73 75 63 68 0a 2a 2a 20 66    Each such.** f
05e0: 75 6e 63 74 69 6f 6e 20 69 73 20 64 65 73 63 72  unction is descr
05f0: 69 62 65 64 20 62 79 20 61 6e 20 69 6e 73 74 61  ibed by an insta
0600: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
0610: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
0620: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
0630: 74 20 53 71 6c 43 6f 6c 6c 61 74 65 20 53 71 6c  t SqlCollate Sql
0640: 43 6f 6c 6c 61 74 65 3b 0a 73 74 72 75 63 74 20  Collate;.struct 
0650: 53 71 6c 43 6f 6c 6c 61 74 65 20 7b 0a 20 20 54  SqlCollate {.  T
0660: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
0670: 70 3b 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  p;   /* The TCL 
0680: 69 6e 74 65 72 70 72 65 74 20 74 6f 20 65 78 65  interpret to exe
0690: 63 75 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f  cute the functio
06a0: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 63  n */.  char *zSc
06b0: 72 69 70 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  ript;        /* 
06c0: 54 68 65 20 73 63 72 69 70 74 20 74 6f 20 62 65  The script to be
06d0: 20 72 75 6e 20 2a 2f 0a 20 20 53 71 6c 43 6f 6c   run */.  SqlCol
06e0: 6c 61 74 65 20 2a 70 4e 65 78 74 3b 20 20 20 20  late *pNext;    
06f0: 20 20 20 2f 2a 20 4e 65 78 74 20 66 75 6e 63 74     /* Next funct
0700: 69 6f 6e 20 6f 6e 20 74 68 65 20 6c 69 73 74 20  ion on the list 
0710: 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 7d  of them all */.}
0720: 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65  ;../*.** Prepare
0730: 64 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65  d statements are
0740: 20 63 61 63 68 65 64 20 66 6f 72 20 66 61 73 74   cached for fast
0750: 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 45  er execution.  E
0760: 61 63 68 20 70 72 65 70 61 72 65 64 0a 2a 2a 20  ach prepared.** 
0770: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 64 65 73  statement is des
0780: 63 72 69 62 65 64 20 62 79 20 61 6e 20 69 6e 73  cribed by an ins
0790: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
07a0: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
07b0: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
07c0: 75 63 74 20 53 71 6c 50 72 65 70 61 72 65 64 53  uct SqlPreparedS
07d0: 74 6d 74 20 53 71 6c 50 72 65 70 61 72 65 64 53  tmt SqlPreparedS
07e0: 74 6d 74 3b 0a 73 74 72 75 63 74 20 53 71 6c 50  tmt;.struct SqlP
07f0: 72 65 70 61 72 65 64 53 74 6d 74 20 7b 0a 20 20  reparedStmt {.  
0800: 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20  SqlPreparedStmt 
0810: 2a 70 4e 65 78 74 3b 20 20 2f 2a 20 4e 65 78 74  *pNext;  /* Next
0820: 20 69 6e 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20   in linked list 
0830: 2a 2f 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64  */.  SqlPrepared
0840: 53 74 6d 74 20 2a 70 50 72 65 76 3b 20 20 2f 2a  Stmt *pPrev;  /*
0850: 20 50 72 65 76 69 6f 75 73 20 6f 6e 20 74 68 65   Previous on the
0860: 20 6c 69 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74   list */.  sqlit
0870: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20  e3_stmt *pStmt; 
0880: 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61      /* The prepa
0890: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  red statement */
08a0: 0a 20 20 69 6e 74 20 6e 53 71 6c 3b 20 20 20 20  .  int nSql;    
08b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63              /* c
08c0: 68 61 72 73 20 69 6e 20 7a 53 71 6c 5b 5d 20 2a  hars in zSql[] *
08d0: 2f 0a 20 20 63 68 61 72 20 7a 53 71 6c 5b 31 5d  /.  char zSql[1]
08e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
08f0: 54 65 78 74 20 6f 66 20 74 68 65 20 53 51 4c 20  Text of the SQL 
0900: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 7d 3b 0a  statement */.};.
0910: 0a 2f 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20  ./*.** There is 
0920: 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  one instance of 
0930: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 66  this structure f
0940: 6f 72 20 65 61 63 68 20 53 51 4c 69 74 65 20 64  or each SQLite d
0950: 61 74 61 62 61 73 65 0a 2a 2a 20 74 68 61 74 20  atabase.** that 
0960: 68 61 73 20 62 65 65 6e 20 6f 70 65 6e 65 64 20  has been opened 
0970: 62 79 20 74 68 65 20 53 51 4c 69 74 65 20 54 43  by the SQLite TC
0980: 4c 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a  L interface..*/.
0990: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53  typedef struct S
09a0: 71 6c 69 74 65 44 62 20 53 71 6c 69 74 65 44 62  qliteDb SqliteDb
09b0: 3b 0a 73 74 72 75 63 74 20 53 71 6c 69 74 65 44  ;.struct SqliteD
09c0: 62 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  b {.  sqlite3 *d
09d0: 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  b;          /* T
09e0: 68 65 20 22 72 65 61 6c 22 20 64 61 74 61 62 61  he "real" databa
09f0: 73 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  se structure */.
0a00: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
0a10: 74 65 72 70 3b 20 20 20 2f 2a 20 54 68 65 20 69  terp;   /* The i
0a20: 6e 74 65 72 70 72 65 74 65 72 20 75 73 65 64 20  nterpreter used 
0a30: 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73  for this databas
0a40: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 42 75  e */.  char *zBu
0a50: 73 79 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  sy;          /* 
0a60: 54 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  The busy callbac
0a70: 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63  k routine */.  c
0a80: 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 20 20 20  har *zCommit;   
0a90: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d       /* The comm
0aa0: 69 74 20 68 6f 6f 6b 20 63 61 6c 6c 62 61 63 6b  it hook callback
0ab0: 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68   routine */.  ch
0ac0: 61 72 20 2a 7a 54 72 61 63 65 3b 20 20 20 20 20  ar *zTrace;     
0ad0: 20 20 20 20 2f 2a 20 54 68 65 20 74 72 61 63 65      /* The trace
0ae0: 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e   callback routin
0af0: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 72  e */.  char *zPr
0b00: 6f 67 72 65 73 73 3b 20 20 20 20 20 20 2f 2a 20  ogress;      /* 
0b10: 54 68 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c  The progress cal
0b20: 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f  lback routine */
0b30: 0a 20 20 63 68 61 72 20 2a 7a 41 75 74 68 3b 20  .  char *zAuth; 
0b40: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
0b50: 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 63 61  authorization ca
0b60: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a  llback routine *
0b70: 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 75 6c 6c 3b  /.  char *zNull;
0b80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
0b90: 74 20 74 6f 20 73 75 62 73 74 69 74 75 74 65 20  t to substitute 
0ba0: 66 6f 72 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 20  for an SQL NULL 
0bb0: 76 61 6c 75 65 20 2a 2f 0a 20 20 53 71 6c 46 75  value */.  SqlFu
0bc0: 6e 63 20 2a 70 46 75 6e 63 3b 20 20 20 20 20 20  nc *pFunc;      
0bd0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 53 51 4c 20   /* List of SQL 
0be0: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 53  functions */.  S
0bf0: 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 43 6f 6c 6c  qlCollate *pColl
0c00: 61 74 65 3b 20 2f 2a 20 4c 69 73 74 20 6f 66 20  ate; /* List of 
0c10: 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75  SQL collation fu
0c20: 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  nctions */.  int
0c30: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
0c40: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
0c50: 65 20 6f 66 20 6d 6f 73 74 20 72 65 63 65 6e 74  e of most recent
0c60: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20   sqlite3_exec() 
0c70: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43  */.  Tcl_Obj *pC
0c80: 6f 6c 6c 61 74 65 4e 65 65 64 65 64 3b 20 20 2f  ollateNeeded;  /
0c90: 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65 64  * Collation need
0ca0: 65 64 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 53  ed script */.  S
0cb0: 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a  qlPreparedStmt *
0cc0: 73 74 6d 74 4c 69 73 74 3b 20 2f 2a 20 4c 69 73  stmtList; /* Lis
0cd0: 74 20 6f 66 20 70 72 65 70 61 72 65 64 20 73 74  t of prepared st
0ce0: 61 74 65 6d 65 6e 74 73 2a 2f 0a 20 20 53 71 6c  atements*/.  Sql
0cf0: 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 73 74  PreparedStmt *st
0d00: 6d 74 4c 61 73 74 3b 20 2f 2a 20 4c 61 73 74 20  mtLast; /* Last 
0d10: 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 74 68 65  statement in the
0d20: 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6d   list */.  int m
0d30: 61 78 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20  axStmt;         
0d40: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78        /* The nex
0d50: 74 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  t maximum number
0d60: 20 6f 66 20 73 74 6d 74 4c 69 73 74 20 2a 2f 0a   of stmtList */.
0d70: 20 20 69 6e 74 20 6e 53 74 6d 74 3b 20 20 20 20    int nStmt;    
0d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0d90: 4e 75 6d 62 65 72 20 6f 66 20 73 74 61 74 65 6d  Number of statem
0da0: 65 6e 74 73 20 69 6e 20 73 74 6d 74 4c 69 73 74  ents in stmtList
0db0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 46 69   */.};../*.** Fi
0dc0: 6e 61 6c 69 7a 65 20 61 6e 64 20 66 72 65 65 20  nalize and free 
0dd0: 61 20 6c 69 73 74 20 6f 66 20 70 72 65 70 61 72  a list of prepar
0de0: 65 64 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2f  ed statements.*/
0df0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 6c 75  .static void flu
0e00: 73 68 53 74 6d 74 43 61 63 68 65 28 20 53 71 6c  shStmtCache( Sql
0e10: 69 74 65 44 62 20 2a 70 44 62 20 29 7b 0a 20 20  iteDb *pDb ){.  
0e20: 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20  SqlPreparedStmt 
0e30: 2a 70 50 72 65 53 74 6d 74 3b 0a 0a 20 20 77 68  *pPreStmt;..  wh
0e40: 69 6c 65 28 20 20 70 44 62 2d 3e 73 74 6d 74 4c  ile(  pDb->stmtL
0e50: 69 73 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ist ){.    sqlit
0e60: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 20 70 44 62  e3_finalize( pDb
0e70: 2d 3e 73 74 6d 74 4c 69 73 74 2d 3e 70 53 74 6d  ->stmtList->pStm
0e80: 74 20 29 3b 0a 20 20 20 20 70 50 72 65 53 74 6d  t );.    pPreStm
0e90: 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73  t = pDb->stmtLis
0ea0: 74 3b 0a 20 20 20 20 70 44 62 2d 3e 73 74 6d 74  t;.    pDb->stmt
0eb0: 4c 69 73 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74  List = pDb->stmt
0ec0: 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  List->pNext;.   
0ed0: 20 54 63 6c 5f 46 72 65 65 28 20 28 63 68 61 72   Tcl_Free( (char
0ee0: 2a 29 70 50 72 65 53 74 6d 74 20 29 3b 0a 20 20  *)pPreStmt );.  
0ef0: 7d 0a 20 20 70 44 62 2d 3e 6e 53 74 6d 74 20 3d  }.  pDb->nStmt =
0f00: 20 30 3b 0a 20 20 70 44 62 2d 3e 73 74 6d 74 4c   0;.  pDb->stmtL
0f10: 61 73 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ast = 0;.}../*.*
0f20: 2a 20 54 43 4c 20 63 61 6c 6c 73 20 74 68 69 73  * TCL calls this
0f30: 20 70 72 6f 63 65 64 75 72 65 20 77 68 65 6e 20   procedure when 
0f40: 61 6e 20 73 71 6c 69 74 65 33 20 64 61 74 61 62  an sqlite3 datab
0f50: 61 73 65 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a  ase command is.*
0f60: 2a 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74  * deleted..*/.st
0f70: 61 74 69 63 20 76 6f 69 64 20 44 62 44 65 6c 65  atic void DbDele
0f80: 74 65 43 6d 64 28 76 6f 69 64 20 2a 64 62 29 7b  teCmd(void *db){
0f90: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
0fa0: 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 64 62   = (SqliteDb*)db
0fb0: 3b 0a 20 20 66 6c 75 73 68 53 74 6d 74 43 61 63  ;.  flushStmtCac
0fc0: 68 65 28 70 44 62 29 3b 0a 20 20 73 71 6c 69 74  he(pDb);.  sqlit
0fd0: 65 33 5f 63 6c 6f 73 65 28 70 44 62 2d 3e 64 62  e3_close(pDb->db
0fe0: 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 44 62 2d  );.  while( pDb-
0ff0: 3e 70 46 75 6e 63 20 29 7b 0a 20 20 20 20 53 71  >pFunc ){.    Sq
1000: 6c 46 75 6e 63 20 2a 70 46 75 6e 63 20 3d 20 70  lFunc *pFunc = p
1010: 44 62 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 70  Db->pFunc;.    p
1020: 44 62 2d 3e 70 46 75 6e 63 20 3d 20 70 46 75 6e  Db->pFunc = pFun
1030: 63 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 54 63  c->pNext;.    Tc
1040: 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 46  l_Free((char*)pF
1050: 75 6e 63 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  unc);.  }.  whil
1060: 65 28 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65  e( pDb->pCollate
1070: 20 29 7b 0a 20 20 20 20 53 71 6c 43 6f 6c 6c 61   ){.    SqlColla
1080: 74 65 20 2a 70 43 6f 6c 6c 61 74 65 20 3d 20 70  te *pCollate = p
1090: 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 3b 0a 20 20  Db->pCollate;.  
10a0: 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 20    pDb->pCollate 
10b0: 3d 20 70 43 6f 6c 6c 61 74 65 2d 3e 70 4e 65 78  = pCollate->pNex
10c0: 74 3b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28  t;.    Tcl_Free(
10d0: 28 63 68 61 72 2a 29 70 43 6f 6c 6c 61 74 65 29  (char*)pCollate)
10e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d  ;.  }.  if( pDb-
10f0: 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20 20 54 63  >zBusy ){.    Tc
1100: 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 42 75 73  l_Free(pDb->zBus
1110: 79 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44  y);.  }.  if( pD
1120: 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20 20  b->zTrace ){.   
1130: 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
1140: 54 72 61 63 65 29 3b 0a 20 20 7d 0a 20 20 69 66  Trace);.  }.  if
1150: 28 20 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a  ( pDb->zAuth ){.
1160: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
1170: 2d 3e 7a 41 75 74 68 29 3b 0a 20 20 7d 0a 20 20  ->zAuth);.  }.  
1180: 69 66 28 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 29  if( pDb->zNull )
1190: 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70  {.    Tcl_Free(p
11a0: 44 62 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20 20 7d 0a  Db->zNull);.  }.
11b0: 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72    Tcl_Free((char
11c0: 2a 29 70 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  *)pDb);.}../*.**
11d0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
11e0: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 64   called when a d
11f0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
1200: 6c 6f 63 6b 65 64 20 77 68 69 6c 65 20 74 72 79  locked while try
1210: 69 6e 67 0a 2a 2a 20 74 6f 20 65 78 65 63 75 74  ing.** to execut
1220: 65 20 53 51 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63  e SQL..*/.static
1230: 20 69 6e 74 20 44 62 42 75 73 79 48 61 6e 64 6c   int DbBusyHandl
1240: 65 72 28 76 6f 69 64 20 2a 63 64 2c 20 69 6e 74  er(void *cd, int
1250: 20 6e 54 72 69 65 73 29 7b 0a 20 20 53 71 6c 69   nTries){.  Sqli
1260: 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c  teDb *pDb = (Sql
1270: 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69 6e 74  iteDb*)cd;.  int
1280: 20 72 63 3b 0a 20 20 63 68 61 72 20 7a 56 61 6c   rc;.  char zVal
1290: 5b 33 30 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 43  [30];.  char *zC
12a0: 6d 64 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  md;.  Tcl_DStrin
12b0: 67 20 63 6d 64 3b 0a 0a 20 20 54 63 6c 5f 44 53  g cmd;..  Tcl_DS
12c0: 74 72 69 6e 67 49 6e 69 74 28 26 63 6d 64 29 3b  tringInit(&cmd);
12d0: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70  .  Tcl_DStringAp
12e0: 70 65 6e 64 28 26 63 6d 64 2c 20 70 44 62 2d 3e  pend(&cmd, pDb->
12f0: 7a 42 75 73 79 2c 20 2d 31 29 3b 0a 20 20 73 70  zBusy, -1);.  sp
1300: 72 69 6e 74 66 28 7a 56 61 6c 2c 20 22 25 64 22  rintf(zVal, "%d"
1310: 2c 20 6e 54 72 69 65 73 29 3b 0a 20 20 54 63 6c  , nTries);.  Tcl
1320: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c  _DStringAppendEl
1330: 65 6d 65 6e 74 28 26 63 6d 64 2c 20 7a 56 61 6c  ement(&cmd, zVal
1340: 29 3b 0a 20 20 7a 43 6d 64 20 3d 20 54 63 6c 5f  );.  zCmd = Tcl_
1350: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 63 6d  DStringValue(&cm
1360: 64 29 3b 0a 20 20 72 63 20 3d 20 54 63 6c 5f 45  d);.  rc = Tcl_E
1370: 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c  val(pDb->interp,
1380: 20 7a 43 6d 64 29 3b 0a 20 20 54 63 6c 5f 44 53   zCmd);.  Tcl_DS
1390: 74 72 69 6e 67 46 72 65 65 28 26 63 6d 64 29 3b  tringFree(&cmd);
13a0: 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f  .  if( rc!=TCL_O
13b0: 4b 20 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47 65  K || atoi(Tcl_Ge
13c0: 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44  tStringResult(pD
13d0: 62 2d 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a 20  b->interp)) ){. 
13e0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
13f0: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
1400: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1410: 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 73  ne is invoked as
1420: 20 74 68 65 20 27 70 72 6f 67 72 65 73 73 20 63   the 'progress c
1430: 61 6c 6c 62 61 63 6b 27 20 66 6f 72 20 74 68 65  allback' for the
1440: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74   database..*/.st
1450: 61 74 69 63 20 69 6e 74 20 44 62 50 72 6f 67 72  atic int DbProgr
1460: 65 73 73 48 61 6e 64 6c 65 72 28 76 6f 69 64 20  essHandler(void 
1470: 2a 63 64 29 7b 0a 20 20 53 71 6c 69 74 65 44 62  *cd){.  SqliteDb
1480: 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44   *pDb = (SqliteD
1490: 62 2a 29 63 64 3b 0a 20 20 69 6e 74 20 72 63 3b  b*)cd;.  int rc;
14a0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 2d  ..  assert( pDb-
14b0: 3e 7a 50 72 6f 67 72 65 73 73 20 29 3b 0a 20 20  >zProgress );.  
14c0: 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 28 70 44  rc = Tcl_Eval(pD
14d0: 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e  b->interp, pDb->
14e0: 7a 50 72 6f 67 72 65 73 73 29 3b 0a 20 20 69 66  zProgress);.  if
14f0: 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20  ( rc!=TCL_OK || 
1500: 61 74 6f 69 28 54 63 6c 5f 47 65 74 53 74 72 69  atoi(Tcl_GetStri
1510: 6e 67 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e  ngResult(pDb->in
1520: 74 65 72 70 29 29 20 29 7b 0a 20 20 20 20 72 65  terp)) ){.    re
1530: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
1540: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
1550: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1560: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 53   called by the S
1570: 51 4c 69 74 65 20 74 72 61 63 65 20 68 61 6e 64  QLite trace hand
1580: 6c 65 72 20 77 68 65 6e 65 76 65 72 20 61 20 6e  ler whenever a n
1590: 65 77 0a 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20 53  ew.** block of S
15a0: 51 4c 20 69 73 20 65 78 65 63 75 74 65 64 2e 20  QL is executed. 
15b0: 20 54 68 65 20 54 43 4c 20 73 63 72 69 70 74 20   The TCL script 
15c0: 69 6e 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 69  in pDb->zTrace i
15d0: 73 20 65 78 65 63 75 74 65 64 2e 0a 2a 2f 0a 73  s executed..*/.s
15e0: 74 61 74 69 63 20 76 6f 69 64 20 44 62 54 72 61  tatic void DbTra
15f0: 63 65 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a  ceHandler(void *
1600: 63 64 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  cd, const char *
1610: 7a 53 71 6c 29 7b 0a 20 20 53 71 6c 69 74 65 44  zSql){.  SqliteD
1620: 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65  b *pDb = (Sqlite
1630: 44 62 2a 29 63 64 3b 0a 20 20 54 63 6c 5f 44 53  Db*)cd;.  Tcl_DS
1640: 74 72 69 6e 67 20 73 74 72 3b 0a 0a 20 20 54 63  tring str;..  Tc
1650: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73  l_DStringInit(&s
1660: 74 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  tr);.  Tcl_DStri
1670: 6e 67 41 70 70 65 6e 64 28 26 73 74 72 2c 20 70  ngAppend(&str, p
1680: 44 62 2d 3e 7a 54 72 61 63 65 2c 20 2d 31 29 3b  Db->zTrace, -1);
1690: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70  .  Tcl_DStringAp
16a0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72  pendElement(&str
16b0: 2c 20 7a 53 71 6c 29 3b 0a 20 20 54 63 6c 5f 45  , zSql);.  Tcl_E
16c0: 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c  val(pDb->interp,
16d0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75   Tcl_DStringValu
16e0: 65 28 26 73 74 72 29 29 3b 0a 20 20 54 63 6c 5f  e(&str));.  Tcl_
16f0: 44 53 74 72 69 6e 67 46 72 65 65 28 26 73 74 72  DStringFree(&str
1700: 29 3b 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65  );.  Tcl_ResetRe
1710: 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70  sult(pDb->interp
1720: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
1730: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
1740: 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61  ed when a transa
1750: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74  ction is committ
1760: 65 64 2e 20 20 54 68 65 0a 2a 2a 20 54 43 4c 20  ed.  The.** TCL 
1770: 73 63 72 69 70 74 20 69 6e 20 70 44 62 2d 3e 7a  script in pDb->z
1780: 43 6f 6d 6d 69 74 20 69 73 20 65 78 65 63 75 74  Commit is execut
1790: 65 64 2e 20 20 49 66 20 69 74 20 72 65 74 75 72  ed.  If it retur
17a0: 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 0a 2a  ns non-zero or.*
17b0: 2a 20 69 66 20 69 74 20 74 68 72 6f 77 73 20 61  * if it throws a
17c0: 6e 20 65 78 63 65 70 74 69 6f 6e 2c 20 74 68 65  n exception, the
17d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
17e0: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 73 74  rolled back inst
17f0: 65 61 64 0a 2a 2a 20 6f 66 20 62 65 69 6e 67 20  ead.** of being 
1800: 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2f 0a 73 74  committed..*/.st
1810: 61 74 69 63 20 69 6e 74 20 44 62 43 6f 6d 6d 69  atic int DbCommi
1820: 74 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63  tHandler(void *c
1830: 64 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  d){.  SqliteDb *
1840: 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a  pDb = (SqliteDb*
1850: 29 63 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  )cd;.  int rc;..
1860: 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 28    rc = Tcl_Eval(
1870: 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62  pDb->interp, pDb
1880: 2d 3e 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66  ->zCommit);.  if
1890: 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20  ( rc!=TCL_OK || 
18a0: 61 74 6f 69 28 54 63 6c 5f 47 65 74 53 74 72 69  atoi(Tcl_GetStri
18b0: 6e 67 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e  ngResult(pDb->in
18c0: 74 65 72 70 29 29 20 29 7b 0a 20 20 20 20 72 65  terp)) ){.    re
18d0: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
18e0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69  turn 0;.}..stati
18f0: 63 20 76 6f 69 64 20 74 63 6c 43 6f 6c 6c 61 74  c void tclCollat
1900: 65 4e 65 65 64 65 64 28 0a 20 20 76 6f 69 64 20  eNeeded(.  void 
1910: 2a 70 43 74 78 2c 0a 20 20 73 71 6c 69 74 65 33  *pCtx,.  sqlite3
1920: 20 2a 64 62 2c 0a 20 20 69 6e 74 20 65 6e 63 2c   *db,.  int enc,
1930: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1940: 4e 61 6d 65 0a 29 7b 0a 20 20 53 71 6c 69 74 65  Name.){.  Sqlite
1950: 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74  Db *pDb = (Sqlit
1960: 65 44 62 20 2a 29 70 43 74 78 3b 0a 20 20 54 63  eDb *)pCtx;.  Tc
1970: 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 20 3d  l_Obj *pScript =
1980: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62   Tcl_DuplicateOb
1990: 6a 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e  j(pDb->pCollateN
19a0: 65 65 64 65 64 29 3b 0a 20 20 54 63 6c 5f 49 6e  eeded);.  Tcl_In
19b0: 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69  crRefCount(pScri
19c0: 70 74 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  pt);.  Tcl_ListO
19d0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
19e0: 30 2c 20 70 53 63 72 69 70 74 2c 20 54 63 6c 5f  0, pScript, Tcl_
19f0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 4e 61  NewStringObj(zNa
1a00: 6d 65 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f  me, -1));.  Tcl_
1a10: 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69  EvalObjEx(pDb->i
1a20: 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20  nterp, pScript, 
1a30: 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65  0);.  Tcl_DecrRe
1a40: 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b  fCount(pScript);
1a50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
1a60: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1a70: 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20   to evaluate an 
1a80: 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75  SQL collation fu
1a90: 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74  nction implement
1aa0: 65 64 0a 2a 2a 20 75 73 69 6e 67 20 54 43 4c 20  ed.** using TCL 
1ab0: 73 63 72 69 70 74 2e 0a 2a 2f 0a 73 74 61 74 69  script..*/.stati
1ac0: 63 20 69 6e 74 20 74 63 6c 53 71 6c 43 6f 6c 6c  c int tclSqlColl
1ad0: 61 74 65 28 0a 20 20 76 6f 69 64 20 2a 70 43 74  ate(.  void *pCt
1ae0: 78 2c 0a 20 20 69 6e 74 20 6e 41 2c 0a 20 20 63  x,.  int nA,.  c
1af0: 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 41 2c 0a 20  onst void *zA,. 
1b00: 20 69 6e 74 20 6e 42 2c 0a 20 20 63 6f 6e 73 74   int nB,.  const
1b10: 20 76 6f 69 64 20 2a 7a 42 0a 29 7b 0a 20 20 53   void *zB.){.  S
1b20: 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 20 3d 20 28  qlCollate *p = (
1b30: 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 29 70 43 74  SqlCollate *)pCt
1b40: 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43  x;.  Tcl_Obj *pC
1b50: 6d 64 3b 0a 0a 20 20 70 43 6d 64 20 3d 20 54 63  md;..  pCmd = Tc
1b60: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70  l_NewStringObj(p
1b70: 2d 3e 7a 53 63 72 69 70 74 2c 20 2d 31 29 3b 0a  ->zScript, -1);.
1b80: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
1b90: 6e 74 28 70 43 6d 64 29 3b 0a 20 20 54 63 6c 5f  nt(pCmd);.  Tcl_
1ba0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
1bb0: 6d 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c 20  ment(p->interp, 
1bc0: 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72  pCmd, Tcl_NewStr
1bd0: 69 6e 67 4f 62 6a 28 7a 41 2c 20 6e 41 29 29 3b  ingObj(zA, nA));
1be0: 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
1bf0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70 2d 3e 69  pendElement(p->i
1c00: 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 63 6c  nterp, pCmd, Tcl
1c10: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 42  _NewStringObj(zB
1c20: 2c 20 6e 42 29 29 3b 0a 20 20 54 63 6c 5f 45 76  , nB));.  Tcl_Ev
1c30: 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72  alObjEx(p->inter
1c40: 70 2c 20 70 43 6d 64 2c 20 30 29 3b 0a 20 20 54  p, pCmd, 0);.  T
1c50: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
1c60: 70 43 6d 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  pCmd);.  return 
1c70: 28 61 74 6f 69 28 54 63 6c 5f 47 65 74 53 74 72  (atoi(Tcl_GetStr
1c80: 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74  ingResult(p->int
1c90: 65 72 70 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  erp)));.}../*.**
1ca0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1cb0: 20 63 61 6c 6c 65 64 20 74 6f 20 65 76 61 6c 75   called to evalu
1cc0: 61 74 65 20 61 6e 20 53 51 4c 20 66 75 6e 63 74  ate an SQL funct
1cd0: 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a  ion implemented.
1ce0: 2a 2a 20 75 73 69 6e 67 20 54 43 4c 20 73 63 72  ** using TCL scr
1cf0: 69 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ipt..*/.static v
1d00: 6f 69 64 20 74 63 6c 53 71 6c 46 75 6e 63 28 73  oid tclSqlFunc(s
1d10: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
1d20: 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
1d30: 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
1d40: 2a 2a 61 72 67 76 29 7b 0a 20 20 53 71 6c 46 75  **argv){.  SqlFu
1d50: 6e 63 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 5f  nc *p = sqlite3_
1d60: 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78  user_data(contex
1d70: 74 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  t);.  Tcl_DStrin
1d80: 67 20 63 6d 64 3b 0a 20 20 69 6e 74 20 69 3b 0a  g cmd;.  int i;.
1d90: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 54 63 6c    int rc;..  Tcl
1da0: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 63 6d  _DStringInit(&cm
1db0: 64 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  d);.  Tcl_DStrin
1dc0: 67 41 70 70 65 6e 64 28 26 63 6d 64 2c 20 70 2d  gAppend(&cmd, p-
1dd0: 3e 7a 53 63 72 69 70 74 2c 20 2d 31 29 3b 0a 20  >zScript, -1);. 
1de0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63   for(i=0; i<argc
1df0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
1e00: 53 51 4c 49 54 45 5f 4e 55 4c 4c 3d 3d 73 71 6c  SQLITE_NULL==sql
1e10: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
1e20: 61 72 67 76 5b 69 5d 29 20 29 7b 0a 20 20 20 20  argv[i]) ){.    
1e30: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
1e40: 65 6e 64 45 6c 65 6d 65 6e 74 28 26 63 6d 64 2c  endElement(&cmd,
1e50: 20 22 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   "");.    }else{
1e60: 0a 20 20 20 20 20 20 54 63 6c 5f 44 53 74 72 69  .      Tcl_DStri
1e70: 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  ngAppendElement(
1e80: 26 63 6d 64 2c 20 73 71 6c 69 74 65 33 5f 76 61  &cmd, sqlite3_va
1e90: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 69 5d  lue_text(argv[i]
1ea0: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ));.    }.  }.  
1eb0: 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 28 70 2d  rc = Tcl_Eval(p-
1ec0: 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44 53 74  >interp, Tcl_DSt
1ed0: 72 69 6e 67 56 61 6c 75 65 28 26 63 6d 64 29 29  ringValue(&cmd))
1ee0: 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
1ef0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
1f00: 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20  _error(context, 
1f10: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73  Tcl_GetStringRes
1f20: 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c 20  ult(p->interp), 
1f30: 2d 31 29 3b 20 0a 20 20 7d 65 6c 73 65 7b 0a 20  -1); .  }else{. 
1f40: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
1f50: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
1f60: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73  Tcl_GetStringRes
1f70: 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c 20  ult(p->interp), 
1f80: 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 53 51 4c  -1, .        SQL
1f90: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
1fa0: 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53    }.}..#ifndef S
1fb0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
1fc0: 52 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 54  RIZATION./*.** T
1fd0: 68 69 73 20 69 73 20 74 68 65 20 61 75 74 68 65  his is the authe
1fe0: 6e 74 69 63 61 74 69 6f 6e 20 66 75 6e 63 74 69  ntication functi
1ff0: 6f 6e 2e 20 20 49 74 20 61 70 70 65 6e 64 73 20  on.  It appends 
2000: 74 68 65 20 61 75 74 68 65 6e 74 69 63 61 74 69  the authenticati
2010: 6f 6e 0a 2a 2a 20 74 79 70 65 20 63 6f 64 65 20  on.** type code 
2020: 61 6e 64 20 74 68 65 20 74 77 6f 20 61 72 67 75  and the two argu
2030: 6d 65 6e 74 73 20 74 6f 20 7a 43 6d 64 5b 5d 20  ments to zCmd[] 
2040: 74 68 65 6e 20 69 6e 76 6f 6b 65 73 20 74 68 65  then invokes the
2050: 20 72 65 73 75 6c 74 0a 2a 2a 20 6f 6e 20 74 68   result.** on th
2060: 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e 20 20  e interpreter.  
2070: 54 68 65 20 72 65 70 6c 79 20 69 73 20 65 78 61  The reply is exa
2080: 6d 69 6e 65 64 20 74 6f 20 64 65 74 65 72 6d 69  mined to determi
2090: 6e 65 20 69 66 20 74 68 65 0a 2a 2a 20 61 75 74  ne if the.** aut
20a0: 68 65 6e 74 69 63 61 74 69 6f 6e 20 66 61 69 6c  hentication fail
20b0: 73 20 6f 72 20 73 75 63 63 65 65 64 73 2e 0a 2a  s or succeeds..*
20c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75 74  /.static int aut
20d0: 68 5f 63 61 6c 6c 62 61 63 6b 28 0a 20 20 76 6f  h_callback(.  vo
20e0: 69 64 20 2a 70 41 72 67 2c 0a 20 20 69 6e 74 20  id *pArg,.  int 
20f0: 63 6f 64 65 2c 0a 20 20 63 6f 6e 73 74 20 63 68  code,.  const ch
2100: 61 72 20 2a 7a 41 72 67 31 2c 0a 20 20 63 6f 6e  ar *zArg1,.  con
2110: 73 74 20 63 68 61 72 20 2a 7a 41 72 67 32 2c 0a  st char *zArg2,.
2120: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
2130: 72 67 33 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  rg3,.  const cha
2140: 72 20 2a 7a 41 72 67 34 0a 29 7b 0a 20 20 63 68  r *zArg4.){.  ch
2150: 61 72 20 2a 7a 43 6f 64 65 3b 0a 20 20 54 63 6c  ar *zCode;.  Tcl
2160: 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a 20 20  _DString str;.  
2170: 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20  int rc;.  const 
2180: 63 68 61 72 20 2a 7a 52 65 70 6c 79 3b 0a 20 20  char *zReply;.  
2190: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20  SqliteDb *pDb = 
21a0: 28 53 71 6c 69 74 65 44 62 2a 29 70 41 72 67 3b  (SqliteDb*)pArg;
21b0: 0a 0a 20 20 73 77 69 74 63 68 28 20 63 6f 64 65  ..  switch( code
21c0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
21d0: 49 54 45 5f 43 4f 50 59 20 20 20 20 20 20 20 20  ITE_COPY        
21e0: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
21f0: 51 4c 49 54 45 5f 43 4f 50 59 22 3b 20 62 72 65  QLITE_COPY"; bre
2200: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
2210: 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58  ITE_CREATE_INDEX
2220: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
2230: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44  QLITE_CREATE_IND
2240: 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  EX"; break;.    
2250: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41  case SQLITE_CREA
2260: 54 45 5f 54 41 42 4c 45 20 20 20 20 20 20 3a 20  TE_TABLE      : 
2270: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52  zCode="SQLITE_CR
2280: 45 41 54 45 5f 54 41 42 4c 45 22 3b 20 62 72 65  EATE_TABLE"; bre
2290: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
22a0: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
22b0: 49 4e 44 45 58 20 3a 20 7a 43 6f 64 65 3d 22 53  INDEX : zCode="S
22c0: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
22d0: 50 5f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b  P_INDEX"; break;
22e0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
22f0: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42  _CREATE_TEMP_TAB
2300: 4c 45 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49  LE : zCode="SQLI
2310: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54  TE_CREATE_TEMP_T
2320: 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20  ABLE"; break;.  
2330: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52    case SQLITE_CR
2340: 45 41 54 45 5f 54 45 4d 50 5f 54 52 49 47 47 45  EATE_TEMP_TRIGGE
2350: 52 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45  R: zCode="SQLITE
2360: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 52 49  _CREATE_TEMP_TRI
2370: 47 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20  GGER"; break;.  
2380: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52    case SQLITE_CR
2390: 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 20 20  EATE_TEMP_VIEW  
23a0: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
23b0: 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57  CREATE_TEMP_VIEW
23c0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
23d0: 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45  se SQLITE_CREATE
23e0: 5f 54 52 49 47 47 45 52 20 20 20 20 3a 20 7a 43  _TRIGGER    : zC
23f0: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41  ode="SQLITE_CREA
2400: 54 45 5f 54 52 49 47 47 45 52 22 3b 20 62 72 65  TE_TRIGGER"; bre
2410: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
2420: 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57 20  ITE_CREATE_VIEW 
2430: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
2440: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45  QLITE_CREATE_VIE
2450: 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  W"; break;.    c
2460: 61 73 65 20 53 51 4c 49 54 45 5f 44 45 4c 45 54  ase SQLITE_DELET
2470: 45 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a  E            : z
2480: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 45 4c  Code="SQLITE_DEL
2490: 45 54 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ETE"; break;.   
24a0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f   case SQLITE_DRO
24b0: 50 5f 49 4e 44 45 58 20 20 20 20 20 20 20 20 3a  P_INDEX        :
24c0: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44   zCode="SQLITE_D
24d0: 52 4f 50 5f 49 4e 44 45 58 22 3b 20 62 72 65 61  ROP_INDEX"; brea
24e0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
24f0: 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 20 20 20  TE_DROP_TABLE   
2500: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
2510: 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 22  LITE_DROP_TABLE"
2520: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
2530: 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  e SQLITE_DROP_TE
2540: 4d 50 5f 49 4e 44 45 58 20 20 20 3a 20 7a 43 6f  MP_INDEX   : zCo
2550: 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f  de="SQLITE_DROP_
2560: 54 45 4d 50 5f 49 4e 44 45 58 22 3b 20 62 72 65  TEMP_INDEX"; bre
2570: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
2580: 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41  ITE_DROP_TEMP_TA
2590: 42 4c 45 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53  BLE   : zCode="S
25a0: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
25b0: 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20  TABLE"; break;. 
25c0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
25d0: 52 4f 50 5f 54 45 4d 50 5f 54 52 49 47 47 45 52  ROP_TEMP_TRIGGER
25e0: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
25f0: 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 52 49 47 47  _DROP_TEMP_TRIGG
2600: 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  ER"; break;.    
2610: 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50  case SQLITE_DROP
2620: 5f 54 45 4d 50 5f 56 49 45 57 20 20 20 20 3a 20  _TEMP_VIEW    : 
2630: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52  zCode="SQLITE_DR
2640: 4f 50 5f 54 45 4d 50 5f 56 49 45 57 22 3b 20 62  OP_TEMP_VIEW"; b
2650: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
2660: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 52 49 47 47  QLITE_DROP_TRIGG
2670: 45 52 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d  ER      : zCode=
2680: 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 52 49  "SQLITE_DROP_TRI
2690: 47 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20  GGER"; break;.  
26a0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52    case SQLITE_DR
26b0: 4f 50 5f 56 49 45 57 20 20 20 20 20 20 20 20 20  OP_VIEW         
26c0: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
26d0: 44 52 4f 50 5f 56 49 45 57 22 3b 20 62 72 65 61  DROP_VIEW"; brea
26e0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
26f0: 54 45 5f 49 4e 53 45 52 54 20 20 20 20 20 20 20  TE_INSERT       
2700: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
2710: 4c 49 54 45 5f 49 4e 53 45 52 54 22 3b 20 62 72  LITE_INSERT"; br
2720: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
2730: 4c 49 54 45 5f 50 52 41 47 4d 41 20 20 20 20 20  LITE_PRAGMA     
2740: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
2750: 53 51 4c 49 54 45 5f 50 52 41 47 4d 41 22 3b 20  SQLITE_PRAGMA"; 
2760: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
2770: 53 51 4c 49 54 45 5f 52 45 41 44 20 20 20 20 20  SQLITE_READ     
2780: 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65           : zCode
2790: 3d 22 53 51 4c 49 54 45 5f 52 45 41 44 22 3b 20  ="SQLITE_READ"; 
27a0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
27b0: 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 20 20 20  SQLITE_SELECT   
27c0: 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65           : zCode
27d0: 3d 22 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 22  ="SQLITE_SELECT"
27e0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
27f0: 65 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43  e SQLITE_TRANSAC
2800: 54 49 4f 4e 20 20 20 20 20 20 20 3a 20 7a 43 6f  TION       : zCo
2810: 64 65 3d 22 53 51 4c 49 54 45 5f 54 52 41 4e 53  de="SQLITE_TRANS
2820: 41 43 54 49 4f 4e 22 3b 20 62 72 65 61 6b 3b 0a  ACTION"; break;.
2830: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
2840: 55 50 44 41 54 45 20 20 20 20 20 20 20 20 20 20  UPDATE          
2850: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
2860: 45 5f 55 50 44 41 54 45 22 3b 20 62 72 65 61 6b  E_UPDATE"; break
2870: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
2880: 45 5f 41 54 54 41 43 48 20 20 20 20 20 20 20 20  E_ATTACH        
2890: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
28a0: 49 54 45 5f 41 54 54 41 43 48 22 3b 20 62 72 65  ITE_ATTACH"; bre
28b0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
28c0: 49 54 45 5f 44 45 54 41 43 48 20 20 20 20 20 20  ITE_DETACH      
28d0: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
28e0: 51 4c 49 54 45 5f 44 45 54 41 43 48 22 3b 20 62  QLITE_DETACH"; b
28f0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
2900: 51 4c 49 54 45 5f 41 4c 54 45 52 5f 54 41 42 4c  QLITE_ALTER_TABL
2910: 45 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d  E       : zCode=
2920: 22 53 51 4c 49 54 45 5f 41 4c 54 45 52 5f 54 41  "SQLITE_ALTER_TA
2930: 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  BLE"; break;.   
2940: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 49   case SQLITE_REI
2950: 4e 44 45 58 20 20 20 20 20 20 20 20 20 20 20 3a  NDEX           :
2960: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 52   zCode="SQLITE_R
2970: 45 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a  EINDEX"; break;.
2980: 20 20 20 20 64 65 66 61 75 6c 74 20 20 20 20 20      default     
2990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a0: 20 20 3a 20 7a 43 6f 64 65 3d 22 3f 3f 3f 3f 22    : zCode="????"
29b0: 3b 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 54  ; break;.  }.  T
29c0: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
29d0: 73 74 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72  str);.  Tcl_DStr
29e0: 69 6e 67 41 70 70 65 6e 64 28 26 73 74 72 2c 20  ingAppend(&str, 
29f0: 70 44 62 2d 3e 7a 41 75 74 68 2c 20 2d 31 29 3b  pDb->zAuth, -1);
2a00: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70  .  Tcl_DStringAp
2a10: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72  pendElement(&str
2a20: 2c 20 7a 43 6f 64 65 29 3b 0a 20 20 54 63 6c 5f  , zCode);.  Tcl_
2a30: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65  DStringAppendEle
2a40: 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41 72 67 31  ment(&str, zArg1
2a50: 20 3f 20 7a 41 72 67 31 20 3a 20 22 22 29 3b 0a   ? zArg1 : "");.
2a60: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
2a70: 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c  endElement(&str,
2a80: 20 7a 41 72 67 32 20 3f 20 7a 41 72 67 32 20 3a   zArg2 ? zArg2 :
2a90: 20 22 22 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72   "");.  Tcl_DStr
2aa0: 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ingAppendElement
2ab0: 28 26 73 74 72 2c 20 7a 41 72 67 33 20 3f 20 7a  (&str, zArg3 ? z
2ac0: 41 72 67 33 20 3a 20 22 22 29 3b 0a 20 20 54 63  Arg3 : "");.  Tc
2ad0: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45  l_DStringAppendE
2ae0: 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41 72  lement(&str, zAr
2af0: 67 34 20 3f 20 7a 41 72 67 34 20 3a 20 22 22 29  g4 ? zArg4 : "")
2b00: 3b 0a 20 20 72 63 20 3d 20 54 63 6c 5f 47 6c 6f  ;.  rc = Tcl_Glo
2b10: 62 61 6c 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74  balEval(pDb->int
2b20: 65 72 70 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67  erp, Tcl_DString
2b30: 56 61 6c 75 65 28 26 73 74 72 29 29 3b 0a 20 20  Value(&str));.  
2b40: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
2b50: 26 73 74 72 29 3b 0a 20 20 7a 52 65 70 6c 79 20  &str);.  zReply 
2b60: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52  = Tcl_GetStringR
2b70: 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72  esult(pDb->inter
2b80: 70 29 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70  p);.  if( strcmp
2b90: 28 7a 52 65 70 6c 79 2c 22 53 51 4c 49 54 45 5f  (zReply,"SQLITE_
2ba0: 4f 4b 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  OK")==0 ){.    r
2bb0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2bc0: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
2bd0: 70 28 7a 52 65 70 6c 79 2c 22 53 51 4c 49 54 45  p(zReply,"SQLITE
2be0: 5f 44 45 4e 59 22 29 3d 3d 30 20 29 7b 0a 20 20  _DENY")==0 ){.  
2bf0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 45    rc = SQLITE_DE
2c00: 4e 59 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  NY;.  }else if( 
2c10: 73 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22 53  strcmp(zReply,"S
2c20: 51 4c 49 54 45 5f 49 47 4e 4f 52 45 22 29 3d 3d  QLITE_IGNORE")==
2c30: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
2c40: 4c 49 54 45 5f 49 47 4e 4f 52 45 3b 0a 20 20 7d  LITE_IGNORE;.  }
2c50: 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 39  else{.    rc = 9
2c60: 39 39 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  99;.  }.  return
2c70: 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
2c80: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2c90: 48 4f 52 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 2f  HORIZATION */../
2ca0: 2a 0a 2a 2a 20 7a 54 65 78 74 20 69 73 20 61 20  *.** zText is a 
2cb0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 65 78 74 20  pointer to text 
2cc0: 6f 62 74 61 69 6e 65 64 20 76 69 61 20 61 6e 20  obtained via an 
2cd0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
2ce0: 65 78 74 28 29 0a 2a 2a 20 6f 72 20 73 69 6d 69  ext().** or simi
2cf0: 6c 61 72 20 69 6e 74 65 72 66 61 63 65 2e 20 54  lar interface. T
2d00: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
2d10: 72 6e 73 20 61 20 54 63 6c 20 73 74 72 69 6e 67  rns a Tcl string
2d20: 20 6f 62 6a 65 63 74 2c 20 0a 2a 2a 20 72 65 66   object, .** ref
2d30: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 73 65 74  erence count set
2d40: 20 74 6f 20 30 2c 20 63 6f 6e 74 61 69 6e 69 6e   to 0, containin
2d50: 67 20 74 68 65 20 74 65 78 74 2e 20 49 66 20 61  g the text. If a
2d60: 20 74 72 61 6e 73 6c 61 74 69 6f 6e 0a 2a 2a 20   translation.** 
2d70: 62 65 74 77 65 65 6e 20 69 73 6f 38 38 35 39 20  between iso8859 
2d80: 61 6e 64 20 55 54 46 2d 38 20 69 73 20 72 65 71  and UTF-8 is req
2d90: 75 69 72 65 64 2c 20 69 74 20 69 73 20 70 72 65  uired, it is pre
2da0: 66 6f 72 6d 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  formed..*/.stati
2db0: 63 20 54 63 6c 5f 4f 62 6a 20 2a 64 62 54 65 78  c Tcl_Obj *dbTex
2dc0: 74 54 6f 4f 62 6a 28 63 68 61 72 20 63 6f 6e 73  tToObj(char cons
2dd0: 74 20 2a 7a 54 65 78 74 29 7b 0a 20 20 54 63 6c  t *zText){.  Tcl
2de0: 5f 4f 62 6a 20 2a 70 56 61 6c 3b 0a 23 69 66 64  _Obj *pVal;.#ifd
2df0: 65 66 20 55 54 46 5f 54 52 41 4e 53 4c 41 54 49  ef UTF_TRANSLATI
2e00: 4f 4e 5f 4e 45 45 44 45 44 0a 20 20 54 63 6c 5f  ON_NEEDED.  Tcl_
2e10: 44 53 74 72 69 6e 67 20 64 43 6f 6c 3b 0a 20 20  DString dCol;.  
2e20: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28  Tcl_DStringInit(
2e30: 26 64 43 6f 6c 29 3b 0a 20 20 54 63 6c 5f 45 78  &dCol);.  Tcl_Ex
2e40: 74 65 72 6e 61 6c 54 6f 55 74 66 44 53 74 72 69  ternalToUtfDStri
2e50: 6e 67 28 4e 55 4c 4c 2c 20 7a 54 65 78 74 2c 20  ng(NULL, zText, 
2e60: 2d 31 2c 20 26 64 43 6f 6c 29 3b 0a 20 20 70 56  -1, &dCol);.  pV
2e70: 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69  al = Tcl_NewStri
2e80: 6e 67 4f 62 6a 28 54 63 6c 5f 44 53 74 72 69 6e  ngObj(Tcl_DStrin
2e90: 67 56 61 6c 75 65 28 26 64 43 6f 6c 29 2c 20 2d  gValue(&dCol), -
2ea0: 31 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  1);.  Tcl_DStrin
2eb0: 67 46 72 65 65 28 26 64 43 6f 6c 29 3b 0a 23 65  gFree(&dCol);.#e
2ec0: 6c 73 65 0a 20 20 70 56 61 6c 20 3d 20 54 63 6c  lse.  pVal = Tcl
2ed0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54  _NewStringObj(zT
2ee0: 65 78 74 2c 20 2d 31 29 3b 0a 23 65 6e 64 69 66  ext, -1);.#endif
2ef0: 0a 20 20 72 65 74 75 72 6e 20 70 56 61 6c 3b 0a  .  return pVal;.
2f00: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
2f10: 75 74 69 6e 65 20 72 65 61 64 73 20 61 20 6c 69  utine reads a li
2f20: 6e 65 20 6f 66 20 74 65 78 74 20 66 72 6f 6d 20  ne of text from 
2f30: 46 49 4c 45 20 69 6e 2c 20 73 74 6f 72 65 73 0a  FILE in, stores.
2f40: 2a 2a 20 74 68 65 20 74 65 78 74 20 69 6e 20 6d  ** the text in m
2f50: 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
2f60: 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20 61 6e 64  rom malloc() and
2f70: 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74   returns a point
2f80: 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 74 65 78  er.** to the tex
2f90: 74 2e 20 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  t.  NULL is retu
2fa0: 72 6e 65 64 20 61 74 20 65 6e 64 20 6f 66 20 66  rned at end of f
2fb0: 69 6c 65 2c 20 6f 72 20 69 66 20 6d 61 6c 6c 6f  ile, or if mallo
2fc0: 63 28 29 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2a  c().** fails..**
2fd0: 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61 63  .** The interfac
2fe0: 65 20 69 73 20 6c 69 6b 65 20 22 72 65 61 64 6c  e is like "readl
2ff0: 69 6e 65 22 20 62 75 74 20 6e 6f 20 63 6f 6d 6d  ine" but no comm
3000: 61 6e 64 2d 6c 69 6e 65 20 65 64 69 74 69 6e 67  and-line editing
3010: 0a 2a 2a 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a  .** is done..**.
3020: 2a 2a 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 73  ** copied from s
3030: 68 65 6c 6c 2e 63 20 66 72 6f 6d 20 27 2e 69 6d  hell.c from '.im
3040: 70 6f 72 74 27 20 63 6f 6d 6d 61 6e 64 0a 2a 2f  port' command.*/
3050: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 6c 6f  .static char *lo
3060: 63 61 6c 5f 67 65 74 6c 69 6e 65 28 63 68 61 72  cal_getline(char
3070: 20 2a 7a 50 72 6f 6d 70 74 2c 20 46 49 4c 45 20   *zPrompt, FILE 
3080: 2a 69 6e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4c  *in){.  char *zL
3090: 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 4c 69 6e 65  ine;.  int nLine
30a0: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74  ;.  int n;.  int
30b0: 20 65 6f 6c 3b 0a 0a 20 20 6e 4c 69 6e 65 20 3d   eol;..  nLine =
30c0: 20 31 30 30 3b 0a 20 20 7a 4c 69 6e 65 20 3d 20   100;.  zLine = 
30d0: 6d 61 6c 6c 6f 63 28 20 6e 4c 69 6e 65 20 29 3b  malloc( nLine );
30e0: 0a 20 20 69 66 28 20 7a 4c 69 6e 65 3d 3d 30 20  .  if( zLine==0 
30f0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 20  ) return 0;.  n 
3100: 3d 20 30 3b 0a 20 20 65 6f 6c 20 3d 20 30 3b 0a  = 0;.  eol = 0;.
3110: 20 20 77 68 69 6c 65 28 20 21 65 6f 6c 20 29 7b    while( !eol ){
3120: 0a 20 20 20 20 69 66 28 20 6e 2b 31 30 30 3e 6e  .    if( n+100>n
3130: 4c 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 6e 4c  Line ){.      nL
3140: 69 6e 65 20 3d 20 6e 4c 69 6e 65 2a 32 20 2b 20  ine = nLine*2 + 
3150: 31 30 30 3b 0a 20 20 20 20 20 20 7a 4c 69 6e 65  100;.      zLine
3160: 20 3d 20 72 65 61 6c 6c 6f 63 28 7a 4c 69 6e 65   = realloc(zLine
3170: 2c 20 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20  , nLine);.      
3180: 69 66 28 20 7a 4c 69 6e 65 3d 3d 30 20 29 20 72  if( zLine==0 ) r
3190: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
31a0: 20 20 20 69 66 28 20 66 67 65 74 73 28 26 7a 4c     if( fgets(&zL
31b0: 69 6e 65 5b 6e 5d 2c 20 6e 4c 69 6e 65 20 2d 20  ine[n], nLine - 
31c0: 6e 2c 20 69 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  n, in)==0 ){.   
31d0: 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20     if( n==0 ){. 
31e0: 20 20 20 20 20 20 20 66 72 65 65 28 7a 4c 69 6e         free(zLin
31f0: 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  e);.        retu
3200: 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
3210: 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30      zLine[n] = 0
3220: 3b 0a 20 20 20 20 20 20 65 6f 6c 20 3d 20 31 3b  ;.      eol = 1;
3230: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3240: 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 7a    }.    while( z
3250: 4c 69 6e 65 5b 6e 5d 20 29 7b 20 6e 2b 2b 3b 20  Line[n] ){ n++; 
3260: 7d 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26  }.    if( n>0 &&
3270: 20 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 6e   zLine[n-1]=='\n
3280: 27 20 29 7b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a  ' ){.      n--;.
3290: 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d        zLine[n] =
32a0: 20 30 3b 0a 20 20 20 20 20 20 65 6f 6c 20 3d 20   0;.      eol = 
32b0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a  1;.    }.  }.  z
32c0: 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28 20  Line = realloc( 
32d0: 7a 4c 69 6e 65 2c 20 6e 2b 31 20 29 3b 0a 20 20  zLine, n+1 );.  
32e0: 72 65 74 75 72 6e 20 7a 4c 69 6e 65 3b 0a 7d 0a  return zLine;.}.
32f0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 22 73 71 6c 69  ./*.** The "sqli
3300: 74 65 22 20 63 6f 6d 6d 61 6e 64 20 62 65 6c 6f  te" command belo
3310: 77 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 20  w creates a new 
3320: 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 66 6f 72 20  Tcl command for 
3330: 65 61 63 68 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  each.** connecti
3340: 6f 6e 20 69 74 20 6f 70 65 6e 73 20 74 6f 20 61  on it opens to a
3350: 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  n SQLite databas
3360: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
3370: 20 69 73 20 69 6e 76 6f 6b 65 64 0a 2a 2a 20 77   is invoked.** w
3380: 68 65 6e 65 76 65 72 20 6f 6e 65 20 6f 66 20 74  henever one of t
3390: 68 6f 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2d  hose connection-
33a0: 73 70 65 63 69 66 69 63 20 63 6f 6d 6d 61 6e 64  specific command
33b0: 73 20 69 73 20 65 78 65 63 75 74 65 64 0a 2a 2a  s is executed.**
33c0: 20 69 6e 20 54 63 6c 2e 20 20 46 6f 72 20 65 78   in Tcl.  For ex
33d0: 61 6d 70 6c 65 2c 20 69 66 20 79 6f 75 20 72 75  ample, if you ru
33e0: 6e 20 54 63 6c 20 63 6f 64 65 20 6c 69 6b 65 20  n Tcl code like 
33f0: 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
3400: 20 20 73 71 6c 69 74 65 33 20 64 62 31 20 20 22    sqlite3 db1  "
3410: 6d 79 5f 64 61 74 61 62 61 73 65 22 0a 2a 2a 20  my_database".** 
3420: 20 20 20 20 20 20 64 62 31 20 63 6c 6f 73 65 0a        db1 close.
3430: 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
3440: 63 6f 6d 6d 61 6e 64 20 6f 70 65 6e 73 20 61 20  command opens a 
3450: 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68  connection to th
3460: 65 20 22 6d 79 5f 64 61 74 61 62 61 73 65 22 20  e "my_database" 
3470: 64 61 74 61 62 61 73 65 0a 2a 2a 20 61 6e 64 20  database.** and 
3480: 63 61 6c 6c 73 20 74 68 61 74 20 63 6f 6e 6e 65  calls that conne
3490: 63 74 69 6f 6e 20 22 64 62 31 22 2e 20 20 54 68  ction "db1".  Th
34a0: 65 20 73 65 63 6f 6e 64 20 63 6f 6d 6d 61 6e 64  e second command
34b0: 20 63 61 75 73 65 73 20 74 68 69 73 0a 2a 2a 20   causes this.** 
34c0: 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 62 65  subroutine to be
34d0: 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a 73 74 61   invoked..*/.sta
34e0: 74 69 63 20 69 6e 74 20 44 62 4f 62 6a 43 6d 64  tic int DbObjCmd
34f0: 28 76 6f 69 64 20 2a 63 64 2c 20 54 63 6c 5f 49  (void *cd, Tcl_I
3500: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
3510: 6e 74 20 6f 62 6a 63 2c 54 63 6c 5f 4f 62 6a 20  nt objc,Tcl_Obj 
3520: 2a 63 6f 6e 73 74 2a 6f 62 6a 76 29 7b 0a 20 20  *const*objv){.  
3530: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20  SqliteDb *pDb = 
3540: 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20  (SqliteDb*)cd;. 
3550: 20 69 6e 74 20 63 68 6f 69 63 65 3b 0a 20 20 69   int choice;.  i
3560: 6e 74 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a  nt rc = TCL_OK;.
3570: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
3580: 68 61 72 20 2a 44 42 5f 73 74 72 73 5b 5d 20 3d  har *DB_strs[] =
3590: 20 7b 0a 20 20 20 20 22 61 75 74 68 6f 72 69 7a   {.    "authoriz
35a0: 65 72 22 2c 20 20 20 20 20 20 20 20 20 22 62 75  er",         "bu
35b0: 73 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  sy",            
35c0: 20 20 22 63 61 63 68 65 22 2c 0a 20 20 20 20 22    "cache",.    "
35d0: 63 68 61 6e 67 65 73 22 2c 20 20 20 20 20 20 20  changes",       
35e0: 20 20 20 20 20 22 63 6c 6f 73 65 22 2c 20 20 20       "close",   
35f0: 20 20 20 20 20 20 20 20 20 20 22 63 6f 6c 6c 61            "colla
3600: 74 65 22 2c 0a 20 20 20 20 22 63 6f 6c 6c 61 74  te",.    "collat
3610: 69 6f 6e 5f 6e 65 65 64 65 64 22 2c 20 20 20 22  ion_needed",   "
3620: 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 22 2c 20 20 20  commit_hook",   
3630: 20 20 20 20 22 63 6f 6d 70 6c 65 74 65 22 2c 0a      "complete",.
3640: 20 20 20 20 22 63 6f 70 79 22 2c 20 20 20 20 20      "copy",     
3650: 20 20 20 20 20 20 20 20 20 20 22 65 72 72 6f 72            "error
3660: 63 6f 64 65 22 2c 20 20 20 20 20 20 20 20 20 22  code",         "
3670: 65 76 61 6c 22 2c 0a 20 20 20 20 22 66 75 6e 63  eval",.    "func
3680: 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 20 20 20  tion",          
3690: 20 22 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f   "last_insert_ro
36a0: 77 69 64 22 2c 20 22 6e 75 6c 6c 76 61 6c 75 65  wid", "nullvalue
36b0: 22 2c 0a 20 20 20 20 22 6f 6e 65 63 6f 6c 75 6d  ",.    "onecolum
36c0: 6e 22 2c 20 20 20 20 20 20 20 20 20 20 22 70 72  n",          "pr
36d0: 6f 67 72 65 73 73 22 2c 20 20 20 20 20 20 20 20  ogress",        
36e0: 20 20 22 72 65 6b 65 79 22 2c 0a 20 20 20 20 22    "rekey",.    "
36f0: 74 69 6d 65 6f 75 74 22 2c 20 20 20 20 20 20 20  timeout",       
3700: 20 20 20 20 20 22 74 6f 74 61 6c 5f 63 68 61 6e       "total_chan
3710: 67 65 73 22 2c 20 20 20 20 20 22 74 72 61 63 65  ges",     "trace
3720: 22 2c 0a 20 20 20 20 22 76 65 72 73 69 6f 6e 22  ",.    "version"
3730: 2c 0a 20 20 20 20 30 20 20 20 20 20 20 20 20 20  ,.    0         
3740: 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 7d 3b             .  };
3750: 0a 20 20 65 6e 75 6d 20 44 42 5f 65 6e 75 6d 20  .  enum DB_enum 
3760: 7b 0a 20 20 20 20 44 42 5f 41 55 54 48 4f 52 49  {.    DB_AUTHORI
3770: 5a 45 52 2c 20 20 20 20 20 20 20 20 44 42 5f 42  ZER,        DB_B
3780: 55 53 59 2c 20 20 20 20 20 20 20 20 20 20 20 20  USY,            
3790: 20 44 42 5f 43 41 43 48 45 2c 0a 20 20 20 20 44   DB_CACHE,.    D
37a0: 42 5f 43 48 41 4e 47 45 53 2c 20 20 20 20 20 20  B_CHANGES,      
37b0: 20 20 20 20 20 44 42 5f 43 4c 4f 53 45 2c 20 20       DB_CLOSE,  
37c0: 20 20 20 20 20 20 20 20 20 20 44 42 5f 43 4f 4c            DB_COL
37d0: 4c 41 54 45 2c 0a 20 20 20 20 44 42 5f 43 4f 4c  LATE,.    DB_COL
37e0: 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 2c 20 20  LATION_NEEDED,  
37f0: 44 42 5f 43 4f 4d 4d 49 54 5f 48 4f 4f 4b 2c 20  DB_COMMIT_HOOK, 
3800: 20 20 20 20 20 44 42 5f 43 4f 4d 50 4c 45 54 45       DB_COMPLETE
3810: 2c 0a 20 20 20 20 44 42 5f 43 4f 50 59 2c 20 20  ,.    DB_COPY,  
3820: 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 45              DB_E
3830: 52 52 4f 52 43 4f 44 45 2c 20 20 20 20 20 20 20  RRORCODE,       
3840: 20 44 42 5f 45 56 41 4c 2c 0a 20 20 20 20 44 42   DB_EVAL,.    DB
3850: 5f 46 55 4e 43 54 49 4f 4e 2c 20 20 20 20 20 20  _FUNCTION,      
3860: 20 20 20 20 44 42 5f 4c 41 53 54 5f 49 4e 53 45      DB_LAST_INSE
3870: 52 54 5f 52 4f 57 49 44 2c 44 42 5f 4e 55 4c 4c  RT_ROWID,DB_NULL
3880: 56 41 4c 55 45 2c 0a 20 20 20 20 44 42 5f 4f 4e  VALUE,.    DB_ON
3890: 45 43 4f 4c 55 4d 4e 2c 20 20 20 20 20 20 20 20  ECOLUMN,        
38a0: 20 44 42 5f 50 52 4f 47 52 45 53 53 2c 20 20 20   DB_PROGRESS,   
38b0: 20 20 20 20 20 20 44 42 5f 52 45 4b 45 59 2c 0a        DB_REKEY,.
38c0: 20 20 20 20 44 42 5f 54 49 4d 45 4f 55 54 2c 20      DB_TIMEOUT, 
38d0: 20 20 20 20 20 20 20 20 20 20 44 42 5f 54 4f 54            DB_TOT
38e0: 41 4c 5f 43 48 41 4e 47 45 53 2c 20 20 20 20 44  AL_CHANGES,    D
38f0: 42 5f 54 52 41 43 45 2c 0a 20 20 20 20 44 42 5f  B_TRACE,.    DB_
3900: 56 45 52 53 49 4f 4e 0a 20 20 7d 3b 0a 20 20 2f  VERSION.  };.  /
3910: 2a 20 64 6f 6e 27 74 20 6c 65 61 76 65 20 74 72  * don't leave tr
3920: 61 69 6c 69 6e 67 20 63 6f 6d 6d 61 73 20 6f 6e  ailing commas on
3930: 20 44 42 5f 65 6e 75 6d 2c 20 69 74 20 63 6f 6e   DB_enum, it con
3940: 66 75 73 65 73 20 74 68 65 20 41 49 58 20 78 6c  fuses the AIX xl
3950: 63 20 63 6f 6d 70 69 6c 65 72 20 2a 2f 0a 0a 20  c compiler */.. 
3960: 20 69 66 28 20 6f 62 6a 63 3c 32 20 29 7b 0a 20   if( objc<2 ){. 
3970: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
3980: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
3990: 62 6a 76 2c 20 22 53 55 42 43 4f 4d 4d 41 4e 44  bjv, "SUBCOMMAND
39a0: 20 2e 2e 2e 22 29 3b 0a 20 20 20 20 72 65 74 75   ...");.    retu
39b0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
39c0: 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  }.  if( Tcl_GetI
39d0: 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  ndexFromObj(inte
39e0: 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 44 42 5f  rp, objv[1], DB_
39f0: 73 74 72 73 2c 20 22 6f 70 74 69 6f 6e 22 2c 20  strs, "option", 
3a00: 30 2c 20 26 63 68 6f 69 63 65 29 20 29 7b 0a 20  0, &choice) ){. 
3a10: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
3a20: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74  ROR;.  }..  swit
3a30: 63 68 28 20 28 65 6e 75 6d 20 44 42 5f 65 6e 75  ch( (enum DB_enu
3a40: 6d 29 63 68 6f 69 63 65 20 29 7b 0a 0a 20 20 2f  m)choice ){..  /
3a50: 2a 20 20 20 20 24 64 62 20 61 75 74 68 6f 72 69  *    $db authori
3a60: 7a 65 72 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20  zer ?CALLBACK?. 
3a70: 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20   **.  ** Invoke 
3a80: 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62 61  the given callba
3a90: 63 6b 20 74 6f 20 61 75 74 68 6f 72 69 7a 65 20  ck to authorize 
3aa0: 65 61 63 68 20 53 51 4c 20 6f 70 65 72 61 74 69  each SQL operati
3ab0: 6f 6e 20 61 73 20 69 74 20 69 73 0a 20 20 2a 2a  on as it is.  **
3ac0: 20 63 6f 6d 70 69 6c 65 64 2e 20 20 35 20 61 72   compiled.  5 ar
3ad0: 67 75 6d 65 6e 74 73 20 61 72 65 20 61 70 70 65  guments are appe
3ae0: 6e 64 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  nded to the call
3af0: 62 61 63 6b 20 62 65 66 6f 72 65 20 69 74 20 69  back before it i
3b00: 73 0a 20 20 2a 2a 20 69 6e 76 6f 6b 65 64 3a 0a  s.  ** invoked:.
3b10: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 31 29 20    **.  **   (1) 
3b20: 54 68 65 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  The authorizatio
3b30: 6e 20 74 79 70 65 20 28 65 78 3a 20 53 51 4c 49  n type (ex: SQLI
3b40: 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 2c  TE_CREATE_TABLE,
3b50: 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20   SQLITE_INSERT, 
3b60: 2e 2e 2e 29 0a 20 20 2a 2a 20 20 20 28 32 29 20  ...).  **   (2) 
3b70: 46 69 72 73 74 20 64 65 73 63 72 69 70 74 69 76  First descriptiv
3b80: 65 20 6e 61 6d 65 20 28 64 65 70 65 6e 64 73 20  e name (depends 
3b90: 6f 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  on authorization
3ba0: 20 74 79 70 65 29 0a 20 20 2a 2a 20 20 20 28 33   type).  **   (3
3bb0: 29 20 53 65 63 6f 6e 64 20 64 65 73 63 72 69 70  ) Second descrip
3bc0: 74 69 76 65 20 6e 61 6d 65 0a 20 20 2a 2a 20 20  tive name.  **  
3bd0: 20 28 34 29 20 4e 61 6d 65 20 6f 66 20 74 68 65   (4) Name of the
3be0: 20 64 61 74 61 62 61 73 65 20 28 65 78 3a 20 22   database (ex: "
3bf0: 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 29 0a 20  main", "temp"). 
3c00: 20 2a 2a 20 20 20 28 35 29 20 4e 61 6d 65 20 6f   **   (5) Name o
3c10: 66 20 74 72 69 67 67 65 72 20 74 68 61 74 20 69  f trigger that i
3c20: 73 20 64 6f 69 6e 67 20 74 68 65 20 61 63 63 65  s doing the acce
3c30: 73 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  ss.  **.  ** The
3c40: 20 63 61 6c 6c 62 61 63 6b 20 73 68 6f 75 6c 64   callback should
3c50: 20 72 65 74 75 72 6e 20 6f 6e 20 6f 66 20 74 68   return on of th
3c60: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 69  e following stri
3c70: 6e 67 73 3a 20 53 51 4c 49 54 45 5f 4f 4b 2c 0a  ngs: SQLITE_OK,.
3c80: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f    ** SQLITE_IGNO
3c90: 52 45 2c 20 6f 72 20 53 51 4c 49 54 45 5f 44 45  RE, or SQLITE_DE
3ca0: 4e 59 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72  NY.  Any other r
3cb0: 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61  eturn value is a
3cc0: 6e 20 65 72 72 6f 72 2e 0a 20 20 2a 2a 0a 20 20  n error..  **.  
3cd0: 2a 2a 20 49 66 20 74 68 69 73 20 6d 65 74 68 6f  ** If this metho
3ce0: 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 77 69 74  d is invoked wit
3cf0: 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 2c 20  h no arguments, 
3d00: 74 68 65 20 63 75 72 72 65 6e 74 20 61 75 74 68  the current auth
3d10: 6f 72 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 63  orization.  ** c
3d20: 61 6c 6c 62 61 63 6b 20 73 74 72 69 6e 67 20 69  allback string i
3d30: 73 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2f  s returned..  */
3d40: 0a 20 20 63 61 73 65 20 44 42 5f 41 55 54 48 4f  .  case DB_AUTHO
3d50: 52 49 5a 45 52 3a 20 7b 0a 23 69 66 64 65 66 20  RIZER: {.#ifdef 
3d60: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
3d70: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 54 63  ORIZATION.    Tc
3d80: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
3d90: 6e 74 65 72 70 2c 20 22 61 75 74 68 6f 72 69 7a  nterp, "authoriz
3da0: 61 74 69 6f 6e 20 6e 6f 74 20 61 76 61 69 6c 61  ation not availa
3db0: 62 6c 65 20 69 6e 20 74 68 69 73 20 62 75 69 6c  ble in this buil
3dc0: 64 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  d", 0);.    retu
3dd0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65  rn TCL_ERROR;.#e
3de0: 6c 73 65 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  lse.    if( objc
3df0: 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  >3 ){.      Tcl_
3e00: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
3e10: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f  erp, 2, objv, "?
3e20: 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20  CALLBACK?");.   
3e30: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
3e40: 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ROR;.    }else i
3e50: 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20  f( objc==2 ){.  
3e60: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75      if( pDb->zAu
3e70: 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  th ){.        Tc
3e80: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
3e90: 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 41 75 74  nterp, pDb->zAut
3ea0: 68 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  h, 0);.      }. 
3eb0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3ec0: 63 68 61 72 20 2a 7a 41 75 74 68 3b 0a 20 20 20  char *zAuth;.   
3ed0: 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
3ee0: 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74 68    if( pDb->zAuth
3ef0: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
3f00: 46 72 65 65 28 70 44 62 2d 3e 7a 41 75 74 68 29  Free(pDb->zAuth)
3f10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3f20: 7a 41 75 74 68 20 3d 20 54 63 6c 5f 47 65 74 53  zAuth = Tcl_GetS
3f30: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
3f40: 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20  v[2], &len);.   
3f50: 20 20 20 69 66 28 20 7a 41 75 74 68 20 26 26 20     if( zAuth && 
3f60: 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  len>0 ){.       
3f70: 20 70 44 62 2d 3e 7a 41 75 74 68 20 3d 20 54 63   pDb->zAuth = Tc
3f80: 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31  l_Alloc( len + 1
3f90: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 74 72 63   );.        strc
3fa0: 70 79 28 70 44 62 2d 3e 7a 41 75 74 68 2c 20 7a  py(pDb->zAuth, z
3fb0: 41 75 74 68 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Auth);.      }el
3fc0: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d  se{.        pDb-
3fd0: 3e 7a 41 75 74 68 20 3d 20 30 3b 0a 20 20 20 20  >zAuth = 0;.    
3fe0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44    }.      if( pD
3ff0: 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20  b->zAuth ){.    
4000: 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20      pDb->interp 
4010: 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20  = interp;.      
4020: 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75    sqlite3_set_au
4030: 74 68 6f 72 69 7a 65 72 28 70 44 62 2d 3e 64 62  thorizer(pDb->db
4040: 2c 20 61 75 74 68 5f 63 61 6c 6c 62 61 63 6b 2c  , auth_callback,
4050: 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c   pDb);.      }el
4060: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
4070: 74 65 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a  te3_set_authoriz
4080: 65 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30  er(pDb->db, 0, 0
4090: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
40a0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61  .#endif.    brea
40b0: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20  k;.  }..  /*    
40c0: 24 64 62 20 62 75 73 79 20 3f 43 41 4c 4c 42 41  $db busy ?CALLBA
40d0: 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e  CK?.  **.  ** In
40e0: 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63  voke the given c
40f0: 61 6c 6c 62 61 63 6b 20 69 66 20 61 6e 20 53 51  allback if an SQ
4100: 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 74 74 65  L statement atte
4110: 6d 70 74 73 20 74 6f 20 6f 70 65 6e 0a 20 20 2a  mpts to open.  *
4120: 2a 20 61 20 6c 6f 63 6b 65 64 20 64 61 74 61 62  * a locked datab
4130: 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  ase file..  */. 
4140: 20 63 61 73 65 20 44 42 5f 42 55 53 59 3a 20 7b   case DB_BUSY: {
4150: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20  .    if( objc>3 
4160: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
4170: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
4180: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 43 41 4c 4c  , 2, objv, "CALL
4190: 42 41 43 4b 22 29 3b 0a 20 20 20 20 20 20 72 65  BACK");.      re
41a0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
41b0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62      }else if( ob
41c0: 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69  jc==2 ){.      i
41d0: 66 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b  f( pDb->zBusy ){
41e0: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70  .        Tcl_App
41f0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
4200: 2c 20 70 44 62 2d 3e 7a 42 75 73 79 2c 20 30 29  , pDb->zBusy, 0)
4210: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
4220: 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20  lse{.      char 
4230: 2a 7a 42 75 73 79 3b 0a 20 20 20 20 20 20 69 6e  *zBusy;.      in
4240: 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28  t len;.      if(
4250: 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20   pDb->zBusy ){. 
4260: 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28         Tcl_Free(
4270: 70 44 62 2d 3e 7a 42 75 73 79 29 3b 0a 20 20 20  pDb->zBusy);.   
4280: 20 20 20 7d 0a 20 20 20 20 20 20 7a 42 75 73 79     }.      zBusy
4290: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
42a0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
42b0: 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66   &len);.      if
42c0: 28 20 7a 42 75 73 79 20 26 26 20 6c 65 6e 3e 30  ( zBusy && len>0
42d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
42e0: 3e 7a 42 75 73 79 20 3d 20 54 63 6c 5f 41 6c 6c  >zBusy = Tcl_All
42f0: 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20  oc( len + 1 );. 
4300: 20 20 20 20 20 20 20 73 74 72 63 70 79 28 70 44         strcpy(pD
4310: 62 2d 3e 7a 42 75 73 79 2c 20 7a 42 75 73 79 29  b->zBusy, zBusy)
4320: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
4330: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 42 75 73         pDb->zBus
4340: 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  y = 0;.      }. 
4350: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 42       if( pDb->zB
4360: 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70  usy ){.        p
4370: 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74  Db->interp = int
4380: 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  erp;.        sql
4390: 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65  ite3_busy_handle
43a0: 72 28 70 44 62 2d 3e 64 62 2c 20 44 62 42 75 73  r(pDb->db, DbBus
43b0: 79 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a  yHandler, pDb);.
43c0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
43d0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73       sqlite3_bus
43e0: 79 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64  y_handler(pDb->d
43f0: 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  b, 0, 0);.      
4400: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  }.    }.    brea
4410: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20  k;.  }..  /*    
4420: 20 24 64 62 20 63 61 63 68 65 20 66 6c 75 73 68   $db cache flush
4430: 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 63 61  .  **     $db ca
4440: 63 68 65 20 73 69 7a 65 20 6e 0a 20 20 2a 2a 0a  che size n.  **.
4450: 20 20 2a 2a 20 46 6c 75 73 68 20 74 68 65 20 70    ** Flush the p
4460: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
4470: 74 20 63 61 63 68 65 2c 20 6f 72 20 73 65 74 20  t cache, or set 
4480: 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  the maximum numb
4490: 65 72 20 6f 66 0a 20 20 2a 2a 20 63 61 63 68 65  er of.  ** cache
44a0: 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20  d statements..  
44b0: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 41 43  */.  case DB_CAC
44c0: 48 45 3a 20 7b 0a 20 20 20 20 63 68 61 72 20 2a  HE: {.    char *
44d0: 73 75 62 43 6d 64 3b 0a 20 20 20 20 69 6e 74 20  subCmd;.    int 
44e0: 6e 3b 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  n;..    if( objc
44f0: 3c 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  <=2 ){.      Tcl
4500: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
4510: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
4520: 63 61 63 68 65 20 6f 70 74 69 6f 6e 20 3f 61 72  cache option ?ar
4530: 67 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  g?");.      retu
4540: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
4550: 20 20 7d 0a 20 20 20 20 73 75 62 43 6d 64 20 3d    }.    subCmd =
4560: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
4570: 6f 6d 4f 62 6a 28 20 6f 62 6a 76 5b 32 5d 2c 20  omObj( objv[2], 
4580: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 2a 73 75  0 );.    if( *su
4590: 62 43 6d 64 3d 3d 27 66 27 20 26 26 20 73 74 72  bCmd=='f' && str
45a0: 63 6d 70 28 73 75 62 43 6d 64 2c 22 66 6c 75 73  cmp(subCmd,"flus
45b0: 68 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  h")==0 ){.      
45c0: 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
45d0: 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67         Tcl_Wrong
45e0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
45f0: 32 2c 20 6f 62 6a 76 2c 20 22 66 6c 75 73 68 22  2, objv, "flush"
4600: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
4610: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
4620: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4630: 20 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65    flushStmtCache
4640: 28 20 70 44 62 20 29 3b 0a 20 20 20 20 20 20 7d  ( pDb );.      }
4650: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 2a  .    }else if( *
4660: 73 75 62 43 6d 64 3d 3d 27 73 27 20 26 26 20 73  subCmd=='s' && s
4670: 74 72 63 6d 70 28 73 75 62 43 6d 64 2c 22 73 69  trcmp(subCmd,"si
4680: 7a 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ze")==0 ){.     
4690: 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a   if( objc!=4 ){.
46a0: 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e          Tcl_Wron
46b0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
46c0: 20 32 2c 20 6f 62 6a 76 2c 20 22 73 69 7a 65 20   2, objv, "size 
46d0: 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  n");.        ret
46e0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
46f0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
4700: 20 20 20 20 69 66 28 20 54 43 4c 5f 45 52 52 4f      if( TCL_ERRO
4710: 52 3d 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  R==Tcl_GetIntFro
4720: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
4730: 76 5b 33 5d 2c 20 26 6e 29 20 29 7b 0a 20 20 20  v[3], &n) ){.   
4740: 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
4750: 64 52 65 73 75 6c 74 28 20 69 6e 74 65 72 70 2c  dResult( interp,
4760: 20 22 63 61 6e 6e 6f 74 20 63 6f 6e 76 65 72 74   "cannot convert
4770: 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 20 20   \"", .         
4780: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
4790: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
47a0: 33 5d 2c 30 29 2c 20 22 5c 22 20 74 6f 20 69 6e  3],0), "\" to in
47b0: 74 65 67 65 72 22 2c 20 30 29 3b 0a 20 20 20 20  teger", 0);.    
47c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
47d0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
47e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
47f0: 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20   if( n<0 ){.    
4800: 20 20 20 20 20 20 20 20 66 6c 75 73 68 53 74 6d          flushStm
4810: 74 43 61 63 68 65 28 20 70 44 62 20 29 3b 0a 20  tCache( pDb );. 
4820: 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 30             n = 0
4830: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
4840: 65 20 69 66 28 20 6e 3e 4d 41 58 5f 50 52 45 50  e if( n>MAX_PREP
4850: 41 52 45 44 5f 53 54 4d 54 53 20 29 7b 0a 20 20  ARED_STMTS ){.  
4860: 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 4d 41            n = MA
4870: 58 5f 50 52 45 50 41 52 45 44 5f 53 54 4d 54 53  X_PREPARED_STMTS
4880: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
4890: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 6d 61 78          pDb->max
48a0: 53 74 6d 74 20 3d 20 6e 3b 0a 20 20 20 20 20 20  Stmt = n;.      
48b0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
48c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c  }else{.      Tcl
48d0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 20 69  _AppendResult( i
48e0: 6e 74 65 72 70 2c 20 22 62 61 64 20 6f 70 74 69  nterp, "bad opti
48f0: 6f 6e 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  on \"", .       
4900: 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
4910: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
4920: 30 29 2c 20 22 5c 22 3a 20 6d 75 73 74 20 62 65  0), "\": must be
4930: 20 66 6c 75 73 68 20 6f 72 20 73 69 7a 65 22 2c   flush or size",
4940: 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   0);.      retur
4950: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
4960: 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
4970: 7d 0a 0a 20 20 2f 2a 20 20 20 20 20 24 64 62 20  }..  /*     $db 
4980: 63 68 61 6e 67 65 73 0a 20 20 2a 2a 0a 20 20 2a  changes.  **.  *
4990: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
49a0: 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74  ber of rows that
49b0: 20 77 65 72 65 20 6d 6f 64 69 66 69 65 64 2c 20   were modified, 
49c0: 69 6e 73 65 72 74 65 64 2c 20 6f 72 20 64 65 6c  inserted, or del
49d0: 65 74 65 64 20 62 79 0a 20 20 2a 2a 20 74 68 65  eted by.  ** the
49e0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 49 4e 53   most recent INS
49f0: 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44  ERT, UPDATE or D
4a00: 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2c  ELETE statement,
4a10: 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67 20 0a   not including .
4a20: 20 20 2a 2a 20 61 6e 79 20 63 68 61 6e 67 65 73    ** any changes
4a30: 20 6d 61 64 65 20 62 79 20 74 72 69 67 67 65 72   made by trigger
4a40: 20 70 72 6f 67 72 61 6d 73 2e 0a 20 20 2a 2f 0a   programs..  */.
4a50: 20 20 63 61 73 65 20 44 42 5f 43 48 41 4e 47 45    case DB_CHANGE
4a60: 53 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  S: {.    Tcl_Obj
4a70: 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20 20 69   *pResult;.    i
4a80: 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
4a90: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
4aa0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
4ab0: 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 20  objv, "");.     
4ac0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
4ad0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 52 65  R;.    }.    pRe
4ae0: 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62  sult = Tcl_GetOb
4af0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  jResult(interp);
4b00: 0a 20 20 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f  .    Tcl_SetIntO
4b10: 62 6a 28 70 52 65 73 75 6c 74 2c 20 73 71 6c 69  bj(pResult, sqli
4b20: 74 65 33 5f 63 68 61 6e 67 65 73 28 70 44 62 2d  te3_changes(pDb-
4b30: 3e 64 62 29 29 3b 0a 20 20 20 20 62 72 65 61 6b  >db));.    break
4b40: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24  ;.  }..  /*    $
4b50: 64 62 20 63 6c 6f 73 65 0a 20 20 2a 2a 0a 20 20  db close.  **.  
4b60: 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20  ** Shutdown the 
4b70: 64 61 74 61 62 61 73 65 0a 20 20 2a 2f 0a 20 20  database.  */.  
4b80: 63 61 73 65 20 44 42 5f 43 4c 4f 53 45 3a 20 7b  case DB_CLOSE: {
4b90: 0a 20 20 20 20 54 63 6c 5f 44 65 6c 65 74 65 43  .    Tcl_DeleteC
4ba0: 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 54  ommand(interp, T
4bb0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
4bc0: 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 29  Obj(objv[0], 0))
4bd0: 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
4be0: 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 63 6f  ..  /*    $db co
4bf0: 6d 6d 69 74 5f 68 6f 6f 6b 20 3f 43 41 4c 4c 42  mmit_hook ?CALLB
4c00: 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ACK?.  **.  ** I
4c10: 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20  nvoke the given 
4c20: 63 61 6c 6c 62 61 63 6b 20 6a 75 73 74 20 62 65  callback just be
4c30: 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20  fore committing 
4c40: 65 76 65 72 79 20 53 51 4c 20 74 72 61 6e 73 61  every SQL transa
4c50: 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 49 66 20 74  ction..  ** If t
4c60: 68 65 20 63 61 6c 6c 62 61 63 6b 20 74 68 72 6f  he callback thro
4c70: 77 73 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20  ws an exception 
4c80: 6f 72 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a  or returns non-z
4c90: 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 20 20  ero, then the.  
4ca0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
4cb0: 73 20 61 62 6f 72 74 65 64 2e 20 20 49 66 20 43  s aborted.  If C
4cc0: 41 4c 4c 42 41 43 4b 20 69 73 20 61 6e 20 65 6d  ALLBACK is an em
4cd0: 70 74 79 20 73 74 72 69 6e 67 2c 20 74 68 65 20  pty string, the 
4ce0: 63 61 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 69 73  callback.  ** is
4cf0: 20 64 69 73 61 62 6c 65 64 2e 0a 20 20 2a 2f 0a   disabled..  */.
4d00: 20 20 63 61 73 65 20 44 42 5f 43 4f 4d 4d 49 54    case DB_COMMIT
4d10: 5f 48 4f 4f 4b 3a 20 7b 0a 20 20 20 20 69 66 28  _HOOK: {.    if(
4d20: 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20   objc>3 ){.     
4d30: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
4d40: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
4d50: 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29  v, "?CALLBACK?")
4d60: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
4d70: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65  CL_ERROR;.    }e
4d80: 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20  lse if( objc==2 
4d90: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  ){.      if( pDb
4da0: 2d 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20  ->zCommit ){.   
4db0: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
4dc0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44  esult(interp, pD
4dd0: 62 2d 3e 7a 43 6f 6d 6d 69 74 2c 20 30 29 3b 0a  b->zCommit, 0);.
4de0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
4df0: 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  e{.      char *z
4e00: 43 6f 6d 6d 69 74 3b 0a 20 20 20 20 20 20 69 6e  Commit;.      in
4e10: 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28  t len;.      if(
4e20: 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 29 7b   pDb->zCommit ){
4e30: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65  .        Tcl_Fre
4e40: 65 28 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 29 3b  e(pDb->zCommit);
4e50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
4e60: 43 6f 6d 6d 69 74 20 3d 20 54 63 6c 5f 47 65 74  Commit = Tcl_Get
4e70: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
4e80: 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20  jv[2], &len);.  
4e90: 20 20 20 20 69 66 28 20 7a 43 6f 6d 6d 69 74 20      if( zCommit 
4ea0: 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20  && len>0 ){.    
4eb0: 20 20 20 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74      pDb->zCommit
4ec0: 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65   = Tcl_Alloc( le
4ed0: 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20  n + 1 );.       
4ee0: 20 73 74 72 63 70 79 28 70 44 62 2d 3e 7a 43 6f   strcpy(pDb->zCo
4ef0: 6d 6d 69 74 2c 20 7a 43 6f 6d 6d 69 74 29 3b 0a  mmit, zCommit);.
4f00: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4f10: 20 20 20 20 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69       pDb->zCommi
4f20: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 0;.      }. 
4f30: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 43       if( pDb->zC
4f40: 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  ommit ){.       
4f50: 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69   pDb->interp = i
4f60: 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73  nterp;.        s
4f70: 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f  qlite3_commit_ho
4f80: 6f 6b 28 70 44 62 2d 3e 64 62 2c 20 44 62 43 6f  ok(pDb->db, DbCo
4f90: 6d 6d 69 74 48 61 6e 64 6c 65 72 2c 20 70 44 62  mmitHandler, pDb
4fa0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
4fb0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
4fc0: 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 70 44 62 2d  commit_hook(pDb-
4fd0: 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  >db, 0, 0);.    
4fe0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72    }.    }.    br
4ff0: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
5000: 20 2a 2a 20 20 20 20 20 24 64 62 20 63 6f 6c 6c   **     $db coll
5010: 61 74 65 20 4e 41 4d 45 20 53 43 52 49 50 54 0a  ate NAME SCRIPT.
5020: 20 20 2a 2a 0a 20 20 2a 2a 20 43 72 65 61 74 65    **.  ** Create
5030: 20 61 20 6e 65 77 20 53 51 4c 20 63 6f 6c 6c 61   a new SQL colla
5040: 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 63 61  tion function ca
5050: 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 57 68 65 6e  lled NAME.  When
5060: 65 76 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 66  ever.  ** that f
5070: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
5080: 64 2c 20 69 6e 76 6f 6b 65 20 53 43 52 49 50 54  d, invoke SCRIPT
5090: 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65   to evaluate the
50a0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a   function..  */.
50b0: 20 20 63 61 73 65 20 44 42 5f 43 4f 4c 4c 41 54    case DB_COLLAT
50c0: 45 3a 20 7b 0a 20 20 20 20 53 71 6c 43 6f 6c 6c  E: {.    SqlColl
50d0: 61 74 65 20 2a 70 43 6f 6c 6c 61 74 65 3b 0a 20  ate *pCollate;. 
50e0: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a     char *zName;.
50f0: 20 20 20 20 63 68 61 72 20 2a 7a 53 63 72 69 70      char *zScrip
5100: 74 3b 0a 20 20 20 20 69 6e 74 20 6e 53 63 72 69  t;.    int nScri
5110: 70 74 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  pt;.    if( objc
5120: 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=4 ){.      Tcl
5130: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
5140: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
5150: 4e 41 4d 45 20 53 43 52 49 50 54 22 29 3b 0a 20  NAME SCRIPT");. 
5160: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
5170: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
5180: 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74   zName = Tcl_Get
5190: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
51a0: 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20 7a  jv[2], 0);.    z
51b0: 53 63 72 69 70 74 20 3d 20 54 63 6c 5f 47 65 74  Script = Tcl_Get
51c0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
51d0: 6a 76 5b 33 5d 2c 20 26 6e 53 63 72 69 70 74 29  jv[3], &nScript)
51e0: 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65 20 3d  ;.    pCollate =
51f0: 20 28 53 71 6c 43 6f 6c 6c 61 74 65 2a 29 54 63   (SqlCollate*)Tc
5200: 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  l_Alloc( sizeof(
5210: 2a 70 43 6f 6c 6c 61 74 65 29 20 2b 20 6e 53 63  *pCollate) + nSc
5220: 72 69 70 74 20 2b 20 31 20 29 3b 0a 20 20 20 20  ript + 1 );.    
5230: 69 66 28 20 70 43 6f 6c 6c 61 74 65 3d 3d 30 20  if( pCollate==0 
5240: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
5250: 4f 52 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65  OR;.    pCollate
5260: 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72  ->interp = inter
5270: 70 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65 2d  p;.    pCollate-
5280: 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e 70 43  >pNext = pDb->pC
5290: 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 70 43 6f 6c  ollate;.    pCol
52a0: 6c 61 74 65 2d 3e 7a 53 63 72 69 70 74 20 3d 20  late->zScript = 
52b0: 28 63 68 61 72 2a 29 26 70 43 6f 6c 6c 61 74 65  (char*)&pCollate
52c0: 5b 31 5d 3b 0a 20 20 20 20 70 44 62 2d 3e 70 43  [1];.    pDb->pC
52d0: 6f 6c 6c 61 74 65 20 3d 20 70 43 6f 6c 6c 61 74  ollate = pCollat
52e0: 65 3b 0a 20 20 20 20 73 74 72 63 70 79 28 70 43  e;.    strcpy(pC
52f0: 6f 6c 6c 61 74 65 2d 3e 7a 53 63 72 69 70 74 2c  ollate->zScript,
5300: 20 7a 53 63 72 69 70 74 29 3b 0a 20 20 20 20 69   zScript);.    i
5310: 66 28 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  f( sqlite3_creat
5320: 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 70 44 62 2d  e_collation(pDb-
5330: 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49  >db, zName, SQLI
5340: 54 45 5f 55 54 46 38 2c 20 0a 20 20 20 20 20 20  TE_UTF8, .      
5350: 20 20 70 43 6f 6c 6c 61 74 65 2c 20 74 63 6c 53    pCollate, tclS
5360: 71 6c 43 6f 6c 6c 61 74 65 29 20 29 7b 0a 20 20  qlCollate) ){.  
5370: 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
5380: 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
5390: 2a 29 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  *)sqlite3_errmsg
53a0: 28 70 44 62 2d 3e 64 62 29 2c 20 54 43 4c 5f 56  (pDb->db), TCL_V
53b0: 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 20 20  OLATILE);.      
53c0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
53d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  ;.    }.    brea
53e0: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
53f0: 2a 20 20 20 20 20 24 64 62 20 63 6f 6c 6c 61 74  *     $db collat
5400: 69 6f 6e 5f 6e 65 65 64 65 64 20 53 43 52 49 50  ion_needed SCRIP
5410: 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 72 65 61  T.  **.  ** Crea
5420: 74 65 20 61 20 6e 65 77 20 53 51 4c 20 63 6f 6c  te a new SQL col
5430: 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  lation function 
5440: 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 57 68  called NAME.  Wh
5450: 65 6e 65 76 65 72 0a 20 20 2a 2a 20 74 68 61 74  enever.  ** that
5460: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
5470: 6c 65 64 2c 20 69 6e 76 6f 6b 65 20 53 43 52 49  led, invoke SCRI
5480: 50 54 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  PT to evaluate t
5490: 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a  he function..  *
54a0: 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f 4c 4c  /.  case DB_COLL
54b0: 41 54 49 4f 4e 5f 4e 45 45 44 45 44 3a 20 7b 0a  ATION_NEEDED: {.
54c0: 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20      if( objc!=3 
54d0: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
54e0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
54f0: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 43 52 49  , 2, objv, "SCRI
5500: 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  PT");.      retu
5510: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
5520: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 44 62 2d    }.    if( pDb-
5530: 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 20  >pCollateNeeded 
5540: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63  ){.      Tcl_Dec
5550: 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70  rRefCount(pDb->p
5560: 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a  CollateNeeded);.
5570: 20 20 20 20 7d 0a 20 20 20 20 70 44 62 2d 3e 70      }.    pDb->p
5580: 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 20 3d 20  CollateNeeded = 
5590: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
55a0: 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 54  (objv[2]);.    T
55b0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
55c0: 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65  pDb->pCollateNee
55d0: 64 65 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ded);.    sqlite
55e0: 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64  3_collation_need
55f0: 65 64 28 70 44 62 2d 3e 64 62 2c 20 70 44 62 2c  ed(pDb->db, pDb,
5600: 20 74 63 6c 43 6f 6c 6c 61 74 65 4e 65 65 64 65   tclCollateNeede
5610: 64 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  d);.    break;. 
5620: 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20   }..  /*    $db 
5630: 63 6f 6d 70 6c 65 74 65 20 53 51 4c 0a 20 20 2a  complete SQL.  *
5640: 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 54 52  *.  ** Return TR
5650: 55 45 20 69 66 20 53 51 4c 20 69 73 20 61 20 63  UE if SQL is a c
5660: 6f 6d 70 6c 65 74 65 20 53 51 4c 20 73 74 61 74  omplete SQL stat
5670: 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 46  ement.  Return F
5680: 41 4c 53 45 20 69 66 0a 20 20 2a 2a 20 61 64 64  ALSE if.  ** add
5690: 69 74 69 6f 6e 61 6c 20 6c 69 6e 65 73 20 6f 66  itional lines of
56a0: 20 69 6e 70 75 74 20 61 72 65 20 6e 65 65 64 65   input are neede
56b0: 64 2e 20 20 54 68 69 73 20 69 73 20 73 69 6d 69  d.  This is simi
56c0: 6c 61 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20  lar to the.  ** 
56d0: 62 75 69 6c 74 2d 69 6e 20 22 69 6e 66 6f 20 63  built-in "info c
56e0: 6f 6d 70 6c 65 74 65 22 20 63 6f 6d 6d 61 6e 64  omplete" command
56f0: 20 6f 66 20 54 63 6c 2e 0a 20 20 2a 2f 0a 20 20   of Tcl..  */.  
5700: 63 61 73 65 20 44 42 5f 43 4f 4d 50 4c 45 54 45  case DB_COMPLETE
5710: 3a 20 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  : {.#ifndef SQLI
5720: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4c 45 54 45  TE_OMIT_COMPLETE
5730: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52  .    Tcl_Obj *pR
5740: 65 73 75 6c 74 3b 0a 20 20 20 20 69 6e 74 20 69  esult;.    int i
5750: 73 43 6f 6d 70 6c 65 74 65 3b 0a 20 20 20 20 69  sComplete;.    i
5760: 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
5770: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
5780: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
5790: 6f 62 6a 76 2c 20 22 53 51 4c 22 29 3b 0a 20 20  objv, "SQL");.  
57a0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
57b0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
57c0: 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 73 71 6c  isComplete = sql
57d0: 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 28 20 54  ite3_complete( T
57e0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
57f0: 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 20  Obj(objv[2], 0) 
5800: 29 3b 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d  );.    pResult =
5810: 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c   Tcl_GetObjResul
5820: 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54  t(interp);.    T
5830: 63 6c 5f 53 65 74 42 6f 6f 6c 65 61 6e 4f 62 6a  cl_SetBooleanObj
5840: 28 70 52 65 73 75 6c 74 2c 20 69 73 43 6f 6d 70  (pResult, isComp
5850: 6c 65 74 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  lete);.#endif.  
5860: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
5870: 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 65  /*.  **    $db e
5880: 72 72 6f 72 63 6f 64 65 0a 20 20 2a 2a 0a 20 20  rrorcode.  **.  
5890: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
58a0: 6d 65 72 69 63 20 65 72 72 6f 72 20 63 6f 64 65  meric error code
58b0: 20 74 68 61 74 20 77 61 73 20 72 65 74 75 72 6e   that was return
58c0: 65 64 20 62 79 20 74 68 65 20 6d 6f 73 74 20 72  ed by the most r
58d0: 65 63 65 6e 74 0a 20 20 2a 2a 20 63 61 6c 6c 20  ecent.  ** call 
58e0: 74 6f 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  to sqlite3_exec(
58f0: 29 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  )..  */.  case D
5900: 42 5f 45 52 52 4f 52 43 4f 44 45 3a 20 7b 0a 20  B_ERRORCODE: {. 
5910: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
5920: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
5930: 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65  NewIntObj(sqlite
5940: 33 5f 65 72 72 63 6f 64 65 28 70 44 62 2d 3e 64  3_errcode(pDb->d
5950: 62 29 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  b)));.    break;
5960: 0a 20 20 7d 0a 20 20 20 0a 20 20 2f 2a 0a 20 20  .  }.   .  /*.  
5970: 2a 2a 20 20 20 20 24 64 62 20 65 76 61 6c 20 24  **    $db eval $
5980: 73 71 6c 20 3f 61 72 72 61 79 3f 20 3f 7b 20 20  sql ?array? ?{  
5990: 2e 2e 2e 63 6f 64 65 2e 2e 2e 20 7d 3f 0a 20 20  ...code... }?.  
59a0: 2a 2a 20 20 20 20 24 64 62 20 6f 6e 65 63 6f 6c  **    $db onecol
59b0: 75 6d 6e 20 24 73 71 6c 0a 20 20 2a 2a 0a 20 20  umn $sql.  **.  
59c0: 2a 2a 20 54 68 65 20 53 51 4c 20 73 74 61 74 65  ** The SQL state
59d0: 6d 65 6e 74 20 69 6e 20 24 73 71 6c 20 69 73 20  ment in $sql is 
59e0: 65 76 61 6c 75 61 74 65 64 2e 20 20 46 6f 72 20  evaluated.  For 
59f0: 65 61 63 68 20 72 6f 77 2c 20 74 68 65 20 76 61  each row, the va
5a00: 6c 75 65 73 20 61 72 65 0a 20 20 2a 2a 20 70 6c  lues are.  ** pl
5a10: 61 63 65 64 20 69 6e 20 65 6c 65 6d 65 6e 74 73  aced in elements
5a20: 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 6e 61   of the array na
5a30: 6d 65 64 20 22 61 72 72 61 79 22 20 61 6e 64 20  med "array" and 
5a40: 2e 2e 2e 63 6f 64 65 2e 2e 2e 20 69 73 20 65 78  ...code... is ex
5a50: 65 63 75 74 65 64 2e 0a 20 20 2a 2a 20 49 66 20  ecuted..  ** If 
5a60: 22 61 72 72 61 79 22 20 61 6e 64 20 22 63 6f 64  "array" and "cod
5a70: 65 22 20 61 72 65 20 6f 6d 69 74 74 65 64 2c 20  e" are omitted, 
5a80: 74 68 65 6e 20 6e 6f 20 63 61 6c 6c 62 61 63 6b  then no callback
5a90: 20 69 73 20 65 76 65 72 79 20 69 6e 76 6f 6b 65   is every invoke
5aa0: 64 2e 0a 20 20 2a 2a 20 49 66 20 22 61 72 72 61  d..  ** If "arra
5ab0: 79 22 20 69 73 20 61 6e 20 65 6d 70 74 79 20 73  y" is an empty s
5ac0: 74 72 69 6e 67 2c 20 74 68 65 6e 20 74 68 65 20  tring, then the 
5ad0: 76 61 6c 75 65 73 20 61 72 65 20 70 6c 61 63 65  values are place
5ae0: 64 20 69 6e 20 76 61 72 69 61 62 6c 65 73 0a 20  d in variables. 
5af0: 20 2a 2a 20 74 68 61 74 20 68 61 76 65 20 74 68   ** that have th
5b00: 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74  e same name as t
5b10: 68 65 20 66 69 65 6c 64 73 20 65 78 74 72 61 63  he fields extrac
5b20: 74 65 64 20 62 79 20 74 68 65 20 71 75 65 72 79  ted by the query
5b30: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
5b40: 6f 6e 65 63 6f 6c 75 6d 6e 20 6d 65 74 68 6f 64  onecolumn method
5b50: 20 69 73 20 74 68 65 20 65 71 75 69 76 61 6c 65   is the equivale
5b60: 6e 74 20 6f 66 3a 0a 20 20 2a 2a 20 20 20 20 20  nt of:.  **     
5b70: 6c 69 6e 64 65 78 20 5b 24 64 62 20 65 76 61 6c  lindex [$db eval
5b80: 20 24 73 71 6c 5d 20 30 0a 20 20 2a 2f 0a 20 20   $sql] 0.  */.  
5b90: 63 61 73 65 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d  case DB_ONECOLUM
5ba0: 4e 3a 0a 20 20 63 61 73 65 20 44 42 5f 45 56 41  N:.  case DB_EVA
5bb0: 4c 3a 20 7b 0a 20 20 20 20 63 68 61 72 20 63 6f  L: {.    char co
5bc0: 6e 73 74 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20  nst *zSql;      
5bd0: 2f 2a 20 4e 65 78 74 20 53 51 4c 20 73 74 61 74  /* Next SQL stat
5be0: 65 6d 65 6e 74 20 74 6f 20 65 78 65 63 75 74 65  ement to execute
5bf0: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 63 6f 6e   */.    char con
5c00: 73 74 20 2a 7a 4c 65 66 74 3b 20 20 20 20 20 2f  st *zLeft;     /
5c10: 2a 20 57 68 61 74 20 69 73 20 6c 65 66 74 20 61  * What is left a
5c20: 66 74 65 72 20 66 69 72 73 74 20 73 74 6d 74 20  fter first stmt 
5c30: 69 6e 20 7a 53 71 6c 20 2a 2f 0a 20 20 20 20 73  in zSql */.    s
5c40: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
5c50: 6d 74 3b 20 20 20 2f 2a 20 43 6f 6d 70 69 6c 65  mt;   /* Compile
5c60: 64 20 53 51 4c 20 73 74 61 74 6d 65 6e 74 20 2a  d SQL statment *
5c70: 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  /.    Tcl_Obj *p
5c80: 41 72 72 61 79 3b 20 20 20 20 20 20 20 2f 2a 20  Array;       /* 
5c90: 4e 61 6d 65 20 6f 66 20 61 72 72 61 79 20 69 6e  Name of array in
5ca0: 74 6f 20 77 68 69 63 68 20 72 65 73 75 6c 74 73  to which results
5cb0: 20 61 72 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a   are written */.
5cc0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63      Tcl_Obj *pSc
5cd0: 72 69 70 74 3b 20 20 20 20 20 20 2f 2a 20 53 63  ript;      /* Sc
5ce0: 72 69 70 74 20 74 6f 20 72 75 6e 20 66 6f 72 20  ript to run for 
5cf0: 65 61 63 68 20 72 65 73 75 6c 74 20 73 65 74 20  each result set 
5d00: 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  */.    Tcl_Obj *
5d10: 2a 61 70 50 61 72 6d 3b 20 20 20 20 20 20 2f 2a  *apParm;      /*
5d20: 20 50 61 72 61 6d 65 74 65 72 73 20 74 68 61 74   Parameters that
5d30: 20 6e 65 65 64 20 61 20 54 63 6c 5f 44 65 63 72   need a Tcl_Decr
5d40: 52 65 66 43 6f 75 6e 74 28 29 20 2a 2f 0a 20 20  RefCount() */.  
5d50: 20 20 69 6e 74 20 6e 50 61 72 6d 3b 20 20 20 20    int nParm;    
5d60: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
5d70: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 75 73  er of entries us
5d80: 65 64 20 69 6e 20 61 70 50 61 72 6d 5b 5d 20 2a  ed in apParm[] *
5d90: 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 61  /.    Tcl_Obj *a
5da0: 50 61 72 6d 5b 31 30 5d 3b 20 20 20 20 2f 2a 20  Parm[10];    /* 
5db0: 53 74 61 74 69 63 20 73 70 61 63 65 20 66 6f 72  Static space for
5dc0: 20 61 70 50 61 72 6d 5b 5d 20 69 6e 20 74 68 65   apParm[] in the
5dd0: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a   common case */.
5de0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65      Tcl_Obj *pRe
5df0: 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61  t;         /* Va
5e00: 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75 72 6e  lue to be return
5e10: 65 64 20 2a 2f 0a 20 20 20 20 53 71 6c 50 72 65  ed */.    SqlPre
5e20: 70 61 72 65 64 53 74 6d 74 20 2a 70 50 72 65 53  paredStmt *pPreS
5e30: 74 6d 74 3b 20 20 2f 2a 20 50 6f 69 6e 74 65 72  tmt;  /* Pointer
5e40: 20 74 6f 20 61 20 70 72 65 70 61 72 65 64 20 73   to a prepared s
5e50: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
5e60: 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20 69 66  int rc2;..    if
5e70: 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f 4f 4e 45  ( choice==DB_ONE
5e80: 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20  COLUMN ){.      
5e90: 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
5ea0: 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67         Tcl_Wrong
5eb0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
5ec0: 32 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 22 29 3b  2, objv, "SQL");
5ed0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
5ee0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
5ef0: 20 7d 0a 20 20 20 20 20 20 70 52 65 74 20 3d 20   }.      pRet = 
5f00: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
5f10: 20 20 20 20 69 66 28 20 6f 62 6a 63 3c 33 20 7c      if( objc<3 |
5f20: 7c 20 6f 62 6a 63 3e 35 20 29 7b 0a 20 20 20 20  | objc>5 ){.    
5f30: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
5f40: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
5f50: 6f 62 6a 76 2c 20 22 53 51 4c 20 3f 41 52 52 41  objv, "SQL ?ARRA
5f60: 59 2d 4e 41 4d 45 3f 20 3f 53 43 52 49 50 54 3f  Y-NAME? ?SCRIPT?
5f70: 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ");.        retu
5f80: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
5f90: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 52 65 74      }.      pRet
5fa0: 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b   = Tcl_NewObj();
5fb0: 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  .      Tcl_IncrR
5fc0: 65 66 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20  efCount(pRet);. 
5fd0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a     }.    if( obj
5fe0: 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 70 41  c==3 ){.      pA
5ff0: 72 72 61 79 20 3d 20 70 53 63 72 69 70 74 20 3d  rray = pScript =
6000: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
6010: 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20  ( objc==4 ){.   
6020: 20 20 20 70 41 72 72 61 79 20 3d 20 30 3b 0a 20     pArray = 0;. 
6030: 20 20 20 20 20 70 53 63 72 69 70 74 20 3d 20 6f       pScript = o
6040: 62 6a 76 5b 33 5d 3b 0a 20 20 20 20 7d 65 6c 73  bjv[3];.    }els
6050: 65 7b 0a 20 20 20 20 20 20 70 41 72 72 61 79 20  e{.      pArray 
6060: 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20 20 20  = objv[3];.     
6070: 20 69 66 28 20 54 63 6c 5f 47 65 74 53 74 72 69   if( Tcl_GetStri
6080: 6e 67 28 70 41 72 72 61 79 29 5b 30 5d 3d 3d 30  ng(pArray)[0]==0
6090: 20 29 20 70 41 72 72 61 79 20 3d 20 30 3b 0a 20   ) pArray = 0;. 
60a0: 20 20 20 20 20 70 53 63 72 69 70 74 20 3d 20 6f       pScript = o
60b0: 62 6a 76 5b 34 5d 3b 0a 20 20 20 20 7d 0a 0a 20  bjv[4];.    }.. 
60c0: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
60d0: 75 6e 74 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  unt(objv[2]);.  
60e0: 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74    zSql = Tcl_Get
60f0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
6100: 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20 77  jv[2], 0);.    w
6110: 68 69 6c 65 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b  hile( rc==TCL_OK
6120: 20 26 26 20 7a 53 71 6c 5b 30 5d 20 29 7b 0a 20   && zSql[0] ){. 
6130: 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20       int i;     
6140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6150: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
6160: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 56 61  */.      int nVa
6170: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
6180: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
6190: 20 62 69 6e 64 20 70 61 72 61 6d 65 74 65 72 73   bind parameters
61a0: 20 69 6e 20 74 68 65 20 70 53 74 6d 74 20 2a 2f   in the pStmt */
61b0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b  .      int nCol;
61c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61d0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
61e0: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
61f0: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20  sult set */.    
6200: 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 43 6f    Tcl_Obj **apCo
6210: 6c 4e 61 6d 65 20 3d 20 30 3b 20 20 20 2f 2a 20  lName = 0;   /* 
6220: 41 72 72 61 79 20 6f 66 20 63 6f 6c 75 6d 6e 20  Array of column 
6230: 6e 61 6d 65 73 20 2a 2f 0a 20 20 20 20 20 20 69  names */.      i
6240: 6e 74 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 20  nt len;         
6250: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72            /* Str
6260: 69 6e 67 20 6c 65 6e 67 74 68 20 6f 66 20 7a 53  ing length of zS
6270: 71 6c 20 2a 2f 0a 20 20 0a 20 20 20 20 20 20 2f  ql */.  .      /
6280: 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 61 20  * Try to find a 
6290: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 68  SQL statement th
62a0: 61 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  at has already b
62b0: 65 65 6e 20 63 6f 6d 70 69 6c 65 64 20 61 6e 64  een compiled and
62c0: 0a 20 20 20 20 20 20 2a 2a 20 77 68 69 63 68 20  .      ** which 
62d0: 6d 61 74 63 68 65 73 20 74 68 65 20 6e 65 78 74  matches the next
62e0: 20 73 65 71 75 65 6e 63 65 20 6f 66 20 53 51 4c   sequence of SQL
62f0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
6300: 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20   pStmt = 0;.    
6310: 20 20 70 50 72 65 53 74 6d 74 20 3d 20 70 44 62    pPreStmt = pDb
6320: 2d 3e 73 74 6d 74 4c 69 73 74 3b 0a 20 20 20 20  ->stmtList;.    
6330: 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a    len = strlen(z
6340: 53 71 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Sql);.      if( 
6350: 70 50 72 65 53 74 6d 74 20 26 26 20 73 71 6c 69  pPreStmt && sqli
6360: 74 65 33 5f 65 78 70 69 72 65 64 28 70 50 72 65  te3_expired(pPre
6370: 53 74 6d 74 2d 3e 70 53 74 6d 74 29 20 29 7b 0a  Stmt->pStmt) ){.
6380: 20 20 20 20 20 20 20 20 66 6c 75 73 68 53 74 6d          flushStm
6390: 74 43 61 63 68 65 28 70 44 62 29 3b 0a 20 20 20  tCache(pDb);.   
63a0: 20 20 20 20 20 70 50 72 65 53 74 6d 74 20 3d 20       pPreStmt = 
63b0: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
63c0: 20 66 6f 72 28 3b 20 70 50 72 65 53 74 6d 74 3b   for(; pPreStmt;
63d0: 20 70 50 72 65 53 74 6d 74 3d 70 50 72 65 53 74   pPreStmt=pPreSt
63e0: 6d 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  mt->pNext){.    
63f0: 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 50 72 65      int n = pPre
6400: 53 74 6d 74 2d 3e 6e 53 71 6c 3b 0a 20 20 20 20  Stmt->nSql;.    
6410: 20 20 20 20 69 66 28 20 6c 65 6e 3e 3d 6e 20 0a      if( len>=n .
6420: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 6d              && m
6430: 65 6d 63 6d 70 28 70 50 72 65 53 74 6d 74 2d 3e  emcmp(pPreStmt->
6440: 7a 53 71 6c 2c 20 7a 53 71 6c 2c 20 6e 29 3d 3d  zSql, zSql, n)==
6450: 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26  0.            &&
6460: 20 28 7a 53 71 6c 5b 6e 5d 3d 3d 30 20 7c 7c 20   (zSql[n]==0 || 
6470: 7a 53 71 6c 5b 6e 2d 31 5d 3d 3d 27 3b 27 29 0a  zSql[n-1]==';').
6480: 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
6490: 20 20 20 20 20 70 53 74 6d 74 20 3d 20 70 50 72       pStmt = pPr
64a0: 65 53 74 6d 74 2d 3e 70 53 74 6d 74 3b 0a 20 20  eStmt->pStmt;.  
64b0: 20 20 20 20 20 20 20 20 7a 4c 65 66 74 20 3d 20          zLeft = 
64c0: 26 7a 53 71 6c 5b 70 50 72 65 53 74 6d 74 2d 3e  &zSql[pPreStmt->
64d0: 6e 53 71 6c 5d 3b 0a 0a 20 20 20 20 20 20 20 20  nSql];..        
64e0: 20 20 2f 2a 20 57 68 65 6e 20 61 20 70 72 65 70    /* When a prep
64f0: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 69  ared statement i
6500: 73 20 66 6f 75 6e 64 2c 20 75 6e 6c 69 6e 6b 20  s found, unlink 
6510: 69 74 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20  it from the.    
6520: 20 20 20 20 20 20 2a 2a 20 63 61 63 68 65 20 6c        ** cache l
6530: 69 73 74 2e 20 20 49 74 20 77 69 6c 6c 20 6c 61  ist.  It will la
6540: 74 65 72 20 62 65 20 61 64 64 65 64 20 62 61 63  ter be added bac
6550: 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  k to the beginni
6560: 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ng.          ** 
6570: 6f 66 20 74 68 65 20 63 61 63 68 65 20 6c 69 73  of the cache lis
6580: 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6d  t in order to im
6590: 70 6c 65 6d 65 6e 74 20 4c 52 55 20 72 65 70 6c  plement LRU repl
65a0: 61 63 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 20  acement..       
65b0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
65c0: 69 66 28 20 70 50 72 65 53 74 6d 74 2d 3e 70 50  if( pPreStmt->pP
65d0: 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rev ){.         
65e0: 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72     pPreStmt->pPr
65f0: 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 50 72 65  ev->pNext = pPre
6600: 53 74 6d 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Stmt->pNext;.   
6610: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
6620: 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73            pDb->s
6630: 74 6d 74 4c 69 73 74 20 3d 20 70 50 72 65 53 74  tmtList = pPreSt
6640: 6d 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  mt->pNext;.     
6650: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
6660: 20 69 66 28 20 70 50 72 65 53 74 6d 74 2d 3e 70   if( pPreStmt->p
6670: 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Next ){.        
6680: 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e      pPreStmt->pN
6690: 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 50 72  ext->pPrev = pPr
66a0: 65 53 74 6d 74 2d 3e 70 50 72 65 76 3b 0a 20 20  eStmt->pPrev;.  
66b0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
66c0: 20 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e             pDb->
66d0: 73 74 6d 74 4c 61 73 74 20 3d 20 70 50 72 65 53  stmtLast = pPreS
66e0: 74 6d 74 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20  tmt->pPrev;.    
66f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6700: 20 20 70 44 62 2d 3e 6e 53 74 6d 74 2d 2d 3b 0a    pDb->nStmt--;.
6710: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
6720: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6730: 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 49   }.  .      /* I
6740: 66 20 6e 6f 20 70 72 65 70 61 72 65 64 20 73 74  f no prepared st
6750: 61 74 65 6d 65 6e 74 20 77 61 73 20 66 6f 75 6e  atement was foun
6760: 64 2e 20 20 43 6f 6d 70 69 6c 65 20 74 68 65 20  d.  Compile the 
6770: 53 51 4c 20 74 65 78 74 0a 20 20 20 20 20 20 2a  SQL text.      *
6780: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 53 74 6d  /.      if( pStm
6790: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
67a0: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
67b0: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 70  qlite3_prepare(p
67c0: 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  Db->db, zSql, -1
67d0: 2c 20 26 70 53 74 6d 74 2c 20 26 7a 4c 65 66 74  , &pStmt, &zLeft
67e0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  ) ){.          T
67f0: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
6800: 69 6e 74 65 72 70 2c 20 64 62 54 65 78 74 54 6f  interp, dbTextTo
6810: 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65 72 72 6d  Obj(sqlite3_errm
6820: 73 67 28 70 44 62 2d 3e 64 62 29 29 29 3b 0a 20  sg(pDb->db)));. 
6830: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 54 43           rc = TC
6840: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  L_ERROR;.       
6850: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
6860: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
6870: 70 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pStmt==0 ){.    
6880: 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45        if( SQLITE
6890: 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 65 72 72  _OK!=sqlite3_err
68a0: 63 6f 64 65 28 70 44 62 2d 3e 64 62 29 20 29 7b  code(pDb->db) ){
68b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
68c0: 41 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 65  A compile-time e
68d0: 72 72 6f 72 20 69 6e 20 74 68 65 20 73 74 61 74  rror in the stat
68e0: 65 6d 65 6e 74 0a 20 20 20 20 20 20 20 20 20 20  ement.          
68f0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
6900: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
6910: 74 28 69 6e 74 65 72 70 2c 20 64 62 54 65 78 74  t(interp, dbText
6920: 54 6f 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65 72  ToObj(sqlite3_er
6930: 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 29 29 3b  rmsg(pDb->db)));
6940: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
6950: 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  = TCL_ERROR;.   
6960: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
6970: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
6980: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
6990: 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 77 61  The statement wa
69a0: 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 43 6f 6e 74  s a no-op.  Cont
69b0: 69 6e 75 65 20 74 6f 20 74 68 65 20 6e 65 78 74  inue to the next
69c0: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20   statement.     
69d0: 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65         ** in the
69e0: 20 53 51 4c 20 73 74 72 69 6e 67 2e 0a 20 20 20   SQL string..   
69f0: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
6a00: 20 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 7a          zSql = z
6a10: 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Left;.          
6a20: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
6a30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6a40: 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
6a50: 28 20 70 50 72 65 53 74 6d 74 3d 3d 30 20 29 3b  ( pPreStmt==0 );
6a60: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
6a70: 2f 2a 20 42 69 6e 64 20 76 61 6c 75 65 73 20 74  /* Bind values t
6a80: 6f 20 70 61 72 61 6d 65 74 65 72 73 20 74 68 61  o parameters tha
6a90: 74 20 62 65 67 69 6e 20 77 69 74 68 20 24 20 6f  t begin with $ o
6aa0: 72 20 3a 0a 20 20 20 20 20 20 2a 2f 20 20 0a 20  r :.      */  . 
6ab0: 20 20 20 20 20 6e 56 61 72 20 3d 20 73 71 6c 69       nVar = sqli
6ac0: 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  te3_bind_paramet
6ad0: 65 72 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b  er_count(pStmt);
6ae0: 0a 20 20 20 20 20 20 6e 50 61 72 6d 20 3d 20 30  .      nParm = 0
6af0: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 56 61 72  ;.      if( nVar
6b00: 3e 73 69 7a 65 6f 66 28 61 50 61 72 6d 29 2f 73  >sizeof(aParm)/s
6b10: 69 7a 65 6f 66 28 61 50 61 72 6d 5b 30 5d 29 20  izeof(aParm[0]) 
6b20: 29 7b 0a 20 20 20 20 20 20 20 20 61 70 50 61 72  ){.        apPar
6b30: 6d 20 3d 20 28 54 63 6c 5f 4f 62 6a 2a 2a 29 54  m = (Tcl_Obj**)T
6b40: 63 6c 5f 41 6c 6c 6f 63 28 6e 56 61 72 2a 73 69  cl_Alloc(nVar*si
6b50: 7a 65 6f 66 28 61 70 50 61 72 6d 5b 30 5d 29 29  zeof(apParm[0]))
6b60: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
6b70: 20 20 20 20 20 20 20 61 70 50 61 72 6d 20 3d 20         apParm = 
6b80: 61 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  aParm;.      }. 
6b90: 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c       for(i=1; i<
6ba0: 3d 6e 56 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  =nVar; i++){.   
6bb0: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
6bc0: 2a 7a 56 61 72 20 3d 20 73 71 6c 69 74 65 33 5f  *zVar = sqlite3_
6bd0: 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e  bind_parameter_n
6be0: 61 6d 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20  ame(pStmt, i);. 
6bf0: 20 20 20 20 20 20 20 69 66 28 20 7a 56 61 72 21         if( zVar!
6c00: 3d 30 20 26 26 20 28 7a 56 61 72 5b 30 5d 3d 3d  =0 && (zVar[0]==
6c10: 27 24 27 20 7c 7c 20 7a 56 61 72 5b 30 5d 3d 3d  '$' || zVar[0]==
6c20: 27 3a 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ':') ){.        
6c30: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 72 20    Tcl_Obj *pVar 
6c40: 3d 20 54 63 6c 5f 47 65 74 56 61 72 32 45 78 28  = Tcl_GetVar2Ex(
6c50: 69 6e 74 65 72 70 2c 20 26 7a 56 61 72 5b 31 5d  interp, &zVar[1]
6c60: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
6c70: 20 20 20 69 66 28 20 70 56 61 72 20 29 7b 0a 20     if( pVar ){. 
6c80: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e             int n
6c90: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 38  ;.            u8
6ca0: 20 2a 64 61 74 61 3b 0a 20 20 20 20 20 20 20 20   *data;.        
6cb0: 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20      char *zType 
6cc0: 3d 20 70 56 61 72 2d 3e 74 79 70 65 50 74 72 20  = pVar->typePtr 
6cd0: 3f 20 70 56 61 72 2d 3e 74 79 70 65 50 74 72 2d  ? pVar->typePtr-
6ce0: 3e 6e 61 6d 65 20 3a 20 22 22 3b 0a 20 20 20 20  >name : "";.    
6cf0: 20 20 20 20 20 20 20 20 63 68 61 72 20 63 20 3d          char c =
6d00: 20 7a 54 79 70 65 5b 30 5d 3b 0a 20 20 20 20 20   zType[0];.     
6d10: 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 62         if( c=='b
6d20: 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70  ' && strcmp(zTyp
6d30: 65 2c 22 62 79 74 65 61 72 72 61 79 22 29 3d 3d  e,"bytearray")==
6d40: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
6d50: 20 20 20 64 61 74 61 20 3d 20 54 63 6c 5f 47 65     data = Tcl_Ge
6d60: 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62  tByteArrayFromOb
6d70: 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20  j(pVar, &n);.   
6d80: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
6d90: 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74  e3_bind_blob(pSt
6da0: 6d 74 2c 20 69 2c 20 64 61 74 61 2c 20 6e 2c 20  mt, i, data, n, 
6db0: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
6dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63                Tc
6dd0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
6de0: 56 61 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Var);.          
6df0: 20 20 20 20 61 70 50 61 72 6d 5b 6e 50 61 72 6d      apParm[nParm
6e00: 2b 2b 5d 20 3d 20 70 56 61 72 3b 0a 20 20 20 20  ++] = pVar;.    
6e10: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
6e20: 28 20 28 63 3d 3d 27 62 27 20 26 26 20 73 74 72  ( (c=='b' && str
6e30: 63 6d 70 28 7a 54 79 70 65 2c 22 62 6f 6f 6c 65  cmp(zType,"boole
6e40: 61 6e 22 29 3d 3d 30 29 20 7c 7c 0a 20 20 20 20  an")==0) ||.    
6e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
6e60: 3d 3d 27 69 27 20 26 26 20 73 74 72 63 6d 70 28  =='i' && strcmp(
6e70: 7a 54 79 70 65 2c 22 69 6e 74 22 29 3d 3d 30 29  zType,"int")==0)
6e80: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
6e90: 20 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d    Tcl_GetIntFrom
6ea0: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 56 61 72  Obj(interp, pVar
6eb0: 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  , &n);.         
6ec0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
6ed0: 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20 69 2c 20  d_int(pStmt, i, 
6ee0: 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
6ef0: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 64 27  }else if( c=='d'
6f00: 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65   && strcmp(zType
6f10: 2c 22 64 6f 75 62 6c 65 22 29 3d 3d 30 20 29 7b  ,"double")==0 ){
6f20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  .              d
6f30: 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20 20 20 20  ouble r;.       
6f40: 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 44 6f         Tcl_GetDo
6f50: 75 62 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  ubleFromObj(inte
6f60: 72 70 2c 20 70 56 61 72 2c 20 26 72 29 3b 0a 20  rp, pVar, &r);. 
6f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
6f80: 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65  ite3_bind_double
6f90: 28 70 53 74 6d 74 2c 20 69 2c 20 72 29 3b 0a 20  (pStmt, i, r);. 
6fa0: 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
6fb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
6fc0: 64 61 74 61 20 3d 20 54 63 6c 5f 47 65 74 53 74  data = Tcl_GetSt
6fd0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 56 61 72  ringFromObj(pVar
6fe0: 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  , &n);.         
6ff0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
7000: 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 2c  d_text(pStmt, i,
7010: 20 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45   data, n, SQLITE
7020: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
7030: 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72          Tcl_Incr
7040: 52 65 66 43 6f 75 6e 74 28 70 56 61 72 29 3b 0a  RefCount(pVar);.
7050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70                ap
7060: 50 61 72 6d 5b 6e 50 61 72 6d 2b 2b 5d 20 3d 20  Parm[nParm++] = 
7070: 70 56 61 72 3b 0a 20 20 20 20 20 20 20 20 20 20  pVar;.          
7080: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65    }.          }e
7090: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
70a0: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75   sqlite3_bind_nu
70b0: 6c 6c 28 20 70 53 74 6d 74 2c 20 69 20 29 3b 0a  ll( pStmt, i );.
70c0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
70d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
70e0: 20 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20       /* Compute 
70f0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a  column names */.
7100: 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c        nCol = sql
7110: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
7120: 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  t(pStmt);.      
7130: 69 66 28 20 70 53 63 72 69 70 74 20 29 7b 0a 20  if( pScript ){. 
7140: 20 20 20 20 20 20 20 61 70 43 6f 6c 4e 61 6d 65         apColName
7150: 20 3d 20 28 54 63 6c 5f 4f 62 6a 2a 2a 29 54 63   = (Tcl_Obj**)Tc
7160: 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  l_Alloc( sizeof(
7170: 54 63 6c 5f 4f 62 6a 2a 29 2a 6e 43 6f 6c 20 29  Tcl_Obj*)*nCol )
7180: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 70  ;.        if( ap
7190: 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65  ColName==0 ) bre
71a0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  ak;.        for(
71b0: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
71c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 43  ){.          apC
71d0: 6f 6c 4e 61 6d 65 5b 69 5d 20 3d 20 64 62 54 65  olName[i] = dbTe
71e0: 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65 33 5f  xtToObj(sqlite3_
71f0: 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d  column_name(pStm
7200: 74 2c 69 29 29 3b 0a 20 20 20 20 20 20 20 20 20  t,i));.         
7210: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
7220: 74 28 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b  t(apColName[i]);
7230: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7240: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
7250: 72 65 73 75 6c 74 73 20 61 72 65 20 62 65 69 6e  results are bein
7260: 67 20 73 74 6f 72 65 64 20 69 6e 20 61 6e 20 61  g stored in an a
7270: 72 72 61 79 20 76 61 72 69 61 62 6c 65 2c 20 74  rray variable, t
7280: 68 65 6e 20 63 72 65 61 74 65 0a 20 20 20 20 20  hen create.     
7290: 20 2a 2a 20 74 68 65 20 61 72 72 61 79 28 2a 29   ** the array(*)
72a0: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 61 74 20   entry for that 
72b0: 61 72 72 61 79 0a 20 20 20 20 20 20 2a 2f 0a 20  array.      */. 
72c0: 20 20 20 20 20 69 66 28 20 70 41 72 72 61 79 20       if( pArray 
72d0: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4f  ){.        Tcl_O
72e0: 62 6a 20 2a 70 43 6f 6c 4c 69 73 74 20 3d 20 54  bj *pColList = T
72f0: 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20  cl_NewObj();.   
7300: 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53       Tcl_Obj *pS
7310: 74 61 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72  tar = Tcl_NewStr
7320: 69 6e 67 4f 62 6a 28 22 2a 22 2c 20 2d 31 29 3b  ingObj("*", -1);
7330: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63  .        Tcl_Inc
7340: 72 52 65 66 43 6f 75 6e 74 28 70 43 6f 6c 4c 69  rRefCount(pColLi
7350: 73 74 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  st);.        for
7360: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
7370: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63  +){.          Tc
7380: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
7390: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70  lement(interp, p
73a0: 43 6f 6c 4c 69 73 74 2c 20 61 70 43 6f 6c 4e 61  ColList, apColNa
73b0: 6d 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  me[i]);.        
73c0: 7d 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62  }.        Tcl_Ob
73d0: 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c  jSetVar2(interp,
73e0: 20 70 41 72 72 61 79 2c 20 70 53 74 61 72 2c 20   pArray, pStar, 
73f0: 70 43 6f 6c 4c 69 73 74 2c 30 29 3b 0a 20 20 20  pColList,0);.   
7400: 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66       Tcl_DecrRef
7410: 43 6f 75 6e 74 28 70 43 6f 6c 4c 69 73 74 29 3b  Count(pColList);
7420: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63  .        Tcl_Dec
7430: 72 52 65 66 43 6f 75 6e 74 28 70 53 74 61 72 29  rRefCount(pStar)
7440: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
7450: 20 2f 2a 20 45 78 65 63 75 74 65 20 74 68 65 20   /* Execute the 
7460: 53 51 4c 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  SQL.      */.   
7470: 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 54 43     while( rc==TC
7480: 4c 5f 4f 4b 20 26 26 20 70 53 74 6d 74 20 26 26  L_OK && pStmt &&
7490: 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
74a0: 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
74b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   ){.        for(
74c0: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
74d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  ){.          Tcl
74e0: 5f 4f 62 6a 20 2a 70 56 61 6c 3b 0a 20 20 20 20  _Obj *pVal;.    
74f0: 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20        .         
7500: 20 2f 2a 20 53 65 74 20 70 56 61 6c 20 74 6f 20   /* Set pVal to 
7510: 63 6f 6e 74 61 69 6e 20 74 68 65 20 69 27 74 68  contain the i'th
7520: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 69 73 20   column of this 
7530: 72 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  row. */.        
7540: 20 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65    switch( sqlite
7550: 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53  3_column_type(pS
7560: 74 6d 74 2c 20 69 29 20 29 7b 0a 20 20 20 20 20  tmt, i) ){.     
7570: 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
7580: 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20  TE_BLOB: {.     
7590: 20 20 20 20 20 20 20 20 20 69 6e 74 20 62 79 74           int byt
75a0: 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  es = sqlite3_col
75b0: 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c  umn_bytes(pStmt,
75c0: 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   i);.           
75d0: 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65     pVal = Tcl_Ne
75e0: 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 73 71  wByteArrayObj(sq
75f0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f  lite3_column_blo
7600: 62 28 70 53 74 6d 74 2c 20 69 29 2c 20 62 79 74  b(pStmt, i), byt
7610: 65 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  es);.           
7620: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
7630: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7640: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
7650: 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20  INTEGER: {.     
7660: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 5f           sqlite_
7670: 69 6e 74 36 34 20 76 20 3d 20 73 71 6c 69 74 65  int64 v = sqlite
7680: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70  3_column_int64(p
7690: 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Stmt, i);.      
76a0: 20 20 20 20 20 20 20 20 69 66 28 20 76 3e 3d 2d          if( v>=-
76b0: 32 31 34 37 34 38 33 36 34 37 20 26 26 20 76 3c  2147483647 && v<
76c0: 3d 32 31 34 37 34 38 33 36 34 37 20 29 7b 0a 20  =2147483647 ){. 
76d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
76e0: 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 49 6e 74  Val = Tcl_NewInt
76f0: 4f 62 6a 28 76 29 3b 0a 20 20 20 20 20 20 20 20  Obj(v);.        
7700: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
7710: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56 61               pVa
7720: 6c 20 3d 20 54 63 6c 5f 4e 65 77 57 69 64 65 49  l = Tcl_NewWideI
7730: 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20 20 20 20  ntObj(v);.      
7740: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7750: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
7760: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
7770: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51           case SQ
7780: 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20  LITE_FLOAT: {.  
7790: 20 20 20 20 20 20 20 20 20 20 20 20 64 6f 75 62              doub
77a0: 6c 65 20 72 20 3d 20 73 71 6c 69 74 65 33 5f 63  le r = sqlite3_c
77b0: 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 53 74  olumn_double(pSt
77c0: 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  mt, i);.        
77d0: 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c        pVal = Tcl
77e0: 5f 4e 65 77 44 6f 75 62 6c 65 4f 62 6a 28 72 29  _NewDoubleObj(r)
77f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
7800: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
7810: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
7820: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c   case SQLITE_NUL
7830: 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  L: {.           
7840: 20 20 20 70 56 61 6c 20 3d 20 64 62 54 65 78 74     pVal = dbText
7850: 54 6f 4f 62 6a 28 70 44 62 2d 3e 7a 4e 75 6c 6c  ToObj(pDb->zNull
7860: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
7870: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
7880: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
7890: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
78a0: 20 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20             pVal 
78b0: 3d 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 73 71  = dbTextToObj(sq
78c0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
78d0: 74 28 70 53 74 6d 74 2c 20 69 29 29 3b 0a 20 20  t(pStmt, i));.  
78e0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
78f0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  k;.            }
7900: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 0a  .          }.  .
7910: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53            if( pS
7920: 63 72 69 70 74 20 29 7b 0a 20 20 20 20 20 20 20  cript ){.       
7930: 20 20 20 20 20 69 66 28 20 70 41 72 72 61 79 3d       if( pArray=
7940: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
7950: 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61      Tcl_ObjSetVa
7960: 72 32 28 69 6e 74 65 72 70 2c 20 61 70 43 6f 6c  r2(interp, apCol
7970: 4e 61 6d 65 5b 69 5d 2c 20 30 2c 20 70 56 61 6c  Name[i], 0, pVal
7980: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
7990: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
79a0: 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65         Tcl_ObjSe
79b0: 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 70 41  tVar2(interp, pA
79c0: 72 72 61 79 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b  rray, apColName[
79d0: 69 5d 2c 20 70 56 61 6c 2c 20 30 29 3b 0a 20 20  i], pVal, 0);.  
79e0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
79f0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
7a00: 63 68 6f 69 63 65 3d 3d 44 42 5f 4f 4e 45 43 4f  choice==DB_ONECO
7a10: 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  LUMN ){.        
7a20: 20 20 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20      if( pRet==0 
7a30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
7a40: 20 70 52 65 74 20 3d 20 70 56 61 6c 3b 0a 20 20   pRet = pVal;.  
7a50: 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
7a60: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 52 65  IncrRefCount(pRe
7a70: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
7a80: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  }.            rc
7a90: 20 3d 20 54 43 4c 5f 42 52 45 41 4b 3b 0a 20 20   = TCL_BREAK;.  
7aa0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
7ab0: 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4c             Tcl_L
7ac0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
7ad0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74  ent(interp, pRet
7ae0: 2c 20 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 20  , pVal);.       
7af0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
7b00: 20 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53   .        if( pS
7b10: 63 72 69 70 74 20 29 7b 0a 20 20 20 20 20 20 20  cript ){.       
7b20: 20 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c     rc = Tcl_Eval
7b30: 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 70 53  ObjEx(interp, pS
7b40: 63 72 69 70 74 2c 20 30 29 3b 0a 20 20 20 20 20  cript, 0);.     
7b50: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c       if( rc==TCL
7b60: 5f 43 4f 4e 54 49 4e 55 45 20 29 7b 0a 20 20 20  _CONTINUE ){.   
7b70: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 54 43           rc = TC
7b80: 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  L_OK;.          
7b90: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
7ba0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
7bb0: 3d 3d 54 43 4c 5f 42 52 45 41 4b 20 29 7b 0a 20  ==TCL_BREAK ){. 
7bc0: 20 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f         rc = TCL_
7bd0: 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  OK;.      }..   
7be0: 20 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20 63     /* Free the c
7bf0: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6f 62 6a 65 63  olumn name objec
7c00: 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ts */.      if( 
7c10: 70 53 63 72 69 70 74 20 29 7b 0a 20 20 20 20 20  pScript ){.     
7c20: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
7c30: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
7c40: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
7c50: 6f 75 6e 74 28 61 70 43 6f 6c 4e 61 6d 65 5b 69  ount(apColName[i
7c60: 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ]);.        }.  
7c70: 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28        Tcl_Free((
7c80: 63 68 61 72 2a 29 61 70 43 6f 6c 4e 61 6d 65 29  char*)apColName)
7c90: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
7ca0: 20 2f 2a 20 46 72 65 65 20 74 68 65 20 62 6f 75   /* Free the bou
7cb0: 6e 64 20 73 74 72 69 6e 67 20 61 6e 64 20 62 6c  nd string and bl
7cc0: 6f 62 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f  ob parameters */
7cd0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
7ce0: 69 3c 6e 50 61 72 6d 3b 20 69 2b 2b 29 7b 0a 20  i<nParm; i++){. 
7cf0: 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52         Tcl_DecrR
7d00: 65 66 43 6f 75 6e 74 28 61 70 50 61 72 6d 5b 69  efCount(apParm[i
7d10: 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
7d20: 20 20 69 66 28 20 61 70 50 61 72 6d 21 3d 61 50    if( apParm!=aP
7d30: 61 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 54  arm ){.        T
7d40: 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 61  cl_Free((char*)a
7d50: 70 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a  pParm);.      }.
7d60: 0a 20 20 20 20 20 20 2f 2a 20 52 65 73 65 74 20  .      /* Reset 
7d70: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  the statement.  
7d80: 49 66 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  If the result co
7d90: 64 65 20 69 73 20 53 51 4c 49 54 45 5f 53 43 48  de is SQLITE_SCH
7da0: 45 4d 41 2c 20 74 68 65 6e 0a 20 20 20 20 20 20  EMA, then.      
7db0: 2a 2a 20 66 6c 75 73 68 20 74 68 65 20 73 74 61  ** flush the sta
7dc0: 74 65 6d 65 6e 74 20 63 61 63 68 65 20 61 6e 64  tement cache and
7dd0: 20 74 72 79 20 74 68 65 20 73 74 61 74 65 6d 65   try the stateme
7de0: 6e 74 20 61 67 61 69 6e 2e 0a 20 20 20 20 20 20  nt again..      
7df0: 2a 2f 0a 20 20 20 20 20 20 72 63 32 20 3d 20 73  */.      rc2 = s
7e00: 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74  qlite3_reset(pSt
7e10: 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53  mt);.      if( S
7e20: 51 4c 49 54 45 5f 53 43 48 45 4d 41 3d 3d 72 63  QLITE_SCHEMA==rc
7e30: 32 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  2 ){.        /* 
7e40: 41 66 74 65 72 20 61 20 73 63 68 65 6d 61 20 63  After a schema c
7e50: 68 61 6e 67 65 2c 20 66 6c 75 73 68 20 74 68 65  hange, flush the
7e60: 20 63 61 63 68 65 20 61 6e 64 20 74 72 79 20 74   cache and try t
7e70: 6f 20 72 75 6e 20 74 68 65 0a 20 20 20 20 20 20  o run the.      
7e80: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 61    ** statement a
7e90: 67 61 69 6e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  gain.        */.
7ea0: 20 20 20 20 20 20 20 20 66 6c 75 73 68 53 74 6d          flushStm
7eb0: 74 43 61 63 68 65 28 20 70 44 62 20 29 3b 0a 20  tCache( pDb );. 
7ec0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
7ed0: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
7ee0: 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72 65          if( pPre
7ef0: 53 74 6d 74 20 29 20 54 63 6c 5f 46 72 65 65 28  Stmt ) Tcl_Free(
7f00: 28 63 68 61 72 2a 29 70 50 72 65 53 74 6d 74 29  (char*)pPreStmt)
7f10: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  ;.        contin
7f20: 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ue;.      }else 
7f30: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72  if( SQLITE_OK!=r
7f40: 63 32 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  c2 ){.        /*
7f50: 20 49 66 20 61 20 72 75 6e 2d 74 69 6d 65 20 65   If a run-time e
7f60: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 70  rror occurs, rep
7f70: 6f 72 74 20 74 68 65 20 65 72 72 6f 72 20 61 6e  ort the error an
7f80: 64 20 73 74 6f 70 20 72 65 61 64 69 6e 67 0a 20  d stop reading. 
7f90: 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53 51         ** the SQ
7fa0: 4c 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  L.        */.   
7fb0: 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52       Tcl_SetObjR
7fc0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 64 62  esult(interp, db
7fd0: 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65  TextToObj(sqlite
7fe0: 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62  3_errmsg(pDb->db
7ff0: 29 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  )));.        sql
8000: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
8010: 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63  tmt);.        rc
8020: 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20   = TCL_ERROR;.  
8030: 20 20 20 20 20 20 69 66 28 20 70 50 72 65 53 74        if( pPreSt
8040: 6d 74 20 29 20 54 63 6c 5f 46 72 65 65 28 28 63  mt ) Tcl_Free((c
8050: 68 61 72 2a 29 70 50 72 65 53 74 6d 74 29 3b 0a  har*)pPreStmt);.
8060: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
8070: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
8080: 44 62 2d 3e 6d 61 78 53 74 6d 74 3c 3d 30 20 29  Db->maxStmt<=0 )
8090: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
80a0: 74 68 65 20 63 61 63 68 65 20 69 73 20 74 75 72  the cache is tur
80b0: 6e 65 64 20 6f 66 66 2c 20 64 65 61 6c 6c 6f 63  ned off, dealloc
80c0: 61 74 65 64 20 74 68 65 20 73 74 61 74 65 6d 65  ated the stateme
80d0: 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  nt */.        if
80e0: 28 20 70 50 72 65 53 74 6d 74 20 29 20 54 63 6c  ( pPreStmt ) Tcl
80f0: 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 50 72  _Free((char*)pPr
8100: 65 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  eStmt);.        
8110: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
8120: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 7d  (pStmt);.      }
8130: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
8140: 20 45 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b   Everything work
8150: 65 64 20 61 6e 64 20 74 68 65 20 63 61 63 68 65  ed and the cache
8160: 20 69 73 20 6f 70 65 72 61 74 69 6f 6e 61 6c 2e   is operational.
8170: 0a 20 20 20 20 20 20 20 20 2a 2a 20 43 72 65 61  .        ** Crea
8180: 74 65 20 61 20 6e 65 77 20 53 71 6c 50 72 65 70  te a new SqlPrep
8190: 61 72 65 64 53 74 6d 74 20 73 74 72 75 63 74 75  aredStmt structu
81a0: 72 65 20 69 66 20 77 65 20 6e 65 65 64 20 6f 6e  re if we need on
81b0: 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 49  e..        ** (I
81c0: 66 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76  f we already hav
81d0: 65 20 6f 6e 65 20 77 65 20 63 61 6e 20 6a 75 73  e one we can jus
81e0: 74 20 72 65 75 73 65 20 69 74 2e 29 0a 20 20 20  t reuse it.).   
81f0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
8200: 69 66 28 20 70 50 72 65 53 74 6d 74 3d 3d 30 20  if( pPreStmt==0 
8210: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 65 6e  ){.          len
8220: 20 3d 20 7a 4c 65 66 74 20 2d 20 7a 53 71 6c 3b   = zLeft - zSql;
8230: 0a 20 20 20 20 20 20 20 20 20 20 70 50 72 65 53  .          pPreS
8240: 74 6d 74 20 3d 20 28 53 71 6c 50 72 65 70 61 72  tmt = (SqlPrepar
8250: 65 64 53 74 6d 74 2a 29 54 63 6c 5f 41 6c 6c 6f  edStmt*)Tcl_Allo
8260: 63 28 20 73 69 7a 65 6f 66 28 2a 70 50 72 65 53  c( sizeof(*pPreS
8270: 74 6d 74 29 20 2b 20 6c 65 6e 20 29 3b 0a 20 20  tmt) + len );.  
8280: 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72 65          if( pPre
8290: 53 74 6d 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  Stmt==0 ) return
82a0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
82b0: 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e        pPreStmt->
82c0: 70 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20  pStmt = pStmt;. 
82d0: 20 20 20 20 20 20 20 20 20 70 50 72 65 53 74 6d           pPreStm
82e0: 74 2d 3e 6e 53 71 6c 20 3d 20 6c 65 6e 3b 0a 20  t->nSql = len;. 
82f0: 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
8300: 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 2c 20  pPreStmt->zSql, 
8310: 7a 53 71 6c 2c 20 6c 65 6e 29 3b 0a 20 20 20 20  zSql, len);.    
8320: 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e        pPreStmt->
8330: 7a 53 71 6c 5b 6c 65 6e 5d 20 3d 20 30 3b 0a 20  zSql[len] = 0;. 
8340: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
8350: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 70 72 65    /* Add the pre
8360: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
8370: 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
8380: 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 6c 69   of the cache li
8390: 73 74 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  st.        */.  
83a0: 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e        pPreStmt->
83b0: 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e 73 74 6d  pNext = pDb->stm
83c0: 74 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 70  tList;.        p
83d0: 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 20 3d  PreStmt->pPrev =
83e0: 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   0;.        if( 
83f0: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 29 7b  pDb->stmtList ){
8400: 0a 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73  .         pDb->s
8410: 74 6d 74 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d  tmtList->pPrev =
8420: 20 70 50 72 65 53 74 6d 74 3b 0a 20 20 20 20 20   pPreStmt;.     
8430: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 44 62     }.        pDb
8440: 2d 3e 73 74 6d 74 4c 69 73 74 20 3d 20 70 50 72  ->stmtList = pPr
8450: 65 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 69  eStmt;.        i
8460: 66 28 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74  f( pDb->stmtLast
8470: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
8480: 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 6e 53   assert( pDb->nS
8490: 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  tmt==0 );.      
84a0: 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73      pDb->stmtLas
84b0: 74 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a 20 20  t = pPreStmt;.  
84c0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
84d0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
84e0: 44 62 2d 3e 6e 53 74 6d 74 3e 30 20 29 3b 0a 20  Db->nStmt>0 );. 
84f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8500: 20 70 44 62 2d 3e 6e 53 74 6d 74 2b 2b 3b 0a 20   pDb->nStmt++;. 
8510: 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66    .        /* If
8520: 20 77 65 20 68 61 76 65 20 74 6f 6f 20 6d 61 6e   we have too man
8530: 79 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 63  y statement in c
8540: 61 63 68 65 2c 20 72 65 6d 6f 76 65 20 74 68 65  ache, remove the
8550: 20 73 75 72 70 6c 75 73 20 66 72 6f 6d 20 74 68   surplus from th
8560: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 6e 64  e.        ** end
8570: 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 6c 69   of the cache li
8580: 73 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  st..        */. 
8590: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 44         while( pD
85a0: 62 2d 3e 6e 53 74 6d 74 3e 70 44 62 2d 3e 6d 61  b->nStmt>pDb->ma
85b0: 78 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20  xStmt ){.       
85c0: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
85d0: 69 7a 65 28 70 44 62 2d 3e 73 74 6d 74 4c 61 73  ize(pDb->stmtLas
85e0: 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  t->pStmt);.     
85f0: 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61       pDb->stmtLa
8600: 73 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 61  st = pDb->stmtLa
8610: 73 74 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20  st->pPrev;.     
8620: 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63       Tcl_Free((c
8630: 68 61 72 2a 29 70 44 62 2d 3e 73 74 6d 74 4c 61  har*)pDb->stmtLa
8640: 73 74 2d 3e 70 4e 65 78 74 29 3b 0a 20 20 20 20  st->pNext);.    
8650: 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c        pDb->stmtL
8660: 61 73 74 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a  ast->pNext = 0;.
8670: 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 6e            pDb->n
8680: 53 74 6d 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20  Stmt--;.        
8690: 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
86a0: 20 2f 2a 20 50 72 6f 63 65 65 64 20 74 6f 20 74   /* Proceed to t
86b0: 68 65 20 6e 65 78 74 20 73 74 61 74 65 6d 65 6e  he next statemen
86c0: 74 20 2a 2f 0a 20 20 20 20 20 20 7a 53 71 6c 20  t */.      zSql 
86d0: 3d 20 7a 4c 65 66 74 3b 0a 20 20 20 20 7d 0a 20  = zLeft;.    }. 
86e0: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
86f0: 75 6e 74 28 6f 62 6a 76 5b 32 5d 29 3b 0a 0a 20  unt(objv[2]);.. 
8700: 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20     if( pRet ){. 
8710: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c       if( rc==TCL
8720: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 54  _OK ){.        T
8730: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
8740: 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 20  interp, pRet);. 
8750: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 63 6c       }.      Tcl
8760: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 52  _DecrRefCount(pR
8770: 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  et);.    }.    b
8780: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
8790: 20 20 2a 2a 20 20 20 20 20 24 64 62 20 66 75 6e    **     $db fun
87a0: 63 74 69 6f 6e 20 4e 41 4d 45 20 53 43 52 49 50  ction NAME SCRIP
87b0: 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 72 65 61  T.  **.  ** Crea
87c0: 74 65 20 61 20 6e 65 77 20 53 51 4c 20 66 75 6e  te a new SQL fun
87d0: 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d  ction called NAM
87e0: 45 2e 20 20 57 68 65 6e 65 76 65 72 20 74 68 61  E.  Whenever tha
87f0: 74 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 20 20  t function is.  
8800: 2a 2a 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b  ** called, invok
8810: 65 20 53 43 52 49 50 54 20 74 6f 20 65 76 61 6c  e SCRIPT to eval
8820: 75 61 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f  uate the functio
8830: 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  n..  */.  case D
8840: 42 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  B_FUNCTION: {.  
8850: 20 20 53 71 6c 46 75 6e 63 20 2a 70 46 75 6e 63    SqlFunc *pFunc
8860: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d  ;.    char *zNam
8870: 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 63  e;.    char *zSc
8880: 72 69 70 74 3b 0a 20 20 20 20 69 6e 74 20 6e 53  ript;.    int nS
8890: 63 72 69 70 74 3b 0a 20 20 20 20 69 66 28 20 6f  cript;.    if( o
88a0: 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20  bjc!=4 ){.      
88b0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
88c0: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
88d0: 2c 20 22 4e 41 4d 45 20 53 43 52 49 50 54 22 29  , "NAME SCRIPT")
88e0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
88f0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
8900: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f      zName = Tcl_
8910: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
8920: 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20  (objv[2], 0);.  
8930: 20 20 7a 53 63 72 69 70 74 20 3d 20 54 63 6c 5f    zScript = Tcl_
8940: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
8950: 28 6f 62 6a 76 5b 33 5d 2c 20 26 6e 53 63 72 69  (objv[3], &nScri
8960: 70 74 29 3b 0a 20 20 20 20 70 46 75 6e 63 20 3d  pt);.    pFunc =
8970: 20 28 53 71 6c 46 75 6e 63 2a 29 54 63 6c 5f 41   (SqlFunc*)Tcl_A
8980: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 46  lloc( sizeof(*pF
8990: 75 6e 63 29 20 2b 20 6e 53 63 72 69 70 74 20 2b  unc) + nScript +
89a0: 20 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70 46   1 );.    if( pF
89b0: 75 6e 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  unc==0 ) return 
89c0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 70  TCL_ERROR;.    p
89d0: 46 75 6e 63 2d 3e 69 6e 74 65 72 70 20 3d 20 69  Func->interp = i
89e0: 6e 74 65 72 70 3b 0a 20 20 20 20 70 46 75 6e 63  nterp;.    pFunc
89f0: 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e 70  ->pNext = pDb->p
8a00: 46 75 6e 63 3b 0a 20 20 20 20 70 46 75 6e 63 2d  Func;.    pFunc-
8a10: 3e 7a 53 63 72 69 70 74 20 3d 20 28 63 68 61 72  >zScript = (char
8a20: 2a 29 26 70 46 75 6e 63 5b 31 5d 3b 0a 20 20 20  *)&pFunc[1];.   
8a30: 20 70 44 62 2d 3e 70 46 75 6e 63 20 3d 20 70 46   pDb->pFunc = pF
8a40: 75 6e 63 3b 0a 20 20 20 20 73 74 72 63 70 79 28  unc;.    strcpy(
8a50: 70 46 75 6e 63 2d 3e 7a 53 63 72 69 70 74 2c 20  pFunc->zScript, 
8a60: 7a 53 63 72 69 70 74 29 3b 0a 20 20 20 20 72 63  zScript);.    rc
8a70: 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
8a80: 65 5f 66 75 6e 63 74 69 6f 6e 28 70 44 62 2d 3e  e_function(pDb->
8a90: 64 62 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53  db, zName, -1, S
8aa0: 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20 20 20  QLITE_UTF8,.    
8ab0: 20 20 20 20 70 46 75 6e 63 2c 20 74 63 6c 53 71      pFunc, tclSq
8ac0: 6c 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20  lFunc, 0, 0);.  
8ad0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
8ae0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
8af0: 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  = TCL_ERROR;.   
8b00: 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
8b10: 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
8b20: 29 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28  )sqlite3_errmsg(
8b30: 70 44 62 2d 3e 64 62 29 2c 20 54 43 4c 5f 56 4f  pDb->db), TCL_VO
8b40: 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 7d 65 6c  LATILE);.    }el
8b50: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4d 75 73  se{.      /* Mus
8b60: 74 20 66 6c 75 73 68 20 61 6e 79 20 63 61 63 68  t flush any cach
8b70: 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f  ed statements */
8b80: 0a 20 20 20 20 20 20 66 6c 75 73 68 53 74 6d 74  .      flushStmt
8b90: 43 61 63 68 65 28 20 70 44 62 20 29 3b 0a 20 20  Cache( pDb );.  
8ba0: 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
8bb0: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
8bc0: 20 20 24 64 62 20 6c 61 73 74 5f 69 6e 73 65 72    $db last_inser
8bd0: 74 5f 72 6f 77 69 64 20 0a 20 20 2a 2a 0a 20 20  t_rowid .  **.  
8be0: 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74  ** Return an int
8bf0: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
8c00: 65 20 52 4f 57 49 44 20 66 6f 72 20 74 68 65 20  e ROWID for the 
8c10: 6d 6f 73 74 20 72 65 63 65 6e 74 20 69 6e 73 65  most recent inse
8c20: 72 74 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  rt..  */.  case 
8c30: 44 42 5f 4c 41 53 54 5f 49 4e 53 45 52 54 5f 52  DB_LAST_INSERT_R
8c40: 4f 57 49 44 3a 20 7b 0a 20 20 20 20 54 63 6c 5f  OWID: {.    Tcl_
8c50: 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20  Obj *pResult;.  
8c60: 20 20 69 6e 74 20 72 6f 77 69 64 3b 0a 20 20 20    int rowid;.   
8c70: 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
8c80: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
8c90: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
8ca0: 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20  , objv, "");.   
8cb0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
8cc0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ROR;.    }.    r
8cd0: 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 6c  owid = sqlite3_l
8ce0: 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
8cf0: 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20 20 20 70  (pDb->db);.    p
8d00: 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74  Result = Tcl_Get
8d10: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
8d20: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 49 6e  );.    Tcl_SetIn
8d30: 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 72 6f  tObj(pResult, ro
8d40: 77 69 64 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  wid);.    break;
8d50: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
8d60: 54 68 65 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e  The DB_ONECOLUMN
8d70: 20 6d 65 74 68 6f 64 20 69 73 20 69 6d 70 6c 65   method is imple
8d80: 6d 65 6e 74 65 64 20 74 6f 67 65 74 68 65 72 20  mented together 
8d90: 77 69 74 68 20 44 42 5f 45 56 41 4c 2e 0a 20 20  with DB_EVAL..  
8da0: 2a 2f 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20  */..  /*    $db 
8db0: 70 72 6f 67 72 65 73 73 20 3f 4e 20 43 41 4c 4c  progress ?N CALL
8dc0: 42 41 43 4b 3f 0a 20 20 2a 2a 20 0a 20 20 2a 2a  BACK?.  ** .  **
8dd0: 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65   Invoke the give
8de0: 6e 20 63 61 6c 6c 62 61 63 6b 20 65 76 65 72 79  n callback every
8df0: 20 4e 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69   N virtual machi
8e00: 6e 65 20 6f 70 63 6f 64 65 73 20 77 68 69 6c 65  ne opcodes while
8e10: 20 65 78 65 63 75 74 69 6e 67 0a 20 20 2a 2a 20   executing.  ** 
8e20: 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20  queries..  */.  
8e30: 63 61 73 65 20 44 42 5f 50 52 4f 47 52 45 53 53  case DB_PROGRESS
8e40: 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  : {.    if( objc
8e50: 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==2 ){.      if(
8e60: 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20   pDb->zProgress 
8e70: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41  ){.        Tcl_A
8e80: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
8e90: 72 70 2c 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65  rp, pDb->zProgre
8ea0: 73 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ss, 0);.      }.
8eb0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62      }else if( ob
8ec0: 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 63  jc==4 ){.      c
8ed0: 68 61 72 20 2a 7a 50 72 6f 67 72 65 73 73 3b 0a  har *zProgress;.
8ee0: 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20        int len;. 
8ef0: 20 20 20 20 20 69 6e 74 20 4e 3b 0a 20 20 20 20       int N;.    
8f00: 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63    if( TCL_OK!=Tc
8f10: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
8f20: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
8f30: 20 26 4e 29 20 29 7b 0a 09 72 65 74 75 72 6e 20   &N) ){..return 
8f40: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
8f50: 20 7d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44   };.      if( pD
8f60: 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29 7b 0a  b->zProgress ){.
8f70: 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65          Tcl_Free
8f80: 28 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 29  (pDb->zProgress)
8f90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8fa0: 7a 50 72 6f 67 72 65 73 73 20 3d 20 54 63 6c 5f  zProgress = Tcl_
8fb0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
8fc0: 28 6f 62 6a 76 5b 33 5d 2c 20 26 6c 65 6e 29 3b  (objv[3], &len);
8fd0: 0a 20 20 20 20 20 20 69 66 28 20 7a 50 72 6f 67  .      if( zProg
8fe0: 72 65 73 73 20 26 26 20 6c 65 6e 3e 30 20 29 7b  ress && len>0 ){
8ff0: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 50  .        pDb->zP
9000: 72 6f 67 72 65 73 73 20 3d 20 54 63 6c 5f 41 6c  rogress = Tcl_Al
9010: 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a  loc( len + 1 );.
9020: 20 20 20 20 20 20 20 20 73 74 72 63 70 79 28 70          strcpy(p
9030: 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 2c 20 7a  Db->zProgress, z
9040: 50 72 6f 67 72 65 73 73 29 3b 0a 20 20 20 20 20  Progress);.     
9050: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
9060: 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 3d  pDb->zProgress =
9070: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e   0;.      }.#ifn
9080: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9090: 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43  PROGRESS_CALLBAC
90a0: 4b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  K.      if( pDb-
90b0: 3e 7a 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20  >zProgress ){.  
90c0: 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72        pDb->inter
90d0: 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20  p = interp;.    
90e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 67      sqlite3_prog
90f0: 72 65 73 73 5f 68 61 6e 64 6c 65 72 28 70 44 62  ress_handler(pDb
9100: 2d 3e 64 62 2c 20 4e 2c 20 44 62 50 72 6f 67 72  ->db, N, DbProgr
9110: 65 73 73 48 61 6e 64 6c 65 72 2c 20 70 44 62 29  essHandler, pDb)
9120: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
9130: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70         sqlite3_p
9140: 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65 72 28  rogress_handler(
9150: 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 2c 20 30  pDb->db, 0, 0, 0
9160: 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
9170: 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
9180: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
9190: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
91a0: 62 6a 76 2c 20 22 4e 20 43 41 4c 4c 42 41 43 4b  bjv, "N CALLBACK
91b0: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
91c0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
91d0: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
91e0: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20  ..  /*.  **     
91f0: 24 64 62 20 72 65 6b 65 79 20 4b 45 59 0a 20 20  $db rekey KEY.  
9200: 2a 2a 0a 20 20 2a 2a 20 43 68 61 6e 67 65 20 74  **.  ** Change t
9210: 68 65 20 65 6e 63 72 79 70 74 69 6f 6e 20 6b 65  he encryption ke
9220: 79 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  y on the current
9230: 6c 79 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  ly open database
9240: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
9250: 5f 52 45 4b 45 59 3a 20 7b 0a 20 20 20 20 69 6e  _REKEY: {.    in
9260: 74 20 6e 4b 65 79 3b 0a 20 20 20 20 76 6f 69 64  t nKey;.    void
9270: 20 2a 70 4b 65 79 3b 0a 20 20 20 20 69 66 28 20   *pKey;.    if( 
9280: 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20  objc!=3 ){.     
9290: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
92a0: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
92b0: 76 2c 20 22 4b 45 59 22 29 3b 0a 20 20 20 20 20  v, "KEY");.     
92c0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
92d0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65  R;.    }.    pKe
92e0: 79 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41  y = Tcl_GetByteA
92f0: 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  rrayFromObj(objv
9300: 5b 32 5d 2c 20 26 6e 4b 65 79 29 3b 0a 23 69 66  [2], &nKey);.#if
9310: 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
9320: 4f 44 45 43 0a 20 20 20 20 72 63 20 3d 20 73 71  ODEC.    rc = sq
9330: 6c 69 74 65 33 5f 72 65 6b 65 79 28 70 44 62 2d  lite3_rekey(pDb-
9340: 3e 64 62 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 29  >db, pKey, nKey)
9350: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
9360: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
9370: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73  Result(interp, s
9380: 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63 29  qlite3ErrStr(rc)
9390: 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  , 0);.      rc =
93a0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
93b0: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65  }.#endif.    bre
93c0: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
93d0: 2a 2a 20 20 20 20 20 24 64 62 20 74 69 6d 65 6f  **     $db timeo
93e0: 75 74 20 4d 49 4c 4c 45 53 45 43 4f 4e 44 53 0a  ut MILLESECONDS.
93f0: 20 20 2a 2a 0a 20 20 2a 2a 20 44 65 6c 61 79 20    **.  ** Delay 
9400: 66 6f 72 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  for the number o
9410: 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73  f milliseconds s
9420: 70 65 63 69 66 69 65 64 20 77 68 65 6e 20 61 20  pecified when a 
9430: 66 69 6c 65 20 69 73 20 6c 6f 63 6b 65 64 2e 0a  file is locked..
9440: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 54    */.  case DB_T
9450: 49 4d 45 4f 55 54 3a 20 7b 0a 20 20 20 20 69 6e  IMEOUT: {.    in
9460: 74 20 6d 73 3b 0a 20 20 20 20 69 66 28 20 6f 62  t ms;.    if( ob
9470: 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54  jc!=3 ){.      T
9480: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
9490: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
94a0: 20 22 4d 49 4c 4c 49 53 45 43 4f 4e 44 53 22 29   "MILLISECONDS")
94b0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
94c0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
94d0: 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49      if( Tcl_GetI
94e0: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
94f0: 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6d 73 29 20  , objv[2], &ms) 
9500: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
9510: 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  OR;.    sqlite3_
9520: 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 70 44 62  busy_timeout(pDb
9530: 2d 3e 64 62 2c 20 6d 73 29 3b 0a 20 20 20 20 62  ->db, ms);.    b
9540: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
9550: 20 20 2a 2a 20 20 20 20 20 24 64 62 20 6e 75 6c    **     $db nul
9560: 6c 76 61 6c 75 65 20 3f 53 54 52 49 4e 47 3f 0a  lvalue ?STRING?.
9570: 20 20 2a 2a 0a 20 20 2a 2a 20 43 68 61 6e 67 65    **.  ** Change
9580: 20 74 65 78 74 20 75 73 65 64 20 77 68 65 6e 20   text used when 
9590: 61 20 4e 55 4c 4c 20 63 6f 6d 65 73 20 62 61 63  a NULL comes bac
95a0: 6b 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  k from the datab
95b0: 61 73 65 2e 20 49 66 20 3f 53 54 52 49 4e 47 3f  ase. If ?STRING?
95c0: 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 72 65  .  ** is not pre
95d0: 73 65 6e 74 2c 20 74 68 65 6e 20 74 68 65 20 63  sent, then the c
95e0: 75 72 72 65 6e 74 20 73 74 72 69 6e 67 20 75 73  urrent string us
95f0: 65 64 20 66 6f 72 20 4e 55 4c 4c 20 69 73 20 72  ed for NULL is r
9600: 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2a 20 49 66  eturned..  ** If
9610: 20 53 54 52 49 4e 47 20 69 73 20 70 72 65 73 65   STRING is prese
9620: 6e 74 2c 20 74 68 65 6e 20 53 54 52 49 4e 47 20  nt, then STRING 
9630: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a  is returned..  *
9640: 2a 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  *.  */.  case DB
9650: 5f 4e 55 4c 4c 56 41 4c 55 45 3a 20 7b 0a 20 20  _NULLVALUE: {.  
9660: 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 26 26    if( objc!=2 &&
9670: 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
9680: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
9690: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
96a0: 6a 76 2c 20 22 4e 55 4c 4c 56 41 4c 55 45 22 29  jv, "NULLVALUE")
96b0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
96c0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
96d0: 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20      if( objc==3 
96e0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  ){.      int len
96f0: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e  ;.      char *zN
9700: 75 6c 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ull = Tcl_GetStr
9710: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
9720: 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20  2], &len);.     
9730: 20 69 66 28 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20   if( pDb->zNull 
9740: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46  ){.        Tcl_F
9750: 72 65 65 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29 3b  ree(pDb->zNull);
9760: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
9770: 66 28 20 7a 4e 75 6c 6c 20 26 26 20 6c 65 6e 3e  f( zNull && len>
9780: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  0 ){.        pDb
9790: 2d 3e 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f 41 6c  ->zNull = Tcl_Al
97a0: 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a  loc( len + 1 );.
97b0: 20 20 20 20 20 20 20 20 73 74 72 6e 63 70 79 28          strncpy(
97c0: 70 44 62 2d 3e 7a 4e 75 6c 6c 2c 20 7a 4e 75 6c  pDb->zNull, zNul
97d0: 6c 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 20 20 20  l, len);.       
97e0: 20 70 44 62 2d 3e 7a 4e 75 6c 6c 5b 6c 65 6e 5d   pDb->zNull[len]
97f0: 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 7d   = '\0';.      }
9800: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44  else{.        pD
9810: 62 2d 3e 7a 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20  b->zNull = 0;.  
9820: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
9830: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
9840: 28 69 6e 74 65 72 70 2c 20 64 62 54 65 78 74 54  (interp, dbTextT
9850: 6f 4f 62 6a 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29  oObj(pDb->zNull)
9860: 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
9870: 7d 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20  }.  .  /*.  **  
9880: 20 20 20 24 64 62 20 74 6f 74 61 6c 5f 63 68 61     $db total_cha
9890: 6e 67 65 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52  nges.  **.  ** R
98a0: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
98b0: 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 65   of rows that we
98c0: 72 65 20 6d 6f 64 69 66 69 65 64 2c 20 69 6e 73  re modified, ins
98d0: 65 72 74 65 64 2c 20 6f 72 20 64 65 6c 65 74 65  erted, or delete
98e0: 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74 68  d .  ** since th
98f0: 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
9900: 65 20 77 61 73 20 63 72 65 61 74 65 64 2e 0a 20  e was created.. 
9910: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 54 4f   */.  case DB_TO
9920: 54 41 4c 5f 43 48 41 4e 47 45 53 3a 20 7b 0a 20  TAL_CHANGES: {. 
9930: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73     Tcl_Obj *pRes
9940: 75 6c 74 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a  ult;.    if( obj
9950: 63 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=2 ){.      Tc
9960: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
9970: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
9980: 22 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  "");.      retur
9990: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
99a0: 20 7d 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d   }.    pResult =
99b0: 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c   Tcl_GetObjResul
99c0: 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54  t(interp);.    T
99d0: 63 6c 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52 65  cl_SetIntObj(pRe
99e0: 73 75 6c 74 2c 20 73 71 6c 69 74 65 33 5f 74 6f  sult, sqlite3_to
99f0: 74 61 6c 5f 63 68 61 6e 67 65 73 28 70 44 62 2d  tal_changes(pDb-
9a00: 3e 64 62 29 29 3b 0a 20 20 20 20 62 72 65 61 6b  >db));.    break
9a10: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24  ;.  }..  /*    $
9a20: 64 62 20 74 72 61 63 65 20 3f 43 41 4c 4c 42 41  db trace ?CALLBA
9a30: 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 61  CK?.  **.  ** Ma
9a40: 6b 65 20 61 72 72 61 6e 67 65 6d 65 6e 74 73 20  ke arrangements 
9a50: 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 43 41  to invoke the CA
9a60: 4c 4c 42 41 43 4b 20 72 6f 75 74 69 6e 65 20 66  LLBACK routine f
9a70: 6f 72 20 65 61 63 68 20 53 51 4c 20 73 74 61 74  or each SQL stat
9a80: 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 61 74 20  ement.  ** that 
9a90: 69 73 20 65 78 65 63 75 74 65 64 2e 20 20 54 68  is executed.  Th
9aa0: 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 53 51  e text of the SQ
9ab0: 4c 20 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f  L is appended to
9ac0: 20 43 41 4c 4c 42 41 43 4b 20 62 65 66 6f 72 65   CALLBACK before
9ad0: 0a 20 20 2a 2a 20 69 74 20 69 73 20 65 78 65 63  .  ** it is exec
9ae0: 75 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  uted..  */.  cas
9af0: 65 20 44 42 5f 54 52 41 43 45 3a 20 7b 0a 20 20  e DB_TRACE: {.  
9b00: 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a    if( objc>3 ){.
9b10: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
9b20: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
9b30: 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41  , objv, "?CALLBA
9b40: 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74  CK?");.      ret
9b50: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
9b60: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a     }else if( obj
9b70: 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66  c==2 ){.      if
9b80: 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b  ( pDb->zTrace ){
9b90: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70  .        Tcl_App
9ba0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
9bb0: 2c 20 70 44 62 2d 3e 7a 54 72 61 63 65 2c 20 30  , pDb->zTrace, 0
9bc0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
9bd0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72  else{.      char
9be0: 20 2a 7a 54 72 61 63 65 3b 0a 20 20 20 20 20 20   *zTrace;.      
9bf0: 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69  int len;.      i
9c00: 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29  f( pDb->zTrace )
9c10: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72  {.        Tcl_Fr
9c20: 65 65 28 70 44 62 2d 3e 7a 54 72 61 63 65 29 3b  ee(pDb->zTrace);
9c30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
9c40: 54 72 61 63 65 20 3d 20 54 63 6c 5f 47 65 74 53  Trace = Tcl_GetS
9c50: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
9c60: 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20  v[2], &len);.   
9c70: 20 20 20 69 66 28 20 7a 54 72 61 63 65 20 26 26     if( zTrace &&
9c80: 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20   len>0 ){.      
9c90: 20 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 3d 20    pDb->zTrace = 
9ca0: 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b  Tcl_Alloc( len +
9cb0: 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 73 74   1 );.        st
9cc0: 72 63 70 79 28 70 44 62 2d 3e 7a 54 72 61 63 65  rcpy(pDb->zTrace
9cd0: 2c 20 7a 54 72 61 63 65 29 3b 0a 20 20 20 20 20  , zTrace);.     
9ce0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
9cf0: 70 44 62 2d 3e 7a 54 72 61 63 65 20 3d 20 30 3b  pDb->zTrace = 0;
9d00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
9d10: 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29  f( pDb->zTrace )
9d20: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69  {.        pDb->i
9d30: 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a  nterp = interp;.
9d40: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
9d50: 74 72 61 63 65 28 70 44 62 2d 3e 64 62 2c 20 44  trace(pDb->db, D
9d60: 62 54 72 61 63 65 48 61 6e 64 6c 65 72 2c 20 70  bTraceHandler, p
9d70: 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Db);.      }else
9d80: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
9d90: 33 5f 74 72 61 63 65 28 70 44 62 2d 3e 64 62 2c  3_trace(pDb->db,
9da0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
9db0: 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
9dc0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64  .  }..  /*    $d
9dd0: 62 20 63 6f 70 79 20 63 6f 6e 66 6c 69 63 74 2d  b copy conflict-
9de0: 61 6c 67 6f 72 69 74 68 6d 20 74 61 62 6c 65 20  algorithm table 
9df0: 66 69 6c 65 6e 61 6d 65 20 3f 53 45 50 41 52 41  filename ?SEPARA
9e00: 54 4f 52 3f 20 3f 4e 55 4c 4c 49 4e 44 49 43 41  TOR? ?NULLINDICA
9e10: 54 4f 52 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43  TOR?.  **.  ** C
9e20: 6f 70 79 20 64 61 74 61 20 69 6e 74 6f 20 74 61  opy data into ta
9e30: 62 6c 65 20 66 72 6f 6d 20 66 69 6c 65 6e 61 6d  ble from filenam
9e40: 65 2c 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 75 73  e, optionally us
9e50: 69 6e 67 20 53 45 50 41 52 41 54 4f 52 0a 20 20  ing SEPARATOR.  
9e60: 2a 2a 20 61 73 20 63 6f 6c 75 6d 6e 20 73 65 70  ** as column sep
9e70: 61 72 61 74 6f 72 73 2e 20 20 49 66 20 61 20 63  arators.  If a c
9e80: 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61  olumn contains a
9e90: 20 6e 75 6c 6c 20 73 74 72 69 6e 67 2c 20 6f 72   null string, or
9ea0: 20 74 68 65 0a 20 20 2a 2a 20 76 61 6c 75 65 20   the.  ** value 
9eb0: 6f 66 20 4e 55 4c 4c 49 4e 44 49 43 41 54 4f 52  of NULLINDICATOR
9ec0: 2c 20 61 20 4e 55 4c 4c 20 69 73 20 69 6e 73 65  , a NULL is inse
9ed0: 72 74 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6c  rted for the col
9ee0: 75 6d 6e 2e 0a 20 20 2a 2a 20 63 6f 6e 66 6c 69  umn..  ** confli
9ef0: 63 74 2d 61 6c 67 6f 72 69 74 68 6d 20 69 73 20  ct-algorithm is 
9f00: 6f 6e 65 20 6f 66 20 74 68 65 20 73 71 6c 69 74  one of the sqlit
9f10: 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c 67 6f 72  e conflict algor
9f20: 69 74 68 6d 73 3a 0a 20 20 2a 2a 20 20 20 20 72  ithms:.  **    r
9f30: 6f 6c 6c 62 61 63 6b 2c 20 61 62 6f 72 74 2c 20  ollback, abort, 
9f40: 66 61 69 6c 2c 20 69 67 6e 6f 72 65 2c 20 72 65  fail, ignore, re
9f50: 70 6c 61 63 65 0a 20 20 2a 2a 20 4f 6e 20 73 75  place.  ** On su
9f60: 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20 74 68  ccess, return th
9f70: 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 69 6e 65  e number of line
9f80: 73 20 70 72 6f 63 65 73 73 65 64 2c 20 6e 6f 74  s processed, not
9f90: 20 6e 65 63 65 73 73 61 72 69 6c 79 20 73 61 6d   necessarily sam
9fa0: 65 0a 20 20 2a 2a 20 61 73 20 27 64 62 20 63 68  e.  ** as 'db ch
9fb0: 61 6e 67 65 73 27 20 64 75 65 20 74 6f 20 63 6f  anges' due to co
9fc0: 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d  nflict-algorithm
9fd0: 20 73 65 6c 65 63 74 65 64 2e 0a 20 20 2a 2a 0a   selected..  **.
9fe0: 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 69    ** This code i
9ff0: 73 20 62 61 73 69 63 61 6c 6c 79 20 61 6e 20 69  s basically an i
a000: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2f 65 6e  mplementation/en
a010: 68 61 6e 63 65 6d 65 6e 74 20 6f 66 0a 20 20 2a  hancement of.  *
a020: 2a 20 74 68 65 20 73 71 6c 69 74 65 33 20 73 68  * the sqlite3 sh
a030: 65 6c 6c 2e 63 20 22 2e 69 6d 70 6f 72 74 22 20  ell.c ".import" 
a040: 63 6f 6d 6d 61 6e 64 2e 0a 20 20 2a 2a 0a 20 20  command..  **.  
a050: 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ** This command 
a060: 75 73 61 67 65 20 69 73 20 65 71 75 69 76 61 6c  usage is equival
a070: 65 6e 74 20 74 6f 20 74 68 65 20 73 71 6c 69 74  ent to the sqlit
a080: 65 32 2e 78 20 43 4f 50 59 20 73 74 61 74 65 6d  e2.x COPY statem
a090: 65 6e 74 2c 0a 20 20 2a 2a 20 77 68 69 63 68 20  ent,.  ** which 
a0a0: 69 6d 70 6f 72 74 73 20 66 69 6c 65 20 64 61 74  imports file dat
a0b0: 61 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 75  a into a table u
a0c0: 73 69 6e 67 20 74 68 65 20 50 6f 73 74 67 72 65  sing the Postgre
a0d0: 53 51 4c 20 43 4f 50 59 20 66 69 6c 65 20 66 6f  SQL COPY file fo
a0e0: 72 6d 61 74 3a 0a 20 20 2a 2a 20 20 20 24 64 62  rmat:.  **   $db
a0f0: 20 63 6f 70 79 20 24 63 6f 6e 66 6c 69 74 5f 61   copy $conflit_a
a100: 6c 67 6f 20 24 74 61 62 6c 65 5f 6e 61 6d 65 20  lgo $table_name 
a110: 24 66 69 6c 65 6e 61 6d 65 20 5c 74 20 5c 5c 4e  $filename \t \\N
a120: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
a130: 43 4f 50 59 3a 20 7b 0a 20 20 20 20 63 68 61 72  COPY: {.    char
a140: 20 2a 7a 54 61 62 6c 65 3b 20 20 20 20 20 20 20   *zTable;       
a150: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72          /* Inser
a160: 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68 69 73  t data into this
a170: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 63 68   table */.    ch
a180: 61 72 20 2a 7a 46 69 6c 65 3b 20 20 20 20 20 20  ar *zFile;      
a190: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
a1a0: 20 66 69 6c 65 20 66 72 6f 6d 20 77 68 69 63 68   file from which
a1b0: 20 74 6f 20 65 78 74 72 61 63 74 20 64 61 74 61   to extract data
a1c0: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 43   */.    char *zC
a1d0: 6f 6e 66 6c 69 63 74 3b 20 20 20 20 20 20 20 20  onflict;        
a1e0: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 66 6c      /* The confl
a1f0: 69 63 74 20 61 6c 67 6f 72 69 74 68 6d 20 74 6f  ict algorithm to
a200: 20 75 73 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69   use */.    sqli
a210: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
a220: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 74 61          /* A sta
a230: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e  tement */.    in
a240: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
a250: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
a260: 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 20 20  ult code */.    
a270: 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20  int nCol;       
a280: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
a290: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
a2a0: 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   in the table */
a2b0: 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 20  .    int nByte; 
a2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2d0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
a2e0: 74 65 73 20 69 6e 20 61 6e 20 53 51 4c 20 73 74  tes in an SQL st
a2f0: 72 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ring */.    int 
a300: 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
a310: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
a320: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 20 20  counters */.    
a330: 69 6e 74 20 6e 53 65 70 3b 20 20 20 20 20 20 20  int nSep;       
a340: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
a350: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
a360: 6e 20 7a 53 65 70 5b 5d 20 2a 2f 0a 20 20 20 20  n zSep[] */.    
a370: 69 6e 74 20 6e 4e 75 6c 6c 3b 20 20 20 20 20 20  int nNull;      
a380: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
a390: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
a3a0: 6e 20 7a 4e 75 6c 6c 5b 5d 20 2a 2f 0a 20 20 20  n zNull[] */.   
a3b0: 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20   char *zSql;    
a3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a3d0: 41 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  An SQL statement
a3e0: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4c   */.    char *zL
a3f0: 69 6e 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ine;            
a400: 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
a410: 6c 69 6e 65 20 6f 66 20 69 6e 70 75 74 20 66 72  line of input fr
a420: 6f 6d 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20  om the file */. 
a430: 20 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 3b     char **azCol;
a440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a450: 2a 20 7a 4c 69 6e 65 5b 5d 20 62 72 6f 6b 65 6e  * zLine[] broken
a460: 20 75 70 20 69 6e 74 6f 20 63 6f 6c 75 6d 6e 73   up into columns
a470: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 43   */.    char *zC
a480: 6f 6d 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20  ommit;          
a490: 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 63 6f      /* How to co
a4a0: 6d 6d 69 74 20 63 68 61 6e 67 65 73 20 2a 2f 0a  mmit changes */.
a4b0: 20 20 20 20 46 49 4c 45 20 2a 69 6e 3b 20 20 20      FILE *in;   
a4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4d0: 2f 2a 20 54 68 65 20 69 6e 70 75 74 20 66 69 6c  /* The input fil
a4e0: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 69 6e  e */.    int lin
a4f0: 65 6e 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20  eno = 0;        
a500: 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d       /* Line num
a510: 62 65 72 20 6f 66 20 69 6e 70 75 74 20 66 69 6c  ber of input fil
a520: 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 7a 4c  e */.    char zL
a530: 69 6e 65 4e 75 6d 5b 38 30 5d 3b 20 20 20 20 20  ineNum[80];     
a540: 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d       /* Line num
a550: 62 65 72 20 70 72 69 6e 74 20 62 75 66 66 65 72  ber print buffer
a560: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20   */.    Tcl_Obj 
a570: 2a 70 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20  *pResult;       
a580: 20 20 20 20 2f 2a 20 69 6e 74 65 72 70 20 72 65      /* interp re
a590: 73 75 6c 74 20 2a 2f 0a 0a 20 20 20 20 63 68 61  sult */..    cha
a5a0: 72 20 2a 7a 53 65 70 3b 0a 20 20 20 20 63 68 61  r *zSep;.    cha
a5b0: 72 20 2a 7a 4e 75 6c 6c 3b 0a 20 20 20 20 69 66  r *zNull;.    if
a5c0: 28 20 6f 62 6a 63 3c 35 20 7c 7c 20 6f 62 6a 63  ( objc<5 || objc
a5d0: 3e 37 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  >7 ){.      Tcl_
a5e0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
a5f0: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 0a 20  erp, 2, objv, . 
a600: 20 20 20 20 20 20 20 20 22 43 4f 4e 46 4c 49 43          "CONFLIC
a610: 54 2d 41 4c 47 4f 52 49 54 48 4d 20 54 41 42 4c  T-ALGORITHM TABL
a620: 45 20 46 49 4c 45 4e 41 4d 45 20 3f 53 45 50 41  E FILENAME ?SEPA
a630: 52 41 54 4f 52 3f 20 3f 4e 55 4c 4c 49 4e 44 49  RATOR? ?NULLINDI
a640: 43 41 54 4f 52 3f 22 29 3b 0a 20 20 20 20 20 20  CATOR?");.      
a650: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
a660: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
a670: 6f 62 6a 63 3e 3d 36 20 29 7b 0a 20 20 20 20 20  objc>=6 ){.     
a680: 20 7a 53 65 70 20 3d 20 54 63 6c 5f 47 65 74 53   zSep = Tcl_GetS
a690: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
a6a0: 76 5b 35 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 65  v[5], 0);.    }e
a6b0: 6c 73 65 7b 0a 20 20 20 20 20 20 7a 53 65 70 20  lse{.      zSep 
a6c0: 3d 20 22 5c 74 22 3b 0a 20 20 20 20 7d 0a 20 20  = "\t";.    }.  
a6d0: 20 20 69 66 28 20 6f 62 6a 63 3e 3d 37 20 29 7b    if( objc>=7 ){
a6e0: 0a 20 20 20 20 20 20 7a 4e 75 6c 6c 20 3d 20 54  .      zNull = T
a6f0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
a700: 4f 62 6a 28 6f 62 6a 76 5b 36 5d 2c 20 30 29 3b  Obj(objv[6], 0);
a710: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
a720: 20 20 7a 4e 75 6c 6c 20 3d 20 22 22 3b 0a 20 20    zNull = "";.  
a730: 20 20 7d 0a 20 20 20 20 7a 43 6f 6e 66 6c 69 63    }.    zConflic
a740: 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  t = Tcl_GetStrin
a750: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
a760: 2c 20 30 29 3b 0a 20 20 20 20 7a 54 61 62 6c 65  , 0);.    zTable
a770: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
a780: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c  FromObj(objv[3],
a790: 20 30 29 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d   0);.    zFile =
a7a0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
a7b0: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 34 5d 2c 20 30  omObj(objv[4], 0
a7c0: 29 3b 0a 20 20 20 20 6e 53 65 70 20 3d 20 73 74  );.    nSep = st
a7d0: 72 6c 65 6e 28 7a 53 65 70 29 3b 0a 20 20 20 20  rlen(zSep);.    
a7e0: 6e 4e 75 6c 6c 20 3d 20 73 74 72 6c 65 6e 28 7a  nNull = strlen(z
a7f0: 4e 75 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 6e  Null);.    if( n
a800: 53 65 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Sep==0 ){.      
a810: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
a820: 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a  (interp, "Error:
a830: 20 6e 6f 6e 2d 6e 75 6c 6c 20 73 65 70 61 72 61   non-null separa
a840: 74 6f 72 20 72 65 71 75 69 72 65 64 20 66 6f 72  tor required for
a850: 20 63 6f 70 79 22 2c 20 30 29 3b 0a 20 20 20 20   copy", 0);.    
a860: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
a870: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OR;.    }.    if
a880: 28 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  (sqlite3StrICmp(
a890: 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 72 6f 6c 6c  zConflict, "roll
a8a0: 62 61 63 6b 22 29 20 21 3d 20 30 20 26 26 0a 20  back") != 0 &&. 
a8b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72        sqlite3Str
a8c0: 49 43 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20  ICmp(zConflict, 
a8d0: 22 61 62 6f 72 74 22 20 20 20 29 20 21 3d 20 30  "abort"   ) != 0
a8e0: 20 26 26 0a 20 20 20 20 20 20 20 73 71 6c 69 74   &&.       sqlit
a8f0: 65 33 53 74 72 49 43 6d 70 28 7a 43 6f 6e 66 6c  e3StrICmp(zConfl
a900: 69 63 74 2c 20 22 66 61 69 6c 22 20 20 20 20 29  ict, "fail"    )
a910: 20 21 3d 20 30 20 26 26 0a 20 20 20 20 20 20 20   != 0 &&.       
a920: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
a930: 43 6f 6e 66 6c 69 63 74 2c 20 22 69 67 6e 6f 72  Conflict, "ignor
a940: 65 22 20 20 29 20 21 3d 20 30 20 26 26 0a 20 20  e"  ) != 0 &&.  
a950: 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 49       sqlite3StrI
a960: 43 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22  Cmp(zConflict, "
a970: 72 65 70 6c 61 63 65 22 20 29 20 21 3d 20 30 20  replace" ) != 0 
a980: 29 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  ) {.      Tcl_Ap
a990: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
a9a0: 70 2c 20 22 45 72 72 6f 72 3a 20 5c 22 22 2c 20  p, "Error: \"", 
a9b0: 7a 43 6f 6e 66 6c 69 63 74 2c 20 0a 20 20 20 20  zConflict, .    
a9c0: 20 20 20 20 20 20 20 20 22 5c 22 2c 20 63 6f 6e          "\", con
a9d0: 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d 20  flict-algorithm 
a9e0: 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 3a 20  must be one of: 
a9f0: 72 6f 6c 6c 62 61 63 6b 2c 20 22 0a 20 20 20 20  rollback, ".    
aa00: 20 20 20 20 20 20 20 20 22 61 62 6f 72 74 2c 20          "abort, 
aa10: 66 61 69 6c 2c 20 69 67 6e 6f 72 65 2c 20 6f 72  fail, ignore, or
aa20: 20 72 65 70 6c 61 63 65 22 2c 20 30 29 3b 0a 20   replace", 0);. 
aa30: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
aa40: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
aa50: 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
aa60: 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20  mprintf("SELECT 
aa70: 2a 20 46 52 4f 4d 20 27 25 71 27 22 2c 20 7a 54  * FROM '%q'", zT
aa80: 61 62 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 7a  able);.    if( z
aa90: 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Sql==0 ){.      
aaa0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
aab0: 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a  (interp, "Error:
aac0: 20 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20   no such table: 
aad0: 22 2c 20 7a 54 61 62 6c 65 2c 20 30 29 3b 0a 20  ", zTable, 0);. 
aae0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
aaf0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
ab00: 20 6e 42 79 74 65 20 3d 20 73 74 72 6c 65 6e 28   nByte = strlen(
ab10: 7a 53 71 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20  zSql);.    rc = 
ab20: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28  sqlite3_prepare(
ab30: 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 30  pDb->db, zSql, 0
ab40: 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
ab50: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
ab60: 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Sql);.    if( rc
ab70: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
ab80: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
ab90: 70 2c 20 22 45 72 72 6f 72 3a 20 22 2c 20 73 71  p, "Error: ", sq
aba0: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62  lite3_errmsg(pDb
abb0: 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 20  ->db), 0);.     
abc0: 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7d   nCol = 0;.    }
abd0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 43 6f 6c  else{.      nCol
abe0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
abf0: 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a  n_count(pStmt);.
ac00: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
ac10: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
ac20: 29 3b 0a 20 20 20 20 69 66 28 20 6e 43 6f 6c 3d  );.    if( nCol=
ac30: 3d 30 20 29 20 7b 0a 20 20 20 20 20 20 72 65 74  =0 ) {.      ret
ac40: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
ac50: 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d 20     }.    zSql = 
ac60: 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 2b 20  malloc( nByte + 
ac70: 35 30 20 2b 20 6e 43 6f 6c 2a 32 20 29 3b 0a 20  50 + nCol*2 );. 
ac80: 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29     if( zSql==0 )
ac90: 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70   {.      Tcl_App
aca0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
acb0: 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 27 74 20  , "Error: can't 
acc0: 6d 61 6c 6c 6f 63 28 29 22 2c 20 30 29 3b 0a 20  malloc()", 0);. 
acd0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
ace0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
acf0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
ad00: 66 28 6e 42 79 74 65 2b 35 30 2c 20 7a 53 71 6c  f(nByte+50, zSql
ad10: 2c 20 22 49 4e 53 45 52 54 20 4f 52 20 25 71 20  , "INSERT OR %q 
ad20: 49 4e 54 4f 20 27 25 71 27 20 56 41 4c 55 45 53  INTO '%q' VALUES
ad30: 28 3f 22 2c 0a 20 20 20 20 20 20 20 20 20 7a 43  (?",.         zC
ad40: 6f 6e 66 6c 69 63 74 2c 20 7a 54 61 62 6c 65 29  onflict, zTable)
ad50: 3b 0a 20 20 20 20 6a 20 3d 20 73 74 72 6c 65 6e  ;.    j = strlen
ad60: 28 7a 53 71 6c 29 3b 0a 20 20 20 20 66 6f 72 28  (zSql);.    for(
ad70: 69 3d 31 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=1; i<nCol; i++
ad80: 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b  ){.      zSql[j+
ad90: 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20  +] = ',';.      
ada0: 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 3f 27 3b  zSql[j++] = '?';
adb0: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 5b  .    }.    zSql[
adc0: 6a 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20  j++] = ')';.    
add0: 7a 53 71 6c 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20  zSql[j] = 0;.   
ade0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
adf0: 65 70 61 72 65 28 70 44 62 2d 3e 64 62 2c 20 7a  epare(pDb->db, z
ae00: 53 71 6c 2c 20 30 2c 20 26 70 53 74 6d 74 2c 20  Sql, 0, &pStmt, 
ae10: 30 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 53 71  0);.    free(zSq
ae20: 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  l);.    if( rc )
ae30: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
ae40: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
ae50: 20 22 45 72 72 6f 72 3a 20 22 2c 20 73 71 6c 69   "Error: ", sqli
ae60: 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e  te3_errmsg(pDb->
ae70: 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  db), 0);.      s
ae80: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
ae90: 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 65  pStmt);.      re
aea0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
aeb0: 20 20 20 20 7d 0a 20 20 20 20 69 6e 20 3d 20 66      }.    in = f
aec0: 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 22 72 62 22  open(zFile, "rb"
aed0: 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 3d 3d 30  );.    if( in==0
aee0: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
aef0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
af00: 70 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f  p, "Error: canno
af10: 74 20 6f 70 65 6e 20 66 69 6c 65 3a 20 22 2c 20  t open file: ", 
af20: 7a 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 20 20  zFile, NULL);.  
af30: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
af40: 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
af50: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
af60: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  ROR;.    }.    a
af70: 7a 43 6f 6c 20 3d 20 6d 61 6c 6c 6f 63 28 20 73  zCol = malloc( s
af80: 69 7a 65 6f 66 28 61 7a 43 6f 6c 5b 30 5d 29 2a  izeof(azCol[0])*
af90: 28 6e 43 6f 6c 2b 31 29 20 29 3b 0a 20 20 20 20  (nCol+1) );.    
afa0: 69 66 28 20 61 7a 43 6f 6c 3d 3d 30 20 29 20 7b  if( azCol==0 ) {
afb0: 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
afc0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
afd0: 22 45 72 72 6f 72 3a 20 63 61 6e 27 74 20 6d 61  "Error: can't ma
afe0: 6c 6c 6f 63 28 29 22 2c 20 30 29 3b 0a 20 20 20  lloc()", 0);.   
aff0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
b000: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ROR;.    }.    s
b010: 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d  qlite3_exec(pDb-
b020: 3e 64 62 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c  >db, "BEGIN", 0,
b030: 20 30 2c 20 30 29 3b 0a 20 20 20 20 7a 43 6f 6d   0, 0);.    zCom
b040: 6d 69 74 20 3d 20 22 43 4f 4d 4d 49 54 22 3b 0a  mit = "COMMIT";.
b050: 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4c 69 6e      while( (zLin
b060: 65 20 3d 20 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e  e = local_getlin
b070: 65 28 30 2c 20 69 6e 29 29 21 3d 30 20 29 7b 0a  e(0, in))!=0 ){.
b080: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20        char *z;. 
b090: 20 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 20 20       i = 0;.    
b0a0: 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20    lineno++;.    
b0b0: 20 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20 7a 4c 69    azCol[0] = zLi
b0c0: 6e 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ne;.      for(i=
b0d0: 30 2c 20 7a 3d 7a 4c 69 6e 65 3b 20 2a 7a 3b 20  0, z=zLine; *z; 
b0e0: 7a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  z++){.        if
b0f0: 28 20 2a 7a 3d 3d 7a 53 65 70 5b 30 5d 20 26 26  ( *z==zSep[0] &&
b100: 20 73 74 72 6e 63 6d 70 28 7a 2c 20 7a 53 65 70   strncmp(z, zSep
b110: 2c 20 6e 53 65 70 29 3d 3d 30 20 29 7b 0a 20 20  , nSep)==0 ){.  
b120: 20 20 20 20 20 20 20 20 2a 7a 20 3d 20 30 3b 0a          *z = 0;.
b130: 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20            i++;. 
b140: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e           if( i<n
b150: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Col ){.         
b160: 20 20 20 61 7a 43 6f 6c 5b 69 5d 20 3d 20 26 7a     azCol[i] = &z
b170: 5b 6e 53 65 70 5d 3b 0a 20 20 20 20 20 20 20 20  [nSep];.        
b180: 20 20 20 20 7a 20 2b 3d 20 6e 53 65 70 2d 31 3b      z += nSep-1;
b190: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
b1a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
b1b0: 20 20 20 20 20 69 66 28 20 69 2b 31 21 3d 6e 43       if( i+1!=nC
b1c0: 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  ol ){.        ch
b1d0: 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20 20 20  ar *zErr;.      
b1e0: 20 20 7a 45 72 72 20 3d 20 6d 61 6c 6c 6f 63 28    zErr = malloc(
b1f0: 32 30 30 20 2b 20 73 74 72 6c 65 6e 28 7a 46 69  200 + strlen(zFi
b200: 6c 65 29 29 3b 0a 20 20 20 20 20 20 20 20 73 70  le));.        sp
b210: 72 69 6e 74 66 28 7a 45 72 72 2c 22 45 72 72 6f  rintf(zErr,"Erro
b220: 72 3a 20 25 73 20 6c 69 6e 65 20 25 64 3a 20 65  r: %s line %d: e
b230: 78 70 65 63 74 65 64 20 25 64 20 63 6f 6c 75 6d  xpected %d colum
b240: 6e 73 20 6f 66 20 64 61 74 61 20 62 75 74 20 66  ns of data but f
b250: 6f 75 6e 64 20 25 64 22 2c 0a 20 20 20 20 20 20  ound %d",.      
b260: 20 20 20 20 20 7a 46 69 6c 65 2c 20 6c 69 6e 65       zFile, line
b270: 6e 6f 2c 20 6e 43 6f 6c 2c 20 69 2b 31 29 3b 0a  no, nCol, i+1);.
b280: 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65          Tcl_Appe
b290: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
b2a0: 20 7a 45 72 72 2c 20 30 29 3b 0a 20 20 20 20 20   zErr, 0);.     
b2b0: 20 20 20 66 72 65 65 28 7a 45 72 72 29 3b 0a 20     free(zErr);. 
b2c0: 20 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d         zCommit =
b2d0: 20 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20   "ROLLBACK";.   
b2e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b2f0: 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d    }.      for(i=
b300: 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
b310: 0a 20 20 20 20 20 20 20 20 2f 2a 20 63 68 65 63  .        /* chec
b320: 6b 20 66 6f 72 20 6e 75 6c 6c 20 64 61 74 61 2c  k for null data,
b330: 20 69 66 20 73 6f 2c 20 62 69 6e 64 20 61 73 20   if so, bind as 
b340: 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20  null */.        
b350: 69 66 20 28 28 6e 4e 75 6c 6c 3e 30 20 26 26 20  if ((nNull>0 && 
b360: 73 74 72 63 6d 70 28 61 7a 43 6f 6c 5b 69 5d 2c  strcmp(azCol[i],
b370: 20 7a 4e 75 6c 6c 29 3d 3d 30 29 20 7c 7c 20 73   zNull)==0) || s
b380: 74 72 6c 65 6e 28 61 7a 43 6f 6c 5b 69 5d 29 3d  trlen(azCol[i])=
b390: 3d 30 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  =0) {.          
b3a0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c  sqlite3_bind_nul
b3b0: 6c 28 70 53 74 6d 74 2c 20 69 2b 31 29 3b 0a 20  l(pStmt, i+1);. 
b3c0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
b3d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
b3e0: 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c  bind_text(pStmt,
b3f0: 20 69 2b 31 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 20   i+1, azCol[i], 
b400: 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  -1, SQLITE_STATI
b410: 43 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  C);.        }.  
b420: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
b430: 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b  te3_step(pStmt);
b440: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
b450: 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29  te3_reset(pStmt)
b460: 3b 0a 20 20 20 20 20 20 66 72 65 65 28 7a 4c 69  ;.      free(zLi
b470: 6e 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ne);.      if( r
b480: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
b490: 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65          Tcl_Appe
b4a0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
b4b0: 22 45 72 72 6f 72 3a 20 22 2c 20 73 71 6c 69 74  "Error: ", sqlit
b4c0: 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64  e3_errmsg(pDb->d
b4d0: 62 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  b), 0);.        
b4e0: 7a 43 6f 6d 6d 69 74 20 3d 20 22 52 4f 4c 4c 42  zCommit = "ROLLB
b4f0: 41 43 4b 22 3b 0a 20 20 20 20 20 20 20 20 62 72  ACK";.        br
b500: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
b510: 20 7d 0a 20 20 20 20 66 72 65 65 28 61 7a 43 6f   }.    free(azCo
b520: 6c 29 3b 0a 20 20 20 20 66 63 6c 6f 73 65 28 69  l);.    fclose(i
b530: 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  n);.    sqlite3_
b540: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
b550: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65  .    sqlite3_exe
b560: 63 28 70 44 62 2d 3e 64 62 2c 20 7a 43 6f 6d 6d  c(pDb->db, zComm
b570: 69 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 0a 20  it, 0, 0, 0);.. 
b580: 20 20 20 69 66 28 20 7a 43 6f 6d 6d 69 74 5b 30     if( zCommit[0
b590: 5d 20 3d 3d 20 27 43 27 20 29 7b 0a 20 20 20 20  ] == 'C' ){.    
b5a0: 20 20 2f 2a 20 73 75 63 63 65 73 73 2c 20 73 65    /* success, se
b5b0: 74 20 72 65 73 75 6c 74 20 61 73 20 6e 75 6d 62  t result as numb
b5c0: 65 72 20 6f 66 20 6c 69 6e 65 73 20 70 72 6f 63  er of lines proc
b5d0: 65 73 73 65 64 20 2a 2f 0a 20 20 20 20 20 20 70  essed */.      p
b5e0: 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74  Result = Tcl_Get
b5f0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
b600: 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  );.      Tcl_Set
b610: 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20  IntObj(pResult, 
b620: 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20 72  lineno);.      r
b630: 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20  c = TCL_OK;.    
b640: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
b650: 66 61 69 6c 75 72 65 2c 20 61 70 70 65 6e 64 20  failure, append 
b660: 6c 69 6e 65 6e 6f 20 77 68 65 72 65 20 66 61 69  lineno where fai
b670: 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 73 70 72  led */.      spr
b680: 69 6e 74 66 28 7a 4c 69 6e 65 4e 75 6d 2c 22 25  intf(zLineNum,"%
b690: 64 22 2c 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20  d",lineno);.    
b6a0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
b6b0: 6c 74 28 69 6e 74 65 72 70 2c 22 2c 20 66 61 69  lt(interp,", fai
b6c0: 6c 65 64 20 77 68 69 6c 65 20 70 72 6f 63 65 73  led while proces
b6d0: 73 69 6e 67 20 6c 69 6e 65 3a 20 22 2c 7a 4c 69  sing line: ",zLi
b6e0: 6e 65 4e 75 6d 2c 30 29 3b 0a 20 20 20 20 20 20  neNum,0);.      
b6f0: 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  rc = TCL_ERROR;.
b700: 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
b710: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64  .  }..  /*    $d
b720: 62 20 76 65 72 73 69 6f 6e 0a 20 20 2a 2a 0a 20  b version.  **. 
b730: 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76   ** Return the v
b740: 65 72 73 69 6f 6e 20 73 74 72 69 6e 67 20 66 6f  ersion string fo
b750: 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65 2e  r this database.
b760: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
b770: 56 45 52 53 49 4f 4e 3a 20 7b 0a 20 20 20 20 54  VERSION: {.    T
b780: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
b790: 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c  erp, (char *)sql
b7a0: 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28  ite3_libversion(
b7b0: 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  ), TCL_STATIC);.
b7c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
b7d0: 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 6f 66 20 74  .  } /* End of t
b7e0: 68 65 20 53 57 49 54 43 48 20 73 74 61 74 65 6d  he SWITCH statem
b7f0: 65 6e 74 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ent */.  return 
b800: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 73  rc;.}../*.**   s
b810: 71 6c 69 74 65 33 20 44 42 4e 41 4d 45 20 46 49  qlite3 DBNAME FI
b820: 4c 45 4e 41 4d 45 20 3f 4d 4f 44 45 3f 20 3f 2d  LENAME ?MODE? ?-
b830: 6b 65 79 20 4b 45 59 3f 0a 2a 2a 0a 2a 2a 20 54  key KEY?.**.** T
b840: 68 69 73 20 69 73 20 74 68 65 20 6d 61 69 6e 20  his is the main 
b850: 54 63 6c 20 63 6f 6d 6d 61 6e 64 2e 20 20 57 68  Tcl command.  Wh
b860: 65 6e 20 74 68 65 20 22 73 71 6c 69 74 65 22 20  en the "sqlite" 
b870: 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a  Tcl command is.*
b880: 2a 20 69 6e 76 6f 6b 65 64 2c 20 74 68 69 73 20  * invoked, this 
b890: 72 6f 75 74 69 6e 65 20 72 75 6e 73 20 74 6f 20  routine runs to 
b8a0: 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 6f 6d  process that com
b8b0: 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  mand..**.** The 
b8c0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2c 20  first argument, 
b8d0: 44 42 4e 41 4d 45 2c 20 69 73 20 61 6e 20 61 72  DBNAME, is an ar
b8e0: 62 69 74 72 61 72 79 20 6e 61 6d 65 20 66 6f 72  bitrary name for
b8f0: 20 61 20 6e 65 77 0a 2a 2a 20 64 61 74 61 62 61   a new.** databa
b900: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20  se connection.  
b910: 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 63 72 65  This command cre
b920: 61 74 65 73 20 61 20 6e 65 77 20 63 6f 6d 6d 61  ates a new comma
b930: 6e 64 20 6e 61 6d 65 64 0a 2a 2a 20 44 42 4e 41  nd named.** DBNA
b940: 4d 45 20 74 68 61 74 20 69 73 20 75 73 65 64 20  ME that is used 
b950: 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 61 74 20  to control that 
b960: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 54 68 65  connection.  The
b970: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e   database.** con
b980: 6e 65 63 74 69 6f 6e 20 69 73 20 64 65 6c 65 74  nection is delet
b990: 65 64 20 77 68 65 6e 20 74 68 65 20 44 42 4e 41  ed when the DBNA
b9a0: 4d 45 20 63 6f 6d 6d 61 6e 64 20 69 73 20 64 65  ME command is de
b9b0: 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  leted..**.** The
b9c0: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
b9d0: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
b9e0: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 68  the directory th
b9f0: 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74  at contains.** t
ba00: 68 65 20 73 71 6c 69 74 65 20 64 61 74 61 62 61  he sqlite databa
ba10: 73 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65  se that is to be
ba20: 20 61 63 63 65 73 73 65 64 2e 0a 2a 2a 0a 2a 2a   accessed..**.**
ba30: 20 46 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72   For testing pur
ba40: 70 6f 73 65 73 2c 20 77 65 20 61 6c 73 6f 20 73  poses, we also s
ba50: 75 70 70 6f 72 74 20 74 68 65 20 66 6f 6c 6c 6f  upport the follo
ba60: 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 73 71 6c  wing:.**.**  sql
ba70: 69 74 65 33 20 2d 65 6e 63 6f 64 69 6e 67 0a 2a  ite3 -encoding.*
ba80: 2a 0a 2a 2a 20 20 20 20 20 20 20 52 65 74 75 72  *.**       Retur
ba90: 6e 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 75  n the encoding u
baa0: 73 65 64 20 62 79 20 4c 49 4b 45 20 61 6e 64 20  sed by LIKE and 
bab0: 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 73 2e 20  GLOB operators. 
bac0: 20 43 68 6f 69 63 65 73 0a 2a 2a 20 20 20 20 20   Choices.**     
bad0: 20 20 61 72 65 20 55 54 46 2d 38 20 61 6e 64 20    are UTF-8 and 
bae0: 69 73 6f 38 38 35 39 2e 0a 2a 2a 0a 2a 2a 20 20  iso8859..**.**  
baf0: 73 71 6c 69 74 65 33 20 2d 76 65 72 73 69 6f 6e  sqlite3 -version
bb00: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 52 65 74  .**.**       Ret
bb10: 75 72 6e 20 74 68 65 20 76 65 72 73 69 6f 6e 20  urn the version 
bb20: 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 53 51  number of the SQ
bb30: 4c 69 74 65 20 6c 69 62 72 61 72 79 2e 0a 2a 2a  Lite library..**
bb40: 0a 2a 2a 20 20 73 71 6c 69 74 65 33 20 2d 74 63  .**  sqlite3 -tc
bb50: 6c 2d 75 73 65 73 2d 75 74 66 0a 2a 2a 0a 2a 2a  l-uses-utf.**.**
bb60: 20 20 20 20 20 20 20 52 65 74 75 72 6e 20 22 31         Return "1
bb70: 22 20 69 66 20 63 6f 6d 70 69 6c 65 64 20 77 69  " if compiled wi
bb80: 74 68 20 61 20 54 63 6c 20 75 73 65 73 20 55 54  th a Tcl uses UT
bb90: 46 2d 38 2e 20 20 52 65 74 75 72 6e 20 22 30 22  F-8.  Return "0"
bba0: 20 69 66 0a 2a 2a 20 20 20 20 20 20 20 6e 6f 74   if.**       not
bbb0: 2e 20 20 55 73 65 64 20 62 79 20 74 65 73 74 73  .  Used by tests
bbc0: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
bbd0: 65 20 6c 69 62 72 61 72 79 20 77 61 73 20 63 6f  e library was co
bbe0: 6d 70 69 6c 65 64 20 0a 2a 2a 20 20 20 20 20 20  mpiled .**      
bbf0: 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73   correctly..*/.s
bc00: 74 61 74 69 63 20 69 6e 74 20 44 62 4d 61 69 6e  tatic int DbMain
bc10: 28 76 6f 69 64 20 2a 63 64 2c 20 54 63 6c 5f 49  (void *cd, Tcl_I
bc20: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
bc30: 6e 74 20 6f 62 6a 63 2c 54 63 6c 5f 4f 62 6a 20  nt objc,Tcl_Obj 
bc40: 2a 63 6f 6e 73 74 2a 6f 62 6a 76 29 7b 0a 20 20  *const*objv){.  
bc50: 53 71 6c 69 74 65 44 62 20 2a 70 3b 0a 20 20 76  SqliteDb *p;.  v
bc60: 6f 69 64 20 2a 70 4b 65 79 20 3d 20 30 3b 0a 20  oid *pKey = 0;. 
bc70: 20 69 6e 74 20 6e 4b 65 79 20 3d 20 30 3b 0a 20   int nKey = 0;. 
bc80: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72   const char *zAr
bc90: 67 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  g;.  char *zErrM
bca0: 73 67 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  sg;.  const char
bcb0: 20 2a 7a 46 69 6c 65 3b 0a 20 20 63 68 61 72 20   *zFile;.  char 
bcc0: 7a 42 75 66 5b 38 30 5d 3b 0a 20 20 69 66 28 20  zBuf[80];.  if( 
bcd0: 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 7a  objc==2 ){.    z
bce0: 41 72 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  Arg = Tcl_GetStr
bcf0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
bd00: 31 5d 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  1], 0);.    if( 
bd10: 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 76 65  strcmp(zArg,"-ve
bd20: 72 73 69 6f 6e 22 29 3d 3d 30 20 29 7b 0a 20 20  rsion")==0 ){.  
bd30: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
bd40: 73 75 6c 74 28 69 6e 74 65 72 70 2c 73 71 6c 69  sult(interp,sqli
bd50: 74 65 33 5f 76 65 72 73 69 6f 6e 2c 30 29 3b 0a  te3_version,0);.
bd60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
bd70: 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  _OK;.    }.    i
bd80: 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22  f( strcmp(zArg,"
bd90: 2d 68 61 73 2d 63 6f 64 65 63 22 29 3d 3d 30 20  -has-codec")==0 
bda0: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
bdb0: 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 20  _HAS_CODEC.     
bdc0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
bdd0: 74 28 69 6e 74 65 72 70 2c 22 31 22 2c 30 29 3b  t(interp,"1",0);
bde0: 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 54 63 6c  .#else.      Tcl
bdf0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
be00: 74 65 72 70 2c 22 30 22 2c 30 29 3b 0a 23 65 6e  terp,"0",0);.#en
be10: 64 69 66 0a 20 20 20 20 20 20 72 65 74 75 72 6e  dif.      return
be20: 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20   TCL_OK;.    }. 
be30: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41     if( strcmp(zA
be40: 72 67 2c 22 2d 74 63 6c 2d 75 73 65 73 2d 75 74  rg,"-tcl-uses-ut
be50: 66 22 29 3d 3d 30 20 29 7b 0a 23 69 66 64 65 66  f")==0 ){.#ifdef
be60: 20 54 43 4c 5f 55 54 46 5f 4d 41 58 0a 20 20 20   TCL_UTF_MAX.   
be70: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
be80: 75 6c 74 28 69 6e 74 65 72 70 2c 22 31 22 2c 30  ult(interp,"1",0
be90: 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 54  );.#else.      T
bea0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
beb0: 69 6e 74 65 72 70 2c 22 30 22 2c 30 29 3b 0a 23  interp,"0",0);.#
bec0: 65 6e 64 69 66 0a 20 20 20 20 20 20 72 65 74 75  endif.      retu
bed0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d  rn TCL_OK;.    }
bee0: 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3d  .  }.  if( objc=
bef0: 3d 35 20 7c 7c 20 6f 62 6a 63 3d 3d 36 20 29 7b  =5 || objc==6 ){
bf00: 0a 20 20 20 20 7a 41 72 67 20 3d 20 54 63 6c 5f  .    zArg = Tcl_
bf10: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
bf20: 28 6f 62 6a 76 5b 6f 62 6a 63 2d 32 5d 2c 20 30  (objv[objc-2], 0
bf30: 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  );.    if( strcm
bf40: 70 28 7a 41 72 67 2c 22 2d 6b 65 79 22 29 3d 3d  p(zArg,"-key")==
bf50: 30 20 29 7b 0a 20 20 20 20 20 20 70 4b 65 79 20  0 ){.      pKey 
bf60: 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72  = Tcl_GetByteArr
bf70: 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 6f  ayFromObj(objv[o
bf80: 62 6a 63 2d 31 5d 2c 20 26 6e 4b 65 79 29 3b 0a  bjc-1], &nKey);.
bf90: 20 20 20 20 20 20 6f 62 6a 63 20 2d 3d 20 32 3b        objc -= 2;
bfa0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
bfb0: 20 6f 62 6a 63 21 3d 33 20 26 26 20 6f 62 6a 63   objc!=3 && objc
bfc0: 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=4 ){.    Tcl_W
bfd0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
bfe0: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 0a 23 69  rp, 1, objv, .#i
bff0: 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
c000: 43 4f 44 45 43 0a 20 20 20 20 20 20 22 48 41 4e  CODEC.      "HAN
c010: 44 4c 45 20 46 49 4c 45 4e 41 4d 45 20 3f 2d 6b  DLE FILENAME ?-k
c020: 65 79 20 43 4f 44 45 43 2d 4b 45 59 3f 22 0a 23  ey CODEC-KEY?".#
c030: 65 6c 73 65 0a 20 20 20 20 20 20 22 48 41 4e 44  else.      "HAND
c040: 4c 45 20 46 49 4c 45 4e 41 4d 45 20 3f 4d 4f 44  LE FILENAME ?MOD
c050: 45 3f 22 0a 23 65 6e 64 69 66 0a 20 20 20 20 29  E?".#endif.    )
c060: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
c070: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 45  _ERROR;.  }.  zE
c080: 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70 20 3d  rrMsg = 0;.  p =
c090: 20 28 53 71 6c 69 74 65 44 62 2a 29 54 63 6c 5f   (SqliteDb*)Tcl_
c0a0: 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  Alloc( sizeof(*p
c0b0: 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ) );.  if( p==0 
c0c0: 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65  ){.    Tcl_SetRe
c0d0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6d 61  sult(interp, "ma
c0e0: 6c 6c 6f 63 20 66 61 69 6c 65 64 22 2c 20 54 43  lloc failed", TC
c0f0: 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72  L_STATIC);.    r
c100: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
c110: 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 2c  .  }.  memset(p,
c120: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b   0, sizeof(*p));
c130: 0a 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47  .  zFile = Tcl_G
c140: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
c150: 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 73  objv[2], 0);.  s
c160: 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 46 69 6c  qlite3_open(zFil
c170: 65 2c 20 26 70 2d 3e 64 62 29 3b 0a 20 20 69 66  e, &p->db);.  if
c180: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
c190: 69 74 65 33 5f 65 72 72 63 6f 64 65 28 70 2d 3e  ite3_errcode(p->
c1a0: 64 62 29 20 29 7b 0a 20 20 20 20 7a 45 72 72 4d  db) ){.    zErrM
c1b0: 73 67 20 3d 20 73 74 72 64 75 70 28 73 71 6c 69  sg = strdup(sqli
c1c0: 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62  te3_errmsg(p->db
c1d0: 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ));.    sqlite3_
c1e0: 63 6c 6f 73 65 28 70 2d 3e 64 62 29 3b 0a 20 20  close(p->db);.  
c1f0: 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 7d    p->db = 0;.  }
c200: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
c210: 41 53 5f 43 4f 44 45 43 0a 20 20 73 71 6c 69 74  AS_CODEC.  sqlit
c220: 65 33 5f 6b 65 79 28 70 2d 3e 64 62 2c 20 70 4b  e3_key(p->db, pK
c230: 65 79 2c 20 6e 4b 65 79 29 3b 0a 23 65 6e 64 69  ey, nKey);.#endi
c240: 66 0a 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30  f.  if( p->db==0
c250: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52   ){.    Tcl_SetR
c260: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45  esult(interp, zE
c270: 72 72 4d 73 67 2c 20 54 43 4c 5f 56 4f 4c 41 54  rrMsg, TCL_VOLAT
c280: 49 4c 45 29 3b 0a 20 20 20 20 54 63 6c 5f 46 72  ILE);.    Tcl_Fr
c290: 65 65 28 28 63 68 61 72 2a 29 70 29 3b 0a 20 20  ee((char*)p);.  
c2a0: 20 20 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b    free(zErrMsg);
c2b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
c2c0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 2d 3e  ERROR;.  }.  p->
c2d0: 6d 61 78 53 74 6d 74 20 3d 20 4e 55 4d 5f 50 52  maxStmt = NUM_PR
c2e0: 45 50 41 52 45 44 5f 53 54 4d 54 53 3b 0a 20 20  EPARED_STMTS;.  
c2f0: 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65 74 53 74  zArg = Tcl_GetSt
c300: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
c310: 5b 31 5d 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43  [1], 0);.  Tcl_C
c320: 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
c330: 69 6e 74 65 72 70 2c 20 7a 41 72 67 2c 20 44 62  interp, zArg, Db
c340: 4f 62 6a 43 6d 64 2c 20 28 63 68 61 72 2a 29 70  ObjCmd, (char*)p
c350: 2c 20 44 62 44 65 6c 65 74 65 43 6d 64 29 3b 0a  , DbDeleteCmd);.
c360: 0a 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e  .  /* The return
c370: 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 76 61   value is the va
c380: 6c 75 65 20 6f 66 20 74 68 65 20 73 71 6c 69 74  lue of the sqlit
c390: 65 2a 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2f 0a  e* pointer.  */.
c3a0: 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20    sprintf(zBuf, 
c3b0: 22 25 70 22 2c 20 70 2d 3e 64 62 29 3b 0a 20 20  "%p", p->db);.  
c3c0: 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 42 75 66  if( strncmp(zBuf
c3d0: 2c 22 30 78 22 2c 32 29 20 29 7b 0a 20 20 20 20  ,"0x",2) ){.    
c3e0: 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 30  sprintf(zBuf, "0
c3f0: 78 25 70 22 2c 20 70 2d 3e 64 62 29 3b 0a 20 20  x%p", p->db);.  
c400: 7d 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  }.  Tcl_AppendRe
c410: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
c420: 66 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  f, 0);..  /* If 
c430: 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 53 51  compiled with SQ
c440: 4c 49 54 45 5f 54 45 53 54 20 74 75 72 6e 65 64  LITE_TEST turned
c450: 20 6f 6e 2c 20 74 68 65 6e 20 72 65 67 69 73 74   on, then regist
c460: 65 72 20 74 68 65 20 22 6d 64 35 73 75 6d 22 0a  er the "md5sum".
c470: 20 20 2a 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f    ** SQL functio
c480: 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  n..  */.#ifdef S
c490: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 7b 0a 20  QLITE_TEST.  {. 
c4a0: 20 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20 4d     extern void M
c4b0: 64 35 5f 52 65 67 69 73 74 65 72 28 73 71 6c 69  d5_Register(sqli
c4c0: 74 65 33 2a 29 3b 0a 23 69 66 64 65 66 20 53 51  te3*);.#ifdef SQ
c4d0: 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47 0a 20 20  LITE_MEMDEBUG.  
c4e0: 20 20 69 6e 74 20 6d 61 6c 6c 6f 63 66 61 69 6c    int mallocfail
c4f0: 20 3d 20 73 71 6c 69 74 65 33 5f 69 4d 61 6c 6c   = sqlite3_iMall
c500: 6f 63 46 61 69 6c 3b 0a 20 20 20 20 73 71 6c 69  ocFail;.    sqli
c510: 74 65 33 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c 20  te3_iMallocFail 
c520: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  = 0;.#endif.    
c530: 4d 64 35 5f 52 65 67 69 73 74 65 72 28 70 2d 3e  Md5_Register(p->
c540: 64 62 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  db);.#ifdef SQLI
c550: 54 45 5f 4d 45 4d 44 45 42 55 47 0a 20 20 20 20  TE_MEMDEBUG.    
c560: 73 71 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46  sqlite3_iMallocF
c570: 61 69 6c 20 3d 20 6d 61 6c 6c 6f 63 66 61 69 6c  ail = mallocfail
c580: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 7d 0a 23 65  ;.#endif.   }.#e
c590: 6e 64 69 66 20 20 0a 20 20 70 2d 3e 69 6e 74 65  ndif  .  p->inte
c5a0: 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 72  rp = interp;.  r
c5b0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
c5c0: 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20 61  ./*.** Provide a
c5d0: 20 64 75 6d 6d 79 20 54 63 6c 5f 49 6e 69 74 53   dummy Tcl_InitS
c5e0: 74 75 62 73 20 69 66 20 77 65 20 61 72 65 20 75  tubs if we are u
c5f0: 73 69 6e 67 20 74 68 69 73 20 61 73 20 61 20 73  sing this as a s
c600: 74 61 74 69 63 0a 2a 2a 20 6c 69 62 72 61 72 79  tatic.** library
c610: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 55 53 45  ..*/.#ifndef USE
c620: 5f 54 43 4c 5f 53 54 55 42 53 0a 23 20 75 6e 64  _TCL_STUBS.# und
c630: 65 66 20 20 54 63 6c 5f 49 6e 69 74 53 74 75 62  ef  Tcl_InitStub
c640: 73 0a 23 20 64 65 66 69 6e 65 20 54 63 6c 5f 49  s.# define Tcl_I
c650: 6e 69 74 53 74 75 62 73 28 61 2c 62 2c 63 29 0a  nitStubs(a,b,c).
c660: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
c670: 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f  itialize this mo
c680: 64 75 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  dule..**.** This
c690: 20 54 63 6c 20 6d 6f 64 75 6c 65 20 63 6f 6e 74   Tcl module cont
c6a0: 61 69 6e 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67  ains only a sing
c6b0: 6c 65 20 6e 65 77 20 54 63 6c 20 63 6f 6d 6d 61  le new Tcl comma
c6c0: 6e 64 20 6e 61 6d 65 64 20 22 73 71 6c 69 74 65  nd named "sqlite
c6d0: 22 2e 0a 2a 2a 20 28 48 65 6e 63 65 20 74 68 65  "..** (Hence the
c6e0: 72 65 20 69 73 20 6e 6f 20 6e 61 6d 65 73 70 61  re is no namespa
c6f0: 63 65 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f  ce.  There is no
c700: 20 70 6f 69 6e 74 20 69 6e 20 75 73 69 6e 67 20   point in using 
c710: 61 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69  a namespace.** i
c720: 66 20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e 20  f the extension 
c730: 6f 6e 6c 79 20 73 75 70 70 6c 69 65 73 20 6f 6e  only supplies on
c740: 65 20 6e 65 77 20 6e 61 6d 65 21 29 20 20 54 68  e new name!)  Th
c750: 65 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d 61  e "sqlite" comma
c760: 6e 64 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f  nd is.** used to
c770: 20 6f 70 65 6e 20 61 20 6e 65 77 20 53 51 4c 69   open a new SQLi
c780: 74 65 20 64 61 74 61 62 61 73 65 2e 20 20 53 65  te database.  Se
c790: 65 20 74 68 65 20 44 62 4d 61 69 6e 28 29 20 72  e the DbMain() r
c7a0: 6f 75 74 69 6e 65 20 61 62 6f 76 65 0a 2a 2a 20  outine above.** 
c7b0: 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
c7c0: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 69  nformation..*/.i
c7d0: 6e 74 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28  nt Sqlite3_Init(
c7e0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
c7f0: 72 70 29 7b 0a 20 20 54 63 6c 5f 49 6e 69 74 53  rp){.  Tcl_InitS
c800: 74 75 62 73 28 69 6e 74 65 72 70 2c 20 22 38 2e  tubs(interp, "8.
c810: 34 22 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72  4", 0);.  Tcl_Cr
c820: 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
c830: 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33 22  nterp, "sqlite3"
c840: 2c 20 28 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f  , (Tcl_ObjCmdPro
c850: 63 2a 29 44 62 4d 61 69 6e 2c 20 30 2c 20 30 29  c*)DbMain, 0, 0)
c860: 3b 0a 20 20 54 63 6c 5f 50 6b 67 50 72 6f 76 69  ;.  Tcl_PkgProvi
c870: 64 65 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  de(interp, "sqli
c880: 74 65 33 22 2c 20 22 33 2e 30 22 29 3b 0a 20 20  te3", "3.0");.  
c890: 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
c8a0: 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 73 71  mand(interp, "sq
c8b0: 6c 69 74 65 22 2c 20 28 54 63 6c 5f 4f 62 6a 43  lite", (Tcl_ObjC
c8c0: 6d 64 50 72 6f 63 2a 29 44 62 4d 61 69 6e 2c 20  mdProc*)DbMain, 
c8d0: 30 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 50 6b 67  0, 0);.  Tcl_Pkg
c8e0: 50 72 6f 76 69 64 65 28 69 6e 74 65 72 70 2c 20  Provide(interp, 
c8f0: 22 73 71 6c 69 74 65 22 2c 20 22 33 2e 30 22 29  "sqlite", "3.0")
c900: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
c910: 4b 3b 0a 7d 0a 69 6e 74 20 54 63 6c 73 71 6c 69  K;.}.int Tclsqli
c920: 74 65 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  te3_Init(Tcl_Int
c930: 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65  erp *interp){ re
c940: 74 75 72 6e 20 53 71 6c 69 74 65 33 5f 49 6e 69  turn Sqlite3_Ini
c950: 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a 69 6e 74  t(interp); }.int
c960: 20 53 71 6c 69 74 65 33 5f 53 61 66 65 49 6e 69   Sqlite3_SafeIni
c970: 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  t(Tcl_Interp *in
c980: 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20 54 43  terp){ return TC
c990: 4c 5f 4f 4b 3b 20 7d 0a 69 6e 74 20 54 63 6c 73  L_OK; }.int Tcls
c9a0: 71 6c 69 74 65 33 5f 53 61 66 65 49 6e 69 74 28  qlite3_SafeInit(
c9b0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
c9c0: 72 70 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f  rp){ return TCL_
c9d0: 4f 4b 3b 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK; }..#ifndef S
c9e0: 51 4c 49 54 45 5f 33 5f 53 55 46 46 49 58 5f 4f  QLITE_3_SUFFIX_O
c9f0: 4e 4c 59 0a 69 6e 74 20 53 71 6c 69 74 65 5f 49  NLY.int Sqlite_I
ca00: 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nit(Tcl_Interp *
ca10: 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20  interp){ return 
ca20: 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74  Sqlite3_Init(int
ca30: 65 72 70 29 3b 20 7d 0a 69 6e 74 20 54 63 6c 73  erp); }.int Tcls
ca40: 71 6c 69 74 65 5f 49 6e 69 74 28 54 63 6c 5f 49  qlite_Init(Tcl_I
ca50: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20  nterp *interp){ 
ca60: 72 65 74 75 72 6e 20 53 71 6c 69 74 65 33 5f 49  return Sqlite3_I
ca70: 6e 69 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a 69  nit(interp); }.i
ca80: 6e 74 20 53 71 6c 69 74 65 5f 53 61 66 65 49 6e  nt Sqlite_SafeIn
ca90: 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  it(Tcl_Interp *i
caa0: 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20 54  nterp){ return T
cab0: 43 4c 5f 4f 4b 3b 20 7d 0a 69 6e 74 20 54 63 6c  CL_OK; }.int Tcl
cac0: 73 71 6c 69 74 65 5f 53 61 66 65 49 6e 69 74 28  sqlite_SafeInit(
cad0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
cae0: 72 70 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f  rp){ return TCL_
caf0: 4f 4b 3b 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  OK; }.#endif..#i
cb00: 66 64 65 66 20 54 43 4c 53 48 0a 2f 2a 2a 2a 2a  fdef TCLSH./****
cb10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cb20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cb30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cb40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cb50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65  *********.** The
cb60: 20 63 6f 64 65 20 74 68 61 74 20 66 6f 6c 6c 6f   code that follo
cb70: 77 73 20 69 73 20 75 73 65 64 20 74 6f 20 62 75  ws is used to bu
cb80: 69 6c 64 20 73 74 61 6e 64 61 6c 6f 6e 65 20 54  ild standalone T
cb90: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 73 0a  CL interpreters.
cba0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  */../*.** If the
cbb0: 20 6d 61 63 72 6f 20 54 43 4c 53 48 20 69 73 20   macro TCLSH is 
cbc0: 6f 6e 65 2c 20 74 68 65 6e 20 70 75 74 20 69 6e  one, then put in
cbd0: 20 63 6f 64 65 20 74 68 69 73 20 66 6f 72 20 74   code this for t
cbe0: 68 65 0a 2a 2a 20 22 6d 61 69 6e 22 20 72 6f 75  he.** "main" rou
cbf0: 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 69  tine that will i
cc00: 6e 69 74 69 61 6c 69 7a 65 20 54 63 6c 20 61 6e  nitialize Tcl an
cc10: 64 20 74 61 6b 65 20 69 6e 70 75 74 20 66 72 6f  d take input fro
cc20: 6d 0a 2a 2a 20 73 74 61 6e 64 61 72 64 20 69 6e  m.** standard in
cc30: 70 75 74 2e 0a 2a 2f 0a 23 69 66 20 54 43 4c 53  put..*/.#if TCLS
cc40: 48 3d 3d 31 0a 73 74 61 74 69 63 20 63 68 61 72  H==1.static char
cc50: 20 7a 4d 61 69 6e 6c 6f 6f 70 5b 5d 20 3d 0a 20   zMainloop[] =. 
cc60: 20 22 73 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e 22   "set line {}\n"
cc70: 0a 20 20 22 77 68 69 6c 65 20 7b 21 5b 65 6f 66  .  "while {![eof
cc80: 20 73 74 64 69 6e 5d 7d 20 7b 5c 6e 22 0a 20 20   stdin]} {\n".  
cc90: 20 20 22 69 66 20 7b 24 6c 69 6e 65 21 3d 5c 22    "if {$line!=\"
cca0: 5c 22 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22  \"} {\n".      "
ccb0: 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20  puts -nonewline 
ccc0: 5c 22 3e 20 5c 22 5c 6e 22 0a 20 20 20 20 22 7d  \"> \"\n".    "}
ccd0: 20 65 6c 73 65 20 7b 5c 6e 22 0a 20 20 20 20 20   else {\n".     
cce0: 20 22 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e   "puts -nonewlin
ccf0: 65 20 5c 22 25 20 5c 22 5c 6e 22 0a 20 20 20 20  e \"% \"\n".    
cd00: 22 7d 5c 6e 22 0a 20 20 20 20 22 66 6c 75 73 68  "}\n".    "flush
cd10: 20 73 74 64 6f 75 74 5c 6e 22 0a 20 20 20 20 22   stdout\n".    "
cd20: 61 70 70 65 6e 64 20 6c 69 6e 65 20 5b 67 65 74  append line [get
cd30: 73 20 73 74 64 69 6e 5d 5c 6e 22 0a 20 20 20 20  s stdin]\n".    
cd40: 22 69 66 20 7b 5b 69 6e 66 6f 20 63 6f 6d 70 6c  "if {[info compl
cd50: 65 74 65 20 24 6c 69 6e 65 5d 7d 20 7b 5c 6e 22  ete $line]} {\n"
cd60: 0a 20 20 20 20 20 20 22 69 66 20 7b 5b 63 61 74  .      "if {[cat
cd70: 63 68 20 7b 75 70 6c 65 76 65 6c 20 23 30 20 24  ch {uplevel #0 $
cd80: 6c 69 6e 65 7d 20 72 65 73 75 6c 74 5d 7d 20 7b  line} result]} {
cd90: 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 70 75 74  \n".        "put
cda0: 73 20 73 74 64 65 72 72 20 5c 22 45 72 72 6f 72  s stderr \"Error
cdb0: 3a 20 24 72 65 73 75 6c 74 5c 22 5c 6e 22 0a 20  : $result\"\n". 
cdc0: 20 20 20 20 20 22 7d 20 65 6c 73 65 69 66 20 7b       "} elseif {
cdd0: 24 72 65 73 75 6c 74 21 3d 5c 22 5c 22 7d 20 7b  $result!=\"\"} {
cde0: 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 70 75 74  \n".        "put
cdf0: 73 20 24 72 65 73 75 6c 74 5c 6e 22 0a 20 20 20  s $result\n".   
ce00: 20 20 20 22 7d 5c 6e 22 0a 20 20 20 20 20 20 22     "}\n".      "
ce10: 73 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e 22 0a 20  set line {}\n". 
ce20: 20 20 20 22 7d 20 65 6c 73 65 20 7b 5c 6e 22 0a     "} else {\n".
ce30: 20 20 20 20 20 20 22 61 70 70 65 6e 64 20 6c 69        "append li
ce40: 6e 65 20 5c 5c 6e 5c 6e 22 0a 20 20 20 20 22 7d  ne \\n\n".    "}
ce50: 5c 6e 22 0a 20 20 22 7d 5c 6e 22 0a 3b 0a 23 65  \n".  "}\n".;.#e
ce60: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ndif../*.** If t
ce70: 68 65 20 6d 61 63 72 6f 20 54 43 4c 53 48 20 69  he macro TCLSH i
ce80: 73 20 74 77 6f 2c 20 74 68 65 6e 20 67 65 74 20  s two, then get 
ce90: 74 68 65 20 6d 61 69 6e 20 6c 6f 6f 70 20 63 6f  the main loop co
cea0: 64 65 20 6f 75 74 20 6f 66 0a 2a 2a 20 74 68 65  de out of.** the
ceb0: 20 73 65 70 61 72 61 74 65 20 66 69 6c 65 20 22   separate file "
cec0: 73 70 61 63 65 61 6e 61 6c 5f 74 63 6c 2e 68 22  spaceanal_tcl.h"
ced0: 2e 0a 2a 2f 0a 23 69 66 20 54 43 4c 53 48 3d 3d  ..*/.#if TCLSH==
cee0: 32 0a 73 74 61 74 69 63 20 63 68 61 72 20 7a 4d  2.static char zM
cef0: 61 69 6e 6c 6f 6f 70 5b 5d 20 3d 20 0a 23 69 6e  ainloop[] = .#in
cf00: 63 6c 75 64 65 20 22 73 70 61 63 65 61 6e 61 6c  clude "spaceanal
cf10: 5f 74 63 6c 2e 68 22 0a 3b 0a 23 65 6e 64 69 66  _tcl.h".;.#endif
cf20: 0a 0a 23 64 65 66 69 6e 65 20 54 43 4c 53 48 5f  ..#define TCLSH_
cf30: 4d 41 49 4e 20 6d 61 69 6e 20 20 20 2f 2a 20 4e  MAIN main   /* N
cf40: 65 65 64 65 64 20 74 6f 20 66 61 6b 65 20 6f 75  eeded to fake ou
cf50: 74 20 6d 6b 74 63 6c 61 70 70 20 2a 2f 0a 69 6e  t mktclapp */.in
cf60: 74 20 54 43 4c 53 48 5f 4d 41 49 4e 28 69 6e 74  t TCLSH_MAIN(int
cf70: 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72   argc, char **ar
cf80: 67 76 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72  gv){.  Tcl_Inter
cf90: 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c  p *interp;.  Tcl
cfa0: 5f 46 69 6e 64 45 78 65 63 75 74 61 62 6c 65 28  _FindExecutable(
cfb0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 6e 74 65  argv[0]);.  inte
cfc0: 72 70 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 49  rp = Tcl_CreateI
cfd0: 6e 74 65 72 70 28 29 3b 0a 20 20 53 71 6c 69 74  nterp();.  Sqlit
cfe0: 65 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  e3_Init(interp);
cff0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
d000: 45 53 54 0a 20 20 7b 0a 20 20 20 20 65 78 74 65  EST.  {.    exte
d010: 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
d020: 74 31 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  t1_Init(Tcl_Inte
d030: 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
d040: 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 32   int Sqlitetest2
d050: 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
d060: 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
d070: 6e 74 20 53 71 6c 69 74 65 74 65 73 74 33 5f 49  nt Sqlitetest3_I
d080: 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
d090: 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
d0a0: 20 53 71 6c 69 74 65 74 65 73 74 34 5f 49 6e 69   Sqlitetest4_Ini
d0b0: 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
d0c0: 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
d0d0: 71 6c 69 74 65 74 65 73 74 35 5f 49 6e 69 74 28  qlitetest5_Init(
d0e0: 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
d0f0: 20 20 65 78 74 65 72 6e 20 69 6e 74 20 4d 64 35    extern int Md5
d100: 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
d110: 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
d120: 6e 74 20 53 71 6c 69 74 65 74 65 73 74 73 73 65  nt Sqlitetestsse
d130: 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
d140: 2a 29 3b 0a 0a 20 20 20 20 53 71 6c 69 74 65 74  *);..    Sqlitet
d150: 65 73 74 31 5f 49 6e 69 74 28 69 6e 74 65 72 70  est1_Init(interp
d160: 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
d170: 74 32 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  t2_Init(interp);
d180: 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 33  .    Sqlitetest3
d190: 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
d1a0: 20 20 20 53 71 6c 69 74 65 74 65 73 74 34 5f 49     Sqlitetest4_I
d1b0: 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
d1c0: 20 53 71 6c 69 74 65 74 65 73 74 35 5f 49 6e 69   Sqlitetest5_Ini
d1d0: 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 4d  t(interp);.    M
d1e0: 64 35 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  d5_Init(interp);
d1f0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
d200: 45 53 54 5f 53 53 45 0a 20 20 20 20 53 71 6c 69  EST_SSE.    Sqli
d210: 74 65 74 65 73 74 73 73 65 5f 49 6e 69 74 28 69  tetestsse_Init(i
d220: 6e 74 65 72 70 29 3b 0a 23 65 6e 64 69 66 0a 20  nterp);.#endif. 
d230: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
d240: 61 72 67 63 3e 3d 32 20 7c 7c 20 54 43 4c 53 48  argc>=2 || TCLSH
d250: 3d 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ==2 ){.    int i
d260: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72  ;.    Tcl_SetVar
d270: 28 69 6e 74 65 72 70 2c 22 61 72 67 76 30 22 2c  (interp,"argv0",
d280: 61 72 67 76 5b 31 5d 2c 54 43 4c 5f 47 4c 4f 42  argv[1],TCL_GLOB
d290: 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 54 63  AL_ONLY);.    Tc
d2a0: 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c  l_SetVar(interp,
d2b0: 22 61 72 67 76 22 2c 20 22 22 2c 20 54 43 4c 5f  "argv", "", TCL_
d2c0: 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20  GLOBAL_ONLY);.  
d2d0: 20 20 66 6f 72 28 69 3d 33 2d 54 43 4c 53 48 3b    for(i=3-TCLSH;
d2e0: 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20   i<argc; i++){. 
d2f0: 20 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28       Tcl_SetVar(
d300: 69 6e 74 65 72 70 2c 20 22 61 72 67 76 22 2c 20  interp, "argv", 
d310: 61 72 67 76 5b 69 5d 2c 0a 20 20 20 20 20 20 20  argv[i],.       
d320: 20 20 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e     TCL_GLOBAL_ON
d330: 4c 59 20 7c 20 54 43 4c 5f 4c 49 53 54 5f 45 4c  LY | TCL_LIST_EL
d340: 45 4d 45 4e 54 20 7c 20 54 43 4c 5f 41 50 50 45  EMENT | TCL_APPE
d350: 4e 44 5f 56 41 4c 55 45 29 3b 0a 20 20 20 20 7d  ND_VALUE);.    }
d360: 0a 20 20 20 20 69 66 28 20 54 43 4c 53 48 3d 3d  .    if( TCLSH==
d370: 31 20 26 26 20 54 63 6c 5f 45 76 61 6c 46 69 6c  1 && Tcl_EvalFil
d380: 65 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  e(interp, argv[1
d390: 5d 29 21 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20  ])!=TCL_OK ){.  
d3a0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
d3b0: 7a 49 6e 66 6f 20 3d 20 54 63 6c 5f 47 65 74 56  zInfo = Tcl_GetV
d3c0: 61 72 28 69 6e 74 65 72 70 2c 20 22 65 72 72 6f  ar(interp, "erro
d3d0: 72 49 6e 66 6f 22 2c 20 54 43 4c 5f 47 4c 4f 42  rInfo", TCL_GLOB
d3e0: 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 20 20  AL_ONLY);.      
d3f0: 69 66 28 20 7a 49 6e 66 6f 3d 3d 30 20 29 20 7a  if( zInfo==0 ) z
d400: 49 6e 66 6f 20 3d 20 69 6e 74 65 72 70 2d 3e 72  Info = interp->r
d410: 65 73 75 6c 74 3b 0a 20 20 20 20 20 20 66 70 72  esult;.      fpr
d420: 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25 73 3a  intf(stderr,"%s:
d430: 20 25 73 5c 6e 22 2c 20 2a 61 72 67 76 2c 20 7a   %s\n", *argv, z
d440: 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 72 65 74  Info);.      ret
d450: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
d460: 0a 20 20 69 66 28 20 61 72 67 63 3c 3d 31 20 7c  .  if( argc<=1 |
d470: 7c 20 54 43 4c 53 48 3d 3d 32 20 29 7b 0a 20 20  | TCLSH==2 ){.  
d480: 20 20 54 63 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c    Tcl_GlobalEval
d490: 28 69 6e 74 65 72 70 2c 20 7a 4d 61 69 6e 6c 6f  (interp, zMainlo
d4a0: 6f 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  op);.  }.  retur
d4b0: 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 0;.}.#endif /*
d4c0: 20 54 43 4c 53 48 20 2a 2f 0a 0a 23 65 6e 64 69   TCLSH */..#endi
d4d0: 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 4e 4f  f /* !defined(NO
d4e0: 5f 54 43 4c 29 20 2a 2f 0a                       _TCL) */.