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

Artifact b24407b7363d6535e9ccf5e5bc8c68e3c879c340:


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 39 20 32 30 30 35 2f 30 38 2f 30 32 20 31 32  29 2005/08/02 12
01c0: 3a 32 31 3a 30 39 20 64 72 68 20 45 78 70 20 24  :21:09 drh Exp $
01d0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 4f 5f 54  .*/.#ifndef NO_T
01e0: 43 4c 20 20 20 20 20 2f 2a 20 4f 6d 69 74 20 74  CL     /* Omit t
01f0: 68 69 73 20 77 68 6f 6c 65 20 66 69 6c 65 20 69  his whole file i
0200: 66 20 54 43 4c 20 69 73 20 75 6e 61 76 61 69 6c  f TCL is unavail
0210: 61 62 6c 65 20 2a 2f 0a 0a 23 69 6e 63 6c 75 64  able */..#includ
0220: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
0230: 23 69 6e 63 6c 75 64 65 20 22 68 61 73 68 2e 68  #include "hash.h
0240: 22 0a 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 2e  ".#include "tcl.
0250: 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64  h".#include <std
0260: 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  lib.h>.#include 
0270: 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c  <string.h>.#incl
0280: 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23  ude <assert.h>.#
0290: 69 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68  include <ctype.h
02a0: 3e 0a 0a 23 64 65 66 69 6e 65 20 4e 55 4d 5f 50  >..#define NUM_P
02b0: 52 45 50 41 52 45 44 5f 53 54 4d 54 53 20 31 30  REPARED_STMTS 10
02c0: 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f 50 52 45  .#define MAX_PRE
02d0: 50 41 52 45 44 5f 53 54 4d 54 53 20 31 30 30 0a  PARED_STMTS 100.
02e0: 0a 2f 2a 0a 2a 2a 20 49 66 20 54 43 4c 20 75 73  ./*.** If TCL us
02f0: 65 73 20 55 54 46 2d 38 20 61 6e 64 20 53 51 4c  es UTF-8 and SQL
0300: 69 74 65 20 69 73 20 63 6f 6e 66 69 67 75 72 65  ite is configure
0310: 64 20 74 6f 20 75 73 65 20 69 73 6f 38 38 35 39  d to use iso8859
0320: 2c 20 74 68 65 6e 20 77 65 0a 2a 2a 20 68 61 76  , then we.** hav
0330: 65 20 74 6f 20 64 6f 20 61 20 74 72 61 6e 73 6c  e to do a transl
0340: 61 74 69 6f 6e 20 77 68 65 6e 20 67 6f 69 6e 67  ation when going
0350: 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f   between the two
0360: 2e 20 20 53 65 74 20 74 68 65 20 0a 2a 2a 20 55  .  Set the .** U
0370: 54 46 5f 54 52 41 4e 53 4c 41 54 49 4f 4e 5f 4e  TF_TRANSLATION_N
0380: 45 45 44 45 44 20 6d 61 63 72 6f 20 74 6f 20 69  EEDED macro to i
0390: 6e 64 69 63 61 74 65 20 74 68 61 74 20 77 65 20  ndicate that we 
03a0: 6e 65 65 64 20 74 6f 20 64 6f 0a 2a 2a 20 74 68  need to do.** th
03b0: 69 73 20 74 72 61 6e 73 6c 61 74 69 6f 6e 2e 20  is translation. 
03c0: 20 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64   .*/.#if defined
03d0: 28 54 43 4c 5f 55 54 46 5f 4d 41 58 29 20 26 26  (TCL_UTF_MAX) &&
03e0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
03f0: 5f 55 54 46 38 29 0a 23 20 64 65 66 69 6e 65 20  _UTF8).# define 
0400: 55 54 46 5f 54 52 41 4e 53 4c 41 54 49 4f 4e 5f  UTF_TRANSLATION_
0410: 4e 45 45 44 45 44 20 31 0a 23 65 6e 64 69 66 0a  NEEDED 1.#endif.
0420: 0a 2f 2a 0a 2a 2a 20 4e 65 77 20 53 51 4c 20 66  ./*.** New SQL f
0430: 75 6e 63 74 69 6f 6e 73 20 63 61 6e 20 62 65 20  unctions can be 
0440: 63 72 65 61 74 65 64 20 61 73 20 54 43 4c 20 73  created as TCL s
0450: 63 72 69 70 74 73 2e 20 20 45 61 63 68 20 73 75  cripts.  Each su
0460: 63 68 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  ch function.** i
0470: 73 20 64 65 73 63 72 69 62 65 64 20 62 79 20 61  s described by a
0480: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
0490: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
04a0: 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 65 64 65  cture..*/.typede
04b0: 66 20 73 74 72 75 63 74 20 53 71 6c 46 75 6e 63  f struct SqlFunc
04c0: 20 53 71 6c 46 75 6e 63 3b 0a 73 74 72 75 63 74   SqlFunc;.struct
04d0: 20 53 71 6c 46 75 6e 63 20 7b 0a 20 20 54 63 6c   SqlFunc {.  Tcl
04e0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b  _Interp *interp;
04f0: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
0500: 74 65 72 70 72 65 74 20 74 6f 20 65 78 65 63 75  terpret to execu
0510: 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  te the function 
0520: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53  */.  Tcl_Obj *pS
0530: 63 72 69 70 74 3b 20 20 20 20 20 2f 2a 20 54 68  cript;     /* Th
0540: 65 20 54 63 6c 5f 4f 62 6a 20 72 65 70 72 65 73  e Tcl_Obj repres
0550: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
0560: 73 63 72 69 70 74 20 2a 2f 0a 20 20 69 6e 74 20  script */.  int 
0570: 75 73 65 45 76 61 6c 4f 62 6a 76 3b 20 20 20 20  useEvalObjv;    
0580: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 74 20    /* True if it 
0590: 69 73 20 73 61 66 65 20 74 6f 20 75 73 65 20 54  is safe to use T
05a0: 63 6c 5f 45 76 61 6c 4f 62 6a 76 20 2a 2f 0a 20  cl_EvalObjv */. 
05b0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
05c0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
05d0: 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
05e0: 2a 2f 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70 4e  */.  SqlFunc *pN
05f0: 65 78 74 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65  ext;       /* Ne
0600: 78 74 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 20 74  xt function on t
0610: 68 65 20 6c 69 73 74 20 6f 66 20 74 68 65 6d 20  he list of them 
0620: 61 6c 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  all */.};../*.**
0630: 20 4e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   New collation s
0640: 65 71 75 65 6e 63 65 73 20 66 75 6e 63 74 69 6f  equences functio
0650: 6e 20 63 61 6e 20 62 65 20 63 72 65 61 74 65 64  n can be created
0660: 20 61 73 20 54 43 4c 20 73 63 72 69 70 74 73 2e   as TCL scripts.
0670: 20 20 45 61 63 68 20 73 75 63 68 0a 2a 2a 20 66    Each such.** f
0680: 75 6e 63 74 69 6f 6e 20 69 73 20 64 65 73 63 72  unction is descr
0690: 69 62 65 64 20 62 79 20 61 6e 20 69 6e 73 74 61  ibed by an insta
06a0: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
06b0: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
06c0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
06d0: 74 20 53 71 6c 43 6f 6c 6c 61 74 65 20 53 71 6c  t SqlCollate Sql
06e0: 43 6f 6c 6c 61 74 65 3b 0a 73 74 72 75 63 74 20  Collate;.struct 
06f0: 53 71 6c 43 6f 6c 6c 61 74 65 20 7b 0a 20 20 54  SqlCollate {.  T
0700: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
0710: 70 3b 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  p;   /* The TCL 
0720: 69 6e 74 65 72 70 72 65 74 20 74 6f 20 65 78 65  interpret to exe
0730: 63 75 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f  cute the functio
0740: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 63  n */.  char *zSc
0750: 72 69 70 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  ript;        /* 
0760: 54 68 65 20 73 63 72 69 70 74 20 74 6f 20 62 65  The script to be
0770: 20 72 75 6e 20 2a 2f 0a 20 20 53 71 6c 43 6f 6c   run */.  SqlCol
0780: 6c 61 74 65 20 2a 70 4e 65 78 74 3b 20 20 20 20  late *pNext;    
0790: 2f 2a 20 4e 65 78 74 20 66 75 6e 63 74 69 6f 6e  /* Next function
07a0: 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20   on the list of 
07b0: 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 7d 3b 0a 0a  them all */.};..
07c0: 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 64 20 73  /*.** Prepared s
07d0: 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 63 61  tatements are ca
07e0: 63 68 65 64 20 66 6f 72 20 66 61 73 74 65 72 20  ched for faster 
07f0: 65 78 65 63 75 74 69 6f 6e 2e 20 20 45 61 63 68  execution.  Each
0800: 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73 74 61   prepared.** sta
0810: 74 65 6d 65 6e 74 20 69 73 20 64 65 73 63 72 69  tement is descri
0820: 62 65 64 20 62 79 20 61 6e 20 69 6e 73 74 61 6e  bed by an instan
0830: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
0840: 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ing structure..*
0850: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
0860: 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74   SqlPreparedStmt
0870: 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74   SqlPreparedStmt
0880: 3b 0a 73 74 72 75 63 74 20 53 71 6c 50 72 65 70  ;.struct SqlPrep
0890: 61 72 65 64 53 74 6d 74 20 7b 0a 20 20 53 71 6c  aredStmt {.  Sql
08a0: 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70 4e  PreparedStmt *pN
08b0: 65 78 74 3b 20 20 2f 2a 20 4e 65 78 74 20 69 6e  ext;  /* Next in
08c0: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 2a 2f 0a   linked list */.
08d0: 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d    SqlPreparedStm
08e0: 74 20 2a 70 50 72 65 76 3b 20 20 2f 2a 20 50 72  t *pPrev;  /* Pr
08f0: 65 76 69 6f 75 73 20 6f 6e 20 74 68 65 20 6c 69  evious on the li
0900: 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  st */.  sqlite3_
0910: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20  stmt *pStmt;    
0920: 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65 64   /* The prepared
0930: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
0940: 69 6e 74 20 6e 53 71 6c 3b 20 20 20 20 20 20 20  int nSql;       
0950: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 68 61 72           /* char
0960: 73 20 69 6e 20 7a 53 71 6c 5b 5d 20 2a 2f 0a 20  s in zSql[] */. 
0970: 20 63 68 61 72 20 7a 53 71 6c 5b 31 5d 3b 20 20   char zSql[1];  
0980: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
0990: 74 20 6f 66 20 74 68 65 20 53 51 4c 20 73 74 61  t of the SQL sta
09a0: 74 65 6d 65 6e 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  tement */.};../*
09b0: 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65  .** There is one
09c0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
09d0: 73 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20  s structure for 
09e0: 65 61 63 68 20 53 51 4c 69 74 65 20 64 61 74 61  each SQLite data
09f0: 62 61 73 65 0a 2a 2a 20 74 68 61 74 20 68 61 73  base.** that has
0a00: 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 62 79 20   been opened by 
0a10: 74 68 65 20 53 51 4c 69 74 65 20 54 43 4c 20 69  the SQLite TCL i
0a20: 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 74 79 70  nterface..*/.typ
0a30: 65 64 65 66 20 73 74 72 75 63 74 20 53 71 6c 69  edef struct Sqli
0a40: 74 65 44 62 20 53 71 6c 69 74 65 44 62 3b 0a 73  teDb SqliteDb;.s
0a50: 74 72 75 63 74 20 53 71 6c 69 74 65 44 62 20 7b  truct SqliteDb {
0a60: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
0a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0a80: 20 54 68 65 20 22 72 65 61 6c 22 20 64 61 74 61   The "real" data
0a90: 62 61 73 65 20 73 74 72 75 63 74 75 72 65 20 2a  base structure *
0aa0: 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
0ab0: 69 6e 74 65 72 70 3b 20 20 20 20 20 20 20 20 2f  interp;        /
0ac0: 2a 20 54 68 65 20 69 6e 74 65 72 70 72 65 74 65  * The interprete
0ad0: 72 20 75 73 65 64 20 66 6f 72 20 74 68 69 73 20  r used for this 
0ae0: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 68  database */.  ch
0af0: 61 72 20 2a 7a 42 75 73 79 3b 20 20 20 20 20 20  ar *zBusy;      
0b00: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
0b10: 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 6f  busy callback ro
0b20: 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20  utine */.  char 
0b30: 2a 7a 43 6f 6d 6d 69 74 3b 20 20 20 20 20 20 20  *zCommit;       
0b40: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d        /* The com
0b50: 6d 69 74 20 68 6f 6f 6b 20 63 61 6c 6c 62 61 63  mit hook callbac
0b60: 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63  k routine */.  c
0b70: 68 61 72 20 2a 7a 54 72 61 63 65 3b 20 20 20 20  har *zTrace;    
0b80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
0b90: 20 74 72 61 63 65 20 63 61 6c 6c 62 61 63 6b 20   trace callback 
0ba0: 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61  routine */.  cha
0bb0: 72 20 2a 7a 50 72 6f 67 72 65 73 73 3b 20 20 20  r *zProgress;   
0bc0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
0bd0: 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b  rogress callback
0be0: 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68   routine */.  ch
0bf0: 61 72 20 2a 7a 41 75 74 68 3b 20 20 20 20 20 20  ar *zAuth;      
0c00: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
0c10: 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 63 61  authorization ca
0c20: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a  llback routine *
0c30: 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 75 6c 6c 3b  /.  char *zNull;
0c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0c50: 2a 20 54 65 78 74 20 74 6f 20 73 75 62 73 74 69  * Text to substi
0c60: 74 75 74 65 20 66 6f 72 20 61 6e 20 53 51 4c 20  tute for an SQL 
0c70: 4e 55 4c 4c 20 76 61 6c 75 65 20 2a 2f 0a 20 20  NULL value */.  
0c80: 53 71 6c 46 75 6e 63 20 2a 70 46 75 6e 63 3b 20  SqlFunc *pFunc; 
0c90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
0ca0: 73 74 20 6f 66 20 53 51 4c 20 66 75 6e 63 74 69  st of SQL functi
0cb0: 6f 6e 73 20 2a 2f 0a 20 20 53 71 6c 43 6f 6c 6c  ons */.  SqlColl
0cc0: 61 74 65 20 2a 70 43 6f 6c 6c 61 74 65 3b 20 20  ate *pCollate;  
0cd0: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 53      /* List of S
0ce0: 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e  QL collation fun
0cf0: 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ctions */.  int 
0d00: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
0d10: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
0d20: 20 63 6f 64 65 20 6f 66 20 6d 6f 73 74 20 72 65   code of most re
0d30: 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 65  cent sqlite3_exe
0d40: 63 28 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  c() */.  Tcl_Obj
0d50: 20 2a 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64   *pCollateNeeded
0d60: 3b 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e  ;   /* Collation
0d70: 20 6e 65 65 64 65 64 20 73 63 72 69 70 74 20 2a   needed script *
0d80: 2f 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64 53  /.  SqlPreparedS
0d90: 74 6d 74 20 2a 73 74 6d 74 4c 69 73 74 3b 20 2f  tmt *stmtList; /
0da0: 2a 20 4c 69 73 74 20 6f 66 20 70 72 65 70 61 72  * List of prepar
0db0: 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2a 2f 0a  ed statements*/.
0dc0: 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d    SqlPreparedStm
0dd0: 74 20 2a 73 74 6d 74 4c 61 73 74 3b 20 2f 2a 20  t *stmtLast; /* 
0de0: 4c 61 73 74 20 73 74 61 74 65 6d 65 6e 74 20 69  Last statement i
0df0: 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20  n the list */.  
0e00: 69 6e 74 20 6d 61 78 53 74 6d 74 3b 20 20 20 20  int maxStmt;    
0e10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
0e20: 65 20 6e 65 78 74 20 6d 61 78 69 6d 75 6d 20 6e  e next maximum n
0e30: 75 6d 62 65 72 20 6f 66 20 73 74 6d 74 4c 69 73  umber of stmtLis
0e40: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 74 6d 74  t */.  int nStmt
0e50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
0e60: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73    /* Number of s
0e70: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 73 74 6d  tatements in stm
0e80: 74 4c 69 73 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  tList */.};../*.
0e90: 2a 2a 20 4c 6f 6f 6b 20 61 74 20 74 68 65 20 73  ** Look at the s
0ea0: 63 72 69 70 74 20 70 72 65 66 69 78 20 69 6e 20  cript prefix in 
0eb0: 70 43 6d 64 2e 20 20 57 65 20 77 69 6c 6c 20 62  pCmd.  We will b
0ec0: 65 20 65 78 65 63 75 74 69 6e 67 20 74 68 69 73  e executing this
0ed0: 20 73 63 72 69 70 74 0a 2a 2a 20 61 66 74 65 72   script.** after
0ee0: 20 66 69 72 73 74 20 61 70 70 65 6e 64 69 6e 67   first appending
0ef0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 61 72 67   one or more arg
0f00: 75 6d 65 6e 74 73 2e 20 20 54 68 69 73 20 72 6f  uments.  This ro
0f10: 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65 73 0a 2a  utine analyzes.*
0f20: 2a 20 74 68 65 20 73 63 72 69 70 74 20 74 6f 20  * the script to 
0f30: 73 65 65 20 69 66 20 69 74 20 69 73 20 73 61 66  see if it is saf
0f40: 65 20 74 6f 20 75 73 65 20 54 63 6c 5f 45 76 61  e to use Tcl_Eva
0f50: 6c 4f 62 6a 76 28 29 20 6f 6e 20 74 68 65 20 73  lObjv() on the s
0f60: 63 72 69 70 74 0a 2a 2a 20 72 61 74 68 65 72 20  cript.** rather 
0f70: 74 68 61 6e 20 74 68 65 20 6d 6f 72 65 20 67 65  than the more ge
0f80: 6e 65 72 61 6c 20 54 63 6c 5f 45 76 61 6c 45 78  neral Tcl_EvalEx
0f90: 28 29 2e 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  ().  Tcl_EvalObj
0fa0: 76 28 29 20 69 73 20 6d 75 63 68 0a 2a 2a 20 66  v() is much.** f
0fb0: 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 63 72  aster..**.** Scr
0fc0: 69 70 74 73 20 74 68 61 74 20 61 72 65 20 73 61  ipts that are sa
0fd0: 66 65 20 74 6f 20 75 73 65 20 77 69 74 68 20 54  fe to use with T
0fe0: 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20 63 6f  cl_EvalObjv() co
0ff0: 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 63  nsists of a.** c
1000: 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20 66 6f 6c 6c  ommand name foll
1010: 6f 77 65 64 20 62 79 20 7a 65 72 6f 20 6f 72 20  owed by zero or 
1020: 6d 6f 72 65 20 61 72 67 75 6d 65 6e 74 73 20 77  more arguments w
1030: 69 74 68 20 6e 6f 20 5b 2e 2e 2e 5d 20 6f 72 20  ith no [...] or 
1040: 24 0a 2a 2a 20 6f 72 20 7b 2e 2e 2e 7d 20 6f 72  $.** or {...} or
1050: 20 3b 20 74 6f 20 62 65 20 73 65 65 6e 20 61 6e   ; to be seen an
1060: 79 77 68 65 72 65 2e 20 20 4d 6f 73 74 20 63 61  ywhere.  Most ca
1070: 6c 6c 62 61 63 6b 20 73 63 72 69 70 74 73 20 63  llback scripts c
1080: 6f 6e 73 69 73 74 0a 2a 2a 20 6f 66 20 6a 75 73  onsist.** of jus
1090: 74 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 63 65  t a single proce
10a0: 64 75 72 65 20 6e 61 6d 65 20 61 6e 64 20 74 68  dure name and th
10b0: 65 79 20 6d 65 65 74 20 74 68 69 73 20 72 65 71  ey meet this req
10c0: 75 69 72 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  uirement..*/.sta
10d0: 74 69 63 20 69 6e 74 20 73 61 66 65 54 6f 55 73  tic int safeToUs
10e0: 65 45 76 61 6c 4f 62 6a 76 28 54 63 6c 5f 49 6e  eEvalObjv(Tcl_In
10f0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 54 63  terp *interp, Tc
1100: 6c 5f 4f 62 6a 20 2a 70 43 6d 64 29 7b 0a 20 20  l_Obj *pCmd){.  
1110: 2f 2a 20 57 65 20 63 6f 75 6c 64 20 74 72 79 20  /* We could try 
1120: 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20  to do something 
1130: 77 69 74 68 20 54 63 6c 5f 50 61 72 73 65 28 29  with Tcl_Parse()
1140: 2e 20 20 42 75 74 20 77 65 20 77 69 6c 6c 20 69  .  But we will i
1150: 6e 73 74 65 61 64 0a 20 20 2a 2a 20 6a 75 73 74  nstead.  ** just
1160: 20 64 6f 20 61 20 73 65 61 72 63 68 20 66 6f 72   do a search for
1170: 20 66 6f 72 62 69 64 64 65 6e 20 63 68 61 72 61   forbidden chara
1180: 63 74 65 72 73 2e 20 20 49 66 20 61 6e 79 20 6f  cters.  If any o
1190: 66 20 74 68 65 20 66 6f 72 62 69 64 64 65 6e 0a  f the forbidden.
11a0: 20 20 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20    ** characters 
11b0: 61 70 70 65 61 72 20 69 6e 20 70 43 6d 64 2c 20  appear in pCmd, 
11c0: 77 65 20 77 69 6c 6c 20 72 65 70 6f 72 74 20 74  we will report t
11d0: 68 65 20 73 74 72 69 6e 67 20 61 73 20 75 6e 73  he string as uns
11e0: 61 66 65 2e 0a 20 20 2a 2f 0a 20 20 63 6f 6e 73  afe..  */.  cons
11f0: 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74  t char *z;.  int
1200: 20 6e 3b 0a 20 20 7a 20 3d 20 54 63 6c 5f 47 65   n;.  z = Tcl_Ge
1210: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70  tStringFromObj(p
1220: 43 6d 64 2c 20 26 6e 29 3b 0a 20 20 77 68 69 6c  Cmd, &n);.  whil
1230: 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20  e( n-- > 0 ){.  
1240: 20 20 69 6e 74 20 63 20 3d 20 2a 28 7a 2b 2b 29    int c = *(z++)
1250: 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 24 27  ;.    if( c=='$'
1260: 20 7c 7c 20 63 3d 3d 27 5b 27 20 7c 7c 20 63 3d   || c=='[' || c=
1270: 3d 27 3b 27 20 29 20 72 65 74 75 72 6e 20 30 3b  =';' ) return 0;
1280: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
1290: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61  .}../*.** Find a
12a0: 6e 20 53 71 6c 46 75 6e 63 20 73 74 72 75 63 74  n SqlFunc struct
12b0: 75 72 65 20 77 69 74 68 20 74 68 65 20 67 69 76  ure with the giv
12c0: 65 6e 20 6e 61 6d 65 2e 20 20 4f 72 20 63 72 65  en name.  Or cre
12d0: 61 74 65 20 61 20 6e 65 77 0a 2a 2a 20 6f 6e 65  ate a new.** one
12e0: 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20   if an existing 
12f0: 6f 6e 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f  one cannot be fo
1300: 75 6e 64 2e 20 20 52 65 74 75 72 6e 20 61 20 70  und.  Return a p
1310: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a  ointer to the.**
1320: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
1330: 74 61 74 69 63 20 53 71 6c 46 75 6e 63 20 2a 66  tatic SqlFunc *f
1340: 69 6e 64 53 71 6c 46 75 6e 63 28 53 71 6c 69 74  indSqlFunc(Sqlit
1350: 65 44 62 20 2a 70 44 62 2c 20 63 6f 6e 73 74 20  eDb *pDb, const 
1360: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
1370: 53 71 6c 46 75 6e 63 20 2a 70 2c 20 2a 70 4e 65  SqlFunc *p, *pNe
1380: 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 4e  w;.  int i;.  pN
1390: 65 77 20 3d 20 28 53 71 6c 46 75 6e 63 2a 29 54  ew = (SqlFunc*)T
13a0: 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  cl_Alloc( sizeof
13b0: 28 2a 70 4e 65 77 29 20 2b 20 73 74 72 6c 65 6e  (*pNew) + strlen
13c0: 28 7a 4e 61 6d 65 29 20 2b 20 31 20 29 3b 0a 20  (zName) + 1 );. 
13d0: 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 28   pNew->zName = (
13e0: 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a  char*)&pNew[1];.
13f0: 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4e 61 6d 65    for(i=0; zName
1400: 5b 69 5d 3b 20 69 2b 2b 29 7b 20 70 4e 65 77 2d  [i]; i++){ pNew-
1410: 3e 7a 4e 61 6d 65 5b 69 5d 20 3d 20 74 6f 6c 6f  >zName[i] = tolo
1420: 77 65 72 28 7a 4e 61 6d 65 5b 69 5d 29 3b 20 7d  wer(zName[i]); }
1430: 0a 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 5b 69  .  pNew->zName[i
1440: 5d 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 3d 70  ] = 0;.  for(p=p
1450: 44 62 2d 3e 70 46 75 6e 63 3b 20 70 3b 20 70 3d  Db->pFunc; p; p=
1460: 70 2d 3e 70 4e 65 78 74 29 7b 20 0a 20 20 20 20  p->pNext){ .    
1470: 69 66 28 20 73 74 72 63 6d 70 28 70 2d 3e 7a 4e  if( strcmp(p->zN
1480: 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65  ame, pNew->zName
1490: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63  )==0 ){.      Tc
14a0: 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 4e  l_Free((char*)pN
14b0: 65 77 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ew);.      retur
14c0: 6e 20 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n p;.    }.  }. 
14d0: 20 70 4e 65 77 2d 3e 69 6e 74 65 72 70 20 3d 20   pNew->interp = 
14e0: 70 44 62 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 70  pDb->interp;.  p
14f0: 4e 65 77 2d 3e 70 53 63 72 69 70 74 20 3d 20 30  New->pScript = 0
1500: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20  ;.  pNew->pNext 
1510: 3d 20 70 44 62 2d 3e 70 46 75 6e 63 3b 0a 20 20  = pDb->pFunc;.  
1520: 70 44 62 2d 3e 70 46 75 6e 63 20 3d 20 70 4e 65  pDb->pFunc = pNe
1530: 77 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  w;.  return pNew
1540: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 61 6c  ;.}../*.** Final
1550: 69 7a 65 20 61 6e 64 20 66 72 65 65 20 61 20 6c  ize and free a l
1560: 69 73 74 20 6f 66 20 70 72 65 70 61 72 65 64 20  ist of prepared 
1570: 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74  statements.*/.st
1580: 61 74 69 63 20 76 6f 69 64 20 66 6c 75 73 68 53  atic void flushS
1590: 74 6d 74 43 61 63 68 65 28 20 53 71 6c 69 74 65  tmtCache( Sqlite
15a0: 44 62 20 2a 70 44 62 20 29 7b 0a 20 20 53 71 6c  Db *pDb ){.  Sql
15b0: 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70 50  PreparedStmt *pP
15c0: 72 65 53 74 6d 74 3b 0a 0a 20 20 77 68 69 6c 65  reStmt;..  while
15d0: 28 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74  (  pDb->stmtList
15e0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
15f0: 66 69 6e 61 6c 69 7a 65 28 20 70 44 62 2d 3e 73  finalize( pDb->s
1600: 74 6d 74 4c 69 73 74 2d 3e 70 53 74 6d 74 20 29  tmtList->pStmt )
1610: 3b 0a 20 20 20 20 70 50 72 65 53 74 6d 74 20 3d  ;.    pPreStmt =
1620: 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 3b 0a   pDb->stmtList;.
1630: 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73      pDb->stmtLis
1640: 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73  t = pDb->stmtLis
1650: 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 54 63  t->pNext;.    Tc
1660: 6c 5f 46 72 65 65 28 20 28 63 68 61 72 2a 29 70  l_Free( (char*)p
1670: 50 72 65 53 74 6d 74 20 29 3b 0a 20 20 7d 0a 20  PreStmt );.  }. 
1680: 20 70 44 62 2d 3e 6e 53 74 6d 74 20 3d 20 30 3b   pDb->nStmt = 0;
1690: 0a 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74  .  pDb->stmtLast
16a0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   = 0;.}../*.** T
16b0: 43 4c 20 63 61 6c 6c 73 20 74 68 69 73 20 70 72  CL calls this pr
16c0: 6f 63 65 64 75 72 65 20 77 68 65 6e 20 61 6e 20  ocedure when an 
16d0: 73 71 6c 69 74 65 33 20 64 61 74 61 62 61 73 65  sqlite3 database
16e0: 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 64   command is.** d
16f0: 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  eleted..*/.stati
1700: 63 20 76 6f 69 64 20 44 62 44 65 6c 65 74 65 43  c void DbDeleteC
1710: 6d 64 28 76 6f 69 64 20 2a 64 62 29 7b 0a 20 20  md(void *db){.  
1720: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20  SqliteDb *pDb = 
1730: 28 53 71 6c 69 74 65 44 62 2a 29 64 62 3b 0a 20  (SqliteDb*)db;. 
1740: 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28   flushStmtCache(
1750: 70 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pDb);.  sqlite3_
1760: 63 6c 6f 73 65 28 70 44 62 2d 3e 64 62 29 3b 0a  close(pDb->db);.
1770: 20 20 77 68 69 6c 65 28 20 70 44 62 2d 3e 70 46    while( pDb->pF
1780: 75 6e 63 20 29 7b 0a 20 20 20 20 53 71 6c 46 75  unc ){.    SqlFu
1790: 6e 63 20 2a 70 46 75 6e 63 20 3d 20 70 44 62 2d  nc *pFunc = pDb-
17a0: 3e 70 46 75 6e 63 3b 0a 20 20 20 20 70 44 62 2d  >pFunc;.    pDb-
17b0: 3e 70 46 75 6e 63 20 3d 20 70 46 75 6e 63 2d 3e  >pFunc = pFunc->
17c0: 70 4e 65 78 74 3b 0a 20 20 20 20 54 63 6c 5f 44  pNext;.    Tcl_D
17d0: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 46 75 6e  ecrRefCount(pFun
17e0: 63 2d 3e 70 53 63 72 69 70 74 29 3b 0a 20 20 20  c->pScript);.   
17f0: 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a   Tcl_Free((char*
1800: 29 70 46 75 6e 63 29 3b 0a 20 20 7d 0a 20 20 77  )pFunc);.  }.  w
1810: 68 69 6c 65 28 20 70 44 62 2d 3e 70 43 6f 6c 6c  hile( pDb->pColl
1820: 61 74 65 20 29 7b 0a 20 20 20 20 53 71 6c 43 6f  ate ){.    SqlCo
1830: 6c 6c 61 74 65 20 2a 70 43 6f 6c 6c 61 74 65 20  llate *pCollate 
1840: 3d 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 3b  = pDb->pCollate;
1850: 0a 20 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61  .    pDb->pColla
1860: 74 65 20 3d 20 70 43 6f 6c 6c 61 74 65 2d 3e 70  te = pCollate->p
1870: 4e 65 78 74 3b 0a 20 20 20 20 54 63 6c 5f 46 72  Next;.    Tcl_Fr
1880: 65 65 28 28 63 68 61 72 2a 29 70 43 6f 6c 6c 61  ee((char*)pColla
1890: 74 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  te);.  }.  if( p
18a0: 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20  Db->zBusy ){.   
18b0: 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
18c0: 42 75 73 79 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Busy);.  }.  if(
18d0: 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a   pDb->zTrace ){.
18e0: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
18f0: 2d 3e 7a 54 72 61 63 65 29 3b 0a 20 20 7d 0a 20  ->zTrace);.  }. 
1900: 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74 68 20   if( pDb->zAuth 
1910: 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28  ){.    Tcl_Free(
1920: 70 44 62 2d 3e 7a 41 75 74 68 29 3b 0a 20 20 7d  pDb->zAuth);.  }
1930: 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 4e 75 6c  .  if( pDb->zNul
1940: 6c 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65  l ){.    Tcl_Fre
1950: 65 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20  e(pDb->zNull);. 
1960: 20 7d 0a 20 20 54 63 6c 5f 46 72 65 65 28 28 63   }.  Tcl_Free((c
1970: 68 61 72 2a 29 70 44 62 29 3b 0a 7d 0a 0a 2f 2a  har*)pDb);.}../*
1980: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1990: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
19a0: 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
19b0: 69 73 20 6c 6f 63 6b 65 64 20 77 68 69 6c 65 20  is locked while 
19c0: 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 65 78 65  trying.** to exe
19d0: 63 75 74 65 20 53 51 4c 2e 0a 2a 2f 0a 73 74 61  cute SQL..*/.sta
19e0: 74 69 63 20 69 6e 74 20 44 62 42 75 73 79 48 61  tic int DbBusyHa
19f0: 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 2c 20  ndler(void *cd, 
1a00: 69 6e 74 20 6e 54 72 69 65 73 29 7b 0a 20 20 53  int nTries){.  S
1a10: 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28  qliteDb *pDb = (
1a20: 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20  SqliteDb*)cd;.  
1a30: 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 7a  int rc;.  char z
1a40: 56 61 6c 5b 33 30 5d 3b 0a 0a 20 20 73 70 72 69  Val[30];..  spri
1a50: 6e 74 66 28 7a 56 61 6c 2c 20 22 25 64 22 2c 20  ntf(zVal, "%d", 
1a60: 6e 54 72 69 65 73 29 3b 0a 20 20 72 63 20 3d 20  nTries);.  rc = 
1a70: 54 63 6c 5f 56 61 72 45 76 61 6c 28 70 44 62 2d  Tcl_VarEval(pDb-
1a80: 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 42  >interp, pDb->zB
1a90: 75 73 79 2c 20 22 20 22 2c 20 7a 56 61 6c 2c 20  usy, " ", zVal, 
1aa0: 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 69 66 28  (char*)0);.  if(
1ab0: 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61   rc!=TCL_OK || a
1ac0: 74 6f 69 28 54 63 6c 5f 47 65 74 53 74 72 69 6e  toi(Tcl_GetStrin
1ad0: 67 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74  gResult(pDb->int
1ae0: 65 72 70 29 29 20 29 7b 0a 20 20 20 20 72 65 74  erp)) ){.    ret
1af0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
1b00: 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 1;.}../*.** 
1b10: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1b20: 69 6e 76 6f 6b 65 64 20 61 73 20 74 68 65 20 27  invoked as the '
1b30: 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63  progress callbac
1b40: 6b 27 20 66 6f 72 20 74 68 65 20 64 61 74 61 62  k' for the datab
1b50: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ase..*/.static i
1b60: 6e 74 20 44 62 50 72 6f 67 72 65 73 73 48 61 6e  nt DbProgressHan
1b70: 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 29 7b 0a  dler(void *cd){.
1b80: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
1b90: 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b  = (SqliteDb*)cd;
1ba0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
1bb0: 73 65 72 74 28 20 70 44 62 2d 3e 7a 50 72 6f 67  sert( pDb->zProg
1bc0: 72 65 73 73 20 29 3b 0a 20 20 72 63 20 3d 20 54  ress );.  rc = T
1bd0: 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74  cl_Eval(pDb->int
1be0: 65 72 70 2c 20 70 44 62 2d 3e 7a 50 72 6f 67 72  erp, pDb->zProgr
1bf0: 65 73 73 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ess);.  if( rc!=
1c00: 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28 54  TCL_OK || atoi(T
1c10: 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
1c20: 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 29  lt(pDb->interp))
1c30: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
1c40: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
1c50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1c60: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
1c70: 64 20 62 79 20 74 68 65 20 53 51 4c 69 74 65 20  d by the SQLite 
1c80: 74 72 61 63 65 20 68 61 6e 64 6c 65 72 20 77 68  trace handler wh
1c90: 65 6e 65 76 65 72 20 61 20 6e 65 77 0a 2a 2a 20  enever a new.** 
1ca0: 62 6c 6f 63 6b 20 6f 66 20 53 51 4c 20 69 73 20  block of SQL is 
1cb0: 65 78 65 63 75 74 65 64 2e 20 20 54 68 65 20 54  executed.  The T
1cc0: 43 4c 20 73 63 72 69 70 74 20 69 6e 20 70 44 62  CL script in pDb
1cd0: 2d 3e 7a 54 72 61 63 65 20 69 73 20 65 78 65 63  ->zTrace is exec
1ce0: 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uted..*/.static 
1cf0: 76 6f 69 64 20 44 62 54 72 61 63 65 48 61 6e 64  void DbTraceHand
1d00: 6c 65 72 28 76 6f 69 64 20 2a 63 64 2c 20 63 6f  ler(void *cd, co
1d10: 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 29 7b  nst char *zSql){
1d20: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
1d30: 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64   = (SqliteDb*)cd
1d40: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20  ;.  Tcl_DString 
1d50: 73 74 72 3b 0a 0a 20 20 54 63 6c 5f 44 53 74 72  str;..  Tcl_DStr
1d60: 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20  ingInit(&str);. 
1d70: 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65   Tcl_DStringAppe
1d80: 6e 64 28 26 73 74 72 2c 20 70 44 62 2d 3e 7a 54  nd(&str, pDb->zT
1d90: 72 61 63 65 2c 20 2d 31 29 3b 0a 20 20 54 63 6c  race, -1);.  Tcl
1da0: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c  _DStringAppendEl
1db0: 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 53 71 6c  ement(&str, zSql
1dc0: 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 28 70 44  );.  Tcl_Eval(pD
1dd0: 62 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44  b->interp, Tcl_D
1de0: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72  StringValue(&str
1df0: 29 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  ));.  Tcl_DStrin
1e00: 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20 54  gFree(&str);.  T
1e10: 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 70  cl_ResetResult(p
1e20: 44 62 2d 3e 69 6e 74 65 72 70 29 3b 0a 7d 0a 0a  Db->interp);.}..
1e30: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1e40: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
1e50: 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  n a transaction 
1e60: 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 54  is committed.  T
1e70: 68 65 0a 2a 2a 20 54 43 4c 20 73 63 72 69 70 74  he.** TCL script
1e80: 20 69 6e 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74   in pDb->zCommit
1e90: 20 69 73 20 65 78 65 63 75 74 65 64 2e 20 20 49   is executed.  I
1ea0: 66 20 69 74 20 72 65 74 75 72 6e 73 20 6e 6f 6e  f it returns non
1eb0: 2d 7a 65 72 6f 20 6f 72 0a 2a 2a 20 69 66 20 69  -zero or.** if i
1ec0: 74 20 74 68 72 6f 77 73 20 61 6e 20 65 78 63 65  t throws an exce
1ed0: 70 74 69 6f 6e 2c 20 74 68 65 20 74 72 61 6e 73  ption, the trans
1ee0: 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
1ef0: 20 62 61 63 6b 20 69 6e 73 74 65 61 64 0a 2a 2a   back instead.**
1f00: 20 6f 66 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74   of being commit
1f10: 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ted..*/.static i
1f20: 6e 74 20 44 62 43 6f 6d 6d 69 74 48 61 6e 64 6c  nt DbCommitHandl
1f30: 65 72 28 76 6f 69 64 20 2a 63 64 29 7b 0a 20 20  er(void *cd){.  
1f40: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20  SqliteDb *pDb = 
1f50: 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20  (SqliteDb*)cd;. 
1f60: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d   int rc;..  rc =
1f70: 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69   Tcl_Eval(pDb->i
1f80: 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 43 6f 6d  nterp, pDb->zCom
1f90: 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  mit);.  if( rc!=
1fa0: 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28 54  TCL_OK || atoi(T
1fb0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
1fc0: 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 29  lt(pDb->interp))
1fd0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
1fe0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
1ff0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
2000: 20 74 63 6c 43 6f 6c 6c 61 74 65 4e 65 65 64 65   tclCollateNeede
2010: 64 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c  d(.  void *pCtx,
2020: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
2030: 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 63 6f 6e    int enc,.  con
2040: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29  st char *zName.)
2050: 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  {.  SqliteDb *pD
2060: 62 20 3d 20 28 53 71 6c 69 74 65 44 62 20 2a 29  b = (SqliteDb *)
2070: 70 43 74 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  pCtx;.  Tcl_Obj 
2080: 2a 70 53 63 72 69 70 74 20 3d 20 54 63 6c 5f 44  *pScript = Tcl_D
2090: 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 44 62 2d  uplicateObj(pDb-
20a0: 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29  >pCollateNeeded)
20b0: 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43  ;.  Tcl_IncrRefC
20c0: 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 20  ount(pScript);. 
20d0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
20e0: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 53 63  ndElement(0, pSc
20f0: 72 69 70 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72  ript, Tcl_NewStr
2100: 69 6e 67 4f 62 6a 28 7a 4e 61 6d 65 2c 20 2d 31  ingObj(zName, -1
2110: 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62  ));.  Tcl_EvalOb
2120: 6a 45 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c  jEx(pDb->interp,
2130: 20 70 53 63 72 69 70 74 2c 20 30 29 3b 0a 20 20   pScript, 0);.  
2140: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
2150: 28 70 53 63 72 69 70 74 29 3b 0a 7d 0a 0a 2f 2a  (pScript);.}../*
2160: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2170: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 65 76   is called to ev
2180: 61 6c 75 61 74 65 20 61 6e 20 53 51 4c 20 63 6f  aluate an SQL co
2190: 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  llation function
21a0: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20   implemented.** 
21b0: 75 73 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74  using TCL script
21c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
21d0: 74 63 6c 53 71 6c 43 6f 6c 6c 61 74 65 28 0a 20  tclSqlCollate(. 
21e0: 20 76 6f 69 64 20 2a 70 43 74 78 2c 0a 20 20 69   void *pCtx,.  i
21f0: 6e 74 20 6e 41 2c 0a 20 20 63 6f 6e 73 74 20 76  nt nA,.  const v
2200: 6f 69 64 20 2a 7a 41 2c 0a 20 20 69 6e 74 20 6e  oid *zA,.  int n
2210: 42 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  B,.  const void 
2220: 2a 7a 42 0a 29 7b 0a 20 20 53 71 6c 43 6f 6c 6c  *zB.){.  SqlColl
2230: 61 74 65 20 2a 70 20 3d 20 28 53 71 6c 43 6f 6c  ate *p = (SqlCol
2240: 6c 61 74 65 20 2a 29 70 43 74 78 3b 0a 20 20 54  late *)pCtx;.  T
2250: 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 0a 20  cl_Obj *pCmd;.. 
2260: 20 70 43 6d 64 20 3d 20 54 63 6c 5f 4e 65 77 53   pCmd = Tcl_NewS
2270: 74 72 69 6e 67 4f 62 6a 28 70 2d 3e 7a 53 63 72  tringObj(p->zScr
2280: 69 70 74 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f  ipt, -1);.  Tcl_
2290: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d  IncrRefCount(pCm
22a0: 64 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  d);.  Tcl_ListOb
22b0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70  jAppendElement(p
22c0: 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20  ->interp, pCmd, 
22d0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
22e0: 28 7a 41 2c 20 6e 41 29 29 3b 0a 20 20 54 63 6c  (zA, nA));.  Tcl
22f0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
2300: 65 6d 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c  ement(p->interp,
2310: 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74   pCmd, Tcl_NewSt
2320: 72 69 6e 67 4f 62 6a 28 7a 42 2c 20 6e 42 29 29  ringObj(zB, nB))
2330: 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  ;.  Tcl_EvalObjE
2340: 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d  x(p->interp, pCm
2350: 64 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45  d, TCL_EVAL_DIRE
2360: 43 54 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52  CT);.  Tcl_DecrR
2370: 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20  efCount(pCmd);. 
2380: 20 72 65 74 75 72 6e 20 28 61 74 6f 69 28 54 63   return (atoi(Tc
2390: 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
23a0: 74 28 70 2d 3e 69 6e 74 65 72 70 29 29 29 3b 0a  t(p->interp)));.
23b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
23c0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
23d0: 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20 53  to evaluate an S
23e0: 51 4c 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c  QL function impl
23f0: 65 6d 65 6e 74 65 64 0a 2a 2a 20 75 73 69 6e 67  emented.** using
2400: 20 54 43 4c 20 73 63 72 69 70 74 2e 0a 2a 2f 0a   TCL script..*/.
2410: 73 74 61 74 69 63 20 76 6f 69 64 20 74 63 6c 53  static void tclS
2420: 71 6c 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63  qlFunc(sqlite3_c
2430: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
2440: 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
2450: 65 33 5f 76 61 6c 75 65 2a 2a 61 72 67 76 29 7b  e3_value**argv){
2460: 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70 20 3d 20  .  SqlFunc *p = 
2470: 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
2480: 61 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 54 63  a(context);.  Tc
2490: 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 20 20 69  l_Obj *pCmd;.  i
24a0: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  nt i;.  int rc;.
24b0: 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 30 20 29  .  if( argc==0 )
24c0: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
24d0: 65 20 61 72 65 20 6e 6f 20 61 72 67 75 6d 65 6e  e are no argumen
24e0: 74 73 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69  ts to the functi
24f0: 6f 6e 2c 20 63 61 6c 6c 20 54 63 6c 5f 45 76 61  on, call Tcl_Eva
2500: 6c 4f 62 6a 45 78 20 6f 6e 20 74 68 65 0a 20 20  lObjEx on the.  
2510: 20 20 2a 2a 20 73 63 72 69 70 74 20 6f 62 6a 65    ** script obje
2520: 63 74 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68  ct directly.  Th
2530: 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 54 43  is allows the TC
2540: 4c 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20 67 65  L compiler to ge
2550: 6e 65 72 61 74 65 0a 20 20 20 20 2a 2a 20 62 79  nerate.    ** by
2560: 74 65 63 6f 64 65 20 66 6f 72 20 74 68 65 20 63  tecode for the c
2570: 6f 6d 6d 61 6e 64 20 6f 6e 20 74 68 65 20 66 69  ommand on the fi
2580: 72 73 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20 61  rst invocation a
2590: 6e 64 20 74 68 75 73 20 6d 61 6b 65 0a 20 20 20  nd thus make.   
25a0: 20 2a 2a 20 73 75 62 73 65 71 75 65 6e 74 20 69   ** subsequent i
25b0: 6e 76 6f 63 61 74 69 6f 6e 73 20 6d 75 63 68 20  nvocations much 
25c0: 66 61 73 74 65 72 2e 20 2a 2f 0a 20 20 20 20 70  faster. */.    p
25d0: 43 6d 64 20 3d 20 70 2d 3e 70 53 63 72 69 70 74  Cmd = p->pScript
25e0: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ;.    Tcl_IncrRe
25f0: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20  fCount(pCmd);.  
2600: 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f    rc = Tcl_EvalO
2610: 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20  bjEx(p->interp, 
2620: 70 43 6d 64 2c 20 30 29 3b 0a 20 20 20 20 54 63  pCmd, 0);.    Tc
2630: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
2640: 43 6d 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Cmd);.  }else{. 
2650: 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
2660: 72 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  re arguments to 
2670: 74 68 65 20 66 75 6e 63 74 69 6f 6e 2c 20 6d 61  the function, ma
2680: 6b 65 20 61 20 73 68 61 6c 6c 6f 77 20 63 6f 70  ke a shallow cop
2690: 79 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  y of the.    ** 
26a0: 73 63 72 69 70 74 20 6f 62 6a 65 63 74 2c 20 6c  script object, l
26b0: 61 70 70 65 6e 64 20 74 68 65 20 61 72 67 75 6d  append the argum
26c0: 65 6e 74 73 2c 20 74 68 65 6e 20 65 76 61 6c 75  ents, then evalu
26d0: 61 74 65 20 74 68 65 20 63 6f 70 79 2e 0a 20 20  ate the copy..  
26e0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 42 79 20 22    **.    ** By "
26f0: 73 68 61 6c 6c 6f 77 22 20 63 6f 70 79 2c 20 77  shallow" copy, w
2700: 65 20 6d 65 61 6e 20 61 20 6f 6e 6c 79 20 74 68  e mean a only th
2710: 65 20 6f 75 74 65 72 20 6c 69 73 74 20 54 63 6c  e outer list Tcl
2720: 5f 4f 62 6a 20 69 73 20 64 75 70 6c 69 63 61 74  _Obj is duplicat
2730: 65 64 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6e  ed..    ** The n
2740: 65 77 20 54 63 6c 5f 4f 62 6a 20 63 6f 6e 74 61  ew Tcl_Obj conta
2750: 69 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  ins pointers to 
2760: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6c 69 73  the original lis
2770: 74 20 65 6c 65 6d 65 6e 74 73 2e 20 0a 20 20 20  t elements. .   
2780: 20 2a 2a 20 54 68 61 74 20 77 61 79 2c 20 77 68   ** That way, wh
2790: 65 6e 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28  en Tcl_EvalObjv(
27a0: 29 20 69 73 20 72 75 6e 20 61 6e 64 20 73 68 69  ) is run and shi
27b0: 6d 6d 65 72 73 20 74 68 65 20 66 69 72 73 74 20  mmers the first 
27c0: 65 6c 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 6f  element.    ** o
27d0: 66 20 74 68 65 20 6c 69 73 74 20 74 6f 20 74 63  f the list to tc
27e0: 6c 43 6d 64 4e 61 6d 65 54 79 70 65 2c 20 74 68  lCmdNameType, th
27f0: 61 74 20 61 6c 74 65 72 6e 61 74 65 20 72 65 70  at alternate rep
2800: 72 65 73 65 6e 74 61 74 69 6f 6e 20 77 69 6c 6c  resentation will
2810: 0a 20 20 20 20 2a 2a 20 62 65 20 70 72 65 73 65  .    ** be prese
2820: 72 76 65 64 20 61 6e 64 20 72 65 75 73 65 64 20  rved and reused 
2830: 6f 6e 20 74 68 65 20 6e 65 78 74 20 69 6e 76 6f  on the next invo
2840: 63 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  cation..    */. 
2850: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 41 72     Tcl_Obj **aAr
2860: 67 3b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b  g;.    int nArg;
2870: 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 4c 69 73  .    if( Tcl_Lis
2880: 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28  tObjGetElements(
2890: 70 2d 3e 69 6e 74 65 72 70 2c 20 70 2d 3e 70 53  p->interp, p->pS
28a0: 63 72 69 70 74 2c 20 26 6e 41 72 67 2c 20 26 61  cript, &nArg, &a
28b0: 41 72 67 29 20 29 7b 0a 20 20 20 20 20 20 73 71  Arg) ){.      sq
28c0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
28d0: 6f 72 28 63 6f 6e 74 65 78 74 2c 20 54 63 6c 5f  or(context, Tcl_
28e0: 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28  GetStringResult(
28f0: 70 2d 3e 69 6e 74 65 72 70 29 2c 20 2d 31 29 3b  p->interp), -1);
2900: 20 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a   .      return;.
2910: 20 20 20 20 7d 20 20 20 20 20 0a 20 20 20 20 70      }     .    p
2920: 43 6d 64 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73  Cmd = Tcl_NewLis
2930: 74 4f 62 6a 28 6e 41 72 67 2c 20 61 41 72 67 29  tObj(nArg, aArg)
2940: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ;.    Tcl_IncrRe
2950: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20  fCount(pCmd);.  
2960: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67    for(i=0; i<arg
2970: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  c; i++){.      s
2980: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 49  qlite3_value *pI
2990: 6e 20 3d 20 61 72 67 76 5b 69 5d 3b 0a 20 20 20  n = argv[i];.   
29a0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c     Tcl_Obj *pVal
29b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 0a 20  ;.            . 
29c0: 20 20 20 20 20 2f 2a 20 53 65 74 20 70 56 61 6c       /* Set pVal
29d0: 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
29e0: 69 27 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  i'th column of t
29f0: 68 69 73 20 72 6f 77 2e 20 2a 2f 0a 20 20 20 20  his row. */.    
2a00: 20 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65    switch( sqlite
2a10: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 49 6e  3_value_type(pIn
2a20: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73  ) ){.        cas
2a30: 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b  e SQLITE_BLOB: {
2a40: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 62  .          int b
2a50: 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  ytes = sqlite3_v
2a60: 61 6c 75 65 5f 62 79 74 65 73 28 70 49 6e 29 3b  alue_bytes(pIn);
2a70: 0a 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20  .          pVal 
2a80: 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72  = Tcl_NewByteArr
2a90: 61 79 4f 62 6a 28 73 71 6c 69 74 65 33 5f 76 61  ayObj(sqlite3_va
2aa0: 6c 75 65 5f 62 6c 6f 62 28 70 49 6e 29 2c 20 62  lue_blob(pIn), b
2ab0: 79 74 65 73 29 3b 0a 20 20 20 20 20 20 20 20 20  ytes);.         
2ac0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2ad0: 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53  }.        case S
2ae0: 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b  QLITE_INTEGER: {
2af0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2b00: 65 5f 69 6e 74 36 34 20 76 20 3d 20 73 71 6c 69  e_int64 v = sqli
2b10: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28  te3_value_int64(
2b20: 70 49 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pIn);.          
2b30: 69 66 28 20 76 3e 3d 2d 32 31 34 37 34 38 33 36  if( v>=-21474836
2b40: 34 37 20 26 26 20 76 3c 3d 32 31 34 37 34 38 33  47 && v<=2147483
2b50: 36 34 37 20 29 7b 0a 20 20 20 20 20 20 20 20 20  647 ){.         
2b60: 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65     pVal = Tcl_Ne
2b70: 77 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20 20  wIntObj(v);.    
2b80: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2b90: 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20           pVal = 
2ba0: 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62  Tcl_NewWideIntOb
2bb0: 6a 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  j(v);.          
2bc0: 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  }.          brea
2bd0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
2be0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
2bf0: 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20  _FLOAT: {.      
2c00: 20 20 20 20 64 6f 75 62 6c 65 20 72 20 3d 20 73      double r = s
2c10: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75  qlite3_value_dou
2c20: 62 6c 65 28 70 49 6e 29 3b 0a 20 20 20 20 20 20  ble(pIn);.      
2c30: 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e      pVal = Tcl_N
2c40: 65 77 44 6f 75 62 6c 65 4f 62 6a 28 72 29 3b 0a  ewDoubleObj(r);.
2c50: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
2c60: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2c70: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e     case SQLITE_N
2c80: 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  ULL: {.         
2c90: 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 53   pVal = Tcl_NewS
2ca0: 74 72 69 6e 67 4f 62 6a 28 22 22 2c 20 30 29 3b  tringObj("", 0);
2cb0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
2cc0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2cd0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
2ce0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 62 79 74           int byt
2cf0: 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  es = sqlite3_val
2d00: 75 65 5f 62 79 74 65 73 28 70 49 6e 29 3b 0a 20  ue_bytes(pIn);. 
2d10: 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20           pVal = 
2d20: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
2d30: 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
2d40: 65 78 74 28 70 49 6e 29 2c 20 62 79 74 65 73 29  ext(pIn), bytes)
2d50: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
2d60: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
2d70: 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
2d80: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2d90: 64 45 6c 65 6d 65 6e 74 28 70 2d 3e 69 6e 74 65  dElement(p->inte
2da0: 72 70 2c 20 70 43 6d 64 2c 20 70 56 61 6c 29 3b  rp, pCmd, pVal);
2db0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
2dc0: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63  .        Tcl_Dec
2dd0: 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b  rRefCount(pCmd);
2de0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2df0: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f  _result_error(co
2e00: 6e 74 65 78 74 2c 20 54 63 6c 5f 47 65 74 53 74  ntext, Tcl_GetSt
2e10: 72 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e  ringResult(p->in
2e20: 74 65 72 70 29 2c 20 2d 31 29 3b 20 0a 20 20 20  terp), -1); .   
2e30: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
2e40: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
2e50: 66 28 20 21 70 2d 3e 75 73 65 45 76 61 6c 4f 62  f( !p->useEvalOb
2e60: 6a 76 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  jv ){.      /* T
2e70: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 29 20 77  cl_EvalObjEx() w
2e80: 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ill automaticall
2e90: 79 20 63 61 6c 6c 20 54 63 6c 5f 45 76 61 6c 4f  y call Tcl_EvalO
2ea0: 62 6a 76 28 29 20 69 66 20 70 43 6d 64 0a 20 20  bjv() if pCmd.  
2eb0: 20 20 20 20 2a 2a 20 69 73 20 61 20 6c 69 73 74      ** is a list
2ec0: 20 77 69 74 68 6f 75 74 20 61 20 73 74 72 69 6e   without a strin
2ed0: 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  g representation
2ee0: 2e 20 20 54 6f 20 70 72 65 76 65 6e 74 20 74 68  .  To prevent th
2ef0: 69 73 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a  is from.      **
2f00: 20 68 61 70 70 65 6e 69 6e 67 2c 20 6d 61 6b 65   happening, make
2f10: 20 73 75 72 65 20 70 43 6d 64 20 68 61 73 20 61   sure pCmd has a
2f20: 20 76 61 6c 69 64 20 73 74 72 69 6e 67 20 72 65   valid string re
2f30: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a  presentation */.
2f40: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
2f50: 69 6e 67 28 70 43 6d 64 29 3b 0a 20 20 20 20 7d  ing(pCmd);.    }
2f60: 0a 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 45 76  .    rc = Tcl_Ev
2f70: 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72  alObjEx(p->inter
2f80: 70 2c 20 70 43 6d 64 2c 20 54 43 4c 5f 45 56 41  p, pCmd, TCL_EVA
2f90: 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20 20 20 54  L_DIRECT);.    T
2fa0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
2fb0: 70 43 6d 64 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  pCmd);.  }..  if
2fc0: 28 20 72 63 20 26 26 20 72 63 21 3d 54 43 4c 5f  ( rc && rc!=TCL_
2fd0: 52 45 54 55 52 4e 20 29 7b 0a 20 20 20 20 73 71  RETURN ){.    sq
2fe0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
2ff0: 6f 72 28 63 6f 6e 74 65 78 74 2c 20 54 63 6c 5f  or(context, Tcl_
3000: 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28  GetStringResult(
3010: 70 2d 3e 69 6e 74 65 72 70 29 2c 20 2d 31 29 3b  p->interp), -1);
3020: 20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54   .  }else{.    T
3030: 63 6c 5f 4f 62 6a 20 2a 70 56 61 72 20 3d 20 54  cl_Obj *pVar = T
3040: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_GetObjResult(
3050: 70 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  p->interp);.    
3060: 69 6e 74 20 6e 3b 0a 20 20 20 20 75 38 20 2a 64  int n;.    u8 *d
3070: 61 74 61 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ata;.    char *z
3080: 54 79 70 65 20 3d 20 70 56 61 72 2d 3e 74 79 70  Type = pVar->typ
3090: 65 50 74 72 20 3f 20 70 56 61 72 2d 3e 74 79 70  ePtr ? pVar->typ
30a0: 65 50 74 72 2d 3e 6e 61 6d 65 20 3a 20 22 22 3b  ePtr->name : "";
30b0: 0a 20 20 20 20 63 68 61 72 20 63 20 3d 20 7a 54  .    char c = zT
30c0: 79 70 65 5b 30 5d 3b 0a 20 20 20 20 69 66 28 20  ype[0];.    if( 
30d0: 63 3d 3d 27 62 27 20 26 26 20 73 74 72 63 6d 70  c=='b' && strcmp
30e0: 28 7a 54 79 70 65 2c 22 62 79 74 65 61 72 72 61  (zType,"bytearra
30f0: 79 22 29 3d 3d 30 20 26 26 20 70 56 61 72 2d 3e  y")==0 && pVar->
3100: 62 79 74 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  bytes==0 ){.    
3110: 20 20 2f 2a 20 4f 6e 6c 79 20 72 65 74 75 72 6e    /* Only return
3120: 20 61 20 42 4c 4f 42 20 74 79 70 65 20 69 66 20   a BLOB type if 
3130: 74 68 65 20 54 63 6c 20 76 61 72 69 61 62 6c 65  the Tcl variable
3140: 20 69 73 20 61 20 62 79 74 65 61 72 72 61 79 20   is a bytearray 
3150: 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 68 61 73  and.      ** has
3160: 20 6e 6f 20 73 74 72 69 6e 67 20 72 65 70 72 65   no string repre
3170: 73 65 6e 74 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20  sentation. */.  
3180: 20 20 20 20 64 61 74 61 20 3d 20 54 63 6c 5f 47      data = Tcl_G
3190: 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f  etByteArrayFromO
31a0: 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20  bj(pVar, &n);.  
31b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
31c0: 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c  lt_blob(context,
31d0: 20 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45   data, n, SQLITE
31e0: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
31f0: 20 7d 65 6c 73 65 20 69 66 28 20 28 63 3d 3d 27   }else if( (c=='
3200: 62 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79  b' && strcmp(zTy
3210: 70 65 2c 22 62 6f 6f 6c 65 61 6e 22 29 3d 3d 30  pe,"boolean")==0
3220: 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 28  ) ||.          (
3230: 63 3d 3d 27 69 27 20 26 26 20 73 74 72 63 6d 70  c=='i' && strcmp
3240: 28 7a 54 79 70 65 2c 22 69 6e 74 22 29 3d 3d 30  (zType,"int")==0
3250: 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 47  ) ){.      Tcl_G
3260: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 30 2c 20  etIntFromObj(0, 
3270: 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20  pVar, &n);.     
3280: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
3290: 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 6e 29 3b  int(context, n);
32a0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
32b0: 3d 3d 27 64 27 20 26 26 20 73 74 72 63 6d 70 28  =='d' && strcmp(
32c0: 7a 54 79 70 65 2c 22 64 6f 75 62 6c 65 22 29 3d  zType,"double")=
32d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 6f 75 62  =0 ){.      doub
32e0: 6c 65 20 72 3b 0a 20 20 20 20 20 20 54 63 6c 5f  le r;.      Tcl_
32f0: 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a  GetDoubleFromObj
3300: 28 30 2c 20 70 56 61 72 2c 20 26 72 29 3b 0a 20  (0, pVar, &r);. 
3310: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
3320: 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65  ult_double(conte
3330: 78 74 2c 20 72 29 3b 0a 20 20 20 20 7d 65 6c 73  xt, r);.    }els
3340: 65 20 69 66 28 20 63 3d 3d 27 77 27 20 26 26 20  e if( c=='w' && 
3350: 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 77 69  strcmp(zType,"wi
3360: 64 65 49 6e 74 22 29 3d 3d 30 20 29 7b 0a 20 20  deInt")==0 ){.  
3370: 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20      Tcl_WideInt 
3380: 76 3b 0a 20 20 20 20 20 20 54 63 6c 5f 47 65 74  v;.      Tcl_Get
3390: 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 30  WideIntFromObj(0
33a0: 2c 20 70 56 61 72 2c 20 26 76 29 3b 0a 20 20 20  , pVar, &v);.   
33b0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
33c0: 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c  t_int64(context,
33d0: 20 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   v);.    }else{.
33e0: 20 20 20 20 20 20 64 61 74 61 20 3d 20 54 63 6c        data = Tcl
33f0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
3400: 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20  j(pVar, &n);.   
3410: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
3420: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
3430: 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f  data, n, SQLITE_
3440: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
3450: 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  }.  }.}..#ifndef
3460: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
3470: 48 4f 52 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a  HORIZATION./*.**
3480: 20 54 68 69 73 20 69 73 20 74 68 65 20 61 75 74   This is the aut
3490: 68 65 6e 74 69 63 61 74 69 6f 6e 20 66 75 6e 63  hentication func
34a0: 74 69 6f 6e 2e 20 20 49 74 20 61 70 70 65 6e 64  tion.  It append
34b0: 73 20 74 68 65 20 61 75 74 68 65 6e 74 69 63 61  s the authentica
34c0: 74 69 6f 6e 0a 2a 2a 20 74 79 70 65 20 63 6f 64  tion.** type cod
34d0: 65 20 61 6e 64 20 74 68 65 20 74 77 6f 20 61 72  e and the two ar
34e0: 67 75 6d 65 6e 74 73 20 74 6f 20 7a 43 6d 64 5b  guments to zCmd[
34f0: 5d 20 74 68 65 6e 20 69 6e 76 6f 6b 65 73 20 74  ] then invokes t
3500: 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 6f 6e 20  he result.** on 
3510: 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e  the interpreter.
3520: 20 20 54 68 65 20 72 65 70 6c 79 20 69 73 20 65    The reply is e
3530: 78 61 6d 69 6e 65 64 20 74 6f 20 64 65 74 65 72  xamined to deter
3540: 6d 69 6e 65 20 69 66 20 74 68 65 0a 2a 2a 20 61  mine if the.** a
3550: 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 66 61  uthentication fa
3560: 69 6c 73 20 6f 72 20 73 75 63 63 65 65 64 73 2e  ils or succeeds.
3570: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
3580: 75 74 68 5f 63 61 6c 6c 62 61 63 6b 28 0a 20 20  uth_callback(.  
3590: 76 6f 69 64 20 2a 70 41 72 67 2c 0a 20 20 69 6e  void *pArg,.  in
35a0: 74 20 63 6f 64 65 2c 0a 20 20 63 6f 6e 73 74 20  t code,.  const 
35b0: 63 68 61 72 20 2a 7a 41 72 67 31 2c 0a 20 20 63  char *zArg1,.  c
35c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 32  onst char *zArg2
35d0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
35e0: 7a 41 72 67 33 2c 0a 20 20 63 6f 6e 73 74 20 63  zArg3,.  const c
35f0: 68 61 72 20 2a 7a 41 72 67 34 0a 29 7b 0a 20 20  har *zArg4.){.  
3600: 63 68 61 72 20 2a 7a 43 6f 64 65 3b 0a 20 20 54  char *zCode;.  T
3610: 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a  cl_DString str;.
3620: 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73    int rc;.  cons
3630: 74 20 63 68 61 72 20 2a 7a 52 65 70 6c 79 3b 0a  t char *zReply;.
3640: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
3650: 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 70 41 72  = (SqliteDb*)pAr
3660: 67 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 63 6f  g;..  switch( co
3670: 64 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  de ){.    case S
3680: 51 4c 49 54 45 5f 43 4f 50 59 20 20 20 20 20 20  QLITE_COPY      
3690: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
36a0: 22 53 51 4c 49 54 45 5f 43 4f 50 59 22 3b 20 62  "SQLITE_COPY"; b
36b0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
36c0: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44  QLITE_CREATE_IND
36d0: 45 58 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d  EX      : zCode=
36e0: 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49  "SQLITE_CREATE_I
36f0: 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20  NDEX"; break;.  
3700: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52    case SQLITE_CR
3710: 45 41 54 45 5f 54 41 42 4c 45 20 20 20 20 20 20  EATE_TABLE      
3720: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
3730: 43 52 45 41 54 45 5f 54 41 42 4c 45 22 3b 20 62  CREATE_TABLE"; b
3740: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
3750: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
3760: 50 5f 49 4e 44 45 58 20 3a 20 7a 43 6f 64 65 3d  P_INDEX : zCode=
3770: 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54  "SQLITE_CREATE_T
3780: 45 4d 50 5f 49 4e 44 45 58 22 3b 20 62 72 65 61  EMP_INDEX"; brea
3790: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
37a0: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54  TE_CREATE_TEMP_T
37b0: 41 42 4c 45 20 3a 20 7a 43 6f 64 65 3d 22 53 51  ABLE : zCode="SQ
37c0: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50  LITE_CREATE_TEMP
37d0: 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a  _TABLE"; break;.
37e0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
37f0: 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 52 49 47  CREATE_TEMP_TRIG
3800: 47 45 52 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49  GER: zCode="SQLI
3810: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54  TE_CREATE_TEMP_T
3820: 52 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a  RIGGER"; break;.
3830: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
3840: 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57  CREATE_TEMP_VIEW
3850: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
3860: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49  E_CREATE_TEMP_VI
3870: 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  EW"; break;.    
3880: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41  case SQLITE_CREA
3890: 54 45 5f 54 52 49 47 47 45 52 20 20 20 20 3a 20  TE_TRIGGER    : 
38a0: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52  zCode="SQLITE_CR
38b0: 45 41 54 45 5f 54 52 49 47 47 45 52 22 3b 20 62  EATE_TRIGGER"; b
38c0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
38d0: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45  QLITE_CREATE_VIE
38e0: 57 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d  W       : zCode=
38f0: 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56  "SQLITE_CREATE_V
3900: 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  IEW"; break;.   
3910: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 45 4c   case SQLITE_DEL
3920: 45 54 45 20 20 20 20 20 20 20 20 20 20 20 20 3a  ETE            :
3930: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44   zCode="SQLITE_D
3940: 45 4c 45 54 45 22 3b 20 62 72 65 61 6b 3b 0a 20  ELETE"; break;. 
3950: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
3960: 52 4f 50 5f 49 4e 44 45 58 20 20 20 20 20 20 20  ROP_INDEX       
3970: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
3980: 5f 44 52 4f 50 5f 49 4e 44 45 58 22 3b 20 62 72  _DROP_INDEX"; br
3990: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
39a0: 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 20  LITE_DROP_TABLE 
39b0: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
39c0: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c  SQLITE_DROP_TABL
39d0: 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  E"; break;.    c
39e0: 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  ase SQLITE_DROP_
39f0: 54 45 4d 50 5f 49 4e 44 45 58 20 20 20 3a 20 7a  TEMP_INDEX   : z
3a00: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f  Code="SQLITE_DRO
3a10: 50 5f 54 45 4d 50 5f 49 4e 44 45 58 22 3b 20 62  P_TEMP_INDEX"; b
3a20: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
3a30: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
3a40: 54 41 42 4c 45 20 20 20 3a 20 7a 43 6f 64 65 3d  TABLE   : zCode=
3a50: 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d  "SQLITE_DROP_TEM
3a60: 50 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b  P_TABLE"; break;
3a70: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
3a80: 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 52 49 47 47  _DROP_TEMP_TRIGG
3a90: 45 52 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49  ER : zCode="SQLI
3aa0: 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 52 49  TE_DROP_TEMP_TRI
3ab0: 47 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20  GGER"; break;.  
3ac0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52    case SQLITE_DR
3ad0: 4f 50 5f 54 45 4d 50 5f 56 49 45 57 20 20 20 20  OP_TEMP_VIEW    
3ae0: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
3af0: 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 22 3b  DROP_TEMP_VIEW";
3b00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
3b10: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 52 49   SQLITE_DROP_TRI
3b20: 47 47 45 52 20 20 20 20 20 20 3a 20 7a 43 6f 64  GGER      : zCod
3b30: 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54  e="SQLITE_DROP_T
3b40: 52 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a  RIGGER"; break;.
3b50: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
3b60: 44 52 4f 50 5f 56 49 45 57 20 20 20 20 20 20 20  DROP_VIEW       
3b70: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
3b80: 45 5f 44 52 4f 50 5f 56 49 45 57 22 3b 20 62 72  E_DROP_VIEW"; br
3b90: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
3ba0: 4c 49 54 45 5f 49 4e 53 45 52 54 20 20 20 20 20  LITE_INSERT     
3bb0: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
3bc0: 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 22 3b 20  SQLITE_INSERT"; 
3bd0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
3be0: 53 51 4c 49 54 45 5f 50 52 41 47 4d 41 20 20 20  SQLITE_PRAGMA   
3bf0: 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65           : zCode
3c00: 3d 22 53 51 4c 49 54 45 5f 50 52 41 47 4d 41 22  ="SQLITE_PRAGMA"
3c10: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
3c20: 65 20 53 51 4c 49 54 45 5f 52 45 41 44 20 20 20  e SQLITE_READ   
3c30: 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f             : zCo
3c40: 64 65 3d 22 53 51 4c 49 54 45 5f 52 45 41 44 22  de="SQLITE_READ"
3c50: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
3c60: 65 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 20  e SQLITE_SELECT 
3c70: 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f             : zCo
3c80: 64 65 3d 22 53 51 4c 49 54 45 5f 53 45 4c 45 43  de="SQLITE_SELEC
3c90: 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  T"; break;.    c
3ca0: 61 73 65 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  ase SQLITE_TRANS
3cb0: 41 43 54 49 4f 4e 20 20 20 20 20 20 20 3a 20 7a  ACTION       : z
3cc0: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 54 52 41  Code="SQLITE_TRA
3cd0: 4e 53 41 43 54 49 4f 4e 22 3b 20 62 72 65 61 6b  NSACTION"; break
3ce0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
3cf0: 45 5f 55 50 44 41 54 45 20 20 20 20 20 20 20 20  E_UPDATE        
3d00: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
3d10: 49 54 45 5f 55 50 44 41 54 45 22 3b 20 62 72 65  ITE_UPDATE"; bre
3d20: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
3d30: 49 54 45 5f 41 54 54 41 43 48 20 20 20 20 20 20  ITE_ATTACH      
3d40: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
3d50: 51 4c 49 54 45 5f 41 54 54 41 43 48 22 3b 20 62  QLITE_ATTACH"; b
3d60: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
3d70: 51 4c 49 54 45 5f 44 45 54 41 43 48 20 20 20 20  QLITE_DETACH    
3d80: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
3d90: 22 53 51 4c 49 54 45 5f 44 45 54 41 43 48 22 3b  "SQLITE_DETACH";
3da0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
3db0: 20 53 51 4c 49 54 45 5f 41 4c 54 45 52 5f 54 41   SQLITE_ALTER_TA
3dc0: 42 4c 45 20 20 20 20 20 20 20 3a 20 7a 43 6f 64  BLE       : zCod
3dd0: 65 3d 22 53 51 4c 49 54 45 5f 41 4c 54 45 52 5f  e="SQLITE_ALTER_
3de0: 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20  TABLE"; break;. 
3df0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52     case SQLITE_R
3e00: 45 49 4e 44 45 58 20 20 20 20 20 20 20 20 20 20  EINDEX          
3e10: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
3e20: 5f 52 45 49 4e 44 45 58 22 3b 20 62 72 65 61 6b  _REINDEX"; break
3e30: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
3e40: 45 5f 41 4e 41 4c 59 5a 45 20 20 20 20 20 20 20  E_ANALYZE       
3e50: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
3e60: 49 54 45 5f 41 4e 41 4c 59 5a 45 22 3b 20 62 72  ITE_ANALYZE"; br
3e70: 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
3e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e90: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
3ea0: 3f 3f 3f 3f 22 3b 20 62 72 65 61 6b 3b 0a 20 20  ????"; break;.  
3eb0: 7d 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49  }.  Tcl_DStringI
3ec0: 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 54 63 6c  nit(&str);.  Tcl
3ed0: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26  _DStringAppend(&
3ee0: 73 74 72 2c 20 70 44 62 2d 3e 7a 41 75 74 68 2c  str, pDb->zAuth,
3ef0: 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72   -1);.  Tcl_DStr
3f00: 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ingAppendElement
3f10: 28 26 73 74 72 2c 20 7a 43 6f 64 65 29 3b 0a 20  (&str, zCode);. 
3f20: 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65   Tcl_DStringAppe
3f30: 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20  ndElement(&str, 
3f40: 7a 41 72 67 31 20 3f 20 7a 41 72 67 31 20 3a 20  zArg1 ? zArg1 : 
3f50: 22 22 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  "");.  Tcl_DStri
3f60: 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  ngAppendElement(
3f70: 26 73 74 72 2c 20 7a 41 72 67 32 20 3f 20 7a 41  &str, zArg2 ? zA
3f80: 72 67 32 20 3a 20 22 22 29 3b 0a 20 20 54 63 6c  rg2 : "");.  Tcl
3f90: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c  _DStringAppendEl
3fa0: 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41 72 67  ement(&str, zArg
3fb0: 33 20 3f 20 7a 41 72 67 33 20 3a 20 22 22 29 3b  3 ? zArg3 : "");
3fc0: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70  .  Tcl_DStringAp
3fd0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72  pendElement(&str
3fe0: 2c 20 7a 41 72 67 34 20 3f 20 7a 41 72 67 34 20  , zArg4 ? zArg4 
3ff0: 3a 20 22 22 29 3b 0a 20 20 72 63 20 3d 20 54 63  : "");.  rc = Tc
4000: 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c 28 70 44 62  l_GlobalEval(pDb
4010: 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44 53  ->interp, Tcl_DS
4020: 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29  tringValue(&str)
4030: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
4040: 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20 7a 52  Free(&str);.  zR
4050: 65 70 6c 79 20 3d 20 54 63 6c 5f 47 65 74 53 74  eply = Tcl_GetSt
4060: 72 69 6e 67 52 65 73 75 6c 74 28 70 44 62 2d 3e  ringResult(pDb->
4070: 69 6e 74 65 72 70 29 3b 0a 20 20 69 66 28 20 73  interp);.  if( s
4080: 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22 53 51  trcmp(zReply,"SQ
4090: 4c 49 54 45 5f 4f 4b 22 29 3d 3d 30 20 29 7b 0a  LITE_OK")==0 ){.
40a0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
40b0: 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  OK;.  }else if( 
40c0: 73 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22 53  strcmp(zReply,"S
40d0: 51 4c 49 54 45 5f 44 45 4e 59 22 29 3d 3d 30 20  QLITE_DENY")==0 
40e0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
40f0: 54 45 5f 44 45 4e 59 3b 0a 20 20 7d 65 6c 73 65  TE_DENY;.  }else
4100: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 52 65 70   if( strcmp(zRep
4110: 6c 79 2c 22 53 51 4c 49 54 45 5f 49 47 4e 4f 52  ly,"SQLITE_IGNOR
4120: 45 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  E")==0 ){.    rc
4130: 20 3d 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45   = SQLITE_IGNORE
4140: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
4150: 63 20 3d 20 39 39 39 3b 0a 20 20 7d 0a 20 20 72  c = 999;.  }.  r
4160: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
4170: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
4180: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 20  T_AUTHORIZATION 
4190: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 7a 54 65 78 74 20  */../*.** zText 
41a0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
41b0: 74 65 78 74 20 6f 62 74 61 69 6e 65 64 20 76 69  text obtained vi
41c0: 61 20 61 6e 20 73 71 6c 69 74 65 33 5f 72 65 73  a an sqlite3_res
41d0: 75 6c 74 5f 74 65 78 74 28 29 0a 2a 2a 20 6f 72  ult_text().** or
41e0: 20 73 69 6d 69 6c 61 72 20 69 6e 74 65 72 66 61   similar interfa
41f0: 63 65 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  ce. This routine
4200: 20 72 65 74 75 72 6e 73 20 61 20 54 63 6c 20 73   returns a Tcl s
4210: 74 72 69 6e 67 20 6f 62 6a 65 63 74 2c 20 0a 2a  tring object, .*
4220: 2a 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  * reference coun
4230: 74 20 73 65 74 20 74 6f 20 30 2c 20 63 6f 6e 74  t set to 0, cont
4240: 61 69 6e 69 6e 67 20 74 68 65 20 74 65 78 74 2e  aining the text.
4250: 20 49 66 20 61 20 74 72 61 6e 73 6c 61 74 69 6f   If a translatio
4260: 6e 0a 2a 2a 20 62 65 74 77 65 65 6e 20 69 73 6f  n.** between iso
4270: 38 38 35 39 20 61 6e 64 20 55 54 46 2d 38 20 69  8859 and UTF-8 i
4280: 73 20 72 65 71 75 69 72 65 64 2c 20 69 74 20 69  s required, it i
4290: 73 20 70 72 65 66 6f 72 6d 65 64 2e 0a 2a 2f 0a  s preformed..*/.
42a0: 73 74 61 74 69 63 20 54 63 6c 5f 4f 62 6a 20 2a  static Tcl_Obj *
42b0: 64 62 54 65 78 74 54 6f 4f 62 6a 28 63 68 61 72  dbTextToObj(char
42c0: 20 63 6f 6e 73 74 20 2a 7a 54 65 78 74 29 7b 0a   const *zText){.
42d0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c 3b    Tcl_Obj *pVal;
42e0: 0a 23 69 66 64 65 66 20 55 54 46 5f 54 52 41 4e  .#ifdef UTF_TRAN
42f0: 53 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 0a 20  SLATION_NEEDED. 
4300: 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 43 6f   Tcl_DString dCo
4310: 6c 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  l;.  Tcl_DString
4320: 49 6e 69 74 28 26 64 43 6f 6c 29 3b 0a 20 20 54  Init(&dCol);.  T
4330: 63 6c 5f 45 78 74 65 72 6e 61 6c 54 6f 55 74 66  cl_ExternalToUtf
4340: 44 53 74 72 69 6e 67 28 4e 55 4c 4c 2c 20 7a 54  DString(NULL, zT
4350: 65 78 74 2c 20 2d 31 2c 20 26 64 43 6f 6c 29 3b  ext, -1, &dCol);
4360: 0a 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65  .  pVal = Tcl_Ne
4370: 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 44  wStringObj(Tcl_D
4380: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 64 43 6f  StringValue(&dCo
4390: 6c 29 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44  l), -1);.  Tcl_D
43a0: 53 74 72 69 6e 67 46 72 65 65 28 26 64 43 6f 6c  StringFree(&dCol
43b0: 29 3b 0a 23 65 6c 73 65 0a 20 20 70 56 61 6c 20  );.#else.  pVal 
43c0: 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  = Tcl_NewStringO
43d0: 62 6a 28 7a 54 65 78 74 2c 20 2d 31 29 3b 0a 23  bj(zText, -1);.#
43e0: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 70  endif.  return p
43f0: 56 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Val;.}../*.** Th
4400: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 61 64 73  is routine reads
4410: 20 61 20 6c 69 6e 65 20 6f 66 20 74 65 78 74 20   a line of text 
4420: 66 72 6f 6d 20 46 49 4c 45 20 69 6e 2c 20 73 74  from FILE in, st
4430: 6f 72 65 73 0a 2a 2a 20 74 68 65 20 74 65 78 74  ores.** the text
4440: 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69   in memory obtai
4450: 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28  ned from malloc(
4460: 29 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20  ) and returns a 
4470: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
4480: 65 20 74 65 78 74 2e 20 20 4e 55 4c 4c 20 69 73  e text.  NULL is
4490: 20 72 65 74 75 72 6e 65 64 20 61 74 20 65 6e 64   returned at end
44a0: 20 6f 66 20 66 69 6c 65 2c 20 6f 72 20 69 66 20   of file, or if 
44b0: 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 66 61 69 6c  malloc().** fail
44c0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74  s..**.** The int
44d0: 65 72 66 61 63 65 20 69 73 20 6c 69 6b 65 20 22  erface is like "
44e0: 72 65 61 64 6c 69 6e 65 22 20 62 75 74 20 6e 6f  readline" but no
44f0: 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 65 64   command-line ed
4500: 69 74 69 6e 67 0a 2a 2a 20 69 73 20 64 6f 6e 65  iting.** is done
4510: 2e 0a 2a 2a 0a 2a 2a 20 63 6f 70 69 65 64 20 66  ..**.** copied f
4520: 72 6f 6d 20 73 68 65 6c 6c 2e 63 20 66 72 6f 6d  rom shell.c from
4530: 20 27 2e 69 6d 70 6f 72 74 27 20 63 6f 6d 6d 61   '.import' comma
4540: 6e 64 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  nd.*/.static cha
4550: 72 20 2a 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65  r *local_getline
4560: 28 63 68 61 72 20 2a 7a 50 72 6f 6d 70 74 2c 20  (char *zPrompt, 
4570: 46 49 4c 45 20 2a 69 6e 29 7b 0a 20 20 63 68 61  FILE *in){.  cha
4580: 72 20 2a 7a 4c 69 6e 65 3b 0a 20 20 69 6e 74 20  r *zLine;.  int 
4590: 6e 4c 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a  nLine;.  int n;.
45a0: 20 20 69 6e 74 20 65 6f 6c 3b 0a 0a 20 20 6e 4c    int eol;..  nL
45b0: 69 6e 65 20 3d 20 31 30 30 3b 0a 20 20 7a 4c 69  ine = 100;.  zLi
45c0: 6e 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 4c 69  ne = malloc( nLi
45d0: 6e 65 20 29 3b 0a 20 20 69 66 28 20 7a 4c 69 6e  ne );.  if( zLin
45e0: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  e==0 ) return 0;
45f0: 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 65 6f 6c 20  .  n = 0;.  eol 
4600: 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 21 65  = 0;.  while( !e
4610: 6f 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 2b  ol ){.    if( n+
4620: 31 30 30 3e 6e 4c 69 6e 65 20 29 7b 0a 20 20 20  100>nLine ){.   
4630: 20 20 20 6e 4c 69 6e 65 20 3d 20 6e 4c 69 6e 65     nLine = nLine
4640: 2a 32 20 2b 20 31 30 30 3b 0a 20 20 20 20 20 20  *2 + 100;.      
4650: 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28  zLine = realloc(
4660: 7a 4c 69 6e 65 2c 20 6e 4c 69 6e 65 29 3b 0a 20  zLine, nLine);. 
4670: 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 3d 3d       if( zLine==
4680: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
4690: 20 20 7d 0a 20 20 20 20 69 66 28 20 66 67 65 74    }.    if( fget
46a0: 73 28 26 7a 4c 69 6e 65 5b 6e 5d 2c 20 6e 4c 69  s(&zLine[n], nLi
46b0: 6e 65 20 2d 20 6e 2c 20 69 6e 29 3d 3d 30 20 29  ne - n, in)==0 )
46c0: 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30  {.      if( n==0
46d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65   ){.        free
46e0: 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 20  (zLine);.       
46f0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
4700: 20 7d 0a 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6e   }.      zLine[n
4710: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 65 6f 6c  ] = 0;.      eol
4720: 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61   = 1;.      brea
4730: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69  k;.    }.    whi
4740: 6c 65 28 20 7a 4c 69 6e 65 5b 6e 5d 20 29 7b 20  le( zLine[n] ){ 
4750: 6e 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 6e  n++; }.    if( n
4760: 3e 30 20 26 26 20 7a 4c 69 6e 65 5b 6e 2d 31 5d  >0 && zLine[n-1]
4770: 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20  =='\n' ){.      
4780: 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a 4c 69 6e 65  n--;.      zLine
4790: 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 65  [n] = 0;.      e
47a0: 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ol = 1;.    }.  
47b0: 7d 0a 20 20 7a 4c 69 6e 65 20 3d 20 72 65 61 6c  }.  zLine = real
47c0: 6c 6f 63 28 20 7a 4c 69 6e 65 2c 20 6e 2b 31 20  loc( zLine, n+1 
47d0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4c 69 6e  );.  return zLin
47e0: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  e;.}../*.** The 
47f0: 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d 61 6e 64  "sqlite" command
4800: 20 62 65 6c 6f 77 20 63 72 65 61 74 65 73 20 61   below creates a
4810: 20 6e 65 77 20 54 63 6c 20 63 6f 6d 6d 61 6e 64   new Tcl command
4820: 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6e   for each.** con
4830: 6e 65 63 74 69 6f 6e 20 69 74 20 6f 70 65 6e 73  nection it opens
4840: 20 74 6f 20 61 6e 20 53 51 4c 69 74 65 20 64 61   to an SQLite da
4850: 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f  tabase.  This ro
4860: 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64  utine is invoked
4870: 0a 2a 2a 20 77 68 65 6e 65 76 65 72 20 6f 6e 65  .** whenever one
4880: 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65 63   of those connec
4890: 74 69 6f 6e 2d 73 70 65 63 69 66 69 63 20 63 6f  tion-specific co
48a0: 6d 6d 61 6e 64 73 20 69 73 20 65 78 65 63 75 74  mmands is execut
48b0: 65 64 0a 2a 2a 20 69 6e 20 54 63 6c 2e 20 20 46  ed.** in Tcl.  F
48c0: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 79  or example, if y
48d0: 6f 75 20 72 75 6e 20 54 63 6c 20 63 6f 64 65 20  ou run Tcl code 
48e0: 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
48f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 64         sqlite3 d
4900: 62 31 20 20 22 6d 79 5f 64 61 74 61 62 61 73 65  b1  "my_database
4910: 22 0a 2a 2a 20 20 20 20 20 20 20 64 62 31 20 63  ".**       db1 c
4920: 6c 6f 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  lose.**.** The f
4930: 69 72 73 74 20 63 6f 6d 6d 61 6e 64 20 6f 70 65  irst command ope
4940: 6e 73 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ns a connection 
4950: 74 6f 20 74 68 65 20 22 6d 79 5f 64 61 74 61 62  to the "my_datab
4960: 61 73 65 22 20 64 61 74 61 62 61 73 65 0a 2a 2a  ase" database.**
4970: 20 61 6e 64 20 63 61 6c 6c 73 20 74 68 61 74 20   and calls that 
4980: 63 6f 6e 6e 65 63 74 69 6f 6e 20 22 64 62 31 22  connection "db1"
4990: 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20 63 6f  .  The second co
49a0: 6d 6d 61 6e 64 20 63 61 75 73 65 73 20 74 68 69  mmand causes thi
49b0: 73 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65 20  s.** subroutine 
49c0: 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 2e 0a 2a  to be invoked..*
49d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 4f  /.static int DbO
49e0: 62 6a 43 6d 64 28 76 6f 69 64 20 2a 63 64 2c 20  bjCmd(void *cd, 
49f0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
4a00: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 54 63 6c  rp, int objc,Tcl
4a10: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76  _Obj *const*objv
4a20: 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  ){.  SqliteDb *p
4a30: 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29  Db = (SqliteDb*)
4a40: 63 64 3b 0a 20 20 69 6e 74 20 63 68 6f 69 63 65  cd;.  int choice
4a50: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 54 43 4c  ;.  int rc = TCL
4a60: 5f 4f 4b 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  _OK;.  static co
4a70: 6e 73 74 20 63 68 61 72 20 2a 44 42 5f 73 74 72  nst char *DB_str
4a80: 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 61 75 74  s[] = {.    "aut
4a90: 68 6f 72 69 7a 65 72 22 2c 20 20 20 20 20 20 20  horizer",       
4aa0: 20 20 22 62 75 73 79 22 2c 20 20 20 20 20 20 20    "busy",       
4ab0: 20 20 20 20 20 20 20 22 63 61 63 68 65 22 2c 0a         "cache",.
4ac0: 20 20 20 20 22 63 68 61 6e 67 65 73 22 2c 20 20      "changes",  
4ad0: 20 20 20 20 20 20 20 20 20 20 22 63 6c 6f 73 65            "close
4ae0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ",             "
4af0: 63 6f 6c 6c 61 74 65 22 2c 0a 20 20 20 20 22 63  collate",.    "c
4b00: 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 22  ollation_needed"
4b10: 2c 20 20 20 22 63 6f 6d 6d 69 74 5f 68 6f 6f 6b  ,   "commit_hook
4b20: 22 2c 20 20 20 20 20 20 20 22 63 6f 6d 70 6c 65  ",       "comple
4b30: 74 65 22 2c 0a 20 20 20 20 22 63 6f 70 79 22 2c  te",.    "copy",
4b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
4b50: 65 72 72 6f 72 63 6f 64 65 22 2c 20 20 20 20 20  errorcode",     
4b60: 20 20 20 20 22 65 76 61 6c 22 2c 0a 20 20 20 20      "eval",.    
4b70: 22 66 75 6e 63 74 69 6f 6e 22 2c 20 20 20 20 20  "function",     
4b80: 20 20 20 20 20 20 22 6c 61 73 74 5f 69 6e 73 65        "last_inse
4b90: 72 74 5f 72 6f 77 69 64 22 2c 20 22 6e 75 6c 6c  rt_rowid", "null
4ba0: 76 61 6c 75 65 22 2c 0a 20 20 20 20 22 6f 6e 65  value",.    "one
4bb0: 63 6f 6c 75 6d 6e 22 2c 20 20 20 20 20 20 20 20  column",        
4bc0: 20 20 22 70 72 6f 67 72 65 73 73 22 2c 20 20 20    "progress",   
4bd0: 20 20 20 20 20 20 20 22 72 65 6b 65 79 22 2c 0a         "rekey",.
4be0: 20 20 20 20 22 74 69 6d 65 6f 75 74 22 2c 20 20      "timeout",  
4bf0: 20 20 20 20 20 20 20 20 20 20 22 74 6f 74 61 6c            "total
4c00: 5f 63 68 61 6e 67 65 73 22 2c 20 20 20 20 20 22  _changes",     "
4c10: 74 72 61 63 65 22 2c 0a 20 20 20 20 22 74 72 61  trace",.    "tra
4c20: 6e 73 61 63 74 69 6f 6e 22 2c 20 20 20 20 20 20  nsaction",      
4c30: 20 20 22 76 65 72 73 69 6f 6e 22 2c 20 20 20 20    "version",    
4c40: 20 20 20 20 20 20 20 30 0a 20 20 7d 3b 0a 20 20         0.  };.  
4c50: 65 6e 75 6d 20 44 42 5f 65 6e 75 6d 20 7b 0a 20  enum DB_enum {. 
4c60: 20 20 20 44 42 5f 41 55 54 48 4f 52 49 5a 45 52     DB_AUTHORIZER
4c70: 2c 20 20 20 20 20 20 20 20 44 42 5f 42 55 53 59  ,        DB_BUSY
4c80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 44 42  ,             DB
4c90: 5f 43 41 43 48 45 2c 0a 20 20 20 20 44 42 5f 43  _CACHE,.    DB_C
4ca0: 48 41 4e 47 45 53 2c 20 20 20 20 20 20 20 20 20  HANGES,         
4cb0: 20 20 44 42 5f 43 4c 4f 53 45 2c 20 20 20 20 20    DB_CLOSE,     
4cc0: 20 20 20 20 20 20 20 44 42 5f 43 4f 4c 4c 41 54         DB_COLLAT
4cd0: 45 2c 0a 20 20 20 20 44 42 5f 43 4f 4c 4c 41 54  E,.    DB_COLLAT
4ce0: 49 4f 4e 5f 4e 45 45 44 45 44 2c 20 20 44 42 5f  ION_NEEDED,  DB_
4cf0: 43 4f 4d 4d 49 54 5f 48 4f 4f 4b 2c 20 20 20 20  COMMIT_HOOK,    
4d00: 20 20 44 42 5f 43 4f 4d 50 4c 45 54 45 2c 0a 20    DB_COMPLETE,. 
4d10: 20 20 20 44 42 5f 43 4f 50 59 2c 20 20 20 20 20     DB_COPY,     
4d20: 20 20 20 20 20 20 20 20 20 44 42 5f 45 52 52 4f           DB_ERRO
4d30: 52 43 4f 44 45 2c 20 20 20 20 20 20 20 20 44 42  RCODE,        DB
4d40: 5f 45 56 41 4c 2c 0a 20 20 20 20 44 42 5f 46 55  _EVAL,.    DB_FU
4d50: 4e 43 54 49 4f 4e 2c 20 20 20 20 20 20 20 20 20  NCTION,         
4d60: 20 44 42 5f 4c 41 53 54 5f 49 4e 53 45 52 54 5f   DB_LAST_INSERT_
4d70: 52 4f 57 49 44 2c 44 42 5f 4e 55 4c 4c 56 41 4c  ROWID,DB_NULLVAL
4d80: 55 45 2c 0a 20 20 20 20 44 42 5f 4f 4e 45 43 4f  UE,.    DB_ONECO
4d90: 4c 55 4d 4e 2c 20 20 20 20 20 20 20 20 20 44 42  LUMN,         DB
4da0: 5f 50 52 4f 47 52 45 53 53 2c 20 20 20 20 20 20  _PROGRESS,      
4db0: 20 20 20 44 42 5f 52 45 4b 45 59 2c 0a 20 20 20     DB_REKEY,.   
4dc0: 20 44 42 5f 54 49 4d 45 4f 55 54 2c 20 20 20 20   DB_TIMEOUT,    
4dd0: 20 20 20 20 20 20 20 44 42 5f 54 4f 54 41 4c 5f         DB_TOTAL_
4de0: 43 48 41 4e 47 45 53 2c 20 20 20 20 44 42 5f 54  CHANGES,    DB_T
4df0: 52 41 43 45 2c 0a 20 20 20 20 44 42 5f 54 52 41  RACE,.    DB_TRA
4e00: 4e 53 41 43 54 49 4f 4e 2c 20 20 20 20 20 20 20  NSACTION,       
4e10: 44 42 5f 56 45 52 53 49 4f 4e 2c 20 20 20 20 20  DB_VERSION,     
4e20: 20 20 20 20 20 0a 20 20 7d 3b 0a 20 20 2f 2a 20       .  };.  /* 
4e30: 64 6f 6e 27 74 20 6c 65 61 76 65 20 74 72 61 69  don't leave trai
4e40: 6c 69 6e 67 20 63 6f 6d 6d 61 73 20 6f 6e 20 44  ling commas on D
4e50: 42 5f 65 6e 75 6d 2c 20 69 74 20 63 6f 6e 66 75  B_enum, it confu
4e60: 73 65 73 20 74 68 65 20 41 49 58 20 78 6c 63 20  ses the AIX xlc 
4e70: 63 6f 6d 70 69 6c 65 72 20 2a 2f 0a 0a 20 20 69  compiler */..  i
4e80: 66 28 20 6f 62 6a 63 3c 32 20 29 7b 0a 20 20 20  f( objc<2 ){.   
4e90: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
4ea0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
4eb0: 76 2c 20 22 53 55 42 43 4f 4d 4d 41 4e 44 20 2e  v, "SUBCOMMAND .
4ec0: 2e 2e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ..");.    return
4ed0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
4ee0: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 64    if( Tcl_GetInd
4ef0: 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  exFromObj(interp
4f00: 2c 20 6f 62 6a 76 5b 31 5d 2c 20 44 42 5f 73 74  , objv[1], DB_st
4f10: 72 73 2c 20 22 6f 70 74 69 6f 6e 22 2c 20 30 2c  rs, "option", 0,
4f20: 20 26 63 68 6f 69 63 65 29 20 29 7b 0a 20 20 20   &choice) ){.   
4f30: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
4f40: 52 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68  R;.  }..  switch
4f50: 28 20 28 65 6e 75 6d 20 44 42 5f 65 6e 75 6d 29  ( (enum DB_enum)
4f60: 63 68 6f 69 63 65 20 29 7b 0a 0a 20 20 2f 2a 20  choice ){..  /* 
4f70: 20 20 20 24 64 62 20 61 75 74 68 6f 72 69 7a 65     $db authorize
4f80: 72 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a  r ?CALLBACK?.  *
4f90: 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  *.  ** Invoke th
4fa0: 65 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b  e given callback
4fb0: 20 74 6f 20 61 75 74 68 6f 72 69 7a 65 20 65 61   to authorize ea
4fc0: 63 68 20 53 51 4c 20 6f 70 65 72 61 74 69 6f 6e  ch SQL operation
4fd0: 20 61 73 20 69 74 20 69 73 0a 20 20 2a 2a 20 63   as it is.  ** c
4fe0: 6f 6d 70 69 6c 65 64 2e 20 20 35 20 61 72 67 75  ompiled.  5 argu
4ff0: 6d 65 6e 74 73 20 61 72 65 20 61 70 70 65 6e 64  ments are append
5000: 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61  ed to the callba
5010: 63 6b 20 62 65 66 6f 72 65 20 69 74 20 69 73 0a  ck before it is.
5020: 20 20 2a 2a 20 69 6e 76 6f 6b 65 64 3a 0a 20 20    ** invoked:.  
5030: 2a 2a 0a 20 20 2a 2a 20 20 20 28 31 29 20 54 68  **.  **   (1) Th
5040: 65 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  e authorization 
5050: 74 79 70 65 20 28 65 78 3a 20 53 51 4c 49 54 45  type (ex: SQLITE
5060: 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 2c 20 53  _CREATE_TABLE, S
5070: 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 2e 2e  QLITE_INSERT, ..
5080: 2e 29 0a 20 20 2a 2a 20 20 20 28 32 29 20 46 69  .).  **   (2) Fi
5090: 72 73 74 20 64 65 73 63 72 69 70 74 69 76 65 20  rst descriptive 
50a0: 6e 61 6d 65 20 28 64 65 70 65 6e 64 73 20 6f 6e  name (depends on
50b0: 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74   authorization t
50c0: 79 70 65 29 0a 20 20 2a 2a 20 20 20 28 33 29 20  ype).  **   (3) 
50d0: 53 65 63 6f 6e 64 20 64 65 73 63 72 69 70 74 69  Second descripti
50e0: 76 65 20 6e 61 6d 65 0a 20 20 2a 2a 20 20 20 28  ve name.  **   (
50f0: 34 29 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  4) Name of the d
5100: 61 74 61 62 61 73 65 20 28 65 78 3a 20 22 6d 61  atabase (ex: "ma
5110: 69 6e 22 2c 20 22 74 65 6d 70 22 29 0a 20 20 2a  in", "temp").  *
5120: 2a 20 20 20 28 35 29 20 4e 61 6d 65 20 6f 66 20  *   (5) Name of 
5130: 74 72 69 67 67 65 72 20 74 68 61 74 20 69 73 20  trigger that is 
5140: 64 6f 69 6e 67 20 74 68 65 20 61 63 63 65 73 73  doing the access
5150: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63  .  **.  ** The c
5160: 61 6c 6c 62 61 63 6b 20 73 68 6f 75 6c 64 20 72  allback should r
5170: 65 74 75 72 6e 20 6f 6e 20 6f 66 20 74 68 65 20  eturn on of the 
5180: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 69 6e 67  following string
5190: 73 3a 20 53 51 4c 49 54 45 5f 4f 4b 2c 0a 20 20  s: SQLITE_OK,.  
51a0: 2a 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  ** SQLITE_IGNORE
51b0: 2c 20 6f 72 20 53 51 4c 49 54 45 5f 44 45 4e 59  , or SQLITE_DENY
51c0: 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74  .  Any other ret
51d0: 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61 6e 20  urn value is an 
51e0: 65 72 72 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  error..  **.  **
51f0: 20 49 66 20 74 68 69 73 20 6d 65 74 68 6f 64 20   If this method 
5200: 69 73 20 69 6e 76 6f 6b 65 64 20 77 69 74 68 20  is invoked with 
5210: 6e 6f 20 61 72 67 75 6d 65 6e 74 73 2c 20 74 68  no arguments, th
5220: 65 20 63 75 72 72 65 6e 74 20 61 75 74 68 6f 72  e current author
5230: 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 63 61 6c  ization.  ** cal
5240: 6c 62 61 63 6b 20 73 74 72 69 6e 67 20 69 73 20  lback string is 
5250: 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2f 0a 20  returned..  */. 
5260: 20 63 61 73 65 20 44 42 5f 41 55 54 48 4f 52 49   case DB_AUTHORI
5270: 5a 45 52 3a 20 7b 0a 23 69 66 64 65 66 20 53 51  ZER: {.#ifdef SQ
5280: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
5290: 49 5a 41 54 49 4f 4e 0a 20 20 20 20 54 63 6c 5f  IZATION.    Tcl_
52a0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
52b0: 65 72 70 2c 20 22 61 75 74 68 6f 72 69 7a 61 74  erp, "authorizat
52c0: 69 6f 6e 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  ion not availabl
52d0: 65 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64 22  e in this build"
52e0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
52f0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73   TCL_ERROR;.#els
5300: 65 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33  e.    if( objc>3
5310: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
5320: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
5330: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41  p, 2, objv, "?CA
5340: 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20  LLBACK?");.     
5350: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
5360: 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  R;.    }else if(
5370: 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20   objc==2 ){.    
5380: 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74 68    if( pDb->zAuth
5390: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
53a0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
53b0: 65 72 70 2c 20 70 44 62 2d 3e 7a 41 75 74 68 2c  erp, pDb->zAuth,
53c0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
53d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
53e0: 61 72 20 2a 7a 41 75 74 68 3b 0a 20 20 20 20 20  ar *zAuth;.     
53f0: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20   int len;.      
5400: 69 66 28 20 70 44 62 2d 3e 7a 41 75 74 68 20 29  if( pDb->zAuth )
5410: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72  {.        Tcl_Fr
5420: 65 65 28 70 44 62 2d 3e 7a 41 75 74 68 29 3b 0a  ee(pDb->zAuth);.
5430: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 41        }.      zA
5440: 75 74 68 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  uth = Tcl_GetStr
5450: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
5460: 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20  2], &len);.     
5470: 20 69 66 28 20 7a 41 75 74 68 20 26 26 20 6c 65   if( zAuth && le
5480: 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  n>0 ){.        p
5490: 44 62 2d 3e 7a 41 75 74 68 20 3d 20 54 63 6c 5f  Db->zAuth = Tcl_
54a0: 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29  Alloc( len + 1 )
54b0: 3b 0a 20 20 20 20 20 20 20 20 73 74 72 63 70 79  ;.        strcpy
54c0: 28 70 44 62 2d 3e 7a 41 75 74 68 2c 20 7a 41 75  (pDb->zAuth, zAu
54d0: 74 68 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  th);.      }else
54e0: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
54f0: 41 75 74 68 20 3d 20 30 3b 0a 20 20 20 20 20 20  Auth = 0;.      
5500: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  }.      if( pDb-
5510: 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 20 20  >zAuth ){.      
5520: 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20    pDb->interp = 
5530: 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20  interp;.        
5540: 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75 74 68  sqlite3_set_auth
5550: 6f 72 69 7a 65 72 28 70 44 62 2d 3e 64 62 2c 20  orizer(pDb->db, 
5560: 61 75 74 68 5f 63 61 6c 6c 62 61 63 6b 2c 20 70  auth_callback, p
5570: 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Db);.      }else
5580: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
5590: 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65 72  3_set_authorizer
55a0: 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b  (pDb->db, 0, 0);
55b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
55c0: 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b  endif.    break;
55d0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64  .  }..  /*    $d
55e0: 62 20 62 75 73 79 20 3f 43 41 4c 4c 42 41 43 4b  b busy ?CALLBACK
55f0: 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f  ?.  **.  ** Invo
5600: 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c  ke the given cal
5610: 6c 62 61 63 6b 20 69 66 20 61 6e 20 53 51 4c 20  lback if an SQL 
5620: 73 74 61 74 65 6d 65 6e 74 20 61 74 74 65 6d 70  statement attemp
5630: 74 73 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20  ts to open.  ** 
5640: 61 20 6c 6f 63 6b 65 64 20 64 61 74 61 62 61 73  a locked databas
5650: 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 63  e file..  */.  c
5660: 61 73 65 20 44 42 5f 42 55 53 59 3a 20 7b 0a 20  ase DB_BUSY: {. 
5670: 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b     if( objc>3 ){
5680: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
5690: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
56a0: 32 2c 20 6f 62 6a 76 2c 20 22 43 41 4c 4c 42 41  2, objv, "CALLBA
56b0: 43 4b 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  CK");.      retu
56c0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
56d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63    }else if( objc
56e0: 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==2 ){.      if(
56f0: 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20   pDb->zBusy ){. 
5700: 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
5710: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
5720: 70 44 62 2d 3e 7a 42 75 73 79 2c 20 30 29 3b 0a  pDb->zBusy, 0);.
5730: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
5740: 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  e{.      char *z
5750: 42 75 73 79 3b 0a 20 20 20 20 20 20 69 6e 74 20  Busy;.      int 
5760: 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70  len;.      if( p
5770: 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20  Db->zBusy ){.   
5780: 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44       Tcl_Free(pD
5790: 62 2d 3e 7a 42 75 73 79 29 3b 0a 20 20 20 20 20  b->zBusy);.     
57a0: 20 7d 0a 20 20 20 20 20 20 7a 42 75 73 79 20 3d   }.      zBusy =
57b0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
57c0: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26  omObj(objv[2], &
57d0: 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  len);.      if( 
57e0: 7a 42 75 73 79 20 26 26 20 6c 65 6e 3e 30 20 29  zBusy && len>0 )
57f0: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
5800: 42 75 73 79 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63  Busy = Tcl_Alloc
5810: 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20  ( len + 1 );.   
5820: 20 20 20 20 20 73 74 72 63 70 79 28 70 44 62 2d       strcpy(pDb-
5830: 3e 7a 42 75 73 79 2c 20 7a 42 75 73 79 29 3b 0a  >zBusy, zBusy);.
5840: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
5850: 20 20 20 20 20 70 44 62 2d 3e 7a 42 75 73 79 20       pDb->zBusy 
5860: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
5870: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 42 75 73     if( pDb->zBus
5880: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  y ){.        pDb
5890: 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72  ->interp = inter
58a0: 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  p;.        sqlit
58b0: 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28  e3_busy_handler(
58c0: 70 44 62 2d 3e 64 62 2c 20 44 62 42 75 73 79 48  pDb->db, DbBusyH
58d0: 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20  andler, pDb);.  
58e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
58f0: 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f     sqlite3_busy_
5900: 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c  handler(pDb->db,
5910: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
5920: 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
5930: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 20 24  .  }..  /*     $
5940: 64 62 20 63 61 63 68 65 20 66 6c 75 73 68 0a 20  db cache flush. 
5950: 20 2a 2a 20 20 20 20 20 24 64 62 20 63 61 63 68   **     $db cach
5960: 65 20 73 69 7a 65 20 6e 0a 20 20 2a 2a 0a 20 20  e size n.  **.  
5970: 2a 2a 20 46 6c 75 73 68 20 74 68 65 20 70 72 65  ** Flush the pre
5980: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
5990: 63 61 63 68 65 2c 20 6f 72 20 73 65 74 20 74 68  cache, or set th
59a0: 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
59b0: 20 6f 66 0a 20 20 2a 2a 20 63 61 63 68 65 64 20   of.  ** cached 
59c0: 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f  statements..  */
59d0: 0a 20 20 63 61 73 65 20 44 42 5f 43 41 43 48 45  .  case DB_CACHE
59e0: 3a 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 73 75  : {.    char *su
59f0: 62 43 6d 64 3b 0a 20 20 20 20 69 6e 74 20 6e 3b  bCmd;.    int n;
5a00: 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3c 3d  ..    if( objc<=
5a10: 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  2 ){.      Tcl_W
5a20: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
5a30: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 61  rp, 1, objv, "ca
5a40: 63 68 65 20 6f 70 74 69 6f 6e 20 3f 61 72 67 3f  che option ?arg?
5a50: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
5a60: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
5a70: 7d 0a 20 20 20 20 73 75 62 43 6d 64 20 3d 20 54  }.    subCmd = T
5a80: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
5a90: 4f 62 6a 28 20 6f 62 6a 76 5b 32 5d 2c 20 30 20  Obj( objv[2], 0 
5aa0: 29 3b 0a 20 20 20 20 69 66 28 20 2a 73 75 62 43  );.    if( *subC
5ab0: 6d 64 3d 3d 27 66 27 20 26 26 20 73 74 72 63 6d  md=='f' && strcm
5ac0: 70 28 73 75 62 43 6d 64 2c 22 66 6c 75 73 68 22  p(subCmd,"flush"
5ad0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )==0 ){.      if
5ae0: 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
5af0: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
5b00: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
5b10: 20 6f 62 6a 76 2c 20 22 66 6c 75 73 68 22 29 3b   objv, "flush");
5b20: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
5b30: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
5b40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5b50: 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28 20  flushStmtCache( 
5b60: 70 44 62 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pDb );.      }. 
5b70: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 2a 73 75     }else if( *su
5b80: 62 43 6d 64 3d 3d 27 73 27 20 26 26 20 73 74 72  bCmd=='s' && str
5b90: 63 6d 70 28 73 75 62 43 6d 64 2c 22 73 69 7a 65  cmp(subCmd,"size
5ba0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
5bb0: 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  f( objc!=4 ){.  
5bc0: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
5bd0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
5be0: 2c 20 6f 62 6a 76 2c 20 22 73 69 7a 65 20 6e 22  , objv, "size n"
5bf0: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
5c00: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
5c10: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5c20: 20 20 69 66 28 20 54 43 4c 5f 45 52 52 4f 52 3d    if( TCL_ERROR=
5c30: 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f  =Tcl_GetIntFromO
5c40: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
5c50: 33 5d 2c 20 26 6e 29 20 29 7b 0a 20 20 20 20 20  3], &n) ){.     
5c60: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
5c70: 65 73 75 6c 74 28 20 69 6e 74 65 72 70 2c 20 22  esult( interp, "
5c80: 63 61 6e 6e 6f 74 20 63 6f 6e 76 65 72 74 20 5c  cannot convert \
5c90: 22 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  "", .           
5ca0: 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
5cb0: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d  gFromObj(objv[3]
5cc0: 2c 30 29 2c 20 22 5c 22 20 74 6f 20 69 6e 74 65  ,0), "\" to inte
5cd0: 67 65 72 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  ger", 0);.      
5ce0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
5cf0: 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 65  RROR;.        }e
5d00: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
5d10: 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( n<0 ){.      
5d20: 20 20 20 20 20 20 66 6c 75 73 68 53 74 6d 74 43        flushStmtC
5d30: 61 63 68 65 28 20 70 44 62 20 29 3b 0a 20 20 20  ache( pDb );.   
5d40: 20 20 20 20 20 20 20 20 20 6e 20 3d 20 30 3b 0a           n = 0;.
5d50: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
5d60: 69 66 28 20 6e 3e 4d 41 58 5f 50 52 45 50 41 52  if( n>MAX_PREPAR
5d70: 45 44 5f 53 54 4d 54 53 20 29 7b 0a 20 20 20 20  ED_STMTS ){.    
5d80: 20 20 20 20 20 20 20 20 6e 20 3d 20 4d 41 58 5f          n = MAX_
5d90: 50 52 45 50 41 52 45 44 5f 53 54 4d 54 53 3b 0a  PREPARED_STMTS;.
5da0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
5db0: 20 20 20 20 20 20 70 44 62 2d 3e 6d 61 78 53 74        pDb->maxSt
5dc0: 6d 74 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20  mt = n;.        
5dd0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  }.      }.    }e
5de0: 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  lse{.      Tcl_A
5df0: 70 70 65 6e 64 52 65 73 75 6c 74 28 20 69 6e 74  ppendResult( int
5e00: 65 72 70 2c 20 22 62 61 64 20 6f 70 74 69 6f 6e  erp, "bad option
5e10: 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 20 20   \"", .         
5e20: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
5e30: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 30 29  omObj(objv[0],0)
5e40: 2c 20 22 5c 22 3a 20 6d 75 73 74 20 62 65 20 66  , "\": must be f
5e50: 6c 75 73 68 20 6f 72 20 73 69 7a 65 22 2c 20 30  lush or size", 0
5e60: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
5e70: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
5e80: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
5e90: 0a 20 20 2f 2a 20 20 20 20 20 24 64 62 20 63 68  .  /*     $db ch
5ea0: 61 6e 67 65 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20  anges.  **.  ** 
5eb0: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
5ec0: 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77  r of rows that w
5ed0: 65 72 65 20 6d 6f 64 69 66 69 65 64 2c 20 69 6e  ere modified, in
5ee0: 73 65 72 74 65 64 2c 20 6f 72 20 64 65 6c 65 74  serted, or delet
5ef0: 65 64 20 62 79 0a 20 20 2a 2a 20 74 68 65 20 6d  ed by.  ** the m
5f00: 6f 73 74 20 72 65 63 65 6e 74 20 49 4e 53 45 52  ost recent INSER
5f10: 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c  T, UPDATE or DEL
5f20: 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 6e  ETE statement, n
5f30: 6f 74 20 69 6e 63 6c 75 64 69 6e 67 20 0a 20 20  ot including .  
5f40: 2a 2a 20 61 6e 79 20 63 68 61 6e 67 65 73 20 6d  ** any changes m
5f50: 61 64 65 20 62 79 20 74 72 69 67 67 65 72 20 70  ade by trigger p
5f60: 72 6f 67 72 61 6d 73 2e 0a 20 20 2a 2f 0a 20 20  rograms..  */.  
5f70: 63 61 73 65 20 44 42 5f 43 48 41 4e 47 45 53 3a  case DB_CHANGES:
5f80: 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a   {.    Tcl_Obj *
5f90: 70 52 65 73 75 6c 74 3b 0a 20 20 20 20 69 66 28  pResult;.    if(
5fa0: 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
5fb0: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
5fc0: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
5fd0: 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 72  jv, "");.      r
5fe0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
5ff0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 52 65 73 75  .    }.    pResu
6000: 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52  lt = Tcl_GetObjR
6010: 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
6020: 20 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f 62 6a     Tcl_SetIntObj
6030: 28 70 52 65 73 75 6c 74 2c 20 73 71 6c 69 74 65  (pResult, sqlite
6040: 33 5f 63 68 61 6e 67 65 73 28 70 44 62 2d 3e 64  3_changes(pDb->d
6050: 62 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  b));.    break;.
6060: 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62    }..  /*    $db
6070: 20 63 6c 6f 73 65 0a 20 20 2a 2a 0a 20 20 2a 2a   close.  **.  **
6080: 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 64 61   Shutdown the da
6090: 74 61 62 61 73 65 0a 20 20 2a 2f 0a 20 20 63 61  tabase.  */.  ca
60a0: 73 65 20 44 42 5f 43 4c 4f 53 45 3a 20 7b 0a 20  se DB_CLOSE: {. 
60b0: 20 20 20 54 63 6c 5f 44 65 6c 65 74 65 43 6f 6d     Tcl_DeleteCom
60c0: 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 54 63 6c  mand(interp, Tcl
60d0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
60e0: 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 29 3b 0a  j(objv[0], 0));.
60f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
6100: 20 20 2f 2a 20 20 20 20 24 64 62 20 63 6f 6d 6d    /*    $db comm
6110: 69 74 5f 68 6f 6f 6b 20 3f 43 41 4c 4c 42 41 43  it_hook ?CALLBAC
6120: 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76  K?.  **.  ** Inv
6130: 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63 61  oke the given ca
6140: 6c 6c 62 61 63 6b 20 6a 75 73 74 20 62 65 66 6f  llback just befo
6150: 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 65 76  re committing ev
6160: 65 72 79 20 53 51 4c 20 74 72 61 6e 73 61 63 74  ery SQL transact
6170: 69 6f 6e 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65  ion..  ** If the
6180: 20 63 61 6c 6c 62 61 63 6b 20 74 68 72 6f 77 73   callback throws
6190: 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 6f 72   an exception or
61a0: 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72   returns non-zer
61b0: 6f 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a  o, then the.  **
61c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
61d0: 61 62 6f 72 74 65 64 2e 20 20 49 66 20 43 41 4c  aborted.  If CAL
61e0: 4c 42 41 43 4b 20 69 73 20 61 6e 20 65 6d 70 74  LBACK is an empt
61f0: 79 20 73 74 72 69 6e 67 2c 20 74 68 65 20 63 61  y string, the ca
6200: 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 69 73 20 64  llback.  ** is d
6210: 69 73 61 62 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20  isabled..  */.  
6220: 63 61 73 65 20 44 42 5f 43 4f 4d 4d 49 54 5f 48  case DB_COMMIT_H
6230: 4f 4f 4b 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f  OOK: {.    if( o
6240: 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54  bjc>3 ){.      T
6250: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
6260: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
6270: 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a   "?CALLBACK?");.
6280: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
6290: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73  _ERROR;.    }els
62a0: 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b  e if( objc==2 ){
62b0: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
62c0: 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20  zCommit ){.     
62d0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
62e0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d  ult(interp, pDb-
62f0: 3e 7a 43 6f 6d 6d 69 74 2c 20 30 29 3b 0a 20 20  >zCommit, 0);.  
6300: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
6310: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  .      char *zCo
6320: 6d 6d 69 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  mmit;.      int 
6330: 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70  len;.      if( p
6340: 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20  Db->zCommit ){. 
6350: 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28         Tcl_Free(
6360: 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 29 3b 0a 20  pDb->zCommit);. 
6370: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 43 6f       }.      zCo
6380: 6d 6d 69 74 20 3d 20 54 63 6c 5f 47 65 74 53 74  mmit = Tcl_GetSt
6390: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
63a0: 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20  [2], &len);.    
63b0: 20 20 69 66 28 20 7a 43 6f 6d 6d 69 74 20 26 26    if( zCommit &&
63c0: 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20   len>0 ){.      
63d0: 20 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d    pDb->zCommit =
63e0: 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20   Tcl_Alloc( len 
63f0: 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 73  + 1 );.        s
6400: 74 72 63 70 79 28 70 44 62 2d 3e 7a 43 6f 6d 6d  trcpy(pDb->zComm
6410: 69 74 2c 20 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20  it, zCommit);.  
6420: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6430: 20 20 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20     pDb->zCommit 
6440: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
6450: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d     if( pDb->zCom
6460: 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  mit ){.        p
6470: 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74  Db->interp = int
6480: 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  erp;.        sql
6490: 69 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b  ite3_commit_hook
64a0: 28 70 44 62 2d 3e 64 62 2c 20 44 62 43 6f 6d 6d  (pDb->db, DbComm
64b0: 69 74 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b  itHandler, pDb);
64c0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
64d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f        sqlite3_co
64e0: 6d 6d 69 74 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64  mmit_hook(pDb->d
64f0: 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  b, 0, 0);.      
6500: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  }.    }.    brea
6510: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
6520: 2a 20 20 20 20 20 24 64 62 20 63 6f 6c 6c 61 74  *     $db collat
6530: 65 20 4e 41 4d 45 20 53 43 52 49 50 54 0a 20 20  e NAME SCRIPT.  
6540: 2a 2a 0a 20 20 2a 2a 20 43 72 65 61 74 65 20 61  **.  ** Create a
6550: 20 6e 65 77 20 53 51 4c 20 63 6f 6c 6c 61 74 69   new SQL collati
6560: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  on function call
6570: 65 64 20 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76  ed NAME.  Whenev
6580: 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 66 75 6e  er.  ** that fun
6590: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
65a0: 20 69 6e 76 6f 6b 65 20 53 43 52 49 50 54 20 74   invoke SCRIPT t
65b0: 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 66  o evaluate the f
65c0: 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  unction..  */.  
65d0: 63 61 73 65 20 44 42 5f 43 4f 4c 4c 41 54 45 3a  case DB_COLLATE:
65e0: 20 7b 0a 20 20 20 20 53 71 6c 43 6f 6c 6c 61 74   {.    SqlCollat
65f0: 65 20 2a 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20  e *pCollate;.   
6600: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
6610: 20 20 63 68 61 72 20 2a 7a 53 63 72 69 70 74 3b    char *zScript;
6620: 0a 20 20 20 20 69 6e 74 20 6e 53 63 72 69 70 74  .    int nScript
6630: 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ;.    if( objc!=
6640: 34 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  4 ){.      Tcl_W
6650: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
6660: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 41  rp, 2, objv, "NA
6670: 4d 45 20 53 43 52 49 50 54 22 29 3b 0a 20 20 20  ME SCRIPT");.   
6680: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
6690: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  ROR;.    }.    z
66a0: 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  Name = Tcl_GetSt
66b0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
66c0: 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20 7a 53 63  [2], 0);.    zSc
66d0: 72 69 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 74  ript = Tcl_GetSt
66e0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
66f0: 5b 33 5d 2c 20 26 6e 53 63 72 69 70 74 29 3b 0a  [3], &nScript);.
6700: 20 20 20 20 70 43 6f 6c 6c 61 74 65 20 3d 20 28      pCollate = (
6710: 53 71 6c 43 6f 6c 6c 61 74 65 2a 29 54 63 6c 5f  SqlCollate*)Tcl_
6720: 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  Alloc( sizeof(*p
6730: 43 6f 6c 6c 61 74 65 29 20 2b 20 6e 53 63 72 69  Collate) + nScri
6740: 70 74 20 2b 20 31 20 29 3b 0a 20 20 20 20 69 66  pt + 1 );.    if
6750: 28 20 70 43 6f 6c 6c 61 74 65 3d 3d 30 20 29 20  ( pCollate==0 ) 
6760: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
6770: 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65 2d 3e  ;.    pCollate->
6780: 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b  interp = interp;
6790: 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65 2d 3e 70  .    pCollate->p
67a0: 4e 65 78 74 20 3d 20 70 44 62 2d 3e 70 43 6f 6c  Next = pDb->pCol
67b0: 6c 61 74 65 3b 0a 20 20 20 20 70 43 6f 6c 6c 61  late;.    pColla
67c0: 74 65 2d 3e 7a 53 63 72 69 70 74 20 3d 20 28 63  te->zScript = (c
67d0: 68 61 72 2a 29 26 70 43 6f 6c 6c 61 74 65 5b 31  har*)&pCollate[1
67e0: 5d 3b 0a 20 20 20 20 70 44 62 2d 3e 70 43 6f 6c  ];.    pDb->pCol
67f0: 6c 61 74 65 20 3d 20 70 43 6f 6c 6c 61 74 65 3b  late = pCollate;
6800: 0a 20 20 20 20 73 74 72 63 70 79 28 70 43 6f 6c  .    strcpy(pCol
6810: 6c 61 74 65 2d 3e 7a 53 63 72 69 70 74 2c 20 7a  late->zScript, z
6820: 53 63 72 69 70 74 29 3b 0a 20 20 20 20 69 66 28  Script);.    if(
6830: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
6840: 63 6f 6c 6c 61 74 69 6f 6e 28 70 44 62 2d 3e 64  collation(pDb->d
6850: 62 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45  b, zName, SQLITE
6860: 5f 55 54 46 38 2c 20 0a 20 20 20 20 20 20 20 20  _UTF8, .        
6870: 70 43 6f 6c 6c 61 74 65 2c 20 74 63 6c 53 71 6c  pCollate, tclSql
6880: 43 6f 6c 6c 61 74 65 29 20 29 7b 0a 20 20 20 20  Collate) ){.    
6890: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
68a0: 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
68b0: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
68c0: 44 62 2d 3e 64 62 29 2c 20 54 43 4c 5f 56 4f 4c  Db->db), TCL_VOL
68d0: 41 54 49 4c 45 29 3b 0a 20 20 20 20 20 20 72 65  ATILE);.      re
68e0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
68f0: 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
6900: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
6910: 20 20 20 20 24 64 62 20 63 6f 6c 6c 61 74 69 6f      $db collatio
6920: 6e 5f 6e 65 65 64 65 64 20 53 43 52 49 50 54 0a  n_needed SCRIPT.
6930: 20 20 2a 2a 0a 20 20 2a 2a 20 43 72 65 61 74 65    **.  ** Create
6940: 20 61 20 6e 65 77 20 53 51 4c 20 63 6f 6c 6c 61   a new SQL colla
6950: 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 63 61  tion function ca
6960: 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 57 68 65 6e  lled NAME.  When
6970: 65 76 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 66  ever.  ** that f
6980: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
6990: 64 2c 20 69 6e 76 6f 6b 65 20 53 43 52 49 50 54  d, invoke SCRIPT
69a0: 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65   to evaluate the
69b0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a   function..  */.
69c0: 20 20 63 61 73 65 20 44 42 5f 43 4f 4c 4c 41 54    case DB_COLLAT
69d0: 49 4f 4e 5f 4e 45 45 44 45 44 3a 20 7b 0a 20 20  ION_NEEDED: {.  
69e0: 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
69f0: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
6a00: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
6a10: 32 2c 20 6f 62 6a 76 2c 20 22 53 43 52 49 50 54  2, objv, "SCRIPT
6a20: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
6a30: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
6a40: 7d 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70  }.    if( pDb->p
6a50: 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 20 29 7b  CollateNeeded ){
6a60: 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52  .      Tcl_DecrR
6a70: 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 43 6f  efCount(pDb->pCo
6a80: 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20  llateNeeded);.  
6a90: 20 20 7d 0a 20 20 20 20 70 44 62 2d 3e 70 43 6f    }.    pDb->pCo
6aa0: 6c 6c 61 74 65 4e 65 65 64 65 64 20 3d 20 54 63  llateNeeded = Tc
6ab0: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 6f  l_DuplicateObj(o
6ac0: 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 54 63 6c  bjv[2]);.    Tcl
6ad0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 44  _IncrRefCount(pD
6ae0: 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65  b->pCollateNeede
6af0: 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  d);.    sqlite3_
6b00: 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64  collation_needed
6b10: 28 70 44 62 2d 3e 64 62 2c 20 70 44 62 2c 20 74  (pDb->db, pDb, t
6b20: 63 6c 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29  clCollateNeeded)
6b30: 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
6b40: 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 63 6f  ..  /*    $db co
6b50: 6d 70 6c 65 74 65 20 53 51 4c 0a 20 20 2a 2a 0a  mplete SQL.  **.
6b60: 20 20 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45    ** Return TRUE
6b70: 20 69 66 20 53 51 4c 20 69 73 20 61 20 63 6f 6d   if SQL is a com
6b80: 70 6c 65 74 65 20 53 51 4c 20 73 74 61 74 65 6d  plete SQL statem
6b90: 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 46 41 4c  ent.  Return FAL
6ba0: 53 45 20 69 66 0a 20 20 2a 2a 20 61 64 64 69 74  SE if.  ** addit
6bb0: 69 6f 6e 61 6c 20 6c 69 6e 65 73 20 6f 66 20 69  ional lines of i
6bc0: 6e 70 75 74 20 61 72 65 20 6e 65 65 64 65 64 2e  nput are needed.
6bd0: 20 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61    This is simila
6be0: 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 62 75  r to the.  ** bu
6bf0: 69 6c 74 2d 69 6e 20 22 69 6e 66 6f 20 63 6f 6d  ilt-in "info com
6c00: 70 6c 65 74 65 22 20 63 6f 6d 6d 61 6e 64 20 6f  plete" command o
6c10: 66 20 54 63 6c 2e 0a 20 20 2a 2f 0a 20 20 63 61  f Tcl..  */.  ca
6c20: 73 65 20 44 42 5f 43 4f 4d 50 4c 45 54 45 3a 20  se DB_COMPLETE: 
6c30: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
6c40: 5f 4f 4d 49 54 5f 43 4f 4d 50 4c 45 54 45 0a 20  _OMIT_COMPLETE. 
6c50: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73     Tcl_Obj *pRes
6c60: 75 6c 74 3b 0a 20 20 20 20 69 6e 74 20 69 73 43  ult;.    int isC
6c70: 6f 6d 70 6c 65 74 65 3b 0a 20 20 20 20 69 66 28  omplete;.    if(
6c80: 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
6c90: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
6ca0: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
6cb0: 6a 76 2c 20 22 53 51 4c 22 29 3b 0a 20 20 20 20  jv, "SQL");.    
6cc0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
6cd0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 73  OR;.    }.    is
6ce0: 43 6f 6d 70 6c 65 74 65 20 3d 20 73 71 6c 69 74  Complete = sqlit
6cf0: 65 33 5f 63 6f 6d 70 6c 65 74 65 28 20 54 63 6c  e3_complete( Tcl
6d00: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
6d10: 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 20 29 3b  j(objv[2], 0) );
6d20: 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54  .    pResult = T
6d30: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_GetObjResult(
6d40: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c  interp);.    Tcl
6d50: 5f 53 65 74 42 6f 6f 6c 65 61 6e 4f 62 6a 28 70  _SetBooleanObj(p
6d60: 52 65 73 75 6c 74 2c 20 69 73 43 6f 6d 70 6c 65  Result, isComple
6d70: 74 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  te);.#endif.    
6d80: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
6d90: 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 65 72 72  .  **    $db err
6da0: 6f 72 63 6f 64 65 0a 20 20 2a 2a 0a 20 20 2a 2a  orcode.  **.  **
6db0: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 65   Return the nume
6dc0: 72 69 63 20 65 72 72 6f 72 20 63 6f 64 65 20 74  ric error code t
6dd0: 68 61 74 20 77 61 73 20 72 65 74 75 72 6e 65 64  hat was returned
6de0: 20 62 79 20 74 68 65 20 6d 6f 73 74 20 72 65 63   by the most rec
6df0: 65 6e 74 0a 20 20 2a 2a 20 63 61 6c 6c 20 74 6f  ent.  ** call to
6e00: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 2e   sqlite3_exec().
6e10: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
6e20: 45 52 52 4f 52 43 4f 44 45 3a 20 7b 0a 20 20 20  ERRORCODE: {.   
6e30: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
6e40: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
6e50: 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f  wIntObj(sqlite3_
6e60: 65 72 72 63 6f 64 65 28 70 44 62 2d 3e 64 62 29  errcode(pDb->db)
6e70: 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  ));.    break;. 
6e80: 20 7d 0a 20 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a   }.   .  /*.  **
6e90: 20 20 20 20 24 64 62 20 65 76 61 6c 20 24 73 71      $db eval $sq
6ea0: 6c 20 3f 61 72 72 61 79 3f 20 3f 7b 20 20 2e 2e  l ?array? ?{  ..
6eb0: 2e 63 6f 64 65 2e 2e 2e 20 7d 3f 0a 20 20 2a 2a  .code... }?.  **
6ec0: 20 20 20 20 24 64 62 20 6f 6e 65 63 6f 6c 75 6d      $db onecolum
6ed0: 6e 20 24 73 71 6c 0a 20 20 2a 2a 0a 20 20 2a 2a  n $sql.  **.  **
6ee0: 20 54 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   The SQL stateme
6ef0: 6e 74 20 69 6e 20 24 73 71 6c 20 69 73 20 65 76  nt in $sql is ev
6f00: 61 6c 75 61 74 65 64 2e 20 20 46 6f 72 20 65 61  aluated.  For ea
6f10: 63 68 20 72 6f 77 2c 20 74 68 65 20 76 61 6c 75  ch row, the valu
6f20: 65 73 20 61 72 65 0a 20 20 2a 2a 20 70 6c 61 63  es are.  ** plac
6f30: 65 64 20 69 6e 20 65 6c 65 6d 65 6e 74 73 20 6f  ed in elements o
6f40: 66 20 74 68 65 20 61 72 72 61 79 20 6e 61 6d 65  f the array name
6f50: 64 20 22 61 72 72 61 79 22 20 61 6e 64 20 2e 2e  d "array" and ..
6f60: 2e 63 6f 64 65 2e 2e 2e 20 69 73 20 65 78 65 63  .code... is exec
6f70: 75 74 65 64 2e 0a 20 20 2a 2a 20 49 66 20 22 61  uted..  ** If "a
6f80: 72 72 61 79 22 20 61 6e 64 20 22 63 6f 64 65 22  rray" and "code"
6f90: 20 61 72 65 20 6f 6d 69 74 74 65 64 2c 20 74 68   are omitted, th
6fa0: 65 6e 20 6e 6f 20 63 61 6c 6c 62 61 63 6b 20 69  en no callback i
6fb0: 73 20 65 76 65 72 79 20 69 6e 76 6f 6b 65 64 2e  s every invoked.
6fc0: 0a 20 20 2a 2a 20 49 66 20 22 61 72 72 61 79 22  .  ** If "array"
6fd0: 20 69 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72   is an empty str
6fe0: 69 6e 67 2c 20 74 68 65 6e 20 74 68 65 20 76 61  ing, then the va
6ff0: 6c 75 65 73 20 61 72 65 20 70 6c 61 63 65 64 20  lues are placed 
7000: 69 6e 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a  in variables.  *
7010: 2a 20 74 68 61 74 20 68 61 76 65 20 74 68 65 20  * that have the 
7020: 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65  same name as the
7030: 20 66 69 65 6c 64 73 20 65 78 74 72 61 63 74 65   fields extracte
7040: 64 20 62 79 20 74 68 65 20 71 75 65 72 79 2e 0a  d by the query..
7050: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6f 6e    **.  ** The on
7060: 65 63 6f 6c 75 6d 6e 20 6d 65 74 68 6f 64 20 69  ecolumn method i
7070: 73 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74  s the equivalent
7080: 20 6f 66 3a 0a 20 20 2a 2a 20 20 20 20 20 6c 69   of:.  **     li
7090: 6e 64 65 78 20 5b 24 64 62 20 65 76 61 6c 20 24  ndex [$db eval $
70a0: 73 71 6c 5d 20 30 0a 20 20 2a 2f 0a 20 20 63 61  sql] 0.  */.  ca
70b0: 73 65 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 3a  se DB_ONECOLUMN:
70c0: 0a 20 20 63 61 73 65 20 44 42 5f 45 56 41 4c 3a  .  case DB_EVAL:
70d0: 20 7b 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73   {.    char cons
70e0: 74 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 2f 2a  t *zSql;      /*
70f0: 20 4e 65 78 74 20 53 51 4c 20 73 74 61 74 65 6d   Next SQL statem
7100: 65 6e 74 20 74 6f 20 65 78 65 63 75 74 65 20 2a  ent to execute *
7110: 2f 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74  /.    char const
7120: 20 2a 7a 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20   *zLeft;     /* 
7130: 57 68 61 74 20 69 73 20 6c 65 66 74 20 61 66 74  What is left aft
7140: 65 72 20 66 69 72 73 74 20 73 74 6d 74 20 69 6e  er first stmt in
7150: 20 7a 53 71 6c 20 2a 2f 0a 20 20 20 20 73 71 6c   zSql */.    sql
7160: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
7170: 3b 20 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 64 20  ;   /* Compiled 
7180: 53 51 4c 20 73 74 61 74 6d 65 6e 74 20 2a 2f 0a  SQL statment */.
7190: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 41 72      Tcl_Obj *pAr
71a0: 72 61 79 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61  ray;       /* Na
71b0: 6d 65 20 6f 66 20 61 72 72 61 79 20 69 6e 74 6f  me of array into
71c0: 20 77 68 69 63 68 20 72 65 73 75 6c 74 73 20 61   which results a
71d0: 72 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  re written */.  
71e0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69    Tcl_Obj *pScri
71f0: 70 74 3b 20 20 20 20 20 20 2f 2a 20 53 63 72 69  pt;      /* Scri
7200: 70 74 20 74 6f 20 72 75 6e 20 66 6f 72 20 65 61  pt to run for ea
7210: 63 68 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  ch result set */
7220: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61  .    Tcl_Obj **a
7230: 70 50 61 72 6d 3b 20 20 20 20 20 20 2f 2a 20 50  pParm;      /* P
7240: 61 72 61 6d 65 74 65 72 73 20 74 68 61 74 20 6e  arameters that n
7250: 65 65 64 20 61 20 54 63 6c 5f 44 65 63 72 52 65  eed a Tcl_DecrRe
7260: 66 43 6f 75 6e 74 28 29 20 2a 2f 0a 20 20 20 20  fCount() */.    
7270: 69 6e 74 20 6e 50 61 72 6d 3b 20 20 20 20 20 20  int nParm;      
7280: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
7290: 20 6f 66 20 65 6e 74 72 69 65 73 20 75 73 65 64   of entries used
72a0: 20 69 6e 20 61 70 50 61 72 6d 5b 5d 20 2a 2f 0a   in apParm[] */.
72b0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 61 50 61      Tcl_Obj *aPa
72c0: 72 6d 5b 31 30 5d 3b 20 20 20 20 2f 2a 20 53 74  rm[10];    /* St
72d0: 61 74 69 63 20 73 70 61 63 65 20 66 6f 72 20 61  atic space for a
72e0: 70 50 61 72 6d 5b 5d 20 69 6e 20 74 68 65 20 63  pParm[] in the c
72f0: 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20  ommon case */.  
7300: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b    Tcl_Obj *pRet;
7310: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
7320: 65 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  e to be returned
7330: 20 2a 2f 0a 20 20 20 20 53 71 6c 50 72 65 70 61   */.    SqlPrepa
7340: 72 65 64 53 74 6d 74 20 2a 70 50 72 65 53 74 6d  redStmt *pPreStm
7350: 74 3b 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  t;  /* Pointer t
7360: 6f 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61  o a prepared sta
7370: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e  tement */.    in
7380: 74 20 72 63 32 3b 0a 0a 20 20 20 20 69 66 28 20  t rc2;..    if( 
7390: 63 68 6f 69 63 65 3d 3d 44 42 5f 4f 4e 45 43 4f  choice==DB_ONECO
73a0: 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 69 66  LUMN ){.      if
73b0: 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
73c0: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
73d0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
73e0: 20 6f 62 6a 76 2c 20 22 53 51 4c 22 29 3b 0a 20   objv, "SQL");. 
73f0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
7400: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  L_ERROR;.      }
7410: 0a 20 20 20 20 20 20 70 52 65 74 20 3d 20 30 3b  .      pRet = 0;
7420: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
7430: 20 20 69 66 28 20 6f 62 6a 63 3c 33 20 7c 7c 20    if( objc<3 || 
7440: 6f 62 6a 63 3e 35 20 29 7b 0a 20 20 20 20 20 20  objc>5 ){.      
7450: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
7460: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
7470: 6a 76 2c 20 22 53 51 4c 20 3f 41 52 52 41 59 2d  jv, "SQL ?ARRAY-
7480: 4e 41 4d 45 3f 20 3f 53 43 52 49 50 54 3f 22 29  NAME? ?SCRIPT?")
7490: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
74a0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
74b0: 20 20 7d 0a 20 20 20 20 20 20 70 52 65 74 20 3d    }.      pRet =
74c0: 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20   Tcl_NewObj();. 
74d0: 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66       Tcl_IncrRef
74e0: 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20 20 20  Count(pRet);.   
74f0: 20 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d   }.    if( objc=
7500: 3d 33 20 29 7b 0a 20 20 20 20 20 20 70 41 72 72  =3 ){.      pArr
7510: 61 79 20 3d 20 70 53 63 72 69 70 74 20 3d 20 30  ay = pScript = 0
7520: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
7530: 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20  objc==4 ){.     
7540: 20 70 41 72 72 61 79 20 3d 20 30 3b 0a 20 20 20   pArray = 0;.   
7550: 20 20 20 70 53 63 72 69 70 74 20 3d 20 6f 62 6a     pScript = obj
7560: 76 5b 33 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  v[3];.    }else{
7570: 0a 20 20 20 20 20 20 70 41 72 72 61 79 20 3d 20  .      pArray = 
7580: 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20 20 20 20 69  objv[3];.      i
7590: 66 28 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  f( Tcl_GetString
75a0: 28 70 41 72 72 61 79 29 5b 30 5d 3d 3d 30 20 29  (pArray)[0]==0 )
75b0: 20 70 41 72 72 61 79 20 3d 20 30 3b 0a 20 20 20   pArray = 0;.   
75c0: 20 20 20 70 53 63 72 69 70 74 20 3d 20 6f 62 6a     pScript = obj
75d0: 76 5b 34 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  v[4];.    }..   
75e0: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
75f0: 74 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20  t(objv[2]);.    
7600: 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74  zSql = Tcl_GetSt
7610: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
7620: 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20 77 68 69  [2], 0);.    whi
7630: 6c 65 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 26  le( rc==TCL_OK &
7640: 26 20 7a 53 71 6c 5b 30 5d 20 29 7b 0a 20 20 20  & zSql[0] ){.   
7650: 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
7660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7670: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
7680: 0a 20 20 20 20 20 20 69 6e 74 20 6e 56 61 72 3b  .      int nVar;
7690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
76a0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
76b0: 69 6e 64 20 70 61 72 61 6d 65 74 65 72 73 20 69  ind parameters i
76c0: 6e 20 74 68 65 20 70 53 74 6d 74 20 2a 2f 0a 20  n the pStmt */. 
76d0: 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20       int nCol;  
76e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
76f0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
7700: 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75  umns in the resu
7710: 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 20 20  lt set */.      
7720: 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 43 6f 6c 4e  Tcl_Obj **apColN
7730: 61 6d 65 20 3d 20 30 3b 20 20 20 2f 2a 20 41 72  ame = 0;   /* Ar
7740: 72 61 79 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61  ray of column na
7750: 6d 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  mes */.      int
7760: 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20   len;           
7770: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72 69 6e          /* Strin
7780: 67 20 6c 65 6e 67 74 68 20 6f 66 20 7a 53 71 6c  g length of zSql
7790: 20 2a 2f 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20   */.  .      /* 
77a0: 54 72 79 20 74 6f 20 66 69 6e 64 20 61 20 53 51  Try to find a SQ
77b0: 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  L statement that
77c0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
77d0: 6e 20 63 6f 6d 70 69 6c 65 64 20 61 6e 64 0a 20  n compiled and. 
77e0: 20 20 20 20 20 2a 2a 20 77 68 69 63 68 20 6d 61       ** which ma
77f0: 74 63 68 65 73 20 74 68 65 20 6e 65 78 74 20 73  tches the next s
7800: 65 71 75 65 6e 63 65 20 6f 66 20 53 51 4c 2e 0a  equence of SQL..
7810: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
7820: 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
7830: 70 50 72 65 53 74 6d 74 20 3d 20 70 44 62 2d 3e  pPreStmt = pDb->
7840: 73 74 6d 74 4c 69 73 74 3b 0a 20 20 20 20 20 20  stmtList;.      
7850: 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 53 71  len = strlen(zSq
7860: 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  l);.      if( pP
7870: 72 65 53 74 6d 74 20 26 26 20 73 71 6c 69 74 65  reStmt && sqlite
7880: 33 5f 65 78 70 69 72 65 64 28 70 50 72 65 53 74  3_expired(pPreSt
7890: 6d 74 2d 3e 70 53 74 6d 74 29 20 29 7b 0a 20 20  mt->pStmt) ){.  
78a0: 20 20 20 20 20 20 66 6c 75 73 68 53 74 6d 74 43        flushStmtC
78b0: 61 63 68 65 28 70 44 62 29 3b 0a 20 20 20 20 20  ache(pDb);.     
78c0: 20 20 20 70 50 72 65 53 74 6d 74 20 3d 20 30 3b     pPreStmt = 0;
78d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
78e0: 6f 72 28 3b 20 70 50 72 65 53 74 6d 74 3b 20 70  or(; pPreStmt; p
78f0: 50 72 65 53 74 6d 74 3d 70 50 72 65 53 74 6d 74  PreStmt=pPreStmt
7900: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
7910: 20 20 69 6e 74 20 6e 20 3d 20 70 50 72 65 53 74    int n = pPreSt
7920: 6d 74 2d 3e 6e 53 71 6c 3b 0a 20 20 20 20 20 20  mt->nSql;.      
7930: 20 20 69 66 28 20 6c 65 6e 3e 3d 6e 20 0a 20 20    if( len>=n .  
7940: 20 20 20 20 20 20 20 20 20 20 26 26 20 6d 65 6d            && mem
7950: 63 6d 70 28 70 50 72 65 53 74 6d 74 2d 3e 7a 53  cmp(pPreStmt->zS
7960: 71 6c 2c 20 7a 53 71 6c 2c 20 6e 29 3d 3d 30 0a  ql, zSql, n)==0.
7970: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
7980: 7a 53 71 6c 5b 6e 5d 3d 3d 30 20 7c 7c 20 7a 53  zSql[n]==0 || zS
7990: 71 6c 5b 6e 2d 31 5d 3d 3d 27 3b 27 29 0a 20 20  ql[n-1]==';').  
79a0: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
79b0: 20 20 20 70 53 74 6d 74 20 3d 20 70 50 72 65 53     pStmt = pPreS
79c0: 74 6d 74 2d 3e 70 53 74 6d 74 3b 0a 20 20 20 20  tmt->pStmt;.    
79d0: 20 20 20 20 20 20 7a 4c 65 66 74 20 3d 20 26 7a        zLeft = &z
79e0: 53 71 6c 5b 70 50 72 65 53 74 6d 74 2d 3e 6e 53  Sql[pPreStmt->nS
79f0: 71 6c 5d 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  ql];..          
7a00: 2f 2a 20 57 68 65 6e 20 61 20 70 72 65 70 61 72  /* When a prepar
7a10: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  ed statement is 
7a20: 66 6f 75 6e 64 2c 20 75 6e 6c 69 6e 6b 20 69 74  found, unlink it
7a30: 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 20 20   from the.      
7a40: 20 20 20 20 2a 2a 20 63 61 63 68 65 20 6c 69 73      ** cache lis
7a50: 74 2e 20 20 49 74 20 77 69 6c 6c 20 6c 61 74 65  t.  It will late
7a60: 72 20 62 65 20 61 64 64 65 64 20 62 61 63 6b 20  r be added back 
7a70: 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
7a80: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  .          ** of
7a90: 20 74 68 65 20 63 61 63 68 65 20 6c 69 73 74 20   the cache list 
7aa0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6d 70 6c  in order to impl
7ab0: 65 6d 65 6e 74 20 4c 52 55 20 72 65 70 6c 61 63  ement LRU replac
7ac0: 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 20 20 20  ement..         
7ad0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
7ae0: 28 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72 65  ( pPreStmt->pPre
7af0: 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  v ){.           
7b00: 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76   pPreStmt->pPrev
7b10: 2d 3e 70 4e 65 78 74 20 3d 20 70 50 72 65 53 74  ->pNext = pPreSt
7b20: 6d 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  mt->pNext;.     
7b30: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
7b40: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d          pDb->stm
7b50: 74 4c 69 73 74 20 3d 20 70 50 72 65 53 74 6d 74  tList = pPreStmt
7b60: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
7b70: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
7b80: 66 28 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65  f( pPreStmt->pNe
7b90: 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  xt ){.          
7ba0: 20 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78    pPreStmt->pNex
7bb0: 74 2d 3e 70 50 72 65 76 20 3d 20 70 50 72 65 53  t->pPrev = pPreS
7bc0: 74 6d 74 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20  tmt->pPrev;.    
7bd0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
7be0: 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73 74           pDb->st
7bf0: 6d 74 4c 61 73 74 20 3d 20 70 50 72 65 53 74 6d  mtLast = pPreStm
7c00: 74 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20  t->pPrev;.      
7c10: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
7c20: 70 44 62 2d 3e 6e 53 74 6d 74 2d 2d 3b 0a 20 20  pDb->nStmt--;.  
7c30: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
7c40: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
7c50: 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  .  .      /* If 
7c60: 6e 6f 20 70 72 65 70 61 72 65 64 20 73 74 61 74  no prepared stat
7c70: 65 6d 65 6e 74 20 77 61 73 20 66 6f 75 6e 64 2e  ement was found.
7c80: 20 20 43 6f 6d 70 69 6c 65 20 74 68 65 20 53 51    Compile the SQ
7c90: 4c 20 74 65 78 74 0a 20 20 20 20 20 20 2a 2f 0a  L text.      */.
7ca0: 20 20 20 20 20 20 69 66 28 20 70 53 74 6d 74 3d        if( pStmt=
7cb0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
7cc0: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
7cd0: 69 74 65 33 5f 70 72 65 70 61 72 65 28 70 44 62  ite3_prepare(pDb
7ce0: 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  ->db, zSql, -1, 
7cf0: 26 70 53 74 6d 74 2c 20 26 7a 4c 65 66 74 29 20  &pStmt, &zLeft) 
7d00: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  ){.          Tcl
7d10: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
7d20: 74 65 72 70 2c 20 64 62 54 65 78 74 54 6f 4f 62  terp, dbTextToOb
7d30: 6a 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  j(sqlite3_errmsg
7d40: 28 70 44 62 2d 3e 64 62 29 29 29 3b 0a 20 20 20  (pDb->db)));.   
7d50: 20 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f         rc = TCL_
7d60: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20  ERROR;.         
7d70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
7d80: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53  }.        if( pS
7d90: 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tmt==0 ){.      
7da0: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
7db0: 4b 21 3d 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  K!=sqlite3_errco
7dc0: 64 65 28 70 44 62 2d 3e 64 62 29 20 29 7b 0a 20  de(pDb->db) ){. 
7dd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
7de0: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 65 72 72  compile-time err
7df0: 6f 72 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  or in the statem
7e00: 65 6e 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  ent.            
7e10: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 54  */.            T
7e20: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
7e30: 69 6e 74 65 72 70 2c 20 64 62 54 65 78 74 54 6f  interp, dbTextTo
7e40: 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65 72 72 6d  Obj(sqlite3_errm
7e50: 73 67 28 70 44 62 2d 3e 64 62 29 29 29 3b 0a 20  sg(pDb->db)));. 
7e60: 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
7e70: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
7e80: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
7e90: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
7ea0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
7eb0: 65 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20  e statement was 
7ec0: 61 20 6e 6f 2d 6f 70 2e 20 20 43 6f 6e 74 69 6e  a no-op.  Contin
7ed0: 75 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73  ue to the next s
7ee0: 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 20  tatement.       
7ef0: 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 53       ** in the S
7f00: 51 4c 20 73 74 72 69 6e 67 2e 0a 20 20 20 20 20  QL string..     
7f10: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
7f20: 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 7a 4c 65        zSql = zLe
7f30: 66 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ft;.            
7f40: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
7f50: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
7f60: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
7f70: 70 50 72 65 53 74 6d 74 3d 3d 30 20 29 3b 0a 20  pPreStmt==0 );. 
7f80: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
7f90: 20 42 69 6e 64 20 76 61 6c 75 65 73 20 74 6f 20   Bind values to 
7fa0: 70 61 72 61 6d 65 74 65 72 73 20 74 68 61 74 20  parameters that 
7fb0: 62 65 67 69 6e 20 77 69 74 68 20 24 20 6f 72 20  begin with $ or 
7fc0: 3a 0a 20 20 20 20 20 20 2a 2f 20 20 0a 20 20 20  :.      */  .   
7fd0: 20 20 20 6e 56 61 72 20 3d 20 73 71 6c 69 74 65     nVar = sqlite
7fe0: 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
7ff0: 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20  _count(pStmt);. 
8000: 20 20 20 20 20 6e 50 61 72 6d 20 3d 20 30 3b 0a       nParm = 0;.
8010: 20 20 20 20 20 20 69 66 28 20 6e 56 61 72 3e 73        if( nVar>s
8020: 69 7a 65 6f 66 28 61 50 61 72 6d 29 2f 73 69 7a  izeof(aParm)/siz
8030: 65 6f 66 28 61 50 61 72 6d 5b 30 5d 29 20 29 7b  eof(aParm[0]) ){
8040: 0a 20 20 20 20 20 20 20 20 61 70 50 61 72 6d 20  .        apParm 
8050: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 2a 29 54 63 6c  = (Tcl_Obj**)Tcl
8060: 5f 41 6c 6c 6f 63 28 6e 56 61 72 2a 73 69 7a 65  _Alloc(nVar*size
8070: 6f 66 28 61 70 50 61 72 6d 5b 30 5d 29 29 3b 0a  of(apParm[0]));.
8080: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8090: 20 20 20 20 20 61 70 50 61 72 6d 20 3d 20 61 50       apParm = aP
80a0: 61 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  arm;.      }.   
80b0: 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e     for(i=1; i<=n
80c0: 56 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Var; i++){.     
80d0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
80e0: 56 61 72 20 3d 20 73 71 6c 69 74 65 33 5f 62 69  Var = sqlite3_bi
80f0: 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d  nd_parameter_nam
8100: 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20  e(pStmt, i);.   
8110: 20 20 20 20 20 69 66 28 20 7a 56 61 72 21 3d 30       if( zVar!=0
8120: 20 26 26 20 28 7a 56 61 72 5b 30 5d 3d 3d 27 24   && (zVar[0]=='$
8130: 27 20 7c 7c 20 7a 56 61 72 5b 30 5d 3d 3d 27 3a  ' || zVar[0]==':
8140: 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ') ){.          
8150: 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 72 20 3d 20  Tcl_Obj *pVar = 
8160: 54 63 6c 5f 47 65 74 56 61 72 32 45 78 28 69 6e  Tcl_GetVar2Ex(in
8170: 74 65 72 70 2c 20 26 7a 56 61 72 5b 31 5d 2c 20  terp, &zVar[1], 
8180: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  0, 0);.         
8190: 20 69 66 28 20 70 56 61 72 20 29 7b 0a 20 20 20   if( pVar ){.   
81a0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a           int n;.
81b0: 20 20 20 20 20 20 20 20 20 20 20 20 75 38 20 2a              u8 *
81c0: 64 61 74 61 3b 0a 20 20 20 20 20 20 20 20 20 20  data;.          
81d0: 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20    char *zType = 
81e0: 70 56 61 72 2d 3e 74 79 70 65 50 74 72 20 3f 20  pVar->typePtr ? 
81f0: 70 56 61 72 2d 3e 74 79 70 65 50 74 72 2d 3e 6e  pVar->typePtr->n
8200: 61 6d 65 20 3a 20 22 22 3b 0a 20 20 20 20 20 20  ame : "";.      
8210: 20 20 20 20 20 20 63 68 61 72 20 63 20 3d 20 7a        char c = z
8220: 54 79 70 65 5b 30 5d 3b 0a 20 20 20 20 20 20 20  Type[0];.       
8230: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 62 27 20       if( c=='b' 
8240: 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c  && strcmp(zType,
8250: 22 62 79 74 65 61 72 72 61 79 22 29 3d 3d 30 20  "bytearray")==0 
8260: 26 26 20 70 56 61 72 2d 3e 62 79 74 65 73 3d 3d  && pVar->bytes==
8270: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
8280: 20 20 20 2f 2a 20 4f 6e 6c 79 20 6c 6f 61 64 20     /* Only load 
8290: 61 20 42 4c 4f 42 20 74 79 70 65 20 69 66 20 74  a BLOB type if t
82a0: 68 65 20 54 63 6c 20 76 61 72 69 61 62 6c 65 20  he Tcl variable 
82b0: 69 73 20 61 20 62 79 74 65 61 72 72 61 79 20 61  is a bytearray a
82c0: 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  nd.             
82d0: 20 2a 2a 20 68 61 73 20 6e 6f 20 73 74 72 69 6e   ** has no strin
82e0: 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  g representation
82f0: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
8300: 20 20 20 64 61 74 61 20 3d 20 54 63 6c 5f 47 65     data = Tcl_Ge
8310: 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62  tByteArrayFromOb
8320: 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20  j(pVar, &n);.   
8330: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
8340: 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74  e3_bind_blob(pSt
8350: 6d 74 2c 20 69 2c 20 64 61 74 61 2c 20 6e 2c 20  mt, i, data, n, 
8360: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
8370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63                Tc
8380: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
8390: 56 61 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Var);.          
83a0: 20 20 20 20 61 70 50 61 72 6d 5b 6e 50 61 72 6d      apParm[nParm
83b0: 2b 2b 5d 20 3d 20 70 56 61 72 3b 0a 20 20 20 20  ++] = pVar;.    
83c0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
83d0: 28 20 28 63 3d 3d 27 62 27 20 26 26 20 73 74 72  ( (c=='b' && str
83e0: 63 6d 70 28 7a 54 79 70 65 2c 22 62 6f 6f 6c 65  cmp(zType,"boole
83f0: 61 6e 22 29 3d 3d 30 29 20 7c 7c 0a 20 20 20 20  an")==0) ||.    
8400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
8410: 3d 3d 27 69 27 20 26 26 20 73 74 72 63 6d 70 28  =='i' && strcmp(
8420: 7a 54 79 70 65 2c 22 69 6e 74 22 29 3d 3d 30 29  zType,"int")==0)
8430: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
8440: 20 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d    Tcl_GetIntFrom
8450: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 56 61 72  Obj(interp, pVar
8460: 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  , &n);.         
8470: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
8480: 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20 69 2c 20  d_int(pStmt, i, 
8490: 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
84a0: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 64 27  }else if( c=='d'
84b0: 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65   && strcmp(zType
84c0: 2c 22 64 6f 75 62 6c 65 22 29 3d 3d 30 20 29 7b  ,"double")==0 ){
84d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  .              d
84e0: 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20 20 20 20  ouble r;.       
84f0: 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 44 6f         Tcl_GetDo
8500: 75 62 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  ubleFromObj(inte
8510: 72 70 2c 20 70 56 61 72 2c 20 26 72 29 3b 0a 20  rp, pVar, &r);. 
8520: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
8530: 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65  ite3_bind_double
8540: 28 70 53 74 6d 74 2c 20 69 2c 20 72 29 3b 0a 20  (pStmt, i, r);. 
8550: 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
8560: 20 69 66 28 20 63 3d 3d 27 77 27 20 26 26 20 73   if( c=='w' && s
8570: 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 77 69 64  trcmp(zType,"wid
8580: 65 49 6e 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  eInt")==0 ){.   
8590: 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 57             Tcl_W
85a0: 69 64 65 49 6e 74 20 76 3b 0a 20 20 20 20 20 20  ideInt v;.      
85b0: 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 57          Tcl_GetW
85c0: 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  ideIntFromObj(in
85d0: 74 65 72 70 2c 20 70 56 61 72 2c 20 26 76 29 3b  terp, pVar, &v);
85e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
85f0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
8600: 34 28 70 53 74 6d 74 2c 20 69 2c 20 76 29 3b 0a  4(pStmt, i, v);.
8610: 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
8620: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
8630: 20 64 61 74 61 20 3d 20 54 63 6c 5f 47 65 74 53   data = Tcl_GetS
8640: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 56 61  tringFromObj(pVa
8650: 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20  r, &n);.        
8660: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
8670: 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69  nd_text(pStmt, i
8680: 2c 20 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54  , data, n, SQLIT
8690: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  E_STATIC);.     
86a0: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63           Tcl_Inc
86b0: 72 52 65 66 43 6f 75 6e 74 28 70 56 61 72 29 3b  rRefCount(pVar);
86c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  .              a
86d0: 70 50 61 72 6d 5b 6e 50 61 72 6d 2b 2b 5d 20 3d  pParm[nParm++] =
86e0: 20 70 56 61 72 3b 0a 20 20 20 20 20 20 20 20 20   pVar;.         
86f0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
8700: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
8710: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e    sqlite3_bind_n
8720: 75 6c 6c 28 20 70 53 74 6d 74 2c 20 69 20 29 3b  ull( pStmt, i );
8730: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
8740: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
8750: 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65        /* Compute
8760: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f   column names */
8770: 0a 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71  .      nCol = sq
8780: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
8790: 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  nt(pStmt);.     
87a0: 20 69 66 28 20 70 53 63 72 69 70 74 20 29 7b 0a   if( pScript ){.
87b0: 20 20 20 20 20 20 20 20 61 70 43 6f 6c 4e 61 6d          apColNam
87c0: 65 20 3d 20 28 54 63 6c 5f 4f 62 6a 2a 2a 29 54  e = (Tcl_Obj**)T
87d0: 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  cl_Alloc( sizeof
87e0: 28 54 63 6c 5f 4f 62 6a 2a 29 2a 6e 43 6f 6c 20  (Tcl_Obj*)*nCol 
87f0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  );.        if( a
8800: 70 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 62 72  pColName==0 ) br
8810: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  eak;.        for
8820: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
8830: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70  +){.          ap
8840: 43 6f 6c 4e 61 6d 65 5b 69 5d 20 3d 20 64 62 54  ColName[i] = dbT
8850: 65 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65 33  extToObj(sqlite3
8860: 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74  _column_name(pSt
8870: 6d 74 2c 69 29 29 3b 0a 20 20 20 20 20 20 20 20  mt,i));.        
8880: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
8890: 6e 74 28 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29  nt(apColName[i])
88a0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
88b0: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
88c0: 20 72 65 73 75 6c 74 73 20 61 72 65 20 62 65 69   results are bei
88d0: 6e 67 20 73 74 6f 72 65 64 20 69 6e 20 61 6e 20  ng stored in an 
88e0: 61 72 72 61 79 20 76 61 72 69 61 62 6c 65 2c 20  array variable, 
88f0: 74 68 65 6e 20 63 72 65 61 74 65 0a 20 20 20 20  then create.    
8900: 20 20 2a 2a 20 74 68 65 20 61 72 72 61 79 28 2a    ** the array(*
8910: 29 20 65 6e 74 72 79 20 66 6f 72 20 74 68 61 74  ) entry for that
8920: 20 61 72 72 61 79 0a 20 20 20 20 20 20 2a 2f 0a   array.      */.
8930: 20 20 20 20 20 20 69 66 28 20 70 41 72 72 61 79        if( pArray
8940: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
8950: 4f 62 6a 20 2a 70 43 6f 6c 4c 69 73 74 20 3d 20  Obj *pColList = 
8960: 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20  Tcl_NewObj();.  
8970: 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70        Tcl_Obj *p
8980: 53 74 61 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74  Star = Tcl_NewSt
8990: 72 69 6e 67 4f 62 6a 28 22 2a 22 2c 20 2d 31 29  ringObj("*", -1)
89a0: 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e  ;.        Tcl_In
89b0: 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6f 6c 4c  crRefCount(pColL
89c0: 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  ist);.        fo
89d0: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
89e0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  ++){.          T
89f0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
8a00: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
8a10: 70 43 6f 6c 4c 69 73 74 2c 20 61 70 43 6f 6c 4e  pColList, apColN
8a20: 61 6d 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  ame[i]);.       
8a30: 20 7d 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4f   }.        Tcl_O
8a40: 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72 70  bjSetVar2(interp
8a50: 2c 20 70 41 72 72 61 79 2c 20 70 53 74 61 72 2c  , pArray, pStar,
8a60: 20 70 43 6f 6c 4c 69 73 74 2c 30 29 3b 0a 20 20   pColList,0);.  
8a70: 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65        Tcl_DecrRe
8a80: 66 43 6f 75 6e 74 28 70 43 6f 6c 4c 69 73 74 29  fCount(pColList)
8a90: 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65  ;.        Tcl_De
8aa0: 63 72 52 65 66 43 6f 75 6e 74 28 70 53 74 61 72  crRefCount(pStar
8ab0: 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
8ac0: 20 20 2f 2a 20 45 78 65 63 75 74 65 20 74 68 65    /* Execute the
8ad0: 20 53 51 4c 0a 20 20 20 20 20 20 2a 2f 0a 20 20   SQL.      */.  
8ae0: 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 54      while( rc==T
8af0: 43 4c 5f 4f 4b 20 26 26 20 70 53 74 6d 74 20 26  CL_OK && pStmt &
8b00: 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  & SQLITE_ROW==sq
8b10: 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
8b20: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  ) ){.        for
8b30: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
8b40: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63  +){.          Tc
8b50: 6c 5f 4f 62 6a 20 2a 70 56 61 6c 3b 0a 20 20 20  l_Obj *pVal;.   
8b60: 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
8b70: 20 20 2f 2a 20 53 65 74 20 70 56 61 6c 20 74 6f    /* Set pVal to
8b80: 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 69 27 74   contain the i't
8b90: 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 69 73  h column of this
8ba0: 20 72 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20 20   row. */.       
8bb0: 20 20 20 73 77 69 74 63 68 28 20 73 71 6c 69 74     switch( sqlit
8bc0: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70  e3_column_type(p
8bd0: 53 74 6d 74 2c 20 69 29 20 29 7b 0a 20 20 20 20  Stmt, i) ){.    
8be0: 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
8bf0: 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20  ITE_BLOB: {.    
8c00: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 62 79            int by
8c10: 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  tes = sqlite3_co
8c20: 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74  lumn_bytes(pStmt
8c30: 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , i);.          
8c40: 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e      pVal = Tcl_N
8c50: 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 73  ewByteArrayObj(s
8c60: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c  qlite3_column_bl
8c70: 6f 62 28 70 53 74 6d 74 2c 20 69 29 2c 20 62 79  ob(pStmt, i), by
8c80: 74 65 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tes);.          
8c90: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
8ca0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8cb0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
8cc0: 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20  _INTEGER: {.    
8cd0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
8ce0: 5f 69 6e 74 36 34 20 76 20 3d 20 73 71 6c 69 74  _int64 v = sqlit
8cf0: 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28  e3_column_int64(
8d00: 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20  pStmt, i);.     
8d10: 20 20 20 20 20 20 20 20 20 69 66 28 20 76 3e 3d           if( v>=
8d20: 2d 32 31 34 37 34 38 33 36 34 37 20 26 26 20 76  -2147483647 && v
8d30: 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29 7b 0a  <=2147483647 ){.
8d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d50: 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 49 6e  pVal = Tcl_NewIn
8d60: 74 4f 62 6a 28 76 29 3b 0a 20 20 20 20 20 20 20  tObj(v);.       
8d70: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
8d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56                pV
8d90: 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 57 69 64 65  al = Tcl_NewWide
8da0: 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20 20 20  IntObj(v);.     
8db0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
8dc0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
8dd0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
8de0: 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53            case S
8df0: 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20  QLITE_FLOAT: {. 
8e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 6f 75               dou
8e10: 62 6c 65 20 72 20 3d 20 73 71 6c 69 74 65 33 5f  ble r = sqlite3_
8e20: 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 53  column_double(pS
8e30: 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  tmt, i);.       
8e40: 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63         pVal = Tc
8e50: 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f 62 6a 28 72  l_NewDoubleObj(r
8e60: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
8e70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
8e80: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
8e90: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55    case SQLITE_NU
8ea0: 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  LL: {.          
8eb0: 20 20 20 20 70 56 61 6c 20 3d 20 64 62 54 65 78      pVal = dbTex
8ec0: 74 54 6f 4f 62 6a 28 70 44 62 2d 3e 7a 4e 75 6c  tToObj(pDb->zNul
8ed0: 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  l);.            
8ee0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
8ef0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
8f00: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
8f10: 20 20 20 20 20 20 20 20 20 20 20 20 70 56 61 6c              pVal
8f20: 20 3d 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 73   = dbTextToObj(s
8f30: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
8f40: 78 74 28 70 53 74 6d 74 2c 20 69 29 29 3b 0a 20  xt(pStmt, i));. 
8f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
8f60: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
8f70: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
8f80: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
8f90: 53 63 72 69 70 74 20 29 7b 0a 20 20 20 20 20 20  Script ){.      
8fa0: 20 20 20 20 20 20 69 66 28 20 70 41 72 72 61 79        if( pArray
8fb0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
8fc0: 20 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56       Tcl_ObjSetV
8fd0: 61 72 32 28 69 6e 74 65 72 70 2c 20 61 70 43 6f  ar2(interp, apCo
8fe0: 6c 4e 61 6d 65 5b 69 5d 2c 20 30 2c 20 70 56 61  lName[i], 0, pVa
8ff0: 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  l, 0);.         
9000: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9010: 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 53          Tcl_ObjS
9020: 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 70  etVar2(interp, p
9030: 41 72 72 61 79 2c 20 61 70 43 6f 6c 4e 61 6d 65  Array, apColName
9040: 5b 69 5d 2c 20 70 56 61 6c 2c 20 30 29 3b 0a 20  [i], pVal, 0);. 
9050: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
9060: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
9070: 20 63 68 6f 69 63 65 3d 3d 44 42 5f 4f 4e 45 43   choice==DB_ONEC
9080: 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20  OLUMN ){.       
9090: 20 20 20 20 20 69 66 28 20 70 52 65 74 3d 3d 30       if( pRet==0
90a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
90b0: 20 20 70 52 65 74 20 3d 20 70 56 61 6c 3b 0a 20    pRet = pVal;. 
90c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c               Tcl
90d0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 52  _IncrRefCount(pR
90e0: 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  et);.           
90f0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72   }.            r
9100: 63 20 3d 20 54 43 4c 5f 42 52 45 41 4b 3b 0a 20  c = TCL_BREAK;. 
9110: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
9120: 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
9130: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
9140: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65  ment(interp, pRe
9150: 74 2c 20 70 56 61 6c 29 3b 0a 20 20 20 20 20 20  t, pVal);.      
9160: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
9170: 20 20 0a 20 20 20 20 20 20 20 20 69 66 28 20 70    .        if( p
9180: 53 63 72 69 70 74 20 29 7b 0a 20 20 20 20 20 20  Script ){.      
9190: 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61      rc = Tcl_Eva
91a0: 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 70  lObjEx(interp, p
91b0: 53 63 72 69 70 74 2c 20 30 29 3b 0a 20 20 20 20  Script, 0);.    
91c0: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43        if( rc==TC
91d0: 4c 5f 43 4f 4e 54 49 4e 55 45 20 29 7b 0a 20 20  L_CONTINUE ){.  
91e0: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 54            rc = T
91f0: 43 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  CL_OK;.         
9200: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
9210: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
9220: 63 3d 3d 54 43 4c 5f 42 52 45 41 4b 20 29 7b 0a  c==TCL_BREAK ){.
9230: 20 20 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c          rc = TCL
9240: 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  _OK;.      }..  
9250: 20 20 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20      /* Free the 
9260: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6f 62 6a 65  column name obje
9270: 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  cts */.      if(
9280: 20 70 53 63 72 69 70 74 20 29 7b 0a 20 20 20 20   pScript ){.    
9290: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
92a0: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
92b0: 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66       Tcl_DecrRef
92c0: 43 6f 75 6e 74 28 61 70 43 6f 6c 4e 61 6d 65 5b  Count(apColName[
92d0: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  i]);.        }. 
92e0: 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28         Tcl_Free(
92f0: 28 63 68 61 72 2a 29 61 70 43 6f 6c 4e 61 6d 65  (char*)apColName
9300: 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
9310: 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20 62 6f    /* Free the bo
9320: 75 6e 64 20 73 74 72 69 6e 67 20 61 6e 64 20 62  und string and b
9330: 6c 6f 62 20 70 61 72 61 6d 65 74 65 72 73 20 2a  lob parameters *
9340: 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  /.      for(i=0;
9350: 20 69 3c 6e 50 61 72 6d 3b 20 69 2b 2b 29 7b 0a   i<nParm; i++){.
9360: 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72          Tcl_Decr
9370: 52 65 66 43 6f 75 6e 74 28 61 70 50 61 72 6d 5b  RefCount(apParm[
9380: 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i]);.      }.   
9390: 20 20 20 69 66 28 20 61 70 50 61 72 6d 21 3d 61     if( apParm!=a
93a0: 50 61 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  Parm ){.        
93b0: 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29  Tcl_Free((char*)
93c0: 61 70 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d  apParm);.      }
93d0: 0a 0a 20 20 20 20 20 20 2f 2a 20 52 65 73 65 74  ..      /* Reset
93e0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20   the statement. 
93f0: 20 49 66 20 74 68 65 20 72 65 73 75 6c 74 20 63   If the result c
9400: 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f 53 43  ode is SQLITE_SC
9410: 48 45 4d 41 2c 20 74 68 65 6e 0a 20 20 20 20 20  HEMA, then.     
9420: 20 2a 2a 20 66 6c 75 73 68 20 74 68 65 20 73 74   ** flush the st
9430: 61 74 65 6d 65 6e 74 20 63 61 63 68 65 20 61 6e  atement cache an
9440: 64 20 74 72 79 20 74 68 65 20 73 74 61 74 65 6d  d try the statem
9450: 65 6e 74 20 61 67 61 69 6e 2e 0a 20 20 20 20 20  ent again..     
9460: 20 2a 2f 0a 20 20 20 20 20 20 72 63 32 20 3d 20   */.      rc2 = 
9470: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
9480: 74 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  tmt);.      if( 
9490: 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 3d 3d 72  SQLITE_SCHEMA==r
94a0: 63 32 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  c2 ){.        /*
94b0: 20 41 66 74 65 72 20 61 20 73 63 68 65 6d 61 20   After a schema 
94c0: 63 68 61 6e 67 65 2c 20 66 6c 75 73 68 20 74 68  change, flush th
94d0: 65 20 63 61 63 68 65 20 61 6e 64 20 74 72 79 20  e cache and try 
94e0: 74 6f 20 72 75 6e 20 74 68 65 0a 20 20 20 20 20  to run the.     
94f0: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
9500: 61 67 61 69 6e 0a 20 20 20 20 20 20 20 20 2a 2f  again.        */
9510: 0a 20 20 20 20 20 20 20 20 66 6c 75 73 68 53 74  .        flushSt
9520: 6d 74 43 61 63 68 65 28 20 70 44 62 20 29 3b 0a  mtCache( pDb );.
9530: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
9540: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
9550: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72  .        if( pPr
9560: 65 53 74 6d 74 20 29 20 54 63 6c 5f 46 72 65 65  eStmt ) Tcl_Free
9570: 28 28 63 68 61 72 2a 29 70 50 72 65 53 74 6d 74  ((char*)pPreStmt
9580: 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  );.        conti
9590: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  nue;.      }else
95a0: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
95b0: 72 63 32 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  rc2 ){.        /
95c0: 2a 20 49 66 20 61 20 72 75 6e 2d 74 69 6d 65 20  * If a run-time 
95d0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
95e0: 70 6f 72 74 20 74 68 65 20 65 72 72 6f 72 20 61  port the error a
95f0: 6e 64 20 73 74 6f 70 20 72 65 61 64 69 6e 67 0a  nd stop reading.
9600: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53          ** the S
9610: 51 4c 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  QL.        */.  
9620: 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a        Tcl_SetObj
9630: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 64  Result(interp, d
9640: 62 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74  bTextToObj(sqlit
9650: 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64  e3_errmsg(pDb->d
9660: 62 29 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71  b)));.        sq
9670: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
9680: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 72  Stmt);.        r
9690: 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  c = TCL_ERROR;. 
96a0: 20 20 20 20 20 20 20 69 66 28 20 70 50 72 65 53         if( pPreS
96b0: 74 6d 74 20 29 20 54 63 6c 5f 46 72 65 65 28 28  tmt ) Tcl_Free((
96c0: 63 68 61 72 2a 29 70 50 72 65 53 74 6d 74 29 3b  char*)pPreStmt);
96d0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
96e0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
96f0: 70 44 62 2d 3e 6d 61 78 53 74 6d 74 3c 3d 30 20  pDb->maxStmt<=0 
9700: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
9710: 20 74 68 65 20 63 61 63 68 65 20 69 73 20 74 75   the cache is tu
9720: 72 6e 65 64 20 6f 66 66 2c 20 64 65 61 6c 6c 6f  rned off, deallo
9730: 63 61 74 65 64 20 74 68 65 20 73 74 61 74 65 6d  cated the statem
9740: 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ent */.        i
9750: 66 28 20 70 50 72 65 53 74 6d 74 20 29 20 54 63  f( pPreStmt ) Tc
9760: 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 50  l_Free((char*)pP
9770: 72 65 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20  reStmt);.       
9780: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
9790: 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  e(pStmt);.      
97a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
97b0: 2a 20 45 76 65 72 79 74 68 69 6e 67 20 77 6f 72  * Everything wor
97c0: 6b 65 64 20 61 6e 64 20 74 68 65 20 63 61 63 68  ked and the cach
97d0: 65 20 69 73 20 6f 70 65 72 61 74 69 6f 6e 61 6c  e is operational
97e0: 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 43 72 65  ..        ** Cre
97f0: 61 74 65 20 61 20 6e 65 77 20 53 71 6c 50 72 65  ate a new SqlPre
9800: 70 61 72 65 64 53 74 6d 74 20 73 74 72 75 63 74  paredStmt struct
9810: 75 72 65 20 69 66 20 77 65 20 6e 65 65 64 20 6f  ure if we need o
9820: 6e 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 28  ne..        ** (
9830: 49 66 20 77 65 20 61 6c 72 65 61 64 79 20 68 61  If we already ha
9840: 76 65 20 6f 6e 65 20 77 65 20 63 61 6e 20 6a 75  ve one we can ju
9850: 73 74 20 72 65 75 73 65 20 69 74 2e 29 0a 20 20  st reuse it.).  
9860: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
9870: 20 69 66 28 20 70 50 72 65 53 74 6d 74 3d 3d 30   if( pPreStmt==0
9880: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 65   ){.          le
9890: 6e 20 3d 20 7a 4c 65 66 74 20 2d 20 7a 53 71 6c  n = zLeft - zSql
98a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 72 65  ;.          pPre
98b0: 53 74 6d 74 20 3d 20 28 53 71 6c 50 72 65 70 61  Stmt = (SqlPrepa
98c0: 72 65 64 53 74 6d 74 2a 29 54 63 6c 5f 41 6c 6c  redStmt*)Tcl_All
98d0: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 50 72 65  oc( sizeof(*pPre
98e0: 53 74 6d 74 29 20 2b 20 6c 65 6e 20 29 3b 0a 20  Stmt) + len );. 
98f0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72           if( pPr
9900: 65 53 74 6d 74 3d 3d 30 20 29 20 72 65 74 75 72  eStmt==0 ) retur
9910: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
9920: 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d         pPreStmt-
9930: 3e 70 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a  >pStmt = pStmt;.
9940: 20 20 20 20 20 20 20 20 20 20 70 50 72 65 53 74            pPreSt
9950: 6d 74 2d 3e 6e 53 71 6c 20 3d 20 6c 65 6e 3b 0a  mt->nSql = len;.
9960: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
9970: 28 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 2c  (pPreStmt->zSql,
9980: 20 7a 53 71 6c 2c 20 6c 65 6e 29 3b 0a 20 20 20   zSql, len);.   
9990: 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d         pPreStmt-
99a0: 3e 7a 53 71 6c 5b 6c 65 6e 5d 20 3d 20 30 3b 0a  >zSql[len] = 0;.
99b0: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
99c0: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 70 72     /* Add the pr
99d0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
99e0: 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   to the beginnin
99f0: 67 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 6c  g of the cache l
9a00: 69 73 74 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ist.        */. 
9a10: 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d         pPreStmt-
9a20: 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e 73 74  >pNext = pDb->st
9a30: 6d 74 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20  mtList;.        
9a40: 70 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 20  pPreStmt->pPrev 
9a50: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = 0;.        if(
9a60: 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 29   pDb->stmtList )
9a70: 7b 0a 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e  {.         pDb->
9a80: 73 74 6d 74 4c 69 73 74 2d 3e 70 50 72 65 76 20  stmtList->pPrev 
9a90: 3d 20 70 50 72 65 53 74 6d 74 3b 0a 20 20 20 20  = pPreStmt;.    
9aa0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 44      }.        pD
9ab0: 62 2d 3e 73 74 6d 74 4c 69 73 74 20 3d 20 70 50  b->stmtList = pP
9ac0: 72 65 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20  reStmt;.        
9ad0: 69 66 28 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73  if( pDb->stmtLas
9ae0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
9af0: 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 6e    assert( pDb->n
9b00: 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Stmt==0 );.     
9b10: 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61       pDb->stmtLa
9b20: 73 74 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a 20  st = pPreStmt;. 
9b30: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
9b40: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9b50: 70 44 62 2d 3e 6e 53 74 6d 74 3e 30 20 29 3b 0a  pDb->nStmt>0 );.
9b60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9b70: 20 20 70 44 62 2d 3e 6e 53 74 6d 74 2b 2b 3b 0a    pDb->nStmt++;.
9b80: 20 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 49     .        /* I
9b90: 66 20 77 65 20 68 61 76 65 20 74 6f 6f 20 6d 61  f we have too ma
9ba0: 6e 79 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  ny statement in 
9bb0: 63 61 63 68 65 2c 20 72 65 6d 6f 76 65 20 74 68  cache, remove th
9bc0: 65 20 73 75 72 70 6c 75 73 20 66 72 6f 6d 20 74  e surplus from t
9bd0: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 6e  he.        ** en
9be0: 64 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 6c  d of the cache l
9bf0: 69 73 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ist..        */.
9c00: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
9c10: 44 62 2d 3e 6e 53 74 6d 74 3e 70 44 62 2d 3e 6d  Db->nStmt>pDb->m
9c20: 61 78 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20  axStmt ){.      
9c30: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
9c40: 6c 69 7a 65 28 70 44 62 2d 3e 73 74 6d 74 4c 61  lize(pDb->stmtLa
9c50: 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20  st->pStmt);.    
9c60: 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c        pDb->stmtL
9c70: 61 73 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c  ast = pDb->stmtL
9c80: 61 73 74 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20  ast->pPrev;.    
9c90: 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28        Tcl_Free((
9ca0: 63 68 61 72 2a 29 70 44 62 2d 3e 73 74 6d 74 4c  char*)pDb->stmtL
9cb0: 61 73 74 2d 3e 70 4e 65 78 74 29 3b 0a 20 20 20  ast->pNext);.   
9cc0: 20 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74         pDb->stmt
9cd0: 4c 61 73 74 2d 3e 70 4e 65 78 74 20 3d 20 30 3b  Last->pNext = 0;
9ce0: 0a 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e  .          pDb->
9cf0: 6e 53 74 6d 74 2d 2d 3b 0a 20 20 20 20 20 20 20  nStmt--;.       
9d00: 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
9d10: 20 20 2f 2a 20 50 72 6f 63 65 65 64 20 74 6f 20    /* Proceed to 
9d20: 74 68 65 20 6e 65 78 74 20 73 74 61 74 65 6d 65  the next stateme
9d30: 6e 74 20 2a 2f 0a 20 20 20 20 20 20 7a 53 71 6c  nt */.      zSql
9d40: 20 3d 20 7a 4c 65 66 74 3b 0a 20 20 20 20 7d 0a   = zLeft;.    }.
9d50: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
9d60: 6f 75 6e 74 28 6f 62 6a 76 5b 32 5d 29 3b 0a 0a  ount(objv[2]);..
9d70: 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a      if( pRet ){.
9d80: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43        if( rc==TC
9d90: 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  L_OK ){.        
9da0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
9db0: 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a  (interp, pRet);.
9dc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 63        }.      Tc
9dd0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
9de0: 52 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Ret);.    }.    
9df0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
9e00: 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 66 75  .  **     $db fu
9e10: 6e 63 74 69 6f 6e 20 4e 41 4d 45 20 53 43 52 49  nction NAME SCRI
9e20: 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 72 65  PT.  **.  ** Cre
9e30: 61 74 65 20 61 20 6e 65 77 20 53 51 4c 20 66 75  ate a new SQL fu
9e40: 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41  nction called NA
9e50: 4d 45 2e 20 20 57 68 65 6e 65 76 65 72 20 74 68  ME.  Whenever th
9e60: 61 74 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 20  at function is. 
9e70: 20 2a 2a 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f   ** called, invo
9e80: 6b 65 20 53 43 52 49 50 54 20 74 6f 20 65 76 61  ke SCRIPT to eva
9e90: 6c 75 61 74 65 20 74 68 65 20 66 75 6e 63 74 69  luate the functi
9ea0: 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  on..  */.  case 
9eb0: 44 42 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  DB_FUNCTION: {. 
9ec0: 20 20 20 53 71 6c 46 75 6e 63 20 2a 70 46 75 6e     SqlFunc *pFun
9ed0: 63 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  c;.    Tcl_Obj *
9ee0: 70 53 63 72 69 70 74 3b 0a 20 20 20 20 63 68 61  pScript;.    cha
9ef0: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66  r *zName;.    if
9f00: 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  ( objc!=4 ){.   
9f10: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
9f20: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
9f30: 62 6a 76 2c 20 22 4e 41 4d 45 20 53 43 52 49 50  bjv, "NAME SCRIP
9f40: 54 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  T");.      retur
9f50: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
9f60: 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 54   }.    zName = T
9f70: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
9f80: 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b  Obj(objv[2], 0);
9f90: 0a 20 20 20 20 70 53 63 72 69 70 74 20 3d 20 6f  .    pScript = o
9fa0: 62 6a 76 5b 33 5d 3b 0a 20 20 20 20 70 46 75 6e  bjv[3];.    pFun
9fb0: 63 20 3d 20 66 69 6e 64 53 71 6c 46 75 6e 63 28  c = findSqlFunc(
9fc0: 70 44 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  pDb, zName);.   
9fd0: 20 69 66 28 20 70 46 75 6e 63 3d 3d 30 20 29 20   if( pFunc==0 ) 
9fe0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
9ff0: 3b 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d  ;.    if( pFunc-
a000: 3e 70 53 63 72 69 70 74 20 29 7b 0a 20 20 20 20  >pScript ){.    
a010: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
a020: 6e 74 28 70 46 75 6e 63 2d 3e 70 53 63 72 69 70  nt(pFunc->pScrip
a030: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46  t);.    }.    pF
a040: 75 6e 63 2d 3e 70 53 63 72 69 70 74 20 3d 20 70  unc->pScript = p
a050: 53 63 72 69 70 74 3b 0a 20 20 20 20 54 63 6c 5f  Script;.    Tcl_
a060: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63  IncrRefCount(pSc
a070: 72 69 70 74 29 3b 0a 20 20 20 20 70 46 75 6e 63  ript);.    pFunc
a080: 2d 3e 75 73 65 45 76 61 6c 4f 62 6a 76 20 3d 20  ->useEvalObjv = 
a090: 73 61 66 65 54 6f 55 73 65 45 76 61 6c 4f 62 6a  safeToUseEvalObj
a0a0: 76 28 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70  v(interp, pScrip
a0b0: 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  t);.    rc = sql
a0c0: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
a0d0: 74 69 6f 6e 28 70 44 62 2d 3e 64 62 2c 20 7a 4e  tion(pDb->db, zN
a0e0: 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  ame, -1, SQLITE_
a0f0: 55 54 46 38 2c 0a 20 20 20 20 20 20 20 20 70 46  UTF8,.        pF
a100: 75 6e 63 2c 20 74 63 6c 53 71 6c 46 75 6e 63 2c  unc, tclSqlFunc,
a110: 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
a120: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
a130: 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f  .      rc = TCL_
a140: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 54 63 6c  ERROR;.      Tcl
a150: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
a160: 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74  p, (char *)sqlit
a170: 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64  e3_errmsg(pDb->d
a180: 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45  b), TCL_VOLATILE
a190: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
a1a0: 20 20 20 20 2f 2a 20 4d 75 73 74 20 66 6c 75 73      /* Must flus
a1b0: 68 20 61 6e 79 20 63 61 63 68 65 64 20 73 74 61  h any cached sta
a1c0: 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  tements */.     
a1d0: 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28   flushStmtCache(
a1e0: 20 70 44 62 20 29 3b 0a 20 20 20 20 7d 0a 20 20   pDb );.    }.  
a1f0: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
a200: 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20  /*.  **     $db 
a210: 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
a220: 64 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74  d .  **.  ** Ret
a230: 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77  urn an integer w
a240: 68 69 63 68 20 69 73 20 74 68 65 20 52 4f 57 49  hich is the ROWI
a250: 44 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72  D for the most r
a260: 65 63 65 6e 74 20 69 6e 73 65 72 74 2e 0a 20 20  ecent insert..  
a270: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 4c 41 53  */.  case DB_LAS
a280: 54 5f 49 4e 53 45 52 54 5f 52 4f 57 49 44 3a 20  T_INSERT_ROWID: 
a290: 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  {.    Tcl_Obj *p
a2a0: 52 65 73 75 6c 74 3b 0a 20 20 20 20 69 6e 74 20  Result;.    int 
a2b0: 72 6f 77 69 64 3b 0a 20 20 20 20 69 66 28 20 6f  rowid;.    if( o
a2c0: 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 20 20  bjc!=2 ){.      
a2d0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
a2e0: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
a2f0: 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 72 65 74  , "");.      ret
a300: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
a310: 20 20 20 7d 0a 20 20 20 20 72 6f 77 69 64 20 3d     }.    rowid =
a320: 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e   sqlite3_last_in
a330: 73 65 72 74 5f 72 6f 77 69 64 28 70 44 62 2d 3e  sert_rowid(pDb->
a340: 64 62 29 3b 0a 20 20 20 20 70 52 65 73 75 6c 74  db);.    pResult
a350: 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73   = Tcl_GetObjRes
a360: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  ult(interp);.   
a370: 20 54 63 6c 5f 53 65 74 49 6e 74 4f 62 6a 28 70   Tcl_SetIntObj(p
a380: 52 65 73 75 6c 74 2c 20 72 6f 77 69 64 29 3b 0a  Result, rowid);.
a390: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
a3a0: 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 44 42    /*.  ** The DB
a3b0: 5f 4f 4e 45 43 4f 4c 55 4d 4e 20 6d 65 74 68 6f  _ONECOLUMN metho
a3c0: 64 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  d is implemented
a3d0: 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 20 44   together with D
a3e0: 42 5f 45 56 41 4c 2e 0a 20 20 2a 2f 0a 0a 20 20  B_EVAL..  */..  
a3f0: 2f 2a 20 20 20 20 24 64 62 20 70 72 6f 67 72 65  /*    $db progre
a400: 73 73 20 3f 4e 20 43 41 4c 4c 42 41 43 4b 3f 0a  ss ?N CALLBACK?.
a410: 20 20 2a 2a 20 0a 20 20 2a 2a 20 49 6e 76 6f 6b    ** .  ** Invok
a420: 65 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c  e the given call
a430: 62 61 63 6b 20 65 76 65 72 79 20 4e 20 76 69 72  back every N vir
a440: 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 6f 70 63  tual machine opc
a450: 6f 64 65 73 20 77 68 69 6c 65 20 65 78 65 63 75  odes while execu
a460: 74 69 6e 67 0a 20 20 2a 2a 20 71 75 65 72 69 65  ting.  ** querie
a470: 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  s..  */.  case D
a480: 42 5f 50 52 4f 47 52 45 53 53 3a 20 7b 0a 20 20  B_PROGRESS: {.  
a490: 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b    if( objc==2 ){
a4a0: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
a4b0: 7a 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20 20  zProgress ){.   
a4c0: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
a4d0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44  esult(interp, pD
a4e0: 62 2d 3e 7a 50 72 6f 67 72 65 73 73 2c 20 30 29  b->zProgress, 0)
a4f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
a500: 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20  lse if( objc==4 
a510: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
a520: 50 72 6f 67 72 65 73 73 3b 0a 20 20 20 20 20 20  Progress;.      
a530: 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69  int len;.      i
a540: 6e 74 20 4e 3b 0a 20 20 20 20 20 20 69 66 28 20  nt N;.      if( 
a550: 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49  TCL_OK!=Tcl_GetI
a560: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
a570: 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 4e 29 20 29  , objv[2], &N) )
a580: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
a590: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 3b 0a 20 20  ROR;.      };.  
a5a0: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72      if( pDb->zPr
a5b0: 6f 67 72 65 73 73 20 29 7b 0a 20 20 20 20 20 20  ogress ){.      
a5c0: 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e    Tcl_Free(pDb->
a5d0: 7a 50 72 6f 67 72 65 73 73 29 3b 0a 20 20 20 20  zProgress);.    
a5e0: 20 20 7d 0a 20 20 20 20 20 20 7a 50 72 6f 67 72    }.      zProgr
a5f0: 65 73 73 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ess = Tcl_GetStr
a600: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
a610: 33 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20  3], &len);.     
a620: 20 69 66 28 20 7a 50 72 6f 67 72 65 73 73 20 26   if( zProgress &
a630: 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20  & len>0 ){.     
a640: 20 20 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73     pDb->zProgres
a650: 73 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c  s = Tcl_Alloc( l
a660: 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20  en + 1 );.      
a670: 20 20 73 74 72 63 70 79 28 70 44 62 2d 3e 7a 50    strcpy(pDb->zP
a680: 72 6f 67 72 65 73 73 2c 20 7a 50 72 6f 67 72 65  rogress, zProgre
a690: 73 73 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ss);.      }else
a6a0: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
a6b0: 50 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20  Progress = 0;.  
a6c0: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
a6d0: 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45  LITE_OMIT_PROGRE
a6e0: 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 20 20 20 20  SS_CALLBACK.    
a6f0: 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67    if( pDb->zProg
a700: 72 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ress ){.        
a710: 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e  pDb->interp = in
a720: 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71  terp;.        sq
a730: 6c 69 74 65 33 5f 70 72 6f 67 72 65 73 73 5f 68  lite3_progress_h
a740: 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20  andler(pDb->db, 
a750: 4e 2c 20 44 62 50 72 6f 67 72 65 73 73 48 61 6e  N, DbProgressHan
a760: 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20  dler, pDb);.    
a770: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a780: 20 73 71 6c 69 74 65 33 5f 70 72 6f 67 72 65 73   sqlite3_progres
a790: 73 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64  s_handler(pDb->d
a7a0: 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  b, 0, 0, 0);.   
a7b0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
a7c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c  }else{.      Tcl
a7d0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
a7e0: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
a7f0: 4e 20 43 41 4c 4c 42 41 43 4b 22 29 3b 0a 20 20  N CALLBACK");.  
a800: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
a810: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
a820: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
a830: 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 72 65  .  **     $db re
a840: 6b 65 79 20 4b 45 59 0a 20 20 2a 2a 0a 20 20 2a  key KEY.  **.  *
a850: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 65 6e 63  * Change the enc
a860: 72 79 70 74 69 6f 6e 20 6b 65 79 20 6f 6e 20 74  ryption key on t
a870: 68 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65  he currently ope
a880: 6e 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  n database..  */
a890: 0a 20 20 63 61 73 65 20 44 42 5f 52 45 4b 45 59  .  case DB_REKEY
a8a0: 3a 20 7b 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79  : {.    int nKey
a8b0: 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79  ;.    void *pKey
a8c0: 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ;.    if( objc!=
a8d0: 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
a8e0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
a8f0: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4b 45  rp, 2, objv, "KE
a900: 59 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Y");.      retur
a910: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
a920: 20 7d 0a 20 20 20 20 70 4b 65 79 20 3d 20 54 63   }.    pKey = Tc
a930: 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72  l_GetByteArrayFr
a940: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26  omObj(objv[2], &
a950: 6e 4b 65 79 29 3b 0a 23 69 66 64 65 66 20 53 51  nKey);.#ifdef SQ
a960: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
a970: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
a980: 72 65 6b 65 79 28 70 44 62 2d 3e 64 62 2c 20 70  rekey(pDb->db, p
a990: 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 20 20  Key, nKey);.    
a9a0: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
a9b0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
a9c0: 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33  (interp, sqlite3
a9d0: 45 72 72 53 74 72 28 72 63 29 2c 20 30 29 3b 0a  ErrStr(rc), 0);.
a9e0: 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45        rc = TCL_E
a9f0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  RROR;.    }.#end
aa00: 69 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  if.    break;.  
aa10: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
aa20: 20 24 64 62 20 74 69 6d 65 6f 75 74 20 4d 49 4c   $db timeout MIL
aa30: 4c 45 53 45 43 4f 4e 44 53 0a 20 20 2a 2a 0a 20  LESECONDS.  **. 
aa40: 20 2a 2a 20 44 65 6c 61 79 20 66 6f 72 20 74 68   ** Delay for th
aa50: 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c  e number of mill
aa60: 69 73 65 63 6f 6e 64 73 20 73 70 65 63 69 66 69  iseconds specifi
aa70: 65 64 20 77 68 65 6e 20 61 20 66 69 6c 65 20 69  ed when a file i
aa80: 73 20 6c 6f 63 6b 65 64 2e 0a 20 20 2a 2f 0a 20  s locked..  */. 
aa90: 20 63 61 73 65 20 44 42 5f 54 49 4d 45 4f 55 54   case DB_TIMEOUT
aaa0: 3a 20 7b 0a 20 20 20 20 69 6e 74 20 6d 73 3b 0a  : {.    int ms;.
aab0: 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20      if( objc!=3 
aac0: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
aad0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
aae0: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4d 49 4c 4c  , 2, objv, "MILL
aaf0: 49 53 45 43 4f 4e 44 53 22 29 3b 0a 20 20 20 20  ISECONDS");.    
ab00: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
ab10: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OR;.    }.    if
ab20: 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
ab30: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
ab40: 5b 32 5d 2c 20 26 6d 73 29 20 29 20 72 65 74 75  [2], &ms) ) retu
ab50: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
ab60: 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74    sqlite3_busy_t
ab70: 69 6d 65 6f 75 74 28 70 44 62 2d 3e 64 62 2c 20  imeout(pDb->db, 
ab80: 6d 73 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  ms);.    break;.
ab90: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
aba0: 20 20 20 24 64 62 20 6e 75 6c 6c 76 61 6c 75 65     $db nullvalue
abb0: 20 3f 53 54 52 49 4e 47 3f 0a 20 20 2a 2a 0a 20   ?STRING?.  **. 
abc0: 20 2a 2a 20 43 68 61 6e 67 65 20 74 65 78 74 20   ** Change text 
abd0: 75 73 65 64 20 77 68 65 6e 20 61 20 4e 55 4c 4c  used when a NULL
abe0: 20 63 6f 6d 65 73 20 62 61 63 6b 20 66 72 6f 6d   comes back from
abf0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
ac00: 66 20 3f 53 54 52 49 4e 47 3f 0a 20 20 2a 2a 20  f ?STRING?.  ** 
ac10: 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20  is not present, 
ac20: 74 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74  then the current
ac30: 20 73 74 72 69 6e 67 20 75 73 65 64 20 66 6f 72   string used for
ac40: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
ac50: 64 2e 0a 20 20 2a 2a 20 49 66 20 53 54 52 49 4e  d..  ** If STRIN
ac60: 47 20 69 73 20 70 72 65 73 65 6e 74 2c 20 74 68  G is present, th
ac70: 65 6e 20 53 54 52 49 4e 47 20 69 73 20 72 65 74  en STRING is ret
ac80: 75 72 6e 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2f  urned..  **.  */
ac90: 0a 20 20 63 61 73 65 20 44 42 5f 4e 55 4c 4c 56  .  case DB_NULLV
aca0: 41 4c 55 45 3a 20 7b 0a 20 20 20 20 69 66 28 20  ALUE: {.    if( 
acb0: 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21  objc!=2 && objc!
acc0: 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =3 ){.      Tcl_
acd0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
ace0: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e  erp, 2, objv, "N
acf0: 55 4c 4c 56 41 4c 55 45 22 29 3b 0a 20 20 20 20  ULLVALUE");.    
ad00: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
ad10: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OR;.    }.    if
ad20: 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20  ( objc==3 ){.   
ad30: 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
ad40: 20 20 63 68 61 72 20 2a 7a 4e 75 6c 6c 20 3d 20    char *zNull = 
ad50: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
ad60: 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c  mObj(objv[2], &l
ad70: 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  en);.      if( p
ad80: 44 62 2d 3e 7a 4e 75 6c 6c 20 29 7b 0a 20 20 20  Db->zNull ){.   
ad90: 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44       Tcl_Free(pD
ada0: 62 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  b->zNull);.     
adb0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 4e 75   }.      if( zNu
adc0: 6c 6c 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20  ll && len>0 ){. 
add0: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 75 6c         pDb->zNul
ade0: 6c 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c  l = Tcl_Alloc( l
adf0: 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20  en + 1 );.      
ae00: 20 20 73 74 72 6e 63 70 79 28 70 44 62 2d 3e 7a    strncpy(pDb->z
ae10: 4e 75 6c 6c 2c 20 7a 4e 75 6c 6c 2c 20 6c 65 6e  Null, zNull, len
ae20: 29 3b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  );.        pDb->
ae30: 7a 4e 75 6c 6c 5b 6c 65 6e 5d 20 3d 20 27 5c 30  zNull[len] = '\0
ae40: 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ';.      }else{.
ae50: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 75          pDb->zNu
ae60: 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ll = 0;.      }.
ae70: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 53 65      }.    Tcl_Se
ae80: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
ae90: 70 2c 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 70  p, dbTextToObj(p
aea0: 44 62 2d 3e 7a 4e 75 6c 6c 29 29 3b 0a 20 20 20  Db->zNull));.   
aeb0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 0a 20   break;.  }.  . 
aec0: 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62   /*.  **     $db
aed0: 20 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 0a 20   total_changes. 
aee0: 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20   **.  ** Return 
aef0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
af00: 77 73 20 74 68 61 74 20 77 65 72 65 20 6d 6f 64  ws that were mod
af10: 69 66 69 65 64 2c 20 69 6e 73 65 72 74 65 64 2c  ified, inserted,
af20: 20 6f 72 20 64 65 6c 65 74 65 64 20 0a 20 20 2a   or deleted .  *
af30: 2a 20 73 69 6e 63 65 20 74 68 65 20 64 61 74 61  * since the data
af40: 62 61 73 65 20 68 61 6e 64 6c 65 20 77 61 73 20  base handle was 
af50: 63 72 65 61 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  created..  */.  
af60: 63 61 73 65 20 44 42 5f 54 4f 54 41 4c 5f 43 48  case DB_TOTAL_CH
af70: 41 4e 47 45 53 3a 20 7b 0a 20 20 20 20 54 63 6c  ANGES: {.    Tcl
af80: 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20  _Obj *pResult;. 
af90: 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29     if( objc!=2 )
afa0: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
afb0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
afc0: 20 32 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20   2, objv, "");. 
afd0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
afe0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
aff0: 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47   pResult = Tcl_G
b000: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
b010: 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  rp);.    Tcl_Set
b020: 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20  IntObj(pResult, 
b030: 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68  sqlite3_total_ch
b040: 61 6e 67 65 73 28 70 44 62 2d 3e 64 62 29 29 3b  anges(pDb->db));
b050: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
b060: 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 74 72 61  .  /*    $db tra
b070: 63 65 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20  ce ?CALLBACK?.  
b080: 2a 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20 61 72 72  **.  ** Make arr
b090: 61 6e 67 65 6d 65 6e 74 73 20 74 6f 20 69 6e 76  angements to inv
b0a0: 6f 6b 65 20 74 68 65 20 43 41 4c 4c 42 41 43 4b  oke the CALLBACK
b0b0: 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 65 61 63   routine for eac
b0c0: 68 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 0a  h SQL statement.
b0d0: 20 20 2a 2a 20 74 68 61 74 20 69 73 20 65 78 65    ** that is exe
b0e0: 63 75 74 65 64 2e 20 20 54 68 65 20 74 65 78 74  cuted.  The text
b0f0: 20 6f 66 20 74 68 65 20 53 51 4c 20 69 73 20 61   of the SQL is a
b100: 70 70 65 6e 64 65 64 20 74 6f 20 43 41 4c 4c 42  ppended to CALLB
b110: 41 43 4b 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20  ACK before.  ** 
b120: 69 74 20 69 73 20 65 78 65 63 75 74 65 64 2e 0a  it is executed..
b130: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 54    */.  case DB_T
b140: 52 41 43 45 3a 20 7b 0a 20 20 20 20 69 66 28 20  RACE: {.    if( 
b150: 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20  objc>3 ){.      
b160: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
b170: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
b180: 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b  , "?CALLBACK?");
b190: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
b1a0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c  L_ERROR;.    }el
b1b0: 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29  se if( objc==2 )
b1c0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  {.      if( pDb-
b1d0: 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20  >zTrace ){.     
b1e0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
b1f0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d  ult(interp, pDb-
b200: 3e 7a 54 72 61 63 65 2c 20 30 29 3b 0a 20 20 20  >zTrace, 0);.   
b210: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
b220: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 72 61        char *zTra
b230: 63 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65  ce;.      int le
b240: 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  n;.      if( pDb
b250: 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20 20 20  ->zTrace ){.    
b260: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
b270: 2d 3e 7a 54 72 61 63 65 29 3b 0a 20 20 20 20 20  ->zTrace);.     
b280: 20 7d 0a 20 20 20 20 20 20 7a 54 72 61 63 65 20   }.      zTrace 
b290: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
b2a0: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
b2b0: 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  &len);.      if(
b2c0: 20 7a 54 72 61 63 65 20 26 26 20 6c 65 6e 3e 30   zTrace && len>0
b2d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
b2e0: 3e 7a 54 72 61 63 65 20 3d 20 54 63 6c 5f 41 6c  >zTrace = Tcl_Al
b2f0: 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a  loc( len + 1 );.
b300: 20 20 20 20 20 20 20 20 73 74 72 63 70 79 28 70          strcpy(p
b310: 44 62 2d 3e 7a 54 72 61 63 65 2c 20 7a 54 72 61  Db->zTrace, zTra
b320: 63 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ce);.      }else
b330: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
b340: 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 20 20 20  Trace = 0;.     
b350: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44 62   }.      if( pDb
b360: 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20 20 20  ->zTrace ){.    
b370: 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20      pDb->interp 
b380: 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20  = interp;.      
b390: 20 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28    sqlite3_trace(
b3a0: 70 44 62 2d 3e 64 62 2c 20 44 62 54 72 61 63 65  pDb->db, DbTrace
b3b0: 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20  Handler, pDb);. 
b3c0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
b3d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 74 72 61 63      sqlite3_trac
b3e0: 65 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29  e(pDb->db, 0, 0)
b3f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
b400: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
b410: 20 20 2f 2a 20 20 20 20 24 64 62 20 74 72 61 6e    /*    $db tran
b420: 73 61 63 74 69 6f 6e 20 5b 2d 64 65 66 65 72 72  saction [-deferr
b430: 65 64 7c 2d 69 6d 6d 65 64 69 61 74 65 7c 2d 65  ed|-immediate|-e
b440: 78 63 6c 75 73 69 76 65 5d 20 53 43 52 49 50 54  xclusive] SCRIPT
b450: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 74 61 72 74  .  **.  ** Start
b460: 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
b470: 6f 6e 20 28 69 66 20 77 65 20 61 72 65 20 6e 6f  on (if we are no
b480: 74 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  t already in the
b490: 20 6d 69 64 73 74 20 6f 66 20 61 0a 20 20 2a 2a   midst of a.  **
b4a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 20 61 6e   transaction) an
b4b0: 64 20 65 78 65 63 75 74 65 20 74 68 65 20 54 43  d execute the TC
b4c0: 4c 20 73 63 72 69 70 74 20 53 43 52 49 50 54 2e  L script SCRIPT.
b4d0: 20 20 41 66 74 65 72 20 53 43 52 49 50 54 0a 20    After SCRIPT. 
b4e0: 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 73 2c 20 65   ** completes, e
b4f0: 69 74 68 65 72 20 63 6f 6d 6d 69 74 20 74 68 65  ither commit the
b500: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20   transaction or 
b510: 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 69 66 20  roll it back if 
b520: 53 43 52 49 50 54 0a 20 20 2a 2a 20 74 68 72 6f  SCRIPT.  ** thro
b530: 77 73 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 2e  ws an exception.
b540: 20 20 4f 72 20 69 66 20 6e 6f 20 6e 65 77 20 74    Or if no new t
b550: 72 61 6e 73 61 74 69 6f 6e 20 77 61 73 20 73 74  ransation was st
b560: 61 72 74 65 64 2c 20 64 6f 20 6e 6f 74 68 69 6e  arted, do nothin
b570: 67 2e 0a 20 20 2a 2a 20 70 61 73 73 20 74 68 65  g..  ** pass the
b580: 20 65 78 63 65 70 74 69 6f 6e 20 6f 6e 20 75 70   exception on up
b590: 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 2a 2a   the stack..  **
b5a0: 0a 20 20 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61  .  ** This comma
b5b0: 6e 64 20 77 61 73 20 69 6e 73 70 69 72 65 64 20  nd was inspired 
b5c0: 62 79 20 44 61 76 65 20 54 68 6f 6d 61 73 27 73  by Dave Thomas's
b5d0: 20 74 61 6c 6b 20 6f 6e 20 52 75 62 79 20 61 74   talk on Ruby at
b5e0: 20 74 68 65 0a 20 20 2a 2a 20 32 30 30 35 20 4f   the.  ** 2005 O
b5f0: 27 52 65 69 6c 6c 79 20 4f 70 65 6e 20 53 6f 75  'Reilly Open Sou
b600: 72 63 65 20 43 6f 6e 76 65 6e 74 69 6f 6e 20 28  rce Convention (
b610: 4f 53 43 4f 4e 29 2e 0a 20 20 2a 2f 0a 20 20 63  OSCON)..  */.  c
b620: 61 73 65 20 44 42 5f 54 52 41 4e 53 41 43 54 49  ase DB_TRANSACTI
b630: 4f 4e 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 6e  ON: {.    int in
b640: 54 72 61 6e 73 3b 0a 20 20 20 20 54 63 6c 5f 4f  Trans;.    Tcl_O
b650: 62 6a 20 2a 70 53 63 72 69 70 74 3b 0a 20 20 20  bj *pScript;.   
b660: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 65   const char *zBe
b670: 67 69 6e 20 3d 20 22 42 45 47 49 4e 22 3b 0a 20  gin = "BEGIN";. 
b680: 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 26     if( objc!=3 &
b690: 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  & objc!=4 ){.   
b6a0: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
b6b0: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
b6c0: 62 6a 76 2c 20 22 5b 54 59 50 45 5d 20 53 43 52  bjv, "[TYPE] SCR
b6d0: 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65 74  IPT");.      ret
b6e0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
b6f0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a     }.    if( obj
b700: 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 70 53  c==3 ){.      pS
b710: 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 32 5d 3b  cript = objv[2];
b720: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
b730: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
b740: 20 63 68 61 72 20 2a 54 54 59 50 45 5f 73 74 72   char *TTYPE_str
b750: 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  s[] = {.        
b760: 22 64 65 66 65 72 72 65 64 22 2c 20 20 20 22 65  "deferred",   "e
b770: 78 63 6c 75 73 69 76 65 22 2c 20 20 22 69 6d 6d  xclusive",  "imm
b780: 65 64 69 61 74 65 22 0a 20 20 20 20 20 20 7d 3b  ediate".      };
b790: 0a 20 20 20 20 20 20 65 6e 75 6d 20 54 54 59 50  .      enum TTYP
b7a0: 45 5f 65 6e 75 6d 20 7b 0a 20 20 20 20 20 20 20  E_enum {.       
b7b0: 20 54 54 59 50 45 5f 44 45 46 45 52 52 45 44 2c   TTYPE_DEFERRED,
b7c0: 20 54 54 59 50 45 5f 45 58 43 4c 55 53 49 56 45   TTYPE_EXCLUSIVE
b7d0: 2c 20 54 54 59 50 45 5f 49 4d 4d 45 44 49 41 54  , TTYPE_IMMEDIAT
b7e0: 45 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20  E.      };.     
b7f0: 20 69 6e 74 20 74 74 79 70 65 3b 0a 20 20 20 20   int ttype;.    
b800: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 64    if( Tcl_GetInd
b810: 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  exFromObj(interp
b820: 2c 20 6f 62 6a 76 5b 32 5d 2c 20 54 54 59 50 45  , objv[2], TTYPE
b830: 5f 73 74 72 73 2c 20 22 74 72 61 6e 73 61 63 74  _strs, "transact
b840: 69 6f 6e 5f 74 79 70 65 22 2c 0a 20 20 20 20 20  ion_type",.     
b850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b860: 20 20 20 20 20 20 20 20 20 30 2c 20 26 74 74 79           0, &tty
b870: 70 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  pe) ){.        r
b880: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
b890: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
b8a0: 77 69 74 63 68 28 20 28 65 6e 75 6d 20 54 54 59  witch( (enum TTY
b8b0: 50 45 5f 65 6e 75 6d 29 74 74 79 70 65 20 29 7b  PE_enum)ttype ){
b8c0: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 54 54  .        case TT
b8d0: 59 50 45 5f 44 45 46 45 52 52 45 44 3a 20 20 20  YPE_DEFERRED:   
b8e0: 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 3b 20 20 20   /* no-op */;   
b8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
b900: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
b910: 65 20 54 54 59 50 45 5f 45 58 43 4c 55 53 49 56  e TTYPE_EXCLUSIV
b920: 45 3a 20 20 20 7a 42 65 67 69 6e 20 3d 20 22 42  E:   zBegin = "B
b930: 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45 22 3b  EGIN EXCLUSIVE";
b940: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
b950: 20 63 61 73 65 20 54 54 59 50 45 5f 49 4d 4d 45   case TTYPE_IMME
b960: 44 49 41 54 45 3a 20 20 20 7a 42 65 67 69 6e 20  DIATE:   zBegin 
b970: 3d 20 22 42 45 47 49 4e 20 49 4d 4d 45 44 49 41  = "BEGIN IMMEDIA
b980: 54 45 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  TE";  break;.   
b990: 20 20 20 7d 0a 20 20 20 20 20 20 70 53 63 72 69     }.      pScri
b9a0: 70 74 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20  pt = objv[3];.  
b9b0: 20 20 7d 0a 20 20 20 20 69 6e 54 72 61 6e 73 20    }.    inTrans 
b9c0: 3d 20 21 73 71 6c 69 74 65 33 5f 67 65 74 5f 61  = !sqlite3_get_a
b9d0: 75 74 6f 63 6f 6d 6d 69 74 28 70 44 62 2d 3e 64  utocommit(pDb->d
b9e0: 62 29 3b 0a 20 20 20 20 69 66 28 20 21 69 6e 54  b);.    if( !inT
b9f0: 72 61 6e 73 20 29 7b 0a 20 20 20 20 20 20 73 71  rans ){.      sq
ba00: 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e  lite3_exec(pDb->
ba10: 64 62 2c 20 7a 42 65 67 69 6e 2c 20 30 2c 20 30  db, zBegin, 0, 0
ba20: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
ba30: 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  rc = Tcl_EvalObj
ba40: 45 78 28 69 6e 74 65 72 70 2c 20 70 53 63 72 69  Ex(interp, pScri
ba50: 70 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  pt, 0);.    if( 
ba60: 21 69 6e 54 72 61 6e 73 20 29 7b 0a 20 20 20 20  !inTrans ){.    
ba70: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
ba80: 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  nd;.      if( rc
ba90: 3d 3d 54 43 4c 5f 45 52 52 4f 52 20 29 7b 0a 20  ==TCL_ERROR ){. 
baa0: 20 20 20 20 20 20 20 7a 45 6e 64 20 3d 20 22 52         zEnd = "R
bab0: 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20 20  OLLBACK";.      
bac0: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
bad0: 20 7a 45 6e 64 20 3d 20 22 43 4f 4d 4d 49 54 22   zEnd = "COMMIT"
bae0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
baf0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62  sqlite3_exec(pDb
bb00: 2d 3e 64 62 2c 20 7a 45 6e 64 2c 20 30 2c 20 30  ->db, zEnd, 0, 0
bb10: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
bb20: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
bb30: 20 20 20 20 24 64 62 20 63 6f 70 79 20 63 6f 6e      $db copy con
bb40: 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d 20  flict-algorithm 
bb50: 74 61 62 6c 65 20 66 69 6c 65 6e 61 6d 65 20 3f  table filename ?
bb60: 53 45 50 41 52 41 54 4f 52 3f 20 3f 4e 55 4c 4c  SEPARATOR? ?NULL
bb70: 49 4e 44 49 43 41 54 4f 52 3f 0a 20 20 2a 2a 0a  INDICATOR?.  **.
bb80: 20 20 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 69    ** Copy data i
bb90: 6e 74 6f 20 74 61 62 6c 65 20 66 72 6f 6d 20 66  nto table from f
bba0: 69 6c 65 6e 61 6d 65 2c 20 6f 70 74 69 6f 6e 61  ilename, optiona
bbb0: 6c 6c 79 20 75 73 69 6e 67 20 53 45 50 41 52 41  lly using SEPARA
bbc0: 54 4f 52 0a 20 20 2a 2a 20 61 73 20 63 6f 6c 75  TOR.  ** as colu
bbd0: 6d 6e 20 73 65 70 61 72 61 74 6f 72 73 2e 20 20  mn separators.  
bbe0: 49 66 20 61 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74  If a column cont
bbf0: 61 69 6e 73 20 61 20 6e 75 6c 6c 20 73 74 72 69  ains a null stri
bc00: 6e 67 2c 20 6f 72 20 74 68 65 0a 20 20 2a 2a 20  ng, or the.  ** 
bc10: 76 61 6c 75 65 20 6f 66 20 4e 55 4c 4c 49 4e 44  value of NULLIND
bc20: 49 43 41 54 4f 52 2c 20 61 20 4e 55 4c 4c 20 69  ICATOR, a NULL i
bc30: 73 20 69 6e 73 65 72 74 65 64 20 66 6f 72 20 74  s inserted for t
bc40: 68 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 2a 2a 20  he column..  ** 
bc50: 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74  conflict-algorit
bc60: 68 6d 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65  hm is one of the
bc70: 20 73 71 6c 69 74 65 20 63 6f 6e 66 6c 69 63 74   sqlite conflict
bc80: 20 61 6c 67 6f 72 69 74 68 6d 73 3a 0a 20 20 2a   algorithms:.  *
bc90: 2a 20 20 20 20 72 6f 6c 6c 62 61 63 6b 2c 20 61  *    rollback, a
bca0: 62 6f 72 74 2c 20 66 61 69 6c 2c 20 69 67 6e 6f  bort, fail, igno
bcb0: 72 65 2c 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a  re, replace.  **
bcc0: 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74   On success, ret
bcd0: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
bce0: 66 20 6c 69 6e 65 73 20 70 72 6f 63 65 73 73 65  f lines processe
bcf0: 64 2c 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69  d, not necessari
bd00: 6c 79 20 73 61 6d 65 0a 20 20 2a 2a 20 61 73 20  ly same.  ** as 
bd10: 27 64 62 20 63 68 61 6e 67 65 73 27 20 64 75 65  'db changes' due
bd20: 20 74 6f 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67   to conflict-alg
bd30: 6f 72 69 74 68 6d 20 73 65 6c 65 63 74 65 64 2e  orithm selected.
bd40: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
bd50: 63 6f 64 65 20 69 73 20 62 61 73 69 63 61 6c 6c  code is basicall
bd60: 79 20 61 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74  y an implementat
bd70: 69 6f 6e 2f 65 6e 68 61 6e 63 65 6d 65 6e 74 20  ion/enhancement 
bd80: 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69  of.  ** the sqli
bd90: 74 65 33 20 73 68 65 6c 6c 2e 63 20 22 2e 69 6d  te3 shell.c ".im
bda0: 70 6f 72 74 22 20 63 6f 6d 6d 61 6e 64 2e 0a 20  port" command.. 
bdb0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 63 6f   **.  ** This co
bdc0: 6d 6d 61 6e 64 20 75 73 61 67 65 20 69 73 20 65  mmand usage is e
bdd0: 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68 65  quivalent to the
bde0: 20 73 71 6c 69 74 65 32 2e 78 20 43 4f 50 59 20   sqlite2.x COPY 
bdf0: 73 74 61 74 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20  statement,.  ** 
be00: 77 68 69 63 68 20 69 6d 70 6f 72 74 73 20 66 69  which imports fi
be10: 6c 65 20 64 61 74 61 20 69 6e 74 6f 20 61 20 74  le data into a t
be20: 61 62 6c 65 20 75 73 69 6e 67 20 74 68 65 20 50  able using the P
be30: 6f 73 74 67 72 65 53 51 4c 20 43 4f 50 59 20 66  ostgreSQL COPY f
be40: 69 6c 65 20 66 6f 72 6d 61 74 3a 0a 20 20 2a 2a  ile format:.  **
be50: 20 20 20 24 64 62 20 63 6f 70 79 20 24 63 6f 6e     $db copy $con
be60: 66 6c 69 74 5f 61 6c 67 6f 20 24 74 61 62 6c 65  flit_algo $table
be70: 5f 6e 61 6d 65 20 24 66 69 6c 65 6e 61 6d 65 20  _name $filename 
be80: 5c 74 20 5c 5c 4e 0a 20 20 2a 2f 0a 20 20 63 61  \t \\N.  */.  ca
be90: 73 65 20 44 42 5f 43 4f 50 59 3a 20 7b 0a 20 20  se DB_COPY: {.  
bea0: 20 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 3b 20    char *zTable; 
beb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bec0: 20 49 6e 73 65 72 74 20 64 61 74 61 20 69 6e 74   Insert data int
bed0: 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a  o this table */.
bee0: 20 20 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b      char *zFile;
bef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf00: 2f 2a 20 54 68 65 20 66 69 6c 65 20 66 72 6f 6d  /* The file from
bf10: 20 77 68 69 63 68 20 74 6f 20 65 78 74 72 61 63   which to extrac
bf20: 74 20 64 61 74 61 20 2a 2f 0a 20 20 20 20 63 68  t data */.    ch
bf30: 61 72 20 2a 7a 43 6f 6e 66 6c 69 63 74 3b 20 20  ar *zConflict;  
bf40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
bf50: 20 63 6f 6e 66 6c 69 63 74 20 61 6c 67 6f 72 69   conflict algori
bf60: 74 68 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20  thm to use */.  
bf70: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
bf80: 70 53 74 6d 74 3b 20 20 20 20 20 20 20 20 2f 2a  pStmt;        /*
bf90: 20 41 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a   A statement */.
bfa0: 20 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20      int rc;     
bfb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfc0: 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
bfd0: 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20  /.    int nCol; 
bfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bff0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
c000: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61  olumns in the ta
c010: 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ble */.    int n
c020: 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  Byte;           
c030: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
c040: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61 6e 20   of bytes in an 
c050: 53 51 4c 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20  SQL string */.  
c060: 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
c070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c080: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
c090: 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 70 3b 20  /.    int nSep; 
c0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
c0c0: 79 74 65 73 20 69 6e 20 7a 53 65 70 5b 5d 20 2a  ytes in zSep[] *
c0d0: 2f 0a 20 20 20 20 69 6e 74 20 6e 4e 75 6c 6c 3b  /.    int nNull;
c0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0f0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
c100: 79 74 65 73 20 69 6e 20 7a 4e 75 6c 6c 5b 5d 20  ytes in zNull[] 
c110: 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71  */.    char *zSq
c120: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
c130: 20 20 20 2f 2a 20 41 6e 20 53 51 4c 20 73 74 61     /* An SQL sta
c140: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 63 68  tement */.    ch
c150: 61 72 20 2a 7a 4c 69 6e 65 3b 20 20 20 20 20 20  ar *zLine;      
c160: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
c170: 69 6e 67 6c 65 20 6c 69 6e 65 20 6f 66 20 69 6e  ingle line of in
c180: 70 75 74 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  put from the fil
c190: 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 2a  e */.    char **
c1a0: 61 7a 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20  azCol;          
c1b0: 20 20 20 20 20 2f 2a 20 7a 4c 69 6e 65 5b 5d 20       /* zLine[] 
c1c0: 62 72 6f 6b 65 6e 20 75 70 20 69 6e 74 6f 20 63  broken up into c
c1d0: 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 63 68  olumns */.    ch
c1e0: 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 20 20 20 20  ar *zCommit;    
c1f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77            /* How
c200: 20 74 6f 20 63 6f 6d 6d 69 74 20 63 68 61 6e 67   to commit chang
c210: 65 73 20 2a 2f 0a 20 20 20 20 46 49 4c 45 20 2a  es */.    FILE *
c220: 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  in;             
c230: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 70        /* The inp
c240: 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 69  ut file */.    i
c250: 6e 74 20 6c 69 6e 65 6e 6f 20 3d 20 30 3b 20 20  nt lineno = 0;  
c260: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
c270: 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 70  ne number of inp
c280: 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 63  ut file */.    c
c290: 68 61 72 20 7a 4c 69 6e 65 4e 75 6d 5b 38 30 5d  har zLineNum[80]
c2a0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  ;          /* Li
c2b0: 6e 65 20 6e 75 6d 62 65 72 20 70 72 69 6e 74 20  ne number print 
c2c0: 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 54 63  buffer */.    Tc
c2d0: 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 20  l_Obj *pResult; 
c2e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 74            /* int
c2f0: 65 72 70 20 72 65 73 75 6c 74 20 2a 2f 0a 0a 20  erp result */.. 
c300: 20 20 20 63 68 61 72 20 2a 7a 53 65 70 3b 0a 20     char *zSep;. 
c310: 20 20 20 63 68 61 72 20 2a 7a 4e 75 6c 6c 3b 0a     char *zNull;.
c320: 20 20 20 20 69 66 28 20 6f 62 6a 63 3c 35 20 7c      if( objc<5 |
c330: 7c 20 6f 62 6a 63 3e 37 20 29 7b 0a 20 20 20 20  | objc>7 ){.    
c340: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
c350: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
c360: 6a 76 2c 20 0a 20 20 20 20 20 20 20 20 20 22 43  jv, .         "C
c370: 4f 4e 46 4c 49 43 54 2d 41 4c 47 4f 52 49 54 48  ONFLICT-ALGORITH
c380: 4d 20 54 41 42 4c 45 20 46 49 4c 45 4e 41 4d 45  M TABLE FILENAME
c390: 20 3f 53 45 50 41 52 41 54 4f 52 3f 20 3f 4e 55   ?SEPARATOR? ?NU
c3a0: 4c 4c 49 4e 44 49 43 41 54 4f 52 3f 22 29 3b 0a  LLINDICATOR?");.
c3b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
c3c0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
c3d0: 20 20 69 66 28 20 6f 62 6a 63 3e 3d 36 20 29 7b    if( objc>=6 ){
c3e0: 0a 20 20 20 20 20 20 7a 53 65 70 20 3d 20 54 63  .      zSep = Tc
c3f0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
c400: 62 6a 28 6f 62 6a 76 5b 35 5d 2c 20 30 29 3b 0a  bj(objv[5], 0);.
c410: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c420: 20 7a 53 65 70 20 3d 20 22 5c 74 22 3b 0a 20 20   zSep = "\t";.  
c430: 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a 63    }.    if( objc
c440: 3e 3d 37 20 29 7b 0a 20 20 20 20 20 20 7a 4e 75  >=7 ){.      zNu
c450: 6c 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  ll = Tcl_GetStri
c460: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 36  ngFromObj(objv[6
c470: 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ], 0);.    }else
c480: 7b 0a 20 20 20 20 20 20 7a 4e 75 6c 6c 20 3d 20  {.      zNull = 
c490: 22 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43  "";.    }.    zC
c4a0: 6f 6e 66 6c 69 63 74 20 3d 20 54 63 6c 5f 47 65  onflict = Tcl_Ge
c4b0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
c4c0: 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20  bjv[2], 0);.    
c4d0: 7a 54 61 62 6c 65 20 3d 20 54 63 6c 5f 47 65 74  zTable = Tcl_Get
c4e0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
c4f0: 6a 76 5b 33 5d 2c 20 30 29 3b 0a 20 20 20 20 7a  jv[3], 0);.    z
c500: 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  File = Tcl_GetSt
c510: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
c520: 5b 34 5d 2c 20 30 29 3b 0a 20 20 20 20 6e 53 65  [4], 0);.    nSe
c530: 70 20 3d 20 73 74 72 6c 65 6e 28 7a 53 65 70 29  p = strlen(zSep)
c540: 3b 0a 20 20 20 20 6e 4e 75 6c 6c 20 3d 20 73 74  ;.    nNull = st
c550: 72 6c 65 6e 28 7a 4e 75 6c 6c 29 3b 0a 20 20 20  rlen(zNull);.   
c560: 20 69 66 28 20 6e 53 65 70 3d 3d 30 20 29 7b 0a   if( nSep==0 ){.
c570: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
c580: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
c590: 45 72 72 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c 20  Error: non-null 
c5a0: 73 65 70 61 72 61 74 6f 72 20 72 65 71 75 69 72  separator requir
c5b0: 65 64 20 66 6f 72 20 63 6f 70 79 22 2c 20 30 29  ed for copy", 0)
c5c0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
c5d0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
c5e0: 20 20 20 20 69 66 28 73 71 6c 69 74 65 33 53 74      if(sqlite3St
c5f0: 72 49 43 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c  rICmp(zConflict,
c600: 20 22 72 6f 6c 6c 62 61 63 6b 22 29 20 21 3d 20   "rollback") != 
c610: 30 20 26 26 0a 20 20 20 20 20 20 20 73 71 6c 69  0 &&.       sqli
c620: 74 65 33 53 74 72 49 43 6d 70 28 7a 43 6f 6e 66  te3StrICmp(zConf
c630: 6c 69 63 74 2c 20 22 61 62 6f 72 74 22 20 20 20  lict, "abort"   
c640: 29 20 21 3d 20 30 20 26 26 0a 20 20 20 20 20 20  ) != 0 &&.      
c650: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
c660: 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 66 61 69 6c  zConflict, "fail
c670: 22 20 20 20 20 29 20 21 3d 20 30 20 26 26 0a 20  "    ) != 0 &&. 
c680: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72        sqlite3Str
c690: 49 43 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20  ICmp(zConflict, 
c6a0: 22 69 67 6e 6f 72 65 22 20 20 29 20 21 3d 20 30  "ignore"  ) != 0
c6b0: 20 26 26 0a 20 20 20 20 20 20 20 73 71 6c 69 74   &&.       sqlit
c6c0: 65 33 53 74 72 49 43 6d 70 28 7a 43 6f 6e 66 6c  e3StrICmp(zConfl
c6d0: 69 63 74 2c 20 22 72 65 70 6c 61 63 65 22 20 29  ict, "replace" )
c6e0: 20 21 3d 20 30 20 29 20 7b 0a 20 20 20 20 20 20   != 0 ) {.      
c6f0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
c700: 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a  (interp, "Error:
c710: 20 5c 22 22 2c 20 7a 43 6f 6e 66 6c 69 63 74 2c   \"", zConflict,
c720: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 5c   .            "\
c730: 22 2c 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f  ", conflict-algo
c740: 72 69 74 68 6d 20 6d 75 73 74 20 62 65 20 6f 6e  rithm must be on
c750: 65 20 6f 66 3a 20 72 6f 6c 6c 62 61 63 6b 2c 20  e of: rollback, 
c760: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 61  ".            "a
c770: 62 6f 72 74 2c 20 66 61 69 6c 2c 20 69 67 6e 6f  bort, fail, igno
c780: 72 65 2c 20 6f 72 20 72 65 70 6c 61 63 65 22 2c  re, or replace",
c790: 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   0);.      retur
c7a0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
c7b0: 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71   }.    zSql = sq
c7c0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53  lite3_mprintf("S
c7d0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 27 25 71  ELECT * FROM '%q
c7e0: 27 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20  '", zTable);.   
c7f0: 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a   if( zSql==0 ){.
c800: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
c810: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
c820: 45 72 72 6f 72 3a 20 6e 6f 20 73 75 63 68 20 74  Error: no such t
c830: 61 62 6c 65 3a 20 22 2c 20 7a 54 61 62 6c 65 2c  able: ", zTable,
c840: 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   0);.      retur
c850: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
c860: 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 73   }.    nByte = s
c870: 74 72 6c 65 6e 28 7a 53 71 6c 29 3b 0a 20 20 20  trlen(zSql);.   
c880: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
c890: 65 70 61 72 65 28 70 44 62 2d 3e 64 62 2c 20 7a  epare(pDb->db, z
c8a0: 53 71 6c 2c 20 30 2c 20 26 70 53 74 6d 74 2c 20  Sql, 0, &pStmt, 
c8b0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
c8c0: 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20  free(zSql);.    
c8d0: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
c8e0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
c8f0: 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a  (interp, "Error:
c900: 20 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d   ", sqlite3_errm
c910: 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b  sg(pDb->db), 0);
c920: 0a 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 30 3b  .      nCol = 0;
c930: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
c940: 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33    nCol = sqlite3
c950: 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53  _column_count(pS
c960: 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tmt);.    }.    
c970: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
c980: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28  (pStmt);.    if(
c990: 20 6e 43 6f 6c 3d 3d 30 20 29 20 7b 0a 20 20 20   nCol==0 ) {.   
c9a0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
c9b0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  ROR;.    }.    z
c9c0: 53 71 6c 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42  Sql = malloc( nB
c9d0: 79 74 65 20 2b 20 35 30 20 2b 20 6e 43 6f 6c 2a  yte + 50 + nCol*
c9e0: 32 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71  2 );.    if( zSq
c9f0: 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20 20 54  l==0 ) {.      T
ca00: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
ca10: 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20  interp, "Error: 
ca20: 63 61 6e 27 74 20 6d 61 6c 6c 6f 63 28 29 22 2c  can't malloc()",
ca30: 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   0);.      retur
ca40: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
ca50: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73   }.    sqlite3_s
ca60: 6e 70 72 69 6e 74 66 28 6e 42 79 74 65 2b 35 30  nprintf(nByte+50
ca70: 2c 20 7a 53 71 6c 2c 20 22 49 4e 53 45 52 54 20  , zSql, "INSERT 
ca80: 4f 52 20 25 71 20 49 4e 54 4f 20 27 25 71 27 20  OR %q INTO '%q' 
ca90: 56 41 4c 55 45 53 28 3f 22 2c 0a 20 20 20 20 20  VALUES(?",.     
caa0: 20 20 20 20 7a 43 6f 6e 66 6c 69 63 74 2c 20 7a      zConflict, z
cab0: 54 61 62 6c 65 29 3b 0a 20 20 20 20 6a 20 3d 20  Table);.    j = 
cac0: 73 74 72 6c 65 6e 28 7a 53 71 6c 29 3b 0a 20 20  strlen(zSql);.  
cad0: 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 43 6f    for(i=1; i<nCo
cae0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 7a  l; i++){.      z
caf0: 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 2c 27 3b 0a  Sql[j++] = ',';.
cb00: 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20        zSql[j++] 
cb10: 3d 20 27 3f 27 3b 0a 20 20 20 20 7d 0a 20 20 20  = '?';.    }.   
cb20: 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 29 27   zSql[j++] = ')'
cb30: 3b 0a 20 20 20 20 7a 53 71 6c 5b 6a 5d 20 3d 20  ;.    zSql[j] = 
cb40: 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  0;.    rc = sqli
cb50: 74 65 33 5f 70 72 65 70 61 72 65 28 70 44 62 2d  te3_prepare(pDb-
cb60: 3e 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 26 70  >db, zSql, 0, &p
cb70: 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 66 72  Stmt, 0);.    fr
cb80: 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66  ee(zSql);.    if
cb90: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63  ( rc ){.      Tc
cba0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
cbb0: 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 22  nterp, "Error: "
cbc0: 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
cbd0: 28 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20  (pDb->db), 0);. 
cbe0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e       sqlite3_fin
cbf0: 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
cc00: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
cc10: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
cc20: 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65  in = fopen(zFile
cc30: 2c 20 22 72 62 22 29 3b 0a 20 20 20 20 69 66 28  , "rb");.    if(
cc40: 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   in==0 ){.      
cc50: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
cc60: 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a  (interp, "Error:
cc70: 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c   cannot open fil
cc80: 65 3a 20 22 2c 20 7a 46 69 6c 65 2c 20 4e 55 4c  e: ", zFile, NUL
cc90: 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  L);.      sqlite
cca0: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
ccb0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
ccc0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
ccd0: 0a 20 20 20 20 61 7a 43 6f 6c 20 3d 20 6d 61 6c  .    azCol = mal
cce0: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 61 7a 43 6f  loc( sizeof(azCo
ccf0: 6c 5b 30 5d 29 2a 28 6e 43 6f 6c 2b 31 29 20 29  l[0])*(nCol+1) )
cd00: 3b 0a 20 20 20 20 69 66 28 20 61 7a 43 6f 6c 3d  ;.    if( azCol=
cd10: 3d 30 20 29 20 7b 0a 20 20 20 20 20 20 54 63 6c  =0 ) {.      Tcl
cd20: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
cd30: 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 63 61  terp, "Error: ca
cd40: 6e 27 74 20 6d 61 6c 6c 6f 63 28 29 22 2c 20 30  n't malloc()", 0
cd50: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
cd60: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
cd70: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65  .    sqlite3_exe
cd80: 63 28 70 44 62 2d 3e 64 62 2c 20 22 42 45 47 49  c(pDb->db, "BEGI
cd90: 4e 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  N", 0, 0, 0);.  
cda0: 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22 43 4f 4d    zCommit = "COM
cdb0: 4d 49 54 22 3b 0a 20 20 20 20 77 68 69 6c 65 28  MIT";.    while(
cdc0: 20 28 7a 4c 69 6e 65 20 3d 20 6c 6f 63 61 6c 5f   (zLine = local_
cdd0: 67 65 74 6c 69 6e 65 28 30 2c 20 69 6e 29 29 21  getline(0, in))!
cde0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  =0 ){.      char
cdf0: 20 2a 7a 3b 0a 20 20 20 20 20 20 69 20 3d 20 30   *z;.      i = 0
ce00: 3b 0a 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b  ;.      lineno++
ce10: 3b 0a 20 20 20 20 20 20 61 7a 43 6f 6c 5b 30 5d  ;.      azCol[0]
ce20: 20 3d 20 7a 4c 69 6e 65 3b 0a 20 20 20 20 20 20   = zLine;.      
ce30: 66 6f 72 28 69 3d 30 2c 20 7a 3d 7a 4c 69 6e 65  for(i=0, z=zLine
ce40: 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20  ; *z; z++){.    
ce50: 20 20 20 20 69 66 28 20 2a 7a 3d 3d 7a 53 65 70      if( *z==zSep
ce60: 5b 30 5d 20 26 26 20 73 74 72 6e 63 6d 70 28 7a  [0] && strncmp(z
ce70: 2c 20 7a 53 65 70 2c 20 6e 53 65 70 29 3d 3d 30  , zSep, nSep)==0
ce80: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 7a   ){.          *z
ce90: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
cea0: 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 69  i++;.          i
ceb0: 66 28 20 69 3c 6e 43 6f 6c 20 29 7b 0a 20 20 20  f( i<nCol ){.   
cec0: 20 20 20 20 20 20 20 20 20 61 7a 43 6f 6c 5b 69           azCol[i
ced0: 5d 20 3d 20 26 7a 5b 6e 53 65 70 5d 3b 0a 20 20  ] = &z[nSep];.  
cee0: 20 20 20 20 20 20 20 20 20 20 7a 20 2b 3d 20 6e            z += n
cef0: 53 65 70 2d 31 3b 0a 20 20 20 20 20 20 20 20 20  Sep-1;.         
cf00: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
cf10: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
cf20: 2b 31 21 3d 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  +1!=nCol ){.    
cf30: 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a      char *zErr;.
cf40: 20 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20 6d          zErr = m
cf50: 61 6c 6c 6f 63 28 32 30 30 20 2b 20 73 74 72 6c  alloc(200 + strl
cf60: 65 6e 28 7a 46 69 6c 65 29 29 3b 0a 20 20 20 20  en(zFile));.    
cf70: 20 20 20 20 73 70 72 69 6e 74 66 28 7a 45 72 72      sprintf(zErr
cf80: 2c 22 45 72 72 6f 72 3a 20 25 73 20 6c 69 6e 65  ,"Error: %s line
cf90: 20 25 64 3a 20 65 78 70 65 63 74 65 64 20 25 64   %d: expected %d
cfa0: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61   columns of data
cfb0: 20 62 75 74 20 66 6f 75 6e 64 20 25 64 22 2c 0a   but found %d",.
cfc0: 20 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65             zFile
cfd0: 2c 20 6c 69 6e 65 6e 6f 2c 20 6e 43 6f 6c 2c 20  , lineno, nCol, 
cfe0: 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 54 63  i+1);.        Tc
cff0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
d000: 6e 74 65 72 70 2c 20 7a 45 72 72 2c 20 30 29 3b  nterp, zErr, 0);
d010: 0a 20 20 20 20 20 20 20 20 66 72 65 65 28 7a 45  .        free(zE
d020: 72 72 29 3b 0a 20 20 20 20 20 20 20 20 7a 43 6f  rr);.        zCo
d030: 6d 6d 69 74 20 3d 20 22 52 4f 4c 4c 42 41 43 4b  mmit = "ROLLBACK
d040: 22 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ";.        break
d050: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d060: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
d070: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 2f   i++){.        /
d080: 2a 20 63 68 65 63 6b 20 66 6f 72 20 6e 75 6c 6c  * check for null
d090: 20 64 61 74 61 2c 20 69 66 20 73 6f 2c 20 62 69   data, if so, bi
d0a0: 6e 64 20 61 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20  nd as null */.  
d0b0: 20 20 20 20 20 20 69 66 20 28 28 6e 4e 75 6c 6c        if ((nNull
d0c0: 3e 30 20 26 26 20 73 74 72 63 6d 70 28 61 7a 43  >0 && strcmp(azC
d0d0: 6f 6c 5b 69 5d 2c 20 7a 4e 75 6c 6c 29 3d 3d 30  ol[i], zNull)==0
d0e0: 29 20 7c 7c 20 73 74 72 6c 65 6e 28 61 7a 43 6f  ) || strlen(azCo
d0f0: 6c 5b 69 5d 29 3d 3d 30 29 20 7b 0a 20 20 20 20  l[i])==0) {.    
d100: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
d110: 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 69  nd_null(pStmt, i
d120: 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  +1);.        }el
d130: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  se{.          sq
d140: 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28  lite3_bind_text(
d150: 70 53 74 6d 74 2c 20 69 2b 31 2c 20 61 7a 43 6f  pStmt, i+1, azCo
d160: 6c 5b 69 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45  l[i], -1, SQLITE
d170: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
d180: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
d190: 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70    sqlite3_step(p
d1a0: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 63 20  Stmt);.      rc 
d1b0: 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
d1c0: 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 66 72  pStmt);.      fr
d1d0: 65 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20  ee(zLine);.     
d1e0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
d1f0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  OK ){.        Tc
d200: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
d210: 6e 74 65 72 70 2c 22 45 72 72 6f 72 3a 20 22 2c  nterp,"Error: ",
d220: 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
d230: 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20  pDb->db), 0);.  
d240: 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20        zCommit = 
d250: 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20  "ROLLBACK";.    
d260: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
d270: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65   }.    }.    fre
d280: 65 28 61 7a 43 6f 6c 29 3b 0a 20 20 20 20 66 63  e(azCol);.    fc
d290: 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 73 71  lose(in);.    sq
d2a0: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
d2b0: 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Stmt);.    sqlit
d2c0: 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62 2c  e3_exec(pDb->db,
d2d0: 20 7a 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 2c 20   zCommit, 0, 0, 
d2e0: 30 29 3b 0a 0a 20 20 20 20 69 66 28 20 7a 43 6f  0);..    if( zCo
d2f0: 6d 6d 69 74 5b 30 5d 20 3d 3d 20 27 43 27 20 29  mmit[0] == 'C' )
d300: 7b 0a 20 20 20 20 20 20 2f 2a 20 73 75 63 63 65  {.      /* succe
d310: 73 73 2c 20 73 65 74 20 72 65 73 75 6c 74 20 61  ss, set result a
d320: 73 20 6e 75 6d 62 65 72 20 6f 66 20 6c 69 6e 65  s number of line
d330: 73 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20  s processed */. 
d340: 20 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54       pResult = T
d350: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_GetObjResult(
d360: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 20 20 54  interp);.      T
d370: 63 6c 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52 65  cl_SetIntObj(pRe
d380: 73 75 6c 74 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20  sult, lineno);. 
d390: 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b       rc = TCL_OK
d3a0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
d3b0: 20 20 20 2f 2a 20 66 61 69 6c 75 72 65 2c 20 61     /* failure, a
d3c0: 70 70 65 6e 64 20 6c 69 6e 65 6e 6f 20 77 68 65  ppend lineno whe
d3d0: 72 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20  re failed */.   
d3e0: 20 20 20 73 70 72 69 6e 74 66 28 7a 4c 69 6e 65     sprintf(zLine
d3f0: 4e 75 6d 2c 22 25 64 22 2c 6c 69 6e 65 6e 6f 29  Num,"%d",lineno)
d400: 3b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  ;.      Tcl_Appe
d410: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
d420: 22 2c 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20  ", failed while 
d430: 70 72 6f 63 65 73 73 69 6e 67 20 6c 69 6e 65 3a  processing line:
d440: 20 22 2c 7a 4c 69 6e 65 4e 75 6d 2c 30 29 3b 0a   ",zLineNum,0);.
d450: 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45        rc = TCL_E
d460: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
d470: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
d480: 20 20 20 20 24 64 62 20 76 65 72 73 69 6f 6e 0a      $db version.
d490: 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e    **.  ** Return
d4a0: 20 74 68 65 20 76 65 72 73 69 6f 6e 20 73 74 72   the version str
d4b0: 69 6e 67 20 66 6f 72 20 74 68 69 73 20 64 61 74  ing for this dat
d4c0: 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61  abase..  */.  ca
d4d0: 73 65 20 44 42 5f 56 45 52 53 49 4f 4e 3a 20 7b  se DB_VERSION: {
d4e0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
d4f0: 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
d500: 20 2a 29 73 71 6c 69 74 65 33 5f 6c 69 62 76 65   *)sqlite3_libve
d510: 72 73 69 6f 6e 28 29 2c 20 54 43 4c 5f 53 54 41  rsion(), TCL_STA
d520: 54 49 43 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  TIC);.    break;
d530: 0a 20 20 7d 0a 0a 0a 20 20 7d 20 2f 2a 20 45 6e  .  }...  } /* En
d540: 64 20 6f 66 20 74 68 65 20 53 57 49 54 43 48 20  d of the SWITCH 
d550: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 72  statement */.  r
d560: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
d570: 2a 2a 20 20 20 73 71 6c 69 74 65 33 20 44 42 4e  **   sqlite3 DBN
d580: 41 4d 45 20 46 49 4c 45 4e 41 4d 45 20 3f 4d 4f  AME FILENAME ?MO
d590: 44 45 3f 20 3f 2d 6b 65 79 20 4b 45 59 3f 0a 2a  DE? ?-key KEY?.*
d5a0: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65  *.** This is the
d5b0: 20 6d 61 69 6e 20 54 63 6c 20 63 6f 6d 6d 61 6e   main Tcl comman
d5c0: 64 2e 20 20 57 68 65 6e 20 74 68 65 20 22 73 71  d.  When the "sq
d5d0: 6c 69 74 65 22 20 54 63 6c 20 63 6f 6d 6d 61 6e  lite" Tcl comman
d5e0: 64 20 69 73 0a 2a 2a 20 69 6e 76 6f 6b 65 64 2c  d is.** invoked,
d5f0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75   this routine ru
d600: 6e 73 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68  ns to process th
d610: 61 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a  at command..**.*
d620: 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  * The first argu
d630: 6d 65 6e 74 2c 20 44 42 4e 41 4d 45 2c 20 69 73  ment, DBNAME, is
d640: 20 61 6e 20 61 72 62 69 74 72 61 72 79 20 6e 61   an arbitrary na
d650: 6d 65 20 66 6f 72 20 61 20 6e 65 77 0a 2a 2a 20  me for a new.** 
d660: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
d670: 69 6f 6e 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61  ion.  This comma
d680: 6e 64 20 63 72 65 61 74 65 73 20 61 20 6e 65 77  nd creates a new
d690: 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 64 0a 2a   command named.*
d6a0: 2a 20 44 42 4e 41 4d 45 20 74 68 61 74 20 69 73  * DBNAME that is
d6b0: 20 75 73 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c   used to control
d6c0: 20 74 68 61 74 20 63 6f 6e 6e 65 63 74 69 6f 6e   that connection
d6d0: 2e 20 20 54 68 65 20 64 61 74 61 62 61 73 65 0a  .  The database.
d6e0: 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  ** connection is
d6f0: 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68   deleted when th
d700: 65 20 44 42 4e 41 4d 45 20 63 6f 6d 6d 61 6e 64  e DBNAME command
d710: 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a   is deleted..**.
d720: 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  ** The second ar
d730: 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 61  gument is the na
d740: 6d 65 20 6f 66 20 74 68 65 20 64 69 72 65 63 74  me of the direct
d750: 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ory that contain
d760: 73 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 20  s.** the sqlite 
d770: 64 61 74 61 62 61 73 65 20 74 68 61 74 20 69 73  database that is
d780: 20 74 6f 20 62 65 20 61 63 63 65 73 73 65 64 2e   to be accessed.
d790: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 73 74 69  .**.** For testi
d7a0: 6e 67 20 70 75 72 70 6f 73 65 73 2c 20 77 65 20  ng purposes, we 
d7b0: 61 6c 73 6f 20 73 75 70 70 6f 72 74 20 74 68 65  also support the
d7c0: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
d7d0: 2a 20 20 73 71 6c 69 74 65 33 20 2d 65 6e 63 6f  *  sqlite3 -enco
d7e0: 64 69 6e 67 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ding.**.**      
d7f0: 20 52 65 74 75 72 6e 20 74 68 65 20 65 6e 63 6f   Return the enco
d800: 64 69 6e 67 20 75 73 65 64 20 62 79 20 4c 49 4b  ding used by LIK
d810: 45 20 61 6e 64 20 47 4c 4f 42 20 6f 70 65 72 61  E and GLOB opera
d820: 74 6f 72 73 2e 20 20 43 68 6f 69 63 65 73 0a 2a  tors.  Choices.*
d830: 2a 20 20 20 20 20 20 20 61 72 65 20 55 54 46 2d  *       are UTF-
d840: 38 20 61 6e 64 20 69 73 6f 38 38 35 39 2e 0a 2a  8 and iso8859..*
d850: 2a 0a 2a 2a 20 20 73 71 6c 69 74 65 33 20 2d 76  *.**  sqlite3 -v
d860: 65 72 73 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20  ersion.**.**    
d870: 20 20 20 52 65 74 75 72 6e 20 74 68 65 20 76 65     Return the ve
d880: 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 6f 66 20  rsion number of 
d890: 74 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61  the SQLite libra
d8a0: 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69 74  ry..**.**  sqlit
d8b0: 65 33 20 2d 74 63 6c 2d 75 73 65 73 2d 75 74 66  e3 -tcl-uses-utf
d8c0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 52 65 74  .**.**       Ret
d8d0: 75 72 6e 20 22 31 22 20 69 66 20 63 6f 6d 70 69  urn "1" if compi
d8e0: 6c 65 64 20 77 69 74 68 20 61 20 54 63 6c 20 75  led with a Tcl u
d8f0: 73 65 73 20 55 54 46 2d 38 2e 20 20 52 65 74 75  ses UTF-8.  Retu
d900: 72 6e 20 22 30 22 20 69 66 0a 2a 2a 20 20 20 20  rn "0" if.**    
d910: 20 20 20 6e 6f 74 2e 20 20 55 73 65 64 20 62 79     not.  Used by
d920: 20 74 65 73 74 73 20 74 6f 20 6d 61 6b 65 20 73   tests to make s
d930: 75 72 65 20 74 68 65 20 6c 69 62 72 61 72 79 20  ure the library 
d940: 77 61 73 20 63 6f 6d 70 69 6c 65 64 20 0a 2a 2a  was compiled .**
d950: 20 20 20 20 20 20 20 63 6f 72 72 65 63 74 6c 79         correctly
d960: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d970: 44 62 4d 61 69 6e 28 76 6f 69 64 20 2a 63 64 2c  DbMain(void *cd,
d980: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
d990: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 54 63  erp, int objc,Tc
d9a0: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a  l_Obj *const*obj
d9b0: 76 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  v){.  SqliteDb *
d9c0: 70 3b 0a 20 20 76 6f 69 64 20 2a 70 4b 65 79 20  p;.  void *pKey 
d9d0: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 20  = 0;.  int nKey 
d9e0: 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  = 0;.  const cha
d9f0: 72 20 2a 7a 41 72 67 3b 0a 20 20 63 68 61 72 20  r *zArg;.  char 
da00: 2a 7a 45 72 72 4d 73 67 3b 0a 20 20 63 6f 6e 73  *zErrMsg;.  cons
da10: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20  t char *zFile;. 
da20: 20 63 68 61 72 20 7a 42 75 66 5b 38 30 5d 3b 0a   char zBuf[80];.
da30: 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b    if( objc==2 ){
da40: 0a 20 20 20 20 7a 41 72 67 20 3d 20 54 63 6c 5f  .    zArg = Tcl_
da50: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
da60: 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20  (objv[1], 0);.  
da70: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72    if( strcmp(zAr
da80: 67 2c 22 2d 76 65 72 73 69 6f 6e 22 29 3d 3d 30  g,"-version")==0
da90: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
daa0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
dab0: 70 2c 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f  p,sqlite3_versio
dac0: 6e 2c 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  n,0);.      retu
dad0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d  rn TCL_OK;.    }
dae0: 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
daf0: 7a 41 72 67 2c 22 2d 68 61 73 2d 63 6f 64 65 63  zArg,"-has-codec
db00: 22 29 3d 3d 30 20 29 7b 0a 23 69 66 64 65 66 20  ")==0 ){.#ifdef 
db10: 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
db20: 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
db30: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22  dResult(interp,"
db40: 31 22 2c 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20  1",0);.#else.   
db50: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
db60: 75 6c 74 28 69 6e 74 65 72 70 2c 22 30 22 2c 30  ult(interp,"0",0
db70: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
db80: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20  return TCL_OK;. 
db90: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72     }.    if( str
dba0: 63 6d 70 28 7a 41 72 67 2c 22 2d 74 63 6c 2d 75  cmp(zArg,"-tcl-u
dbb0: 73 65 73 2d 75 74 66 22 29 3d 3d 30 20 29 7b 0a  ses-utf")==0 ){.
dbc0: 23 69 66 64 65 66 20 54 43 4c 5f 55 54 46 5f 4d  #ifdef TCL_UTF_M
dbd0: 41 58 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  AX.      Tcl_App
dbe0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
dbf0: 2c 22 31 22 2c 30 29 3b 0a 23 65 6c 73 65 0a 20  ,"1",0);.#else. 
dc00: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
dc10: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 30 22  esult(interp,"0"
dc20: 2c 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ,0);.#endif.    
dc30: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
dc40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
dc50: 20 6f 62 6a 63 3d 3d 35 20 7c 7c 20 6f 62 6a 63   objc==5 || objc
dc60: 3d 3d 36 20 29 7b 0a 20 20 20 20 7a 41 72 67 20  ==6 ){.    zArg 
dc70: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
dc80: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 6f 62 6a 63  romObj(objv[objc
dc90: 2d 32 5d 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  -2], 0);.    if(
dca0: 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 6b   strcmp(zArg,"-k
dcb0: 65 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ey")==0 ){.     
dcc0: 20 70 4b 65 79 20 3d 20 54 63 6c 5f 47 65 74 42   pKey = Tcl_GetB
dcd0: 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28  yteArrayFromObj(
dce0: 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 2c 20 26 6e  objv[objc-1], &n
dcf0: 4b 65 79 29 3b 0a 20 20 20 20 20 20 6f 62 6a 63  Key);.      objc
dd00: 20 2d 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d   -= 2;.    }.  }
dd10: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 26  .  if( objc!=3 &
dd20: 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  & objc!=4 ){.   
dd30: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
dd40: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
dd50: 76 2c 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54  v, .#ifdef SQLIT
dd60: 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20  E_HAS_CODEC.    
dd70: 20 20 22 48 41 4e 44 4c 45 20 46 49 4c 45 4e 41    "HANDLE FILENA
dd80: 4d 45 20 3f 2d 6b 65 79 20 43 4f 44 45 43 2d 4b  ME ?-key CODEC-K
dd90: 45 59 3f 22 0a 23 65 6c 73 65 0a 20 20 20 20 20  EY?".#else.     
dda0: 20 22 48 41 4e 44 4c 45 20 46 49 4c 45 4e 41 4d   "HANDLE FILENAM
ddb0: 45 20 3f 4d 4f 44 45 3f 22 0a 23 65 6e 64 69 66  E ?MODE?".#endif
ddc0: 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 65 74 75  .    );.    retu
ddd0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
dde0: 7d 0a 20 20 7a 45 72 72 4d 73 67 20 3d 20 30 3b  }.  zErrMsg = 0;
ddf0: 0a 20 20 70 20 3d 20 28 53 71 6c 69 74 65 44 62  .  p = (SqliteDb
de00: 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a  *)Tcl_Alloc( siz
de10: 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28  eof(*p) );.  if(
de20: 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c   p==0 ){.    Tcl
de30: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
de40: 70 2c 20 22 6d 61 6c 6c 6f 63 20 66 61 69 6c 65  p, "malloc faile
de50: 64 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  d", TCL_STATIC);
de60: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
de70: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 6d 65 6d  ERROR;.  }.  mem
de80: 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66  set(p, 0, sizeof
de90: 28 2a 70 29 29 3b 0a 20 20 7a 46 69 6c 65 20 3d  (*p));.  zFile =
dea0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
deb0: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30  omObj(objv[2], 0
dec0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65  );.  sqlite3_ope
ded0: 6e 28 7a 46 69 6c 65 2c 20 26 70 2d 3e 64 62 29  n(zFile, &p->db)
dee0: 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
def0: 4b 21 3d 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  K!=sqlite3_errco
df00: 64 65 28 70 2d 3e 64 62 29 20 29 7b 0a 20 20 20  de(p->db) ){.   
df10: 20 7a 45 72 72 4d 73 67 20 3d 20 73 74 72 64 75   zErrMsg = strdu
df20: 70 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  p(sqlite3_errmsg
df30: 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 73 71  (p->db));.    sq
df40: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64  lite3_close(p->d
df50: 62 29 3b 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20  b);.    p->db = 
df60: 30 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51  0;.  }.#ifdef SQ
df70: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
df80: 20 73 71 6c 69 74 65 33 5f 6b 65 79 28 70 2d 3e   sqlite3_key(p->
df90: 64 62 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 29 3b  db, pKey, nKey);
dfa0: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d  .#endif.  if( p-
dfb0: 3e 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63  >db==0 ){.    Tc
dfc0: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
dfd0: 72 70 2c 20 7a 45 72 72 4d 73 67 2c 20 54 43 4c  rp, zErrMsg, TCL
dfe0: 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20  _VOLATILE);.    
dff0: 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29  Tcl_Free((char*)
e000: 70 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 45 72  p);.    free(zEr
e010: 72 4d 73 67 29 3b 0a 20 20 20 20 72 65 74 75 72  rMsg);.    retur
e020: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
e030: 0a 20 20 70 2d 3e 6d 61 78 53 74 6d 74 20 3d 20  .  p->maxStmt = 
e040: 4e 55 4d 5f 50 52 45 50 41 52 45 44 5f 53 54 4d  NUM_PREPARED_STM
e050: 54 53 3b 0a 20 20 7a 41 72 67 20 3d 20 54 63 6c  TS;.  zArg = Tcl
e060: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
e070: 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20  j(objv[1], 0);. 
e080: 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
e090: 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 7a 41  mmand(interp, zA
e0a0: 72 67 2c 20 44 62 4f 62 6a 43 6d 64 2c 20 28 63  rg, DbObjCmd, (c
e0b0: 68 61 72 2a 29 70 2c 20 44 62 44 65 6c 65 74 65  har*)p, DbDelete
e0c0: 43 6d 64 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  Cmd);..  /* The 
e0d0: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
e0e0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
e0f0: 20 73 71 6c 69 74 65 2a 20 70 6f 69 6e 74 65 72   sqlite* pointer
e100: 0a 20 20 2a 2f 0a 20 20 73 70 72 69 6e 74 66 28  .  */.  sprintf(
e110: 7a 42 75 66 2c 20 22 25 70 22 2c 20 70 2d 3e 64  zBuf, "%p", p->d
e120: 62 29 3b 0a 20 20 69 66 28 20 73 74 72 6e 63 6d  b);.  if( strncm
e130: 70 28 7a 42 75 66 2c 22 30 78 22 2c 32 29 20 29  p(zBuf,"0x",2) )
e140: 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42  {.    sprintf(zB
e150: 75 66 2c 20 22 30 78 25 70 22 2c 20 70 2d 3e 64  uf, "0x%p", p->d
e160: 62 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 41 70  b);.  }.  Tcl_Ap
e170: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
e180: 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 0a 20 20  p, zBuf, 0);..  
e190: 2f 2a 20 49 66 20 63 6f 6d 70 69 6c 65 64 20 77  /* If compiled w
e1a0: 69 74 68 20 53 51 4c 49 54 45 5f 54 45 53 54 20  ith SQLITE_TEST 
e1b0: 74 75 72 6e 65 64 20 6f 6e 2c 20 74 68 65 6e 20  turned on, then 
e1c0: 72 65 67 69 73 74 65 72 20 74 68 65 20 22 6d 64  register the "md
e1d0: 35 73 75 6d 22 0a 20 20 2a 2a 20 53 51 4c 20 66  5sum".  ** SQL f
e1e0: 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69  unction..  */.#i
e1f0: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
e200: 0a 20 20 7b 0a 20 20 20 20 65 78 74 65 72 6e 20  .  {.    extern 
e210: 76 6f 69 64 20 4d 64 35 5f 52 65 67 69 73 74 65  void Md5_Registe
e220: 72 28 73 71 6c 69 74 65 33 2a 29 3b 0a 23 69 66  r(sqlite3*);.#if
e230: 64 65 66 20 53 51 4c 49 54 45 5f 4d 45 4d 44 45  def SQLITE_MEMDE
e240: 42 55 47 0a 20 20 20 20 69 6e 74 20 6d 61 6c 6c  BUG.    int mall
e250: 6f 63 66 61 69 6c 20 3d 20 73 71 6c 69 74 65 33  ocfail = sqlite3
e260: 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c 3b 0a 20 20  _iMallocFail;.  
e270: 20 20 73 71 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f    sqlite3_iMallo
e280: 63 46 61 69 6c 20 3d 20 30 3b 0a 23 65 6e 64 69  cFail = 0;.#endi
e290: 66 0a 20 20 20 20 4d 64 35 5f 52 65 67 69 73 74  f.    Md5_Regist
e2a0: 65 72 28 70 2d 3e 64 62 29 3b 0a 23 69 66 64 65  er(p->db);.#ifde
e2b0: 66 20 53 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55  f SQLITE_MEMDEBU
e2c0: 47 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 4d  G.    sqlite3_iM
e2d0: 61 6c 6c 6f 63 46 61 69 6c 20 3d 20 6d 61 6c 6c  allocFail = mall
e2e0: 6f 63 66 61 69 6c 3b 0a 23 65 6e 64 69 66 0a 20  ocfail;.#endif. 
e2f0: 20 20 7d 0a 23 65 6e 64 69 66 20 20 0a 20 20 70    }.#endif  .  p
e300: 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72  ->interp = inter
e310: 70 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  p;.  return TCL_
e320: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f  OK;.}../*.** Pro
e330: 76 69 64 65 20 61 20 64 75 6d 6d 79 20 54 63 6c  vide a dummy Tcl
e340: 5f 49 6e 69 74 53 74 75 62 73 20 69 66 20 77 65  _InitStubs if we
e350: 20 61 72 65 20 75 73 69 6e 67 20 74 68 69 73 20   are using this 
e360: 61 73 20 61 20 73 74 61 74 69 63 0a 2a 2a 20 6c  as a static.** l
e370: 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64  ibrary..*/.#ifnd
e380: 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 53  ef USE_TCL_STUBS
e390: 0a 23 20 75 6e 64 65 66 20 20 54 63 6c 5f 49 6e  .# undef  Tcl_In
e3a0: 69 74 53 74 75 62 73 0a 23 20 64 65 66 69 6e 65  itStubs.# define
e3b0: 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 61   Tcl_InitStubs(a
e3c0: 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ,b,c).#endif../*
e3d0: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  .** Initialize t
e3e0: 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2a 0a 2a  his module..**.*
e3f0: 2a 20 54 68 69 73 20 54 63 6c 20 6d 6f 64 75 6c  * This Tcl modul
e400: 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20  e contains only 
e410: 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 54 63 6c  a single new Tcl
e420: 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 64 20 22   command named "
e430: 73 71 6c 69 74 65 22 2e 0a 2a 2a 20 28 48 65 6e  sqlite"..** (Hen
e440: 63 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  ce there is no n
e450: 61 6d 65 73 70 61 63 65 2e 20 20 54 68 65 72 65  amespace.  There
e460: 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20   is no point in 
e470: 75 73 69 6e 67 20 61 20 6e 61 6d 65 73 70 61 63  using a namespac
e480: 65 0a 2a 2a 20 69 66 20 74 68 65 20 65 78 74 65  e.** if the exte
e490: 6e 73 69 6f 6e 20 6f 6e 6c 79 20 73 75 70 70 6c  nsion only suppl
e4a0: 69 65 73 20 6f 6e 65 20 6e 65 77 20 6e 61 6d 65  ies one new name
e4b0: 21 29 20 20 54 68 65 20 22 73 71 6c 69 74 65 22  !)  The "sqlite"
e4c0: 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 75   command is.** u
e4d0: 73 65 64 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65  sed to open a ne
e4e0: 77 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  w SQLite databas
e4f0: 65 2e 20 20 53 65 65 20 74 68 65 20 44 62 4d 61  e.  See the DbMa
e500: 69 6e 28 29 20 72 6f 75 74 69 6e 65 20 61 62 6f  in() routine abo
e510: 76 65 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74 69  ve.** for additi
e520: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
e530: 2e 0a 2a 2f 0a 69 6e 74 20 53 71 6c 69 74 65 33  ..*/.int Sqlite3
e540: 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
e550: 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 54 63 6c   *interp){.  Tcl
e560: 5f 49 6e 69 74 53 74 75 62 73 28 69 6e 74 65 72  _InitStubs(inter
e570: 70 2c 20 22 38 2e 34 22 2c 20 30 29 3b 0a 20 20  p, "8.4", 0);.  
e580: 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
e590: 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 73 71  mand(interp, "sq
e5a0: 6c 69 74 65 33 22 2c 20 28 54 63 6c 5f 4f 62 6a  lite3", (Tcl_Obj
e5b0: 43 6d 64 50 72 6f 63 2a 29 44 62 4d 61 69 6e 2c  CmdProc*)DbMain,
e5c0: 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 50 6b   0, 0);.  Tcl_Pk
e5d0: 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72 70 2c  gProvide(interp,
e5e0: 20 22 73 71 6c 69 74 65 33 22 2c 20 22 33 2e 30   "sqlite3", "3.0
e5f0: 22 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65  ");.  Tcl_Create
e600: 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
e610: 70 2c 20 22 73 71 6c 69 74 65 22 2c 20 28 54 63  p, "sqlite", (Tc
e620: 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 2a 29 44 62  l_ObjCmdProc*)Db
e630: 4d 61 69 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 54  Main, 0, 0);.  T
e640: 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e  cl_PkgProvide(in
e650: 74 65 72 70 2c 20 22 73 71 6c 69 74 65 22 2c 20  terp, "sqlite", 
e660: 22 33 2e 30 22 29 3b 0a 20 20 72 65 74 75 72 6e  "3.0");.  return
e670: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 54   TCL_OK;.}.int T
e680: 63 6c 73 71 6c 69 74 65 33 5f 49 6e 69 74 28 54  clsqlite3_Init(T
e690: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
e6a0: 70 29 7b 20 72 65 74 75 72 6e 20 53 71 6c 69 74  p){ return Sqlit
e6b0: 65 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  e3_Init(interp);
e6c0: 20 7d 0a 69 6e 74 20 53 71 6c 69 74 65 33 5f 53   }.int Sqlite3_S
e6d0: 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  afeInit(Tcl_Inte
e6e0: 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74  rp *interp){ ret
e6f0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 69 6e  urn TCL_OK; }.in
e700: 74 20 54 63 6c 73 71 6c 69 74 65 33 5f 53 61 66  t Tclsqlite3_Saf
e710: 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  eInit(Tcl_Interp
e720: 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72   *interp){ retur
e730: 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 0a 23 69 66  n TCL_OK; }..#if
e740: 6e 64 65 66 20 53 51 4c 49 54 45 5f 33 5f 53 55  ndef SQLITE_3_SU
e750: 46 46 49 58 5f 4f 4e 4c 59 0a 69 6e 74 20 53 71  FFIX_ONLY.int Sq
e760: 6c 69 74 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  lite_Init(Tcl_In
e770: 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72  terp *interp){ r
e780: 65 74 75 72 6e 20 53 71 6c 69 74 65 33 5f 49 6e  eturn Sqlite3_In
e790: 69 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a 69 6e  it(interp); }.in
e7a0: 74 20 54 63 6c 73 71 6c 69 74 65 5f 49 6e 69 74  t Tclsqlite_Init
e7b0: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
e7c0: 65 72 70 29 7b 20 72 65 74 75 72 6e 20 53 71 6c  erp){ return Sql
e7d0: 69 74 65 33 5f 49 6e 69 74 28 69 6e 74 65 72 70  ite3_Init(interp
e7e0: 29 3b 20 7d 0a 69 6e 74 20 53 71 6c 69 74 65 5f  ); }.int Sqlite_
e7f0: 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74  SafeInit(Tcl_Int
e800: 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65  erp *interp){ re
e810: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 69  turn TCL_OK; }.i
e820: 6e 74 20 54 63 6c 73 71 6c 69 74 65 5f 53 61 66  nt Tclsqlite_Saf
e830: 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  eInit(Tcl_Interp
e840: 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72   *interp){ retur
e850: 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 23 65 6e 64  n TCL_OK; }.#end
e860: 69 66 0a 0a 23 69 66 64 65 66 20 54 43 4c 53 48  if..#ifdef TCLSH
e870: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
e880: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e890: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e8a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e8b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
e8c0: 2a 2a 20 54 68 65 20 63 6f 64 65 20 74 68 61 74  ** The code that
e8d0: 20 66 6f 6c 6c 6f 77 73 20 69 73 20 75 73 65 64   follows is used
e8e0: 20 74 6f 20 62 75 69 6c 64 20 73 74 61 6e 64 61   to build standa
e8f0: 6c 6f 6e 65 20 54 43 4c 20 69 6e 74 65 72 70 72  lone TCL interpr
e900: 65 74 65 72 73 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  eters.*/../*.** 
e910: 49 66 20 74 68 65 20 6d 61 63 72 6f 20 54 43 4c  If the macro TCL
e920: 53 48 20 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20  SH is one, then 
e930: 70 75 74 20 69 6e 20 63 6f 64 65 20 74 68 69 73  put in code this
e940: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 22 6d 61 69   for the.** "mai
e950: 6e 22 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20  n" routine that 
e960: 77 69 6c 6c 20 69 6e 69 74 69 61 6c 69 7a 65 20  will initialize 
e970: 54 63 6c 20 61 6e 64 20 74 61 6b 65 20 69 6e 70  Tcl and take inp
e980: 75 74 20 66 72 6f 6d 0a 2a 2a 20 73 74 61 6e 64  ut from.** stand
e990: 61 72 64 20 69 6e 70 75 74 2e 0a 2a 2f 0a 23 69  ard input..*/.#i
e9a0: 66 20 54 43 4c 53 48 3d 3d 31 0a 73 74 61 74 69  f TCLSH==1.stati
e9b0: 63 20 63 68 61 72 20 7a 4d 61 69 6e 6c 6f 6f 70  c char zMainloop
e9c0: 5b 5d 20 3d 0a 20 20 22 73 65 74 20 6c 69 6e 65  [] =.  "set line
e9d0: 20 7b 7d 5c 6e 22 0a 20 20 22 77 68 69 6c 65 20   {}\n".  "while 
e9e0: 7b 21 5b 65 6f 66 20 73 74 64 69 6e 5d 7d 20 7b  {![eof stdin]} {
e9f0: 5c 6e 22 0a 20 20 20 20 22 69 66 20 7b 24 6c 69  \n".    "if {$li
ea00: 6e 65 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22 0a 20  ne!=\"\"} {\n". 
ea10: 20 20 20 20 20 22 70 75 74 73 20 2d 6e 6f 6e 65       "puts -none
ea20: 77 6c 69 6e 65 20 5c 22 3e 20 5c 22 5c 6e 22 0a  wline \"> \"\n".
ea30: 20 20 20 20 22 7d 20 65 6c 73 65 20 7b 5c 6e 22      "} else {\n"
ea40: 0a 20 20 20 20 20 20 22 70 75 74 73 20 2d 6e 6f  .      "puts -no
ea50: 6e 65 77 6c 69 6e 65 20 5c 22 25 20 5c 22 5c 6e  newline \"% \"\n
ea60: 22 0a 20 20 20 20 22 7d 5c 6e 22 0a 20 20 20 20  ".    "}\n".    
ea70: 22 66 6c 75 73 68 20 73 74 64 6f 75 74 5c 6e 22  "flush stdout\n"
ea80: 0a 20 20 20 20 22 61 70 70 65 6e 64 20 6c 69 6e  .    "append lin
ea90: 65 20 5b 67 65 74 73 20 73 74 64 69 6e 5d 5c 6e  e [gets stdin]\n
eaa0: 22 0a 20 20 20 20 22 69 66 20 7b 5b 69 6e 66 6f  ".    "if {[info
eab0: 20 63 6f 6d 70 6c 65 74 65 20 24 6c 69 6e 65 5d   complete $line]
eac0: 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22 69 66  } {\n".      "if
ead0: 20 7b 5b 63 61 74 63 68 20 7b 75 70 6c 65 76 65   {[catch {upleve
eae0: 6c 20 23 30 20 24 6c 69 6e 65 7d 20 72 65 73 75  l #0 $line} resu
eaf0: 6c 74 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20  lt]} {\n".      
eb00: 20 20 22 70 75 74 73 20 73 74 64 65 72 72 20 5c    "puts stderr \
eb10: 22 45 72 72 6f 72 3a 20 24 72 65 73 75 6c 74 5c  "Error: $result\
eb20: 22 5c 6e 22 0a 20 20 20 20 20 20 22 7d 20 65 6c  "\n".      "} el
eb30: 73 65 69 66 20 7b 24 72 65 73 75 6c 74 21 3d 5c  seif {$result!=\
eb40: 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20  "\"} {\n".      
eb50: 20 20 22 70 75 74 73 20 24 72 65 73 75 6c 74 5c    "puts $result\
eb60: 6e 22 0a 20 20 20 20 20 20 22 7d 5c 6e 22 0a 20  n".      "}\n". 
eb70: 20 20 20 20 20 22 73 65 74 20 6c 69 6e 65 20 7b       "set line {
eb80: 7d 5c 6e 22 0a 20 20 20 20 22 7d 20 65 6c 73 65  }\n".    "} else
eb90: 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22 61 70 70   {\n".      "app
eba0: 65 6e 64 20 6c 69 6e 65 20 5c 5c 6e 5c 6e 22 0a  end line \\n\n".
ebb0: 20 20 20 20 22 7d 5c 6e 22 0a 20 20 22 7d 5c 6e      "}\n".  "}\n
ebc0: 22 0a 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ".;.#endif../*.*
ebd0: 2a 20 49 66 20 74 68 65 20 6d 61 63 72 6f 20 54  * If the macro T
ebe0: 43 4c 53 48 20 69 73 20 74 77 6f 2c 20 74 68 65  CLSH is two, the
ebf0: 6e 20 67 65 74 20 74 68 65 20 6d 61 69 6e 20 6c  n get the main l
ec00: 6f 6f 70 20 63 6f 64 65 20 6f 75 74 20 6f 66 0a  oop code out of.
ec10: 2a 2a 20 74 68 65 20 73 65 70 61 72 61 74 65 20  ** the separate 
ec20: 66 69 6c 65 20 22 73 70 61 63 65 61 6e 61 6c 5f  file "spaceanal_
ec30: 74 63 6c 2e 68 22 2e 0a 2a 2f 0a 23 69 66 20 54  tcl.h"..*/.#if T
ec40: 43 4c 53 48 3d 3d 32 0a 73 74 61 74 69 63 20 63  CLSH==2.static c
ec50: 68 61 72 20 7a 4d 61 69 6e 6c 6f 6f 70 5b 5d 20  har zMainloop[] 
ec60: 3d 20 0a 23 69 6e 63 6c 75 64 65 20 22 73 70 61  = .#include "spa
ec70: 63 65 61 6e 61 6c 5f 74 63 6c 2e 68 22 0a 3b 0a  ceanal_tcl.h".;.
ec80: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
ec90: 54 43 4c 53 48 5f 4d 41 49 4e 20 6d 61 69 6e 20  TCLSH_MAIN main 
eca0: 20 20 2f 2a 20 4e 65 65 64 65 64 20 74 6f 20 66    /* Needed to f
ecb0: 61 6b 65 20 6f 75 74 20 6d 6b 74 63 6c 61 70 70  ake out mktclapp
ecc0: 20 2a 2f 0a 69 6e 74 20 54 43 4c 53 48 5f 4d 41   */.int TCLSH_MA
ecd0: 49 4e 28 69 6e 74 20 61 72 67 63 2c 20 63 68 61  IN(int argc, cha
ece0: 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 54 63 6c  r **argv){.  Tcl
ecf0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b  _Interp *interp;
ed00: 0a 20 20 54 63 6c 5f 46 69 6e 64 45 78 65 63 75  .  Tcl_FindExecu
ed10: 74 61 62 6c 65 28 61 72 67 76 5b 30 5d 29 3b 0a  table(argv[0]);.
ed20: 20 20 69 6e 74 65 72 70 20 3d 20 54 63 6c 5f 43    interp = Tcl_C
ed30: 72 65 61 74 65 49 6e 74 65 72 70 28 29 3b 0a 20  reateInterp();. 
ed40: 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e   Sqlite3_Init(in
ed50: 74 65 72 70 29 3b 0a 23 69 66 64 65 66 20 53 51  terp);.#ifdef SQ
ed60: 4c 49 54 45 5f 54 45 53 54 0a 20 20 7b 0a 20 20  LITE_TEST.  {.  
ed70: 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
ed80: 69 74 65 74 65 73 74 31 5f 49 6e 69 74 28 54 63  itetest1_Init(Tc
ed90: 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
eda0: 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
edb0: 65 74 65 73 74 32 5f 49 6e 69 74 28 54 63 6c 5f  etest2_Init(Tcl_
edc0: 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
edd0: 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
ede0: 65 73 74 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  est3_Init(Tcl_In
edf0: 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
ee00: 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
ee10: 74 34 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  t4_Init(Tcl_Inte
ee20: 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
ee30: 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 35   int Sqlitetest5
ee40: 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
ee50: 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
ee60: 6e 74 20 4d 64 35 5f 49 6e 69 74 28 54 63 6c 5f  nt Md5_Init(Tcl_
ee70: 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
ee80: 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
ee90: 65 73 74 73 73 65 5f 49 6e 69 74 28 54 63 6c 5f  estsse_Init(Tcl_
eea0: 49 6e 74 65 72 70 2a 29 3b 0a 0a 20 20 20 20 53  Interp*);..    S
eeb0: 71 6c 69 74 65 74 65 73 74 31 5f 49 6e 69 74 28  qlitetest1_Init(
eec0: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
eed0: 69 74 65 74 65 73 74 32 5f 49 6e 69 74 28 69 6e  itetest2_Init(in
eee0: 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
eef0: 65 74 65 73 74 33 5f 49 6e 69 74 28 69 6e 74 65  etest3_Init(inte
ef00: 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
ef10: 65 73 74 34 5f 49 6e 69 74 28 69 6e 74 65 72 70  est4_Init(interp
ef20: 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
ef30: 74 35 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  t5_Init(interp);
ef40: 0a 20 20 20 20 4d 64 35 5f 49 6e 69 74 28 69 6e  .    Md5_Init(in
ef50: 74 65 72 70 29 3b 0a 23 69 66 64 65 66 20 53 51  terp);.#ifdef SQ
ef60: 4c 49 54 45 5f 53 53 45 0a 20 20 20 20 53 71 6c  LITE_SSE.    Sql
ef70: 69 74 65 74 65 73 74 73 73 65 5f 49 6e 69 74 28  itetestsse_Init(
ef80: 69 6e 74 65 72 70 29 3b 0a 23 65 6e 64 69 66 0a  interp);.#endif.
ef90: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
efa0: 20 61 72 67 63 3e 3d 32 20 7c 7c 20 54 43 4c 53   argc>=2 || TCLS
efb0: 48 3d 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74 20  H==2 ){.    int 
efc0: 69 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 56 61  i;.    Tcl_SetVa
efd0: 72 28 69 6e 74 65 72 70 2c 22 61 72 67 76 30 22  r(interp,"argv0"
efe0: 2c 61 72 67 76 5b 31 5d 2c 54 43 4c 5f 47 4c 4f  ,argv[1],TCL_GLO
eff0: 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 54  BAL_ONLY);.    T
f000: 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70  cl_SetVar(interp
f010: 2c 22 61 72 67 76 22 2c 20 22 22 2c 20 54 43 4c  ,"argv", "", TCL
f020: 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20  _GLOBAL_ONLY);. 
f030: 20 20 20 66 6f 72 28 69 3d 33 2d 54 43 4c 53 48     for(i=3-TCLSH
f040: 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a  ; i<argc; i++){.
f050: 20 20 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72        Tcl_SetVar
f060: 28 69 6e 74 65 72 70 2c 20 22 61 72 67 76 22 2c  (interp, "argv",
f070: 20 61 72 67 76 5b 69 5d 2c 0a 20 20 20 20 20 20   argv[i],.      
f080: 20 20 20 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f      TCL_GLOBAL_O
f090: 4e 4c 59 20 7c 20 54 43 4c 5f 4c 49 53 54 5f 45  NLY | TCL_LIST_E
f0a0: 4c 45 4d 45 4e 54 20 7c 20 54 43 4c 5f 41 50 50  LEMENT | TCL_APP
f0b0: 45 4e 44 5f 56 41 4c 55 45 29 3b 0a 20 20 20 20  END_VALUE);.    
f0c0: 7d 0a 20 20 20 20 69 66 28 20 54 43 4c 53 48 3d  }.    if( TCLSH=
f0d0: 3d 31 20 26 26 20 54 63 6c 5f 45 76 61 6c 46 69  =1 && Tcl_EvalFi
f0e0: 6c 65 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  le(interp, argv[
f0f0: 31 5d 29 21 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20  1])!=TCL_OK ){. 
f100: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
f110: 2a 7a 49 6e 66 6f 20 3d 20 54 63 6c 5f 47 65 74  *zInfo = Tcl_Get
f120: 56 61 72 28 69 6e 74 65 72 70 2c 20 22 65 72 72  Var(interp, "err
f130: 6f 72 49 6e 66 6f 22 2c 20 54 43 4c 5f 47 4c 4f  orInfo", TCL_GLO
f140: 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 20  BAL_ONLY);.     
f150: 20 69 66 28 20 7a 49 6e 66 6f 3d 3d 30 20 29 20   if( zInfo==0 ) 
f160: 7a 49 6e 66 6f 20 3d 20 69 6e 74 65 72 70 2d 3e  zInfo = interp->
f170: 72 65 73 75 6c 74 3b 0a 20 20 20 20 20 20 66 70  result;.      fp
f180: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25 73  rintf(stderr,"%s
f190: 3a 20 25 73 5c 6e 22 2c 20 2a 61 72 67 76 2c 20  : %s\n", *argv, 
f1a0: 7a 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 72 65  zInfo);.      re
f1b0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
f1c0: 7d 0a 20 20 69 66 28 20 61 72 67 63 3c 3d 31 20  }.  if( argc<=1 
f1d0: 7c 7c 20 54 43 4c 53 48 3d 3d 32 20 29 7b 0a 20  || TCLSH==2 ){. 
f1e0: 20 20 20 54 63 6c 5f 47 6c 6f 62 61 6c 45 76 61     Tcl_GlobalEva
f1f0: 6c 28 69 6e 74 65 72 70 2c 20 7a 4d 61 69 6e 6c  l(interp, zMainl
f200: 6f 6f 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  oop);.  }.  retu
f210: 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 0;.}.#endif /
f220: 2a 20 54 43 4c 53 48 20 2a 2f 0a 0a 23 65 6e 64  * TCLSH */..#end
f230: 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 4e  if /* !defined(N
f240: 4f 5f 54 43 4c 29 20 2a 2f 0a                    O_TCL) */.