/ Hex Artifact Content
Login

Artifact b8014393a96a9781bb635c8b1f52fc9b77a2bfcf:


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 2e 20 20 41 70 70 65 6e 64 20 74 68 69  ite.  Append thi
01a0: 73 20 66 69 6c 65 20 74 6f 20 73 71 6c 69 74 65  s file to sqlite
01b0: 33 2e 63 20 61 6e 64 0a 2a 2a 20 63 6f 6d 70 69  3.c and.** compi
01c0: 6c 65 20 74 68 65 20 77 68 6f 6c 65 20 74 68 69  le the whole thi
01d0: 6e 67 20 74 6f 20 62 75 69 6c 64 20 61 20 54 43  ng to build a TC
01e0: 4c 2d 65 6e 61 62 6c 65 64 20 76 65 72 73 69 6f  L-enabled versio
01f0: 6e 20 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2a 0a  n of SQLite..**.
0200: 2a 2a 20 43 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  ** Compile-time 
0210: 6f 70 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20  options:.**.**  
0220: 2d 44 54 43 4c 53 48 3d 31 20 20 20 20 20 20 20  -DTCLSH=1       
0230: 20 20 20 20 20 20 41 64 64 20 61 20 22 6d 61 69        Add a "mai
0240: 6e 28 29 22 20 72 6f 75 74 69 6e 65 20 74 68 61  n()" routine tha
0250: 74 20 77 6f 72 6b 73 20 61 73 20 61 20 74 63 6c  t works as a tcl
0260: 73 68 2e 0a 2a 2a 0a 2a 2a 20 20 2d 44 53 51 4c  sh..**.**  -DSQL
0270: 49 54 45 5f 54 43 4c 4d 44 35 20 20 20 20 20 20  ITE_TCLMD5      
0280: 20 57 68 65 6e 20 75 73 65 64 20 69 6e 20 63 6f   When used in co
0290: 6e 6a 75 63 74 69 6f 6e 20 77 69 74 68 20 2d 44  njuction with -D
02a0: 54 43 4c 53 48 3d 31 2c 20 61 64 64 0a 2a 2a 20  TCLSH=1, add.** 
02b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
02c0: 20 20 20 20 20 20 20 66 6f 75 72 20 6e 65 77 20         four new 
02d0: 63 6f 6d 6d 61 6e 64 73 20 74 6f 20 74 68 65 20  commands to the 
02e0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
02f0: 66 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  for.**          
0300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 65                ge
0310: 6e 65 72 61 74 69 6e 67 20 4d 44 35 20 63 68 65  nerating MD5 che
0320: 63 6b 73 75 6d 73 3a 20 20 6d 64 35 2c 20 6d 64  cksums:  md5, md
0330: 35 66 69 6c 65 2c 0a 2a 2a 20 20 20 20 20 20 20  5file,.**       
0340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0350: 20 6d 64 35 2d 31 30 78 38 2c 20 61 6e 64 20 6d   md5-10x8, and m
0360: 64 35 66 69 6c 65 2d 31 30 78 38 2e 0a 2a 2a 0a  d5file-10x8..**.
0370: 2a 2a 20 20 2d 44 53 51 4c 49 54 45 5f 54 45 53  **  -DSQLITE_TES
0380: 54 20 20 20 20 20 20 20 20 20 57 68 65 6e 20 75  T         When u
0390: 73 65 64 20 69 6e 20 63 6f 6e 6a 75 63 74 69 6f  sed in conjuctio
03a0: 6e 20 77 69 74 68 20 2d 44 54 43 4c 53 48 3d 31  n with -DTCLSH=1
03b0: 2c 20 61 64 64 0a 2a 2a 20 20 20 20 20 20 20 20  , add.**        
03c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
03d0: 68 75 6e 64 72 65 64 73 20 6f 66 20 6e 65 77 20  hundreds of new 
03e0: 63 6f 6d 6d 61 6e 64 73 20 75 73 65 64 20 66 6f  commands used fo
03f0: 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20 20 20 20  r testing.**    
0400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0410: 20 20 20 20 53 51 4c 69 74 65 2e 20 20 54 68 69      SQLite.  Thi
0420: 73 20 6f 70 74 69 6f 6e 20 69 6d 70 6c 69 65 73  s option implies
0430: 20 2d 44 53 51 4c 49 54 45 5f 54 43 4c 4d 44 35   -DSQLITE_TCLMD5
0440: 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 72  ..*/../*.** If r
0450: 65 71 75 65 73 74 65 64 2c 20 69 6e 63 6c 75 64  equested, includ
0460: 65 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 6d  e the SQLite com
0470: 70 69 6c 65 72 20 6f 70 74 69 6f 6e 73 20 66 69  piler options fi
0480: 6c 65 20 66 6f 72 20 4d 53 56 43 2e 0a 2a 2f 0a  le for MSVC..*/.
0490: 23 69 66 20 64 65 66 69 6e 65 64 28 49 4e 43 4c  #if defined(INCL
04a0: 55 44 45 5f 4d 53 56 43 5f 48 29 0a 23 69 6e 63  UDE_MSVC_H).#inc
04b0: 6c 75 64 65 20 22 6d 73 76 63 2e 68 22 0a 23 65  lude "msvc.h".#e
04c0: 6e 64 69 66 0a 0a 23 69 6e 63 6c 75 64 65 20 22  ndif..#include "
04d0: 74 63 6c 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  tcl.h".#include 
04e0: 3c 65 72 72 6e 6f 2e 68 3e 0a 0a 2f 2a 0a 2a 2a  <errno.h>../*.**
04f0: 20 53 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c   Some additional
0500: 20 69 6e 63 6c 75 64 65 20 66 69 6c 65 73 20 61   include files a
0510: 72 65 20 6e 65 65 64 65 64 20 69 66 20 74 68 69  re needed if thi
0520: 73 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a  s file is not.**
0530: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
0540: 20 61 6d 61 6c 67 61 6d 61 74 69 6f 6e 2e 0a 2a   amalgamation..*
0550: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
0560: 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 0a 23 20  _AMALGAMATION.# 
0570: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33  include "sqlite3
0580: 2e 68 22 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73  .h".# include <s
0590: 74 64 6c 69 62 2e 68 3e 0a 23 20 69 6e 63 6c 75  tdlib.h>.# inclu
05a0: 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 20  de <string.h>.# 
05b0: 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e  include <assert.
05c0: 68 3e 0a 20 20 74 79 70 65 64 65 66 20 75 6e 73  h>.  typedef uns
05d0: 69 67 6e 65 64 20 63 68 61 72 20 75 38 3b 0a 23  igned char u8;.#
05e0: 65 6e 64 69 66 0a 23 69 6e 63 6c 75 64 65 20 3c  endif.#include <
05f0: 63 74 79 70 65 2e 68 3e 0a 0a 2f 2a 20 55 73 65  ctype.h>../* Use
0600: 64 20 74 6f 20 67 65 74 20 74 68 65 20 63 75 72  d to get the cur
0610: 72 65 6e 74 20 70 72 6f 63 65 73 73 20 49 44 20  rent process ID 
0620: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
0630: 5f 57 49 4e 33 32 29 0a 23 20 69 6e 63 6c 75 64  _WIN32).# includ
0640: 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 20 64  e <unistd.h>.# d
0650: 65 66 69 6e 65 20 47 45 54 50 49 44 20 67 65 74  efine GETPID get
0660: 70 69 64 0a 23 65 6c 69 66 20 21 64 65 66 69 6e  pid.#elif !defin
0670: 65 64 28 5f 57 49 4e 33 32 5f 57 43 45 29 0a 23  ed(_WIN32_WCE).#
0680: 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 41   ifndef SQLITE_A
0690: 4d 41 4c 47 41 4d 41 54 49 4f 4e 0a 23 20 20 64  MALGAMATION.#  d
06a0: 65 66 69 6e 65 20 57 49 4e 33 32 5f 4c 45 41 4e  efine WIN32_LEAN
06b0: 5f 41 4e 44 5f 4d 45 41 4e 0a 23 20 20 69 6e 63  _AND_MEAN.#  inc
06c0: 6c 75 64 65 20 3c 77 69 6e 64 6f 77 73 2e 68 3e  lude <windows.h>
06d0: 0a 23 20 65 6e 64 69 66 0a 23 20 64 65 66 69 6e  .# endif.# defin
06e0: 65 20 47 45 54 50 49 44 20 28 69 6e 74 29 47 65  e GETPID (int)Ge
06f0: 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
0700: 64 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20  d.#endif../*. * 
0710: 57 69 6e 64 6f 77 73 20 6e 65 65 64 73 20 74 6f  Windows needs to
0720: 20 6b 6e 6f 77 20 77 68 69 63 68 20 73 79 6d 62   know which symb
0730: 6f 6c 73 20 74 6f 20 65 78 70 6f 72 74 2e 20 20  ols to export.  
0740: 55 6e 69 78 20 64 6f 65 73 20 6e 6f 74 2e 0a 20  Unix does not.. 
0750: 2a 20 42 55 49 4c 44 5f 73 71 6c 69 74 65 20 73  * BUILD_sqlite s
0760: 68 6f 75 6c 64 20 62 65 20 75 6e 64 65 66 69 6e  hould be undefin
0770: 65 64 20 66 6f 72 20 55 6e 69 78 2e 0a 20 2a 2f  ed for Unix.. */
0780: 0a 23 69 66 64 65 66 20 42 55 49 4c 44 5f 73 71  .#ifdef BUILD_sq
0790: 6c 69 74 65 0a 23 75 6e 64 65 66 20 54 43 4c 5f  lite.#undef TCL_
07a0: 53 54 4f 52 41 47 45 5f 43 4c 41 53 53 0a 23 64  STORAGE_CLASS.#d
07b0: 65 66 69 6e 65 20 54 43 4c 5f 53 54 4f 52 41 47  efine TCL_STORAG
07c0: 45 5f 43 4c 41 53 53 20 44 4c 4c 45 58 50 4f 52  E_CLASS DLLEXPOR
07d0: 54 0a 23 65 6e 64 69 66 20 2f 2a 20 42 55 49 4c  T.#endif /* BUIL
07e0: 44 5f 73 71 6c 69 74 65 20 2a 2f 0a 0a 23 64 65  D_sqlite */..#de
07f0: 66 69 6e 65 20 4e 55 4d 5f 50 52 45 50 41 52 45  fine NUM_PREPARE
0800: 44 5f 53 54 4d 54 53 20 31 30 0a 23 64 65 66 69  D_STMTS 10.#defi
0810: 6e 65 20 4d 41 58 5f 50 52 45 50 41 52 45 44 5f  ne MAX_PREPARED_
0820: 53 54 4d 54 53 20 31 30 30 0a 0a 2f 2a 20 46 6f  STMTS 100../* Fo
0830: 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
0840: 6e 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  n */.typedef str
0850: 75 63 74 20 53 71 6c 69 74 65 44 62 20 53 71 6c  uct SqliteDb Sql
0860: 69 74 65 44 62 3b 0a 0a 2f 2a 0a 2a 2a 20 4e 65  iteDb;../*.** Ne
0870: 77 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20  w SQL functions 
0880: 63 61 6e 20 62 65 20 63 72 65 61 74 65 64 20 61  can be created a
0890: 73 20 54 43 4c 20 73 63 72 69 70 74 73 2e 20 20  s TCL scripts.  
08a0: 45 61 63 68 20 73 75 63 68 20 66 75 6e 63 74 69  Each such functi
08b0: 6f 6e 0a 2a 2a 20 69 73 20 64 65 73 63 72 69 62  on.** is describ
08c0: 65 64 20 62 79 20 61 6e 20 69 6e 73 74 61 6e 63  ed by an instanc
08d0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
08e0: 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  ng structure..*/
08f0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0900: 53 71 6c 46 75 6e 63 20 53 71 6c 46 75 6e 63 3b  SqlFunc SqlFunc;
0910: 0a 73 74 72 75 63 74 20 53 71 6c 46 75 6e 63 20  .struct SqlFunc 
0920: 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  {.  Tcl_Interp *
0930: 69 6e 74 65 72 70 3b 20 20 20 2f 2a 20 54 68 65  interp;   /* The
0940: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 20 74   TCL interpret t
0950: 6f 20 65 78 65 63 75 74 65 20 74 68 65 20 66 75  o execute the fu
0960: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
0970: 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 20 20 20  Obj *pScript;   
0980: 20 20 2f 2a 20 54 68 65 20 54 63 6c 5f 4f 62 6a    /* The Tcl_Obj
0990: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
09a0: 6f 66 20 74 68 65 20 73 63 72 69 70 74 20 2a 2f  of the script */
09b0: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
09c0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  ;        /* Data
09d0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
09e0: 74 68 61 74 20 6f 77 6e 73 20 74 68 69 73 20 66  that owns this f
09f0: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  unction */.  int
0a00: 20 75 73 65 45 76 61 6c 4f 62 6a 76 3b 20 20 20   useEvalObjv;   
0a10: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 74     /* True if it
0a20: 20 69 73 20 73 61 66 65 20 74 6f 20 75 73 65 20   is safe to use 
0a30: 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 20 2a 2f 0a  Tcl_EvalObjv */.
0a40: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20    char *zName;  
0a50: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
0a60: 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
0a70: 20 2a 2f 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70   */.  SqlFunc *p
0a80: 4e 65 78 74 3b 20 20 20 20 20 20 20 2f 2a 20 4e  Next;       /* N
0a90: 65 78 74 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 20  ext function on 
0aa0: 74 68 65 20 6c 69 73 74 20 6f 66 20 74 68 65 6d  the list of them
0ab0: 20 61 6c 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a   all */.};../*.*
0ac0: 2a 20 4e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20  * New collation 
0ad0: 73 65 71 75 65 6e 63 65 73 20 66 75 6e 63 74 69  sequences functi
0ae0: 6f 6e 20 63 61 6e 20 62 65 20 63 72 65 61 74 65  on can be create
0af0: 64 20 61 73 20 54 43 4c 20 73 63 72 69 70 74 73  d as TCL scripts
0b00: 2e 20 20 45 61 63 68 20 73 75 63 68 0a 2a 2a 20  .  Each such.** 
0b10: 66 75 6e 63 74 69 6f 6e 20 69 73 20 64 65 73 63  function is desc
0b20: 72 69 62 65 64 20 62 79 20 61 6e 20 69 6e 73 74  ribed by an inst
0b30: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
0b40: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e  owing structure.
0b50: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
0b60: 63 74 20 53 71 6c 43 6f 6c 6c 61 74 65 20 53 71  ct SqlCollate Sq
0b70: 6c 43 6f 6c 6c 61 74 65 3b 0a 73 74 72 75 63 74  lCollate;.struct
0b80: 20 53 71 6c 43 6f 6c 6c 61 74 65 20 7b 0a 20 20   SqlCollate {.  
0b90: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
0ba0: 72 70 3b 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  rp;   /* The TCL
0bb0: 20 69 6e 74 65 72 70 72 65 74 20 74 6f 20 65 78   interpret to ex
0bc0: 65 63 75 74 65 20 74 68 65 20 66 75 6e 63 74 69  ecute the functi
0bd0: 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53  on */.  char *zS
0be0: 63 72 69 70 74 3b 20 20 20 20 20 20 20 20 2f 2a  cript;        /*
0bf0: 20 54 68 65 20 73 63 72 69 70 74 20 74 6f 20 62   The script to b
0c00: 65 20 72 75 6e 20 2a 2f 0a 20 20 53 71 6c 43 6f  e run */.  SqlCo
0c10: 6c 6c 61 74 65 20 2a 70 4e 65 78 74 3b 20 20 20  llate *pNext;   
0c20: 20 2f 2a 20 4e 65 78 74 20 66 75 6e 63 74 69 6f   /* Next functio
0c30: 6e 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 6f 66  n on the list of
0c40: 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 7d 3b 0a   them all */.};.
0c50: 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 64 20  ./*.** Prepared 
0c60: 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 63  statements are c
0c70: 61 63 68 65 64 20 66 6f 72 20 66 61 73 74 65 72  ached for faster
0c80: 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 45 61 63   execution.  Eac
0c90: 68 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73 74  h prepared.** st
0ca0: 61 74 65 6d 65 6e 74 20 69 73 20 64 65 73 63 72  atement is descr
0cb0: 69 62 65 64 20 62 79 20 61 6e 20 69 6e 73 74 61  ibed by an insta
0cc0: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
0cd0: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
0ce0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
0cf0: 74 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d  t SqlPreparedStm
0d00: 74 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d  t SqlPreparedStm
0d10: 74 3b 0a 73 74 72 75 63 74 20 53 71 6c 50 72 65  t;.struct SqlPre
0d20: 70 61 72 65 64 53 74 6d 74 20 7b 0a 20 20 53 71  paredStmt {.  Sq
0d30: 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70  lPreparedStmt *p
0d40: 4e 65 78 74 3b 20 20 2f 2a 20 4e 65 78 74 20 69  Next;  /* Next i
0d50: 6e 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 2a 2f  n linked list */
0d60: 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74  .  SqlPreparedSt
0d70: 6d 74 20 2a 70 50 72 65 76 3b 20 20 2f 2a 20 50  mt *pPrev;  /* P
0d80: 72 65 76 69 6f 75 73 20 6f 6e 20 74 68 65 20 6c  revious on the l
0d90: 69 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ist */.  sqlite3
0da0: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20  _stmt *pStmt;   
0db0: 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65    /* The prepare
0dc0: 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  d statement */. 
0dd0: 20 69 6e 74 20 6e 53 71 6c 3b 20 20 20 20 20 20   int nSql;      
0de0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 68 61            /* cha
0df0: 72 73 20 69 6e 20 7a 53 71 6c 5b 5d 20 2a 2f 0a  rs in zSql[] */.
0e00: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
0e10: 71 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 65  ql;        /* Te
0e20: 78 74 20 6f 66 20 74 68 65 20 53 51 4c 20 73 74  xt of the SQL st
0e30: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
0e40: 20 6e 50 61 72 6d 3b 20 20 20 20 20 20 20 20 20   nParm;         
0e50: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
0e60: 20 61 70 50 61 72 6d 20 61 72 72 61 79 20 2a 2f   apParm array */
0e70: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 50  .  Tcl_Obj **apP
0e80: 61 72 6d 3b 20 20 20 20 20 20 20 20 2f 2a 20 41  arm;        /* A
0e90: 72 72 61 79 20 6f 66 20 72 65 66 65 72 65 6e 63  rray of referenc
0ea0: 65 64 20 6f 62 6a 65 63 74 20 70 6f 69 6e 74 65  ed object pointe
0eb0: 72 73 20 2a 2f 0a 7d 3b 0a 0a 74 79 70 65 64 65  rs */.};..typede
0ec0: 66 20 73 74 72 75 63 74 20 49 6e 63 72 62 6c 6f  f struct Incrblo
0ed0: 62 43 68 61 6e 6e 65 6c 20 49 6e 63 72 62 6c 6f  bChannel Incrblo
0ee0: 62 43 68 61 6e 6e 65 6c 3b 0a 0a 2f 2a 0a 2a 2a  bChannel;../*.**
0ef0: 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e   There is one in
0f00: 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73  stance of this s
0f10: 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 61 63  tructure for eac
0f20: 68 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  h SQLite databas
0f30: 65 0a 2a 2a 20 74 68 61 74 20 68 61 73 20 62 65  e.** that has be
0f40: 65 6e 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65  en opened by the
0f50: 20 53 51 4c 69 74 65 20 54 43 4c 20 69 6e 74 65   SQLite TCL inte
0f60: 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rface..**.** If 
0f70: 74 68 69 73 20 6d 6f 64 75 6c 65 20 69 73 20 62  this module is b
0f80: 75 69 6c 74 20 77 69 74 68 20 53 51 4c 49 54 45  uilt with SQLITE
0f90: 5f 54 45 53 54 20 64 65 66 69 6e 65 64 20 28 74  _TEST defined (t
0fa0: 6f 20 63 72 65 61 74 65 20 74 68 65 20 53 51 4c  o create the SQL
0fb0: 69 74 65 0a 2a 2a 20 74 65 73 74 66 69 78 74 75  ite.** testfixtu
0fc0: 72 65 20 65 78 65 63 75 74 61 62 6c 65 29 2c 20  re executable), 
0fd0: 74 68 65 6e 20 69 74 20 6d 61 79 20 62 65 20 63  then it may be c
0fe0: 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73 65  onfigured to use
0ff0: 20 65 69 74 68 65 72 0a 2a 2a 20 73 71 6c 69 74   either.** sqlit
1000: 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 29 20  e3_prepare_v2() 
1010: 6f 72 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  or sqlite3_prepa
1020: 72 65 28 29 20 74 6f 20 70 72 65 70 61 72 65 20  re() to prepare 
1030: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  SQL statements..
1040: 2a 2a 20 49 66 20 53 71 6c 69 74 65 44 62 2e 62  ** If SqliteDb.b
1050: 4c 65 67 61 63 79 50 72 65 70 61 72 65 20 69 73  LegacyPrepare is
1060: 20 74 72 75 65 2c 20 73 71 6c 69 74 65 33 5f 70   true, sqlite3_p
1070: 72 65 70 61 72 65 28 29 20 69 73 20 75 73 65 64  repare() is used
1080: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53 71 6c 69  ..*/.struct Sqli
1090: 74 65 44 62 20 7b 0a 20 20 73 71 6c 69 74 65 33  teDb {.  sqlite3
10a0: 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
10b0: 20 20 20 20 2f 2a 20 54 68 65 20 22 72 65 61 6c      /* The "real
10c0: 22 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63  " database struc
10d0: 74 75 72 65 2e 20 4d 55 53 54 20 42 45 20 46 49  ture. MUST BE FI
10e0: 52 53 54 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  RST */.  Tcl_Int
10f0: 65 72 70 20 2a 69 6e 74 65 72 70 3b 20 20 20 20  erp *interp;    
1100: 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 74 65 72      /* The inter
1110: 70 72 65 74 65 72 20 75 73 65 64 20 66 6f 72 20  preter used for 
1120: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f  this database */
1130: 0a 20 20 63 68 61 72 20 2a 7a 42 75 73 79 3b 20  .  char *zBusy; 
1140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1150: 20 54 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   The busy callba
1160: 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  ck routine */.  
1170: 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 20 20  char *zCommit;  
1180: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1190: 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 63 61  e commit hook ca
11a0: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a  llback routine *
11b0: 2f 0a 20 20 63 68 61 72 20 2a 7a 54 72 61 63 65  /.  char *zTrace
11c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
11d0: 2a 20 54 68 65 20 74 72 61 63 65 20 63 61 6c 6c  * The trace call
11e0: 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a  back routine */.
11f0: 20 20 63 68 61 72 20 2a 7a 50 72 6f 66 69 6c 65    char *zProfile
1200: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1210: 54 68 65 20 70 72 6f 66 69 6c 65 20 63 61 6c 6c  The profile call
1220: 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a  back routine */.
1230: 20 20 63 68 61 72 20 2a 7a 50 72 6f 67 72 65 73    char *zProgres
1240: 73 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s;           /* 
1250: 54 68 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c  The progress cal
1260: 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f  lback routine */
1270: 0a 20 20 63 68 61 72 20 2a 7a 41 75 74 68 3b 20  .  char *zAuth; 
1280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1290: 20 54 68 65 20 61 75 74 68 6f 72 69 7a 61 74 69   The authorizati
12a0: 6f 6e 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74  on callback rout
12b0: 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73  ine */.  int dis
12c0: 61 62 6c 65 41 75 74 68 3b 20 20 20 20 20 20 20  ableAuth;       
12d0: 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 74      /* Disable t
12e0: 68 65 20 61 75 74 68 6f 72 69 7a 65 72 20 69 66  he authorizer if
12f0: 20 69 74 20 65 78 69 73 74 73 20 2a 2f 0a 20 20   it exists */.  
1300: 63 68 61 72 20 2a 7a 4e 75 6c 6c 3b 20 20 20 20  char *zNull;    
1310: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
1320: 78 74 20 74 6f 20 73 75 62 73 74 69 74 75 74 65  xt to substitute
1330: 20 66 6f 72 20 61 6e 20 53 51 4c 20 4e 55 4c 4c   for an SQL NULL
1340: 20 76 61 6c 75 65 20 2a 2f 0a 20 20 53 71 6c 46   value */.  SqlF
1350: 75 6e 63 20 2a 70 46 75 6e 63 3b 20 20 20 20 20  unc *pFunc;     
1360: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
1370: 66 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20  f SQL functions 
1380: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 55  */.  Tcl_Obj *pU
1390: 70 64 61 74 65 48 6f 6f 6b 3b 20 20 20 20 20 20  pdateHook;      
13a0: 2f 2a 20 55 70 64 61 74 65 20 68 6f 6f 6b 20 73  /* Update hook s
13b0: 63 72 69 70 74 20 28 69 66 20 61 6e 79 29 20 2a  cript (if any) *
13c0: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 6f  /.  Tcl_Obj *pRo
13d0: 6c 6c 62 61 63 6b 48 6f 6f 6b 3b 20 20 20 20 2f  llbackHook;    /
13e0: 2a 20 52 6f 6c 6c 62 61 63 6b 20 68 6f 6f 6b 20  * Rollback hook 
13f0: 73 63 72 69 70 74 20 28 69 66 20 61 6e 79 29 20  script (if any) 
1400: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 57  */.  Tcl_Obj *pW
1410: 61 6c 48 6f 6f 6b 3b 20 20 20 20 20 20 20 20 20  alHook;         
1420: 2f 2a 20 57 41 4c 20 68 6f 6f 6b 20 73 63 72 69  /* WAL hook scri
1430: 70 74 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20  pt (if any) */. 
1440: 20 54 63 6c 5f 4f 62 6a 20 2a 70 55 6e 6c 6f 63   Tcl_Obj *pUnloc
1450: 6b 4e 6f 74 69 66 79 3b 20 20 20 20 2f 2a 20 55  kNotify;    /* U
1460: 6e 6c 6f 63 6b 20 6e 6f 74 69 66 79 20 73 63 72  nlock notify scr
1470: 69 70 74 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a  ipt (if any) */.
1480: 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 43    SqlCollate *pC
1490: 6f 6c 6c 61 74 65 3b 20 20 20 20 20 20 2f 2a 20  ollate;      /* 
14a0: 4c 69 73 74 20 6f 66 20 53 51 4c 20 63 6f 6c 6c  List of SQL coll
14b0: 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 73 20  ation functions 
14c0: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
14d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 6f  /* Return code o
14f0: 66 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71  f most recent sq
1500: 6c 69 74 65 33 5f 65 78 65 63 28 29 20 2a 2f 0a  lite3_exec() */.
1510: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6f 6c 6c    Tcl_Obj *pColl
1520: 61 74 65 4e 65 65 64 65 64 3b 20 20 20 2f 2a 20  ateNeeded;   /* 
1530: 43 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65 64 65 64  Collation needed
1540: 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 53 71 6c   script */.  Sql
1550: 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 73 74  PreparedStmt *st
1560: 6d 74 4c 69 73 74 3b 20 2f 2a 20 4c 69 73 74 20  mtList; /* List 
1570: 6f 66 20 70 72 65 70 61 72 65 64 20 73 74 61 74  of prepared stat
1580: 65 6d 65 6e 74 73 2a 2f 0a 20 20 53 71 6c 50 72  ements*/.  SqlPr
1590: 65 70 61 72 65 64 53 74 6d 74 20 2a 73 74 6d 74  eparedStmt *stmt
15a0: 4c 61 73 74 3b 20 2f 2a 20 4c 61 73 74 20 73 74  Last; /* Last st
15b0: 61 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 6c  atement in the l
15c0: 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 78  ist */.  int max
15d0: 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stmt;           
15e0: 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20      /* The next 
15f0: 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
1600: 66 20 73 74 6d 74 4c 69 73 74 20 2a 2f 0a 20 20  f stmtList */.  
1610: 69 6e 74 20 6e 53 74 6d 74 3b 20 20 20 20 20 20  int nStmt;      
1620: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1630: 6d 62 65 72 20 6f 66 20 73 74 61 74 65 6d 65 6e  mber of statemen
1640: 74 73 20 69 6e 20 73 74 6d 74 4c 69 73 74 20 2a  ts in stmtList *
1650: 2f 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e  /.  IncrblobChan
1660: 6e 65 6c 20 2a 70 49 6e 63 72 62 6c 6f 62 3b 2f  nel *pIncrblob;/
1670: 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  * Linked list of
1680: 20 6f 70 65 6e 20 69 6e 63 72 62 6c 6f 62 20 63   open incrblob c
1690: 68 61 6e 6e 65 6c 73 20 2a 2f 0a 20 20 69 6e 74  hannels */.  int
16a0: 20 6e 53 74 65 70 2c 20 6e 53 6f 72 74 2c 20 6e   nStep, nSort, n
16b0: 49 6e 64 65 78 3b 20 20 2f 2a 20 53 74 61 74 69  Index;  /* Stati
16c0: 73 74 69 63 73 20 66 6f 72 20 6d 6f 73 74 20 72  stics for most r
16d0: 65 63 65 6e 74 20 6f 70 65 72 61 74 69 6f 6e 20  ecent operation 
16e0: 2a 2f 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 61  */.  int nTransa
16f0: 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  ction;          
1700: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 73  /* Number of nes
1710: 74 65 64 20 5b 74 72 61 6e 73 61 63 74 69 6f 6e  ted [transaction
1720: 5d 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23 69 66  ] methods */.#if
1730: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
1740: 20 20 69 6e 74 20 62 4c 65 67 61 63 79 50 72 65    int bLegacyPre
1750: 70 61 72 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  pare;        /* 
1760: 54 72 75 65 20 74 6f 20 75 73 65 20 73 71 6c 69  True to use sqli
1770: 74 65 33 5f 70 72 65 70 61 72 65 28 29 20 2a 2f  te3_prepare() */
1780: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 73 74 72 75  .#endif.};..stru
1790: 63 74 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  ct IncrblobChann
17a0: 65 6c 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 62  el {.  sqlite3_b
17b0: 6c 6f 62 20 2a 70 42 6c 6f 62 3b 20 20 20 20 20  lob *pBlob;     
17c0: 20 2f 2a 20 73 71 6c 69 74 65 33 20 62 6c 6f 62   /* sqlite3 blob
17d0: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 53 71 6c   handle */.  Sql
17e0: 69 74 65 44 62 20 2a 70 44 62 3b 20 20 20 20 20  iteDb *pDb;     
17f0: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69         /* Associ
1800: 61 74 65 64 20 64 61 74 61 62 61 73 65 20 63 6f  ated database co
1810: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nnection */.  in
1820: 74 20 69 53 65 65 6b 3b 20 20 20 20 20 20 20 20  t iSeek;        
1830: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
1840: 6e 74 20 73 65 65 6b 20 6f 66 66 73 65 74 20 2a  nt seek offset *
1850: 2f 0a 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20  /.  Tcl_Channel 
1860: 63 68 61 6e 6e 65 6c 3b 20 20 20 20 20 20 2f 2a  channel;      /*
1870: 20 43 68 61 6e 6e 65 6c 20 69 64 65 6e 74 69 66   Channel identif
1880: 69 65 72 20 2a 2f 0a 20 20 49 6e 63 72 62 6c 6f  ier */.  Incrblo
1890: 62 43 68 61 6e 6e 65 6c 20 2a 70 4e 65 78 74 3b  bChannel *pNext;
18a0: 20 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73     /* Linked lis
18b0: 74 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 69 6e  t of all open in
18c0: 63 72 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 73 20  crblob channels 
18d0: 2a 2f 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61  */.  IncrblobCha
18e0: 6e 6e 65 6c 20 2a 70 50 72 65 76 3b 20 20 20 2f  nnel *pPrev;   /
18f0: 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  * Linked list of
1900: 20 61 6c 6c 20 6f 70 65 6e 20 69 6e 63 72 62 6c   all open incrbl
1910: 6f 62 20 63 68 61 6e 6e 65 6c 73 20 2a 2f 0a 7d  ob channels */.}
1920: 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  ;../*.** Compute
1930: 20 61 20 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   a string length
1940: 20 74 68 61 74 20 69 73 20 6c 69 6d 69 74 65 64   that is limited
1950: 20 74 6f 20 77 68 61 74 20 63 61 6e 20 62 65 20   to what can be 
1960: 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 6c 6f 77  stored in.** low
1970: 65 72 20 33 30 20 62 69 74 73 20 6f 66 20 61 20  er 30 bits of a 
1980: 33 32 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e  32-bit signed in
1990: 74 65 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  teger..*/.static
19a0: 20 69 6e 74 20 73 74 72 6c 65 6e 33 30 28 63 6f   int strlen30(co
19b0: 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
19c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 20 3d  const char *z2 =
19d0: 20 7a 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a 32   z;.  while( *z2
19e0: 20 29 7b 20 7a 32 2b 2b 3b 20 7d 0a 20 20 72 65   ){ z2++; }.  re
19f0: 74 75 72 6e 20 30 78 33 66 66 66 66 66 66 66 20  turn 0x3fffffff 
1a00: 26 20 28 69 6e 74 29 28 7a 32 20 2d 20 7a 29 3b  & (int)(z2 - z);
1a10: 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .}...#ifndef SQL
1a20: 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
1a30: 42 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c  B./*.** Close al
1a40: 6c 20 69 6e 63 72 62 6c 6f 62 20 63 68 61 6e 6e  l incrblob chann
1a50: 65 6c 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67  els opened using
1a60: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
1a70: 74 69 6f 6e 20 70 44 62 2e 0a 2a 2a 20 54 68 69  tion pDb..** Thi
1a80: 73 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  s is called when
1a90: 20 73 68 75 74 74 69 6e 67 20 64 6f 77 6e 20 74   shutting down t
1aa0: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
1ab0: 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ection..*/.stati
1ac0: 63 20 76 6f 69 64 20 63 6c 6f 73 65 49 6e 63 72  c void closeIncr
1ad0: 62 6c 6f 62 43 68 61 6e 6e 65 6c 73 28 53 71 6c  blobChannels(Sql
1ae0: 69 74 65 44 62 20 2a 70 44 62 29 7b 0a 20 20 49  iteDb *pDb){.  I
1af0: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a  ncrblobChannel *
1b00: 70 3b 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61  p;.  IncrblobCha
1b10: 6e 6e 65 6c 20 2a 70 4e 65 78 74 3b 0a 0a 20 20  nnel *pNext;..  
1b20: 66 6f 72 28 70 3d 70 44 62 2d 3e 70 49 6e 63 72  for(p=pDb->pIncr
1b30: 62 6c 6f 62 3b 20 70 3b 20 70 3d 70 4e 65 78 74  blob; p; p=pNext
1b40: 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
1b50: 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 20 20 2f 2a  ->pNext;..    /*
1b60: 20 4e 6f 74 65 3a 20 43 61 6c 6c 69 6e 67 20 75   Note: Calling u
1b70: 6e 72 65 67 69 73 74 65 72 20 68 65 72 65 20 63  nregister here c
1b80: 61 6c 6c 20 54 63 6c 5f 43 6c 6f 73 65 20 6f 6e  all Tcl_Close on
1b90: 20 74 68 65 20 69 6e 63 72 62 6c 6f 62 20 63 68   the incrblob ch
1ba0: 61 6e 6e 65 6c 2c 20 0a 20 20 20 20 2a 2a 20 77  annel, .    ** w
1bb0: 68 69 63 68 20 64 65 6c 65 74 65 73 20 74 68 65  hich deletes the
1bc0: 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c   IncrblobChannel
1bd0: 20 73 74 72 75 63 74 75 72 65 20 61 74 20 2a 70   structure at *p
1be0: 2e 20 53 6f 20 64 6f 20 6e 6f 74 0a 20 20 20 20  . So do not.    
1bf0: 2a 2a 20 63 61 6c 6c 20 54 63 6c 5f 46 72 65 65  ** call Tcl_Free
1c00: 28 29 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a  () here..    */.
1c10: 20 20 20 20 54 63 6c 5f 55 6e 72 65 67 69 73 74      Tcl_Unregist
1c20: 65 72 43 68 61 6e 6e 65 6c 28 70 44 62 2d 3e 69  erChannel(pDb->i
1c30: 6e 74 65 72 70 2c 20 70 2d 3e 63 68 61 6e 6e 65  nterp, p->channe
1c40: 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  l);.  }.}../*.**
1c50: 20 43 6c 6f 73 65 20 61 6e 20 69 6e 63 72 65 6d   Close an increm
1c60: 65 6e 74 61 6c 20 62 6c 6f 62 20 63 68 61 6e 6e  ental blob chann
1c70: 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
1c80: 74 20 69 6e 63 72 62 6c 6f 62 43 6c 6f 73 65 28  t incrblobClose(
1c90: 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61  ClientData insta
1ca0: 6e 63 65 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74  nceData, Tcl_Int
1cb0: 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20  erp *interp){.  
1cc0: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20  IncrblobChannel 
1cd0: 2a 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68  *p = (IncrblobCh
1ce0: 61 6e 6e 65 6c 20 2a 29 69 6e 73 74 61 6e 63 65  annel *)instance
1cf0: 44 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Data;.  int rc =
1d00: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c   sqlite3_blob_cl
1d10: 6f 73 65 28 70 2d 3e 70 42 6c 6f 62 29 3b 0a 20  ose(p->pBlob);. 
1d20: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1d30: 2d 3e 70 44 62 2d 3e 64 62 3b 0a 0a 20 20 2f 2a  ->pDb->db;..  /*
1d40: 20 52 65 6d 6f 76 65 20 74 68 65 20 63 68 61 6e   Remove the chan
1d50: 6e 65 6c 20 66 72 6f 6d 20 74 68 65 20 53 71 6c  nel from the Sql
1d60: 69 74 65 44 62 2e 70 49 6e 63 72 62 6c 6f 62 20  iteDb.pIncrblob 
1d70: 6c 69 73 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70  list. */.  if( p
1d80: 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70  ->pNext ){.    p
1d90: 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
1da0: 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20   p->pPrev;.  }. 
1db0: 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 7b   if( p->pPrev ){
1dc0: 0a 20 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70  .    p->pPrev->p
1dd0: 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Next = p->pNext;
1de0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 44  .  }.  if( p->pD
1df0: 62 2d 3e 70 49 6e 63 72 62 6c 6f 62 3d 3d 70 20  b->pIncrblob==p 
1e00: 29 7b 0a 20 20 20 20 70 2d 3e 70 44 62 2d 3e 70  ){.    p->pDb->p
1e10: 49 6e 63 72 62 6c 6f 62 20 3d 20 70 2d 3e 70 4e  Incrblob = p->pN
1e20: 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  ext;.  }..  /* F
1e30: 72 65 65 20 74 68 65 20 49 6e 63 72 62 6c 6f 62  ree the Incrblob
1e40: 43 68 61 6e 6e 65 6c 20 73 74 72 75 63 74 75 72  Channel structur
1e50: 65 20 2a 2f 0a 20 20 54 63 6c 5f 46 72 65 65 28  e */.  Tcl_Free(
1e60: 28 63 68 61 72 20 2a 29 70 29 3b 0a 0a 20 20 69  (char *)p);..  i
1e70: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1e80: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52   ){.    Tcl_SetR
1e90: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
1ea0: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 65 72  har *)sqlite3_er
1eb0: 72 6d 73 67 28 64 62 29 2c 20 54 43 4c 5f 56 4f  rmsg(db), TCL_VO
1ec0: 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 72 65 74  LATILE);.    ret
1ed0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1ee0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
1ef0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  OK;.}../*.** Rea
1f00: 64 20 64 61 74 61 20 66 72 6f 6d 20 61 6e 20 69  d data from an i
1f10: 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20  ncremental blob 
1f20: 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74  channel..*/.stat
1f30: 69 63 20 69 6e 74 20 69 6e 63 72 62 6c 6f 62 49  ic int incrblobI
1f40: 6e 70 75 74 28 0a 20 20 43 6c 69 65 6e 74 44 61  nput(.  ClientDa
1f50: 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c  ta instanceData,
1f60: 20 0a 20 20 63 68 61 72 20 2a 62 75 66 2c 20 0a   .  char *buf, .
1f70: 20 20 69 6e 74 20 62 75 66 53 69 7a 65 2c 0a 20    int bufSize,. 
1f80: 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50   int *errorCodeP
1f90: 74 72 0a 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62  tr.){.  Incrblob
1fa0: 43 68 61 6e 6e 65 6c 20 2a 70 20 3d 20 28 49 6e  Channel *p = (In
1fb0: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 29  crblobChannel *)
1fc0: 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20  instanceData;.  
1fd0: 69 6e 74 20 6e 52 65 61 64 20 3d 20 62 75 66 53  int nRead = bufS
1fe0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ize;         /* 
1ff0: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
2000: 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e 74  to read */.  int
2010: 20 6e 42 6c 6f 62 3b 20 20 20 20 20 20 20 20 20   nBlob;         
2020: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
2030: 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62  al size of the b
2040: 6c 6f 62 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  lob */.  int rc;
2050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2060: 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 20        /* sqlite 
2070: 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 0a 20  error code */.. 
2080: 20 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33   nBlob = sqlite3
2090: 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70  _blob_bytes(p->p
20a0: 42 6c 6f 62 29 3b 0a 20 20 69 66 28 20 28 70 2d  Blob);.  if( (p-
20b0: 3e 69 53 65 65 6b 2b 6e 52 65 61 64 29 3e 6e 42  >iSeek+nRead)>nB
20c0: 6c 6f 62 20 29 7b 0a 20 20 20 20 6e 52 65 61 64  lob ){.    nRead
20d0: 20 3d 20 6e 42 6c 6f 62 2d 70 2d 3e 69 53 65 65   = nBlob-p->iSee
20e0: 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65  k;.  }.  if( nRe
20f0: 61 64 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ad<=0 ){.    ret
2100: 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 63  urn 0;.  }..  rc
2110: 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f   = sqlite3_blob_
2120: 72 65 61 64 28 70 2d 3e 70 42 6c 6f 62 2c 20 28  read(p->pBlob, (
2130: 76 6f 69 64 20 2a 29 62 75 66 2c 20 6e 52 65 61  void *)buf, nRea
2140: 64 2c 20 70 2d 3e 69 53 65 65 6b 29 3b 0a 20 20  d, p->iSeek);.  
2150: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2160: 4b 20 29 7b 0a 20 20 20 20 2a 65 72 72 6f 72 43  K ){.    *errorC
2170: 6f 64 65 50 74 72 20 3d 20 72 63 3b 0a 20 20 20  odePtr = rc;.   
2180: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a   return -1;.  }.
2190: 0a 20 20 70 2d 3e 69 53 65 65 6b 20 2b 3d 20 6e  .  p->iSeek += n
21a0: 52 65 61 64 3b 0a 20 20 72 65 74 75 72 6e 20 6e  Read;.  return n
21b0: 52 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  Read;.}../*.** W
21c0: 72 69 74 65 20 64 61 74 61 20 74 6f 20 61 6e 20  rite data to an 
21d0: 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62  incremental blob
21e0: 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61   channel..*/.sta
21f0: 74 69 63 20 69 6e 74 20 69 6e 63 72 62 6c 6f 62  tic int incrblob
2200: 4f 75 74 70 75 74 28 0a 20 20 43 6c 69 65 6e 74  Output(.  Client
2210: 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74  Data instanceDat
2220: 61 2c 20 0a 20 20 43 4f 4e 53 54 20 63 68 61 72  a, .  CONST char
2230: 20 2a 62 75 66 2c 20 0a 20 20 69 6e 74 20 74 6f   *buf, .  int to
2240: 57 72 69 74 65 2c 0a 20 20 69 6e 74 20 2a 65 72  Write,.  int *er
2250: 72 6f 72 43 6f 64 65 50 74 72 0a 29 7b 0a 20 20  rorCodePtr.){.  
2260: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20  IncrblobChannel 
2270: 2a 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68  *p = (IncrblobCh
2280: 61 6e 6e 65 6c 20 2a 29 69 6e 73 74 61 6e 63 65  annel *)instance
2290: 44 61 74 61 3b 0a 20 20 69 6e 74 20 6e 57 72 69  Data;.  int nWri
22a0: 74 65 20 3d 20 74 6f 57 72 69 74 65 3b 20 20 20  te = toWrite;   
22b0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
22c0: 66 20 62 79 74 65 73 20 74 6f 20 77 72 69 74 65  f bytes to write
22d0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 6c 6f 62 3b   */.  int nBlob;
22e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f0: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65     /* Total size
2300: 20 6f 66 20 74 68 65 20 62 6c 6f 62 20 2a 2f 0a   of the blob */.
2310: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
2320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2330: 2a 20 73 71 6c 69 74 65 20 65 72 72 6f 72 20 63  * sqlite error c
2340: 6f 64 65 20 2a 2f 0a 0a 20 20 6e 42 6c 6f 62 20  ode */..  nBlob 
2350: 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 62  = sqlite3_blob_b
2360: 79 74 65 73 28 70 2d 3e 70 42 6c 6f 62 29 3b 0a  ytes(p->pBlob);.
2370: 20 20 69 66 28 20 28 70 2d 3e 69 53 65 65 6b 2b    if( (p->iSeek+
2380: 6e 57 72 69 74 65 29 3e 6e 42 6c 6f 62 20 29 7b  nWrite)>nBlob ){
2390: 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50  .    *errorCodeP
23a0: 74 72 20 3d 20 45 49 4e 56 41 4c 3b 0a 20 20 20  tr = EINVAL;.   
23b0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a   return -1;.  }.
23c0: 20 20 69 66 28 20 6e 57 72 69 74 65 3c 3d 30 20    if( nWrite<=0 
23d0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
23e0: 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c  .  }..  rc = sql
23f0: 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65 28  ite3_blob_write(
2400: 70 2d 3e 70 42 6c 6f 62 2c 20 28 76 6f 69 64 20  p->pBlob, (void 
2410: 2a 29 62 75 66 2c 20 6e 57 72 69 74 65 2c 20 70  *)buf, nWrite, p
2420: 2d 3e 69 53 65 65 6b 29 3b 0a 20 20 69 66 28 20  ->iSeek);.  if( 
2430: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2440: 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50  .    *errorCodeP
2450: 74 72 20 3d 20 45 49 4f 3b 0a 20 20 20 20 72 65  tr = EIO;.    re
2460: 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20  turn -1;.  }..  
2470: 70 2d 3e 69 53 65 65 6b 20 2b 3d 20 6e 57 72 69  p->iSeek += nWri
2480: 74 65 3b 0a 20 20 72 65 74 75 72 6e 20 6e 57 72  te;.  return nWr
2490: 69 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  ite;.}../*.** Se
24a0: 65 6b 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  ek an incrementa
24b0: 6c 20 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a  l blob channel..
24c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
24d0: 63 72 62 6c 6f 62 53 65 65 6b 28 0a 20 20 43 6c  crblobSeek(.  Cl
24e0: 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63  ientData instanc
24f0: 65 44 61 74 61 2c 20 0a 20 20 6c 6f 6e 67 20 6f  eData, .  long o
2500: 66 66 73 65 74 2c 0a 20 20 69 6e 74 20 73 65 65  ffset,.  int see
2510: 6b 4d 6f 64 65 2c 0a 20 20 69 6e 74 20 2a 65 72  kMode,.  int *er
2520: 72 6f 72 43 6f 64 65 50 74 72 0a 29 7b 0a 20 20  rorCodePtr.){.  
2530: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20  IncrblobChannel 
2540: 2a 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68  *p = (IncrblobCh
2550: 61 6e 6e 65 6c 20 2a 29 69 6e 73 74 61 6e 63 65  annel *)instance
2560: 44 61 74 61 3b 0a 0a 20 20 73 77 69 74 63 68 28  Data;..  switch(
2570: 20 73 65 65 6b 4d 6f 64 65 20 29 7b 0a 20 20 20   seekMode ){.   
2580: 20 63 61 73 65 20 53 45 45 4b 5f 53 45 54 3a 0a   case SEEK_SET:.
2590: 20 20 20 20 20 20 70 2d 3e 69 53 65 65 6b 20 3d        p->iSeek =
25a0: 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 62   offset;.      b
25b0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
25c0: 45 45 4b 5f 43 55 52 3a 0a 20 20 20 20 20 20 70  EEK_CUR:.      p
25d0: 2d 3e 69 53 65 65 6b 20 2b 3d 20 6f 66 66 73 65  ->iSeek += offse
25e0: 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  t;.      break;.
25f0: 20 20 20 20 63 61 73 65 20 53 45 45 4b 5f 45 4e      case SEEK_EN
2600: 44 3a 0a 20 20 20 20 20 20 70 2d 3e 69 53 65 65  D:.      p->iSee
2610: 6b 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  k = sqlite3_blob
2620: 5f 62 79 74 65 73 28 70 2d 3e 70 42 6c 6f 62 29  _bytes(p->pBlob)
2630: 20 2b 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20   + offset;.     
2640: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66   break;..    def
2650: 61 75 6c 74 3a 20 61 73 73 65 72 74 28 21 22 42  ault: assert(!"B
2660: 61 64 20 73 65 65 6b 4d 6f 64 65 22 29 3b 0a 20  ad seekMode");. 
2670: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e   }..  return p->
2680: 69 53 65 65 6b 3b 0a 7d 0a 0a 0a 73 74 61 74 69  iSeek;.}...stati
2690: 63 20 76 6f 69 64 20 69 6e 63 72 62 6c 6f 62 57  c void incrblobW
26a0: 61 74 63 68 28 43 6c 69 65 6e 74 44 61 74 61 20  atch(ClientData 
26b0: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 69 6e  instanceData, in
26c0: 74 20 6d 6f 64 65 29 7b 20 0a 20 20 2f 2a 20 4e  t mode){ .  /* N
26d0: 4f 2d 4f 50 20 2a 2f 20 0a 7d 0a 73 74 61 74 69  O-OP */ .}.stati
26e0: 63 20 69 6e 74 20 69 6e 63 72 62 6c 6f 62 48 61  c int incrblobHa
26f0: 6e 64 6c 65 28 43 6c 69 65 6e 74 44 61 74 61 20  ndle(ClientData 
2700: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 69 6e  instanceData, in
2710: 74 20 64 69 72 2c 20 43 6c 69 65 6e 74 44 61 74  t dir, ClientDat
2720: 61 20 2a 68 50 74 72 29 7b 0a 20 20 72 65 74 75  a *hPtr){.  retu
2730: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a  rn TCL_ERROR;.}.
2740: 0a 73 74 61 74 69 63 20 54 63 6c 5f 43 68 61 6e  .static Tcl_Chan
2750: 6e 65 6c 54 79 70 65 20 49 6e 63 72 62 6c 6f 62  nelType Incrblob
2760: 43 68 61 6e 6e 65 6c 54 79 70 65 20 3d 20 7b 0a  ChannelType = {.
2770: 20 20 22 69 6e 63 72 62 6c 6f 62 22 2c 20 20 20    "incrblob",   
2780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2790: 20 20 20 20 20 2f 2a 20 74 79 70 65 4e 61 6d 65       /* typeName
27a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
27c0: 20 20 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56 45    TCL_CHANNEL_VE
27d0: 52 53 49 4f 4e 5f 32 2c 20 20 20 20 20 20 20 20  RSION_2,        
27e0: 20 20 20 20 20 2f 2a 20 76 65 72 73 69 6f 6e 20       /* version 
27f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2800: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
2810: 20 20 69 6e 63 72 62 6c 6f 62 43 6c 6f 73 65 2c    incrblobClose,
2820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2830: 20 20 20 20 20 2f 2a 20 63 6c 6f 73 65 50 72 6f       /* closePro
2840: 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
2850: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
2860: 20 20 69 6e 63 72 62 6c 6f 62 49 6e 70 75 74 2c    incrblobInput,
2870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2880: 20 20 20 20 20 2f 2a 20 69 6e 70 75 74 50 72 6f       /* inputPro
2890: 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
28a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
28b0: 20 20 69 6e 63 72 62 6c 6f 62 4f 75 74 70 75 74    incrblobOutput
28c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28d0: 20 20 20 20 20 2f 2a 20 6f 75 74 70 75 74 50 72       /* outputPr
28e0: 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  oc              
28f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
2900: 20 20 69 6e 63 72 62 6c 6f 62 53 65 65 6b 2c 20    incrblobSeek, 
2910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2920: 20 20 20 20 20 2f 2a 20 73 65 65 6b 50 72 6f 63       /* seekProc
2930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2940: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
2950: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
2960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2970: 20 20 20 20 20 2f 2a 20 73 65 74 4f 70 74 69 6f       /* setOptio
2980: 6e 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20  nProc           
2990: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
29a0: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
29b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c0: 20 20 20 20 20 2f 2a 20 67 65 74 4f 70 74 69 6f       /* getOptio
29d0: 6e 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20  nProc           
29e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
29f0: 20 20 69 6e 63 72 62 6c 6f 62 57 61 74 63 68 2c    incrblobWatch,
2a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a10: 20 20 20 20 20 2f 2a 20 77 61 74 63 68 50 72 6f       /* watchPro
2a20: 63 20 28 74 68 69 73 20 69 73 20 61 20 6e 6f 2d  c (this is a no-
2a30: 6f 70 29 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  op)          */.
2a40: 20 20 69 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65    incrblobHandle
2a50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2a60: 20 20 20 20 20 2f 2a 20 67 65 74 48 61 6e 64 6c       /* getHandl
2a70: 65 50 72 6f 63 20 28 61 6c 77 61 79 73 20 72 65  eProc (always re
2a80: 74 75 72 6e 73 20 65 72 72 6f 72 29 20 2a 2f 0a  turns error) */.
2a90: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
2aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab0: 20 20 20 20 20 2f 2a 20 63 6c 6f 73 65 32 50 72       /* close2Pr
2ac0: 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  oc              
2ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
2ae0: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
2af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b00: 20 20 20 20 20 2f 2a 20 62 6c 6f 63 6b 4d 6f 64       /* blockMod
2b10: 65 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20  eProc           
2b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
2b30: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
2b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b50: 20 20 20 20 20 2f 2a 20 66 6c 75 73 68 50 72 6f       /* flushPro
2b60: 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
2b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
2b80: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
2b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba0: 20 20 20 20 20 2f 2a 20 68 61 6e 64 6c 65 72 50       /* handlerP
2bb0: 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20  roc             
2bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
2bd0: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
2be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf0: 20 20 20 20 20 2f 2a 20 77 69 64 65 53 65 65 6b       /* wideSeek
2c00: 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20  Proc            
2c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
2c20: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  };../*.** Create
2c30: 20 61 20 6e 65 77 20 69 6e 63 72 62 6c 6f 62 20   a new incrblob 
2c40: 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74  channel..*/.stat
2c50: 69 63 20 69 6e 74 20 63 72 65 61 74 65 49 6e 63  ic int createInc
2c60: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 28 0a 20 20  rblobChannel(.  
2c70: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
2c80: 72 70 2c 20 0a 20 20 53 71 6c 69 74 65 44 62 20  rp, .  SqliteDb 
2c90: 2a 70 44 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63  *pDb, .  const c
2ca0: 68 61 72 20 2a 7a 44 62 2c 0a 20 20 63 6f 6e 73  har *zDb,.  cons
2cb0: 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 2c 20  t char *zTable, 
2cc0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2cd0: 43 6f 6c 75 6d 6e 2c 20 0a 20 20 73 71 6c 69 74  Column, .  sqlit
2ce0: 65 5f 69 6e 74 36 34 20 69 52 6f 77 2c 0a 20 20  e_int64 iRow,.  
2cf0: 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 0a 29  int isReadonly.)
2d00: 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e  {.  IncrblobChan
2d10: 6e 65 6c 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65  nel *p;.  sqlite
2d20: 33 20 2a 64 62 20 3d 20 70 44 62 2d 3e 64 62 3b  3 *db = pDb->db;
2d30: 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20  .  sqlite3_blob 
2d40: 2a 70 42 6c 6f 62 3b 0a 20 20 69 6e 74 20 72 63  *pBlob;.  int rc
2d50: 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  ;.  int flags = 
2d60: 54 43 4c 5f 52 45 41 44 41 42 4c 45 7c 28 69 73  TCL_READABLE|(is
2d70: 52 65 61 64 6f 6e 6c 79 20 3f 20 30 20 3a 20 54  Readonly ? 0 : T
2d80: 43 4c 5f 57 52 49 54 41 42 4c 45 29 3b 0a 0a 20  CL_WRITABLE);.. 
2d90: 20 2f 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c   /* This variabl
2da0: 65 20 69 73 20 75 73 65 64 20 74 6f 20 6e 61 6d  e is used to nam
2db0: 65 20 74 68 65 20 63 68 61 6e 6e 65 6c 73 3a 20  e the channels: 
2dc0: 22 69 6e 63 72 62 6c 6f 62 5f 5b 69 6e 63 72 20  "incrblob_[incr 
2dd0: 63 6f 75 6e 74 5d 22 20 2a 2f 0a 20 20 73 74 61  count]" */.  sta
2de0: 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 20 3d 20  tic int count = 
2df0: 30 3b 0a 20 20 63 68 61 72 20 7a 43 68 61 6e 6e  0;.  char zChann
2e00: 65 6c 5b 36 34 5d 3b 0a 0a 20 20 72 63 20 3d 20  el[64];..  rc = 
2e10: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65  sqlite3_blob_ope
2e20: 6e 28 64 62 2c 20 7a 44 62 2c 20 7a 54 61 62 6c  n(db, zDb, zTabl
2e30: 65 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 69 52 6f 77  e, zColumn, iRow
2e40: 2c 20 21 69 73 52 65 61 64 6f 6e 6c 79 2c 20 26  , !isReadonly, &
2e50: 70 42 6c 6f 62 29 3b 0a 20 20 69 66 28 20 72 63  pBlob);.  if( rc
2e60: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2e70: 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
2e80: 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
2e90: 29 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28  )sqlite3_errmsg(
2ea0: 70 44 62 2d 3e 64 62 29 2c 20 54 43 4c 5f 56 4f  pDb->db), TCL_VO
2eb0: 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 72 65 74  LATILE);.    ret
2ec0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2ed0: 20 7d 0a 0a 20 20 70 20 3d 20 28 49 6e 63 72 62   }..  p = (Incrb
2ee0: 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 54 63 6c  lobChannel *)Tcl
2ef0: 5f 41 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 49 6e  _Alloc(sizeof(In
2f00: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 29 29 3b  crblobChannel));
2f10: 0a 20 20 70 2d 3e 69 53 65 65 6b 20 3d 20 30 3b  .  p->iSeek = 0;
2f20: 0a 20 20 70 2d 3e 70 42 6c 6f 62 20 3d 20 70 42  .  p->pBlob = pB
2f30: 6c 6f 62 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  lob;..  sqlite3_
2f40: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
2f50: 7a 43 68 61 6e 6e 65 6c 29 2c 20 7a 43 68 61 6e  zChannel), zChan
2f60: 6e 65 6c 2c 20 22 69 6e 63 72 62 6c 6f 62 5f 25  nel, "incrblob_%
2f70: 64 22 2c 20 2b 2b 63 6f 75 6e 74 29 3b 0a 20 20  d", ++count);.  
2f80: 70 2d 3e 63 68 61 6e 6e 65 6c 20 3d 20 54 63 6c  p->channel = Tcl
2f90: 5f 43 72 65 61 74 65 43 68 61 6e 6e 65 6c 28 26  _CreateChannel(&
2fa0: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 54  IncrblobChannelT
2fb0: 79 70 65 2c 20 7a 43 68 61 6e 6e 65 6c 2c 20 70  ype, zChannel, p
2fc0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 54 63 6c 5f  , flags);.  Tcl_
2fd0: 52 65 67 69 73 74 65 72 43 68 61 6e 6e 65 6c 28  RegisterChannel(
2fe0: 69 6e 74 65 72 70 2c 20 70 2d 3e 63 68 61 6e 6e  interp, p->chann
2ff0: 65 6c 29 3b 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20  el);..  /* Link 
3000: 74 68 65 20 6e 65 77 20 63 68 61 6e 6e 65 6c 20  the new channel 
3010: 69 6e 74 6f 20 74 68 65 20 53 71 6c 69 74 65 44  into the SqliteD
3020: 62 2e 70 49 6e 63 72 62 6c 6f 62 20 6c 69 73 74  b.pIncrblob list
3030: 2e 20 2a 2f 0a 20 20 70 2d 3e 70 4e 65 78 74 20  . */.  p->pNext 
3040: 3d 20 70 44 62 2d 3e 70 49 6e 63 72 62 6c 6f 62  = pDb->pIncrblob
3050: 3b 0a 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30  ;.  p->pPrev = 0
3060: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74  ;.  if( p->pNext
3070: 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74   ){.    p->pNext
3080: 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 7d  ->pPrev = p;.  }
3090: 0a 20 20 70 44 62 2d 3e 70 49 6e 63 72 62 6c 6f  .  pDb->pIncrblo
30a0: 62 20 3d 20 70 3b 0a 20 20 70 2d 3e 70 44 62 20  b = p;.  p->pDb 
30b0: 3d 20 70 44 62 3b 0a 0a 20 20 54 63 6c 5f 53 65  = pDb;..  Tcl_Se
30c0: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
30d0: 28 63 68 61 72 20 2a 29 54 63 6c 5f 47 65 74 43  (char *)Tcl_GetC
30e0: 68 61 6e 6e 65 6c 4e 61 6d 65 28 70 2d 3e 63 68  hannelName(p->ch
30f0: 61 6e 6e 65 6c 29 2c 20 54 43 4c 5f 56 4f 4c 41  annel), TCL_VOLA
3100: 54 49 4c 45 29 3b 0a 20 20 72 65 74 75 72 6e 20  TILE);.  return 
3110: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6c 73 65 20  TCL_OK;.}.#else 
3120: 20 2f 2a 20 65 6c 73 65 20 63 6c 61 75 73 65 20   /* else clause 
3130: 66 6f 72 20 22 23 69 66 6e 64 65 66 20 53 51 4c  for "#ifndef SQL
3140: 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
3150: 42 22 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  B" */.  #define 
3160: 63 6c 6f 73 65 49 6e 63 72 62 6c 6f 62 43 68 61  closeIncrblobCha
3170: 6e 6e 65 6c 73 28 70 44 62 29 0a 23 65 6e 64 69  nnels(pDb).#endi
3180: 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 61 74  f../*.** Look at
3190: 20 74 68 65 20 73 63 72 69 70 74 20 70 72 65 66   the script pref
31a0: 69 78 20 69 6e 20 70 43 6d 64 2e 20 20 57 65 20  ix in pCmd.  We 
31b0: 77 69 6c 6c 20 62 65 20 65 78 65 63 75 74 69 6e  will be executin
31c0: 67 20 74 68 69 73 20 73 63 72 69 70 74 0a 2a 2a  g this script.**
31d0: 20 61 66 74 65 72 20 66 69 72 73 74 20 61 70 70   after first app
31e0: 65 6e 64 69 6e 67 20 6f 6e 65 20 6f 72 20 6d 6f  ending one or mo
31f0: 72 65 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 54  re arguments.  T
3200: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c  his routine anal
3210: 79 7a 65 73 0a 2a 2a 20 74 68 65 20 73 63 72 69  yzes.** the scri
3220: 70 74 20 74 6f 20 73 65 65 20 69 66 20 69 74 20  pt to see if it 
3230: 69 73 20 73 61 66 65 20 74 6f 20 75 73 65 20 54  is safe to use T
3240: 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20 6f 6e  cl_EvalObjv() on
3250: 20 74 68 65 20 73 63 72 69 70 74 0a 2a 2a 20 72   the script.** r
3260: 61 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6d  ather than the m
3270: 6f 72 65 20 67 65 6e 65 72 61 6c 20 54 63 6c 5f  ore general Tcl_
3280: 45 76 61 6c 45 78 28 29 2e 20 20 54 63 6c 5f 45  EvalEx().  Tcl_E
3290: 76 61 6c 4f 62 6a 76 28 29 20 69 73 20 6d 75 63  valObjv() is muc
32a0: 68 0a 2a 2a 20 66 61 73 74 65 72 2e 0a 2a 2a 0a  h.** faster..**.
32b0: 2a 2a 20 53 63 72 69 70 74 73 20 74 68 61 74 20  ** Scripts that 
32c0: 61 72 65 20 73 61 66 65 20 74 6f 20 75 73 65 20  are safe to use 
32d0: 77 69 74 68 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  with Tcl_EvalObj
32e0: 76 28 29 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  v() consists of 
32f0: 61 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d  a.** command nam
3300: 65 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 7a 65  e followed by ze
3310: 72 6f 20 6f 72 20 6d 6f 72 65 20 61 72 67 75 6d  ro or more argum
3320: 65 6e 74 73 20 77 69 74 68 20 6e 6f 20 5b 2e 2e  ents with no [..
3330: 2e 5d 20 6f 72 20 24 0a 2a 2a 20 6f 72 20 7b 2e  .] or $.** or {.
3340: 2e 2e 7d 20 6f 72 20 3b 20 74 6f 20 62 65 20 73  ..} or ; to be s
3350: 65 65 6e 20 61 6e 79 77 68 65 72 65 2e 20 20 4d  een anywhere.  M
3360: 6f 73 74 20 63 61 6c 6c 62 61 63 6b 20 73 63 72  ost callback scr
3370: 69 70 74 73 20 63 6f 6e 73 69 73 74 0a 2a 2a 20  ipts consist.** 
3380: 6f 66 20 6a 75 73 74 20 61 20 73 69 6e 67 6c 65  of just a single
3390: 20 70 72 6f 63 65 64 75 72 65 20 6e 61 6d 65 20   procedure name 
33a0: 61 6e 64 20 74 68 65 79 20 6d 65 65 74 20 74 68  and they meet th
33b0: 69 73 20 72 65 71 75 69 72 65 6d 65 6e 74 2e 0a  is requirement..
33c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  */.static int sa
33d0: 66 65 54 6f 55 73 65 45 76 61 6c 4f 62 6a 76 28  feToUseEvalObjv(
33e0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
33f0: 72 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d  rp, Tcl_Obj *pCm
3400: 64 29 7b 0a 20 20 2f 2a 20 57 65 20 63 6f 75 6c  d){.  /* We coul
3410: 64 20 74 72 79 20 74 6f 20 64 6f 20 73 6f 6d 65  d try to do some
3420: 74 68 69 6e 67 20 77 69 74 68 20 54 63 6c 5f 50  thing with Tcl_P
3430: 61 72 73 65 28 29 2e 20 20 42 75 74 20 77 65 20  arse().  But we 
3440: 77 69 6c 6c 20 69 6e 73 74 65 61 64 0a 20 20 2a  will instead.  *
3450: 2a 20 6a 75 73 74 20 64 6f 20 61 20 73 65 61 72  * just do a sear
3460: 63 68 20 66 6f 72 20 66 6f 72 62 69 64 64 65 6e  ch for forbidden
3470: 20 63 68 61 72 61 63 74 65 72 73 2e 20 20 49 66   characters.  If
3480: 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 72 62   any of the forb
3490: 69 64 64 65 6e 0a 20 20 2a 2a 20 63 68 61 72 61  idden.  ** chara
34a0: 63 74 65 72 73 20 61 70 70 65 61 72 20 69 6e 20  cters appear in 
34b0: 70 43 6d 64 2c 20 77 65 20 77 69 6c 6c 20 72 65  pCmd, we will re
34c0: 70 6f 72 74 20 74 68 65 20 73 74 72 69 6e 67 20  port the string 
34d0: 61 73 20 75 6e 73 61 66 65 2e 0a 20 20 2a 2f 0a  as unsafe..  */.
34e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
34f0: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 7a 20 3d 20  .  int n;.  z = 
3500: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
3510: 6d 4f 62 6a 28 70 43 6d 64 2c 20 26 6e 29 3b 0a  mObj(pCmd, &n);.
3520: 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30    while( n-- > 0
3530: 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 20 3d 20   ){.    int c = 
3540: 2a 28 7a 2b 2b 29 3b 0a 20 20 20 20 69 66 28 20  *(z++);.    if( 
3550: 63 3d 3d 27 24 27 20 7c 7c 20 63 3d 3d 27 5b 27  c=='$' || c=='['
3560: 20 7c 7c 20 63 3d 3d 27 3b 27 20 29 20 72 65 74   || c==';' ) ret
3570: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
3580: 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 1;.}../*.** 
3590: 46 69 6e 64 20 61 6e 20 53 71 6c 46 75 6e 63 20  Find an SqlFunc 
35a0: 73 74 72 75 63 74 75 72 65 20 77 69 74 68 20 74  structure with t
35b0: 68 65 20 67 69 76 65 6e 20 6e 61 6d 65 2e 20 20  he given name.  
35c0: 4f 72 20 63 72 65 61 74 65 20 61 20 6e 65 77 0a  Or create a new.
35d0: 2a 2a 20 6f 6e 65 20 69 66 20 61 6e 20 65 78 69  ** one if an exi
35e0: 73 74 69 6e 67 20 6f 6e 65 20 63 61 6e 6e 6f 74  sting one cannot
35f0: 20 62 65 20 66 6f 75 6e 64 2e 20 20 52 65 74 75   be found.  Retu
3600: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
3610: 74 68 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  the.** structure
3620: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 71 6c 46  ..*/.static SqlF
3630: 75 6e 63 20 2a 66 69 6e 64 53 71 6c 46 75 6e 63  unc *findSqlFunc
3640: 28 53 71 6c 69 74 65 44 62 20 2a 70 44 62 2c 20  (SqliteDb *pDb, 
3650: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
3660: 65 29 7b 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70  e){.  SqlFunc *p
3670: 2c 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e  , *pNew;.  int n
3680: 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 33 30 28  Name = strlen30(
3690: 7a 4e 61 6d 65 29 3b 0a 20 20 70 4e 65 77 20 3d  zName);.  pNew =
36a0: 20 28 53 71 6c 46 75 6e 63 2a 29 54 63 6c 5f 41   (SqlFunc*)Tcl_A
36b0: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e  lloc( sizeof(*pN
36c0: 65 77 29 20 2b 20 6e 4e 61 6d 65 20 2b 20 31 20  ew) + nName + 1 
36d0: 29 3b 0a 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65  );.  pNew->zName
36e0: 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b   = (char*)&pNew[
36f0: 31 5d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65  1];.  memcpy(pNe
3700: 77 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c  w->zName, zName,
3710: 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 66 6f 72   nName+1);.  for
3720: 28 70 3d 70 44 62 2d 3e 70 46 75 6e 63 3b 20 70  (p=pDb->pFunc; p
3730: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 20 0a  ; p=p->pNext){ .
3740: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
3750: 73 74 72 69 63 6d 70 28 70 2d 3e 7a 4e 61 6d 65  stricmp(p->zName
3760: 2c 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 29 3d 3d  , pNew->zName)==
3770: 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 46  0 ){.      Tcl_F
3780: 72 65 65 28 28 63 68 61 72 2a 29 70 4e 65 77 29  ree((char*)pNew)
3790: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  ;.      return p
37a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e  ;.    }.  }.  pN
37b0: 65 77 2d 3e 69 6e 74 65 72 70 20 3d 20 70 44 62  ew->interp = pDb
37c0: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 70 4e 65 77  ->interp;.  pNew
37d0: 2d 3e 70 44 62 20 3d 20 70 44 62 3b 0a 20 20 70  ->pDb = pDb;.  p
37e0: 4e 65 77 2d 3e 70 53 63 72 69 70 74 20 3d 20 30  New->pScript = 0
37f0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20  ;.  pNew->pNext 
3800: 3d 20 70 44 62 2d 3e 70 46 75 6e 63 3b 0a 20 20  = pDb->pFunc;.  
3810: 70 44 62 2d 3e 70 46 75 6e 63 20 3d 20 70 4e 65  pDb->pFunc = pNe
3820: 77 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  w;.  return pNew
3830: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
3840: 61 20 73 69 6e 67 6c 65 20 53 71 6c 50 72 65 70  a single SqlPrep
3850: 61 72 65 64 53 74 6d 74 20 6f 62 6a 65 63 74 2e  aredStmt object.
3860: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3870: 64 62 46 72 65 65 53 74 6d 74 28 53 71 6c 50 72  dbFreeStmt(SqlPr
3880: 65 70 61 72 65 64 53 74 6d 74 20 2a 70 53 74 6d  eparedStmt *pStm
3890: 74 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  t){.#ifdef SQLIT
38a0: 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c  E_TEST.  if( sql
38b0: 69 74 65 33 5f 73 71 6c 28 70 53 74 6d 74 2d 3e  ite3_sql(pStmt->
38c0: 70 53 74 6d 74 29 3d 3d 30 20 29 7b 0a 20 20 20  pStmt)==0 ){.   
38d0: 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 20   Tcl_Free((char 
38e0: 2a 29 70 53 74 6d 74 2d 3e 7a 53 71 6c 29 3b 0a  *)pStmt->zSql);.
38f0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
3900: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
3910: 74 6d 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 54  tmt->pStmt);.  T
3920: 63 6c 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29  cl_Free((char *)
3930: 70 53 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pStmt);.}../*.**
3940: 20 46 69 6e 61 6c 69 7a 65 20 61 6e 64 20 66 72   Finalize and fr
3950: 65 65 20 61 20 6c 69 73 74 20 6f 66 20 70 72 65  ee a list of pre
3960: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73  pared statements
3970: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3980: 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28 53  flushStmtCache(S
3990: 71 6c 69 74 65 44 62 20 2a 70 44 62 29 7b 0a 20  qliteDb *pDb){. 
39a0: 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74   SqlPreparedStmt
39b0: 20 2a 70 50 72 65 53 74 6d 74 3b 0a 20 20 53 71   *pPreStmt;.  Sq
39c0: 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70  lPreparedStmt *p
39d0: 4e 65 78 74 3b 0a 0a 20 20 66 6f 72 28 70 50 72  Next;..  for(pPr
39e0: 65 53 74 6d 74 20 3d 20 70 44 62 2d 3e 73 74 6d  eStmt = pDb->stm
39f0: 74 4c 69 73 74 3b 20 70 50 72 65 53 74 6d 74 3b  tList; pPreStmt;
3a00: 20 70 50 72 65 53 74 6d 74 3d 70 4e 65 78 74 29   pPreStmt=pNext)
3a10: 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50  {.    pNext = pP
3a20: 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 3b 0a 20  reStmt->pNext;. 
3a30: 20 20 20 64 62 46 72 65 65 53 74 6d 74 28 70 50     dbFreeStmt(pP
3a40: 72 65 53 74 6d 74 29 3b 0a 20 20 7d 0a 20 20 70  reStmt);.  }.  p
3a50: 44 62 2d 3e 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  Db->nStmt = 0;. 
3a60: 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d   pDb->stmtLast =
3a70: 20 30 3b 0a 20 20 70 44 62 2d 3e 73 74 6d 74 4c   0;.  pDb->stmtL
3a80: 69 73 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ist = 0;.}../*.*
3a90: 2a 20 54 43 4c 20 63 61 6c 6c 73 20 74 68 69 73  * TCL calls this
3aa0: 20 70 72 6f 63 65 64 75 72 65 20 77 68 65 6e 20   procedure when 
3ab0: 61 6e 20 73 71 6c 69 74 65 33 20 64 61 74 61 62  an sqlite3 datab
3ac0: 61 73 65 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a  ase command is.*
3ad0: 2a 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74  * deleted..*/.st
3ae0: 61 74 69 63 20 76 6f 69 64 20 44 62 44 65 6c 65  atic void DbDele
3af0: 74 65 43 6d 64 28 76 6f 69 64 20 2a 64 62 29 7b  teCmd(void *db){
3b00: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
3b10: 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 64 62   = (SqliteDb*)db
3b20: 3b 0a 20 20 66 6c 75 73 68 53 74 6d 74 43 61 63  ;.  flushStmtCac
3b30: 68 65 28 70 44 62 29 3b 0a 20 20 63 6c 6f 73 65  he(pDb);.  close
3b40: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 73  IncrblobChannels
3b50: 28 70 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33  (pDb);.  sqlite3
3b60: 5f 63 6c 6f 73 65 28 70 44 62 2d 3e 64 62 29 3b  _close(pDb->db);
3b70: 0a 20 20 77 68 69 6c 65 28 20 70 44 62 2d 3e 70  .  while( pDb->p
3b80: 46 75 6e 63 20 29 7b 0a 20 20 20 20 53 71 6c 46  Func ){.    SqlF
3b90: 75 6e 63 20 2a 70 46 75 6e 63 20 3d 20 70 44 62  unc *pFunc = pDb
3ba0: 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 70 44 62  ->pFunc;.    pDb
3bb0: 2d 3e 70 46 75 6e 63 20 3d 20 70 46 75 6e 63 2d  ->pFunc = pFunc-
3bc0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61 73 73 65  >pNext;.    asse
3bd0: 72 74 28 20 70 46 75 6e 63 2d 3e 70 44 62 3d 3d  rt( pFunc->pDb==
3be0: 70 44 62 20 29 3b 0a 20 20 20 20 54 63 6c 5f 44  pDb );.    Tcl_D
3bf0: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 46 75 6e  ecrRefCount(pFun
3c00: 63 2d 3e 70 53 63 72 69 70 74 29 3b 0a 20 20 20  c->pScript);.   
3c10: 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a   Tcl_Free((char*
3c20: 29 70 46 75 6e 63 29 3b 0a 20 20 7d 0a 20 20 77  )pFunc);.  }.  w
3c30: 68 69 6c 65 28 20 70 44 62 2d 3e 70 43 6f 6c 6c  hile( pDb->pColl
3c40: 61 74 65 20 29 7b 0a 20 20 20 20 53 71 6c 43 6f  ate ){.    SqlCo
3c50: 6c 6c 61 74 65 20 2a 70 43 6f 6c 6c 61 74 65 20  llate *pCollate 
3c60: 3d 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 3b  = pDb->pCollate;
3c70: 0a 20 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61  .    pDb->pColla
3c80: 74 65 20 3d 20 70 43 6f 6c 6c 61 74 65 2d 3e 70  te = pCollate->p
3c90: 4e 65 78 74 3b 0a 20 20 20 20 54 63 6c 5f 46 72  Next;.    Tcl_Fr
3ca0: 65 65 28 28 63 68 61 72 2a 29 70 43 6f 6c 6c 61  ee((char*)pColla
3cb0: 74 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  te);.  }.  if( p
3cc0: 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20  Db->zBusy ){.   
3cd0: 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
3ce0: 42 75 73 79 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Busy);.  }.  if(
3cf0: 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a   pDb->zTrace ){.
3d00: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
3d10: 2d 3e 7a 54 72 61 63 65 29 3b 0a 20 20 7d 0a 20  ->zTrace);.  }. 
3d20: 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69   if( pDb->zProfi
3d30: 6c 65 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72  le ){.    Tcl_Fr
3d40: 65 65 28 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65  ee(pDb->zProfile
3d50: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62  );.  }.  if( pDb
3d60: 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 54  ->zAuth ){.    T
3d70: 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 41 75  cl_Free(pDb->zAu
3d80: 74 68 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  th);.  }.  if( p
3d90: 44 62 2d 3e 7a 4e 75 6c 6c 20 29 7b 0a 20 20 20  Db->zNull ){.   
3da0: 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
3db0: 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Null);.  }.  if(
3dc0: 20 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f   pDb->pUpdateHoo
3dd0: 6b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63  k ){.    Tcl_Dec
3de0: 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70  rRefCount(pDb->p
3df0: 55 70 64 61 74 65 48 6f 6f 6b 29 3b 0a 20 20 7d  UpdateHook);.  }
3e00: 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 52 6f 6c  .  if( pDb->pRol
3e10: 6c 62 61 63 6b 48 6f 6f 6b 20 29 7b 0a 20 20 20  lbackHook ){.   
3e20: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
3e30: 74 28 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b  t(pDb->pRollback
3e40: 48 6f 6f 6b 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Hook);.  }.  if(
3e50: 20 70 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 20 29   pDb->pWalHook )
3e60: 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  {.    Tcl_DecrRe
3e70: 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 57 61 6c  fCount(pDb->pWal
3e80: 48 6f 6f 6b 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Hook);.  }.  if(
3e90: 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65   pDb->pCollateNe
3ea0: 65 64 65 64 20 29 7b 0a 20 20 20 20 54 63 6c 5f  eded ){.    Tcl_
3eb0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62  DecrRefCount(pDb
3ec0: 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64  ->pCollateNeeded
3ed0: 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 46 72 65  );.  }.  Tcl_Fre
3ee0: 65 28 28 63 68 61 72 2a 29 70 44 62 29 3b 0a 7d  e((char*)pDb);.}
3ef0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
3f00: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
3f10: 68 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 66  hen a database f
3f20: 69 6c 65 20 69 73 20 6c 6f 63 6b 65 64 20 77 68  ile is locked wh
3f30: 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f  ile trying.** to
3f40: 20 65 78 65 63 75 74 65 20 53 51 4c 2e 0a 2a 2f   execute SQL..*/
3f50: 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 42 75  .static int DbBu
3f60: 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a  syHandler(void *
3f70: 63 64 2c 20 69 6e 74 20 6e 54 72 69 65 73 29 7b  cd, int nTries){
3f80: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
3f90: 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64   = (SqliteDb*)cd
3fa0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  ;.  int rc;.  ch
3fb0: 61 72 20 7a 56 61 6c 5b 33 30 5d 3b 0a 0a 20 20  ar zVal[30];..  
3fc0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
3fd0: 28 73 69 7a 65 6f 66 28 7a 56 61 6c 29 2c 20 7a  (sizeof(zVal), z
3fe0: 56 61 6c 2c 20 22 25 64 22 2c 20 6e 54 72 69 65  Val, "%d", nTrie
3ff0: 73 29 3b 0a 20 20 72 63 20 3d 20 54 63 6c 5f 56  s);.  rc = Tcl_V
4000: 61 72 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65  arEval(pDb->inte
4010: 72 70 2c 20 70 44 62 2d 3e 7a 42 75 73 79 2c 20  rp, pDb->zBusy, 
4020: 22 20 22 2c 20 7a 56 61 6c 2c 20 28 63 68 61 72  " ", zVal, (char
4030: 2a 29 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  *)0);.  if( rc!=
4040: 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28 54  TCL_OK || atoi(T
4050: 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
4060: 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 29  lt(pDb->interp))
4070: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
4080: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31  ;.  }.  return 1
4090: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
40a0: 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53  ITE_OMIT_PROGRES
40b0: 53 5f 43 41 4c 4c 42 41 43 4b 0a 2f 2a 0a 2a 2a  S_CALLBACK./*.**
40c0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
40d0: 20 69 6e 76 6f 6b 65 64 20 61 73 20 74 68 65 20   invoked as the 
40e0: 27 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61  'progress callba
40f0: 63 6b 27 20 66 6f 72 20 74 68 65 20 64 61 74 61  ck' for the data
4100: 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  base..*/.static 
4110: 69 6e 74 20 44 62 50 72 6f 67 72 65 73 73 48 61  int DbProgressHa
4120: 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 29 7b  ndler(void *cd){
4130: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
4140: 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64   = (SqliteDb*)cd
4150: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
4160: 73 73 65 72 74 28 20 70 44 62 2d 3e 7a 50 72 6f  ssert( pDb->zPro
4170: 67 72 65 73 73 20 29 3b 0a 20 20 72 63 20 3d 20  gress );.  rc = 
4180: 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69 6e  Tcl_Eval(pDb->in
4190: 74 65 72 70 2c 20 70 44 62 2d 3e 7a 50 72 6f 67  terp, pDb->zProg
41a0: 72 65 73 73 29 3b 0a 20 20 69 66 28 20 72 63 21  ress);.  if( rc!
41b0: 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28  =TCL_OK || atoi(
41c0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73  Tcl_GetStringRes
41d0: 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29  ult(pDb->interp)
41e0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
41f0: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
4200: 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  0;.}.#endif..#if
4210: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
4220: 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69  _TRACE./*.** Thi
4230: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
4240: 6c 65 64 20 62 79 20 74 68 65 20 53 51 4c 69 74  led by the SQLit
4250: 65 20 74 72 61 63 65 20 68 61 6e 64 6c 65 72 20  e trace handler 
4260: 77 68 65 6e 65 76 65 72 20 61 20 6e 65 77 0a 2a  whenever a new.*
4270: 2a 20 62 6c 6f 63 6b 20 6f 66 20 53 51 4c 20 69  * block of SQL i
4280: 73 20 65 78 65 63 75 74 65 64 2e 20 20 54 68 65  s executed.  The
4290: 20 54 43 4c 20 73 63 72 69 70 74 20 69 6e 20 70   TCL script in p
42a0: 44 62 2d 3e 7a 54 72 61 63 65 20 69 73 20 65 78  Db->zTrace is ex
42b0: 65 63 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  ecuted..*/.stati
42c0: 63 20 76 6f 69 64 20 44 62 54 72 61 63 65 48 61  c void DbTraceHa
42d0: 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 2c 20  ndler(void *cd, 
42e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
42f0: 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  ){.  SqliteDb *p
4300: 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29  Db = (SqliteDb*)
4310: 63 64 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  cd;.  Tcl_DStrin
4320: 67 20 73 74 72 3b 0a 0a 20 20 54 63 6c 5f 44 53  g str;..  Tcl_DS
4330: 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b  tringInit(&str);
4340: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70  .  Tcl_DStringAp
4350: 70 65 6e 64 28 26 73 74 72 2c 20 70 44 62 2d 3e  pend(&str, pDb->
4360: 7a 54 72 61 63 65 2c 20 2d 31 29 3b 0a 20 20 54  zTrace, -1);.  T
4370: 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64  cl_DStringAppend
4380: 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 53  Element(&str, zS
4390: 71 6c 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 28  ql);.  Tcl_Eval(
43a0: 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c  pDb->interp, Tcl
43b0: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 73  _DStringValue(&s
43c0: 74 72 29 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72  tr));.  Tcl_DStr
43d0: 69 6e 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20  ingFree(&str);. 
43e0: 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74   Tcl_ResetResult
43f0: 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 3b 0a 7d  (pDb->interp);.}
4400: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
4410: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41   SQLITE_OMIT_TRA
4420: 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  CE./*.** This ro
4430: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
4440: 62 79 20 74 68 65 20 53 51 4c 69 74 65 20 70 72  by the SQLite pr
4450: 6f 66 69 6c 65 20 68 61 6e 64 6c 65 72 20 61 66  ofile handler af
4460: 74 65 72 20 61 20 73 74 61 74 65 6d 65 6e 74 0a  ter a statement.
4470: 2a 2a 20 53 51 4c 20 68 61 73 20 65 78 65 63 75  ** SQL has execu
4480: 74 65 64 2e 20 20 54 68 65 20 54 43 4c 20 73 63  ted.  The TCL sc
4490: 72 69 70 74 20 69 6e 20 70 44 62 2d 3e 7a 50 72  ript in pDb->zPr
44a0: 6f 66 69 6c 65 20 69 73 20 65 76 61 6c 75 61 74  ofile is evaluat
44b0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
44c0: 69 64 20 44 62 50 72 6f 66 69 6c 65 48 61 6e 64  id DbProfileHand
44d0: 6c 65 72 28 76 6f 69 64 20 2a 63 64 2c 20 63 6f  ler(void *cd, co
44e0: 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20  nst char *zSql, 
44f0: 73 71 6c 69 74 65 5f 75 69 6e 74 36 34 20 74 6d  sqlite_uint64 tm
4500: 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  ){.  SqliteDb *p
4510: 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29  Db = (SqliteDb*)
4520: 63 64 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  cd;.  Tcl_DStrin
4530: 67 20 73 74 72 3b 0a 20 20 63 68 61 72 20 7a 54  g str;.  char zT
4540: 6d 5b 31 30 30 5d 3b 0a 0a 20 20 73 71 6c 69 74  m[100];..  sqlit
4550: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
4560: 6f 66 28 7a 54 6d 29 2d 31 2c 20 7a 54 6d 2c 20  of(zTm)-1, zTm, 
4570: 22 25 6c 6c 64 22 2c 20 74 6d 29 3b 0a 20 20 54  "%lld", tm);.  T
4580: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
4590: 73 74 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72  str);.  Tcl_DStr
45a0: 69 6e 67 41 70 70 65 6e 64 28 26 73 74 72 2c 20  ingAppend(&str, 
45b0: 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 2c 20 2d  pDb->zProfile, -
45c0: 31 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  1);.  Tcl_DStrin
45d0: 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26  gAppendElement(&
45e0: 73 74 72 2c 20 7a 53 71 6c 29 3b 0a 20 20 54 63  str, zSql);.  Tc
45f0: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45  l_DStringAppendE
4600: 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 54 6d  lement(&str, zTm
4610: 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 28 70 44  );.  Tcl_Eval(pD
4620: 62 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44  b->interp, Tcl_D
4630: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72  StringValue(&str
4640: 29 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  ));.  Tcl_DStrin
4650: 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20 54  gFree(&str);.  T
4660: 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 70  cl_ResetResult(p
4670: 44 62 2d 3e 69 6e 74 65 72 70 29 3b 0a 7d 0a 23  Db->interp);.}.#
4680: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
4690: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
46a0: 6c 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73  led when a trans
46b0: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
46c0: 74 65 64 2e 20 20 54 68 65 0a 2a 2a 20 54 43 4c  ted.  The.** TCL
46d0: 20 73 63 72 69 70 74 20 69 6e 20 70 44 62 2d 3e   script in pDb->
46e0: 7a 43 6f 6d 6d 69 74 20 69 73 20 65 78 65 63 75  zCommit is execu
46f0: 74 65 64 2e 20 20 49 66 20 69 74 20 72 65 74 75  ted.  If it retu
4700: 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 0a  rns non-zero or.
4710: 2a 2a 20 69 66 20 69 74 20 74 68 72 6f 77 73 20  ** if it throws 
4720: 61 6e 20 65 78 63 65 70 74 69 6f 6e 2c 20 74 68  an exception, th
4730: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
4740: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 73   rolled back ins
4750: 74 65 61 64 0a 2a 2a 20 6f 66 20 62 65 69 6e 67  tead.** of being
4760: 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2f 0a 73   committed..*/.s
4770: 74 61 74 69 63 20 69 6e 74 20 44 62 43 6f 6d 6d  tatic int DbComm
4780: 69 74 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a  itHandler(void *
4790: 63 64 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20  cd){.  SqliteDb 
47a0: 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62  *pDb = (SqliteDb
47b0: 2a 29 63 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  *)cd;.  int rc;.
47c0: 0a 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c  .  rc = Tcl_Eval
47d0: 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44  (pDb->interp, pD
47e0: 62 2d 3e 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20 69  b->zCommit);.  i
47f0: 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c  f( rc!=TCL_OK ||
4800: 20 61 74 6f 69 28 54 63 6c 5f 47 65 74 53 74 72   atoi(Tcl_GetStr
4810: 69 6e 67 52 65 73 75 6c 74 28 70 44 62 2d 3e 69  ingResult(pDb->i
4820: 6e 74 65 72 70 29 29 20 29 7b 0a 20 20 20 20 72  nterp)) ){.    r
4830: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
4840: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74  eturn 0;.}..stat
4850: 69 63 20 76 6f 69 64 20 44 62 52 6f 6c 6c 62 61  ic void DbRollba
4860: 63 6b 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a  ckHandler(void *
4870: 63 6c 69 65 6e 74 44 61 74 61 29 7b 0a 20 20 53  clientData){.  S
4880: 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28  qliteDb *pDb = (
4890: 53 71 6c 69 74 65 44 62 2a 29 63 6c 69 65 6e 74  SqliteDb*)client
48a0: 44 61 74 61 3b 0a 20 20 61 73 73 65 72 74 28 70  Data;.  assert(p
48b0: 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f  Db->pRollbackHoo
48c0: 6b 29 3b 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b  k);.  if( TCL_OK
48d0: 21 3d 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28  !=Tcl_EvalObjEx(
48e0: 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62  pDb->interp, pDb
48f0: 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 2c  ->pRollbackHook,
4900: 20 30 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 42   0) ){.    Tcl_B
4910: 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 70  ackgroundError(p
4920: 44 62 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 7d  Db->interp);.  }
4930: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 70  .}../*.** This p
4940: 72 6f 63 65 64 75 72 65 20 68 61 6e 64 6c 65 73  rocedure handles
4950: 20 77 61 6c 5f 68 6f 6f 6b 20 63 61 6c 6c 62 61   wal_hook callba
4960: 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  cks..*/.static i
4970: 6e 74 20 44 62 57 61 6c 48 61 6e 64 6c 65 72 28  nt DbWalHandler(
4980: 0a 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44  .  void *clientD
4990: 61 74 61 2c 20 0a 20 20 73 71 6c 69 74 65 33 20  ata, .  sqlite3 
49a0: 2a 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68  *db, .  const ch
49b0: 61 72 20 2a 7a 44 62 2c 20 0a 20 20 69 6e 74 20  ar *zDb, .  int 
49c0: 6e 45 6e 74 72 79 0a 29 7b 0a 20 20 69 6e 74 20  nEntry.){.  int 
49d0: 72 65 74 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  ret = SQLITE_OK;
49e0: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 3b 0a 20  .  Tcl_Obj *p;. 
49f0: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
4a00: 20 28 53 71 6c 69 74 65 44 62 2a 29 63 6c 69 65   (SqliteDb*)clie
4a10: 6e 74 44 61 74 61 3b 0a 20 20 54 63 6c 5f 49 6e  ntData;.  Tcl_In
4a20: 74 65 72 70 20 2a 69 6e 74 65 72 70 20 3d 20 70  terp *interp = p
4a30: 44 62 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 61 73  Db->interp;.  as
4a40: 73 65 72 74 28 70 44 62 2d 3e 70 57 61 6c 48 6f  sert(pDb->pWalHo
4a50: 6f 6b 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ok);..  assert( 
4a60: 64 62 3d 3d 70 44 62 2d 3e 64 62 20 29 3b 0a 20  db==pDb->db );. 
4a70: 20 70 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61   p = Tcl_Duplica
4a80: 74 65 4f 62 6a 28 70 44 62 2d 3e 70 57 61 6c 48  teObj(pDb->pWalH
4a90: 6f 6f 6b 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72  ook);.  Tcl_Incr
4aa0: 52 65 66 43 6f 75 6e 74 28 70 29 3b 0a 20 20 54  RefCount(p);.  T
4ab0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
4ac0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
4ad0: 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  p, Tcl_NewString
4ae0: 4f 62 6a 28 7a 44 62 2c 20 2d 31 29 29 3b 0a 20  Obj(zDb, -1));. 
4af0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
4b00: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
4b10: 2c 20 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  , p, Tcl_NewIntO
4b20: 62 6a 28 6e 45 6e 74 72 79 29 29 3b 0a 20 20 69  bj(nEntry));.  i
4b30: 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 45  f( TCL_OK!=Tcl_E
4b40: 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c  valObjEx(interp,
4b50: 20 70 2c 20 30 29 20 0a 20 20 20 7c 7c 20 54 43   p, 0) .   || TC
4b60: 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 74  L_OK!=Tcl_GetInt
4b70: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
4b80: 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_GetObjResult
4b90: 28 69 6e 74 65 72 70 29 2c 20 26 72 65 74 29 0a  (interp), &ret).
4ba0: 20 20 29 7b 0a 20 20 20 20 54 63 6c 5f 42 61 63    ){.    Tcl_Bac
4bb0: 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74  kgroundError(int
4bc0: 65 72 70 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f  erp);.  }.  Tcl_
4bd0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 29 3b  DecrRefCount(p);
4be0: 0a 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a  ..  return ret;.
4bf0: 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  }..#if defined(S
4c00: 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20 64  QLITE_TEST) && d
4c10: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
4c20: 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49  ABLE_UNLOCK_NOTI
4c30: 46 59 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20  FY).static void 
4c40: 73 65 74 54 65 73 74 55 6e 6c 6f 63 6b 4e 6f 74  setTestUnlockNot
4c50: 69 66 79 56 61 72 73 28 54 63 6c 5f 49 6e 74 65  ifyVars(Tcl_Inte
4c60: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
4c70: 69 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 29 7b  iArg, int nArg){
4c80: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 36 34 5d  .  char zBuf[64]
4c90: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ;.  sqlite3_snpr
4ca0: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66  intf(sizeof(zBuf
4cb0: 29 2c 20 7a 42 75 66 2c 20 22 25 64 22 2c 20 69  ), zBuf, "%d", i
4cc0: 41 72 67 29 3b 0a 20 20 54 63 6c 5f 53 65 74 56  Arg);.  Tcl_SetV
4cd0: 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
4ce0: 74 65 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79  te_unlock_notify
4cf0: 5f 61 72 67 22 2c 20 7a 42 75 66 2c 20 54 43 4c  _arg", zBuf, TCL
4d00: 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20  _GLOBAL_ONLY);. 
4d10: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
4d20: 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20  f(sizeof(zBuf), 
4d30: 7a 42 75 66 2c 20 22 25 64 22 2c 20 6e 41 72 67  zBuf, "%d", nArg
4d40: 29 3b 0a 20 20 54 63 6c 5f 53 65 74 56 61 72 28  );.  Tcl_SetVar(
4d50: 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
4d60: 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 5f 61 72  unlock_notify_ar
4d70: 67 63 6f 75 6e 74 22 2c 20 7a 42 75 66 2c 20 54  gcount", zBuf, T
4d80: 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b  CL_GLOBAL_ONLY);
4d90: 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
4da0: 65 20 73 65 74 54 65 73 74 55 6e 6c 6f 63 6b 4e  e setTestUnlockN
4db0: 6f 74 69 66 79 56 61 72 73 28 78 2c 79 2c 7a 29  otifyVars(x,y,z)
4dc0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
4dd0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e  SQLITE_ENABLE_UN
4de0: 4c 4f 43 4b 5f 4e 4f 54 49 46 59 0a 73 74 61 74  LOCK_NOTIFY.stat
4df0: 69 63 20 76 6f 69 64 20 44 62 55 6e 6c 6f 63 6b  ic void DbUnlock
4e00: 4e 6f 74 69 66 79 28 76 6f 69 64 20 2a 2a 61 70  Notify(void **ap
4e10: 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 29 7b 0a  Arg, int nArg){.
4e20: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
4e30: 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =0; i<nArg; i++)
4e40: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  {.    const int 
4e50: 66 6c 61 67 73 20 3d 20 28 54 43 4c 5f 45 56 41  flags = (TCL_EVA
4e60: 4c 5f 47 4c 4f 42 41 4c 7c 54 43 4c 5f 45 56 41  L_GLOBAL|TCL_EVA
4e70: 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20 20 20 53  L_DIRECT);.    S
4e80: 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28  qliteDb *pDb = (
4e90: 53 71 6c 69 74 65 44 62 20 2a 29 61 70 41 72 67  SqliteDb *)apArg
4ea0: 5b 69 5d 3b 0a 20 20 20 20 73 65 74 54 65 73 74  [i];.    setTest
4eb0: 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 56 61 72 73  UnlockNotifyVars
4ec0: 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 69 2c  (pDb->interp, i,
4ed0: 20 6e 41 72 67 29 3b 0a 20 20 20 20 61 73 73 65   nArg);.    asse
4ee0: 72 74 28 20 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b  rt( pDb->pUnlock
4ef0: 4e 6f 74 69 66 79 29 3b 0a 20 20 20 20 54 63 6c  Notify);.    Tcl
4f00: 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e  _EvalObjEx(pDb->
4f10: 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 70 55 6e  interp, pDb->pUn
4f20: 6c 6f 63 6b 4e 6f 74 69 66 79 2c 20 66 6c 61 67  lockNotify, flag
4f30: 73 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72  s);.    Tcl_Decr
4f40: 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 55  RefCount(pDb->pU
4f50: 6e 6c 6f 63 6b 4e 6f 74 69 66 79 29 3b 0a 20 20  nlockNotify);.  
4f60: 20 20 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f    pDb->pUnlockNo
4f70: 74 69 66 79 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  tify = 0;.  }.}.
4f80: 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 76  #endif..static v
4f90: 6f 69 64 20 44 62 55 70 64 61 74 65 48 61 6e 64  oid DbUpdateHand
4fa0: 6c 65 72 28 0a 20 20 76 6f 69 64 20 2a 70 2c 20  ler(.  void *p, 
4fb0: 0a 20 20 69 6e 74 20 6f 70 2c 0a 20 20 63 6f 6e  .  int op,.  con
4fc0: 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 0a 20  st char *zDb, . 
4fd0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 62   const char *zTb
4fe0: 6c 2c 20 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74  l, .  sqlite_int
4ff0: 36 34 20 72 6f 77 69 64 0a 29 7b 0a 20 20 53 71  64 rowid.){.  Sq
5000: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53  liteDb *pDb = (S
5010: 71 6c 69 74 65 44 62 20 2a 29 70 3b 0a 20 20 54  qliteDb *)p;.  T
5020: 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 0a 20  cl_Obj *pCmd;.. 
5030: 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 70 55   assert( pDb->pU
5040: 70 64 61 74 65 48 6f 6f 6b 20 29 3b 0a 20 20 61  pdateHook );.  a
5050: 73 73 65 72 74 28 20 6f 70 3d 3d 53 51 4c 49 54  ssert( op==SQLIT
5060: 45 5f 49 4e 53 45 52 54 20 7c 7c 20 6f 70 3d 3d  E_INSERT || op==
5070: 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20 7c 7c  SQLITE_UPDATE ||
5080: 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 44 45 4c 45   op==SQLITE_DELE
5090: 54 45 20 29 3b 0a 0a 20 20 70 43 6d 64 20 3d 20  TE );..  pCmd = 
50a0: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
50b0: 28 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f  (pDb->pUpdateHoo
50c0: 6b 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65  k);.  Tcl_IncrRe
50d0: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20  fCount(pCmd);.  
50e0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
50f0: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64  dElement(0, pCmd
5100: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
5110: 62 6a 28 0a 20 20 20 20 28 20 28 6f 70 3d 3d 53  bj(.    ( (op==S
5120: 51 4c 49 54 45 5f 49 4e 53 45 52 54 29 3f 22 49  QLITE_INSERT)?"I
5130: 4e 53 45 52 54 22 3a 28 6f 70 3d 3d 53 51 4c 49  NSERT":(op==SQLI
5140: 54 45 5f 55 50 44 41 54 45 29 3f 22 55 50 44 41  TE_UPDATE)?"UPDA
5150: 54 45 22 3a 22 44 45 4c 45 54 45 22 29 2c 20 2d  TE":"DELETE"), -
5160: 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  1));.  Tcl_ListO
5170: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
5180: 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77  0, pCmd, Tcl_New
5190: 53 74 72 69 6e 67 4f 62 6a 28 7a 44 62 2c 20 2d  StringObj(zDb, -
51a0: 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  1));.  Tcl_ListO
51b0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
51c0: 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77  0, pCmd, Tcl_New
51d0: 53 74 72 69 6e 67 4f 62 6a 28 7a 54 62 6c 2c 20  StringObj(zTbl, 
51e0: 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  -1));.  Tcl_List
51f0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
5200: 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65  (0, pCmd, Tcl_Ne
5210: 77 57 69 64 65 49 6e 74 4f 62 6a 28 72 6f 77 69  wWideIntObj(rowi
5220: 64 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f  d));.  Tcl_EvalO
5230: 62 6a 45 78 28 70 44 62 2d 3e 69 6e 74 65 72 70  bjEx(pDb->interp
5240: 2c 20 70 43 6d 64 2c 20 54 43 4c 5f 45 56 41 4c  , pCmd, TCL_EVAL
5250: 5f 44 49 52 45 43 54 29 3b 0a 20 20 54 63 6c 5f  _DIRECT);.  Tcl_
5260: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d  DecrRefCount(pCm
5270: 64 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  d);.}..static vo
5280: 69 64 20 74 63 6c 43 6f 6c 6c 61 74 65 4e 65 65  id tclCollateNee
5290: 64 65 64 28 0a 20 20 76 6f 69 64 20 2a 70 43 74  ded(.  void *pCt
52a0: 78 2c 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  x,.  sqlite3 *db
52b0: 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 63  ,.  int enc,.  c
52c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
52d0: 0a 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  .){.  SqliteDb *
52e0: 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 20  pDb = (SqliteDb 
52f0: 2a 29 70 43 74 78 3b 0a 20 20 54 63 6c 5f 4f 62  *)pCtx;.  Tcl_Ob
5300: 6a 20 2a 70 53 63 72 69 70 74 20 3d 20 54 63 6c  j *pScript = Tcl
5310: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 44  _DuplicateObj(pD
5320: 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65  b->pCollateNeede
5330: 64 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65  d);.  Tcl_IncrRe
5340: 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b  fCount(pScript);
5350: 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
5360: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
5370: 53 63 72 69 70 74 2c 20 54 63 6c 5f 4e 65 77 53  Script, Tcl_NewS
5380: 74 72 69 6e 67 4f 62 6a 28 7a 4e 61 6d 65 2c 20  tringObj(zName, 
5390: 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c  -1));.  Tcl_Eval
53a0: 4f 62 6a 45 78 28 70 44 62 2d 3e 69 6e 74 65 72  ObjEx(pDb->inter
53b0: 70 2c 20 70 53 63 72 69 70 74 2c 20 30 29 3b 0a  p, pScript, 0);.
53c0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
53d0: 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 7d 0a 0a  nt(pScript);.}..
53e0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
53f0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
5400: 65 76 61 6c 75 61 74 65 20 61 6e 20 53 51 4c 20  evaluate an SQL 
5410: 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69  collation functi
5420: 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a  on implemented.*
5430: 2a 20 75 73 69 6e 67 20 54 43 4c 20 73 63 72 69  * using TCL scri
5440: 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  pt..*/.static in
5450: 74 20 74 63 6c 53 71 6c 43 6f 6c 6c 61 74 65 28  t tclSqlCollate(
5460: 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 0a 20  .  void *pCtx,. 
5470: 20 69 6e 74 20 6e 41 2c 0a 20 20 63 6f 6e 73 74   int nA,.  const
5480: 20 76 6f 69 64 20 2a 7a 41 2c 0a 20 20 69 6e 74   void *zA,.  int
5490: 20 6e 42 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69   nB,.  const voi
54a0: 64 20 2a 7a 42 0a 29 7b 0a 20 20 53 71 6c 43 6f  d *zB.){.  SqlCo
54b0: 6c 6c 61 74 65 20 2a 70 20 3d 20 28 53 71 6c 43  llate *p = (SqlC
54c0: 6f 6c 6c 61 74 65 20 2a 29 70 43 74 78 3b 0a 20  ollate *)pCtx;. 
54d0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a   Tcl_Obj *pCmd;.
54e0: 0a 20 20 70 43 6d 64 20 3d 20 54 63 6c 5f 4e 65  .  pCmd = Tcl_Ne
54f0: 77 53 74 72 69 6e 67 4f 62 6a 28 70 2d 3e 7a 53  wStringObj(p->zS
5500: 63 72 69 70 74 2c 20 2d 31 29 3b 0a 20 20 54 63  cript, -1);.  Tc
5510: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
5520: 43 6d 64 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  Cmd);.  Tcl_List
5530: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
5540: 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64  (p->interp, pCmd
5550: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
5560: 62 6a 28 7a 41 2c 20 6e 41 29 29 3b 0a 20 20 54  bj(zA, nA));.  T
5570: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
5580: 45 6c 65 6d 65 6e 74 28 70 2d 3e 69 6e 74 65 72  Element(p->inter
5590: 70 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77  p, pCmd, Tcl_New
55a0: 53 74 72 69 6e 67 4f 62 6a 28 7a 42 2c 20 6e 42  StringObj(zB, nB
55b0: 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62  ));.  Tcl_EvalOb
55c0: 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70  jEx(p->interp, p
55d0: 43 6d 64 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49  Cmd, TCL_EVAL_DI
55e0: 52 45 43 54 29 3b 0a 20 20 54 63 6c 5f 44 65 63  RECT);.  Tcl_Dec
55f0: 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b  rRefCount(pCmd);
5600: 0a 20 20 72 65 74 75 72 6e 20 28 61 74 6f 69 28  .  return (atoi(
5610: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73  Tcl_GetStringRes
5620: 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 29 29  ult(p->interp)))
5630: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
5640: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
5650: 64 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e  d to evaluate an
5660: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 69 6d   SQL function im
5670: 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 75 73 69  plemented.** usi
5680: 6e 67 20 54 43 4c 20 73 63 72 69 70 74 2e 0a 2a  ng TCL script..*
5690: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 63  /.static void tc
56a0: 6c 53 71 6c 46 75 6e 63 28 73 71 6c 69 74 65 33  lSqlFunc(sqlite3
56b0: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
56c0: 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c  t, int argc, sql
56d0: 69 74 65 33 5f 76 61 6c 75 65 2a 2a 61 72 67 76  ite3_value**argv
56e0: 29 7b 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70 20  ){.  SqlFunc *p 
56f0: 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64  = sqlite3_user_d
5700: 61 74 61 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  ata(context);.  
5710: 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 20  Tcl_Obj *pCmd;. 
5720: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63   int i;.  int rc
5730: 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 30  ;..  if( argc==0
5740: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
5750: 65 72 65 20 61 72 65 20 6e 6f 20 61 72 67 75 6d  ere are no argum
5760: 65 6e 74 73 20 74 6f 20 74 68 65 20 66 75 6e 63  ents to the func
5770: 74 69 6f 6e 2c 20 63 61 6c 6c 20 54 63 6c 5f 45  tion, call Tcl_E
5780: 76 61 6c 4f 62 6a 45 78 20 6f 6e 20 74 68 65 0a  valObjEx on the.
5790: 20 20 20 20 2a 2a 20 73 63 72 69 70 74 20 6f 62      ** script ob
57a0: 6a 65 63 74 20 64 69 72 65 63 74 6c 79 2e 20 20  ject directly.  
57b0: 54 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20  This allows the 
57c0: 54 43 4c 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20  TCL compiler to 
57d0: 67 65 6e 65 72 61 74 65 0a 20 20 20 20 2a 2a 20  generate.    ** 
57e0: 62 79 74 65 63 6f 64 65 20 66 6f 72 20 74 68 65  bytecode for the
57f0: 20 63 6f 6d 6d 61 6e 64 20 6f 6e 20 74 68 65 20   command on the 
5800: 66 69 72 73 74 20 69 6e 76 6f 63 61 74 69 6f 6e  first invocation
5810: 20 61 6e 64 20 74 68 75 73 20 6d 61 6b 65 0a 20   and thus make. 
5820: 20 20 20 2a 2a 20 73 75 62 73 65 71 75 65 6e 74     ** subsequent
5830: 20 69 6e 76 6f 63 61 74 69 6f 6e 73 20 6d 75 63   invocations muc
5840: 68 20 66 61 73 74 65 72 2e 20 2a 2f 0a 20 20 20  h faster. */.   
5850: 20 70 43 6d 64 20 3d 20 70 2d 3e 70 53 63 72 69   pCmd = p->pScri
5860: 70 74 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72  pt;.    Tcl_Incr
5870: 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a  RefCount(pCmd);.
5880: 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61      rc = Tcl_Eva
5890: 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70  lObjEx(p->interp
58a0: 2c 20 70 43 6d 64 2c 20 30 29 3b 0a 20 20 20 20  , pCmd, 0);.    
58b0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
58c0: 28 70 43 6d 64 29 3b 0a 20 20 7d 65 6c 73 65 7b  (pCmd);.  }else{
58d0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
58e0: 20 61 72 65 20 61 72 67 75 6d 65 6e 74 73 20 74   are arguments t
58f0: 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2c 20  o the function, 
5900: 6d 61 6b 65 20 61 20 73 68 61 6c 6c 6f 77 20 63  make a shallow c
5910: 6f 70 79 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  opy of the.    *
5920: 2a 20 73 63 72 69 70 74 20 6f 62 6a 65 63 74 2c  * script object,
5930: 20 6c 61 70 70 65 6e 64 20 74 68 65 20 61 72 67   lappend the arg
5940: 75 6d 65 6e 74 73 2c 20 74 68 65 6e 20 65 76 61  uments, then eva
5950: 6c 75 61 74 65 20 74 68 65 20 63 6f 70 79 2e 0a  luate the copy..
5960: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 42 79      **.    ** By
5970: 20 22 73 68 61 6c 6c 6f 77 22 20 63 6f 70 79 2c   "shallow" copy,
5980: 20 77 65 20 6d 65 61 6e 20 6f 6e 6c 79 20 74 68   we mean only th
5990: 65 20 6f 75 74 65 72 20 6c 69 73 74 20 54 63 6c  e outer list Tcl
59a0: 5f 4f 62 6a 20 69 73 20 64 75 70 6c 69 63 61 74  _Obj is duplicat
59b0: 65 64 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6e  ed..    ** The n
59c0: 65 77 20 54 63 6c 5f 4f 62 6a 20 63 6f 6e 74 61  ew Tcl_Obj conta
59d0: 69 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  ins pointers to 
59e0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6c 69 73  the original lis
59f0: 74 20 65 6c 65 6d 65 6e 74 73 2e 20 0a 20 20 20  t elements. .   
5a00: 20 2a 2a 20 54 68 61 74 20 77 61 79 2c 20 77 68   ** That way, wh
5a10: 65 6e 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28  en Tcl_EvalObjv(
5a20: 29 20 69 73 20 72 75 6e 20 61 6e 64 20 73 68 69  ) is run and shi
5a30: 6d 6d 65 72 73 20 74 68 65 20 66 69 72 73 74 20  mmers the first 
5a40: 65 6c 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 6f  element.    ** o
5a50: 66 20 74 68 65 20 6c 69 73 74 20 74 6f 20 74 63  f the list to tc
5a60: 6c 43 6d 64 4e 61 6d 65 54 79 70 65 2c 20 74 68  lCmdNameType, th
5a70: 61 74 20 61 6c 74 65 72 6e 61 74 65 20 72 65 70  at alternate rep
5a80: 72 65 73 65 6e 74 61 74 69 6f 6e 20 77 69 6c 6c  resentation will
5a90: 0a 20 20 20 20 2a 2a 20 62 65 20 70 72 65 73 65  .    ** be prese
5aa0: 72 76 65 64 20 61 6e 64 20 72 65 75 73 65 64 20  rved and reused 
5ab0: 6f 6e 20 74 68 65 20 6e 65 78 74 20 69 6e 76 6f  on the next invo
5ac0: 63 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  cation..    */. 
5ad0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 41 72     Tcl_Obj **aAr
5ae0: 67 3b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b  g;.    int nArg;
5af0: 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 4c 69 73  .    if( Tcl_Lis
5b00: 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28  tObjGetElements(
5b10: 70 2d 3e 69 6e 74 65 72 70 2c 20 70 2d 3e 70 53  p->interp, p->pS
5b20: 63 72 69 70 74 2c 20 26 6e 41 72 67 2c 20 26 61  cript, &nArg, &a
5b30: 41 72 67 29 20 29 7b 0a 20 20 20 20 20 20 73 71  Arg) ){.      sq
5b40: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
5b50: 6f 72 28 63 6f 6e 74 65 78 74 2c 20 54 63 6c 5f  or(context, Tcl_
5b60: 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28  GetStringResult(
5b70: 70 2d 3e 69 6e 74 65 72 70 29 2c 20 2d 31 29 3b  p->interp), -1);
5b80: 20 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a   .      return;.
5b90: 20 20 20 20 7d 20 20 20 20 20 0a 20 20 20 20 70      }     .    p
5ba0: 43 6d 64 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73  Cmd = Tcl_NewLis
5bb0: 74 4f 62 6a 28 6e 41 72 67 2c 20 61 41 72 67 29  tObj(nArg, aArg)
5bc0: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ;.    Tcl_IncrRe
5bd0: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20  fCount(pCmd);.  
5be0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67    for(i=0; i<arg
5bf0: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  c; i++){.      s
5c00: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 49  qlite3_value *pI
5c10: 6e 20 3d 20 61 72 67 76 5b 69 5d 3b 0a 20 20 20  n = argv[i];.   
5c20: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c     Tcl_Obj *pVal
5c30: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 0a 20  ;.            . 
5c40: 20 20 20 20 20 2f 2a 20 53 65 74 20 70 56 61 6c       /* Set pVal
5c50: 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
5c60: 69 27 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  i'th column of t
5c70: 68 69 73 20 72 6f 77 2e 20 2a 2f 0a 20 20 20 20  his row. */.    
5c80: 20 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65    switch( sqlite
5c90: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 49 6e  3_value_type(pIn
5ca0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73  ) ){.        cas
5cb0: 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b  e SQLITE_BLOB: {
5cc0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 62  .          int b
5cd0: 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  ytes = sqlite3_v
5ce0: 61 6c 75 65 5f 62 79 74 65 73 28 70 49 6e 29 3b  alue_bytes(pIn);
5cf0: 0a 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20  .          pVal 
5d00: 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72  = Tcl_NewByteArr
5d10: 61 79 4f 62 6a 28 73 71 6c 69 74 65 33 5f 76 61  ayObj(sqlite3_va
5d20: 6c 75 65 5f 62 6c 6f 62 28 70 49 6e 29 2c 20 62  lue_blob(pIn), b
5d30: 79 74 65 73 29 3b 0a 20 20 20 20 20 20 20 20 20  ytes);.         
5d40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
5d50: 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53  }.        case S
5d60: 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b  QLITE_INTEGER: {
5d70: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
5d80: 65 5f 69 6e 74 36 34 20 76 20 3d 20 73 71 6c 69  e_int64 v = sqli
5d90: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28  te3_value_int64(
5da0: 70 49 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pIn);.          
5db0: 69 66 28 20 76 3e 3d 2d 32 31 34 37 34 38 33 36  if( v>=-21474836
5dc0: 34 37 20 26 26 20 76 3c 3d 32 31 34 37 34 38 33  47 && v<=2147483
5dd0: 36 34 37 20 29 7b 0a 20 20 20 20 20 20 20 20 20  647 ){.         
5de0: 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65     pVal = Tcl_Ne
5df0: 77 49 6e 74 4f 62 6a 28 28 69 6e 74 29 76 29 3b  wIntObj((int)v);
5e00: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
5e10: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 56  {.            pV
5e20: 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 57 69 64 65  al = Tcl_NewWide
5e30: 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20 20 20  IntObj(v);.     
5e40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
5e50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
5e60: 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53  }.        case S
5e70: 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20  QLITE_FLOAT: {. 
5e80: 20 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20           double 
5e90: 72 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  r = sqlite3_valu
5ea0: 65 5f 64 6f 75 62 6c 65 28 70 49 6e 29 3b 0a 20  e_double(pIn);. 
5eb0: 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20           pVal = 
5ec0: 54 63 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f 62 6a  Tcl_NewDoubleObj
5ed0: 28 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  (r);.          b
5ee0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
5ef0: 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
5f00: 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  ITE_NULL: {.    
5f10: 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c        pVal = Tcl
5f20: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 2d  _NewStringObj(p-
5f30: 3e 70 44 62 2d 3e 7a 4e 75 6c 6c 2c 20 2d 31 29  >pDb->zNull, -1)
5f40: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
5f50: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
5f60: 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a       default: {.
5f70: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 62 79            int by
5f80: 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  tes = sqlite3_va
5f90: 6c 75 65 5f 62 79 74 65 73 28 70 49 6e 29 3b 0a  lue_bytes(pIn);.
5fa0: 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d            pVal =
5fb0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
5fc0: 6a 28 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  j((char *)sqlite
5fd0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 49 6e  3_value_text(pIn
5fe0: 29 2c 20 62 79 74 65 73 29 3b 0a 20 20 20 20 20  ), bytes);.     
5ff0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6000: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
6010: 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 4c 69 73      rc = Tcl_Lis
6020: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
6030: 74 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d  t(p->interp, pCm
6040: 64 2c 20 70 56 61 6c 29 3b 0a 20 20 20 20 20 20  d, pVal);.      
6050: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
6060: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
6070: 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20 20 20 20  nt(pCmd);.      
6080: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
6090: 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20  _error(context, 
60a0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73  Tcl_GetStringRes
60b0: 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c 20  ult(p->interp), 
60c0: 2d 31 29 3b 20 0a 20 20 20 20 20 20 20 20 72 65  -1); .        re
60d0: 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
60e0: 20 20 7d 0a 20 20 20 20 69 66 28 20 21 70 2d 3e    }.    if( !p->
60f0: 75 73 65 45 76 61 6c 4f 62 6a 76 20 29 7b 0a 20  useEvalObjv ){. 
6100: 20 20 20 20 20 2f 2a 20 54 63 6c 5f 45 76 61 6c       /* Tcl_Eval
6110: 4f 62 6a 45 78 28 29 20 77 69 6c 6c 20 61 75 74  ObjEx() will aut
6120: 6f 6d 61 74 69 63 61 6c 6c 79 20 63 61 6c 6c 20  omatically call 
6130: 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20 69  Tcl_EvalObjv() i
6140: 66 20 70 43 6d 64 0a 20 20 20 20 20 20 2a 2a 20  f pCmd.      ** 
6150: 69 73 20 61 20 6c 69 73 74 20 77 69 74 68 6f 75  is a list withou
6160: 74 20 61 20 73 74 72 69 6e 67 20 72 65 70 72 65  t a string repre
6170: 73 65 6e 74 61 74 69 6f 6e 2e 20 20 54 6f 20 70  sentation.  To p
6180: 72 65 76 65 6e 74 20 74 68 69 73 20 66 72 6f 6d  revent this from
6190: 0a 20 20 20 20 20 20 2a 2a 20 68 61 70 70 65 6e  .      ** happen
61a0: 69 6e 67 2c 20 6d 61 6b 65 20 73 75 72 65 20 70  ing, make sure p
61b0: 43 6d 64 20 68 61 73 20 61 20 76 61 6c 69 64 20  Cmd has a valid 
61c0: 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74  string represent
61d0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 54  ation */.      T
61e0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 70 43 6d  cl_GetString(pCm
61f0: 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  d);.    }.    rc
6200: 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78   = Tcl_EvalObjEx
6210: 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64  (p->interp, pCmd
6220: 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43  , TCL_EVAL_DIREC
6230: 54 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72  T);.    Tcl_Decr
6240: 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a  RefCount(pCmd);.
6250: 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 20 26 26    }..  if( rc &&
6260: 20 72 63 21 3d 54 43 4c 5f 52 45 54 55 52 4e 20   rc!=TCL_RETURN 
6270: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
6280: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
6290: 65 78 74 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  ext, Tcl_GetStri
62a0: 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65  ngResult(p->inte
62b0: 72 70 29 2c 20 2d 31 29 3b 20 0a 20 20 7d 65 6c  rp), -1); .  }el
62c0: 73 65 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  se{.    Tcl_Obj 
62d0: 2a 70 56 61 72 20 3d 20 54 63 6c 5f 47 65 74 4f  *pVar = Tcl_GetO
62e0: 62 6a 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65  bjResult(p->inte
62f0: 72 70 29 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a  rp);.    int n;.
6300: 20 20 20 20 75 38 20 2a 64 61 74 61 3b 0a 20 20      u8 *data;.  
6310: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
6320: 79 70 65 20 3d 20 28 70 56 61 72 2d 3e 74 79 70  ype = (pVar->typ
6330: 65 50 74 72 20 3f 20 70 56 61 72 2d 3e 74 79 70  ePtr ? pVar->typ
6340: 65 50 74 72 2d 3e 6e 61 6d 65 20 3a 20 22 22 29  ePtr->name : "")
6350: 3b 0a 20 20 20 20 63 68 61 72 20 63 20 3d 20 7a  ;.    char c = z
6360: 54 79 70 65 5b 30 5d 3b 0a 20 20 20 20 69 66 28  Type[0];.    if(
6370: 20 63 3d 3d 27 62 27 20 26 26 20 73 74 72 63 6d   c=='b' && strcm
6380: 70 28 7a 54 79 70 65 2c 22 62 79 74 65 61 72 72  p(zType,"bytearr
6390: 61 79 22 29 3d 3d 30 20 26 26 20 70 56 61 72 2d  ay")==0 && pVar-
63a0: 3e 62 79 74 65 73 3d 3d 30 20 29 7b 0a 20 20 20  >bytes==0 ){.   
63b0: 20 20 20 2f 2a 20 4f 6e 6c 79 20 72 65 74 75 72     /* Only retur
63c0: 6e 20 61 20 42 4c 4f 42 20 74 79 70 65 20 69 66  n a BLOB type if
63d0: 20 74 68 65 20 54 63 6c 20 76 61 72 69 61 62 6c   the Tcl variabl
63e0: 65 20 69 73 20 61 20 62 79 74 65 61 72 72 61 79  e is a bytearray
63f0: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 68 61   and.      ** ha
6400: 73 20 6e 6f 20 73 74 72 69 6e 67 20 72 65 70 72  s no string repr
6410: 65 73 65 6e 74 61 74 69 6f 6e 2e 20 2a 2f 0a 20  esentation. */. 
6420: 20 20 20 20 20 64 61 74 61 20 3d 20 54 63 6c 5f       data = Tcl_
6430: 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d  GetByteArrayFrom
6440: 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a 20  Obj(pVar, &n);. 
6450: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
6460: 75 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74  ult_blob(context
6470: 2c 20 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54  , data, n, SQLIT
6480: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
6490: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
64a0: 62 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79  b' && strcmp(zTy
64b0: 70 65 2c 22 62 6f 6f 6c 65 61 6e 22 29 3d 3d 30  pe,"boolean")==0
64c0: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 47 65   ){.      Tcl_Ge
64d0: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 30 2c 20 70  tIntFromObj(0, p
64e0: 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20  Var, &n);.      
64f0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
6500: 6e 74 28 63 6f 6e 74 65 78 74 2c 20 6e 29 3b 0a  nt(context, n);.
6510: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
6520: 3d 27 64 27 20 26 26 20 73 74 72 63 6d 70 28 7a  ='d' && strcmp(z
6530: 54 79 70 65 2c 22 64 6f 75 62 6c 65 22 29 3d 3d  Type,"double")==
6540: 30 20 29 7b 0a 20 20 20 20 20 20 64 6f 75 62 6c  0 ){.      doubl
6550: 65 20 72 3b 0a 20 20 20 20 20 20 54 63 6c 5f 47  e r;.      Tcl_G
6560: 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28  etDoubleFromObj(
6570: 30 2c 20 70 56 61 72 2c 20 26 72 29 3b 0a 20 20  0, pVar, &r);.  
6580: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
6590: 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78  lt_double(contex
65a0: 74 2c 20 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t, r);.    }else
65b0: 20 69 66 28 20 28 63 3d 3d 27 77 27 20 26 26 20   if( (c=='w' && 
65c0: 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 77 69  strcmp(zType,"wi
65d0: 64 65 49 6e 74 22 29 3d 3d 30 29 20 7c 7c 0a 20  deInt")==0) ||. 
65e0: 20 20 20 20 20 20 20 20 20 28 63 3d 3d 27 69 27           (c=='i'
65f0: 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65   && strcmp(zType
6600: 2c 22 69 6e 74 22 29 3d 3d 30 29 20 29 7b 0a 20  ,"int")==0) ){. 
6610: 20 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74       Tcl_WideInt
6620: 20 76 3b 0a 20 20 20 20 20 20 54 63 6c 5f 47 65   v;.      Tcl_Ge
6630: 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28  tWideIntFromObj(
6640: 30 2c 20 70 56 61 72 2c 20 26 76 29 3b 0a 20 20  0, pVar, &v);.  
6650: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
6660: 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74  lt_int64(context
6670: 2c 20 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , v);.    }else{
6680: 0a 20 20 20 20 20 20 64 61 74 61 20 3d 20 28 75  .      data = (u
6690: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 54  nsigned char *)T
66a0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
66b0: 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a 20  Obj(pVar, &n);. 
66c0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
66d0: 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74  ult_text(context
66e0: 2c 20 28 63 68 61 72 20 2a 29 64 61 74 61 2c 20  , (char *)data, 
66f0: 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  n, SQLITE_TRANSI
6700: 45 4e 54 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ENT);.    }.  }.
6710: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
6720: 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
6730: 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  TION./*.** This 
6740: 69 73 20 74 68 65 20 61 75 74 68 65 6e 74 69 63  is the authentic
6750: 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 2e 20  ation function. 
6760: 20 49 74 20 61 70 70 65 6e 64 73 20 74 68 65 20   It appends the 
6770: 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 0a 2a  authentication.*
6780: 2a 20 74 79 70 65 20 63 6f 64 65 20 61 6e 64 20  * type code and 
6790: 74 68 65 20 74 77 6f 20 61 72 67 75 6d 65 6e 74  the two argument
67a0: 73 20 74 6f 20 7a 43 6d 64 5b 5d 20 74 68 65 6e  s to zCmd[] then
67b0: 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 72 65 73   invokes the res
67c0: 75 6c 74 0a 2a 2a 20 6f 6e 20 74 68 65 20 69 6e  ult.** on the in
67d0: 74 65 72 70 72 65 74 65 72 2e 20 20 54 68 65 20  terpreter.  The 
67e0: 72 65 70 6c 79 20 69 73 20 65 78 61 6d 69 6e 65  reply is examine
67f0: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  d to determine i
6800: 66 20 74 68 65 0a 2a 2a 20 61 75 74 68 65 6e 74  f the.** authent
6810: 69 63 61 74 69 6f 6e 20 66 61 69 6c 73 20 6f 72  ication fails or
6820: 20 73 75 63 63 65 65 64 73 2e 0a 2a 2f 0a 73 74   succeeds..*/.st
6830: 61 74 69 63 20 69 6e 74 20 61 75 74 68 5f 63 61  atic int auth_ca
6840: 6c 6c 62 61 63 6b 28 0a 20 20 76 6f 69 64 20 2a  llback(.  void *
6850: 70 41 72 67 2c 0a 20 20 69 6e 74 20 63 6f 64 65  pArg,.  int code
6860: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
6870: 7a 41 72 67 31 2c 0a 20 20 63 6f 6e 73 74 20 63  zArg1,.  const c
6880: 68 61 72 20 2a 7a 41 72 67 32 2c 0a 20 20 63 6f  har *zArg2,.  co
6890: 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 33 2c  nst char *zArg3,
68a0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
68b0: 41 72 67 34 0a 23 69 66 64 65 66 20 53 51 4c 49  Arg4.#ifdef SQLI
68c0: 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49  TE_USER_AUTHENTI
68d0: 43 41 54 49 4f 4e 0a 20 20 2c 63 6f 6e 73 74 20  CATION.  ,const 
68e0: 63 68 61 72 20 2a 7a 41 72 67 35 0a 23 65 6e 64  char *zArg5.#end
68f0: 69 66 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  if.){.  const ch
6900: 61 72 20 2a 7a 43 6f 64 65 3b 0a 20 20 54 63 6c  ar *zCode;.  Tcl
6910: 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a 20 20  _DString str;.  
6920: 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20  int rc;.  const 
6930: 63 68 61 72 20 2a 7a 52 65 70 6c 79 3b 0a 20 20  char *zReply;.  
6940: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20  SqliteDb *pDb = 
6950: 28 53 71 6c 69 74 65 44 62 2a 29 70 41 72 67 3b  (SqliteDb*)pArg;
6960: 0a 20 20 69 66 28 20 70 44 62 2d 3e 64 69 73 61  .  if( pDb->disa
6970: 62 6c 65 41 75 74 68 20 29 20 72 65 74 75 72 6e  bleAuth ) return
6980: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73   SQLITE_OK;..  s
6990: 77 69 74 63 68 28 20 63 6f 64 65 20 29 7b 0a 20  witch( code ){. 
69a0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
69b0: 4f 50 59 20 20 20 20 20 20 20 20 20 20 20 20 20  OPY             
69c0: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
69d0: 5f 43 4f 50 59 22 3b 20 62 72 65 61 6b 3b 0a 20  _COPY"; break;. 
69e0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
69f0: 52 45 41 54 45 5f 49 4e 44 45 58 20 20 20 20 20  REATE_INDEX     
6a00: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
6a10: 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 22 3b 20  _CREATE_INDEX"; 
6a20: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
6a30: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41  SQLITE_CREATE_TA
6a40: 42 4c 45 20 20 20 20 20 20 3a 20 7a 43 6f 64 65  BLE      : zCode
6a50: 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  ="SQLITE_CREATE_
6a60: 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20  TABLE"; break;. 
6a70: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
6a80: 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58  REATE_TEMP_INDEX
6a90: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
6aa0: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44  _CREATE_TEMP_IND
6ab0: 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  EX"; break;.    
6ac0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41  case SQLITE_CREA
6ad0: 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 20 3a 20  TE_TEMP_TABLE : 
6ae0: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52  zCode="SQLITE_CR
6af0: 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 22  EATE_TEMP_TABLE"
6b00: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
6b10: 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  e SQLITE_CREATE_
6b20: 54 45 4d 50 5f 54 52 49 47 47 45 52 3a 20 7a 43  TEMP_TRIGGER: zC
6b30: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41  ode="SQLITE_CREA
6b40: 54 45 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 22  TE_TEMP_TRIGGER"
6b50: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
6b60: 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  e SQLITE_CREATE_
6b70: 54 45 4d 50 5f 56 49 45 57 20 20 3a 20 7a 43 6f  TEMP_VIEW  : zCo
6b80: 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54  de="SQLITE_CREAT
6b90: 45 5f 54 45 4d 50 5f 56 49 45 57 22 3b 20 62 72  E_TEMP_VIEW"; br
6ba0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
6bb0: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 52 49 47  LITE_CREATE_TRIG
6bc0: 47 45 52 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22  GER    : zCode="
6bd0: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 52  SQLITE_CREATE_TR
6be0: 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20  IGGER"; break;. 
6bf0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
6c00: 52 45 41 54 45 5f 56 49 45 57 20 20 20 20 20 20  REATE_VIEW      
6c10: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
6c20: 5f 43 52 45 41 54 45 5f 56 49 45 57 22 3b 20 62  _CREATE_VIEW"; b
6c30: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
6c40: 51 4c 49 54 45 5f 44 45 4c 45 54 45 20 20 20 20  QLITE_DELETE    
6c50: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
6c60: 22 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 22 3b  "SQLITE_DELETE";
6c70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
6c80: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44   SQLITE_DROP_IND
6c90: 45 58 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64  EX        : zCod
6ca0: 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49  e="SQLITE_DROP_I
6cb0: 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20  NDEX"; break;.  
6cc0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52    case SQLITE_DR
6cd0: 4f 50 5f 54 41 42 4c 45 20 20 20 20 20 20 20 20  OP_TABLE        
6ce0: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
6cf0: 44 52 4f 50 5f 54 41 42 4c 45 22 3b 20 62 72 65  DROP_TABLE"; bre
6d00: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
6d10: 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e  ITE_DROP_TEMP_IN
6d20: 44 45 58 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53  DEX   : zCode="S
6d30: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
6d40: 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20  INDEX"; break;. 
6d50: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
6d60: 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 20 20  ROP_TEMP_TABLE  
6d70: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
6d80: 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45  _DROP_TEMP_TABLE
6d90: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
6da0: 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54  se SQLITE_DROP_T
6db0: 45 4d 50 5f 54 52 49 47 47 45 52 20 3a 20 7a 43  EMP_TRIGGER : zC
6dc0: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50  ode="SQLITE_DROP
6dd0: 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 22 3b 20  _TEMP_TRIGGER"; 
6de0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
6df0: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
6e00: 5f 56 49 45 57 20 20 20 20 3a 20 7a 43 6f 64 65  _VIEW    : zCode
6e10: 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  ="SQLITE_DROP_TE
6e20: 4d 50 5f 56 49 45 57 22 3b 20 62 72 65 61 6b 3b  MP_VIEW"; break;
6e30: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
6e40: 5f 44 52 4f 50 5f 54 52 49 47 47 45 52 20 20 20  _DROP_TRIGGER   
6e50: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
6e60: 54 45 5f 44 52 4f 50 5f 54 52 49 47 47 45 52 22  TE_DROP_TRIGGER"
6e70: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
6e80: 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49  e SQLITE_DROP_VI
6e90: 45 57 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f  EW         : zCo
6ea0: 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f  de="SQLITE_DROP_
6eb0: 56 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20  VIEW"; break;.  
6ec0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e    case SQLITE_IN
6ed0: 53 45 52 54 20 20 20 20 20 20 20 20 20 20 20 20  SERT            
6ee0: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
6ef0: 49 4e 53 45 52 54 22 3b 20 62 72 65 61 6b 3b 0a  INSERT"; break;.
6f00: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
6f10: 50 52 41 47 4d 41 20 20 20 20 20 20 20 20 20 20  PRAGMA          
6f20: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
6f30: 45 5f 50 52 41 47 4d 41 22 3b 20 62 72 65 61 6b  E_PRAGMA"; break
6f40: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
6f50: 45 5f 52 45 41 44 20 20 20 20 20 20 20 20 20 20  E_READ          
6f60: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
6f70: 49 54 45 5f 52 45 41 44 22 3b 20 62 72 65 61 6b  ITE_READ"; break
6f80: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
6f90: 45 5f 53 45 4c 45 43 54 20 20 20 20 20 20 20 20  E_SELECT        
6fa0: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
6fb0: 49 54 45 5f 53 45 4c 45 43 54 22 3b 20 62 72 65  ITE_SELECT"; bre
6fc0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
6fd0: 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 20  ITE_TRANSACTION 
6fe0: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
6ff0: 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f  QLITE_TRANSACTIO
7000: 4e 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  N"; break;.    c
7010: 61 73 65 20 53 51 4c 49 54 45 5f 55 50 44 41 54  ase SQLITE_UPDAT
7020: 45 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a  E            : z
7030: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 55 50 44  Code="SQLITE_UPD
7040: 41 54 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ATE"; break;.   
7050: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 54 54   case SQLITE_ATT
7060: 41 43 48 20 20 20 20 20 20 20 20 20 20 20 20 3a  ACH            :
7070: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 41   zCode="SQLITE_A
7080: 54 54 41 43 48 22 3b 20 62 72 65 61 6b 3b 0a 20  TTACH"; break;. 
7090: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
70a0: 45 54 41 43 48 20 20 20 20 20 20 20 20 20 20 20  ETACH           
70b0: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
70c0: 5f 44 45 54 41 43 48 22 3b 20 62 72 65 61 6b 3b  _DETACH"; break;
70d0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
70e0: 5f 41 4c 54 45 52 5f 54 41 42 4c 45 20 20 20 20  _ALTER_TABLE    
70f0: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
7100: 54 45 5f 41 4c 54 45 52 5f 54 41 42 4c 45 22 3b  TE_ALTER_TABLE";
7110: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
7120: 20 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58 20   SQLITE_REINDEX 
7130: 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64            : zCod
7140: 65 3d 22 53 51 4c 49 54 45 5f 52 45 49 4e 44 45  e="SQLITE_REINDE
7150: 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  X"; break;.    c
7160: 61 73 65 20 53 51 4c 49 54 45 5f 41 4e 41 4c 59  ase SQLITE_ANALY
7170: 5a 45 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a  ZE           : z
7180: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 41 4e 41  Code="SQLITE_ANA
7190: 4c 59 5a 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20  LYZE"; break;.  
71a0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52    case SQLITE_CR
71b0: 45 41 54 45 5f 56 54 41 42 4c 45 20 20 20 20 20  EATE_VTABLE     
71c0: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
71d0: 43 52 45 41 54 45 5f 56 54 41 42 4c 45 22 3b 20  CREATE_VTABLE"; 
71e0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
71f0: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54 41 42  SQLITE_DROP_VTAB
7200: 4c 45 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65  LE       : zCode
7210: 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54  ="SQLITE_DROP_VT
7220: 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20  ABLE"; break;.  
7230: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 55    case SQLITE_FU
7240: 4e 43 54 49 4f 4e 20 20 20 20 20 20 20 20 20 20  NCTION          
7250: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
7260: 46 55 4e 43 54 49 4f 4e 22 3b 20 62 72 65 61 6b  FUNCTION"; break
7270: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
7280: 45 5f 53 41 56 45 50 4f 49 4e 54 20 20 20 20 20  E_SAVEPOINT     
7290: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
72a0: 49 54 45 5f 53 41 56 45 50 4f 49 4e 54 22 3b 20  ITE_SAVEPOINT"; 
72b0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
72c0: 53 51 4c 49 54 45 5f 52 45 43 55 52 53 49 56 45  SQLITE_RECURSIVE
72d0: 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65           : zCode
72e0: 3d 22 53 51 4c 49 54 45 5f 52 45 43 55 52 53 49  ="SQLITE_RECURSI
72f0: 56 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  VE"; break;.    
7300: 64 65 66 61 75 6c 74 20 20 20 20 20 20 20 20 20  default         
7310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3a 20                : 
7320: 7a 43 6f 64 65 3d 22 3f 3f 3f 3f 22 3b 20 62 72  zCode="????"; br
7330: 65 61 6b 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 44  eak;.  }.  Tcl_D
7340: 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29  StringInit(&str)
7350: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41  ;.  Tcl_DStringA
7360: 70 70 65 6e 64 28 26 73 74 72 2c 20 70 44 62 2d  ppend(&str, pDb-
7370: 3e 7a 41 75 74 68 2c 20 2d 31 29 3b 0a 20 20 54  >zAuth, -1);.  T
7380: 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64  cl_DStringAppend
7390: 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 43  Element(&str, zC
73a0: 6f 64 65 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72  ode);.  Tcl_DStr
73b0: 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ingAppendElement
73c0: 28 26 73 74 72 2c 20 7a 41 72 67 31 20 3f 20 7a  (&str, zArg1 ? z
73d0: 41 72 67 31 20 3a 20 22 22 29 3b 0a 20 20 54 63  Arg1 : "");.  Tc
73e0: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45  l_DStringAppendE
73f0: 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41 72  lement(&str, zAr
7400: 67 32 20 3f 20 7a 41 72 67 32 20 3a 20 22 22 29  g2 ? zArg2 : "")
7410: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41  ;.  Tcl_DStringA
7420: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74  ppendElement(&st
7430: 72 2c 20 7a 41 72 67 33 20 3f 20 7a 41 72 67 33  r, zArg3 ? zArg3
7440: 20 3a 20 22 22 29 3b 0a 20 20 54 63 6c 5f 44 53   : "");.  Tcl_DS
7450: 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65  tringAppendEleme
7460: 6e 74 28 26 73 74 72 2c 20 7a 41 72 67 34 20 3f  nt(&str, zArg4 ?
7470: 20 7a 41 72 67 34 20 3a 20 22 22 29 3b 0a 23 69   zArg4 : "");.#i
7480: 66 64 65 66 20 53 51 4c 49 54 45 5f 55 53 45 52  fdef SQLITE_USER
7490: 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a  _AUTHENTICATION.
74a0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
74b0: 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c  endElement(&str,
74c0: 20 7a 41 72 67 35 20 3f 20 7a 41 72 67 35 20 3a   zArg5 ? zArg5 :
74d0: 20 22 22 29 3b 0a 23 65 6e 64 69 66 20 20 0a 20   "");.#endif  . 
74e0: 20 72 63 20 3d 20 54 63 6c 5f 47 6c 6f 62 61 6c   rc = Tcl_Global
74f0: 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70  Eval(pDb->interp
7500: 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c  , Tcl_DStringVal
7510: 75 65 28 26 73 74 72 29 29 3b 0a 20 20 54 63 6c  ue(&str));.  Tcl
7520: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 73 74  _DStringFree(&st
7530: 72 29 3b 0a 20 20 7a 52 65 70 6c 79 20 3d 20 72  r);.  zReply = r
7540: 63 3d 3d 54 43 4c 5f 4f 4b 20 3f 20 54 63 6c 5f  c==TCL_OK ? Tcl_
7550: 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28  GetStringResult(
7560: 70 44 62 2d 3e 69 6e 74 65 72 70 29 20 3a 20 22  pDb->interp) : "
7570: 53 51 4c 49 54 45 5f 44 45 4e 59 22 3b 0a 20 20  SQLITE_DENY";.  
7580: 69 66 28 20 73 74 72 63 6d 70 28 7a 52 65 70 6c  if( strcmp(zRepl
7590: 79 2c 22 53 51 4c 49 54 45 5f 4f 4b 22 29 3d 3d  y,"SQLITE_OK")==
75a0: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
75b0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
75c0: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 52 65 70   if( strcmp(zRep
75d0: 6c 79 2c 22 53 51 4c 49 54 45 5f 44 45 4e 59 22  ly,"SQLITE_DENY"
75e0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  )==0 ){.    rc =
75f0: 20 53 51 4c 49 54 45 5f 44 45 4e 59 3b 0a 20 20   SQLITE_DENY;.  
7600: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
7610: 28 7a 52 65 70 6c 79 2c 22 53 51 4c 49 54 45 5f  (zReply,"SQLITE_
7620: 49 47 4e 4f 52 45 22 29 3d 3d 30 20 29 7b 0a 20  IGNORE")==0 ){. 
7630: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
7640: 47 4e 4f 52 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a  GNORE;.  }else{.
7650: 20 20 20 20 72 63 20 3d 20 39 39 39 3b 0a 20 20      rc = 999;.  
7660: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
7670: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
7680: 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
7690: 54 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  TION */../*.** T
76a0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 61 64  his routine read
76b0: 73 20 61 20 6c 69 6e 65 20 6f 66 20 74 65 78 74  s a line of text
76c0: 20 66 72 6f 6d 20 46 49 4c 45 20 69 6e 2c 20 73   from FILE in, s
76d0: 74 6f 72 65 73 0a 2a 2a 20 74 68 65 20 74 65 78  tores.** the tex
76e0: 74 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61  t in memory obta
76f0: 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
7700: 28 29 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61  () and returns a
7710: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
7720: 68 65 20 74 65 78 74 2e 20 20 4e 55 4c 4c 20 69  he text.  NULL i
7730: 73 20 72 65 74 75 72 6e 65 64 20 61 74 20 65 6e  s returned at en
7740: 64 20 6f 66 20 66 69 6c 65 2c 20 6f 72 20 69 66  d of file, or if
7750: 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 66 61 69   malloc().** fai
7760: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e  ls..**.** The in
7770: 74 65 72 66 61 63 65 20 69 73 20 6c 69 6b 65 20  terface is like 
7780: 22 72 65 61 64 6c 69 6e 65 22 20 62 75 74 20 6e  "readline" but n
7790: 6f 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 65  o command-line e
77a0: 64 69 74 69 6e 67 0a 2a 2a 20 69 73 20 64 6f 6e  diting.** is don
77b0: 65 2e 0a 2a 2a 0a 2a 2a 20 63 6f 70 69 65 64 20  e..**.** copied 
77c0: 66 72 6f 6d 20 73 68 65 6c 6c 2e 63 20 66 72 6f  from shell.c fro
77d0: 6d 20 27 2e 69 6d 70 6f 72 74 27 20 63 6f 6d 6d  m '.import' comm
77e0: 61 6e 64 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  and.*/.static ch
77f0: 61 72 20 2a 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e  ar *local_getlin
7800: 65 28 63 68 61 72 20 2a 7a 50 72 6f 6d 70 74 2c  e(char *zPrompt,
7810: 20 46 49 4c 45 20 2a 69 6e 29 7b 0a 20 20 63 68   FILE *in){.  ch
7820: 61 72 20 2a 7a 4c 69 6e 65 3b 0a 20 20 69 6e 74  ar *zLine;.  int
7830: 20 6e 4c 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 3b   nLine;.  int n;
7840: 0a 0a 20 20 6e 4c 69 6e 65 20 3d 20 31 30 30 3b  ..  nLine = 100;
7850: 0a 20 20 7a 4c 69 6e 65 20 3d 20 6d 61 6c 6c 6f  .  zLine = mallo
7860: 63 28 20 6e 4c 69 6e 65 20 29 3b 0a 20 20 69 66  c( nLine );.  if
7870: 28 20 7a 4c 69 6e 65 3d 3d 30 20 29 20 72 65 74  ( zLine==0 ) ret
7880: 75 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 30 3b 0a  urn 0;.  n = 0;.
7890: 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
78a0: 20 20 69 66 28 20 6e 2b 31 30 30 3e 6e 4c 69 6e    if( n+100>nLin
78b0: 65 20 29 7b 0a 20 20 20 20 20 20 6e 4c 69 6e 65  e ){.      nLine
78c0: 20 3d 20 6e 4c 69 6e 65 2a 32 20 2b 20 31 30 30   = nLine*2 + 100
78d0: 3b 0a 20 20 20 20 20 20 7a 4c 69 6e 65 20 3d 20  ;.      zLine = 
78e0: 72 65 61 6c 6c 6f 63 28 7a 4c 69 6e 65 2c 20 6e  realloc(zLine, n
78f0: 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Line);.      if(
7900: 20 7a 4c 69 6e 65 3d 3d 30 20 29 20 72 65 74 75   zLine==0 ) retu
7910: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
7920: 69 66 28 20 66 67 65 74 73 28 26 7a 4c 69 6e 65  if( fgets(&zLine
7930: 5b 6e 5d 2c 20 6e 4c 69 6e 65 20 2d 20 6e 2c 20  [n], nLine - n, 
7940: 69 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  in)==0 ){.      
7950: 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  if( n==0 ){.    
7960: 20 20 20 20 66 72 65 65 28 7a 4c 69 6e 65 29 3b      free(zLine);
7970: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
7980: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
7990: 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20   zLine[n] = 0;. 
79a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
79b0: 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 4c 69  }.    while( zLi
79c0: 6e 65 5b 6e 5d 20 29 7b 20 6e 2b 2b 3b 20 7d 0a  ne[n] ){ n++; }.
79d0: 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20 7a      if( n>0 && z
79e0: 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 6e 27 20  Line[n-1]=='\n' 
79f0: 29 7b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20  ){.      n--;.  
7a00: 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30      zLine[n] = 0
7a10: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
7a20: 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 4c 69 6e 65     }.  }.  zLine
7a30: 20 3d 20 72 65 61 6c 6c 6f 63 28 20 7a 4c 69 6e   = realloc( zLin
7a40: 65 2c 20 6e 2b 31 20 29 3b 0a 20 20 72 65 74 75  e, n+1 );.  retu
7a50: 72 6e 20 7a 4c 69 6e 65 3b 0a 7d 0a 0a 0a 2f 2a  rn zLine;.}.../*
7a60: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
7a70: 6e 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  n is part of the
7a80: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
7a90: 6f 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64 3a 0a  of the command:.
7aa0: 2a 2a 0a 2a 2a 20 20 20 24 64 62 20 74 72 61 6e  **.**   $db tran
7ab0: 73 61 63 74 69 6f 6e 20 5b 2d 64 65 66 65 72 72  saction [-deferr
7ac0: 65 64 7c 2d 69 6d 6d 65 64 69 61 74 65 7c 2d 65  ed|-immediate|-e
7ad0: 78 63 6c 75 73 69 76 65 5d 20 53 43 52 49 50 54  xclusive] SCRIPT
7ae0: 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6e 76  .**.** It is inv
7af0: 6f 6b 65 64 20 61 66 74 65 72 20 65 76 61 6c 75  oked after evalu
7b00: 61 74 69 6e 67 20 74 68 65 20 73 63 72 69 70 74  ating the script
7b10: 20 53 43 52 49 50 54 20 74 6f 20 63 6f 6d 6d 69   SCRIPT to commi
7b20: 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  t or rollback.**
7b30: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
7b40: 20 6f 72 20 73 61 76 65 70 6f 69 6e 74 20 6f 70   or savepoint op
7b50: 65 6e 65 64 20 62 79 20 74 68 65 20 5b 74 72 61  ened by the [tra
7b60: 6e 73 61 63 74 69 6f 6e 5d 20 63 6f 6d 6d 61 6e  nsaction] comman
7b70: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
7b80: 20 44 62 54 72 61 6e 73 50 6f 73 74 43 6d 64 28   DbTransPostCmd(
7b90: 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 64 61  .  ClientData da
7ba0: 74 61 5b 5d 2c 20 20 20 20 20 20 20 20 20 20 20  ta[],           
7bb0: 20 20 20 20 20 20 20 20 2f 2a 20 64 61 74 61 5b          /* data[
7bc0: 30 5d 20 69 73 20 74 68 65 20 53 71 6c 69 74 65  0] is the Sqlite
7bd0: 33 44 62 2a 20 66 6f 72 20 24 64 62 20 2a 2f 0a  3Db* for $db */.
7be0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
7bf0: 74 65 72 70 2c 20 20 20 20 20 20 20 20 20 20 20  terp,           
7c00: 20 20 20 20 20 20 20 2f 2a 20 54 63 6c 20 69 6e         /* Tcl in
7c10: 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 20 20 69  terpreter */.  i
7c20: 6e 74 20 72 65 73 75 6c 74 20 20 20 20 20 20 20  nt result       
7c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c40: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66      /* Result of
7c50: 20 65 76 61 6c 75 61 74 69 6e 67 20 53 43 52 49   evaluating SCRI
7c60: 50 54 20 2a 2f 0a 29 7b 0a 20 20 73 74 61 74 69  PT */.){.  stati
7c70: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f  c const char *co
7c80: 6e 73 74 20 61 7a 45 6e 64 5b 5d 20 3d 20 7b 0a  nst azEnd[] = {.
7c90: 20 20 20 20 22 52 45 4c 45 41 53 45 20 5f 74 63      "RELEASE _tc
7ca0: 6c 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22 2c 20  l_transaction", 
7cb0: 20 20 20 20 20 20 20 2f 2a 20 72 63 3d 3d 54 43         /* rc==TC
7cc0: 4c 5f 45 52 52 4f 52 2c 20 6e 54 72 61 6e 73 61  L_ERROR, nTransa
7cd0: 63 74 69 6f 6e 21 3d 30 20 2a 2f 0a 20 20 20 20  ction!=0 */.    
7ce0: 22 43 4f 4d 4d 49 54 22 2c 20 20 20 20 20 20 20  "COMMIT",       
7cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d00: 20 20 20 2f 2a 20 72 63 21 3d 54 43 4c 5f 45 52     /* rc!=TCL_ER
7d10: 52 4f 52 2c 20 6e 54 72 61 6e 73 61 63 74 69 6f  ROR, nTransactio
7d20: 6e 3d 3d 30 20 2a 2f 0a 20 20 20 20 22 52 4f 4c  n==0 */.    "ROL
7d30: 4c 42 41 43 4b 20 54 4f 20 5f 74 63 6c 5f 74 72  LBACK TO _tcl_tr
7d40: 61 6e 73 61 63 74 69 6f 6e 20 3b 20 52 45 4c 45  ansaction ; RELE
7d50: 41 53 45 20 5f 74 63 6c 5f 74 72 61 6e 73 61 63  ASE _tcl_transac
7d60: 74 69 6f 6e 22 2c 0a 20 20 20 20 22 52 4f 4c 4c  tion",.    "ROLL
7d70: 42 41 43 4b 22 20 20 20 20 20 20 20 20 20 20 20  BACK"           
7d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7d90: 20 72 63 3d 3d 54 43 4c 5f 45 52 52 4f 52 2c 20   rc==TCL_ERROR, 
7da0: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 30 20  nTransaction==0 
7db0: 2a 2f 0a 20 20 7d 3b 0a 20 20 53 71 6c 69 74 65  */.  };.  Sqlite
7dc0: 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74  Db *pDb = (Sqlit
7dd0: 65 44 62 2a 29 64 61 74 61 5b 30 5d 3b 0a 20 20  eDb*)data[0];.  
7de0: 69 6e 74 20 72 63 20 3d 20 72 65 73 75 6c 74 3b  int rc = result;
7df0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
7e00: 45 6e 64 3b 0a 0a 20 20 70 44 62 2d 3e 6e 54 72  End;..  pDb->nTr
7e10: 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 7a  ansaction--;.  z
7e20: 45 6e 64 20 3d 20 61 7a 45 6e 64 5b 28 72 63 3d  End = azEnd[(rc=
7e30: 3d 54 43 4c 5f 45 52 52 4f 52 29 2a 32 20 2b 20  =TCL_ERROR)*2 + 
7e40: 28 70 44 62 2d 3e 6e 54 72 61 6e 73 61 63 74 69  (pDb->nTransacti
7e50: 6f 6e 3d 3d 30 29 5d 3b 0a 0a 20 20 70 44 62 2d  on==0)];..  pDb-
7e60: 3e 64 69 73 61 62 6c 65 41 75 74 68 2b 2b 3b 0a  >disableAuth++;.
7e70: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 65 78    if( sqlite3_ex
7e80: 65 63 28 70 44 62 2d 3e 64 62 2c 20 7a 45 6e 64  ec(pDb->db, zEnd
7e90: 2c 20 30 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20  , 0, 0, 0) ){.  
7ea0: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61      /* This is a
7eb0: 20 74 72 69 63 6b 79 20 73 63 65 6e 61 72 69 6f   tricky scenario
7ec0: 20 74 6f 20 68 61 6e 64 6c 65 2e 20 54 68 65 20   to handle. The 
7ed0: 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 63 61 75 73  most likely caus
7ee0: 65 20 6f 66 20 61 6e 0a 20 20 20 20 20 20 2a 2a  e of an.      **
7ef0: 20 65 72 72 6f 72 20 69 73 20 74 68 61 74 20 74   error is that t
7f00: 68 65 20 65 78 65 63 28 29 20 61 62 6f 76 65 20  he exec() above 
7f10: 77 61 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74  was an attempt t
7f20: 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 0a 20 20  o commit the .  
7f30: 20 20 20 20 2a 2a 20 74 6f 70 2d 6c 65 76 65 6c      ** top-level
7f40: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61   transaction tha
7f50: 74 20 72 65 74 75 72 6e 65 64 20 53 51 4c 49 54  t returned SQLIT
7f60: 45 5f 42 55 53 59 2e 20 4f 72 2c 20 6c 65 73 73  E_BUSY. Or, less
7f70: 20 6c 69 6b 65 6c 79 2c 0a 20 20 20 20 20 20 2a   likely,.      *
7f80: 2a 20 74 68 61 74 20 61 6e 20 49 4f 2d 65 72 72  * that an IO-err
7f90: 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e  or has occurred.
7fa0: 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c   In either case,
7fb0: 20 74 68 72 6f 77 20 61 20 54 63 6c 20 65 78 63   throw a Tcl exc
7fc0: 65 70 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  eption.      ** 
7fd0: 61 6e 64 20 74 72 79 20 74 6f 20 72 6f 6c 6c 62  and try to rollb
7fe0: 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74  ack the transact
7ff0: 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ion..      **.  
8000: 20 20 20 20 2a 2a 20 42 75 74 20 69 74 20 63 6f      ** But it co
8010: 75 6c 64 20 61 6c 73 6f 20 62 65 20 74 68 61 74  uld also be that
8020: 20 74 68 65 20 75 73 65 72 20 65 78 65 63 75 74   the user execut
8030: 65 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 42  ed one or more B
8040: 45 47 49 4e 2c 20 0a 20 20 20 20 20 20 2a 2a 20  EGIN, .      ** 
8050: 43 4f 4d 4d 49 54 2c 20 53 41 56 45 50 4f 49 4e  COMMIT, SAVEPOIN
8060: 54 2c 20 52 45 4c 45 41 53 45 20 6f 72 20 52 4f  T, RELEASE or RO
8070: 4c 4c 42 41 43 4b 20 63 6f 6d 6d 61 6e 64 73 20  LLBACK commands 
8080: 74 68 61 74 20 61 72 65 20 63 6f 6e 66 75 73 69  that are confusi
8090: 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73  ng.      ** this
80a0: 20 6d 65 74 68 6f 64 27 73 20 6c 6f 67 69 63 2e   method's logic.
80b0: 20 4e 6f 74 20 63 6c 65 61 72 20 68 6f 77 20 74   Not clear how t
80c0: 68 69 73 20 77 6f 75 6c 64 20 62 65 20 62 65 73  his would be bes
80d0: 74 20 68 61 6e 64 6c 65 64 2e 0a 20 20 20 20 20  t handled..     
80e0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 21 3d   */.    if( rc!=
80f0: 54 43 4c 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20  TCL_ERROR ){.   
8100: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
8110: 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69  ult(interp, sqli
8120: 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e  te3_errmsg(pDb->
8130: 64 62 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  db), (char*)0);.
8140: 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45        rc = TCL_E
8150: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
8160: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62  sqlite3_exec(pDb
8170: 2d 3e 64 62 2c 20 22 52 4f 4c 4c 42 41 43 4b 22  ->db, "ROLLBACK"
8180: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  , 0, 0, 0);.  }.
8190: 20 20 70 44 62 2d 3e 64 69 73 61 62 6c 65 41 75    pDb->disableAu
81a0: 74 68 2d 2d 3b 0a 0a 20 20 72 65 74 75 72 6e 20  th--;..  return 
81b0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c  rc;.}../*.** Unl
81c0: 65 73 73 20 53 51 4c 49 54 45 5f 54 45 53 54 20  ess SQLITE_TEST 
81d0: 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68 69 73  is defined, this
81e0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 73   function is a s
81f0: 69 6d 70 6c 65 20 77 72 61 70 70 65 72 20 61 72  imple wrapper ar
8200: 6f 75 6e 64 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  ound.** sqlite3_
8210: 70 72 65 70 61 72 65 5f 76 32 28 29 2e 20 49 66  prepare_v2(). If
8220: 20 53 51 4c 49 54 45 5f 54 45 53 54 20 69 73 20   SQLITE_TEST is 
8230: 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 69 74  defined, then it
8240: 20 75 73 65 73 20 65 69 74 68 65 72 0a 2a 2a 20   uses either.** 
8250: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
8260: 76 32 28 29 20 6f 72 20 6c 65 67 61 63 79 20 69  v2() or legacy i
8270: 6e 74 65 72 66 61 63 65 20 73 71 6c 69 74 65 33  nterface sqlite3
8280: 5f 70 72 65 70 61 72 65 28 29 2c 20 64 65 70 65  _prepare(), depe
8290: 6e 64 69 6e 67 0a 2a 2a 20 6f 6e 20 77 68 65 74  nding.** on whet
82a0: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 5b  her or not the [
82b0: 64 62 5f 75 73 65 5f 6c 65 67 61 63 79 5f 70 72  db_use_legacy_pr
82c0: 65 70 61 72 65 5d 20 63 6f 6d 6d 61 6e 64 20 68  epare] command h
82d0: 61 73 20 62 65 65 6e 20 75 73 65 64 20 74 6f 20  as been used to 
82e0: 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 65 20 74 68  .** configure th
82f0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  e connection..*/
8300: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 62 50 72  .static int dbPr
8310: 65 70 61 72 65 28 0a 20 20 53 71 6c 69 74 65 44  epare(.  SqliteD
8320: 62 20 2a 70 44 62 2c 20 20 20 20 20 20 20 20 20  b *pDb,         
8330: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
8340: 62 61 73 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  base object */. 
8350: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
8360: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
8370: 20 2f 2a 20 53 51 4c 20 74 6f 20 63 6f 6d 70 69   /* SQL to compi
8380: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  le */.  sqlite3_
8390: 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 20 20  stmt **ppStmt,  
83a0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
83b0: 50 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  Prepared stateme
83c0: 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  nt */.  const ch
83d0: 61 72 20 2a 2a 70 7a 4f 75 74 20 20 20 20 20 20  ar **pzOut      
83e0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
83f0: 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 78 74 20  Pointer to next 
8400: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  SQL statement */
8410: 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .){.#ifdef SQLIT
8420: 45 5f 54 45 53 54 0a 20 20 69 66 28 20 70 44 62  E_TEST.  if( pDb
8430: 2d 3e 62 4c 65 67 61 63 79 50 72 65 70 61 72 65  ->bLegacyPrepare
8440: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73   ){.    return s
8450: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 70  qlite3_prepare(p
8460: 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  Db->db, zSql, -1
8470: 2c 20 70 70 53 74 6d 74 2c 20 70 7a 4f 75 74 29  , ppStmt, pzOut)
8480: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
8490: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 70 72  eturn sqlite3_pr
84a0: 65 70 61 72 65 5f 76 32 28 70 44 62 2d 3e 64 62  epare_v2(pDb->db
84b0: 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 70 70 53 74  , zSql, -1, ppSt
84c0: 6d 74 2c 20 70 7a 4f 75 74 29 3b 0a 7d 0a 0a 2f  mt, pzOut);.}../
84d0: 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74 68 65 20  *.** Search the 
84e0: 63 61 63 68 65 20 66 6f 72 20 61 20 70 72 65 70  cache for a prep
84f0: 61 72 65 64 2d 73 74 61 74 65 6d 65 6e 74 20 6f  ared-statement o
8500: 62 6a 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65  bject that imple
8510: 6d 65 6e 74 73 20 74 68 65 0a 2a 2a 20 66 69 72  ments the.** fir
8520: 73 74 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  st SQL statement
8530: 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 20 70   in the buffer p
8540: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70 61 72  ointed to by par
8550: 61 6d 65 74 65 72 20 7a 49 6e 2e 20 49 66 0a 2a  ameter zIn. If.*
8560: 2a 20 6e 6f 20 73 75 63 68 20 70 72 65 70 61 72  * no such prepar
8570: 65 64 2d 73 74 61 74 65 6d 65 6e 74 20 63 61 6e  ed-statement can
8580: 20 62 65 20 66 6f 75 6e 64 2c 20 61 6c 6c 6f 63   be found, alloc
8590: 61 74 65 20 61 6e 64 20 70 72 65 70 61 72 65 20  ate and prepare 
85a0: 61 20 6e 65 77 0a 2a 2a 20 6f 6e 65 2e 20 49 6e  a new.** one. In
85b0: 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 62 69   either case, bi
85c0: 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  nd the current v
85d0: 61 6c 75 65 73 20 6f 66 20 74 68 65 20 72 65 6c  alues of the rel
85e0: 65 76 61 6e 74 20 54 63 6c 0a 2a 2a 20 76 61 72  evant Tcl.** var
85f0: 69 61 62 6c 65 73 20 74 6f 20 61 6e 79 20 24 76  iables to any $v
8600: 61 72 2c 20 3a 76 61 72 20 6f 72 20 40 76 61 72  ar, :var or @var
8610: 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68   variables in th
8620: 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 42 65 66  e statement. Bef
8630: 6f 72 65 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67  ore.** returning
8640: 2c 20 73 65 74 20 2a 70 70 50 72 65 53 74 6d 74  , set *ppPreStmt
8650: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
8660: 20 70 72 65 70 61 72 65 64 2d 73 74 61 74 65 6d   prepared-statem
8670: 65 6e 74 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a  ent object..**.*
8680: 2a 20 4f 75 74 70 75 74 20 70 61 72 61 6d 65 74  * Output paramet
8690: 65 72 20 2a 70 7a 4f 75 74 20 69 73 20 73 65 74  er *pzOut is set
86a0: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
86b0: 20 6e 65 78 74 20 53 51 4c 20 73 74 61 74 65 6d   next SQL statem
86c0: 65 6e 74 20 69 6e 0a 2a 2a 20 62 75 66 66 65 72  ent in.** buffer
86d0: 20 7a 49 6e 2c 20 6f 72 20 74 6f 20 74 68 65 20   zIn, or to the 
86e0: 27 5c 30 27 20 62 79 74 65 20 61 74 20 74 68 65  '\0' byte at the
86f0: 20 65 6e 64 20 6f 66 20 7a 49 6e 20 69 66 20 74   end of zIn if t
8700: 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 6e 65  here is no.** ne
8710: 78 74 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  xt statement..**
8720: 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
8730: 6c 2c 20 54 43 4c 5f 4f 4b 20 69 73 20 72 65 74  l, TCL_OK is ret
8740: 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
8750: 2c 20 54 43 4c 5f 45 52 52 4f 52 20 69 73 20 72  , TCL_ERROR is r
8760: 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 61  eturned.** and a
8770: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
8780: 6c 6f 61 64 65 64 20 69 6e 74 6f 20 69 6e 74 65  loaded into inte
8790: 72 70 72 65 74 65 72 20 70 44 62 2d 3e 69 6e 74  rpreter pDb->int
87a0: 65 72 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  erp..*/.static i
87b0: 6e 74 20 64 62 50 72 65 70 61 72 65 41 6e 64 42  nt dbPrepareAndB
87c0: 69 6e 64 28 0a 20 20 53 71 6c 69 74 65 44 62 20  ind(.  SqliteDb 
87d0: 2a 70 44 62 2c 20 20 20 20 20 20 20 20 20 20 20  *pDb,           
87e0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
87f0: 73 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  se object */.  c
8800: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 49 6e 2c 20  har const *zIn, 
8810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8820: 2a 20 53 51 4c 20 74 6f 20 63 6f 6d 70 69 6c 65  * SQL to compile
8830: 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74   */.  char const
8840: 20 2a 2a 70 7a 4f 75 74 2c 20 20 20 20 20 20 20   **pzOut,       
8850: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f        /* OUT: Po
8860: 69 6e 74 65 72 20 74 6f 20 6e 65 78 74 20 53 51  inter to next SQ
8870: 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  L statement */. 
8880: 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74   SqlPreparedStmt
8890: 20 2a 2a 70 70 50 72 65 53 74 6d 74 20 20 20 20   **ppPreStmt    
88a0: 20 2f 2a 20 4f 55 54 3a 20 4f 62 6a 65 63 74 20   /* OUT: Object 
88b0: 75 73 65 64 20 74 6f 20 63 61 63 68 65 20 73 74  used to cache st
88c0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  atement */.){.  
88d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
88e0: 20 3d 20 7a 49 6e 3b 20 20 20 20 20 20 20 20 20   = zIn;         
88f0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 66 69  /* Pointer to fi
8900: 72 73 74 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  rst SQL statemen
8910: 74 20 69 6e 20 7a 49 6e 20 2a 2f 0a 20 20 73 71  t in zIn */.  sq
8920: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
8930: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  t = 0;        /*
8940: 20 50 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   Prepared statem
8950: 65 6e 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ent object */.  
8960: 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20  SqlPreparedStmt 
8970: 2a 70 50 72 65 53 74 6d 74 3b 20 20 20 20 20 20  *pPreStmt;      
8980: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 61  /* Pointer to ca
8990: 63 68 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a  ched statement *
89a0: 2f 0a 20 20 69 6e 74 20 6e 53 71 6c 3b 20 20 20  /.  int nSql;   
89b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
89c0: 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66      /* Length of
89d0: 20 7a 53 71 6c 20 69 6e 20 62 79 74 65 73 20 2a   zSql in bytes *
89e0: 2f 0a 20 20 69 6e 74 20 6e 56 61 72 20 3d 20 30  /.  int nVar = 0
89f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8a00: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8a10: 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20 73 74   variables in st
8a20: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
8a30: 20 69 50 61 72 6d 20 3d 20 30 3b 20 20 20 20 20   iParm = 0;     
8a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8a50: 4e 65 78 74 20 66 72 65 65 20 65 6e 74 72 79 20  Next free entry 
8a60: 69 6e 20 61 70 50 61 72 6d 20 2a 2f 0a 20 20 63  in apParm */.  c
8a70: 68 61 72 20 63 3b 0a 20 20 69 6e 74 20 69 3b 0a  har c;.  int i;.
8a80: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
8a90: 74 65 72 70 20 3d 20 70 44 62 2d 3e 69 6e 74 65  terp = pDb->inte
8aa0: 72 70 3b 0a 0a 20 20 2a 70 70 50 72 65 53 74 6d  rp;..  *ppPreStm
8ab0: 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 72 69  t = 0;..  /* Tri
8ac0: 6d 20 73 70 61 63 65 73 20 66 72 6f 6d 20 74 68  m spaces from th
8ad0: 65 20 73 74 61 72 74 20 6f 66 20 7a 53 71 6c 20  e start of zSql 
8ae0: 61 6e 64 20 63 61 6c 63 75 6c 61 74 65 20 74 68  and calculate th
8af0: 65 20 72 65 6d 61 69 6e 69 6e 67 20 6c 65 6e 67  e remaining leng
8b00: 74 68 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  th. */.  while( 
8b10: 28 63 20 3d 20 7a 53 71 6c 5b 30 5d 29 3d 3d 27  (c = zSql[0])=='
8b20: 20 27 20 7c 7c 20 63 3d 3d 27 5c 74 27 20 7c 7c   ' || c=='\t' ||
8b30: 20 63 3d 3d 27 5c 72 27 20 7c 7c 20 63 3d 3d 27   c=='\r' || c=='
8b40: 5c 6e 27 20 29 7b 20 7a 53 71 6c 2b 2b 3b 20 7d  \n' ){ zSql++; }
8b50: 0a 20 20 6e 53 71 6c 20 3d 20 73 74 72 6c 65 6e  .  nSql = strlen
8b60: 33 30 28 7a 53 71 6c 29 3b 0a 0a 20 20 66 6f 72  30(zSql);..  for
8b70: 28 70 50 72 65 53 74 6d 74 20 3d 20 70 44 62 2d  (pPreStmt = pDb-
8b80: 3e 73 74 6d 74 4c 69 73 74 3b 20 70 50 72 65 53  >stmtList; pPreS
8b90: 74 6d 74 3b 20 70 50 72 65 53 74 6d 74 3d 70 50  tmt; pPreStmt=pP
8ba0: 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 29 7b 0a  reStmt->pNext){.
8bb0: 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 50 72 65      int n = pPre
8bc0: 53 74 6d 74 2d 3e 6e 53 71 6c 3b 0a 20 20 20 20  Stmt->nSql;.    
8bd0: 69 66 28 20 6e 53 71 6c 3e 3d 6e 20 0a 20 20 20  if( nSql>=n .   
8be0: 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70       && memcmp(p
8bf0: 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 2c 20 7a  PreStmt->zSql, z
8c00: 53 71 6c 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 20  Sql, n)==0.     
8c10: 20 20 20 26 26 20 28 7a 53 71 6c 5b 6e 5d 3d 3d     && (zSql[n]==
8c20: 30 20 7c 7c 20 7a 53 71 6c 5b 6e 2d 31 5d 3d 3d  0 || zSql[n-1]==
8c30: 27 3b 27 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  ';').    ){.    
8c40: 20 20 70 53 74 6d 74 20 3d 20 70 50 72 65 53 74    pStmt = pPreSt
8c50: 6d 74 2d 3e 70 53 74 6d 74 3b 0a 20 20 20 20 20  mt->pStmt;.     
8c60: 20 2a 70 7a 4f 75 74 20 3d 20 26 7a 53 71 6c 5b   *pzOut = &zSql[
8c70: 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 5d 3b  pPreStmt->nSql];
8c80: 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 6e 20  ..      /* When 
8c90: 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
8ca0: 6d 65 6e 74 20 69 73 20 66 6f 75 6e 64 2c 20 75  ment is found, u
8cb0: 6e 6c 69 6e 6b 20 69 74 20 66 72 6f 6d 20 74 68  nlink it from th
8cc0: 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 63 68 65  e.      ** cache
8cd0: 20 6c 69 73 74 2e 20 20 49 74 20 77 69 6c 6c 20   list.  It will 
8ce0: 6c 61 74 65 72 20 62 65 20 61 64 64 65 64 20 62  later be added b
8cf0: 61 63 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e  ack to the begin
8d00: 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 6f 66  ning.      ** of
8d10: 20 74 68 65 20 63 61 63 68 65 20 6c 69 73 74 20   the cache list 
8d20: 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6d 70 6c  in order to impl
8d30: 65 6d 65 6e 74 20 4c 52 55 20 72 65 70 6c 61 63  ement LRU replac
8d40: 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  ement..      */.
8d50: 20 20 20 20 20 20 69 66 28 20 70 50 72 65 53 74        if( pPreSt
8d60: 6d 74 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20  mt->pPrev ){.   
8d70: 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 70       pPreStmt->p
8d80: 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 50  Prev->pNext = pP
8d90: 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 3b 0a 20  reStmt->pNext;. 
8da0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8db0: 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73      pDb->stmtLis
8dc0: 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e  t = pPreStmt->pN
8dd0: 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
8de0: 20 20 20 69 66 28 20 70 50 72 65 53 74 6d 74 2d     if( pPreStmt-
8df0: 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  >pNext ){.      
8e00: 20 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78    pPreStmt->pNex
8e10: 74 2d 3e 70 50 72 65 76 20 3d 20 70 50 72 65 53  t->pPrev = pPreS
8e20: 74 6d 74 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20  tmt->pPrev;.    
8e30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8e40: 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d   pDb->stmtLast =
8e50: 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76   pPreStmt->pPrev
8e60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8e70: 70 44 62 2d 3e 6e 53 74 6d 74 2d 2d 3b 0a 20 20  pDb->nStmt--;.  
8e80: 20 20 20 20 6e 56 61 72 20 3d 20 73 71 6c 69 74      nVar = sqlit
8e90: 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
8ea0: 72 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a  r_count(pStmt);.
8eb0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8ec0: 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49   }.  }.  .  /* I
8ed0: 66 20 6e 6f 20 70 72 65 70 61 72 65 64 20 73 74  f no prepared st
8ee0: 61 74 65 6d 65 6e 74 20 77 61 73 20 66 6f 75 6e  atement was foun
8ef0: 64 2e 20 43 6f 6d 70 69 6c 65 20 74 68 65 20 53  d. Compile the S
8f00: 51 4c 20 74 65 78 74 2e 20 41 6c 73 6f 20 61 6c  QL text. Also al
8f10: 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 61 20 6e 65  locate.  ** a ne
8f20: 77 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d  w SqlPreparedStm
8f30: 74 20 73 74 72 75 63 74 75 72 65 2e 20 20 2a 2f  t structure.  */
8f40: 0a 20 20 69 66 28 20 70 50 72 65 53 74 6d 74 3d  .  if( pPreStmt=
8f50: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42  =0 ){.    int nB
8f60: 79 74 65 3b 0a 0a 20 20 20 20 69 66 28 20 53 51  yte;..    if( SQ
8f70: 4c 49 54 45 5f 4f 4b 21 3d 64 62 50 72 65 70 61  LITE_OK!=dbPrepa
8f80: 72 65 28 70 44 62 2c 20 7a 53 71 6c 2c 20 26 70  re(pDb, zSql, &p
8f90: 53 74 6d 74 2c 20 70 7a 4f 75 74 29 20 29 7b 0a  Stmt, pzOut) ){.
8fa0: 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a        Tcl_SetObj
8fb0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
8fc0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
8fd0: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
8fe0: 44 62 2d 3e 64 62 29 2c 20 2d 31 29 29 3b 0a 20  Db->db), -1));. 
8ff0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
9000: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
9010: 20 69 66 28 20 70 53 74 6d 74 3d 3d 30 20 29 7b   if( pStmt==0 ){
9020: 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
9030: 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 65 72  E_OK!=sqlite3_er
9040: 72 63 6f 64 65 28 70 44 62 2d 3e 64 62 29 20 29  rcode(pDb->db) )
9050: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63  {.        /* A c
9060: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 65 72 72 6f  ompile-time erro
9070: 72 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  r in the stateme
9080: 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 54  nt. */.        T
9090: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
90a0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53  interp, Tcl_NewS
90b0: 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33  tringObj(sqlite3
90c0: 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29  _errmsg(pDb->db)
90d0: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20  , -1));.        
90e0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
90f0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
9100: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 74         /* The st
9110: 61 74 65 6d 65 6e 74 20 77 61 73 20 61 20 6e 6f  atement was a no
9120: 2d 6f 70 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74  -op.  Continue t
9130: 6f 20 74 68 65 20 6e 65 78 74 20 73 74 61 74 65  o the next state
9140: 6d 65 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  ment.        ** 
9150: 69 6e 20 74 68 65 20 53 51 4c 20 73 74 72 69 6e  in the SQL strin
9160: 67 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  g..        */.  
9170: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
9180: 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
9190: 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20   }..    assert( 
91a0: 70 50 72 65 53 74 6d 74 3d 3d 30 20 29 3b 0a 20  pPreStmt==0 );. 
91b0: 20 20 20 6e 56 61 72 20 3d 20 73 71 6c 69 74 65     nVar = sqlite
91c0: 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
91d0: 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20  _count(pStmt);. 
91e0: 20 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f     nByte = sizeo
91f0: 66 28 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d  f(SqlPreparedStm
9200: 74 29 20 2b 20 6e 56 61 72 2a 73 69 7a 65 6f 66  t) + nVar*sizeof
9210: 28 54 63 6c 5f 4f 62 6a 20 2a 29 3b 0a 20 20 20  (Tcl_Obj *);.   
9220: 20 70 50 72 65 53 74 6d 74 20 3d 20 28 53 71 6c   pPreStmt = (Sql
9230: 50 72 65 70 61 72 65 64 53 74 6d 74 2a 29 54 63  PreparedStmt*)Tc
9240: 6c 5f 41 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a  l_Alloc(nByte);.
9250: 20 20 20 20 6d 65 6d 73 65 74 28 70 50 72 65 53      memset(pPreS
9260: 74 6d 74 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a  tmt, 0, nByte);.
9270: 0a 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 70  .    pPreStmt->p
9280: 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20 20  Stmt = pStmt;.  
9290: 20 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c    pPreStmt->nSql
92a0: 20 3d 20 28 69 6e 74 29 28 2a 70 7a 4f 75 74 20   = (int)(*pzOut 
92b0: 2d 20 7a 53 71 6c 29 3b 0a 20 20 20 20 70 50 72  - zSql);.    pPr
92c0: 65 53 74 6d 74 2d 3e 7a 53 71 6c 20 3d 20 73 71  eStmt->zSql = sq
92d0: 6c 69 74 65 33 5f 73 71 6c 28 70 53 74 6d 74 29  lite3_sql(pStmt)
92e0: 3b 0a 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e  ;.    pPreStmt->
92f0: 61 70 50 61 72 6d 20 3d 20 28 54 63 6c 5f 4f 62  apParm = (Tcl_Ob
9300: 6a 20 2a 2a 29 26 70 50 72 65 53 74 6d 74 5b 31  j **)&pPreStmt[1
9310: 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ];.#ifdef SQLITE
9320: 5f 54 45 53 54 0a 20 20 20 20 69 66 28 20 70 50  _TEST.    if( pP
9330: 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 3d 3d 30 20  reStmt->zSql==0 
9340: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
9350: 43 6f 70 79 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63  Copy = Tcl_Alloc
9360: 28 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 20  (pPreStmt->nSql 
9370: 2b 20 31 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  + 1);.      memc
9380: 70 79 28 7a 43 6f 70 79 2c 20 7a 53 71 6c 2c 20  py(zCopy, zSql, 
9390: 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 29 3b  pPreStmt->nSql);
93a0: 0a 20 20 20 20 20 20 7a 43 6f 70 79 5b 70 50 72  .      zCopy[pPr
93b0: 65 53 74 6d 74 2d 3e 6e 53 71 6c 5d 20 3d 20 27  eStmt->nSql] = '
93c0: 5c 30 27 3b 0a 20 20 20 20 20 20 70 50 72 65 53  \0';.      pPreS
93d0: 74 6d 74 2d 3e 7a 53 71 6c 20 3d 20 7a 43 6f 70  tmt->zSql = zCop
93e0: 79 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  y;.    }.#endif.
93f0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
9400: 72 65 53 74 6d 74 20 29 3b 0a 20 20 61 73 73 65  reStmt );.  asse
9410: 72 74 28 20 73 74 72 6c 65 6e 33 30 28 70 50 72  rt( strlen30(pPr
9420: 65 53 74 6d 74 2d 3e 7a 53 71 6c 29 3d 3d 70 50  eStmt->zSql)==pP
9430: 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 20 29 3b 0a  reStmt->nSql );.
9440: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 6d 65 6d    assert( 0==mem
9450: 63 6d 70 28 70 50 72 65 53 74 6d 74 2d 3e 7a 53  cmp(pPreStmt->zS
9460: 71 6c 2c 20 7a 53 71 6c 2c 20 70 50 72 65 53 74  ql, zSql, pPreSt
9470: 6d 74 2d 3e 6e 53 71 6c 29 20 29 3b 0a 0a 20 20  mt->nSql) );..  
9480: 2f 2a 20 42 69 6e 64 20 76 61 6c 75 65 73 20 74  /* Bind values t
9490: 6f 20 70 61 72 61 6d 65 74 65 72 73 20 74 68 61  o parameters tha
94a0: 74 20 62 65 67 69 6e 20 77 69 74 68 20 24 20 6f  t begin with $ o
94b0: 72 20 3a 20 2a 2f 20 20 0a 20 20 66 6f 72 28 69  r : */  .  for(i
94c0: 3d 31 3b 20 69 3c 3d 6e 56 61 72 3b 20 69 2b 2b  =1; i<=nVar; i++
94d0: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
94e0: 72 20 2a 7a 56 61 72 20 3d 20 73 71 6c 69 74 65  r *zVar = sqlite
94f0: 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
9500: 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 20 69 29 3b  _name(pStmt, i);
9510: 0a 20 20 20 20 69 66 28 20 7a 56 61 72 21 3d 30  .    if( zVar!=0
9520: 20 26 26 20 28 7a 56 61 72 5b 30 5d 3d 3d 27 24   && (zVar[0]=='$
9530: 27 20 7c 7c 20 7a 56 61 72 5b 30 5d 3d 3d 27 3a  ' || zVar[0]==':
9540: 27 20 7c 7c 20 7a 56 61 72 5b 30 5d 3d 3d 27 40  ' || zVar[0]=='@
9550: 27 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  ') ){.      Tcl_
9560: 4f 62 6a 20 2a 70 56 61 72 20 3d 20 54 63 6c 5f  Obj *pVar = Tcl_
9570: 47 65 74 56 61 72 32 45 78 28 69 6e 74 65 72 70  GetVar2Ex(interp
9580: 2c 20 26 7a 56 61 72 5b 31 5d 2c 20 30 2c 20 30  , &zVar[1], 0, 0
9590: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 56 61  );.      if( pVa
95a0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  r ){.        int
95b0: 20 6e 3b 0a 20 20 20 20 20 20 20 20 75 38 20 2a   n;.        u8 *
95c0: 64 61 74 61 3b 0a 20 20 20 20 20 20 20 20 63 6f  data;.        co
95d0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20  nst char *zType 
95e0: 3d 20 28 70 56 61 72 2d 3e 74 79 70 65 50 74 72  = (pVar->typePtr
95f0: 20 3f 20 70 56 61 72 2d 3e 74 79 70 65 50 74 72   ? pVar->typePtr
9600: 2d 3e 6e 61 6d 65 20 3a 20 22 22 29 3b 0a 20 20  ->name : "");.  
9610: 20 20 20 20 20 20 63 68 61 72 20 63 20 3d 20 7a        char c = z
9620: 54 79 70 65 5b 30 5d 3b 0a 20 20 20 20 20 20 20  Type[0];.       
9630: 20 69 66 28 20 7a 56 61 72 5b 30 5d 3d 3d 27 40   if( zVar[0]=='@
9640: 27 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  ' ||.           
9650: 28 63 3d 3d 27 62 27 20 26 26 20 73 74 72 63 6d  (c=='b' && strcm
9660: 70 28 7a 54 79 70 65 2c 22 62 79 74 65 61 72 72  p(zType,"bytearr
9670: 61 79 22 29 3d 3d 30 20 26 26 20 70 56 61 72 2d  ay")==0 && pVar-
9680: 3e 62 79 74 65 73 3d 3d 30 29 20 29 7b 0a 20 20  >bytes==0) ){.  
9690: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 61 64 20          /* Load 
96a0: 61 20 42 4c 4f 42 20 74 79 70 65 20 69 66 20 74  a BLOB type if t
96b0: 68 65 20 54 63 6c 20 76 61 72 69 61 62 6c 65 20  he Tcl variable 
96c0: 69 73 20 61 20 62 79 74 65 61 72 72 61 79 20 61  is a bytearray a
96d0: 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nd.          ** 
96e0: 69 74 20 68 61 73 20 6e 6f 20 73 74 72 69 6e 67  it has no string
96f0: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
9700: 6f 72 20 74 68 65 20 68 6f 73 74 0a 20 20 20 20  or the host.    
9710: 20 20 20 20 20 20 2a 2a 20 70 61 72 61 6d 65 74        ** paramet
9720: 65 72 20 6e 61 6d 65 20 62 65 67 69 6e 73 20 77  er name begins w
9730: 69 74 68 20 22 40 22 2e 20 2a 2f 0a 20 20 20 20  ith "@". */.    
9740: 20 20 20 20 20 20 64 61 74 61 20 3d 20 54 63 6c        data = Tcl
9750: 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f  _GetByteArrayFro
9760: 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a  mObj(pVar, &n);.
9770: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
9780: 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d  3_bind_blob(pStm
9790: 74 2c 20 69 2c 20 64 61 74 61 2c 20 6e 2c 20 53  t, i, data, n, S
97a0: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
97b0: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63           Tcl_Inc
97c0: 72 52 65 66 43 6f 75 6e 74 28 70 56 61 72 29 3b  rRefCount(pVar);
97d0: 0a 20 20 20 20 20 20 20 20 20 20 70 50 72 65 53  .          pPreS
97e0: 74 6d 74 2d 3e 61 70 50 61 72 6d 5b 69 50 61 72  tmt->apParm[iPar
97f0: 6d 2b 2b 5d 20 3d 20 70 56 61 72 3b 0a 20 20 20  m++] = pVar;.   
9800: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
9810: 3d 3d 27 62 27 20 26 26 20 73 74 72 63 6d 70 28  =='b' && strcmp(
9820: 7a 54 79 70 65 2c 22 62 6f 6f 6c 65 61 6e 22 29  zType,"boolean")
9830: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
9840: 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
9850: 62 6a 28 69 6e 74 65 72 70 2c 20 70 56 61 72 2c  bj(interp, pVar,
9860: 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20   &n);.          
9870: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
9880: 28 70 53 74 6d 74 2c 20 69 2c 20 6e 29 3b 0a 20  (pStmt, i, n);. 
9890: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
98a0: 20 63 3d 3d 27 64 27 20 26 26 20 73 74 72 63 6d   c=='d' && strcm
98b0: 70 28 7a 54 79 70 65 2c 22 64 6f 75 62 6c 65 22  p(zType,"double"
98c0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
98d0: 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20    double r;.    
98e0: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 44 6f 75        Tcl_GetDou
98f0: 62 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  bleFromObj(inter
9900: 70 2c 20 70 56 61 72 2c 20 26 72 29 3b 0a 20 20  p, pVar, &r);.  
9910: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
9920: 62 69 6e 64 5f 64 6f 75 62 6c 65 28 70 53 74 6d  bind_double(pStm
9930: 74 2c 20 69 2c 20 72 29 3b 0a 20 20 20 20 20 20  t, i, r);.      
9940: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 63 3d 3d    }else if( (c==
9950: 27 77 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54  'w' && strcmp(zT
9960: 79 70 65 2c 22 77 69 64 65 49 6e 74 22 29 3d 3d  ype,"wideInt")==
9970: 30 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  0) ||.          
9980: 20 20 20 20 28 63 3d 3d 27 69 27 20 26 26 20 73      (c=='i' && s
9990: 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 69 6e 74  trcmp(zType,"int
99a0: 22 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  ")==0) ){.      
99b0: 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20      Tcl_WideInt 
99c0: 76 3b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  v;.          Tcl
99d0: 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f  _GetWideIntFromO
99e0: 62 6a 28 69 6e 74 65 72 70 2c 20 70 56 61 72 2c  bj(interp, pVar,
99f0: 20 26 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20   &v);.          
9a00: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
9a10: 36 34 28 70 53 74 6d 74 2c 20 69 2c 20 76 29 3b  64(pStmt, i, v);
9a20: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
9a30: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 20 3d            data =
9a40: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
9a50: 2a 29 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  *)Tcl_GetStringF
9a60: 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29  romObj(pVar, &n)
9a70: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
9a80: 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53  te3_bind_text(pS
9a90: 74 6d 74 2c 20 69 2c 20 28 63 68 61 72 20 2a 29  tmt, i, (char *)
9aa0: 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f  data, n, SQLITE_
9ab0: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20  STATIC);.       
9ac0: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
9ad0: 75 6e 74 28 70 56 61 72 29 3b 0a 20 20 20 20 20  unt(pVar);.     
9ae0: 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 61       pPreStmt->a
9af0: 70 50 61 72 6d 5b 69 50 61 72 6d 2b 2b 5d 20 3d  pParm[iParm++] =
9b00: 20 70 56 61 72 3b 0a 20 20 20 20 20 20 20 20 7d   pVar;.        }
9b10: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
9b20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
9b30: 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 69  nd_null(pStmt, i
9b40: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
9b50: 0a 20 20 7d 0a 20 20 70 50 72 65 53 74 6d 74 2d  .  }.  pPreStmt-
9b60: 3e 6e 50 61 72 6d 20 3d 20 69 50 61 72 6d 3b 0a  >nParm = iParm;.
9b70: 20 20 2a 70 70 50 72 65 53 74 6d 74 20 3d 20 70    *ppPreStmt = p
9b80: 50 72 65 53 74 6d 74 3b 0a 0a 20 20 72 65 74 75  PreStmt;..  retu
9b90: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
9ba0: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 73 74  .** Release a st
9bb0: 61 74 65 6d 65 6e 74 20 72 65 66 65 72 65 6e 63  atement referenc
9bc0: 65 20 6f 62 74 61 69 6e 65 64 20 62 79 20 63 61  e obtained by ca
9bd0: 6c 6c 69 6e 67 20 64 62 50 72 65 70 61 72 65 41  lling dbPrepareA
9be0: 6e 64 42 69 6e 64 28 29 2e 0a 2a 2a 20 54 68 65  ndBind()..** The
9bf0: 72 65 20 73 68 6f 75 6c 64 20 62 65 20 65 78 61  re should be exa
9c00: 63 74 6c 79 20 6f 6e 65 20 63 61 6c 6c 20 74 6f  ctly one call to
9c10: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66   this function f
9c20: 6f 72 20 65 61 63 68 20 63 61 6c 6c 20 74 6f 0a  or each call to.
9c30: 2a 2a 20 64 62 50 72 65 70 61 72 65 41 6e 64 42  ** dbPrepareAndB
9c40: 69 6e 64 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ind()..**.** If 
9c50: 74 68 65 20 64 69 73 63 61 72 64 20 70 61 72 61  the discard para
9c60: 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72  meter is non-zer
9c70: 6f 2c 20 74 68 65 6e 20 74 68 65 20 73 74 61 74  o, then the stat
9c80: 65 6d 65 6e 74 20 69 73 20 64 65 6c 65 74 65 64  ement is deleted
9c90: 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  .** immediately.
9ca0: 20 4f 74 68 65 72 77 69 73 65 20 69 74 20 69 73   Otherwise it is
9cb0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52   added to the LR
9cc0: 55 20 6c 69 73 74 20 61 6e 64 20 6d 61 79 20 62  U list and may b
9cd0: 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 62 79  e returned.** by
9ce0: 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 63 61   a subsequent ca
9cf0: 6c 6c 20 74 6f 20 64 62 50 72 65 70 61 72 65 41  ll to dbPrepareA
9d00: 6e 64 42 69 6e 64 28 29 2e 0a 2a 2f 0a 73 74 61  ndBind()..*/.sta
9d10: 74 69 63 20 76 6f 69 64 20 64 62 52 65 6c 65 61  tic void dbRelea
9d20: 73 65 53 74 6d 74 28 0a 20 20 53 71 6c 69 74 65  seStmt(.  Sqlite
9d30: 44 62 20 2a 70 44 62 2c 20 20 20 20 20 20 20 20  Db *pDb,        
9d40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
9d50: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
9d60: 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d    SqlPreparedStm
9d70: 74 20 2a 70 50 72 65 53 74 6d 74 2c 20 20 20 20  t *pPreStmt,    
9d80: 20 20 2f 2a 20 50 72 65 70 61 72 65 64 20 73 74    /* Prepared st
9d90: 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 20 74  atement handle t
9da0: 6f 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69  o release */.  i
9db0: 6e 74 20 64 69 73 63 61 72 64 20 20 20 20 20 20  nt discard      
9dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9dd0: 2a 20 54 72 75 65 20 74 6f 20 64 65 6c 65 74 65  * True to delete
9de0: 20 28 6e 6f 74 20 63 61 63 68 65 29 20 74 68 65   (not cache) the
9df0: 20 70 50 72 65 53 74 6d 74 20 2a 2f 0a 29 7b 0a   pPreStmt */.){.
9e00: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 46    int i;..  /* F
9e10: 72 65 65 20 74 68 65 20 62 6f 75 6e 64 20 73 74  ree the bound st
9e20: 72 69 6e 67 20 61 6e 64 20 62 6c 6f 62 20 70 61  ring and blob pa
9e30: 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 66 6f  rameters */.  fo
9e40: 72 28 69 3d 30 3b 20 69 3c 70 50 72 65 53 74 6d  r(i=0; i<pPreStm
9e50: 74 2d 3e 6e 50 61 72 6d 3b 20 69 2b 2b 29 7b 0a  t->nParm; i++){.
9e60: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
9e70: 6f 75 6e 74 28 70 50 72 65 53 74 6d 74 2d 3e 61  ount(pPreStmt->a
9e80: 70 50 61 72 6d 5b 69 5d 29 3b 0a 20 20 7d 0a 20  pParm[i]);.  }. 
9e90: 20 70 50 72 65 53 74 6d 74 2d 3e 6e 50 61 72 6d   pPreStmt->nParm
9ea0: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 44 62   = 0;..  if( pDb
9eb0: 2d 3e 6d 61 78 53 74 6d 74 3c 3d 30 20 7c 7c 20  ->maxStmt<=0 || 
9ec0: 64 69 73 63 61 72 64 20 29 7b 0a 20 20 20 20 2f  discard ){.    /
9ed0: 2a 20 49 66 20 74 68 65 20 63 61 63 68 65 20 69  * If the cache i
9ee0: 73 20 74 75 72 6e 65 64 20 6f 66 66 2c 20 64 65  s turned off, de
9ef0: 61 6c 6c 6f 63 61 74 65 64 20 74 68 65 20 73 74  allocated the st
9f00: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 64  atement */.    d
9f10: 62 46 72 65 65 53 74 6d 74 28 70 50 72 65 53 74  bFreeStmt(pPreSt
9f20: 6d 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  mt);.  }else{.  
9f30: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 70 72 65    /* Add the pre
9f40: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
9f50: 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
9f60: 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 6c 69   of the cache li
9f70: 73 74 2e 20 2a 2f 0a 20 20 20 20 70 50 72 65 53  st. */.    pPreS
9f80: 74 6d 74 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62  tmt->pNext = pDb
9f90: 2d 3e 73 74 6d 74 4c 69 73 74 3b 0a 20 20 20 20  ->stmtList;.    
9fa0: 70 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 20  pPreStmt->pPrev 
9fb0: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 44 62  = 0;.    if( pDb
9fc0: 2d 3e 73 74 6d 74 4c 69 73 74 20 29 7b 0a 20 20  ->stmtList ){.  
9fd0: 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74     pDb->stmtList
9fe0: 2d 3e 70 50 72 65 76 20 3d 20 70 50 72 65 53 74  ->pPrev = pPreSt
9ff0: 6d 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44  mt;.    }.    pD
a000: 62 2d 3e 73 74 6d 74 4c 69 73 74 20 3d 20 70 50  b->stmtList = pP
a010: 72 65 53 74 6d 74 3b 0a 20 20 20 20 69 66 28 20  reStmt;.    if( 
a020: 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 3d 3d 30  pDb->stmtLast==0
a030: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
a040: 28 20 70 44 62 2d 3e 6e 53 74 6d 74 3d 3d 30 20  ( pDb->nStmt==0 
a050: 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 73 74  );.      pDb->st
a060: 6d 74 4c 61 73 74 20 3d 20 70 50 72 65 53 74 6d  mtLast = pPreStm
a070: 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
a080: 20 20 20 20 61 73 73 65 72 74 28 20 70 44 62 2d      assert( pDb-
a090: 3e 6e 53 74 6d 74 3e 30 20 29 3b 0a 20 20 20 20  >nStmt>0 );.    
a0a0: 7d 0a 20 20 20 20 70 44 62 2d 3e 6e 53 74 6d 74  }.    pDb->nStmt
a0b0: 2b 2b 3b 0a 20 20 20 0a 20 20 20 20 2f 2a 20 49  ++;.   .    /* I
a0c0: 66 20 77 65 20 68 61 76 65 20 74 6f 6f 20 6d 61  f we have too ma
a0d0: 6e 79 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  ny statement in 
a0e0: 63 61 63 68 65 2c 20 72 65 6d 6f 76 65 20 74 68  cache, remove th
a0f0: 65 20 73 75 72 70 6c 75 73 20 66 72 6f 6d 20 0a  e surplus from .
a100: 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 64 20 6f      ** the end o
a110: 66 20 74 68 65 20 63 61 63 68 65 20 6c 69 73 74  f the cache list
a120: 2e 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28  .  */.    while(
a130: 20 70 44 62 2d 3e 6e 53 74 6d 74 3e 70 44 62 2d   pDb->nStmt>pDb-
a140: 3e 6d 61 78 53 74 6d 74 20 29 7b 0a 20 20 20 20  >maxStmt ){.    
a150: 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d    SqlPreparedStm
a160: 74 20 2a 70 4c 61 73 74 20 3d 20 70 44 62 2d 3e  t *pLast = pDb->
a170: 73 74 6d 74 4c 61 73 74 3b 0a 20 20 20 20 20 20  stmtLast;.      
a180: 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20  pDb->stmtLast = 
a190: 70 4c 61 73 74 2d 3e 70 50 72 65 76 3b 0a 20 20  pLast->pPrev;.  
a1a0: 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73      pDb->stmtLas
a1b0: 74 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  t->pNext = 0;.  
a1c0: 20 20 20 20 70 44 62 2d 3e 6e 53 74 6d 74 2d 2d      pDb->nStmt--
a1d0: 3b 0a 20 20 20 20 20 20 64 62 46 72 65 65 53 74  ;.      dbFreeSt
a1e0: 6d 74 28 70 4c 61 73 74 29 3b 0a 20 20 20 20 7d  mt(pLast);.    }
a1f0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74  .  }.}../*.** St
a200: 72 75 63 74 75 72 65 20 75 73 65 64 20 77 69 74  ructure used wit
a210: 68 20 64 62 45 76 61 6c 58 58 58 28 29 20 66 75  h dbEvalXXX() fu
a220: 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20  nctions:.**.**  
a230: 20 64 62 45 76 61 6c 49 6e 69 74 28 29 0a 2a 2a   dbEvalInit().**
a240: 20 20 20 64 62 45 76 61 6c 53 74 65 70 28 29 0a     dbEvalStep().
a250: 2a 2a 20 20 20 64 62 45 76 61 6c 46 69 6e 61 6c  **   dbEvalFinal
a260: 69 7a 65 28 29 0a 2a 2a 20 20 20 64 62 45 76 61  ize().**   dbEva
a270: 6c 52 6f 77 49 6e 66 6f 28 29 0a 2a 2a 20 20 20  lRowInfo().**   
a280: 64 62 45 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75  dbEvalColumnValu
a290: 65 28 29 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  e().*/.typedef s
a2a0: 74 72 75 63 74 20 44 62 45 76 61 6c 43 6f 6e 74  truct DbEvalCont
a2b0: 65 78 74 20 44 62 45 76 61 6c 43 6f 6e 74 65 78  ext DbEvalContex
a2c0: 74 3b 0a 73 74 72 75 63 74 20 44 62 45 76 61 6c  t;.struct DbEval
a2d0: 43 6f 6e 74 65 78 74 20 7b 0a 20 20 53 71 6c 69  Context {.  Sqli
a2e0: 74 65 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20  teDb *pDb;      
a2f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
a300: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
a310: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 71  /.  Tcl_Obj *pSq
a320: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
a330: 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 68 6f      /* Object ho
a340: 6c 64 69 6e 67 20 73 74 72 69 6e 67 20 7a 53 71  lding string zSq
a350: 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  l */.  const cha
a360: 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20 20  r *zSql;        
a370: 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 61 69 6e         /* Remain
a380: 69 6e 67 20 53 51 4c 20 74 6f 20 65 78 65 63 75  ing SQL to execu
a390: 74 65 20 2a 2f 0a 20 20 53 71 6c 50 72 65 70 61  te */.  SqlPrepa
a3a0: 72 65 64 53 74 6d 74 20 2a 70 50 72 65 53 74 6d  redStmt *pPreStm
a3b0: 74 3b 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65  t;      /* Curre
a3c0: 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  nt statement */.
a3d0: 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20    int nCol;     
a3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3f0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
a400: 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20  olumns returned 
a410: 62 79 20 70 53 74 6d 74 20 2a 2f 0a 20 20 54 63  by pStmt */.  Tc
a420: 6c 5f 4f 62 6a 20 2a 70 41 72 72 61 79 3b 20 20  l_Obj *pArray;  
a430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a440: 20 4e 61 6d 65 20 6f 66 20 61 72 72 61 79 20 76   Name of array v
a450: 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 54 63 6c  ariable */.  Tcl
a460: 5f 4f 62 6a 20 2a 2a 61 70 43 6f 6c 4e 61 6d 65  _Obj **apColName
a470: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
a480: 41 72 72 61 79 20 6f 66 20 63 6f 6c 75 6d 6e 20  Array of column 
a490: 6e 61 6d 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  names */.};../*.
a4a0: 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e 79 20 63  ** Release any c
a4b0: 61 63 68 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e  ache of column n
a4c0: 61 6d 65 73 20 63 75 72 72 65 6e 74 6c 79 20 68  ames currently h
a4d0: 65 6c 64 20 61 73 20 70 61 72 74 20 6f 66 0a 2a  eld as part of.*
a4e0: 2a 20 74 68 65 20 44 62 45 76 61 6c 43 6f 6e 74  * the DbEvalCont
a4f0: 65 78 74 20 73 74 72 75 63 74 75 72 65 20 70 61  ext structure pa
a500: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
a510: 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  t argument..*/.s
a520: 74 61 74 69 63 20 76 6f 69 64 20 64 62 52 65 6c  tatic void dbRel
a530: 65 61 73 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  easeColumnNames(
a540: 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 70  DbEvalContext *p
a550: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 6f  ){.  if( p->apCo
a560: 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 69 6e 74  lName ){.    int
a570: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
a580: 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29   i<p->nCol; i++)
a590: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72  {.      Tcl_Decr
a5a0: 52 65 66 43 6f 75 6e 74 28 70 2d 3e 61 70 43 6f  RefCount(p->apCo
a5b0: 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20 20 7d  lName[i]);.    }
a5c0: 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63  .    Tcl_Free((c
a5d0: 68 61 72 20 2a 29 70 2d 3e 61 70 43 6f 6c 4e 61  har *)p->apColNa
a5e0: 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 61 70 43 6f  me);.    p->apCo
a5f0: 6c 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  lName = 0;.  }. 
a600: 20 70 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 7d 0a   p->nCol = 0;.}.
a610: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
a620: 65 20 61 20 44 62 45 76 61 6c 43 6f 6e 74 65 78  e a DbEvalContex
a630: 74 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a  t structure..**.
a640: 2a 2a 20 49 66 20 70 41 72 72 61 79 20 69 73 20  ** If pArray is 
a650: 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69  not NULL, then i
a660: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e  t contains the n
a670: 61 6d 65 20 6f 66 20 61 20 54 63 6c 20 61 72 72  ame of a Tcl arr
a680: 61 79 0a 2a 2a 20 76 61 72 69 61 62 6c 65 2e 20  ay.** variable. 
a690: 54 68 65 20 22 2a 22 20 6d 65 6d 62 65 72 20 6f  The "*" member o
a6a0: 66 20 74 68 69 73 20 61 72 72 61 79 20 69 73 20  f this array is 
a6b0: 73 65 74 20 74 6f 20 61 20 6c 69 73 74 20 63 6f  set to a list co
a6c0: 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 74 68 65 20  ntaining.** the 
a6d0: 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f 6c  names of the col
a6e0: 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79  umns returned by
a6f0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 61   the statement a
a700: 73 20 70 61 72 74 20 6f 66 20 65 61 63 68 0a 2a  s part of each.*
a710: 2a 20 63 61 6c 6c 20 74 6f 20 64 62 45 76 61 6c  * call to dbEval
a720: 53 74 65 70 28 29 2c 20 69 6e 20 6f 72 64 65 72  Step(), in order
a730: 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69   from left to ri
a740: 67 68 74 2e 20 65 2e 67 2e 20 69 66 20 74 68 65  ght. e.g. if the
a750: 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 74 68   names .** of th
a760: 65 20 72 65 74 75 72 6e 65 64 20 63 6f 6c 75 6d  e returned colum
a770: 6e 73 20 61 72 65 20 61 2c 20 62 20 61 6e 64 20  ns are a, b and 
a780: 63 2c 20 69 74 20 64 6f 65 73 20 74 68 65 20 65  c, it does the e
a790: 71 75 69 76 61 6c 65 6e 74 20 6f 66 20 74 68 65  quivalent of the
a7a0: 20 0a 2a 2a 20 74 63 6c 20 63 6f 6d 6d 61 6e 64   .** tcl command
a7b0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 65 74 20  :.**.**     set 
a7c0: 24 7b 70 41 72 72 61 79 7d 28 2a 29 20 7b 61 20  ${pArray}(*) {a 
a7d0: 62 20 63 7d 0a 2a 2f 0a 73 74 61 74 69 63 20 76  b c}.*/.static v
a7e0: 6f 69 64 20 64 62 45 76 61 6c 49 6e 69 74 28 0a  oid dbEvalInit(.
a7f0: 20 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20    DbEvalContext 
a800: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
a810: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
a820: 73 74 72 75 63 74 75 72 65 20 74 6f 20 69 6e 69  structure to ini
a830: 74 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 53 71 6c  tialize */.  Sql
a840: 69 74 65 44 62 20 2a 70 44 62 2c 20 20 20 20 20  iteDb *pDb,     
a850: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a860: 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  Database handle 
a870: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53  */.  Tcl_Obj *pS
a880: 71 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ql,             
a890: 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 63       /* Object c
a8a0: 6f 6e 74 61 69 6e 69 6e 67 20 53 51 4c 20 73 63  ontaining SQL sc
a8b0: 72 69 70 74 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ript */.  Tcl_Ob
a8c0: 6a 20 2a 70 41 72 72 61 79 20 20 20 20 20 20 20  j *pArray       
a8d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
a8e0: 65 20 6f 66 20 54 63 6c 20 61 72 72 61 79 20 74  e of Tcl array t
a8f0: 6f 20 73 65 74 20 28 2a 29 20 65 6c 65 6d 65 6e  o set (*) elemen
a900: 74 20 6f 66 20 2a 2f 0a 29 7b 0a 20 20 6d 65 6d  t of */.){.  mem
a910: 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66  set(p, 0, sizeof
a920: 28 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 29 29  (DbEvalContext))
a930: 3b 0a 20 20 70 2d 3e 70 44 62 20 3d 20 70 44 62  ;.  p->pDb = pDb
a940: 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20 3d 20 54 63  ;.  p->zSql = Tc
a950: 6c 5f 47 65 74 53 74 72 69 6e 67 28 70 53 71 6c  l_GetString(pSql
a960: 29 3b 0a 20 20 70 2d 3e 70 53 71 6c 20 3d 20 70  );.  p->pSql = p
a970: 53 71 6c 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52  Sql;.  Tcl_IncrR
a980: 65 66 43 6f 75 6e 74 28 70 53 71 6c 29 3b 0a 20  efCount(pSql);. 
a990: 20 69 66 28 20 70 41 72 72 61 79 20 29 7b 0a 20   if( pArray ){. 
a9a0: 20 20 20 70 2d 3e 70 41 72 72 61 79 20 3d 20 70     p->pArray = p
a9b0: 41 72 72 61 79 3b 0a 20 20 20 20 54 63 6c 5f 49  Array;.    Tcl_I
a9c0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 41 72 72  ncrRefCount(pArr
a9d0: 61 79 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ay);.  }.}../*.*
a9e0: 2a 20 4f 62 74 61 69 6e 20 69 6e 66 6f 72 6d 61  * Obtain informa
a9f0: 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 72  tion about the r
aa00: 6f 77 20 74 68 61 74 20 74 68 65 20 44 62 45 76  ow that the DbEv
aa10: 61 6c 43 6f 6e 74 65 78 74 20 70 61 73 73 65 64  alContext passed
aa20: 20 61 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74   as the.** first
aa30: 20 61 72 67 75 6d 65 6e 74 20 63 75 72 72 65 6e   argument curren
aa40: 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a  tly points to..*
aa50: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 62  /.static void db
aa60: 45 76 61 6c 52 6f 77 49 6e 66 6f 28 0a 20 20 44  EvalRowInfo(.  D
aa70: 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 70 2c  bEvalContext *p,
aa80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
aa90: 2a 20 45 76 61 6c 75 61 74 69 6f 6e 20 63 6f 6e  * Evaluation con
aaa0: 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  text */.  int *p
aab0: 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  nCol,           
aac0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
aad0: 3a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  : Number of colu
aae0: 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 54 63  mn names */.  Tc
aaf0: 6c 5f 4f 62 6a 20 2a 2a 2a 70 61 70 43 6f 6c 4e  l_Obj ***papColN
ab00: 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ame           /*
ab10: 20 4f 55 54 3a 20 41 72 72 61 79 20 6f 66 20 63   OUT: Array of c
ab20: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 29  olumn names */.)
ab30: 7b 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63  {.  /* Compute c
ab40: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20  olumn names */. 
ab50: 20 69 66 28 20 30 3d 3d 70 2d 3e 61 70 43 6f 6c   if( 0==p->apCol
ab60: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Name ){.    sqli
ab70: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20  te3_stmt *pStmt 
ab80: 3d 20 70 2d 3e 70 50 72 65 53 74 6d 74 2d 3e 70  = p->pPreStmt->p
ab90: 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b  Stmt;.    int i;
aba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abb0: 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
abc0: 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  tor variable */.
abd0: 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20      int nCol;   
abe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abf0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
ac00: 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20  olumns returned 
ac10: 62 79 20 70 53 74 6d 74 20 2a 2f 0a 20 20 20 20  by pStmt */.    
ac20: 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 43 6f 6c 4e  Tcl_Obj **apColN
ac30: 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  ame = 0;      /*
ac40: 20 41 72 72 61 79 20 6f 66 20 63 6f 6c 75 6d 6e   Array of column
ac50: 20 6e 61 6d 65 73 20 2a 2f 0a 0a 20 20 20 20 70   names */..    p
ac60: 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 20 3d 20  ->nCol = nCol = 
ac70: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
ac80: 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20  ount(pStmt);.   
ac90: 20 69 66 28 20 6e 43 6f 6c 3e 30 20 26 26 20 28   if( nCol>0 && (
aca0: 70 61 70 43 6f 6c 4e 61 6d 65 20 7c 7c 20 70 2d  papColName || p-
acb0: 3e 70 41 72 72 61 79 29 20 29 7b 0a 20 20 20 20  >pArray) ){.    
acc0: 20 20 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 28 54    apColName = (T
acd0: 63 6c 5f 4f 62 6a 2a 2a 29 54 63 6c 5f 41 6c 6c  cl_Obj**)Tcl_All
ace0: 6f 63 28 20 73 69 7a 65 6f 66 28 54 63 6c 5f 4f  oc( sizeof(Tcl_O
acf0: 62 6a 2a 29 2a 6e 43 6f 6c 20 29 3b 0a 20 20 20  bj*)*nCol );.   
ad00: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
ad10: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
ad20: 20 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 20 3d    apColName[i] =
ad30: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
ad40: 6a 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  j(sqlite3_column
ad50: 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69 29 2c 20  _name(pStmt,i), 
ad60: 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c  -1);.        Tcl
ad70: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 61 70  _IncrRefCount(ap
ad80: 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20  ColName[i]);.   
ad90: 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 61 70     }.      p->ap
ada0: 43 6f 6c 4e 61 6d 65 20 3d 20 61 70 43 6f 6c 4e  ColName = apColN
adb0: 61 6d 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ame;.    }..    
adc0: 2f 2a 20 49 66 20 72 65 73 75 6c 74 73 20 61 72  /* If results ar
add0: 65 20 62 65 69 6e 67 20 73 74 6f 72 65 64 20 69  e being stored i
ade0: 6e 20 61 6e 20 61 72 72 61 79 20 76 61 72 69 61  n an array varia
adf0: 62 6c 65 2c 20 74 68 65 6e 20 63 72 65 61 74 65  ble, then create
ae00: 0a 20 20 20 20 2a 2a 20 74 68 65 20 61 72 72 61  .    ** the arra
ae10: 79 28 2a 29 20 65 6e 74 72 79 20 66 6f 72 20 74  y(*) entry for t
ae20: 68 61 74 20 61 72 72 61 79 0a 20 20 20 20 2a 2f  hat array.    */
ae30: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 41 72 72  .    if( p->pArr
ae40: 61 79 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  ay ){.      Tcl_
ae50: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 20 3d  Interp *interp =
ae60: 20 70 2d 3e 70 44 62 2d 3e 69 6e 74 65 72 70 3b   p->pDb->interp;
ae70: 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  .      Tcl_Obj *
ae80: 70 43 6f 6c 4c 69 73 74 20 3d 20 54 63 6c 5f 4e  pColList = Tcl_N
ae90: 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20 20 20 54  ewObj();.      T
aea0: 63 6c 5f 4f 62 6a 20 2a 70 53 74 61 72 20 3d 20  cl_Obj *pStar = 
aeb0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
aec0: 28 22 2a 22 2c 20 2d 31 29 3b 0a 0a 20 20 20 20  ("*", -1);..    
aed0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
aee0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
aef0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
af00: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
af10: 2c 20 70 43 6f 6c 4c 69 73 74 2c 20 61 70 43 6f  , pColList, apCo
af20: 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20 20 20  lName[i]);.     
af30: 20 7d 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 63   }.      Tcl_Inc
af40: 72 52 65 66 43 6f 75 6e 74 28 70 53 74 61 72 29  rRefCount(pStar)
af50: 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 53  ;.      Tcl_ObjS
af60: 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 70  etVar2(interp, p
af70: 2d 3e 70 41 72 72 61 79 2c 20 70 53 74 61 72 2c  ->pArray, pStar,
af80: 20 70 43 6f 6c 4c 69 73 74 2c 20 30 29 3b 0a 20   pColList, 0);. 
af90: 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66       Tcl_DecrRef
afa0: 43 6f 75 6e 74 28 70 53 74 61 72 29 3b 0a 20 20  Count(pStar);.  
afb0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
afc0: 61 70 43 6f 6c 4e 61 6d 65 20 29 7b 0a 20 20 20  apColName ){.   
afd0: 20 2a 70 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 70   *papColName = p
afe0: 2d 3e 61 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 7d  ->apColName;.  }
aff0: 0a 20 20 69 66 28 20 70 6e 43 6f 6c 20 29 7b 0a  .  if( pnCol ){.
b000: 20 20 20 20 2a 70 6e 43 6f 6c 20 3d 20 70 2d 3e      *pnCol = p->
b010: 6e 43 6f 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  nCol;.  }.}../*.
b020: 2a 2a 20 52 65 74 75 72 6e 20 6f 6e 65 20 6f 66  ** Return one of
b030: 20 54 43 4c 5f 4f 4b 2c 20 54 43 4c 5f 42 52 45   TCL_OK, TCL_BRE
b040: 41 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 2e  AK or TCL_ERROR.
b050: 20 49 66 20 54 43 4c 5f 45 52 52 4f 52 20 69 73   If TCL_ERROR is
b060: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2c 20 74 68  .** returned, th
b070: 65 6e 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  en an error mess
b080: 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  age is stored in
b090: 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72   the interpreter
b0a0: 20 62 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75 72   before.** retur
b0b0: 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65  ning..**.** A re
b0c0: 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 54 43  turn value of TC
b0d0: 4c 5f 4f 4b 20 6d 65 61 6e 73 20 74 68 65 72 65  L_OK means there
b0e0: 20 69 73 20 61 20 72 6f 77 20 6f 66 20 64 61 74   is a row of dat
b0f0: 61 20 61 76 61 69 6c 61 62 6c 65 2e 20 54 68 65  a available. The
b100: 0a 2a 2a 20 64 61 74 61 20 6d 61 79 20 62 65 20  .** data may be 
b110: 61 63 63 65 73 73 65 64 20 75 73 69 6e 67 20 64  accessed using d
b120: 62 45 76 61 6c 52 6f 77 49 6e 66 6f 28 29 20 61  bEvalRowInfo() a
b130: 6e 64 20 64 62 45 76 61 6c 43 6f 6c 75 6d 6e 56  nd dbEvalColumnV
b140: 61 6c 75 65 28 29 2e 20 54 68 69 73 0a 2a 2a 20  alue(). This.** 
b150: 69 73 20 61 6e 61 6c 6f 67 6f 75 73 20 74 6f 20  is analogous to 
b160: 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49  a return of SQLI
b170: 54 45 5f 52 4f 57 20 66 72 6f 6d 20 73 71 6c 69  TE_ROW from sqli
b180: 74 65 33 5f 73 74 65 70 28 29 2e 20 49 66 20 54  te3_step(). If T
b190: 43 4c 5f 42 52 45 41 4b 0a 2a 2a 20 69 73 20 72  CL_BREAK.** is r
b1a0: 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 74 68  eturned, then th
b1b0: 65 20 53 51 4c 20 73 63 72 69 70 74 20 68 61 73  e SQL script has
b1c0: 20 66 69 6e 69 73 68 65 64 20 65 78 65 63 75 74   finished execut
b1d0: 69 6e 67 20 61 6e 64 20 74 68 65 72 65 20 61 72  ing and there ar
b1e0: 65 0a 2a 2a 20 6e 6f 20 66 75 72 74 68 65 72 20  e.** no further 
b1f0: 72 6f 77 73 20 61 76 61 69 6c 61 62 6c 65 2e 20  rows available. 
b200: 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20  This is similar 
b210: 74 6f 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a  to SQLITE_DONE..
b220: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 62  */.static int db
b230: 45 76 61 6c 53 74 65 70 28 44 62 45 76 61 6c 43  EvalStep(DbEvalC
b240: 6f 6e 74 65 78 74 20 2a 70 29 7b 0a 20 20 63 6f  ontext *p){.  co
b250: 6e 73 74 20 63 68 61 72 20 2a 7a 50 72 65 76 53  nst char *zPrevS
b260: 71 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  ql = 0;       /*
b270: 20 50 72 65 76 69 6f 75 73 20 76 61 6c 75 65 20   Previous value 
b280: 6f 66 20 70 2d 3e 7a 53 71 6c 20 2a 2f 0a 0a 20  of p->zSql */.. 
b290: 20 77 68 69 6c 65 28 20 70 2d 3e 7a 53 71 6c 5b   while( p->zSql[
b2a0: 30 5d 20 7c 7c 20 70 2d 3e 70 50 72 65 53 74 6d  0] || p->pPreStm
b2b0: 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  t ){.    int rc;
b2c0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 50 72 65  .    if( p->pPre
b2d0: 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Stmt==0 ){.     
b2e0: 20 7a 50 72 65 76 53 71 6c 20 3d 20 28 70 2d 3e   zPrevSql = (p->
b2f0: 7a 53 71 6c 3d 3d 7a 50 72 65 76 53 71 6c 20 3f  zSql==zPrevSql ?
b300: 20 30 20 3a 20 70 2d 3e 7a 53 71 6c 29 3b 0a 20   0 : p->zSql);. 
b310: 20 20 20 20 20 72 63 20 3d 20 64 62 50 72 65 70       rc = dbPrep
b320: 61 72 65 41 6e 64 42 69 6e 64 28 70 2d 3e 70 44  areAndBind(p->pD
b330: 62 2c 20 70 2d 3e 7a 53 71 6c 2c 20 26 70 2d 3e  b, p->zSql, &p->
b340: 7a 53 71 6c 2c 20 26 70 2d 3e 70 50 72 65 53 74  zSql, &p->pPreSt
b350: 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  mt);.      if( r
b360: 63 21 3d 54 43 4c 5f 4f 4b 20 29 20 72 65 74 75  c!=TCL_OK ) retu
b370: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 65 6c 73 65  rn rc;.    }else
b380: 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 73 3b  {.      int rcs;
b390: 0a 20 20 20 20 20 20 53 71 6c 69 74 65 44 62 20  .      SqliteDb 
b3a0: 2a 70 44 62 20 3d 20 70 2d 3e 70 44 62 3b 0a 20  *pDb = p->pDb;. 
b3b0: 20 20 20 20 20 53 71 6c 50 72 65 70 61 72 65 64       SqlPrepared
b3c0: 53 74 6d 74 20 2a 70 50 72 65 53 74 6d 74 20 3d  Stmt *pPreStmt =
b3d0: 20 70 2d 3e 70 50 72 65 53 74 6d 74 3b 0a 20 20   p->pPreStmt;.  
b3e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
b3f0: 20 2a 70 53 74 6d 74 20 3d 20 70 50 72 65 53 74   *pStmt = pPreSt
b400: 6d 74 2d 3e 70 53 74 6d 74 3b 0a 0a 20 20 20 20  mt->pStmt;..    
b410: 20 20 72 63 73 20 3d 20 73 71 6c 69 74 65 33 5f    rcs = sqlite3_
b420: 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20  step(pStmt);.   
b430: 20 20 20 69 66 28 20 72 63 73 3d 3d 53 51 4c 49     if( rcs==SQLI
b440: 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20  TE_ROW ){.      
b450: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
b460: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
b470: 66 28 20 70 2d 3e 70 41 72 72 61 79 20 29 7b 0a  f( p->pArray ){.
b480: 20 20 20 20 20 20 20 20 64 62 45 76 61 6c 52 6f          dbEvalRo
b490: 77 49 6e 66 6f 28 70 2c 20 30 2c 20 30 29 3b 0a  wInfo(p, 0, 0);.
b4a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
b4b0: 73 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  s = sqlite3_rese
b4c0: 74 28 70 53 74 6d 74 29 3b 0a 0a 20 20 20 20 20  t(pStmt);..     
b4d0: 20 70 44 62 2d 3e 6e 53 74 65 70 20 3d 20 73 71   pDb->nStep = sq
b4e0: 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75  lite3_stmt_statu
b4f0: 73 28 70 53 74 6d 74 2c 53 51 4c 49 54 45 5f 53  s(pStmt,SQLITE_S
b500: 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43  TMTSTATUS_FULLSC
b510: 41 4e 5f 53 54 45 50 2c 31 29 3b 0a 20 20 20 20  AN_STEP,1);.    
b520: 20 20 70 44 62 2d 3e 6e 53 6f 72 74 20 3d 20 73    pDb->nSort = s
b530: 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74  qlite3_stmt_stat
b540: 75 73 28 70 53 74 6d 74 2c 53 51 4c 49 54 45 5f  us(pStmt,SQLITE_
b550: 53 54 4d 54 53 54 41 54 55 53 5f 53 4f 52 54 2c  STMTSTATUS_SORT,
b560: 31 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 6e  1);.      pDb->n
b570: 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 5f  Index = sqlite3_
b580: 73 74 6d 74 5f 73 74 61 74 75 73 28 70 53 74 6d  stmt_status(pStm
b590: 74 2c 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  t,SQLITE_STMTSTA
b5a0: 54 55 53 5f 41 55 54 4f 49 4e 44 45 58 2c 31 29  TUS_AUTOINDEX,1)
b5b0: 3b 0a 20 20 20 20 20 20 64 62 52 65 6c 65 61 73  ;.      dbReleas
b5c0: 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 29 3b  eColumnNames(p);
b5d0: 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 65 53 74  .      p->pPreSt
b5e0: 6d 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69  mt = 0;..      i
b5f0: 66 28 20 72 63 73 21 3d 53 51 4c 49 54 45 5f 4f  f( rcs!=SQLITE_O
b600: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  K ){.        /* 
b610: 49 66 20 61 20 72 75 6e 2d 74 69 6d 65 20 65 72  If a run-time er
b620: 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 70 6f  ror occurs, repo
b630: 72 74 20 74 68 65 20 65 72 72 6f 72 20 61 6e 64  rt the error and
b640: 20 73 74 6f 70 20 72 65 61 64 69 6e 67 0a 20 20   stop reading.  
b650: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c        ** the SQL
b660: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 64 62  .  */.        db
b670: 52 65 6c 65 61 73 65 53 74 6d 74 28 70 44 62 2c  ReleaseStmt(pDb,
b680: 20 70 50 72 65 53 74 6d 74 2c 20 31 29 3b 0a 23   pPreStmt, 1);.#
b690: 69 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  if SQLITE_TEST. 
b6a0: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 44         if( p->pD
b6b0: 62 2d 3e 62 4c 65 67 61 63 79 50 72 65 70 61 72  b->bLegacyPrepar
b6c0: 65 20 26 26 20 72 63 73 3d 3d 53 51 4c 49 54 45  e && rcs==SQLITE
b6d0: 5f 53 43 48 45 4d 41 20 26 26 20 7a 50 72 65 76  _SCHEMA && zPrev
b6e0: 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Sql ){.         
b6f0: 20 2f 2a 20 49 66 20 74 68 65 20 72 75 6e 74 69   /* If the runti
b700: 6d 65 20 65 72 72 6f 72 20 77 61 73 20 61 6e 20  me error was an 
b710: 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 2c 20 61  SQLITE_SCHEMA, a
b720: 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  nd the database.
b730: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61 6e            ** han
b740: 64 6c 65 20 69 73 20 63 6f 6e 66 69 67 75 72 65  dle is configure
b750: 64 20 74 6f 20 75 73 65 20 74 68 65 20 6c 65 67  d to use the leg
b760: 61 63 79 20 73 71 6c 69 74 65 33 5f 70 72 65 70  acy sqlite3_prep
b770: 61 72 65 28 29 20 0a 20 20 20 20 20 20 20 20 20  are() .         
b780: 20 2a 2a 20 69 6e 74 65 72 66 61 63 65 2c 20 72   ** interface, r
b790: 65 74 72 79 20 70 72 65 70 61 72 65 28 29 2f 73  etry prepare()/s
b7a0: 74 65 70 28 29 20 6f 6e 20 74 68 65 20 73 61 6d  tep() on the sam
b7b0: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  e SQL statement.
b7c0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68  .          ** Th
b7d0: 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20  is only happens 
b7e0: 6f 6e 63 65 2e 20 49 66 20 74 68 65 72 65 20 69  once. If there i
b7f0: 73 20 61 20 73 65 63 6f 6e 64 20 53 51 4c 49 54  s a second SQLIT
b800: 45 5f 53 43 48 45 4d 41 0a 20 20 20 20 20 20 20  E_SCHEMA.       
b810: 20 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74 68 65     ** error, the
b820: 20 65 72 72 6f 72 20 77 69 6c 6c 20 62 65 20 72   error will be r
b830: 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
b840: 61 6c 6c 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  aller. */.      
b850: 20 20 20 20 70 2d 3e 7a 53 71 6c 20 3d 20 7a 50      p->zSql = zP
b860: 72 65 76 53 71 6c 3b 0a 20 20 20 20 20 20 20 20  revSql;.        
b870: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
b880: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
b890: 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52       Tcl_SetObjR
b8a0: 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72  esult(pDb->inter
b8b0: 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
b8c0: 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
b8d0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c  NewStringObj(sql
b8e0: 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d  ite3_errmsg(pDb-
b8f0: 3e 64 62 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20  >db), -1));.    
b900: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
b910: 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73  RROR;.      }els
b920: 65 7b 0a 20 20 20 20 20 20 20 20 64 62 52 65 6c  e{.        dbRel
b930: 65 61 73 65 53 74 6d 74 28 70 44 62 2c 20 70 50  easeStmt(pDb, pP
b940: 72 65 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  reStmt, 0);.    
b950: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
b960: 20 2f 2a 20 46 69 6e 69 73 68 65 64 20 2a 2f 0a   /* Finished */.
b970: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 42 52 45    return TCL_BRE
b980: 41 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  AK;.}../*.** Fre
b990: 65 20 61 6c 6c 20 72 65 73 6f 75 72 63 65 73 20  e all resources 
b9a0: 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 62  currently held b
b9b0: 79 20 74 68 65 20 44 62 45 76 61 6c 43 6f 6e 74  y the DbEvalCont
b9c0: 65 78 74 20 73 74 72 75 63 74 75 72 65 20 70 61  ext structure pa
b9d0: 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66  ssed.** as the f
b9e0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54  irst argument. T
b9f0: 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 65  here should be e
ba00: 78 61 63 74 6c 79 20 6f 6e 65 20 63 61 6c 6c 20  xactly one call 
ba10: 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
ba20: 0a 2a 2a 20 66 6f 72 20 65 61 63 68 20 63 61 6c  .** for each cal
ba30: 6c 20 74 6f 20 64 62 45 76 61 6c 49 6e 69 74 28  l to dbEvalInit(
ba40: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
ba50: 64 20 64 62 45 76 61 6c 46 69 6e 61 6c 69 7a 65  d dbEvalFinalize
ba60: 28 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a  (DbEvalContext *
ba70: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72  p){.  if( p->pPr
ba80: 65 53 74 6d 74 20 29 7b 0a 20 20 20 20 73 71 6c  eStmt ){.    sql
ba90: 69 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 50  ite3_reset(p->pP
baa0: 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74 29 3b 0a  reStmt->pStmt);.
bab0: 20 20 20 20 64 62 52 65 6c 65 61 73 65 53 74 6d      dbReleaseStm
bac0: 74 28 70 2d 3e 70 44 62 2c 20 70 2d 3e 70 50 72  t(p->pDb, p->pPr
bad0: 65 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 70  eStmt, 0);.    p
bae0: 2d 3e 70 50 72 65 53 74 6d 74 20 3d 20 30 3b 0a  ->pPreStmt = 0;.
baf0: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 41 72    }.  if( p->pAr
bb00: 72 61 79 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44  ray ){.    Tcl_D
bb10: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70  ecrRefCount(p->p
bb20: 41 72 72 61 79 29 3b 0a 20 20 20 20 70 2d 3e 70  Array);.    p->p
bb30: 41 72 72 61 79 20 3d 20 30 3b 0a 20 20 7d 0a 20  Array = 0;.  }. 
bb40: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
bb50: 74 28 70 2d 3e 70 53 71 6c 29 3b 0a 20 20 64 62  t(p->pSql);.  db
bb60: 52 65 6c 65 61 73 65 43 6f 6c 75 6d 6e 4e 61 6d  ReleaseColumnNam
bb70: 65 73 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  es(p);.}../*.** 
bb80: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
bb90: 20 74 6f 20 61 20 54 63 6c 5f 4f 62 6a 20 73 74   to a Tcl_Obj st
bba0: 72 75 63 74 75 72 65 20 77 69 74 68 20 72 65 66  ructure with ref
bbb0: 2d 63 6f 75 6e 74 20 30 20 74 68 61 74 20 63 6f  -count 0 that co
bbc0: 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20 76 61  ntains.** the va
bbd0: 6c 75 65 20 66 6f 72 20 74 68 65 20 69 43 6f 6c  lue for the iCol
bbe0: 27 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  'th column of th
bbf0: 65 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79 20  e row currently 
bc00: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 0a 2a 2a  pointed to by.**
bc10: 20 74 68 65 20 44 62 45 76 61 6c 43 6f 6e 74 65   the DbEvalConte
bc20: 78 74 20 73 74 72 75 63 74 75 72 65 20 70 61 73  xt structure pas
bc30: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
bc40: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
bc50: 61 74 69 63 20 54 63 6c 5f 4f 62 6a 20 2a 64 62  atic Tcl_Obj *db
bc60: 45 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65 28  EvalColumnValue(
bc70: 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 70  DbEvalContext *p
bc80: 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 73  , int iCol){.  s
bc90: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
bca0: 6d 74 20 3d 20 70 2d 3e 70 50 72 65 53 74 6d 74  mt = p->pPreStmt
bcb0: 2d 3e 70 53 74 6d 74 3b 0a 20 20 73 77 69 74 63  ->pStmt;.  switc
bcc0: 68 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  h( sqlite3_colum
bcd0: 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c 20 69 43  n_type(pStmt, iC
bce0: 6f 6c 29 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ol) ){.    case 
bcf0: 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20  SQLITE_BLOB: {. 
bd00: 20 20 20 20 20 69 6e 74 20 62 79 74 65 73 20 3d       int bytes =
bd10: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
bd20: 62 79 74 65 73 28 70 53 74 6d 74 2c 20 69 43 6f  bytes(pStmt, iCo
bd30: 6c 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  l);.      const 
bd40: 63 68 61 72 20 2a 7a 42 6c 6f 62 20 3d 20 73 71  char *zBlob = sq
bd50: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f  lite3_column_blo
bd60: 62 28 70 53 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a  b(pStmt, iCol);.
bd70: 20 20 20 20 20 20 69 66 28 20 21 7a 42 6c 6f 62        if( !zBlob
bd80: 20 29 20 62 79 74 65 73 20 3d 20 30 3b 0a 20 20   ) bytes = 0;.  
bd90: 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e      return Tcl_N
bda0: 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 28  ewByteArrayObj((
bdb0: 75 38 2a 29 7a 42 6c 6f 62 2c 20 62 79 74 65 73  u8*)zBlob, bytes
bdc0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  );.    }.    cas
bdd0: 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  e SQLITE_INTEGER
bde0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
bdf0: 5f 69 6e 74 36 34 20 76 20 3d 20 73 71 6c 69 74  _int64 v = sqlit
be00: 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28  e3_column_int64(
be10: 70 53 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20 20  pStmt, iCol);.  
be20: 20 20 20 20 69 66 28 20 76 3e 3d 2d 32 31 34 37      if( v>=-2147
be30: 34 38 33 36 34 37 20 26 26 20 76 3c 3d 32 31 34  483647 && v<=214
be40: 37 34 38 33 36 34 37 20 29 7b 0a 20 20 20 20 20  7483647 ){.     
be50: 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e 65     return Tcl_Ne
be60: 77 49 6e 74 4f 62 6a 28 28 69 6e 74 29 76 29 3b  wIntObj((int)v);
be70: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
be80: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c        return Tcl
be90: 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 76  _NewWideIntObj(v
bea0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
beb0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
bec0: 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20  _FLOAT: {.      
bed0: 72 65 74 75 72 6e 20 54 63 6c 5f 4e 65 77 44 6f  return Tcl_NewDo
bee0: 75 62 6c 65 4f 62 6a 28 73 71 6c 69 74 65 33 5f  ubleObj(sqlite3_
bef0: 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 53  column_double(pS
bf00: 74 6d 74 2c 20 69 43 6f 6c 29 29 3b 0a 20 20 20  tmt, iCol));.   
bf10: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
bf20: 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  TE_NULL: {.     
bf30: 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e 65 77 53   return Tcl_NewS
bf40: 74 72 69 6e 67 4f 62 6a 28 70 2d 3e 70 44 62 2d  tringObj(p->pDb-
bf50: 3e 7a 4e 75 6c 6c 2c 20 2d 31 29 3b 0a 20 20 20  >zNull, -1);.   
bf60: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
bf70: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
bf80: 6a 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  j((char*)sqlite3
bf90: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74  _column_text(pSt
bfa0: 6d 74 2c 20 69 43 6f 6c 29 2c 20 2d 31 29 3b 0a  mt, iCol), -1);.
bfb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 75 73 69 6e  }../*.** If usin
bfc0: 67 20 54 63 6c 20 76 65 72 73 69 6f 6e 20 38 2e  g Tcl version 8.
bfd0: 36 20 6f 72 20 67 72 65 61 74 65 72 2c 20 75 73  6 or greater, us
bfe0: 65 20 74 68 65 20 4e 52 20 66 75 6e 63 74 69 6f  e the NR functio
bff0: 6e 73 20 74 6f 20 61 76 6f 69 64 0a 2a 2a 20 72  ns to avoid.** r
c000: 65 63 75 72 73 69 76 65 20 65 76 61 6c 75 74 69  ecursive evaluti
c010: 6f 6e 20 6f 66 20 73 63 72 69 70 74 73 20 62 79  on of scripts by
c020: 20 74 68 65 20 5b 64 62 20 65 76 61 6c 5d 20 61   the [db eval] a
c030: 6e 64 20 5b 64 62 20 74 72 61 6e 73 5d 0a 2a 2a  nd [db trans].**
c040: 20 63 6f 6d 6d 61 6e 64 73 2e 20 45 76 65 6e 20   commands. Even 
c050: 69 66 20 74 68 65 20 68 65 61 64 65 72 73 20 75  if the headers u
c060: 73 65 64 20 77 68 69 6c 65 20 63 6f 6d 70 69 6c  sed while compil
c070: 69 6e 67 20 74 68 65 20 65 78 74 65 6e 73 69 6f  ing the extensio
c080: 6e 0a 2a 2a 20 61 72 65 20 38 2e 36 20 6f 72 20  n.** are 8.6 or 
c090: 6e 65 77 65 72 2c 20 74 68 65 20 63 6f 64 65 20  newer, the code 
c0a0: 73 74 69 6c 6c 20 74 65 73 74 73 20 74 68 65 20  still tests the 
c0b0: 54 63 6c 20 76 65 72 73 69 6f 6e 20 61 74 20 72  Tcl version at r
c0c0: 75 6e 74 69 6d 65 2e 0a 2a 2a 20 54 68 69 73 20  untime..** This 
c0d0: 61 6c 6c 6f 77 73 20 73 74 75 62 73 2d 65 6e 61  allows stubs-ena
c0e0: 62 6c 65 64 20 62 75 69 6c 64 73 20 74 6f 20 62  bled builds to b
c0f0: 65 20 75 73 65 64 20 77 69 74 68 20 6f 6c 64 65  e used with olde
c100: 72 20 54 63 6c 20 6c 69 62 72 61 72 69 65 73 2e  r Tcl libraries.
c110: 0a 2a 2f 0a 23 69 66 20 54 43 4c 5f 4d 41 4a 4f  .*/.#if TCL_MAJO
c120: 52 5f 56 45 52 53 49 4f 4e 3e 38 20 7c 7c 20 28  R_VERSION>8 || (
c130: 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f  TCL_MAJOR_VERSIO
c140: 4e 3d 3d 38 20 26 26 20 54 43 4c 5f 4d 49 4e 4f  N==8 && TCL_MINO
c150: 52 5f 56 45 52 53 49 4f 4e 3e 3d 36 29 0a 23 20  R_VERSION>=6).# 
c160: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 54 43  define SQLITE_TC
c170: 4c 5f 4e 52 45 20 31 0a 73 74 61 74 69 63 20 69  L_NRE 1.static i
c180: 6e 74 20 44 62 55 73 65 4e 72 65 28 76 6f 69 64  nt DbUseNre(void
c190: 29 7b 0a 20 20 69 6e 74 20 6d 61 6a 6f 72 2c 20  ){.  int major, 
c1a0: 6d 69 6e 6f 72 3b 0a 20 20 54 63 6c 5f 47 65 74  minor;.  Tcl_Get
c1b0: 56 65 72 73 69 6f 6e 28 26 6d 61 6a 6f 72 2c 20  Version(&major, 
c1c0: 26 6d 69 6e 6f 72 2c 20 30 2c 20 30 29 3b 0a 20  &minor, 0, 0);. 
c1d0: 20 72 65 74 75 72 6e 28 20 28 6d 61 6a 6f 72 3d   return( (major=
c1e0: 3d 38 20 26 26 20 6d 69 6e 6f 72 3e 3d 36 29 20  =8 && minor>=6) 
c1f0: 7c 7c 20 6d 61 6a 6f 72 3e 38 20 29 3b 0a 7d 0a  || major>8 );.}.
c200: 23 65 6c 73 65 0a 2f 2a 20 0a 2a 2a 20 43 6f 6d  #else./* .** Com
c210: 70 69 6c 69 6e 67 20 75 73 69 6e 67 20 68 65 61  piling using hea
c220: 64 65 72 73 20 65 61 72 6c 69 65 72 20 74 68 61  ders earlier tha
c230: 6e 20 38 2e 36 2e 20 49 6e 20 74 68 69 73 20 63  n 8.6. In this c
c240: 61 73 65 20 4e 52 20 63 61 6e 6e 6f 74 20 62 65  ase NR cannot be
c250: 0a 2a 2a 20 75 73 65 64 2c 20 73 6f 20 44 62 55  .** used, so DbU
c260: 73 65 4e 72 65 28 29 20 74 6f 20 61 6c 77 61 79  seNre() to alway
c270: 73 20 72 65 74 75 72 6e 20 7a 65 72 6f 2e 20 41  s return zero. A
c280: 64 64 20 23 64 65 66 69 6e 65 73 20 66 6f 72 20  dd #defines for 
c290: 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20 54 63 6c  the other.** Tcl
c2a0: 5f 4e 52 78 78 78 28 29 20 66 75 6e 63 74 69 6f  _NRxxx() functio
c2b0: 6e 73 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68  ns to prevent th
c2c0: 65 6d 20 66 72 6f 6d 20 63 61 75 73 69 6e 67 20  em from causing 
c2d0: 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 65 72 72 6f  compilation erro
c2e0: 72 73 2c 0a 2a 2a 20 65 76 65 6e 20 74 68 6f 75  rs,.** even thou
c2f0: 67 68 20 74 68 65 20 6f 6e 6c 79 20 69 6e 76 6f  gh the only invo
c300: 63 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 6d 20  cations of them 
c310: 61 72 65 20 77 69 74 68 69 6e 20 63 6f 6e 64 69  are within condi
c320: 74 69 6f 6e 61 6c 20 62 6c 6f 63 6b 73 20 0a 2a  tional blocks .*
c330: 2a 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a  * of the form:.*
c340: 2a 0a 2a 2a 20 20 20 69 66 28 20 44 62 55 73 65  *.**   if( DbUse
c350: 4e 72 65 28 29 20 29 20 7b 20 2e 2e 2e 20 7d 0a  Nre() ) { ... }.
c360: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  */.# define SQLI
c370: 54 45 5f 54 43 4c 5f 4e 52 45 20 30 0a 23 20 64  TE_TCL_NRE 0.# d
c380: 65 66 69 6e 65 20 44 62 55 73 65 4e 72 65 28 29  efine DbUseNre()
c390: 20 30 0a 23 20 64 65 66 69 6e 65 20 54 63 6c 5f   0.# define Tcl_
c3a0: 4e 52 41 64 64 43 61 6c 6c 62 61 63 6b 28 61 2c  NRAddCallback(a,
c3b0: 62 2c 63 2c 64 2c 65 2c 66 29 20 28 76 6f 69 64  b,c,d,e,f) (void
c3c0: 29 30 0a 23 20 64 65 66 69 6e 65 20 54 63 6c 5f  )0.# define Tcl_
c3d0: 4e 52 45 76 61 6c 4f 62 6a 28 61 2c 62 2c 63 29  NREvalObj(a,b,c)
c3e0: 20 30 0a 23 20 64 65 66 69 6e 65 20 54 63 6c 5f   0.# define Tcl_
c3f0: 4e 52 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28  NRCreateCommand(
c400: 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 28 76 6f  a,b,c,d,e,f) (vo
c410: 69 64 29 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  id)0.#endif../*.
c420: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
c430: 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
c440: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
c450: 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64 3a 0a 2a  f the command:.*
c460: 2a 0a 2a 2a 20 20 20 24 64 62 20 65 76 61 6c 20  *.**   $db eval 
c470: 53 51 4c 20 3f 41 52 52 41 59 4e 41 4d 45 3f 20  SQL ?ARRAYNAME? 
c480: 53 43 52 49 50 54 0a 2a 2f 0a 73 74 61 74 69 63  SCRIPT.*/.static
c490: 20 69 6e 74 20 44 62 45 76 61 6c 4e 65 78 74 43   int DbEvalNextC
c4a0: 6d 64 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  md(.  ClientData
c4b0: 20 64 61 74 61 5b 5d 2c 20 20 20 20 20 20 20 20   data[],        
c4c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 61             /* da
c4d0: 74 61 5b 30 5d 20 69 73 20 74 68 65 20 28 44 62  ta[0] is the (Db
c4e0: 45 76 61 6c 43 6f 6e 74 65 78 74 2a 29 20 2a 2f  EvalContext*) */
c4f0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
c500: 6e 74 65 72 70 2c 20 20 20 20 20 20 20 20 20 20  nterp,          
c510: 20 20 20 20 20 20 20 20 2f 2a 20 54 63 6c 20 69          /* Tcl i
c520: 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 20 20  nterpreter */.  
c530: 69 6e 74 20 72 65 73 75 6c 74 20 20 20 20 20 20  int result      
c540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c550: 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 73       /* Result s
c560: 6f 20 66 61 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e  o far */.){.  in
c570: 74 20 72 63 20 3d 20 72 65 73 75 6c 74 3b 20 20  t rc = result;  
c580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c590: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
c5a0: 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 66  e */..  /* The f
c5b0: 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20  irst element of 
c5c0: 74 68 65 20 64 61 74 61 5b 5d 20 61 72 72 61 79  the data[] array
c5d0: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
c5e0: 20 61 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74   a DbEvalContext
c5f0: 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65 20  .  ** structure 
c600: 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20  allocated using 
c610: 54 63 6c 5f 41 6c 6c 6f 63 28 29 2e 20 54 68 65  Tcl_Alloc(). The
c620: 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e 74 20   second element 
c630: 6f 66 20 64 61 74 61 5b 5d 0a 20 20 2a 2a 20 69  of data[].  ** i
c640: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
c650: 20 54 63 6c 5f 4f 62 6a 20 63 6f 6e 74 61 69 6e   Tcl_Obj contain
c660: 69 6e 67 20 74 68 65 20 73 63 72 69 70 74 20 74  ing the script t
c670: 6f 20 72 75 6e 20 66 6f 72 20 65 61 63 68 20 72  o run for each r
c680: 6f 77 0a 20 20 2a 2a 20 72 65 74 75 72 6e 65 64  ow.  ** returned
c690: 20 62 79 20 74 68 65 20 71 75 65 72 69 65 73 20   by the queries 
c6a0: 65 6e 63 61 70 73 75 6c 61 74 65 64 20 69 6e 20  encapsulated in 
c6b0: 64 61 74 61 5b 30 5d 2e 20 2a 2f 0a 20 20 44 62  data[0]. */.  Db
c6c0: 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 70 20 3d  EvalContext *p =
c6d0: 20 28 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20   (DbEvalContext 
c6e0: 2a 29 64 61 74 61 5b 30 5d 3b 0a 20 20 54 63 6c  *)data[0];.  Tcl
c6f0: 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 20 3d 20  _Obj *pScript = 
c700: 28 54 63 6c 5f 4f 62 6a 20 2a 29 64 61 74 61 5b  (Tcl_Obj *)data[
c710: 31 5d 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  1];.  Tcl_Obj *p
c720: 41 72 72 61 79 20 3d 20 70 2d 3e 70 41 72 72 61  Array = p->pArra
c730: 79 3b 0a 0a 20 20 77 68 69 6c 65 28 20 28 72 63  y;..  while( (rc
c740: 3d 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 72 63 3d 3d  ==TCL_OK || rc==
c750: 54 43 4c 5f 43 4f 4e 54 49 4e 55 45 29 20 26 26  TCL_CONTINUE) &&
c760: 20 54 43 4c 5f 4f 4b 3d 3d 28 72 63 20 3d 20 64   TCL_OK==(rc = d
c770: 62 45 76 61 6c 53 74 65 70 28 70 29 29 20 29 7b  bEvalStep(p)) ){
c780: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
c790: 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 54 63  int nCol;.    Tc
c7a0: 6c 5f 4f 62 6a 20 2a 2a 61 70 43 6f 6c 4e 61 6d  l_Obj **apColNam
c7b0: 65 3b 0a 20 20 20 20 64 62 45 76 61 6c 52 6f 77  e;.    dbEvalRow
c7c0: 49 6e 66 6f 28 70 2c 20 26 6e 43 6f 6c 2c 20 26  Info(p, &nCol, &
c7d0: 61 70 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20 20  apColName);.    
c7e0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
c7f0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c   i++){.      Tcl
c800: 5f 4f 62 6a 20 2a 70 56 61 6c 20 3d 20 64 62 45  _Obj *pVal = dbE
c810: 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65 28 70  valColumnValue(p
c820: 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , i);.      if( 
c830: 70 41 72 72 61 79 3d 3d 30 20 29 7b 0a 20 20 20  pArray==0 ){.   
c840: 20 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56       Tcl_ObjSetV
c850: 61 72 32 28 69 6e 74 65 72 70 2c 20 61 70 43 6f  ar2(interp, apCo
c860: 6c 4e 61 6d 65 5b 69 5d 2c 20 30 2c 20 70 56 61  lName[i], 0, pVa
c870: 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  l, 0);.      }el
c880: 73 65 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  se{.        Tcl_
c890: 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72  ObjSetVar2(inter
c8a0: 70 2c 20 70 41 72 72 61 79 2c 20 61 70 43 6f 6c  p, pArray, apCol
c8b0: 4e 61 6d 65 5b 69 5d 2c 20 70 56 61 6c 2c 20 30  Name[i], pVal, 0
c8c0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
c8d0: 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71  ..    /* The req
c8e0: 75 69 72 65 64 20 69 6e 74 65 72 70 72 65 74 65  uired interprete
c8f0: 72 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  r variables are 
c900: 6e 6f 77 20 70 6f 70 75 6c 61 74 65 64 20 77 69  now populated wi
c910: 74 68 20 74 68 65 20 64 61 74 61 20 0a 20 20 20  th the data .   
c920: 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 63 75 72   ** from the cur
c930: 72 65 6e 74 20 72 6f 77 2e 20 49 66 20 75 73 69  rent row. If usi
c940: 6e 67 20 4e 52 45 2c 20 73 63 68 65 64 75 6c 65  ng NRE, schedule
c950: 20 63 61 6c 6c 62 61 63 6b 73 20 74 6f 20 65 76   callbacks to ev
c960: 61 6c 75 61 74 65 0a 20 20 20 20 2a 2a 20 73 63  aluate.    ** sc
c970: 72 69 70 74 20 70 53 63 72 69 70 74 2c 20 74 68  ript pScript, th
c980: 65 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 69  en to invoke thi
c990: 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e  s function again
c9a0: 20 74 6f 20 66 65 74 63 68 20 74 68 65 20 6e 65   to fetch the ne
c9b0: 78 74 0a 20 20 20 20 2a 2a 20 72 6f 77 20 28 6f  xt.    ** row (o
c9c0: 72 20 63 6c 65 61 6e 20 75 70 20 69 66 20 74 68  r clean up if th
c9d0: 65 72 65 20 69 73 20 6e 6f 20 6e 65 78 74 20 72  ere is no next r
c9e0: 6f 77 20 6f 72 20 74 68 65 20 73 63 72 69 70 74  ow or the script
c9f0: 20 74 68 72 6f 77 73 20 61 6e 0a 20 20 20 20 2a   throws an.    *
ca00: 2a 20 65 78 63 65 70 74 69 6f 6e 29 2e 20 41 66  * exception). Af
ca10: 74 65 72 20 73 63 68 65 64 75 6c 69 6e 67 20 74  ter scheduling t
ca20: 68 65 20 63 61 6c 6c 62 61 63 6b 73 2c 20 72 65  he callbacks, re
ca30: 74 75 72 6e 20 63 6f 6e 74 72 6f 6c 20 74 6f 20  turn control to 
ca40: 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  the .    ** call
ca50: 65 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  er..    **.    *
ca60: 2a 20 49 66 20 6e 6f 74 20 75 73 69 6e 67 20 4e  * If not using N
ca70: 52 45 2c 20 65 76 61 6c 75 61 74 65 20 70 53 63  RE, evaluate pSc
ca80: 72 69 70 74 20 64 69 72 65 63 74 6c 79 20 61 6e  ript directly an
ca90: 64 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20  d continue with 
caa0: 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65 78 74 20  the.    ** next 
cab0: 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 69  iteration of thi
cac0: 73 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f  s while(...) loo
cad0: 70 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 44  p.  */.    if( D
cae0: 62 55 73 65 4e 72 65 28 29 20 29 7b 0a 20 20 20  bUseNre() ){.   
caf0: 20 20 20 54 63 6c 5f 4e 52 41 64 64 43 61 6c 6c     Tcl_NRAddCall
cb00: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 44 62 45  back(interp, DbE
cb10: 76 61 6c 4e 65 78 74 43 6d 64 2c 20 28 76 6f 69  valNextCmd, (voi
cb20: 64 2a 29 70 2c 20 28 76 6f 69 64 2a 29 70 53 63  d*)p, (void*)pSc
cb30: 72 69 70 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ript, 0, 0);.   
cb40: 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e 52     return Tcl_NR
cb50: 45 76 61 6c 4f 62 6a 28 69 6e 74 65 72 70 2c 20  EvalObj(interp, 
cb60: 70 53 63 72 69 70 74 2c 20 30 29 3b 0a 20 20 20  pScript, 0);.   
cb70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
cb80: 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78   = Tcl_EvalObjEx
cb90: 28 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74  (interp, pScript
cba0: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 0);.    }.  }.
cbb0: 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  .  Tcl_DecrRefCo
cbc0: 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 20 20  unt(pScript);.  
cbd0: 64 62 45 76 61 6c 46 69 6e 61 6c 69 7a 65 28 70  dbEvalFinalize(p
cbe0: 29 3b 0a 20 20 54 63 6c 5f 46 72 65 65 28 28 63  );.  Tcl_Free((c
cbf0: 68 61 72 20 2a 29 70 29 3b 0a 0a 20 20 69 66 28  har *)p);..  if(
cc00: 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 72   rc==TCL_OK || r
cc10: 63 3d 3d 54 43 4c 5f 42 52 45 41 4b 20 29 7b 0a  c==TCL_BREAK ){.
cc20: 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73      Tcl_ResetRes
cc30: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  ult(interp);.   
cc40: 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20   rc = TCL_OK;.  
cc50: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
cc60: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 22 73 71 6c  ../*.** The "sql
cc70: 69 74 65 22 20 63 6f 6d 6d 61 6e 64 20 62 65 6c  ite" command bel
cc80: 6f 77 20 63 72 65 61 74 65 73 20 61 20 6e 65 77  ow creates a new
cc90: 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 66 6f 72   Tcl command for
cca0: 20 65 61 63 68 0a 2a 2a 20 63 6f 6e 6e 65 63 74   each.** connect
ccb0: 69 6f 6e 20 69 74 20 6f 70 65 6e 73 20 74 6f 20  ion it opens to 
ccc0: 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  an SQLite databa
ccd0: 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  se.  This routin
cce0: 65 20 69 73 20 69 6e 76 6f 6b 65 64 0a 2a 2a 20  e is invoked.** 
ccf0: 77 68 65 6e 65 76 65 72 20 6f 6e 65 20 6f 66 20  whenever one of 
cd00: 74 68 6f 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  those connection
cd10: 2d 73 70 65 63 69 66 69 63 20 63 6f 6d 6d 61 6e  -specific comman
cd20: 64 73 20 69 73 20 65 78 65 63 75 74 65 64 0a 2a  ds is executed.*
cd30: 2a 20 69 6e 20 54 63 6c 2e 20 20 46 6f 72 20 65  * in Tcl.  For e
cd40: 78 61 6d 70 6c 65 2c 20 69 66 20 79 6f 75 20 72  xample, if you r
cd50: 75 6e 20 54 63 6c 20 63 6f 64 65 20 6c 69 6b 65  un Tcl code like
cd60: 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
cd70: 20 20 20 73 71 6c 69 74 65 33 20 64 62 31 20 20     sqlite3 db1  
cd80: 22 6d 79 5f 64 61 74 61 62 61 73 65 22 0a 2a 2a  "my_database".**
cd90: 20 20 20 20 20 20 20 64 62 31 20 63 6c 6f 73 65         db1 close
cda0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
cdb0: 20 63 6f 6d 6d 61 6e 64 20 6f 70 65 6e 73 20 61   command opens a
cdc0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74   connection to t
cdd0: 68 65 20 22 6d 79 5f 64 61 74 61 62 61 73 65 22  he "my_database"
cde0: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 61 6e 64   database.** and
cdf0: 20 63 61 6c 6c 73 20 74 68 61 74 20 63 6f 6e 6e   calls that conn
ce00: 65 63 74 69 6f 6e 20 22 64 62 31 22 2e 20 20 54  ection "db1".  T
ce10: 68 65 20 73 65 63 6f 6e 64 20 63 6f 6d 6d 61 6e  he second comman
ce20: 64 20 63 61 75 73 65 73 20 74 68 69 73 0a 2a 2a  d causes this.**
ce30: 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 62   subroutine to b
ce40: 65 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a 73 74  e invoked..*/.st
ce50: 61 74 69 63 20 69 6e 74 20 44 62 4f 62 6a 43 6d  atic int DbObjCm
ce60: 64 28 76 6f 69 64 20 2a 63 64 2c 20 54 63 6c 5f  d(void *cd, Tcl_
ce70: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
ce80: 69 6e 74 20 6f 62 6a 63 2c 54 63 6c 5f 4f 62 6a  int objc,Tcl_Obj
ce90: 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76 29 7b 0a 20   *const*objv){. 
cea0: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
ceb0: 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a   (SqliteDb*)cd;.
cec0: 20 20 69 6e 74 20 63 68 6f 69 63 65 3b 0a 20 20    int choice;.  
ced0: 69 6e 74 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b  int rc = TCL_OK;
cee0: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
cef0: 63 68 61 72 20 2a 44 42 5f 73 74 72 73 5b 5d 20  char *DB_strs[] 
cf00: 3d 20 7b 0a 20 20 20 20 22 61 75 74 68 6f 72 69  = {.    "authori
cf10: 7a 65 72 22 2c 20 20 20 20 20 20 20 20 20 22 62  zer",         "b
cf20: 61 63 6b 75 70 22 2c 20 20 20 20 20 20 20 20 20  ackup",         
cf30: 20 20 20 22 62 75 73 79 22 2c 0a 20 20 20 20 22     "busy",.    "
cf40: 63 61 63 68 65 22 2c 20 20 20 20 20 20 20 20 20  cache",         
cf50: 20 20 20 20 20 22 63 68 61 6e 67 65 73 22 2c 20       "changes", 
cf60: 20 20 20 20 20 20 20 20 20 20 22 63 6c 6f 73 65            "close
cf70: 22 2c 0a 20 20 20 20 22 63 6f 6c 6c 61 74 65 22  ",.    "collate"
cf80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6f  ,            "co
cf90: 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 22 2c  llation_needed",
cfa0: 20 20 22 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 22 2c    "commit_hook",
cfb0: 0a 20 20 20 20 22 63 6f 6d 70 6c 65 74 65 22 2c  .    "complete",
cfc0: 20 20 20 20 20 20 20 20 20 20 20 22 63 6f 70 79             "copy
cfd0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
cfe0: 22 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74  "enable_load_ext
cff0: 65 6e 73 69 6f 6e 22 2c 0a 20 20 20 20 22 65 72  ension",.    "er
d000: 72 6f 72 63 6f 64 65 22 2c 20 20 20 20 20 20 20  rorcode",       
d010: 20 20 20 22 65 76 61 6c 22 2c 20 20 20 20 20 20     "eval",      
d020: 20 20 20 20 20 20 20 20 22 65 78 69 73 74 73 22          "exists"
d030: 2c 0a 20 20 20 20 22 66 75 6e 63 74 69 6f 6e 22  ,.    "function"
d040: 2c 20 20 20 20 20 20 20 20 20 20 20 22 69 6e 63  ,           "inc
d050: 72 62 6c 6f 62 22 2c 20 20 20 20 20 20 20 20 20  rblob",         
d060: 20 22 69 6e 74 65 72 72 75 70 74 22 2c 0a 20 20   "interrupt",.  
d070: 20 20 22 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72    "last_insert_r
d080: 6f 77 69 64 22 2c 20 20 22 6e 75 6c 6c 76 61 6c  owid",  "nullval
d090: 75 65 22 2c 20 20 20 20 20 20 20 20 20 22 6f 6e  ue",         "on
d0a0: 65 63 6f 6c 75 6d 6e 22 2c 0a 20 20 20 20 22 70  ecolumn",.    "p
d0b0: 72 6f 66 69 6c 65 22 2c 20 20 20 20 20 20 20 20  rofile",        
d0c0: 20 20 20 20 22 70 72 6f 67 72 65 73 73 22 2c 20      "progress", 
d0d0: 20 20 20 20 20 20 20 20 20 22 72 65 6b 65 79 22           "rekey"
d0e0: 2c 0a 20 20 20 20 22 72 65 73 74 6f 72 65 22 2c  ,.    "restore",
d0f0: 20 20 20 20 20 20 20 20 20 20 20 20 22 72 6f 6c              "rol
d100: 6c 62 61 63 6b 5f 68 6f 6f 6b 22 2c 20 20 20 20  lback_hook",    
d110: 20 22 73 74 61 74 75 73 22 2c 0a 20 20 20 20 22   "status",.    "
d120: 74 69 6d 65 6f 75 74 22 2c 20 20 20 20 20 20 20  timeout",       
d130: 20 20 20 20 20 22 74 6f 74 61 6c 5f 63 68 61 6e       "total_chan
d140: 67 65 73 22 2c 20 20 20 20 20 22 74 72 61 63 65  ges",     "trace
d150: 22 2c 0a 20 20 20 20 22 74 72 61 6e 73 61 63 74  ",.    "transact
d160: 69 6f 6e 22 2c 20 20 20 20 20 20 20 20 22 75 6e  ion",        "un
d170: 6c 6f 63 6b 5f 6e 6f 74 69 66 79 22 2c 20 20 20  lock_notify",   
d180: 20 20 22 75 70 64 61 74 65 5f 68 6f 6f 6b 22 2c    "update_hook",
d190: 0a 20 20 20 20 22 76 65 72 73 69 6f 6e 22 2c 20  .    "version", 
d1a0: 20 20 20 20 20 20 20 20 20 20 20 22 77 61 6c 5f             "wal_
d1b0: 68 6f 6f 6b 22 2c 20 20 20 20 20 20 20 20 20 20  hook",          
d1c0: 30 0a 20 20 7d 3b 0a 20 20 65 6e 75 6d 20 44 42  0.  };.  enum DB
d1d0: 5f 65 6e 75 6d 20 7b 0a 20 20 20 20 44 42 5f 41  _enum {.    DB_A
d1e0: 55 54 48 4f 52 49 5a 45 52 2c 20 20 20 20 20 20  UTHORIZER,      
d1f0: 20 20 44 42 5f 42 41 43 4b 55 50 2c 20 20 20 20    DB_BACKUP,    
d200: 20 20 20 20 20 20 20 44 42 5f 42 55 53 59 2c 0a         DB_BUSY,.
d210: 20 20 20 20 44 42 5f 43 41 43 48 45 2c 20 20 20      DB_CACHE,   
d220: 20 20 20 20 20 20 20 20 20 20 44 42 5f 43 48 41            DB_CHA
d230: 4e 47 45 53 2c 20 20 20 20 20 20 20 20 20 20 44  NGES,          D
d240: 42 5f 43 4c 4f 53 45 2c 0a 20 20 20 20 44 42 5f  B_CLOSE,.    DB_
d250: 43 4f 4c 4c 41 54 45 2c 20 20 20 20 20 20 20 20  COLLATE,        
d260: 20 20 20 44 42 5f 43 4f 4c 4c 41 54 49 4f 4e 5f     DB_COLLATION_
d270: 4e 45 45 44 45 44 2c 20 44 42 5f 43 4f 4d 4d 49  NEEDED, DB_COMMI
d280: 54 5f 48 4f 4f 4b 2c 0a 20 20 20 20 44 42 5f 43  T_HOOK,.    DB_C
d290: 4f 4d 50 4c 45 54 45 2c 20 20 20 20 20 20 20 20  OMPLETE,        
d2a0: 20 20 44 42 5f 43 4f 50 59 2c 20 20 20 20 20 20    DB_COPY,      
d2b0: 20 20 20 20 20 20 20 44 42 5f 45 4e 41 42 4c 45         DB_ENABLE
d2c0: 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 2c  _LOAD_EXTENSION,
d2d0: 0a 20 20 20 20 44 42 5f 45 52 52 4f 52 43 4f 44  .    DB_ERRORCOD
d2e0: 45 2c 20 20 20 20 20 20 20 20 20 44 42 5f 45 56  E,         DB_EV
d2f0: 41 4c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  AL,             
d300: 44 42 5f 45 58 49 53 54 53 2c 0a 20 20 20 20 44  DB_EXISTS,.    D
d310: 42 5f 46 55 4e 43 54 49 4f 4e 2c 20 20 20 20 20  B_FUNCTION,     
d320: 20 20 20 20 20 44 42 5f 49 4e 43 52 42 4c 4f 42       DB_INCRBLOB
d330: 2c 20 20 20 20 20 20 20 20 20 44 42 5f 49 4e 54  ,         DB_INT
d340: 45 52 52 55 50 54 2c 0a 20 20 20 20 44 42 5f 4c  ERRUPT,.    DB_L
d350: 41 53 54 5f 49 4e 53 45 52 54 5f 52 4f 57 49 44  AST_INSERT_ROWID
d360: 2c 20 44 42 5f 4e 55 4c 4c 56 41 4c 55 45 2c 20  , DB_NULLVALUE, 
d370: 20 20 20 20 20 20 20 44 42 5f 4f 4e 45 43 4f 4c         DB_ONECOL
d380: 55 4d 4e 2c 0a 20 20 20 20 44 42 5f 50 52 4f 46  UMN,.    DB_PROF
d390: 49 4c 45 2c 20 20 20 20 20 20 20 20 20 20 20 44  ILE,           D
d3a0: 42 5f 50 52 4f 47 52 45 53 53 2c 20 20 20 20 20  B_PROGRESS,     
d3b0: 20 20 20 20 44 42 5f 52 45 4b 45 59 2c 0a 20 20      DB_REKEY,.  
d3c0: 20 20 44 42 5f 52 45 53 54 4f 52 45 2c 20 20 20    DB_RESTORE,   
d3d0: 20 20 20 20 20 20 20 20 44 42 5f 52 4f 4c 4c 42          DB_ROLLB
d3e0: 41 43 4b 5f 48 4f 4f 4b 2c 20 20 20 20 44 42 5f  ACK_HOOK,    DB_
d3f0: 53 54 41 54 55 53 2c 0a 20 20 20 20 44 42 5f 54  STATUS,.    DB_T
d400: 49 4d 45 4f 55 54 2c 20 20 20 20 20 20 20 20 20  IMEOUT,         
d410: 20 20 44 42 5f 54 4f 54 41 4c 5f 43 48 41 4e 47    DB_TOTAL_CHANG
d420: 45 53 2c 20 20 20 20 44 42 5f 54 52 41 43 45 2c  ES,    DB_TRACE,
d430: 0a 20 20 20 20 44 42 5f 54 52 41 4e 53 41 43 54  .    DB_TRANSACT
d440: 49 4f 4e 2c 20 20 20 20 20 20 20 44 42 5f 55 4e  ION,       DB_UN
d450: 4c 4f 43 4b 5f 4e 4f 54 49 46 59 2c 20 20 20 20  LOCK_NOTIFY,    
d460: 44 42 5f 55 50 44 41 54 45 5f 48 4f 4f 4b 2c 0a  DB_UPDATE_HOOK,.
d470: 20 20 20 20 44 42 5f 56 45 52 53 49 4f 4e 2c 20      DB_VERSION, 
d480: 20 20 20 20 20 20 20 20 20 20 44 42 5f 57 41 4c            DB_WAL
d490: 5f 48 4f 4f 4b 0a 20 20 7d 3b 0a 20 20 2f 2a 20  _HOOK.  };.  /* 
d4a0: 64 6f 6e 27 74 20 6c 65 61 76 65 20 74 72 61 69  don't leave trai
d4b0: 6c 69 6e 67 20 63 6f 6d 6d 61 73 20 6f 6e 20 44  ling commas on D
d4c0: 42 5f 65 6e 75 6d 2c 20 69 74 20 63 6f 6e 66 75  B_enum, it confu
d4d0: 73 65 73 20 74 68 65 20 41 49 58 20 78 6c 63 20  ses the AIX xlc 
d4e0: 63 6f 6d 70 69 6c 65 72 20 2a 2f 0a 0a 20 20 69  compiler */..  i
d4f0: 66 28 20 6f 62 6a 63 3c 32 20 29 7b 0a 20 20 20  f( objc<2 ){.   
d500: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
d510: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
d520: 76 2c 20 22 53 55 42 43 4f 4d 4d 41 4e 44 20 2e  v, "SUBCOMMAND .
d530: 2e 2e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ..");.    return
d540: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
d550: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 64    if( Tcl_GetInd
d560: 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  exFromObj(interp
d570: 2c 20 6f 62 6a 76 5b 31 5d 2c 20 44 42 5f 73 74  , objv[1], DB_st
d580: 72 73 2c 20 22 6f 70 74 69 6f 6e 22 2c 20 30 2c  rs, "option", 0,
d590: 20 26 63 68 6f 69 63 65 29 20 29 7b 0a 20 20 20   &choice) ){.   
d5a0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
d5b0: 52 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68  R;.  }..  switch
d5c0: 28 20 28 65 6e 75 6d 20 44 42 5f 65 6e 75 6d 29  ( (enum DB_enum)
d5d0: 63 68 6f 69 63 65 20 29 7b 0a 0a 20 20 2f 2a 20  choice ){..  /* 
d5e0: 20 20 20 24 64 62 20 61 75 74 68 6f 72 69 7a 65     $db authorize
d5f0: 72 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a  r ?CALLBACK?.  *
d600: 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  *.  ** Invoke th
d610: 65 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b  e given callback
d620: 20 74 6f 20 61 75 74 68 6f 72 69 7a 65 20 65 61   to authorize ea
d630: 63 68 20 53 51 4c 20 6f 70 65 72 61 74 69 6f 6e  ch SQL operation
d640: 20 61 73 20 69 74 20 69 73 0a 20 20 2a 2a 20 63   as it is.  ** c
d650: 6f 6d 70 69 6c 65 64 2e 20 20 35 20 61 72 67 75  ompiled.  5 argu
d660: 6d 65 6e 74 73 20 61 72 65 20 61 70 70 65 6e 64  ments are append
d670: 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61  ed to the callba
d680: 63 6b 20 62 65 66 6f 72 65 20 69 74 20 69 73 0a  ck before it is.
d690: 20 20 2a 2a 20 69 6e 76 6f 6b 65 64 3a 0a 20 20    ** invoked:.  
d6a0: 2a 2a 0a 20 20 2a 2a 20 20 20 28 31 29 20 54 68  **.  **   (1) Th
d6b0: 65 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  e authorization 
d6c0: 74 79 70 65 20 28 65 78 3a 20 53 51 4c 49 54 45  type (ex: SQLITE
d6d0: 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 2c 20 53  _CREATE_TABLE, S
d6e0: 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 2e 2e  QLITE_INSERT, ..
d6f0: 2e 29 0a 20 20 2a 2a 20 20 20 28 32 29 20 46 69  .).  **   (2) Fi
d700: 72 73 74 20 64 65 73 63 72 69 70 74 69 76 65 20  rst descriptive 
d710: 6e 61 6d 65 20 28 64 65 70 65 6e 64 73 20 6f 6e  name (depends on
d720: 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74   authorization t
d730: 79 70 65 29 0a 20 20 2a 2a 20 20 20 28 33 29 20  ype).  **   (3) 
d740: 53 65 63 6f 6e 64 20 64 65 73 63 72 69 70 74 69  Second descripti
d750: 76 65 20 6e 61 6d 65 0a 20 20 2a 2a 20 20 20 28  ve name.  **   (
d760: 34 29 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  4) Name of the d
d770: 61 74 61 62 61 73 65 20 28 65 78 3a 20 22 6d 61  atabase (ex: "ma
d780: 69 6e 22 2c 20 22 74 65 6d 70 22 29 0a 20 20 2a  in", "temp").  *
d790: 2a 20 20 20 28 35 29 20 4e 61 6d 65 20 6f 66 20  *   (5) Name of 
d7a0: 74 72 69 67 67 65 72 20 74 68 61 74 20 69 73 20  trigger that is 
d7b0: 64 6f 69 6e 67 20 74 68 65 20 61 63 63 65 73 73  doing the access
d7c0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63  .  **.  ** The c
d7d0: 61 6c 6c 62 61 63 6b 20 73 68 6f 75 6c 64 20 72  allback should r
d7e0: 65 74 75 72 6e 20 6f 6e 20 6f 66 20 74 68 65 20  eturn on of the 
d7f0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 69 6e 67  following string
d800: 73 3a 20 53 51 4c 49 54 45 5f 4f 4b 2c 0a 20 20  s: SQLITE_OK,.  
d810: 2a 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  ** SQLITE_IGNORE
d820: 2c 20 6f 72 20 53 51 4c 49 54 45 5f 44 45 4e 59  , or SQLITE_DENY
d830: 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74  .  Any other ret
d840: 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61 6e 20  urn value is an 
d850: 65 72 72 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  error..  **.  **
d860: 20 49 66 20 74 68 69 73 20 6d 65 74 68 6f 64 20   If this method 
d870: 69 73 20 69 6e 76 6f 6b 65 64 20 77 69 74 68 20  is invoked with 
d880: 6e 6f 20 61 72 67 75 6d 65 6e 74 73 2c 20 74 68  no arguments, th
d890: 65 20 63 75 72 72 65 6e 74 20 61 75 74 68 6f 72  e current author
d8a0: 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 63 61 6c  ization.  ** cal
d8b0: 6c 62 61 63 6b 20 73 74 72 69 6e 67 20 69 73 20  lback string is 
d8c0: 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2f 0a 20  returned..  */. 
d8d0: 20 63 61 73 65 20 44 42 5f 41 55 54 48 4f 52 49   case DB_AUTHORI
d8e0: 5a 45 52 3a 20 7b 0a 23 69 66 64 65 66 20 53 51  ZER: {.#ifdef SQ
d8f0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
d900: 49 5a 41 54 49 4f 4e 0a 20 20 20 20 54 63 6c 5f  IZATION.    Tcl_
d910: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
d920: 65 72 70 2c 20 22 61 75 74 68 6f 72 69 7a 61 74  erp, "authorizat
d930: 69 6f 6e 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  ion not availabl
d940: 65 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64 22  e in this build"
d950: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d960: 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 30 29         (char*)0)
d970: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
d980: 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20  _ERROR;.#else.  
d990: 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a    if( objc>3 ){.
d9a0: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
d9b0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
d9c0: 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41  , objv, "?CALLBA
d9d0: 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74  CK?");.      ret
d9e0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
d9f0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a     }else if( obj
da00: 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66  c==2 ){.      if
da10: 28 20 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a  ( pDb->zAuth ){.
da20: 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65          Tcl_Appe
da30: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
da40: 20 70 44 62 2d 3e 7a 41 75 74 68 2c 20 28 63 68   pDb->zAuth, (ch
da50: 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ar*)0);.      }.
da60: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
da70: 20 63 68 61 72 20 2a 7a 41 75 74 68 3b 0a 20 20   char *zAuth;.  
da80: 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
da90: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74     if( pDb->zAut
daa0: 68 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  h ){.        Tcl
dab0: 5f 46 72 65 65 28 70 44 62 2d 3e 7a 41 75 74 68  _Free(pDb->zAuth
dac0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
dad0: 20 7a 41 75 74 68 20 3d 20 54 63 6c 5f 47 65 74   zAuth = Tcl_Get
dae0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
daf0: 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20  jv[2], &len);.  
db00: 20 20 20 20 69 66 28 20 7a 41 75 74 68 20 26 26      if( zAuth &&
db10: 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20   len>0 ){.      
db20: 20 20 70 44 62 2d 3e 7a 41 75 74 68 20 3d 20 54    pDb->zAuth = T
db30: 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20  cl_Alloc( len + 
db40: 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  1 );.        mem
db50: 63 70 79 28 70 44 62 2d 3e 7a 41 75 74 68 2c 20  cpy(pDb->zAuth, 
db60: 7a 41 75 74 68 2c 20 6c 65 6e 2b 31 29 3b 0a 20  zAuth, len+1);. 
db70: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
db80: 20 20 20 20 70 44 62 2d 3e 7a 41 75 74 68 20 3d      pDb->zAuth =
db90: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
dba0: 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74 68    if( pDb->zAuth
dbb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 74 79 70 65   ){.        type
dbc0: 64 65 66 20 69 6e 74 20 28 2a 73 71 6c 69 74 65  def int (*sqlite
dbd0: 33 5f 61 75 74 68 5f 63 62 29 28 0a 20 20 20 20  3_auth_cb)(.    
dbe0: 20 20 20 20 20 20 20 76 6f 69 64 2a 2c 69 6e 74         void*,int
dbf0: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e  ,const char*,con
dc00: 73 74 20 63 68 61 72 2a 2c 0a 20 20 20 20 20 20  st char*,.      
dc10: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 2a       const char*
dc20: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20  ,const char*);. 
dc30: 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65         pDb->inte
dc40: 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20  rp = interp;.   
dc50: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74       sqlite3_set
dc60: 5f 61 75 74 68 6f 72 69 7a 65 72 28 70 44 62 2d  _authorizer(pDb-
dc70: 3e 64 62 2c 28 73 71 6c 69 74 65 33 5f 61 75 74  >db,(sqlite3_aut
dc80: 68 5f 63 62 29 61 75 74 68 5f 63 61 6c 6c 62 61  h_cb)auth_callba
dc90: 63 6b 2c 70 44 62 29 3b 0a 20 20 20 20 20 20 7d  ck,pDb);.      }
dca0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
dcb0: 6c 69 74 65 33 5f 73 65 74 5f 61 75 74 68 6f 72  lite3_set_author
dcc0: 69 7a 65 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c  izer(pDb->db, 0,
dcd0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
dce0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72   }.#endif.    br
dcf0: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
dd00: 20 20 24 64 62 20 62 61 63 6b 75 70 20 3f 44 41    $db backup ?DA
dd10: 54 41 42 41 53 45 3f 20 46 49 4c 45 4e 41 4d 45  TABASE? FILENAME
dd20: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 70 65 6e 20  .  **.  ** Open 
dd30: 6f 72 20 63 72 65 61 74 65 20 61 20 64 61 74 61  or create a data
dd40: 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 64 20  base file named 
dd50: 46 49 4c 45 4e 41 4d 45 2e 20 20 54 72 61 6e 73  FILENAME.  Trans
dd60: 66 65 72 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6e  fer the.  ** con
dd70: 74 65 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 64 61  tent of local da
dd80: 74 61 62 61 73 65 20 44 41 54 41 42 41 53 45 20  tabase DATABASE 
dd90: 28 64 65 66 61 75 6c 74 3a 20 22 6d 61 69 6e 22  (default: "main"
dda0: 29 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20  ) into the.  ** 
ddb0: 46 49 4c 45 4e 41 4d 45 20 64 61 74 61 62 61 73  FILENAME databas
ddc0: 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  e..  */.  case D
ddd0: 42 5f 42 41 43 4b 55 50 3a 20 7b 0a 20 20 20 20  B_BACKUP: {.    
dde0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 73  const char *zDes
ddf0: 74 46 69 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74  tFile;.    const
de00: 20 63 68 61 72 20 2a 7a 53 72 63 44 62 3b 0a 20   char *zSrcDb;. 
de10: 20 20 20 73 71 6c 69 74 65 33 20 2a 70 44 65 73     sqlite3 *pDes
de20: 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  t;.    sqlite3_b
de30: 61 63 6b 75 70 20 2a 70 42 61 63 6b 75 70 3b 0a  ackup *pBackup;.
de40: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33  .    if( objc==3
de50: 20 29 7b 0a 20 20 20 20 20 20 7a 53 72 63 44 62   ){.      zSrcDb
de60: 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 20   = "main";.     
de70: 20 7a 44 65 73 74 46 69 6c 65 20 3d 20 54 63 6c   zDestFile = Tcl
de80: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
de90: 32 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  2]);.    }else i
dea0: 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20  f( objc==4 ){.  
deb0: 20 20 20 20 7a 53 72 63 44 62 20 3d 20 54 63 6c      zSrcDb = Tcl
dec0: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
ded0: 32 5d 29 3b 0a 20 20 20 20 20 20 7a 44 65 73 74  2]);.      zDest
dee0: 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  File = Tcl_GetSt
def0: 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20  ring(objv[3]);. 
df00: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
df10: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
df20: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
df30: 2c 20 22 3f 44 41 54 41 42 41 53 45 3f 20 46 49  , "?DATABASE? FI
df40: 4c 45 4e 41 4d 45 22 29 3b 0a 20 20 20 20 20 20  LENAME");.      
df50: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
df60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
df70: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 44   sqlite3_open(zD
df80: 65 73 74 46 69 6c 65 2c 20 26 70 44 65 73 74 29  estFile, &pDest)
df90: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
dfa0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
dfb0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
dfc0: 74 28 69 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f  t(interp, "canno
dfd0: 74 20 6f 70 65 6e 20 74 61 72 67 65 74 20 64 61  t open target da
dfe0: 74 61 62 61 73 65 3a 20 22 2c 0a 20 20 20 20 20  tabase: ",.     
dff0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72        sqlite3_er
e000: 72 6d 73 67 28 70 44 65 73 74 29 2c 20 28 63 68  rmsg(pDest), (ch
e010: 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 73 71  ar*)0);.      sq
e020: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 44 65 73  lite3_close(pDes
e030: 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
e040: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
e050: 7d 0a 20 20 20 20 70 42 61 63 6b 75 70 20 3d 20  }.    pBackup = 
e060: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 69  sqlite3_backup_i
e070: 6e 69 74 28 70 44 65 73 74 2c 20 22 6d 61 69 6e  nit(pDest, "main
e080: 22 2c 20 70 44 62 2d 3e 64 62 2c 20 7a 53 72 63  ", pDb->db, zSrc
e090: 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70 42 61  Db);.    if( pBa
e0a0: 63 6b 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ckup==0 ){.     
e0b0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
e0c0: 74 28 69 6e 74 65 72 70 2c 20 22 62 61 63 6b 75  t(interp, "backu
e0d0: 70 20 66 61 69 6c 65 64 3a 20 22 2c 0a 20 20 20  p failed: ",.   
e0e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
e0f0: 65 72 72 6d 73 67 28 70 44 65 73 74 29 2c 20 28  errmsg(pDest), (
e100: 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
e110: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 44  sqlite3_close(pD
e120: 65 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  est);.      retu
e130: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
e140: 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 20    }.    while(  
e150: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 61  (rc = sqlite3_ba
e160: 63 6b 75 70 5f 73 74 65 70 28 70 42 61 63 6b 75  ckup_step(pBacku
e170: 70 2c 31 30 30 29 29 3d 3d 53 51 4c 49 54 45 5f  p,100))==SQLITE_
e180: 4f 4b 20 29 7b 7d 0a 20 20 20 20 73 71 6c 69 74  OK ){}.    sqlit
e190: 65 33 5f 62 61 63 6b 75 70 5f 66 69 6e 69 73 68  e3_backup_finish
e1a0: 28 70 42 61 63 6b 75 70 29 3b 0a 20 20 20 20 69  (pBackup);.    i
e1b0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
e1c0: 4e 45 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  NE ){.      rc =
e1d0: 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c   TCL_OK;.    }el
e1e0: 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  se{.      Tcl_Ap
e1f0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
e200: 70 2c 20 22 62 61 63 6b 75 70 20 66 61 69 6c 65  p, "backup faile
e210: 64 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d: ",.          
e220: 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
e230: 70 44 65 73 74 29 2c 20 28 63 68 61 72 2a 29 30  pDest), (char*)0
e240: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43  );.      rc = TC
e250: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
e260: 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
e270: 28 70 44 65 73 74 29 3b 0a 20 20 20 20 62 72 65  (pDest);.    bre
e280: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
e290: 20 24 64 62 20 62 75 73 79 20 3f 43 41 4c 4c 42   $db busy ?CALLB
e2a0: 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ACK?.  **.  ** I
e2b0: 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20  nvoke the given 
e2c0: 63 61 6c 6c 62 61 63 6b 20 69 66 20 61 6e 20 53  callback if an S
e2d0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 74 74  QL statement att
e2e0: 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 0a 20 20  empts to open.  
e2f0: 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 64 61 74 61  ** a locked data
e300: 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  base file..  */.
e310: 20 20 63 61 73 65 20 44 42 5f 42 55 53 59 3a 20    case DB_BUSY: 
e320: 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33  {.    if( objc>3
e330: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
e340: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
e350: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 43 41 4c  p, 2, objv, "CAL
e360: 4c 42 41 43 4b 22 29 3b 0a 20 20 20 20 20 20 72  LBACK");.      r
e370: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
e380: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
e390: 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  bjc==2 ){.      
e3a0: 69 66 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29  if( pDb->zBusy )
e3b0: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70  {.        Tcl_Ap
e3c0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
e3d0: 70 2c 20 70 44 62 2d 3e 7a 42 75 73 79 2c 20 28  p, pDb->zBusy, (
e3e0: 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
e3f0: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
e400: 20 20 20 63 68 61 72 20 2a 7a 42 75 73 79 3b 0a     char *zBusy;.
e410: 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20        int len;. 
e420: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 42       if( pDb->zB
e430: 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20 54  usy ){.        T
e440: 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 42 75  cl_Free(pDb->zBu
e450: 73 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  sy);.      }.   
e460: 20 20 20 7a 42 75 73 79 20 3d 20 54 63 6c 5f 47     zBusy = Tcl_G
e470: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
e480: 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a  objv[2], &len);.
e490: 20 20 20 20 20 20 69 66 28 20 7a 42 75 73 79 20        if( zBusy 
e4a0: 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20  && len>0 ){.    
e4b0: 20 20 20 20 70 44 62 2d 3e 7a 42 75 73 79 20 3d      pDb->zBusy =
e4c0: 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20   Tcl_Alloc( len 
e4d0: 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d  + 1 );.        m
e4e0: 65 6d 63 70 79 28 70 44 62 2d 3e 7a 42 75 73 79  emcpy(pDb->zBusy
e4f0: 2c 20 7a 42 75 73 79 2c 20 6c 65 6e 2b 31 29 3b  , zBusy, len+1);
e500: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
e510: 20 20 20 20 20 20 70 44 62 2d 3e 7a 42 75 73 79        pDb->zBusy
e520: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
e530: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 42 75      if( pDb->zBu
e540: 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  sy ){.        pD
e550: 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65  b->interp = inte
e560: 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  rp;.        sqli
e570: 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72  te3_busy_handler
e580: 28 70 44 62 2d 3e 64 62 2c 20 44 62 42 75 73 79  (pDb->db, DbBusy
e590: 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20  Handler, pDb);. 
e5a0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
e5b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79      sqlite3_busy
e5c0: 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62  _handler(pDb->db
e5d0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
e5e0: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
e5f0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 20  ;.  }..  /*     
e600: 24 64 62 20 63 61 63 68 65 20 66 6c 75 73 68 0a  $db cache flush.
e610: 20 20 2a 2a 20 20 20 20 20 24 64 62 20 63 61 63    **     $db cac
e620: 68 65 20 73 69 7a 65 20 6e 0a 20 20 2a 2a 0a 20  he size n.  **. 
e630: 20 2a 2a 20 46 6c 75 73 68 20 74 68 65 20 70 72   ** Flush the pr
e640: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
e650: 20 63 61 63 68 65 2c 20 6f 72 20 73 65 74 20 74   cache, or set t
e660: 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
e670: 72 20 6f 66 0a 20 20 2a 2a 20 63 61 63 68 65 64  r of.  ** cached
e680: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a   statements..  *
e690: 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 41 43 48  /.  case DB_CACH
e6a0: 45 3a 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 73  E: {.    char *s
e6b0: 75 62 43 6d 64 3b 0a 20 20 20 20 69 6e 74 20 6e  ubCmd;.    int n
e6c0: 3b 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3c  ;..    if( objc<
e6d0: 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =2 ){.      Tcl_
e6e0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
e6f0: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63  erp, 1, objv, "c
e700: 61 63 68 65 20 6f 70 74 69 6f 6e 20 3f 61 72 67  ache option ?arg
e710: 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ?");.      retur
e720: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
e730: 20 7d 0a 20 20 20 20 73 75 62 43 6d 64 20 3d 20   }.    subCmd = 
e740: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
e750: 6d 4f 62 6a 28 20 6f 62 6a 76 5b 32 5d 2c 20 30  mObj( objv[2], 0
e760: 20 29 3b 0a 20 20 20 20 69 66 28 20 2a 73 75 62   );.    if( *sub
e770: 43 6d 64 3d 3d 27 66 27 20 26 26 20 73 74 72 63  Cmd=='f' && strc
e780: 6d 70 28 73 75 62 43 6d 64 2c 22 66 6c 75 73 68  mp(subCmd,"flush
e790: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
e7a0: 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
e7b0: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
e7c0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
e7d0: 2c 20 6f 62 6a 76 2c 20 22 66 6c 75 73 68 22 29  , objv, "flush")
e7e0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
e7f0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
e800: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e810: 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28   flushStmtCache(
e820: 20 70 44 62 20 29 3b 0a 20 20 20 20 20 20 7d 0a   pDb );.      }.
e830: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 2a 73      }else if( *s
e840: 75 62 43 6d 64 3d 3d 27 73 27 20 26 26 20 73 74  ubCmd=='s' && st
e850: 72 63 6d 70 28 73 75 62 43 6d 64 2c 22 73 69 7a  rcmp(subCmd,"siz
e860: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
e870: 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20  if( objc!=4 ){. 
e880: 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67         Tcl_Wrong
e890: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
e8a0: 32 2c 20 6f 62 6a 76 2c 20 22 73 69 7a 65 20 6e  2, objv, "size n
e8b0: 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ");.        retu
e8c0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
e8d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e8e0: 20 20 20 69 66 28 20 54 43 4c 5f 45 52 52 4f 52     if( TCL_ERROR
e8f0: 3d 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ==Tcl_GetIntFrom
e900: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
e910: 5b 33 5d 2c 20 26 6e 29 20 29 7b 0a 20 20 20 20  [3], &n) ){.    
e920: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
e930: 52 65 73 75 6c 74 28 20 69 6e 74 65 72 70 2c 20  Result( interp, 
e940: 22 63 61 6e 6e 6f 74 20 63 6f 6e 76 65 72 74 20  "cannot convert 
e950: 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  \"", .          
e960: 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
e970: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33  ngFromObj(objv[3
e980: 5d 2c 30 29 2c 20 22 5c 22 20 74 6f 20 69 6e 74  ],0), "\" to int
e990: 65 67 65 72 22 2c 20 28 63 68 61 72 2a 29 30 29  eger", (char*)0)
e9a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
e9b0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
e9c0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e9d0: 20 20 20 20 20 20 20 69 66 28 20 6e 3c 30 20 29         if( n<0 )
e9e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6c  {.            fl
e9f0: 75 73 68 53 74 6d 74 43 61 63 68 65 28 20 70 44  ushStmtCache( pD
ea00: 62 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  b );.           
ea10: 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   n = 0;.        
ea20: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3e 4d 41    }else if( n>MA
ea30: 58 5f 50 52 45 50 41 52 45 44 5f 53 54 4d 54 53  X_PREPARED_STMTS
ea40: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
ea50: 6e 20 3d 20 4d 41 58 5f 50 52 45 50 41 52 45 44  n = MAX_PREPARED
ea60: 5f 53 54 4d 54 53 3b 0a 20 20 20 20 20 20 20 20  _STMTS;.        
ea70: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 44    }.          pD
ea80: 62 2d 3e 6d 61 78 53 74 6d 74 20 3d 20 6e 3b 0a  b->maxStmt = n;.
ea90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
eaa0: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
eab0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
eac0: 75 6c 74 28 20 69 6e 74 65 72 70 2c 20 22 62 61  ult( interp, "ba
ead0: 64 20 6f 70 74 69 6f 6e 20 5c 22 22 2c 20 0a 20  d option \"", . 
eae0: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74           Tcl_Get
eaf0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
eb00: 6a 76 5b 32 5d 2c 30 29 2c 20 22 5c 22 3a 20 6d  jv[2],0), "\": m
eb10: 75 73 74 20 62 65 20 66 6c 75 73 68 20 6f 72 20  ust be flush or 
eb20: 73 69 7a 65 22 2c 0a 20 20 20 20 20 20 20 20 20  size",.         
eb30: 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
eb40: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
eb50: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72  OR;.    }.    br
eb60: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
eb70: 20 20 20 24 64 62 20 63 68 61 6e 67 65 73 0a 20     $db changes. 
eb80: 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20   **.  ** Return 
eb90: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
eba0: 77 73 20 74 68 61 74 20 77 65 72 65 20 6d 6f 64  ws that were mod
ebb0: 69 66 69 65 64 2c 20 69 6e 73 65 72 74 65 64 2c  ified, inserted,
ebc0: 20 6f 72 20 64 65 6c 65 74 65 64 20 62 79 0a 20   or deleted by. 
ebd0: 20 2a 2a 20 74 68 65 20 6d 6f 73 74 20 72 65 63   ** the most rec
ebe0: 65 6e 74 20 49 4e 53 45 52 54 2c 20 55 50 44 41  ent INSERT, UPDA
ebf0: 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61  TE or DELETE sta
ec00: 74 65 6d 65 6e 74 2c 20 6e 6f 74 20 69 6e 63 6c  tement, not incl
ec10: 75 64 69 6e 67 20 0a 20 20 2a 2a 20 61 6e 79 20  uding .  ** any 
ec20: 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20  changes made by 
ec30: 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73  trigger programs
ec40: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
ec50: 5f 43 48 41 4e 47 45 53 3a 20 7b 0a 20 20 20 20  _CHANGES: {.    
ec60: 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74  Tcl_Obj *pResult
ec70: 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ;.    if( objc!=
ec80: 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  2 ){.      Tcl_W
ec90: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
eca0: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 22 29  rp, 2, objv, "")
ecb0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
ecc0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
ecd0: 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63      pResult = Tc
ece0: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_GetObjResult(i
ecf0: 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f  nterp);.    Tcl_
ed00: 53 65 74 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c  SetIntObj(pResul
ed10: 74 2c 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  t, sqlite3_chang
ed20: 65 73 28 70 44 62 2d 3e 64 62 29 29 3b 0a 20 20  es(pDb->db));.  
ed30: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
ed40: 2f 2a 20 20 20 20 24 64 62 20 63 6c 6f 73 65 0a  /*    $db close.
ed50: 20 20 2a 2a 0a 20 20 2a 2a 20 53 68 75 74 64 6f    **.  ** Shutdo
ed60: 77 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  wn the database.
ed70: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43    */.  case DB_C
ed80: 4c 4f 53 45 3a 20 7b 0a 20 20 20 20 54 63 6c 5f  LOSE: {.    Tcl_
ed90: 44 65 6c 65 74 65 43 6f 6d 6d 61 6e 64 28 69 6e  DeleteCommand(in
eda0: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
edb0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
edc0: 30 5d 2c 20 30 29 29 3b 0a 20 20 20 20 62 72 65  0], 0));.    bre
edd0: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
ede0: 2a 2a 20 20 20 20 20 24 64 62 20 63 6f 6c 6c 61  **     $db colla
edf0: 74 65 20 4e 41 4d 45 20 53 43 52 49 50 54 0a 20  te NAME SCRIPT. 
ee00: 20 2a 2a 0a 20 20 2a 2a 20 43 72 65 61 74 65 20   **.  ** Create 
ee10: 61 20 6e 65 77 20 53 51 4c 20 63 6f 6c 6c 61 74  a new SQL collat
ee20: 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  ion function cal
ee30: 6c 65 64 20 4e 41 4d 45 2e 20 20 57 68 65 6e 65  led NAME.  Whene
ee40: 76 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 66 75  ver.  ** that fu
ee50: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
ee60: 2c 20 69 6e 76 6f 6b 65 20 53 43 52 49 50 54 20  , invoke SCRIPT 
ee70: 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  to evaluate the 
ee80: 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  function..  */. 
ee90: 20 63 61 73 65 20 44 42 5f 43 4f 4c 4c 41 54 45   case DB_COLLATE
eea0: 3a 20 7b 0a 20 20 20 20 53 71 6c 43 6f 6c 6c 61  : {.    SqlColla
eeb0: 74 65 20 2a 70 43 6f 6c 6c 61 74 65 3b 0a 20 20  te *pCollate;.  
eec0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
eed0: 20 20 20 63 68 61 72 20 2a 7a 53 63 72 69 70 74     char *zScript
eee0: 3b 0a 20 20 20 20 69 6e 74 20 6e 53 63 72 69 70  ;.    int nScrip
eef0: 74 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  t;.    if( objc!
ef00: 3d 34 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =4 ){.      Tcl_
ef10: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
ef20: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e  erp, 2, objv, "N
ef30: 41 4d 45 20 53 43 52 49 50 54 22 29 3b 0a 20 20  AME SCRIPT");.  
ef40: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
ef50: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
ef60: 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53  zName = Tcl_GetS
ef70: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
ef80: 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20 7a 53  v[2], 0);.    zS
ef90: 63 72 69 70 74 20 3d 20 54 63 6c 5f 47 65 74 53  cript = Tcl_GetS
efa0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
efb0: 76 5b 33 5d 2c 20 26 6e 53 63 72 69 70 74 29 3b  v[3], &nScript);
efc0: 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65 20 3d 20  .    pCollate = 
efd0: 28 53 71 6c 43 6f 6c 6c 61 74 65 2a 29 54 63 6c  (SqlCollate*)Tcl
efe0: 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  _Alloc( sizeof(*
eff0: 70 43 6f 6c 6c 61 74 65 29 20 2b 20 6e 53 63 72  pCollate) + nScr
f000: 69 70 74 20 2b 20 31 20 29 3b 0a 20 20 20 20 69  ipt + 1 );.    i
f010: 66 28 20 70 43 6f 6c 6c 61 74 65 3d 3d 30 20 29  f( pCollate==0 )
f020: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
f030: 52 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65 2d  R;.    pCollate-
f040: 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  >interp = interp
f050: 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65 2d 3e  ;.    pCollate->
f060: 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e 70 43 6f  pNext = pDb->pCo
f070: 6c 6c 61 74 65 3b 0a 20 20 20 20 70 43 6f 6c 6c  llate;.    pColl
f080: 61 74 65 2d 3e 7a 53 63 72 69 70 74 20 3d 20 28  ate->zScript = (
f090: 63 68 61 72 2a 29 26 70 43 6f 6c 6c 61 74 65 5b  char*)&pCollate[
f0a0: 31 5d 3b 0a 20 20 20 20 70 44 62 2d 3e 70 43 6f  1];.    pDb->pCo
f0b0: 6c 6c 61 74 65 20 3d 20 70 43 6f 6c 6c 61 74 65  llate = pCollate
f0c0: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 43 6f  ;.    memcpy(pCo
f0d0: 6c 6c 61 74 65 2d 3e 7a 53 63 72 69 70 74 2c 20  llate->zScript, 
f0e0: 7a 53 63 72 69 70 74 2c 20 6e 53 63 72 69 70 74  zScript, nScript
f0f0: 2b 31 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  +1);.    if( sql
f100: 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
f110: 61 74 69 6f 6e 28 70 44 62 2d 3e 64 62 2c 20 7a  ation(pDb->db, z
f120: 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54 46  Name, SQLITE_UTF
f130: 38 2c 20 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  8, .        pCol
f140: 6c 61 74 65 2c 20 74 63 6c 53 71 6c 43 6f 6c 6c  late, tclSqlColl
f150: 61 74 65 29 20 29 7b 0a 20 20 20 20 20 20 54 63  ate) ){.      Tc
f160: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
f170: 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69  rp, (char *)sqli
f180: 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e  te3_errmsg(pDb->
f190: 64 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c  db), TCL_VOLATIL
f1a0: 45 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  E);.      return
f1b0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
f1c0: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
f1d0: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20  ..  /*.  **     
f1e0: 24 64 62 20 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65  $db collation_ne
f1f0: 65 64 65 64 20 53 43 52 49 50 54 0a 20 20 2a 2a  eded SCRIPT.  **
f200: 0a 20 20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  .  ** Create a n
f210: 65 77 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e  ew SQL collation
f220: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64   function called
f230: 20 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76 65 72   NAME.  Whenever
f240: 0a 20 20 2a 2a 20 74 68 61 74 20 66 75 6e 63 74  .  ** that funct
f250: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
f260: 6e 76 6f 6b 65 20 53 43 52 49 50 54 20 74 6f 20  nvoke SCRIPT to 
f270: 65 76 61 6c 75 61 74 65 20 74 68 65 20 66 75 6e  evaluate the fun
f280: 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61  ction..  */.  ca
f290: 73 65 20 44 42 5f 43 4f 4c 4c 41 54 49 4f 4e 5f  se DB_COLLATION_
f2a0: 4e 45 45 44 45 44 3a 20 7b 0a 20 20 20 20 69 66  NEEDED: {.    if
f2b0: 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
f2c0: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
f2d0: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
f2e0: 62 6a 76 2c 20 22 53 43 52 49 50 54 22 29 3b 0a  bjv, "SCRIPT");.
f2f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
f300: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
f310: 20 20 69 66 28 20 70 44 62 2d 3e 70 43 6f 6c 6c    if( pDb->pColl
f320: 61 74 65 4e 65 65 64 65 64 20 29 7b 0a 20 20 20  ateNeeded ){.   
f330: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
f340: 75 6e 74 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74  unt(pDb->pCollat
f350: 65 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 7d 0a  eNeeded);.    }.
f360: 20 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74      pDb->pCollat
f370: 65 4e 65 65 64 65 64 20 3d 20 54 63 6c 5f 44 75  eNeeded = Tcl_Du
f380: 70 6c 69 63 61 74 65 4f 62 6a 28 6f 62 6a 76 5b  plicateObj(objv[
f390: 32 5d 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63  2]);.    Tcl_Inc
f3a0: 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70  rRefCount(pDb->p
f3b0: 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a  CollateNeeded);.
f3c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c      sqlite3_coll
f3d0: 61 74 69 6f 6e 5f 6e 65 65 64 65 64 28 70 44 62  ation_needed(pDb
f3e0: 2d 3e 64 62 2c 20 70 44 62 2c 20 74 63 6c 43 6f  ->db, pDb, tclCo
f3f0: 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20  llateNeeded);.  
f400: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
f410: 2f 2a 20 20 20 20 24 64 62 20 63 6f 6d 6d 69 74  /*    $db commit
f420: 5f 68 6f 6f 6b 20 3f 43 41 4c 4c 42 41 43 4b 3f  _hook ?CALLBACK?
f430: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b  .  **.  ** Invok
f440: 65 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c  e the given call
f450: 62 61 63 6b 20 6a 75 73 74 20 62 65 66 6f 72 65  back just before
f460: 20 63 6f 6d 6d 69 74 74 69 6e 67 20 65 76 65 72   committing ever
f470: 79 20 53 51 4c 20 74 72 61 6e 73 61 63 74 69 6f  y SQL transactio
f480: 6e 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 63  n..  ** If the c
f490: 61 6c 6c 62 61 63 6b 20 74 68 72 6f 77 73 20 61  allback throws a
f4a0: 6e 20 65 78 63 65 70 74 69 6f 6e 20 6f 72 20 72  n exception or r
f4b0: 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  eturns non-zero,
f4c0: 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 74   then the.  ** t
f4d0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 62  ransaction is ab
f4e0: 6f 72 74 65 64 2e 20 20 49 66 20 43 41 4c 4c 42  orted.  If CALLB
f4f0: 41 43 4b 20 69 73 20 61 6e 20 65 6d 70 74 79 20  ACK is an empty 
f500: 73 74 72 69 6e 67 2c 20 74 68 65 20 63 61 6c 6c  string, the call
f510: 62 61 63 6b 0a 20 20 2a 2a 20 69 73 20 64 69 73  back.  ** is dis
f520: 61 62 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61  abled..  */.  ca
f530: 73 65 20 44 42 5f 43 4f 4d 4d 49 54 5f 48 4f 4f  se DB_COMMIT_HOO
f540: 4b 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a  K: {.    if( obj
f550: 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  c>3 ){.      Tcl
f560: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
f570: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
f580: 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20  ?CALLBACK?");.  
f590: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
f5a0: 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20  RROR;.    }else 
f5b0: 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20  if( objc==2 ){. 
f5c0: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 43       if( pDb->zC
f5d0: 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  ommit ){.       
f5e0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
f5f0: 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a  t(interp, pDb->z
f600: 43 6f 6d 6d 69 74 2c 20 28 63 68 61 72 2a 29 30  Commit, (char*)0
f610: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
f620: 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73  else{.      cons
f630: 74 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b  t char *zCommit;
f640: 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a  .      int len;.
f650: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
f660: 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  Commit ){.      
f670: 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e    Tcl_Free(pDb->
f680: 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20  zCommit);.      
f690: 7d 0a 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20  }.      zCommit 
f6a0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
f6b0: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
f6c0: 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  &len);.      if(
f6d0: 20 7a 43 6f 6d 6d 69 74 20 26 26 20 6c 65 6e 3e   zCommit && len>
f6e0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  0 ){.        pDb
f6f0: 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20 54 63 6c 5f  ->zCommit = Tcl_
f700: 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29  Alloc( len + 1 )
f710: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
f720: 28 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 2c 20 7a  (pDb->zCommit, z
f730: 43 6f 6d 6d 69 74 2c 20 6c 65 6e 2b 31 29 3b 0a  Commit, len+1);.
f740: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f750: 20 20 20 20 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69       pDb->zCommi
f760: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 0;.      }. 
f770: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 43       if( pDb->zC
f780: 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  ommit ){.       
f790: 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69   pDb->interp = i
f7a0: 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73  nterp;.        s
f7b0: 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f  qlite3_commit_ho
f7c0: 6f 6b 28 70 44 62 2d 3e 64 62 2c 20 44 62 43 6f  ok(pDb->db, DbCo
f7d0: 6d 6d 69 74 48 61 6e 64 6c 65 72 2c 20 70 44 62  mmitHandler, pDb
f7e0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
f7f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
f800: 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 70 44 62 2d  commit_hook(pDb-
f810: 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  >db, 0, 0);.    
f820: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72    }.    }.    br
f830: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
f840: 20 20 24 64 62 20 63 6f 6d 70 6c 65 74 65 20 53    $db complete S
f850: 51 4c 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74  QL.  **.  ** Ret
f860: 75 72 6e 20 54 52 55 45 20 69 66 20 53 51 4c 20  urn TRUE if SQL 
f870: 69 73 20 61 20 63 6f 6d 70 6c 65 74 65 20 53 51  is a complete SQ
f880: 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 52 65  L statement.  Re
f890: 74 75 72 6e 20 46 41 4c 53 45 20 69 66 0a 20 20  turn FALSE if.  
f8a0: 2a 2a 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 69  ** additional li
f8b0: 6e 65 73 20 6f 66 20 69 6e 70 75 74 20 61 72 65  nes of input are
f8c0: 20 6e 65 65 64 65 64 2e 20 20 54 68 69 73 20 69   needed.  This i
f8d0: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65  s similar to the
f8e0: 0a 20 20 2a 2a 20 62 75 69 6c 74 2d 69 6e 20 22  .  ** built-in "
f8f0: 69 6e 66 6f 20 63 6f 6d 70 6c 65 74 65 22 20 63  info complete" c
f900: 6f 6d 6d 61 6e 64 20 6f 66 20 54 63 6c 2e 0a 20  ommand of Tcl.. 
f910: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f   */.  case DB_CO
f920: 4d 50 4c 45 54 45 3a 20 7b 0a 23 69 66 6e 64 65  MPLETE: {.#ifnde
f930: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
f940: 4d 50 4c 45 54 45 0a 20 20 20 20 54 63 6c 5f 4f  MPLETE.    Tcl_O
f950: 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20  bj *pResult;.   
f960: 20 69 6e 74 20 69 73 43 6f 6d 70 6c 65 74 65 3b   int isComplete;
f970: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  .    if( objc!=3
f980: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
f990: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
f9a0: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 51 4c  p, 2, objv, "SQL
f9b0: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
f9c0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
f9d0: 7d 0a 20 20 20 20 69 73 43 6f 6d 70 6c 65 74 65  }.    isComplete
f9e0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c   = sqlite3_compl
f9f0: 65 74 65 28 20 54 63 6c 5f 47 65 74 53 74 72 69  ete( Tcl_GetStri
fa00: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
fa10: 5d 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 52 65  ], 0) );.    pRe
fa20: 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62  sult = Tcl_GetOb
fa30: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  jResult(interp);
fa40: 0a 20 20 20 20 54 63 6c 5f 53 65 74 42 6f 6f 6c  .    Tcl_SetBool
fa50: 65 61 6e 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20  eanObj(pResult, 
fa60: 69 73 43 6f 6d 70 6c 65 74 65 29 3b 0a 23 65 6e  isComplete);.#en
fa70: 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  dif.    break;. 
fa80: 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20   }..  /*    $db 
fa90: 63 6f 70 79 20 63 6f 6e 66 6c 69 63 74 2d 61 6c  copy conflict-al
faa0: 67 6f 72 69 74 68 6d 20 74 61 62 6c 65 20 66 69  gorithm table fi
fab0: 6c 65 6e 61 6d 65 20 3f 53 45 50 41 52 41 54 4f  lename ?SEPARATO
fac0: 52 3f 20 3f 4e 55 4c 4c 49 4e 44 49 43 41 54 4f  R? ?NULLINDICATO
fad0: 52 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f 70  R?.  **.  ** Cop
fae0: 79 20 64 61 74 61 20 69 6e 74 6f 20 74 61 62 6c  y data into tabl
faf0: 65 20 66 72 6f 6d 20 66 69 6c 65 6e 61 6d 65 2c  e from filename,
fb00: 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 75 73 69 6e   optionally usin
fb10: 67 20 53 45 50 41 52 41 54 4f 52 0a 20 20 2a 2a  g SEPARATOR.  **
fb20: 20 61 73 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72   as column separ
fb30: 61 74 6f 72 73 2e 20 20 49 66 20 61 20 63 6f 6c  ators.  If a col
fb40: 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 20 6e  umn contains a n
fb50: 75 6c 6c 20 73 74 72 69 6e 67 2c 20 6f 72 20 74  ull string, or t
fb60: 68 65 0a 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66  he.  ** value of
fb70: 20 4e 55 4c 4c 49 4e 44 49 43 41 54 4f 52 2c 20   NULLINDICATOR, 
fb80: 61 20 4e 55 4c 4c 20 69 73 20 69 6e 73 65 72 74  a NULL is insert
fb90: 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  ed for the colum
fba0: 6e 2e 0a 20 20 2a 2a 20 63 6f 6e 66 6c 69 63 74  n..  ** conflict
fbb0: 2d 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 6f 6e  -algorithm is on
fbc0: 65 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 20  e of the sqlite 
fbd0: 63 6f 6e 66 6c 69 63 74 20 61 6c 67 6f 72 69 74  conflict algorit
fbe0: 68 6d 73 3a 0a 20 20 2a 2a 20 20 20 20 72 6f 6c  hms:.  **    rol
fbf0: 6c 62 61 63 6b 2c 20 61 62 6f 72 74 2c 20 66 61  lback, abort, fa
fc00: 69 6c 2c 20 69 67 6e 6f 72 65 2c 20 72 65 70 6c  il, ignore, repl
fc10: 61 63 65 0a 20 20 2a 2a 20 4f 6e 20 73 75 63 63  ace.  ** On succ
fc20: 65 73 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20  ess, return the 
fc30: 6e 75 6d 62 65 72 20 6f 66 20 6c 69 6e 65 73 20  number of lines 
fc40: 70 72 6f 63 65 73 73 65 64 2c 20 6e 6f 74 20 6e  processed, not n
fc50: 65 63 65 73 73 61 72 69 6c 79 20 73 61 6d 65 0a  ecessarily same.
fc60: 20 20 2a 2a 20 61 73 20 27 64 62 20 63 68 61 6e    ** as 'db chan
fc70: 67 65 73 27 20 64 75 65 20 74 6f 20 63 6f 6e 66  ges' due to conf
fc80: 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d 20 73  lict-algorithm s
fc90: 65 6c 65 63 74 65 64 2e 0a 20 20 2a 2a 0a 20 20  elected..  **.  
fca0: 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 69 73 20  ** This code is 
fcb0: 62 61 73 69 63 61 6c 6c 79 20 61 6e 20 69 6d 70  basically an imp
fcc0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 2f 65 6e 68 61  lementation/enha
fcd0: 6e 63 65 6d 65 6e 74 20 6f 66 0a 20 20 2a 2a 20  ncement of.  ** 
fce0: 74 68 65 20 73 71 6c 69 74 65 33 20 73 68 65 6c  the sqlite3 shel
fcf0: 6c 2e 63 20 22 2e 69 6d 70 6f 72 74 22 20 63 6f  l.c ".import" co
fd00: 6d 6d 61 6e 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  mmand..  **.  **
fd10: 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 75 73   This command us
fd20: 61 67 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e  age is equivalen
fd30: 74 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 32  t to the sqlite2
fd40: 2e 78 20 43 4f 50 59 20 73 74 61 74 65 6d 65 6e  .x COPY statemen
fd50: 74 2c 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 6d  t,.  ** which im
fd60: 70 6f 72 74 73 20 66 69 6c 65 20 64 61 74 61 20  ports file data 
fd70: 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 75 73 69  into a table usi
fd80: 6e 67 20 74 68 65 20 50 6f 73 74 67 72 65 53 51  ng the PostgreSQ
fd90: 4c 20 43 4f 50 59 20 66 69 6c 65 20 66 6f 72 6d  L COPY file form
fda0: 61 74 3a 0a 20 20 2a 2a 20 20 20 24 64 62 20 63  at:.  **   $db c
fdb0: 6f 70 79 20 24 63 6f 6e 66 6c 69 74 5f 61 6c 67  opy $conflit_alg
fdc0: 6f 20 24 74 61 62 6c 65 5f 6e 61 6d 65 20 24 66  o $table_name $f
fdd0: 69 6c 65 6e 61 6d 65 20 5c 74 20 5c 5c 4e 0a 20  ilename \t \\N. 
fde0: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f   */.  case DB_CO
fdf0: 50 59 3a 20 7b 0a 20 20 20 20 63 68 61 72 20 2a  PY: {.    char *
fe00: 7a 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20  zTable;         
fe10: 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20        /* Insert 
fe20: 64 61 74 61 20 69 6e 74 6f 20 74 68 69 73 20 74  data into this t
fe30: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72  able */.    char
fe40: 20 2a 7a 46 69 6c 65 3b 20 20 20 20 20 20 20 20   *zFile;        
fe50: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
fe60: 69 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20 74  ile from which t
fe70: 6f 20 65 78 74 72 61 63 74 20 64 61 74 61 20 2a  o extract data *
fe80: 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6e  /.    char *zCon
fe90: 66 6c 69 63 74 3b 20 20 20 20 20 20 20 20 20 20  flict;          
fea0: 20 20 2f 2a 20 54 68 65 20 63 6f 6e 66 6c 69 63    /* The conflic
feb0: 74 20 61 6c 67 6f 72 69 74 68 6d 20 74 6f 20 75  t algorithm to u
fec0: 73 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  se */.    sqlite
fed0: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20  3_stmt *pStmt;  
fee0: 20 20 20 20 20 20 2f 2a 20 41 20 73 74 61 74 65        /* A state
fef0: 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ment */.    int 
ff00: 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  nCol;           
ff10: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
ff20: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
ff30: 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  the table */.   
ff40: 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20   int nByte;     
ff50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ff60: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
ff70: 69 6e 20 61 6e 20 53 51 4c 20 73 74 72 69 6e 67  in an SQL string
ff80: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a   */.    int i, j
ff90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ffa0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
ffb0: 74 65 72 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ters */.    int 
ffc0: 6e 53 65 70 3b 20 20 20 20 20 20 20 20 20 20 20  nSep;           
ffd0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
ffe0: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 53  r of bytes in zS
fff0: 65 70 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ep[] */.    int 
10000 6e 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  nNull;          
10010 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
10020 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 4e  r of bytes in zN
10030 75 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 63 68 61  ull[] */.    cha
10040 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20 20  r *zSql;        
10050 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 53           /* An S
10060 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  QL statement */.
10070 20 20 20 20 63 68 61 72 20 2a 7a 4c 69 6e 65 3b      char *zLine;
10080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10090 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c 69 6e 65  /* A single line
100a0 20 6f 66 20 69 6e 70 75 74 20 66 72 6f 6d 20 74   of input from t
100b0 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 63  he file */.    c
100c0 68 61 72 20 2a 2a 61 7a 43 6f 6c 3b 20 20 20 20  har **azCol;    
100d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4c             /* zL
100e0 69 6e 65 5b 5d 20 62 72 6f 6b 65 6e 20 75 70 20  ine[] broken up 
100f0 69 6e 74 6f 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  into columns */.
10100 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
10110 7a 43 6f 6d 6d 69 74 3b 20 20 20 20 20 20 20 20  zCommit;        
10120 2f 2a 20 48 6f 77 20 74 6f 20 63 6f 6d 6d 69 74  /* How to commit
10130 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 20 20   changes */.    
10140 46 49 4c 45 20 2a 69 6e 3b 20 20 20 20 20 20 20  FILE *in;       
10150 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
10160 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f  he input file */
10170 0a 20 20 20 20 69 6e 74 20 6c 69 6e 65 6e 6f 20  .    int lineno 
10180 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
10190 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20   /* Line number 
101a0 6f 66 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f  of input file */
101b0 0a 20 20 20 20 63 68 61 72 20 7a 4c 69 6e 65 4e  .    char zLineN
101c0 75 6d 5b 38 30 5d 3b 20 20 20 20 20 20 20 20 20  um[80];         
101d0 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20   /* Line number 
101e0 70 72 69 6e 74 20 62 75 66 66 65 72 20 2a 2f 0a  print buffer */.
101f0 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65      Tcl_Obj *pRe
10200 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20  sult;           
10210 2f 2a 20 69 6e 74 65 72 70 20 72 65 73 75 6c 74  /* interp result
10220 20 2a 2f 0a 0a 20 20 20 20 63 6f 6e 73 74 20 63   */..    const c
10230 68 61 72 20 2a 7a 53 65 70 3b 0a 20 20 20 20 63  har *zSep;.    c
10240 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 75 6c 6c  onst char *zNull
10250 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3c 35  ;.    if( objc<5
10260 20 7c 7c 20 6f 62 6a 63 3e 37 20 29 7b 0a 20 20   || objc>7 ){.  
10270 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
10280 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
10290 6f 62 6a 76 2c 20 0a 20 20 20 20 20 20 20 20 20  objv, .         
102a0 22 43 4f 4e 46 4c 49 43 54 2d 41 4c 47 4f 52 49  "CONFLICT-ALGORI
102b0 54 48 4d 20 54 41 42 4c 45 20 46 49 4c 45 4e 41  THM TABLE FILENA
102c0 4d 45 20 3f 53 45 50 41 52 41 54 4f 52 3f 20 3f  ME ?SEPARATOR? ?
102d0 4e 55 4c 4c 49 4e 44 49 43 41 54 4f 52 3f 22 29  NULLINDICATOR?")
102e0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
102f0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
10300 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 3d 36 20      if( objc>=6 
10310 29 7b 0a 20 20 20 20 20 20 7a 53 65 70 20 3d 20  ){.      zSep = 
10320 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
10330 6d 4f 62 6a 28 6f 62 6a 76 5b 35 5d 2c 20 30 29  mObj(objv[5], 0)
10340 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
10350 20 20 20 7a 53 65 70 20 3d 20 22 5c 74 22 3b 0a     zSep = "\t";.
10360 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62      }.    if( ob
10370 6a 63 3e 3d 37 20 29 7b 0a 20 20 20 20 20 20 7a  jc>=7 ){.      z
10380 4e 75 6c 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74  Null = Tcl_GetSt
10390 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
103a0 5b 36 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  [6], 0);.    }el
103b0 73 65 7b 0a 20 20 20 20 20 20 7a 4e 75 6c 6c 20  se{.      zNull 
103c0 3d 20 22 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = "";.    }.    
103d0 7a 43 6f 6e 66 6c 69 63 74 20 3d 20 54 63 6c 5f  zConflict = Tcl_
103e0 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
103f0 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20  (objv[2], 0);.  
10400 20 20 7a 54 61 62 6c 65 20 3d 20 54 63 6c 5f 47    zTable = Tcl_G
10410 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
10420 6f 62 6a 76 5b 33 5d 2c 20 30 29 3b 0a 20 20 20  objv[3], 0);.   
10430 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74   zFile = Tcl_Get
10440 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
10450 6a 76 5b 34 5d 2c 20 30 29 3b 0a 20 20 20 20 6e  jv[4], 0);.    n
10460 53 65 70 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a  Sep = strlen30(z
10470 53 65 70 29 3b 0a 20 20 20 20 6e 4e 75 6c 6c 20  Sep);.    nNull 
10480 3d 20 73 74 72 6c 65 6e 33 30 28 7a 4e 75 6c 6c  = strlen30(zNull
10490 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 65 70 3d  );.    if( nSep=
104a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =0 ){.      Tcl_
104b0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
104c0 65 72 70 2c 22 45 72 72 6f 72 3a 20 6e 6f 6e 2d  erp,"Error: non-
104d0 6e 75 6c 6c 20 73 65 70 61 72 61 74 6f 72 20 72  null separator r
104e0 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f 70 79  equired for copy
104f0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
10500 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
10510 29 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  )0);.      retur
10520 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
10530 20 7d 0a 20 20 20 20 69 66 28 73 74 72 63 6d 70   }.    if(strcmp
10540 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 72 6f 6c  (zConflict, "rol
10550 6c 62 61 63 6b 22 29 20 21 3d 20 30 20 26 26 0a  lback") != 0 &&.
10560 20 20 20 20 20 20 20 73 74 72 63 6d 70 28 7a 43         strcmp(zC
10570 6f 6e 66 6c 69 63 74 2c 20 22 61 62 6f 72 74 22  onflict, "abort"
10580 20 20 20 29 20 21 3d 20 30 20 26 26 0a 20 20 20     ) != 0 &&.   
10590 20 20 20 20 73 74 72 63 6d 70 28 7a 43 6f 6e 66      strcmp(zConf
105a0 6c 69 63 74 2c 20 22 66 61 69 6c 22 20 20 20 20  lict, "fail"    
105b0 29 20 21 3d 20 30 20 26 26 0a 20 20 20 20 20 20  ) != 0 &&.      
105c0 20 73 74 72 63 6d 70 28 7a 43 6f 6e 66 6c 69 63   strcmp(zConflic
105d0 74 2c 20 22 69 67 6e 6f 72 65 22 20 20 29 20 21  t, "ignore"  ) !
105e0 3d 20 30 20 26 26 0a 20 20 20 20 20 20 20 73 74  = 0 &&.       st
105f0 72 63 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20  rcmp(zConflict, 
10600 22 72 65 70 6c 61 63 65 22 20 29 20 21 3d 20 30  "replace" ) != 0
10610 20 29 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41   ) {.      Tcl_A
10620 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
10630 72 70 2c 20 22 45 72 72 6f 72 3a 20 5c 22 22 2c  rp, "Error: \"",
10640 20 7a 43 6f 6e 66 6c 69 63 74 2c 20 0a 20 20 20   zConflict, .   
10650 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 63 6f           "\", co
10660 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d  nflict-algorithm
10670 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 3a   must be one of:
10680 20 72 6f 6c 6c 62 61 63 6b 2c 20 22 0a 20 20 20   rollback, ".   
10690 20 20 20 20 20 20 20 20 20 22 61 62 6f 72 74 2c           "abort,
106a0 20 66 61 69 6c 2c 20 69 67 6e 6f 72 65 2c 20 6f   fail, ignore, o
106b0 72 20 72 65 70 6c 61 63 65 22 2c 20 28 63 68 61  r replace", (cha
106c0 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 65 74  r*)0);.      ret
106d0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
106e0 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d 20     }.    zSql = 
106f0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
10700 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 27  "SELECT * FROM '
10710 25 71 27 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20  %q'", zTable);. 
10720 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29     if( zSql==0 )
10730 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
10740 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
10750 20 22 45 72 72 6f 72 3a 20 6e 6f 20 73 75 63 68   "Error: no such
10760 20 74 61 62 6c 65 3a 20 22 2c 20 7a 54 61 62 6c   table: ", zTabl
10770 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  e, (char*)0);.  
10780 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
10790 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
107a0 6e 42 79 74 65 20 3d 20 73 74 72 6c 65 6e 33 30  nByte = strlen30
107b0 28 7a 53 71 6c 29 3b 0a 20 20 20 20 72 63 20 3d  (zSql);.    rc =
107c0 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
107d0 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  (pDb->db, zSql, 
107e0 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
107f0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
10800 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20  (zSql);.    if( 
10810 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  rc ){.      Tcl_
10820 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
10830 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 22 2c 20  erp, "Error: ", 
10840 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
10850 44 62 2d 3e 64 62 29 2c 20 28 63 68 61 72 2a 29  Db->db), (char*)
10860 30 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 20 3d  0);.      nCol =
10870 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
10880 20 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69       nCol = sqli
10890 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  te3_column_count
108a0 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20  (pStmt);.    }. 
108b0 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
108c0 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
108d0 69 66 28 20 6e 43 6f 6c 3d 3d 30 20 29 20 7b 0a  if( nCol==0 ) {.
108e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
108f0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
10900 20 20 7a 53 71 6c 20 3d 20 6d 61 6c 6c 6f 63 28    zSql = malloc(
10910 20 6e 42 79 74 65 20 2b 20 35 30 20 2b 20 6e 43   nByte + 50 + nC
10920 6f 6c 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20  ol*2 );.    if( 
10930 7a 53 71 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20  zSql==0 ) {.    
10940 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
10950 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f  lt(interp, "Erro
10960 72 3a 20 63 61 6e 27 74 20 6d 61 6c 6c 6f 63 28  r: can't malloc(
10970 29 22 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  )", (char*)0);. 
10980 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
10990 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
109a0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
109b0 66 28 6e 42 79 74 65 2b 35 30 2c 20 7a 53 71 6c  f(nByte+50, zSql
109c0 2c 20 22 49 4e 53 45 52 54 20 4f 52 20 25 71 20  , "INSERT OR %q 
109d0 49 4e 54 4f 20 27 25 71 27 20 56 41 4c 55 45 53  INTO '%q' VALUES
109e0 28 3f 22 2c 0a 20 20 20 20 20 20 20 20 20 7a 43  (?",.         zC
109f0 6f 6e 66 6c 69 63 74 2c 20 7a 54 61 62 6c 65 29  onflict, zTable)
10a00 3b 0a 20 20 20 20 6a 20 3d 20 73 74 72 6c 65 6e  ;.    j = strlen
10a10 33 30 28 7a 53 71 6c 29 3b 0a 20 20 20 20 66 6f  30(zSql);.    fo
10a20 72 28 69 3d 31 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=1; i<nCol; i
10a30 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c 5b  ++){.      zSql[
10a40 6a 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20  j++] = ',';.    
10a50 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 3f    zSql[j++] = '?
10a60 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71  ';.    }.    zSq
10a70 6c 5b 6a 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20  l[j++] = ')';.  
10a80 20 20 7a 53 71 6c 5b 6a 5d 20 3d 20 30 3b 0a 20    zSql[j] = 0;. 
10a90 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
10aa0 70 72 65 70 61 72 65 28 70 44 62 2d 3e 64 62 2c  prepare(pDb->db,
10ab0 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
10ac0 74 2c 20 30 29 3b 0a 20 20 20 20 66 72 65 65 28  t, 0);.    free(
10ad0 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 72  zSql);.    if( r
10ae0 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  c ){.      Tcl_A
10af0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
10b00 72 70 2c 20 22 45 72 72 6f 72 3a 20 22 2c 20 73  rp, "Error: ", s
10b10 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44  qlite3_errmsg(pD
10b20 62 2d 3e 64 62 29 2c 20 28 63 68 61 72 2a 29 30  b->db), (char*)0
10b30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10b40 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
10b50 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
10b60 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
10b70 20 20 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a      in = fopen(z
10b80 46 69 6c 65 2c 20 22 72 62 22 29 3b 0a 20 20 20  File, "rb");.   
10b90 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20   if( in==0 ){.  
10ba0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
10bb0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72  sult(interp, "Er
10bc0 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e  ror: cannot open
10bd0 20 66 69 6c 65 3a 20 22 2c 20 7a 46 69 6c 65 2c   file: ", zFile,
10be0 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71   NULL);.      sq
10bf0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
10c00 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74  Stmt);.      ret
10c10 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
10c20 20 20 20 7d 0a 20 20 20 20 61 7a 43 6f 6c 20 3d     }.    azCol =
10c30 20 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28   malloc( sizeof(
10c40 61 7a 43 6f 6c 5b 30 5d 29 2a 28 6e 43 6f 6c 2b  azCol[0])*(nCol+
10c50 31 29 20 29 3b 0a 20 20 20 20 69 66 28 20 61 7a  1) );.    if( az
10c60 43 6f 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20  Col==0 ) {.     
10c70 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
10c80 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72  t(interp, "Error
10c90 3a 20 63 61 6e 27 74 20 6d 61 6c 6c 6f 63 28 29  : can't malloc()
10ca0 22 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ", (char*)0);.  
10cb0 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a      fclose(in);.
10cc0 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
10cd0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
10ce0 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 5f    (void)sqlite3_
10cf0 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 22 42  exec(pDb->db, "B
10d00 45 47 49 4e 22 2c 20 30 2c 20 30 2c 20 30 29 3b  EGIN", 0, 0, 0);
10d10 0a 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22  .    zCommit = "
10d20 43 4f 4d 4d 49 54 22 3b 0a 20 20 20 20 77 68 69  COMMIT";.    whi
10d30 6c 65 28 20 28 7a 4c 69 6e 65 20 3d 20 6c 6f 63  le( (zLine = loc
10d40 61 6c 5f 67 65 74 6c 69 6e 65 28 30 2c 20 69 6e  al_getline(0, in
10d50 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  ))!=0 ){.      c
10d60 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 6c 69  har *z;.      li
10d70 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 61 7a  neno++;.      az
10d80 43 6f 6c 5b 30 5d 20 3d 20 7a 4c 69 6e 65 3b 0a  Col[0] = zLine;.
10d90 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 7a        for(i=0, z
10da0 3d 7a 4c 69 6e 65 3b 20 2a 7a 3b 20 7a 2b 2b 29  =zLine; *z; z++)
10db0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a 7a  {.        if( *z
10dc0 3d 3d 7a 53 65 70 5b 30 5d 20 26 26 20 73 74 72  ==zSep[0] && str
10dd0 6e 63 6d 70 28 7a 2c 20 7a 53 65 70 2c 20 6e 53  ncmp(z, zSep, nS
10de0 65 70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ep)==0 ){.      
10df0 20 20 20 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20      *z = 0;.    
10e00 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20        i++;.     
10e10 20 20 20 20 20 69 66 28 20 69 3c 6e 43 6f 6c 20       if( i<nCol 
10e20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
10e30 7a 43 6f 6c 5b 69 5d 20 3d 20 26 7a 5b 6e 53 65  zCol[i] = &z[nSe
10e40 70 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  p];.            
10e50 7a 20 2b 3d 20 6e 53 65 70 2d 31 3b 0a 20 20 20  z += nSep-1;.   
10e60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
10e70 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
10e80 20 69 66 28 20 69 2b 31 21 3d 6e 43 6f 6c 20 29   if( i+1!=nCol )
10e90 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
10ea0 7a 45 72 72 3b 0a 20 20 20 20 20 20 20 20 69 6e  zErr;.        in
10eb0 74 20 6e 45 72 72 20 3d 20 73 74 72 6c 65 6e 33  t nErr = strlen3
10ec0 30 28 7a 46 69 6c 65 29 20 2b 20 32 30 30 3b 0a  0(zFile) + 200;.
10ed0 20 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20 6d          zErr = m
10ee0 61 6c 6c 6f 63 28 6e 45 72 72 29 3b 0a 20 20 20  alloc(nErr);.   
10ef0 20 20 20 20 20 69 66 28 20 7a 45 72 72 20 29 7b       if( zErr ){
10f00 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
10f10 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 45 72 72  e3_snprintf(nErr
10f20 2c 20 7a 45 72 72 2c 0a 20 20 20 20 20 20 20 20  , zErr,.        
10f30 20 20 20 20 20 22 45 72 72 6f 72 3a 20 25 73 20       "Error: %s 
10f40 6c 69 6e 65 20 25 64 3a 20 65 78 70 65 63 74 65  line %d: expecte
10f50 64 20 25 64 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  d %d columns of 
10f60 64 61 74 61 20 62 75 74 20 66 6f 75 6e 64 20 25  data but found %
10f70 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  d",.            
10f80 20 7a 46 69 6c 65 2c 20 6c 69 6e 65 6e 6f 2c 20   zFile, lineno, 
10f90 6e 43 6f 6c 2c 20 69 2b 31 29 3b 0a 20 20 20 20  nCol, i+1);.    
10fa0 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
10fb0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
10fc0 45 72 72 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  Err, (char*)0);.
10fd0 20 20 20 20 20 20 20 20 20 20 66 72 65 65 28 7a            free(z
10fe0 45 72 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Err);.        }.
10ff0 20 20 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20          zCommit 
11000 3d 20 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20  = "ROLLBACK";.  
11010 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11020 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69     }.      for(i
11030 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
11040 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 63 68 65  {.        /* che
11050 63 6b 20 66 6f 72 20 6e 75 6c 6c 20 64 61 74 61  ck for null data
11060 2c 20 69 66 20 73 6f 2c 20 62 69 6e 64 20 61 73  , if so, bind as
11070 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20   null */.       
11080 20 69 66 28 20 28 6e 4e 75 6c 6c 3e 30 20 26 26   if( (nNull>0 &&
11090 20 73 74 72 63 6d 70 28 61 7a 43 6f 6c 5b 69 5d   strcmp(azCol[i]
110a0 2c 20 7a 4e 75 6c 6c 29 3d 3d 30 29 0a 20 20 20  , zNull)==0).   
110b0 20 20 20 20 20 20 20 7c 7c 20 73 74 72 6c 65 6e         || strlen
110c0 33 30 28 61 7a 43 6f 6c 5b 69 5d 29 3d 3d 30 20  30(azCol[i])==0 
110d0 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
110e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
110f0 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 69  nd_null(pStmt, i
11100 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  +1);.        }el
11110 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  se{.          sq
11120 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28  lite3_bind_text(
11130 70 53 74 6d 74 2c 20 69 2b 31 2c 20 61 7a 43 6f  pStmt, i+1, azCo
11140 6c 5b 69 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45  l[i], -1, SQLITE
11150 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
11160 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
11170 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70    sqlite3_step(p
11180 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 63 20  Stmt);.      rc 
11190 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
111a0 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 66 72  pStmt);.      fr
111b0 65 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20  ee(zLine);.     
111c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
111d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  OK ){.        Tc
111e0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
111f0 6e 74 65 72 70 2c 22 45 72 72 6f 72 3a 20 22 2c  nterp,"Error: ",
11200 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
11210 70 44 62 2d 3e 64 62 29 2c 20 28 63 68 61 72 2a  pDb->db), (char*
11220 29 30 29 3b 0a 20 20 20 20 20 20 20 20 7a 43 6f  )0);.        zCo
11230 6d 6d 69 74 20 3d 20 22 52 4f 4c 4c 42 41 43 4b  mmit = "ROLLBACK
11240 22 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ";.        break
11250 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11260 20 20 20 20 66 72 65 65 28 61 7a 43 6f 6c 29 3b      free(azCol);
11270 0a 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b  .    fclose(in);
11280 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
11290 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
112a0 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 5f    (void)sqlite3_
112b0 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 7a 43  exec(pDb->db, zC
112c0 6f 6d 6d 69 74 2c 20 30 2c 20 30 2c 20 30 29 3b  ommit, 0, 0, 0);
112d0 0a 0a 20 20 20 20 69 66 28 20 7a 43 6f 6d 6d 69  ..    if( zCommi
112e0 74 5b 30 5d 20 3d 3d 20 27 43 27 20 29 7b 0a 20  t[0] == 'C' ){. 
112f0 20 20 20 20 20 2f 2a 20 73 75 63 63 65 73 73 2c       /* success,
11300 20 73 65 74 20 72 65 73 75 6c 74 20 61 73 20 6e   set result as n
11310 75 6d 62 65 72 20 6f 66 20 6c 69 6e 65 73 20 70  umber of lines p
11320 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 20 20  rocessed */.    
11330 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f    pResult = Tcl_
11340 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  GetObjResult(int
11350 65 72 70 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f  erp);.      Tcl_
11360 53 65 74 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c  SetIntObj(pResul
11370 74 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20  t, lineno);.    
11380 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20    rc = TCL_OK;. 
11390 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
113a0 2f 2a 20 66 61 69 6c 75 72 65 2c 20 61 70 70 65  /* failure, appe
113b0 6e 64 20 6c 69 6e 65 6e 6f 20 77 68 65 72 65 20  nd lineno where 
113c0 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20  failed */.      
113d0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
113e0 28 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 4e 75 6d  (sizeof(zLineNum
113f0 29 2c 20 7a 4c 69 6e 65 4e 75 6d 2c 22 25 64 22  ), zLineNum,"%d"
11400 2c 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20  ,lineno);.      
11410 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
11420 28 69 6e 74 65 72 70 2c 22 2c 20 66 61 69 6c 65  (interp,", faile
11430 64 20 77 68 69 6c 65 20 70 72 6f 63 65 73 73 69  d while processi
11440 6e 67 20 6c 69 6e 65 3a 20 22 2c 7a 4c 69 6e 65  ng line: ",zLine
11450 4e 75 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Num,.           
11460 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
11470 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 63 20  r*)0);.      rc 
11480 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  = TCL_ERROR;.   
11490 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
114a0 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
114b0 24 64 62 20 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f  $db enable_load_
114c0 65 78 74 65 6e 73 69 6f 6e 20 42 4f 4f 4c 45 41  extension BOOLEA
114d0 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 75 72 6e  N.  **.  ** Turn
114e0 20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e 20 6c   the extension l
114f0 6f 61 64 69 6e 67 20 66 65 61 74 75 72 65 20 6f  oading feature o
11500 6e 20 6f 72 20 6f 66 66 2e 20 20 49 74 20 69 66  n or off.  It if
11510 20 6f 66 66 20 62 79 0a 20 20 2a 2a 20 64 65 66   off by.  ** def
11520 61 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  ault..  */.  cas
11530 65 20 44 42 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44  e DB_ENABLE_LOAD
11540 5f 45 58 54 45 4e 53 49 4f 4e 3a 20 7b 0a 23 69  _EXTENSION: {.#i
11550 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11560 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
11570 0a 20 20 20 20 69 6e 74 20 6f 6e 6f 66 66 3b 0a  .    int onoff;.
11580 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20      if( objc!=3 
11590 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
115a0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
115b0 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 42 4f 4f 4c  , 2, objv, "BOOL
115c0 45 41 4e 22 29 3b 0a 20 20 20 20 20 20 72 65 74  EAN");.      ret
115d0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
115e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 54 63 6c     }.    if( Tcl
115f0 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
11600 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
11610 32 5d 2c 20 26 6f 6e 6f 66 66 29 20 29 7b 0a 20  2], &onoff) ){. 
11620 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
11630 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
11640 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
11650 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 70  load_extension(p
11660 44 62 2d 3e 64 62 2c 20 6f 6e 6f 66 66 29 3b 0a  Db->db, onoff);.
11670 20 20 20 20 62 72 65 61 6b 3b 0a 23 65 6c 73 65      break;.#else
11680 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
11690 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 65  esult(interp, "e
116a0 78 74 65 6e 73 69 6f 6e 20 6c 6f 61 64 69 6e 67  xtension loading
116b0 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66 20 61   is turned off a
116c0 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 22 2c  t compile-time",
116d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
116e0 20 20 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b        (char*)0);
116f0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
11700 45 52 52 4f 52 3b 0a 23 65 6e 64 69 66 0a 20 20  ERROR;.#endif.  
11710 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
11720 24 64 62 20 65 72 72 6f 72 63 6f 64 65 0a 20 20  $db errorcode.  
11730 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74  **.  ** Return t
11740 68 65 20 6e 75 6d 65 72 69 63 20 65 72 72 6f 72  he numeric error
11750 20 63 6f 64 65 20 74 68 61 74 20 77 61 73 20 72   code that was r
11760 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 6d  eturned by the m
11770 6f 73 74 20 72 65 63 65 6e 74 0a 20 20 2a 2a 20  ost recent.  ** 
11780 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f  call to sqlite3_
11790 65 78 65 63 28 29 2e 0a 20 20 2a 2f 0a 20 20 63  exec()..  */.  c
117a0 61 73 65 20 44 42 5f 45 52 52 4f 52 43 4f 44 45  ase DB_ERRORCODE
117b0 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f  : {.    Tcl_SetO
117c0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
117d0 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73   Tcl_NewIntObj(s
117e0 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 70  qlite3_errcode(p
117f0 44 62 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20 62  Db->db)));.    b
11800 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
11810 20 20 2a 2a 20 20 20 20 24 64 62 20 65 78 69 73    **    $db exis
11820 74 73 20 24 73 71 6c 0a 20 20 2a 2a 20 20 20 20  ts $sql.  **    
11830 24 64 62 20 6f 6e 65 63 6f 6c 75 6d 6e 20 24 73  $db onecolumn $s
11840 71 6c 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  ql.  **.  ** The
11850 20 6f 6e 65 63 6f 6c 75 6d 6e 20 6d 65 74 68 6f   onecolumn metho
11860 64 20 69 73 20 74 68 65 20 65 71 75 69 76 61 6c  d is the equival
11870 65 6e 74 20 6f 66 3a 0a 20 20 2a 2a 20 20 20 20  ent of:.  **    
11880 20 6c 69 6e 64 65 78 20 5b 24 64 62 20 65 76 61   lindex [$db eva
11890 6c 20 24 73 71 6c 5d 20 30 0a 20 20 2a 2f 0a 20  l $sql] 0.  */. 
118a0 20 63 61 73 65 20 44 42 5f 45 58 49 53 54 53 3a   case DB_EXISTS:
118b0 20 0a 20 20 63 61 73 65 20 44 42 5f 4f 4e 45 43   .  case DB_ONEC
118c0 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 44 62 45  OLUMN: {.    DbE
118d0 76 61 6c 43 6f 6e 74 65 78 74 20 73 45 76 61 6c  valContext sEval
118e0 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ;.    if( objc!=
118f0 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
11900 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
11910 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 51  rp, 2, objv, "SQ
11920 4c 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  L");.      retur
11930 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
11940 20 7d 0a 0a 20 20 20 20 64 62 45 76 61 6c 49 6e   }..    dbEvalIn
11950 69 74 28 26 73 45 76 61 6c 2c 20 70 44 62 2c 20  it(&sEval, pDb, 
11960 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20  objv[2], 0);.   
11970 20 72 63 20 3d 20 64 62 45 76 61 6c 53 74 65 70   rc = dbEvalStep
11980 28 26 73 45 76 61 6c 29 3b 0a 20 20 20 20 69 66  (&sEval);.    if
11990 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f 4f 4e 45  ( choice==DB_ONE
119a0 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20  COLUMN ){.      
119b0 69 66 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29  if( rc==TCL_OK )
119c0 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65  {.        Tcl_Se
119d0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
119e0 70 2c 20 64 62 45 76 61 6c 43 6f 6c 75 6d 6e 56  p, dbEvalColumnV
119f0 61 6c 75 65 28 26 73 45 76 61 6c 2c 20 30 29 29  alue(&sEval, 0))
11a00 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
11a10 28 20 72 63 3d 3d 54 43 4c 5f 42 52 45 41 4b 20  ( rc==TCL_BREAK 
11a20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 52  ){.        Tcl_R
11a30 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  esetResult(inter
11a40 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
11a50 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 54 43  }else if( rc==TC
11a60 4c 5f 42 52 45 41 4b 20 7c 7c 20 72 63 3d 3d 54  L_BREAK || rc==T
11a70 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54  CL_OK ){.      T
11a80 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
11a90 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42  interp, Tcl_NewB
11aa0 6f 6f 6c 65 61 6e 4f 62 6a 28 72 63 3d 3d 54 43  ooleanObj(rc==TC
11ab0 4c 5f 4f 4b 29 29 3b 0a 20 20 20 20 7d 0a 20 20  L_OK));.    }.  
11ac0 20 20 64 62 45 76 61 6c 46 69 6e 61 6c 69 7a 65    dbEvalFinalize
11ad0 28 26 73 45 76 61 6c 29 3b 0a 0a 20 20 20 20 69  (&sEval);..    i
11ae0 66 28 20 72 63 3d 3d 54 43 4c 5f 42 52 45 41 4b  f( rc==TCL_BREAK
11af0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 54   ){.      rc = T
11b00 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  CL_OK;.    }.   
11b10 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 20 0a   break;.  }.   .
11b20 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62    /*.  **    $db
11b30 20 65 76 61 6c 20 24 73 71 6c 20 3f 61 72 72 61   eval $sql ?arra
11b40 79 3f 20 3f 7b 20 20 2e 2e 2e 63 6f 64 65 2e 2e  y? ?{  ...code..
11b50 2e 20 7d 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  . }?.  **.  ** T
11b60 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
11b70 20 69 6e 20 24 73 71 6c 20 69 73 20 65 76 61 6c   in $sql is eval
11b80 75 61 74 65 64 2e 20 20 46 6f 72 20 65 61 63 68  uated.  For each
11b90 20 72 6f 77 2c 20 74 68 65 20 76 61 6c 75 65 73   row, the values
11ba0 20 61 72 65 0a 20 20 2a 2a 20 70 6c 61 63 65 64   are.  ** placed
11bb0 20 69 6e 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20   in elements of 
11bc0 74 68 65 20 61 72 72 61 79 20 6e 61 6d 65 64 20  the array named 
11bd0 22 61 72 72 61 79 22 20 61 6e 64 20 2e 2e 2e 63  "array" and ...c
11be0 6f 64 65 2e 2e 2e 20 69 73 20 65 78 65 63 75 74  ode... is execut
11bf0 65 64 2e 0a 20 20 2a 2a 20 49 66 20 22 61 72 72  ed..  ** If "arr
11c00 61 79 22 20 61 6e 64 20 22 63 6f 64 65 22 20 61  ay" and "code" a
11c10 72 65 20 6f 6d 69 74 74 65 64 2c 20 74 68 65 6e  re omitted, then
11c20 20 6e 6f 20 63 61 6c 6c 62 61 63 6b 20 69 73 20   no callback is 
11c30 65 76 65 72 79 20 69 6e 76 6f 6b 65 64 2e 0a 20  every invoked.. 
11c40 20 2a 2a 20 49 66 20 22 61 72 72 61 79 22 20 69   ** If "array" i
11c50 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  s an empty strin
11c60 67 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  g, then the valu
11c70 65 73 20 61 72 65 20 70 6c 61 63 65 64 20 69 6e  es are placed in
11c80 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20   variables.  ** 
11c90 74 68 61 74 20 68 61 76 65 20 74 68 65 20 73 61  that have the sa
11ca0 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 66  me name as the f
11cb0 69 65 6c 64 73 20 65 78 74 72 61 63 74 65 64 20  ields extracted 
11cc0 62 79 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20  by the query..  
11cd0 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 45 56 41  */.  case DB_EVA
11ce0 4c 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a  L: {.    if( obj
11cf0 63 3c 33 20 7c 7c 20 6f 62 6a 63 3e 35 20 29 7b  c<3 || objc>5 ){
11d00 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
11d10 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
11d20 32 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 20 3f 41  2, objv, "SQL ?A
11d30 52 52 41 59 2d 4e 41 4d 45 3f 20 3f 53 43 52 49  RRAY-NAME? ?SCRI
11d40 50 54 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74  PT?");.      ret
11d50 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
11d60 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 6f 62     }..    if( ob
11d70 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 44  jc==3 ){.      D
11d80 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 73 45 76  bEvalContext sEv
11d90 61 6c 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62  al;.      Tcl_Ob
11da0 6a 20 2a 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65  j *pRet = Tcl_Ne
11db0 77 4f 62 6a 28 29 3b 0a 20 20 20 20 20 20 54 63  wObj();.      Tc
11dc0 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
11dd0 52 65 74 29 3b 0a 20 20 20 20 20 20 64 62 45 76  Ret);.      dbEv
11de0 61 6c 49 6e 69 74 28 26 73 45 76 61 6c 2c 20 70  alInit(&sEval, p
11df0 44 62 2c 20 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b  Db, objv[2], 0);
11e00 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 54 43  .      while( TC
11e10 4c 5f 4f 4b 3d 3d 28 72 63 20 3d 20 64 62 45 76  L_OK==(rc = dbEv
11e20 61 6c 53 74 65 70 28 26 73 45 76 61 6c 29 29 20  alStep(&sEval)) 
11e30 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
11e40 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43  ;.        int nC
11e50 6f 6c 3b 0a 20 20 20 20 20 20 20 20 64 62 45 76  ol;.        dbEv
11e60 61 6c 52 6f 77 49 6e 66 6f 28 26 73 45 76 61 6c  alRowInfo(&sEval
11e70 2c 20 26 6e 43 6f 6c 2c 20 30 29 3b 0a 20 20 20  , &nCol, 0);.   
11e80 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
11e90 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
11ea0 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62        Tcl_ListOb
11eb0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
11ec0 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 64 62 45  nterp, pRet, dbE
11ed0 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65 28 26  valColumnValue(&
11ee0 73 45 76 61 6c 2c 20 69 29 29 3b 0a 20 20 20 20  sEval, i));.    
11ef0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
11f00 20 20 20 20 64 62 45 76 61 6c 46 69 6e 61 6c 69      dbEvalFinali
11f10 7a 65 28 26 73 45 76 61 6c 29 3b 0a 20 20 20 20  ze(&sEval);.    
11f20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 42 52    if( rc==TCL_BR
11f30 45 41 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 54  EAK ){.        T
11f40 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
11f50 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 20  interp, pRet);. 
11f60 20 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f         rc = TCL_
11f70 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
11f80 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
11f90 6e 74 28 70 52 65 74 29 3b 0a 20 20 20 20 7d 65  nt(pRet);.    }e
11fa0 6c 73 65 7b 0a 20 20 20 20 20 20 43 6c 69 65 6e  lse{.      Clien
11fb0 74 44 61 74 61 20 63 64 5b 32 5d 3b 0a 20 20 20  tData cd[2];.   
11fc0 20 20 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74     DbEvalContext
11fd0 20 2a 70 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f   *p;.      Tcl_O
11fe0 62 6a 20 2a 70 41 72 72 61 79 20 3d 20 30 3b 0a  bj *pArray = 0;.
11ff0 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70        Tcl_Obj *p
12000 53 63 72 69 70 74 3b 0a 0a 20 20 20 20 20 20 69  Script;..      i
12010 66 28 20 6f 62 6a 63 3d 3d 35 20 26 26 20 2a 28  f( objc==5 && *(
12020 63 68 61 72 20 2a 29 54 63 6c 5f 47 65 74 53 74  char *)Tcl_GetSt
12030 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 20 29 7b  ring(objv[3]) ){
12040 0a 20 20 20 20 20 20 20 20 70 41 72 72 61 79 20  .        pArray 
12050 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20 20 20  = objv[3];.     
12060 20 7d 0a 20 20 20 20 20 20 70 53 63 72 69 70 74   }.      pScript
12070 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 3b   = objv[objc-1];
12080 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  .      Tcl_IncrR
12090 65 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29  efCount(pScript)
120a0 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 70  ;.      .      p
120b0 20 3d 20 28 44 62 45 76 61 6c 43 6f 6e 74 65 78   = (DbEvalContex
120c0 74 20 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 73 69  t *)Tcl_Alloc(si
120d0 7a 65 6f 66 28 44 62 45 76 61 6c 43 6f 6e 74 65  zeof(DbEvalConte
120e0 78 74 29 29 3b 0a 20 20 20 20 20 20 64 62 45 76  xt));.      dbEv
120f0 61 6c 49 6e 69 74 28 70 2c 20 70 44 62 2c 20 6f  alInit(p, pDb, o
12100 62 6a 76 5b 32 5d 2c 20 70 41 72 72 61 79 29 3b  bjv[2], pArray);
12110 0a 0a 20 20 20 20 20 20 63 64 5b 30 5d 20 3d 20  ..      cd[0] = 
12120 28 76 6f 69 64 20 2a 29 70 3b 0a 20 20 20 20 20  (void *)p;.     
12130 20 63 64 5b 31 5d 20 3d 20 28 76 6f 69 64 20 2a   cd[1] = (void *
12140 29 70 53 63 72 69 70 74 3b 0a 20 20 20 20 20 20  )pScript;.      
12150 72 63 20 3d 20 44 62 45 76 61 6c 4e 65 78 74 43  rc = DbEvalNextC
12160 6d 64 28 63 64 2c 20 69 6e 74 65 72 70 2c 20 54  md(cd, interp, T
12170 43 4c 5f 4f 4b 29 3b 0a 20 20 20 20 7d 0a 20 20  CL_OK);.    }.  
12180 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
12190 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20  /*.  **     $db 
121a0 66 75 6e 63 74 69 6f 6e 20 4e 41 4d 45 20 5b 2d  function NAME [-
121b0 61 72 67 63 6f 75 6e 74 20 4e 5d 20 53 43 52 49  argcount N] SCRI
121c0 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 72 65  PT.  **.  ** Cre
121d0 61 74 65 20 61 20 6e 65 77 20 53 51 4c 20 66 75  ate a new SQL fu
121e0 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41  nction called NA
121f0 4d 45 2e 20 20 57 68 65 6e 65 76 65 72 20 74 68  ME.  Whenever th
12200 61 74 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 20  at function is. 
12210 20 2a 2a 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f   ** called, invo
12220 6b 65 20 53 43 52 49 50 54 20 74 6f 20 65 76 61  ke SCRIPT to eva
12230 6c 75 61 74 65 20 74 68 65 20 66 75 6e 63 74 69  luate the functi
12240 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  on..  */.  case 
12250 44 42 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  DB_FUNCTION: {. 
12260 20 20 20 53 71 6c 46 75 6e 63 20 2a 70 46 75 6e     SqlFunc *pFun
12270 63 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  c;.    Tcl_Obj *
12280 70 53 63 72 69 70 74 3b 0a 20 20 20 20 63 68 61  pScript;.    cha
12290 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 6e  r *zName;.    in
122a0 74 20 6e 41 72 67 20 3d 20 2d 31 3b 0a 20 20 20  t nArg = -1;.   
122b0 20 69 66 28 20 6f 62 6a 63 3d 3d 36 20 29 7b 0a   if( objc==6 ){.
122c0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
122d0 20 2a 7a 20 3d 20 54 63 6c 5f 47 65 74 53 74 72   *z = Tcl_GetStr
122e0 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20  ing(objv[3]);.  
122f0 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c      int n = strl
12300 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 20 20 69  en30(z);.      i
12310 66 28 20 6e 3e 32 20 26 26 20 73 74 72 6e 63 6d  f( n>2 && strncm
12320 70 28 7a 2c 20 22 2d 61 72 67 63 6f 75 6e 74 22  p(z, "-argcount"
12330 2c 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ,n)==0 ){.      
12340 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
12350 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
12360 6f 62 6a 76 5b 34 5d 2c 20 26 6e 41 72 67 29 20  objv[4], &nArg) 
12370 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
12380 4f 52 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  OR;.        if( 
12390 6e 41 72 67 3c 30 20 29 7b 0a 20 20 20 20 20 20  nArg<0 ){.      
123a0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
123b0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 75  sult(interp, "nu
123c0 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
123d0 73 20 6d 75 73 74 20 62 65 20 6e 6f 6e 2d 6e 65  s must be non-ne
123e0 67 61 74 69 76 65 22 2c 0a 20 20 20 20 20 20 20  gative",.       
123f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12400 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b 0a 20      (char*)0);. 
12410 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
12420 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
12430 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
12440 20 20 20 70 53 63 72 69 70 74 20 3d 20 6f 62 6a     pScript = obj
12450 76 5b 35 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 20  v[5];.    }else 
12460 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20  if( objc!=4 ){. 
12470 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
12480 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
12490 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 20 5b 2d 61   objv, "NAME [-a
124a0 72 67 63 6f 75 6e 74 20 4e 5d 20 53 43 52 49 50  rgcount N] SCRIP
124b0 54 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  T");.      retur
124c0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
124d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 53   }else{.      pS
124e0 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 33 5d 3b  cript = objv[3];
124f0 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65  .    }.    zName
12500 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
12510 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
12520 20 30 29 3b 0a 20 20 20 20 70 46 75 6e 63 20 3d   0);.    pFunc =
12530 20 66 69 6e 64 53 71 6c 46 75 6e 63 28 70 44 62   findSqlFunc(pDb
12540 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  , zName);.    if
12550 28 20 70 46 75 6e 63 3d 3d 30 20 29 20 72 65 74  ( pFunc==0 ) ret
12560 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
12570 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 70 53     if( pFunc->pS
12580 63 72 69 70 74 20 29 7b 0a 20 20 20 20 20 20 54  cript ){.      T
12590 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
125a0 70 46 75 6e 63 2d 3e 70 53 63 72 69 70 74 29 3b  pFunc->pScript);
125b0 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 75 6e 63  .    }.    pFunc
125c0 2d 3e 70 53 63 72 69 70 74 20 3d 20 70 53 63 72  ->pScript = pScr
125d0 69 70 74 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63  ipt;.    Tcl_Inc
125e0 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69 70  rRefCount(pScrip
125f0 74 29 3b 0a 20 20 20 20 70 46 75 6e 63 2d 3e 75  t);.    pFunc->u
12600 73 65 45 76 61 6c 4f 62 6a 76 20 3d 20 73 61 66  seEvalObjv = saf
12610 65 54 6f 55 73 65 45 76 61 6c 4f 62 6a 76 28 69  eToUseEvalObjv(i
12620 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74 29 3b  nterp, pScript);
12630 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
12640 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
12650 6e 28 70 44 62 2d 3e 64 62 2c 20 7a 4e 61 6d 65  n(pDb->db, zName
12660 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55  , nArg, SQLITE_U
12670 54 46 38 2c 0a 20 20 20 20 20 20 20 20 70 46 75  TF8,.        pFu
12680 6e 63 2c 20 74 63 6c 53 71 6c 46 75 6e 63 2c 20  nc, tclSqlFunc, 
12690 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  0, 0);.    if( r
126a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
126b0 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45        rc = TCL_E
126c0 52 52 4f 52 3b 0a 20 20 20 20 20 20 54 63 6c 5f  RROR;.      Tcl_
126d0 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
126e0 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  , (char *)sqlite
126f0 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62  3_errmsg(pDb->db
12700 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29  ), TCL_VOLATILE)
12710 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  ;.    }.    brea
12720 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
12730 2a 20 20 20 20 20 24 64 62 20 69 6e 63 72 62 6c  *     $db incrbl
12740 6f 62 20 3f 2d 72 65 61 64 6f 6e 6c 79 3f 20 3f  ob ?-readonly? ?
12750 44 42 3f 20 54 41 42 4c 45 20 43 4f 4c 55 4d 4e  DB? TABLE COLUMN
12760 20 52 4f 57 49 44 0a 20 20 2a 2f 0a 20 20 63 61   ROWID.  */.  ca
12770 73 65 20 44 42 5f 49 4e 43 52 42 4c 4f 42 3a 20  se DB_INCRBLOB: 
12780 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
12790 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20  OMIT_INCRBLOB.  
127a0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
127b0 6c 74 28 69 6e 74 65 72 70 2c 20 22 69 6e 63 72  lt(interp, "incr
127c0 62 6c 6f 62 20 6e 6f 74 20 61 76 61 69 6c 61 62  blob not availab
127d0 6c 65 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64  le in this build
127e0 22 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ", (char*)0);.  
127f0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
12800 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69 6e  OR;.#else.    in
12810 74 20 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20 30  t isReadonly = 0
12820 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
12830 20 2a 7a 44 62 20 3d 20 22 6d 61 69 6e 22 3b 0a   *zDb = "main";.
12840 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
12850 7a 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73  zTable;.    cons
12860 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 3b  t char *zColumn;
12870 0a 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74  .    Tcl_WideInt
12880 20 69 52 6f 77 3b 0a 0a 20 20 20 20 2f 2a 20 43   iRow;..    /* C
12890 68 65 63 6b 20 66 6f 72 20 74 68 65 20 2d 72 65  heck for the -re
128a0 61 64 6f 6e 6c 79 20 6f 70 74 69 6f 6e 20 2a 2f  adonly option */
128b0 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20  .    if( objc>3 
128c0 26 26 20 73 74 72 63 6d 70 28 54 63 6c 5f 47 65  && strcmp(Tcl_Ge
128d0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
128e0 2c 20 22 2d 72 65 61 64 6f 6e 6c 79 22 29 3d 3d  , "-readonly")==
128f0 30 20 29 7b 0a 20 20 20 20 20 20 69 73 52 65 61  0 ){.      isRea
12900 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 7d  donly = 1;.    }
12910 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ..    if( objc!=
12920 28 35 2b 69 73 52 65 61 64 6f 6e 6c 79 29 20 26  (5+isReadonly) &
12930 26 20 6f 62 6a 63 21 3d 28 36 2b 69 73 52 65 61  & objc!=(6+isRea
12940 64 6f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20  donly) ){.      
12950 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
12960 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
12970 2c 20 22 3f 2d 72 65 61 64 6f 6e 6c 79 3f 20 3f  , "?-readonly? ?
12980 44 42 3f 20 54 41 42 4c 45 20 43 4f 4c 55 4d 4e  DB? TABLE COLUMN
12990 20 52 4f 57 49 44 22 29 3b 0a 20 20 20 20 20 20   ROWID");.      
129a0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
129b0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
129c0 20 6f 62 6a 63 3d 3d 28 36 2b 69 73 52 65 61 64   objc==(6+isRead
129d0 6f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 7a  only) ){.      z
129e0 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  Db = Tcl_GetStri
129f0 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20  ng(objv[2]);.   
12a00 20 7d 0a 20 20 20 20 7a 54 61 62 6c 65 20 3d 20   }.    zTable = 
12a10 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
12a20 6a 76 5b 6f 62 6a 63 2d 33 5d 29 3b 0a 20 20 20  jv[objc-3]);.   
12a30 20 7a 43 6f 6c 75 6d 6e 20 3d 20 54 63 6c 5f 47   zColumn = Tcl_G
12a40 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 6f 62  etString(objv[ob
12a50 6a 63 2d 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d  jc-2]);.    rc =
12a60 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46   Tcl_GetWideIntF
12a70 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
12a80 62 6a 76 5b 6f 62 6a 63 2d 31 5d 2c 20 26 69 52  bjv[objc-1], &iR
12a90 6f 77 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63  ow);..    if( rc
12aa0 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20  ==TCL_OK ){.    
12ab0 20 20 72 63 20 3d 20 63 72 65 61 74 65 49 6e 63    rc = createInc
12ac0 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 28 0a 20 20  rblobChannel(.  
12ad0 20 20 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20          interp, 
12ae0 70 44 62 2c 20 7a 44 62 2c 20 7a 54 61 62 6c 65  pDb, zDb, zTable
12af0 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 28 73 71 6c 69  , zColumn, (sqli
12b00 74 65 33 5f 69 6e 74 36 34 29 69 52 6f 77 2c 20  te3_int64)iRow, 
12b10 69 73 52 65 61 64 6f 6e 6c 79 0a 20 20 20 20 20  isReadonly.     
12b20 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   );.    }.#endif
12b30 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
12b40 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24  .  /*.  **     $
12b50 64 62 20 69 6e 74 65 72 72 75 70 74 0a 20 20 2a  db interrupt.  *
12b60 2a 0a 20 20 2a 2a 20 49 6e 74 65 72 72 75 70 74  *.  ** Interrupt
12b70 20 74 68 65 20 65 78 65 63 75 74 69 6f 6e 20 6f   the execution o
12b80 66 20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74  f the inner-most
12b90 20 53 51 4c 20 69 6e 74 65 72 70 72 65 74 65 72   SQL interpreter
12ba0 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 63 61 75  .  This.  ** cau
12bb0 73 65 73 20 74 68 65 20 53 51 4c 20 73 74 61 74  ses the SQL stat
12bc0 65 6d 65 6e 74 20 74 6f 20 72 65 74 75 72 6e 20  ement to return 
12bd0 61 6e 20 65 72 72 6f 72 20 6f 66 20 53 51 4c 49  an error of SQLI
12be0 54 45 5f 49 4e 54 45 52 52 55 50 54 2e 0a 20 20  TE_INTERRUPT..  
12bf0 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 49 4e 54  */.  case DB_INT
12c00 45 52 52 55 50 54 3a 20 7b 0a 20 20 20 20 73 71  ERRUPT: {.    sq
12c10 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28  lite3_interrupt(
12c20 70 44 62 2d 3e 64 62 29 3b 0a 20 20 20 20 62 72  pDb->db);.    br
12c30 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
12c40 20 2a 2a 20 20 20 20 20 24 64 62 20 6e 75 6c 6c   **     $db null
12c50 76 61 6c 75 65 20 3f 53 54 52 49 4e 47 3f 0a 20  value ?STRING?. 
12c60 20 2a 2a 0a 20 20 2a 2a 20 43 68 61 6e 67 65 20   **.  ** Change 
12c70 74 65 78 74 20 75 73 65 64 20 77 68 65 6e 20 61  text used when a
12c80 20 4e 55 4c 4c 20 63 6f 6d 65 73 20 62 61 63 6b   NULL comes back
12c90 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
12ca0 73 65 2e 20 49 66 20 3f 53 54 52 49 4e 47 3f 0a  se. If ?STRING?.
12cb0 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 72 65 73    ** is not pres
12cc0 65 6e 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75  ent, then the cu
12cd0 72 72 65 6e 74 20 73 74 72 69 6e 67 20 75 73 65  rrent string use
12ce0 64 20 66 6f 72 20 4e 55 4c 4c 20 69 73 20 72 65  d for NULL is re
12cf0 74 75 72 6e 65 64 2e 0a 20 20 2a 2a 20 49 66 20  turned..  ** If 
12d00 53 54 52 49 4e 47 20 69 73 20 70 72 65 73 65 6e  STRING is presen
12d10 74 2c 20 74 68 65 6e 20 53 54 52 49 4e 47 20 69  t, then STRING i
12d20 73 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2a  s returned..  **
12d30 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
12d40 4e 55 4c 4c 56 41 4c 55 45 3a 20 7b 0a 20 20 20  NULLVALUE: {.   
12d50 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 26 26 20   if( objc!=2 && 
12d60 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20  objc!=3 ){.     
12d70 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
12d80 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
12d90 76 2c 20 22 4e 55 4c 4c 56 41 4c 55 45 22 29 3b  v, "NULLVALUE");
12da0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
12db0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
12dc0 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29     if( objc==3 )
12dd0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b  {.      int len;
12de0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 75  .      char *zNu
12df0 6c 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  ll = Tcl_GetStri
12e00 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
12e10 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20  ], &len);.      
12e20 69 66 28 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 29  if( pDb->zNull )
12e30 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72  {.        Tcl_Fr
12e40 65 65 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29 3b 0a  ee(pDb->zNull);.
12e50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
12e60 28 20 7a 4e 75 6c 6c 20 26 26 20 6c 65 6e 3e 30  ( zNull && len>0
12e70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
12e80 3e 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f 41 6c 6c  >zNull = Tcl_All
12e90 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20  oc( len + 1 );. 
12ea0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44         memcpy(pD
12eb0 62 2d 3e 7a 4e 75 6c 6c 2c 20 7a 4e 75 6c 6c 2c  b->zNull, zNull,
12ec0 20 6c 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 70   len);.        p
12ed0 44 62 2d 3e 7a 4e 75 6c 6c 5b 6c 65 6e 5d 20 3d  Db->zNull[len] =
12ee0 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 7d 65 6c   '\0';.      }el
12ef0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d  se{.        pDb-
12f00 3e 7a 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  >zNull = 0;.    
12f10 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 54 63    }.    }.    Tc
12f20 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
12f30 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74  nterp, Tcl_NewSt
12f40 72 69 6e 67 4f 62 6a 28 70 44 62 2d 3e 7a 4e 75  ringObj(pDb->zNu
12f50 6c 6c 2c 20 2d 31 29 29 3b 0a 20 20 20 20 62 72  ll, -1));.    br
12f60 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
12f70 20 2a 2a 20 20 20 20 20 24 64 62 20 6c 61 73 74   **     $db last
12f80 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 20 0a 20  _insert_rowid . 
12f90 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20   **.  ** Return 
12fa0 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
12fb0 20 69 73 20 74 68 65 20 52 4f 57 49 44 20 66 6f   is the ROWID fo
12fc0 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  r the most recen
12fd0 74 20 69 6e 73 65 72 74 2e 0a 20 20 2a 2f 0a 20  t insert..  */. 
12fe0 20 63 61 73 65 20 44 42 5f 4c 41 53 54 5f 49 4e   case DB_LAST_IN
12ff0 53 45 52 54 5f 52 4f 57 49 44 3a 20 7b 0a 20 20  SERT_ROWID: {.  
13000 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75    Tcl_Obj *pResu
13010 6c 74 3b 0a 20 20 20 20 54 63 6c 5f 57 69 64 65  lt;.    Tcl_Wide
13020 49 6e 74 20 72 6f 77 69 64 3b 0a 20 20 20 20 69  Int rowid;.    i
13030 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
13040 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
13050 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
13060 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 20  objv, "");.     
13070 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
13080 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 6f 77  R;.    }.    row
13090 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 6c 61 73  id = sqlite3_las
130a0 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 70  t_insert_rowid(p
130b0 44 62 2d 3e 64 62 29 3b 0a 20 20 20 20 70 52 65  Db->db);.    pRe
130c0 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62  sult = Tcl_GetOb
130d0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  jResult(interp);
130e0 0a 20 20 20 20 54 63 6c 5f 53 65 74 57 69 64 65  .    Tcl_SetWide
130f0 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20  IntObj(pResult, 
13100 72 6f 77 69 64 29 3b 0a 20 20 20 20 62 72 65 61  rowid);.    brea
13110 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
13120 2a 20 54 68 65 20 44 42 5f 4f 4e 45 43 4f 4c 55  * The DB_ONECOLU
13130 4d 4e 20 6d 65 74 68 6f 64 20 69 73 20 69 6d 70  MN method is imp
13140 6c 65 6d 65 6e 74 65 64 20 74 6f 67 65 74 68 65  lemented togethe
13150 72 20 77 69 74 68 20 44 42 5f 45 58 49 53 54 53  r with DB_EXISTS
13160 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 20 20 20  ..  */..  /*    
13170 24 64 62 20 70 72 6f 67 72 65 73 73 20 3f 4e 20  $db progress ?N 
13180 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 20 0a  CALLBACK?.  ** .
13190 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20    ** Invoke the 
131a0 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 65  given callback e
131b0 76 65 72 79 20 4e 20 76 69 72 74 75 61 6c 20 6d  very N virtual m
131c0 61 63 68 69 6e 65 20 6f 70 63 6f 64 65 73 20 77  achine opcodes w
131d0 68 69 6c 65 20 65 78 65 63 75 74 69 6e 67 0a 20  hile executing. 
131e0 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20 20 2a   ** queries..  *
131f0 2f 0a 20 20 63 61 73 65 20 44 42 5f 50 52 4f 47  /.  case DB_PROG
13200 52 45 53 53 3a 20 7b 0a 20 20 20 20 69 66 28 20  RESS: {.    if( 
13210 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20  objc==2 ){.     
13220 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72   if( pDb->zProgr
13230 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20 54  ess ){.        T
13240 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
13250 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 50 72  interp, pDb->zPr
13260 6f 67 72 65 73 73 2c 20 28 63 68 61 72 2a 29 30  ogress, (char*)0
13270 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
13280 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 34  else if( objc==4
13290 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
132a0 7a 50 72 6f 67 72 65 73 73 3b 0a 20 20 20 20 20  zProgress;.     
132b0 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20   int len;.      
132c0 69 6e 74 20 4e 3b 0a 20 20 20 20 20 20 69 66 28  int N;.      if(
132d0 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74   TCL_OK!=Tcl_Get
132e0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
132f0 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 4e 29 20  p, objv[2], &N) 
13300 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
13310 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
13320 20 20 20 7d 3b 0a 20 20 20 20 20 20 69 66 28 20     };.      if( 
13330 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29  pDb->zProgress )
13340 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72  {.        Tcl_Fr
13350 65 65 28 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73  ee(pDb->zProgres
13360 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  s);.      }.    
13370 20 20 7a 50 72 6f 67 72 65 73 73 20 3d 20 54 63    zProgress = Tc
13380 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
13390 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6c 65 6e  bj(objv[3], &len
133a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 72  );.      if( zPr
133b0 6f 67 72 65 73 73 20 26 26 20 6c 65 6e 3e 30 20  ogress && len>0 
133c0 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
133d0 7a 50 72 6f 67 72 65 73 73 20 3d 20 54 63 6c 5f  zProgress = Tcl_
133e0 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29  Alloc( len + 1 )
133f0 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
13400 28 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 2c  (pDb->zProgress,
13410 20 7a 50 72 6f 67 72 65 73 73 2c 20 6c 65 6e 2b   zProgress, len+
13420 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
13430 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 50  .        pDb->zP
13440 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20  rogress = 0;.   
13450 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
13460 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53  ITE_OMIT_PROGRES
13470 53 5f 43 41 4c 4c 42 41 43 4b 0a 20 20 20 20 20  S_CALLBACK.     
13480 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72   if( pDb->zProgr
13490 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ess ){.        p
134a0 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74  Db->interp = int
134b0 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  erp;.        sql
134c0 69 74 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61  ite3_progress_ha
134d0 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20 4e  ndler(pDb->db, N
134e0 2c 20 44 62 50 72 6f 67 72 65 73 73 48 61 6e 64  , DbProgressHand
134f0 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20  ler, pDb);.     
13500 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
13510 73 71 6c 69 74 65 33 5f 70 72 6f 67 72 65 73 73  sqlite3_progress
13520 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62  _handler(pDb->db
13530 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
13540 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
13550 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f  else{.      Tcl_
13560 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
13570 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e  erp, 2, objv, "N
13580 20 43 41 4c 4c 42 41 43 4b 22 29 3b 0a 20 20 20   CALLBACK");.   
13590 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
135a0 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  ROR;.    }.    b
135b0 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  reak;.  }..  /* 
135c0 20 20 20 24 64 62 20 70 72 6f 66 69 6c 65 20 3f     $db profile ?
135d0 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20  CALLBACK?.  **. 
135e0 20 2a 2a 20 4d 61 6b 65 20 61 72 72 61 6e 67 65   ** Make arrange
135f0 6d 65 6e 74 73 20 74 6f 20 69 6e 76 6f 6b 65 20  ments to invoke 
13600 74 68 65 20 43 41 4c 4c 42 41 43 4b 20 72 6f 75  the CALLBACK rou
13610 74 69 6e 65 20 61 66 74 65 72 20 65 61 63 68 20  tine after each 
13620 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  SQL statement.  
13630 2a 2a 20 74 68 61 74 20 68 61 73 20 72 75 6e 2e  ** that has run.
13640 20 20 54 68 65 20 74 65 78 74 20 6f 66 20 74 68    The text of th
13650 65 20 53 51 4c 20 61 6e 64 20 74 68 65 20 61 6d  e SQL and the am
13660 6f 75 6e 74 20 6f 66 20 65 6c 61 70 73 65 20 74  ount of elapse t
13670 69 6d 65 20 61 72 65 0a 20 20 2a 2a 20 61 70 70  ime are.  ** app
13680 65 6e 64 65 64 20 74 6f 20 43 41 4c 4c 42 41 43  ended to CALLBAC
13690 4b 20 62 65 66 6f 72 65 20 74 68 65 20 73 63 72  K before the scr
136a0 69 70 74 20 69 73 20 72 75 6e 2e 0a 20 20 2a 2f  ipt is run..  */
136b0 0a 20 20 63 61 73 65 20 44 42 5f 50 52 4f 46 49  .  case DB_PROFI
136c0 4c 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62  LE: {.    if( ob
136d0 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63  jc>3 ){.      Tc
136e0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
136f0 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
13700 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20  "?CALLBACK?");. 
13710 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
13720 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65  ERROR;.    }else
13730 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a   if( objc==2 ){.
13740 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
13750 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20 20  Profile ){.     
13760 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
13770 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d  ult(interp, pDb-
13780 3e 7a 50 72 6f 66 69 6c 65 2c 20 28 63 68 61 72  >zProfile, (char
13790 2a 29 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  *)0);.      }.  
137a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
137b0 68 61 72 20 2a 7a 50 72 6f 66 69 6c 65 3b 0a 20  har *zProfile;. 
137c0 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20       int len;.  
137d0 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72      if( pDb->zPr
137e0 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  ofile ){.       
137f0 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
13800 50 72 6f 66 69 6c 65 29 3b 0a 20 20 20 20 20 20  Profile);.      
13810 7d 0a 20 20 20 20 20 20 7a 50 72 6f 66 69 6c 65  }.      zProfile
13820 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
13830 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
13840 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66   &len);.      if
13850 28 20 7a 50 72 6f 66 69 6c 65 20 26 26 20 6c 65  ( zProfile && le
13860 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  n>0 ){.        p
13870 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 3d 20 54  Db->zProfile = T
13880 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20  cl_Alloc( len + 
13890 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  1 );.        mem
138a0 63 70 79 28 70 44 62 2d 3e 7a 50 72 6f 66 69 6c  cpy(pDb->zProfil
138b0 65 2c 20 7a 50 72 6f 66 69 6c 65 2c 20 6c 65 6e  e, zProfile, len
138c0 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  +1);.      }else
138d0 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
138e0 50 72 6f 66 69 6c 65 20 3d 20 30 3b 0a 20 20 20  Profile = 0;.   
138f0 20 20 20 7d 0a 23 69 66 20 21 64 65 66 69 6e 65     }.#if !define
13900 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
13910 41 43 45 29 20 26 26 20 21 64 65 66 69 6e 65 64  ACE) && !defined
13920 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f  (SQLITE_OMIT_FLO
13930 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20  ATING_POINT).   
13940 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f     if( pDb->zPro
13950 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  file ){.        
13960 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e  pDb->interp = in
13970 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71  terp;.        sq
13980 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65 28 70 44  lite3_profile(pD
13990 62 2d 3e 64 62 2c 20 44 62 50 72 6f 66 69 6c 65  b->db, DbProfile
139a0 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20  Handler, pDb);. 
139b0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
139c0 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 66      sqlite3_prof
139d0 69 6c 65 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20  ile(pDb->db, 0, 
139e0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  0);.      }.#end
139f0 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65  if.    }.    bre
13a00 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
13a10 2a 2a 20 20 20 20 20 24 64 62 20 72 65 6b 65 79  **     $db rekey
13a20 20 4b 45 59 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43   KEY.  **.  ** C
13a30 68 61 6e 67 65 20 74 68 65 20 65 6e 63 72 79 70  hange the encryp
13a40 74 69 6f 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20  tion key on the 
13a50 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20 64  currently open d
13a60 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  atabase..  */.  
13a70 63 61 73 65 20 44 42 5f 52 45 4b 45 59 3a 20 7b  case DB_REKEY: {
13a80 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
13a90 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 69 6e 74  AS_CODEC.    int
13aa0 20 6e 4b 65 79 3b 0a 20 20 20 20 76 6f 69 64 20   nKey;.    void 
13ab0 2a 70 4b 65 79 3b 0a 23 65 6e 64 69 66 0a 20 20  *pKey;.#endif.  
13ac0 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
13ad0 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
13ae0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
13af0 32 2c 20 6f 62 6a 76 2c 20 22 4b 45 59 22 29 3b  2, objv, "KEY");
13b00 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
13b10 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23  L_ERROR;.    }.#
13b20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
13b30 5f 43 4f 44 45 43 0a 20 20 20 20 70 4b 65 79 20  _CODEC.    pKey 
13b40 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72  = Tcl_GetByteArr
13b50 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ayFromObj(objv[2
13b60 5d 2c 20 26 6e 4b 65 79 29 3b 0a 20 20 20 20 72  ], &nKey);.    r
13b70 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 6b 65  c = sqlite3_reke
13b80 79 28 70 44 62 2d 3e 64 62 2c 20 70 4b 65 79 2c  y(pDb->db, pKey,
13b90 20 6e 4b 65 79 29 3b 0a 20 20 20 20 69 66 28 20   nKey);.    if( 
13ba0 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  rc ){.      Tcl_
13bb0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
13bc0 65 72 70 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  erp, sqlite3_err
13bd0 73 74 72 28 72 63 29 2c 20 28 63 68 61 72 2a 29  str(rc), (char*)
13be0 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54  0);.      rc = T
13bf0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
13c00 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b  #endif.    break
13c10 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24  ;.  }..  /*    $
13c20 64 62 20 72 65 73 74 6f 72 65 20 3f 44 41 54 41  db restore ?DATA
13c30 42 41 53 45 3f 20 46 49 4c 45 4e 41 4d 45 0a 20  BASE? FILENAME. 
13c40 20 2a 2a 0a 20 20 2a 2a 20 4f 70 65 6e 20 61 20   **.  ** Open a 
13c50 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61  database file na
13c60 6d 65 64 20 46 49 4c 45 4e 41 4d 45 2e 20 20 54  med FILENAME.  T
13c70 72 61 6e 73 66 65 72 20 74 68 65 20 63 6f 6e 74  ransfer the cont
13c80 65 6e 74 20 0a 20 20 2a 2a 20 6f 66 20 46 49 4c  ent .  ** of FIL
13c90 45 4e 41 4d 45 20 69 6e 74 6f 20 74 68 65 20 6c  ENAME into the l
13ca0 6f 63 61 6c 20 64 61 74 61 62 61 73 65 20 44 41  ocal database DA
13cb0 54 41 42 41 53 45 20 28 64 65 66 61 75 6c 74 3a  TABASE (default:
13cc0 20 22 6d 61 69 6e 22 29 2e 0a 20 20 2a 2f 0a 20   "main")..  */. 
13cd0 20 63 61 73 65 20 44 42 5f 52 45 53 54 4f 52 45   case DB_RESTORE
13ce0 3a 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  : {.    const ch
13cf0 61 72 20 2a 7a 53 72 63 46 69 6c 65 3b 0a 20 20  ar *zSrcFile;.  
13d00 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
13d10 65 73 74 44 62 3b 0a 20 20 20 20 73 71 6c 69 74  estDb;.    sqlit
13d20 65 33 20 2a 70 53 72 63 3b 0a 20 20 20 20 73 71  e3 *pSrc;.    sq
13d30 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42  lite3_backup *pB
13d40 61 63 6b 75 70 3b 0a 20 20 20 20 69 6e 74 20 6e  ackup;.    int n
13d50 54 69 6d 65 6f 75 74 20 3d 20 30 3b 0a 0a 20 20  Timeout = 0;..  
13d60 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b    if( objc==3 ){
13d70 0a 20 20 20 20 20 20 7a 44 65 73 74 44 62 20 3d  .      zDestDb =
13d80 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 20 20 7a   "main";.      z
13d90 53 72 63 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65  SrcFile = Tcl_Ge
13da0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
13db0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
13dc0 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20  objc==4 ){.     
13dd0 20 7a 44 65 73 74 44 62 20 3d 20 54 63 6c 5f 47   zDestDb = Tcl_G
13de0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
13df0 29 3b 0a 20 20 20 20 20 20 7a 53 72 63 46 69 6c  );.      zSrcFil
13e00 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
13e10 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 20 20  g(objv[3]);.    
13e20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c  }else{.      Tcl
13e30 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
13e40 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
13e50 3f 44 41 54 41 42 41 53 45 3f 20 46 49 4c 45 4e  ?DATABASE? FILEN
13e60 41 4d 45 22 29 3b 0a 20 20 20 20 20 20 72 65 74  AME");.      ret
13e70 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
13e80 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
13e90 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 7a 53  lite3_open_v2(zS
13ea0 72 63 46 69 6c 65 2c 20 26 70 53 72 63 2c 20 53  rcFile, &pSrc, S
13eb0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
13ec0 4e 4c 59 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  NLY, 0);.    if(
13ed0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
13ee0 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
13ef0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
13f00 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 73 6f   "cannot open so
13f10 75 72 63 65 20 64 61 74 61 62 61 73 65 3a 20 22  urce database: "
13f20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  ,.           sql
13f30 69 74 65 33 5f 65 72 72 6d 73 67 28 70 53 72 63  ite3_errmsg(pSrc
13f40 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ), (char*)0);.  
13f50 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
13f60 65 28 70 53 72 63 29 3b 0a 20 20 20 20 20 20 72  e(pSrc);.      r
13f70 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
13f80 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 61 63 6b  .    }.    pBack
13f90 75 70 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63  up = sqlite3_bac
13fa0 6b 75 70 5f 69 6e 69 74 28 70 44 62 2d 3e 64 62  kup_init(pDb->db
13fb0 2c 20 7a 44 65 73 74 44 62 2c 20 70 53 72 63 2c  , zDestDb, pSrc,
13fc0 20 22 6d 61 69 6e 22 29 3b 0a 20 20 20 20 69 66   "main");.    if
13fd0 28 20 70 42 61 63 6b 75 70 3d 3d 30 20 29 7b 0a  ( pBackup==0 ){.
13fe0 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
13ff0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
14000 72 65 73 74 6f 72 65 20 66 61 69 6c 65 64 3a 20  restore failed: 
14010 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71  ",.           sq
14020 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62  lite3_errmsg(pDb
14030 2d 3e 64 62 29 2c 20 28 63 68 61 72 2a 29 30 29  ->db), (char*)0)
14040 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
14050 63 6c 6f 73 65 28 70 53 72 63 29 3b 0a 20 20 20  close(pSrc);.   
14060 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
14070 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77  ROR;.    }.    w
14080 68 69 6c 65 28 20 28 72 63 20 3d 20 73 71 6c 69  hile( (rc = sqli
14090 74 65 33 5f 62 61 63 6b 75 70 5f 73 74 65 70 28  te3_backup_step(
140a0 70 42 61 63 6b 75 70 2c 31 30 30 29 29 3d 3d 53  pBackup,100))==S
140b0 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20  QLITE_OK.       
140c0 20 20 20 20 20 20 20 7c 7c 20 72 63 3d 3d 53 51         || rc==SQ
140d0 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
140e0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
140f0 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20  E_BUSY ){.      
14100 20 20 69 66 28 20 6e 54 69 6d 65 6f 75 74 2b 2b    if( nTimeout++
14110 20 3e 3d 20 33 20 29 20 62 72 65 61 6b 3b 0a 20   >= 3 ) break;. 
14120 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
14130 6c 65 65 70 28 31 30 30 29 3b 0a 20 20 20 20 20  leep(100);.     
14140 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
14150 69 74 65 33 5f 62 61 63 6b 75 70 5f 66 69 6e 69  ite3_backup_fini
14160 73 68 28 70 42 61 63 6b 75 70 29 3b 0a 20 20 20  sh(pBackup);.   
14170 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
14180 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 72 63  DONE ){.      rc
14190 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d   = TCL_OK;.    }
141a0 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
141b0 49 54 45 5f 42 55 53 59 20 7c 7c 20 72 63 3d 3d  ITE_BUSY || rc==
141c0 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 29 7b  SQLITE_LOCKED ){
141d0 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
141e0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
141f0 22 72 65 73 74 6f 72 65 20 66 61 69 6c 65 64 3a  "restore failed:
14200 20 73 6f 75 72 63 65 20 64 61 74 61 62 61 73 65   source database
14210 20 62 75 73 79 22 2c 0a 20 20 20 20 20 20 20 20   busy",.        
14220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
14230 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
14240 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  rc = TCL_ERROR;.
14250 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14260 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
14270 74 28 69 6e 74 65 72 70 2c 20 22 72 65 73 74 6f  t(interp, "resto
14280 72 65 20 66 61 69 6c 65 64 3a 20 22 2c 0a 20 20  re failed: ",.  
14290 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
142a0 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29  _errmsg(pDb->db)
142b0 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
142c0 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f     rc = TCL_ERRO
142d0 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  R;.    }.    sql
142e0 69 74 65 33 5f 63 6c 6f 73 65 28 70 53 72 63 29  ite3_close(pSrc)
142f0 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
14300 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20  ..  /*.  **     
14310 24 64 62 20 73 74 61 74 75 73 20 28 73 74 65 70  $db status (step
14320 7c 73 6f 72 74 7c 61 75 74 6f 69 6e 64 65 78 29  |sort|autoindex)
14330 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 69 73 70 6c  .  **.  ** Displ
14340 61 79 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54  ay SQLITE_STMTST
14350 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54  ATUS_FULLSCAN_ST
14360 45 50 20 6f 72 20 0a 20 20 2a 2a 20 53 51 4c 49  EP or .  ** SQLI
14370 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 53 4f  TE_STMTSTATUS_SO
14380 52 54 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20  RT for the most 
14390 72 65 63 65 6e 74 20 65 76 61 6c 2e 0a 20 20 2a  recent eval..  *
143a0 2f 0a 20 20 63 61 73 65 20 44 42 5f 53 54 41 54  /.  case DB_STAT
143b0 55 53 3a 20 7b 0a 20 20 20 20 69 6e 74 20 76 3b  US: {.    int v;
143c0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
143d0 2a 7a 4f 70 3b 0a 20 20 20 20 69 66 28 20 6f 62  *zOp;.    if( ob
143e0 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54  jc!=3 ){.      T
143f0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
14400 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
14410 20 22 28 73 74 65 70 7c 73 6f 72 74 7c 61 75 74   "(step|sort|aut
14420 6f 69 6e 64 65 78 29 22 29 3b 0a 20 20 20 20 20  oindex)");.     
14430 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
14440 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4f 70  R;.    }.    zOp
14450 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
14460 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 69  (objv[2]);.    i
14470 66 28 20 73 74 72 63 6d 70 28 7a 4f 70 2c 20 22  f( strcmp(zOp, "
14480 73 74 65 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20  step")==0 ){.   
14490 20 20 20 76 20 3d 20 70 44 62 2d 3e 6e 53 74 65     v = pDb->nSte
144a0 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  p;.    }else if(
144b0 20 73 74 72 63 6d 70 28 7a 4f 70 2c 20 22 73 6f   strcmp(zOp, "so
144c0 72 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rt")==0 ){.     
144d0 20 76 20 3d 20 70 44 62 2d 3e 6e 53 6f 72 74 3b   v = pDb->nSort;
144e0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
144f0 74 72 63 6d 70 28 7a 4f 70 2c 20 22 61 75 74 6f  trcmp(zOp, "auto
14500 69 6e 64 65 78 22 29 3d 3d 30 20 29 7b 0a 20 20  index")==0 ){.  
14510 20 20 20 20 76 20 3d 20 70 44 62 2d 3e 6e 49 6e      v = pDb->nIn
14520 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  dex;.    }else{.
14530 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
14540 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 0a  Result(interp, .
14550 20 20 20 20 20 20 20 20 20 20 20 20 22 62 61 64              "bad
14560 20 61 72 67 75 6d 65 6e 74 3a 20 73 68 6f 75 6c   argument: shoul
14570 64 20 62 65 20 61 75 74 6f 69 6e 64 65 78 2c 20  d be autoindex, 
14580 73 74 65 70 2c 20 6f 72 20 73 6f 72 74 22 2c 20  step, or sort", 
14590 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68  .            (ch
145a0 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 65  ar*)0);.      re
145b0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
145c0 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 53 65      }.    Tcl_Se
145d0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
145e0 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
145f0 28 76 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  (v));.    break;
14600 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a  .  }.  .  /*.  *
14610 2a 20 20 20 20 20 24 64 62 20 74 69 6d 65 6f 75  *     $db timeou
14620 74 20 4d 49 4c 4c 45 53 45 43 4f 4e 44 53 0a 20  t MILLESECONDS. 
14630 20 2a 2a 0a 20 20 2a 2a 20 44 65 6c 61 79 20 66   **.  ** Delay f
14640 6f 72 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  or the number of
14650 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 70   milliseconds sp
14660 65 63 69 66 69 65 64 20 77 68 65 6e 20 61 20 66  ecified when a f
14670 69 6c 65 20 69 73 20 6c 6f 63 6b 65 64 2e 0a 20  ile is locked.. 
14680 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 54 49   */.  case DB_TI
14690 4d 45 4f 55 54 3a 20 7b 0a 20 20 20 20 69 6e 74  MEOUT: {.    int
146a0 20 6d 73 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a   ms;.    if( obj
146b0 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=3 ){.      Tc
146c0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
146d0 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
146e0 22 4d 49 4c 4c 49 53 45 43 4f 4e 44 53 22 29 3b  "MILLISECONDS");
146f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
14700 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
14710 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e     if( Tcl_GetIn
14720 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
14730 20 6f 62 6a 76 5b 32 5d 2c 20 26 6d 73 29 20 29   objv[2], &ms) )
14740 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
14750 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  R;.    sqlite3_b
14760 75 73 79 5f 74 69 6d 65 6f 75 74 28 70 44 62 2d  usy_timeout(pDb-
14770 3e 64 62 2c 20 6d 73 29 3b 0a 20 20 20 20 62 72  >db, ms);.    br
14780 65 61 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  eak;.  }.  .  /*
14790 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 74 6f  .  **     $db to
147a0 74 61 6c 5f 63 68 61 6e 67 65 73 0a 20 20 2a 2a  tal_changes.  **
147b0 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  .  ** Return the
147c0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
147d0 74 68 61 74 20 77 65 72 65 20 6d 6f 64 69 66 69  that were modifi
147e0 65 64 2c 20 69 6e 73 65 72 74 65 64 2c 20 6f 72  ed, inserted, or
147f0 20 64 65 6c 65 74 65 64 20 0a 20 20 2a 2a 20 73   deleted .  ** s
14800 69 6e 63 65 20 74 68 65 20 64 61 74 61 62 61 73  ince the databas
14810 65 20 68 61 6e 64 6c 65 20 77 61 73 20 63 72 65  e handle was cre
14820 61 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  ated..  */.  cas
14830 65 20 44 42 5f 54 4f 54 41 4c 5f 43 48 41 4e 47  e DB_TOTAL_CHANG
14840 45 53 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62  ES: {.    Tcl_Ob
14850 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20 20  j *pResult;.    
14860 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
14870 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
14880 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
14890 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20   objv, "");.    
148a0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
148b0 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 52  OR;.    }.    pR
148c0 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f  esult = Tcl_GetO
148d0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  bjResult(interp)
148e0 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 49 6e 74  ;.    Tcl_SetInt
148f0 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 73 71 6c  Obj(pResult, sql
14900 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67  ite3_total_chang
14910 65 73 28 70 44 62 2d 3e 64 62 29 29 3b 0a 20 20  es(pDb->db));.  
14920 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
14930 2f 2a 20 20 20 20 24 64 62 20 74 72 61 63 65 20  /*    $db trace 
14940 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a  ?CALLBACK?.  **.
14950 20 20 2a 2a 20 4d 61 6b 65 20 61 72 72 61 6e 67    ** Make arrang
14960 65 6d 65 6e 74 73 20 74 6f 20 69 6e 76 6f 6b 65  ements to invoke
14970 20 74 68 65 20 43 41 4c 4c 42 41 43 4b 20 72 6f   the CALLBACK ro
14980 75 74 69 6e 65 20 66 6f 72 20 65 61 63 68 20 53  utine for each S
14990 51 4c 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a  QL statement.  *
149a0 2a 20 74 68 61 74 20 69 73 20 65 78 65 63 75 74  * that is execut
149b0 65 64 2e 20 20 54 68 65 20 74 65 78 74 20 6f 66  ed.  The text of
149c0 20 74 68 65 20 53 51 4c 20 69 73 20 61 70 70 65   the SQL is appe
149d0 6e 64 65 64 20 74 6f 20 43 41 4c 4c 42 41 43 4b  nded to CALLBACK
149e0 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 69 74 20   before.  ** it 
149f0 69 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20 2a  is executed..  *
14a00 2f 0a 20 20 63 61 73 65 20 44 42 5f 54 52 41 43  /.  case DB_TRAC
14a10 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a  E: {.    if( obj
14a20 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  c>3 ){.      Tcl
14a30 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
14a40 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
14a50 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20  ?CALLBACK?");.  
14a60 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
14a70 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20  RROR;.    }else 
14a80 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20  if( objc==2 ){. 
14a90 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 54       if( pDb->zT
14aa0 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  race ){.        
14ab0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
14ac0 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 54  (interp, pDb->zT
14ad0 72 61 63 65 2c 20 28 63 68 61 72 2a 29 30 29 3b  race, (char*)0);
14ae0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
14af0 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  se{.      char *
14b00 7a 54 72 61 63 65 3b 0a 20 20 20 20 20 20 69 6e  zTrace;.      in
14b10 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28  t len;.      if(
14b20 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a   pDb->zTrace ){.
14b30 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65          Tcl_Free
14b40 28 70 44 62 2d 3e 7a 54 72 61 63 65 29 3b 0a 20  (pDb->zTrace);. 
14b50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54 72       }.      zTr
14b60 61 63 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ace = Tcl_GetStr
14b70 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
14b80 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20  2], &len);.     
14b90 20 69 66 28 20 7a 54 72 61 63 65 20 26 26 20 6c   if( zTrace && l
14ba0 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  en>0 ){.        
14bb0 70 44 62 2d 3e 7a 54 72 61 63 65 20 3d 20 54 63  pDb->zTrace = Tc
14bc0 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31  l_Alloc( len + 1
14bd0 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   );.        memc
14be0 70 79 28 70 44 62 2d 3e 7a 54 72 61 63 65 2c 20  py(pDb->zTrace, 
14bf0 7a 54 72 61 63 65 2c 20 6c 65 6e 2b 31 29 3b 0a  zTrace, len+1);.
14c00 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14c10 20 20 20 20 20 70 44 62 2d 3e 7a 54 72 61 63 65       pDb->zTrace
14c20 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69   = 0;.      }.#i
14c30 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
14c40 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26  E_OMIT_TRACE) &&
14c50 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
14c60 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
14c70 4f 49 4e 54 29 0a 20 20 20 20 20 20 69 66 28 20  OINT).      if( 
14c80 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20  pDb->zTrace ){. 
14c90 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65         pDb->inte
14ca0 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20  rp = interp;.   
14cb0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 72 61       sqlite3_tra
14cc0 63 65 28 70 44 62 2d 3e 64 62 2c 20 44 62 54 72  ce(pDb->db, DbTr
14cd0 61 63 65 48 61 6e 64 6c 65 72 2c 20 70 44 62 29  aceHandler, pDb)
14ce0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
14cf0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74         sqlite3_t
14d00 72 61 63 65 28 70 44 62 2d 3e 64 62 2c 20 30 2c  race(pDb->db, 0,
14d10 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e   0);.      }.#en
14d20 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 62 72  dif.    }.    br
14d30 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
14d40 20 20 24 64 62 20 74 72 61 6e 73 61 63 74 69 6f    $db transactio
14d50 6e 20 5b 2d 64 65 66 65 72 72 65 64 7c 2d 69 6d  n [-deferred|-im
14d60 6d 65 64 69 61 74 65 7c 2d 65 78 63 6c 75 73 69  mediate|-exclusi
14d70 76 65 5d 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a  ve] SCRIPT.  **.
14d80 20 20 2a 2a 20 53 74 61 72 74 20 61 20 6e 65 77    ** Start a new
14d90 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 66   transaction (if
14da0 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65   we are not alre
14db0 61 64 79 20 69 6e 20 74 68 65 20 6d 69 64 73 74  ady in the midst
14dc0 20 6f 66 20 61 0a 20 20 2a 2a 20 74 72 61 6e 73   of a.  ** trans
14dd0 61 63 74 69 6f 6e 29 20 61 6e 64 20 65 78 65 63  action) and exec
14de0 75 74 65 20 74 68 65 20 54 43 4c 20 73 63 72 69  ute the TCL scri
14df0 70 74 20 53 43 52 49 50 54 2e 20 20 41 66 74 65  pt SCRIPT.  Afte
14e00 72 20 53 43 52 49 50 54 0a 20 20 2a 2a 20 63 6f  r SCRIPT.  ** co
14e10 6d 70 6c 65 74 65 73 2c 20 65 69 74 68 65 72 20  mpletes, either 
14e20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  commit the trans
14e30 61 63 74 69 6f 6e 20 6f 72 20 72 6f 6c 6c 20 69  action or roll i
14e40 74 20 62 61 63 6b 20 69 66 20 53 43 52 49 50 54  t back if SCRIPT
14e50 0a 20 20 2a 2a 20 74 68 72 6f 77 73 20 61 6e 20  .  ** throws an 
14e60 65 78 63 65 70 74 69 6f 6e 2e 20 20 4f 72 20 69  exception.  Or i
14e70 66 20 6e 6f 20 6e 65 77 20 74 72 61 6e 73 61 74  f no new transat
14e80 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64 2c  ion was started,
14e90 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 20 20 2a   do nothing..  *
14ea0 2a 20 70 61 73 73 20 74 68 65 20 65 78 63 65 70  * pass the excep
14eb0 74 69 6f 6e 20 6f 6e 20 75 70 20 74 68 65 20 73  tion on up the s
14ec0 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  tack..  **.  ** 
14ed0 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 77 61 73  This command was
14ee0 20 69 6e 73 70 69 72 65 64 20 62 79 20 44 61 76   inspired by Dav
14ef0 65 20 54 68 6f 6d 61 73 27 73 20 74 61 6c 6b 20  e Thomas's talk 
14f00 6f 6e 20 52 75 62 79 20 61 74 20 74 68 65 0a 20  on Ruby at the. 
14f10 20 2a 2a 20 32 30 30 35 20 4f 27 52 65 69 6c 6c   ** 2005 O'Reill
14f20 79 20 4f 70 65 6e 20 53 6f 75 72 63 65 20 43 6f  y Open Source Co
14f30 6e 76 65 6e 74 69 6f 6e 20 28 4f 53 43 4f 4e 29  nvention (OSCON)
14f40 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
14f50 5f 54 52 41 4e 53 41 43 54 49 4f 4e 3a 20 7b 0a  _TRANSACTION: {.
14f60 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63      Tcl_Obj *pSc
14f70 72 69 70 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20  ript;.    const 
14f80 63 68 61 72 20 2a 7a 42 65 67 69 6e 20 3d 20 22  char *zBegin = "
14f90 53 41 56 45 50 4f 49 4e 54 20 5f 74 63 6c 5f 74  SAVEPOINT _tcl_t
14fa0 72 61 6e 73 61 63 74 69 6f 6e 22 3b 0a 20 20 20  ransaction";.   
14fb0 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 26 26 20   if( objc!=3 && 
14fc0 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 20  objc!=4 ){.     
14fd0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
14fe0 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
14ff0 76 2c 20 22 5b 54 59 50 45 5d 20 53 43 52 49 50  v, "[TYPE] SCRIP
15000 54 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  T");.      retur
15010 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
15020 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 44 62 2d   }..    if( pDb-
15030 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 30  >nTransaction==0
15040 20 26 26 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20   && objc==4 ){. 
15050 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
15060 74 20 63 68 61 72 20 2a 54 54 59 50 45 5f 73 74  t char *TTYPE_st
15070 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  rs[] = {.       
15080 20 22 64 65 66 65 72 72 65 64 22 2c 20 20 20 22   "deferred",   "
15090 65 78 63 6c 75 73 69 76 65 22 2c 20 20 22 69 6d  exclusive",  "im
150a0 6d 65 64 69 61 74 65 22 2c 20 30 0a 20 20 20 20  mediate", 0.    
150b0 20 20 7d 3b 0a 20 20 20 20 20 20 65 6e 75 6d 20    };.      enum 
150c0 54 54 59 50 45 5f 65 6e 75 6d 20 7b 0a 20 20 20  TTYPE_enum {.   
150d0 20 20 20 20 20 54 54 59 50 45 5f 44 45 46 45 52       TTYPE_DEFER
150e0 52 45 44 2c 20 54 54 59 50 45 5f 45 58 43 4c 55  RED, TTYPE_EXCLU
150f0 53 49 56 45 2c 20 54 54 59 50 45 5f 49 4d 4d 45  SIVE, TTYPE_IMME
15100 44 49 41 54 45 0a 20 20 20 20 20 20 7d 3b 0a 20  DIATE.      };. 
15110 20 20 20 20 20 69 6e 74 20 74 74 79 70 65 3b 0a       int ttype;.
15120 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65        if( Tcl_Ge
15130 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e  tIndexFromObj(in
15140 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 54  terp, objv[2], T
15150 54 59 50 45 5f 73 74 72 73 2c 20 22 74 72 61 6e  TYPE_strs, "tran
15160 73 61 63 74 69 6f 6e 20 74 79 70 65 22 2c 0a 20  saction type",. 
15170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15180 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
15190 26 74 74 79 70 65 29 20 29 7b 0a 20 20 20 20 20  &ttype) ){.     
151a0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
151b0 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
151c0 20 20 20 73 77 69 74 63 68 28 20 28 65 6e 75 6d     switch( (enum
151d0 20 54 54 59 50 45 5f 65 6e 75 6d 29 74 74 79 70   TTYPE_enum)ttyp
151e0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73  e ){.        cas
151f0 65 20 54 54 59 50 45 5f 44 45 46 45 52 52 45 44  e TTYPE_DEFERRED
15200 3a 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f  :    /* no-op */
15210 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15220 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
15230 20 63 61 73 65 20 54 54 59 50 45 5f 45 58 43 4c   case TTYPE_EXCL
15240 55 53 49 56 45 3a 20 20 20 7a 42 65 67 69 6e 20  USIVE:   zBegin 
15250 3d 20 22 42 45 47 49 4e 20 45 58 43 4c 55 53 49  = "BEGIN EXCLUSI
15260 56 45 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  VE";  break;.   
15270 20 20 20 20 20 63 61 73 65 20 54 54 59 50 45 5f       case TTYPE_
15280 49 4d 4d 45 44 49 41 54 45 3a 20 20 20 7a 42 65  IMMEDIATE:   zBe
15290 67 69 6e 20 3d 20 22 42 45 47 49 4e 20 49 4d 4d  gin = "BEGIN IMM
152a0 45 44 49 41 54 45 22 3b 20 20 62 72 65 61 6b 3b  EDIATE";  break;
152b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
152c0 20 20 20 70 53 63 72 69 70 74 20 3d 20 6f 62 6a     pScript = obj
152d0 76 5b 6f 62 6a 63 2d 31 5d 3b 0a 0a 20 20 20 20  v[objc-1];..    
152e0 2f 2a 20 52 75 6e 20 74 68 65 20 53 51 4c 69 74  /* Run the SQLit
152f0 65 20 42 45 47 49 4e 20 63 6f 6d 6d 61 6e 64 20  e BEGIN command 
15300 74 6f 20 6f 70 65 6e 20 61 20 74 72 61 6e 73 61  to open a transa
15310 63 74 69 6f 6e 20 6f 72 20 73 61 76 65 70 6f 69  ction or savepoi
15320 6e 74 2e 20 2a 2f 0a 20 20 20 20 70 44 62 2d 3e  nt. */.    pDb->
15330 64 69 73 61 62 6c 65 41 75 74 68 2b 2b 3b 0a 20  disableAuth++;. 
15340 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
15350 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 7a 42  exec(pDb->db, zB
15360 65 67 69 6e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  egin, 0, 0, 0);.
15370 20 20 20 20 70 44 62 2d 3e 64 69 73 61 62 6c 65      pDb->disable
15380 41 75 74 68 2d 2d 3b 0a 20 20 20 20 69 66 28 20  Auth--;.    if( 
15390 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
153a0 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
153b0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
153c0 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
153d0 44 62 2d 3e 64 62 29 2c 20 28 63 68 61 72 2a 29  Db->db), (char*)
153e0 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
153f0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
15400 7d 0a 20 20 20 20 70 44 62 2d 3e 6e 54 72 61 6e  }.    pDb->nTran
15410 73 61 63 74 69 6f 6e 2b 2b 3b 0a 0a 20 20 20 20  saction++;..    
15420 2f 2a 20 49 66 20 75 73 69 6e 67 20 4e 52 45 2c  /* If using NRE,
15430 20 73 63 68 65 64 75 6c 65 20 61 20 63 61 6c 6c   schedule a call
15440 62 61 63 6b 20 74 6f 20 69 6e 76 6f 6b 65 20 74  back to invoke t
15450 68 65 20 73 63 72 69 70 74 20 70 53 63 72 69 70  he script pScrip
15460 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61  t, then.    ** a
15470 20 73 65 63 6f 6e 64 20 63 61 6c 6c 62 61 63 6b   second callback
15480 20 74 6f 20 63 6f 6d 6d 69 74 20 28 6f 72 20 72   to commit (or r
15490 6f 6c 6c 62 61 63 6b 29 20 74 68 65 20 74 72 61  ollback) the tra
154a0 6e 73 61 63 74 69 6f 6e 20 6f 72 20 73 61 76 65  nsaction or save
154b0 70 6f 69 6e 74 0a 20 20 20 20 2a 2a 20 6f 70 65  point.    ** ope
154c0 6e 65 64 20 61 62 6f 76 65 2e 20 49 66 20 6e 6f  ned above. If no
154d0 74 20 75 73 69 6e 67 20 4e 52 45 2c 20 65 76 61  t using NRE, eva
154e0 6c 75 61 74 65 20 74 68 65 20 73 63 72 69 70 74  luate the script
154f0 20 64 69 72 65 63 74 6c 79 2c 20 74 68 65 6e 0a   directly, then.
15500 20 20 20 20 2a 2a 20 63 61 6c 6c 20 66 75 6e 63      ** call func
15510 74 69 6f 6e 20 44 62 54 72 61 6e 73 50 6f 73 74  tion DbTransPost
15520 43 6d 64 28 29 20 74 6f 20 63 6f 6d 6d 69 74 20  Cmd() to commit 
15530 28 6f 72 20 72 6f 6c 6c 62 61 63 6b 29 20 74 68  (or rollback) th
15540 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20  e transaction . 
15550 20 20 20 2a 2a 20 6f 72 20 73 61 76 65 70 6f 69     ** or savepoi
15560 6e 74 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  nt.  */.    if( 
15570 44 62 55 73 65 4e 72 65 28 29 20 29 7b 0a 20 20  DbUseNre() ){.  
15580 20 20 20 20 54 63 6c 5f 4e 52 41 64 64 43 61 6c      Tcl_NRAddCal
15590 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 44 62  lback(interp, Db
155a0 54 72 61 6e 73 50 6f 73 74 43 6d 64 2c 20 63 64  TransPostCmd, cd
155b0 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
155c0 20 20 28 76 6f 69 64 29 54 63 6c 5f 4e 52 45 76    (void)Tcl_NREv
155d0 61 6c 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 53  alObj(interp, pS
155e0 63 72 69 70 74 2c 20 30 29 3b 0a 20 20 20 20 7d  cript, 0);.    }
155f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
15600 20 44 62 54 72 61 6e 73 50 6f 73 74 43 6d 64 28   DbTransPostCmd(
15610 26 63 64 2c 20 69 6e 74 65 72 70 2c 20 54 63 6c  &cd, interp, Tcl
15620 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72  _EvalObjEx(inter
15630 70 2c 20 70 53 63 72 69 70 74 2c 20 30 29 29 3b  p, pScript, 0));
15640 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
15650 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
15660 20 20 20 20 24 64 62 20 75 6e 6c 6f 63 6b 5f 6e      $db unlock_n
15670 6f 74 69 66 79 20 3f 73 63 72 69 70 74 3f 0a 20  otify ?script?. 
15680 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 55 4e   */.  case DB_UN
15690 4c 4f 43 4b 5f 4e 4f 54 49 46 59 3a 20 7b 0a 23  LOCK_NOTIFY: {.#
156a0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  ifndef SQLITE_EN
156b0 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49  ABLE_UNLOCK_NOTI
156c0 46 59 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  FY.    Tcl_Appen
156d0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
156e0 22 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 20 6e  "unlock_notify n
156f0 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  ot available in 
15700 74 68 69 73 20 62 75 69 6c 64 22 2c 0a 20 20 20  this build",.   
15710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15720 20 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20    (char*)0);.   
15730 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b   rc = TCL_ERROR;
15740 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 6f  .#else.    if( o
15750 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d  bjc!=2 && objc!=
15760 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
15770 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
15780 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 53  rp, 2, objv, "?S
15790 43 52 49 50 54 3f 22 29 3b 0a 20 20 20 20 20 20  CRIPT?");.      
157a0 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  rc = TCL_ERROR;.
157b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
157c0 20 76 6f 69 64 20 28 2a 78 4e 6f 74 69 66 79 29   void (*xNotify)
157d0 28 76 6f 69 64 20 2a 2a 2c 20 69 6e 74 29 20 3d  (void **, int) =
157e0 20 30 3b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a   0;.      void *
157f0 70 4e 6f 74 69 66 79 41 72 67 20 3d 20 30 3b 0a  pNotifyArg = 0;.
15800 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
15810 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 20 29 7b  pUnlockNotify ){
15820 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63  .        Tcl_Dec
15830 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70  rRefCount(pDb->p
15840 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 29 3b 0a 20  UnlockNotify);. 
15850 20 20 20 20 20 20 20 70 44 62 2d 3e 70 55 6e 6c         pDb->pUnl
15860 6f 63 6b 4e 6f 74 69 66 79 20 3d 20 30 3b 0a 20  ockNotify = 0;. 
15870 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
15880 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20  if( objc==3 ){. 
15890 20 20 20 20 20 20 20 78 4e 6f 74 69 66 79 20 3d         xNotify =
158a0 20 44 62 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 3b   DbUnlockNotify;
158b0 0a 20 20 20 20 20 20 20 20 70 4e 6f 74 69 66 79  .        pNotify
158c0 41 72 67 20 3d 20 28 76 6f 69 64 20 2a 29 70 44  Arg = (void *)pD
158d0 62 3b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  b;.        pDb->
158e0 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 20 3d 20  pUnlockNotify = 
158f0 6f 62 6a 76 5b 32 5d 3b 0a 20 20 20 20 20 20 20  objv[2];.       
15900 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
15910 74 28 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f  t(pDb->pUnlockNo
15920 74 69 66 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20  tify);.      }. 
15930 20 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69   .      if( sqli
15940 74 65 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66  te3_unlock_notif
15950 79 28 70 44 62 2d 3e 64 62 2c 20 78 4e 6f 74 69  y(pDb->db, xNoti
15960 66 79 2c 20 70 4e 6f 74 69 66 79 41 72 67 29 20  fy, pNotifyArg) 
15970 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41  ){.        Tcl_A
15980 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
15990 72 70 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  rp, sqlite3_errm
159a0 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 28 63 68  sg(pDb->db), (ch
159b0 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 20 20  ar*)0);.        
159c0 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  rc = TCL_ERROR;.
159d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
159e0 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a  ndif.    break;.
159f0 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
15a00 20 20 24 64 62 20 77 61 6c 5f 68 6f 6f 6b 20 3f    $db wal_hook ?
15a10 73 63 72 69 70 74 3f 0a 20 20 2a 2a 20 20 20 20  script?.  **    
15a20 24 64 62 20 75 70 64 61 74 65 5f 68 6f 6f 6b 20  $db update_hook 
15a30 3f 73 63 72 69 70 74 3f 0a 20 20 2a 2a 20 20 20  ?script?.  **   
15a40 20 24 64 62 20 72 6f 6c 6c 62 61 63 6b 5f 68 6f   $db rollback_ho
15a50 6f 6b 20 3f 73 63 72 69 70 74 3f 0a 20 20 2a 2f  ok ?script?.  */
15a60 0a 20 20 63 61 73 65 20 44 42 5f 57 41 4c 5f 48  .  case DB_WAL_H
15a70 4f 4f 4b 3a 20 0a 20 20 63 61 73 65 20 44 42 5f  OOK: .  case DB_
15a80 55 50 44 41 54 45 5f 48 4f 4f 4b 3a 20 0a 20 20  UPDATE_HOOK: .  
15a90 63 61 73 65 20 44 42 5f 52 4f 4c 4c 42 41 43 4b  case DB_ROLLBACK
15aa0 5f 48 4f 4f 4b 3a 20 7b 0a 0a 20 20 20 20 2f 2a  _HOOK: {..    /*
15ab0 20 73 65 74 20 70 70 48 6f 6f 6b 20 74 6f 20 70   set ppHook to p
15ac0 6f 69 6e 74 20 61 74 20 70 55 70 64 61 74 65 48  oint at pUpdateH
15ad0 6f 6f 6b 20 6f 72 20 70 52 6f 6c 6c 62 61 63 6b  ook or pRollback
15ae0 48 6f 6f 6b 2c 20 64 65 70 65 6e 64 69 6e 67 20  Hook, depending 
15af0 6f 6e 20 0a 20 20 20 20 2a 2a 20 77 68 65 74 68  on .    ** wheth
15b00 65 72 20 5b 24 64 62 20 75 70 64 61 74 65 5f 68  er [$db update_h
15b10 6f 6f 6b 5d 20 6f 72 20 5b 24 64 62 20 72 6f 6c  ook] or [$db rol
15b20 6c 62 61 63 6b 5f 68 6f 6f 6b 5d 20 77 61 73 20  lback_hook] was 
15b30 69 6e 76 6f 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a  invoked..    */.
15b40 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 70 70      Tcl_Obj **pp
15b50 48 6f 6f 6b 3b 20 0a 20 20 20 20 69 66 28 20 63  Hook; .    if( c
15b60 68 6f 69 63 65 3d 3d 44 42 5f 55 50 44 41 54 45  hoice==DB_UPDATE
15b70 5f 48 4f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  _HOOK ){.      p
15b80 70 48 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e 70 55  pHook = &pDb->pU
15b90 70 64 61 74 65 48 6f 6f 6b 3b 0a 20 20 20 20 7d  pdateHook;.    }
15ba0 65 6c 73 65 20 69 66 28 20 63 68 6f 69 63 65 3d  else if( choice=
15bb0 3d 44 42 5f 57 41 4c 5f 48 4f 4f 4b 20 29 7b 0a  =DB_WAL_HOOK ){.
15bc0 20 20 20 20 20 20 70 70 48 6f 6f 6b 20 3d 20 26        ppHook = &
15bd0 70 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 3b 0a 20  pDb->pWalHook;. 
15be0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15bf0 70 70 48 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e 70  ppHook = &pDb->p
15c00 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3b 0a 20 20  RollbackHook;.  
15c10 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a    }..    if( obj
15c20 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33 20  c!=2 && objc!=3 
15c30 29 7b 0a 20 20 20 20 20 20 20 54 63 6c 5f 57 72  ){.       Tcl_Wr
15c40 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
15c50 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 53 43  p, 2, objv, "?SC
15c60 52 49 50 54 3f 22 29 3b 0a 20 20 20 20 20 20 20  RIPT?");.       
15c70 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
15c80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
15c90 2a 70 70 48 6f 6f 6b 20 29 7b 0a 20 20 20 20 20  *ppHook ){.     
15ca0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
15cb0 74 28 69 6e 74 65 72 70 2c 20 2a 70 70 48 6f 6f  t(interp, *ppHoo
15cc0 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 62  k);.      if( ob
15cd0 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 20  jc==3 ){.       
15ce0 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
15cf0 74 28 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20 20 20  t(*ppHook);.    
15d00 20 20 20 20 2a 70 70 48 6f 6f 6b 20 3d 20 30 3b      *ppHook = 0;
15d10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
15d20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29     if( objc==3 )
15d30 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
15d40 21 28 2a 70 70 48 6f 6f 6b 29 20 29 3b 0a 20 20  !(*ppHook) );.  
15d50 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 43      if( Tcl_GetC
15d60 68 61 72 4c 65 6e 67 74 68 28 6f 62 6a 76 5b 32  harLength(objv[2
15d70 5d 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ])>0 ){.        
15d80 2a 70 70 48 6f 6f 6b 20 3d 20 6f 62 6a 76 5b 32  *ppHook = objv[2
15d90 5d 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 49  ];.        Tcl_I
15da0 6e 63 72 52 65 66 43 6f 75 6e 74 28 2a 70 70 48  ncrRefCount(*ppH
15db0 6f 6f 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ook);.      }.  
15dc0 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33    }..    sqlite3
15dd0 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28 70 44 62  _update_hook(pDb
15de0 2d 3e 64 62 2c 20 28 70 44 62 2d 3e 70 55 70 64  ->db, (pDb->pUpd
15df0 61 74 65 48 6f 6f 6b 3f 44 62 55 70 64 61 74 65  ateHook?DbUpdate
15e00 48 61 6e 64 6c 65 72 3a 30 29 2c 20 70 44 62 29  Handler:0), pDb)
15e10 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 6f  ;.    sqlite3_ro
15e20 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28 70 44 62 2d  llback_hook(pDb-
15e30 3e 64 62 2c 28 70 44 62 2d 3e 70 52 6f 6c 6c 62  >db,(pDb->pRollb
15e40 61 63 6b 48 6f 6f 6b 3f 44 62 52 6f 6c 6c 62 61  ackHook?DbRollba
15e50 63 6b 48 61 6e 64 6c 65 72 3a 30 29 2c 70 44 62  ckHandler:0),pDb
15e60 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77  );.    sqlite3_w
15e70 61 6c 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c  al_hook(pDb->db,
15e80 28 70 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 3f 44  (pDb->pWalHook?D
15e90 62 57 61 6c 48 61 6e 64 6c 65 72 3a 30 29 2c 70  bWalHandler:0),p
15ea0 44 62 29 3b 0a 0a 20 20 20 20 62 72 65 61 6b 3b  Db);..    break;
15eb0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64  .  }..  /*    $d
15ec0 62 20 76 65 72 73 69 6f 6e 0a 20 20 2a 2a 0a 20  b version.  **. 
15ed0 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76   ** Return the v
15ee0 65 72 73 69 6f 6e 20 73 74 72 69 6e 67 20 66 6f  ersion string fo
15ef0 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65 2e  r this database.
15f00 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
15f10 56 45 52 53 49 4f 4e 3a 20 7b 0a 20 20 20 20 54  VERSION: {.    T
15f20 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
15f30 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c  erp, (char *)sql
15f40 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28  ite3_libversion(
15f50 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  ), TCL_STATIC);.
15f60 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
15f70 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 6f 66 20 74  .  } /* End of t
15f80 68 65 20 53 57 49 54 43 48 20 73 74 61 74 65 6d  he SWITCH statem
15f90 65 6e 74 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ent */.  return 
15fa0 72 63 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  rc;.}..#if SQLIT
15fb0 45 5f 54 43 4c 5f 4e 52 45 0a 2f 2a 0a 2a 2a 20  E_TCL_NRE./*.** 
15fc0 41 64 61 70 74 6f 72 20 74 68 61 74 20 70 72 6f  Adaptor that pro
15fd0 76 69 64 65 73 20 61 6e 20 6f 62 6a 43 6d 64 20  vides an objCmd 
15fe0 69 6e 74 65 72 66 61 63 65 20 74 6f 20 74 68 65  interface to the
15ff0 20 4e 52 45 2d 65 6e 61 62 6c 65 64 0a 2a 2a 20   NRE-enabled.** 
16000 69 6e 74 65 72 66 61 63 65 20 69 6d 70 6c 65 6d  interface implem
16010 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  entation..*/.sta
16020 74 69 63 20 69 6e 74 20 44 62 4f 62 6a 43 6d 64  tic int DbObjCmd
16030 41 64 61 70 74 6f 72 28 0a 20 20 76 6f 69 64 20  Adaptor(.  void 
16040 2a 63 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  *cd,.  Tcl_Inter
16050 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
16060 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
16070 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76 0a 29 7b 0a   *const*objv.){.
16080 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e 52 43    return Tcl_NRC
16090 61 6c 6c 4f 62 6a 50 72 6f 63 28 69 6e 74 65 72  allObjProc(inter
160a0 70 2c 20 44 62 4f 62 6a 43 6d 64 2c 20 63 64 2c  p, DbObjCmd, cd,
160b0 20 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b 0a 7d 0a   objc, objv);.}.
160c0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
160d0 5f 54 43 4c 5f 4e 52 45 20 2a 2f 0a 0a 2f 2a 0a  _TCL_NRE */../*.
160e0 2a 2a 20 20 20 73 71 6c 69 74 65 33 20 44 42 4e  **   sqlite3 DBN
160f0 41 4d 45 20 46 49 4c 45 4e 41 4d 45 20 3f 2d 76  AME FILENAME ?-v
16100 66 73 20 56 46 53 4e 41 4d 45 3f 20 3f 2d 6b 65  fs VFSNAME? ?-ke
16110 79 20 4b 45 59 3f 20 3f 2d 72 65 61 64 6f 6e 6c  y KEY? ?-readonl
16120 79 20 42 4f 4f 4c 45 41 4e 3f 0a 2a 2a 20 20 20  y BOOLEAN?.**   
16130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16140 20 20 20 20 20 20 20 20 3f 2d 63 72 65 61 74 65          ?-create
16150 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d 6e 6f 6d 75   BOOLEAN? ?-nomu
16160 74 65 78 20 42 4f 4f 4c 45 41 4e 3f 0a 2a 2a 0a  tex BOOLEAN?.**.
16170 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 6d  ** This is the m
16180 61 69 6e 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 2e  ain Tcl command.
16190 20 20 57 68 65 6e 20 74 68 65 20 22 73 71 6c 69    When the "sqli
161a0 74 65 22 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20  te" Tcl command 
161b0 69 73 0a 2a 2a 20 69 6e 76 6f 6b 65 64 2c 20 74  is.** invoked, t
161c0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
161d0 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 61 74   to process that
161e0 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
161f0 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
16200 6e 74 2c 20 44 42 4e 41 4d 45 2c 20 69 73 20 61  nt, DBNAME, is a
16210 6e 20 61 72 62 69 74 72 61 72 79 20 6e 61 6d 65  n arbitrary name
16220 20 66 6f 72 20 61 20 6e 65 77 0a 2a 2a 20 64 61   for a new.** da
16230 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
16240 6e 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64  n.  This command
16250 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 20 63   creates a new c
16260 6f 6d 6d 61 6e 64 20 6e 61 6d 65 64 0a 2a 2a 20  ommand named.** 
16270 44 42 4e 41 4d 45 20 74 68 61 74 20 69 73 20 75  DBNAME that is u
16280 73 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74  sed to control t
16290 68 61 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20  hat connection. 
162a0 20 54 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   The database.**
162b0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 64   connection is d
162c0 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20  eleted when the 
162d0 44 42 4e 41 4d 45 20 63 6f 6d 6d 61 6e 64 20 69  DBNAME command i
162e0 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a  s deleted..**.**
162f0 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
16300 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d 65  ment is the name
16310 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
16320 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61   file..**.*/.sta
16330 74 69 63 20 69 6e 74 20 44 62 4d 61 69 6e 28 76  tic int DbMain(v
16340 6f 69 64 20 2a 63 64 2c 20 54 63 6c 5f 49 6e 74  oid *cd, Tcl_Int
16350 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
16360 20 6f 62 6a 63 2c 54 63 6c 5f 4f 62 6a 20 2a 63   objc,Tcl_Obj *c
16370 6f 6e 73 74 2a 6f 62 6a 76 29 7b 0a 20 20 53 71  onst*objv){.  Sq
16380 6c 69 74 65 44 62 20 2a 70 3b 0a 20 20 63 6f 6e  liteDb *p;.  con
16390 73 74 20 63 68 61 72 20 2a 7a 41 72 67 3b 0a 20  st char *zArg;. 
163a0 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 3b 0a   char *zErrMsg;.
163b0 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74    int i;.  const
163c0 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20   char *zFile;.  
163d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73  const char *zVfs
163e0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 66 6c 61 67   = 0;.  int flag
163f0 73 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  s;.  Tcl_DString
16400 20 74 72 61 6e 73 6c 61 74 65 64 46 69 6c 65 6e   translatedFilen
16410 61 6d 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ame;.#ifdef SQLI
16420 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 76  TE_HAS_CODEC.  v
16430 6f 69 64 20 2a 70 4b 65 79 20 3d 20 30 3b 0a 20  oid *pKey = 0;. 
16440 20 69 6e 74 20 6e 4b 65 79 20 3d 20 30 3b 0a 23   int nKey = 0;.#
16450 65 6e 64 69 66 0a 20 20 69 6e 74 20 72 63 3b 0a  endif.  int rc;.
16460 0a 20 20 2f 2a 20 49 6e 20 6e 6f 72 6d 61 6c 20  .  /* In normal 
16470 75 73 65 2c 20 65 61 63 68 20 54 43 4c 20 69 6e  use, each TCL in
16480 74 65 72 70 72 65 74 65 72 20 72 75 6e 73 20 69  terpreter runs i
16490 6e 20 61 20 73 69 6e 67 6c 65 20 74 68 72 65 61  n a single threa
164a0 64 2e 20 20 53 6f 0a 20 20 2a 2a 20 62 79 20 64  d.  So.  ** by d
164b0 65 66 61 75 6c 74 2c 20 77 65 20 63 61 6e 20 74  efault, we can t
164c0 75 72 6e 20 6f 66 20 6d 75 74 65 78 69 6e 67 20  urn of mutexing 
164d0 6f 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  on SQLite databa
164e0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a  se connections..
164f0 20 20 2a 2a 20 48 6f 77 65 76 65 72 2c 20 66 6f    ** However, fo
16500 72 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73  r testing purpos
16510 65 73 20 69 74 20 69 73 20 75 73 65 66 75 6c 20  es it is useful 
16520 74 6f 20 68 61 76 65 20 6d 75 74 65 78 65 73 20  to have mutexes 
16530 74 75 72 6e 65 64 0a 20 20 2a 2a 20 6f 6e 2e 20  turned.  ** on. 
16540 20 53 6f 2c 20 62 79 20 64 65 66 61 75 6c 74 2c   So, by default,
16550 20 6d 75 74 65 78 65 73 20 64 65 66 61 75 6c 74   mutexes default
16560 20 6f 66 66 2e 20 20 42 75 74 20 69 66 20 63 6f   off.  But if co
16570 6d 70 69 6c 65 64 20 77 69 74 68 0a 20 20 2a 2a  mpiled with.  **
16580 20 53 51 4c 49 54 45 5f 54 43 4c 5f 44 45 46 41   SQLITE_TCL_DEFA
16590 55 4c 54 5f 46 55 4c 4c 4d 55 54 45 58 20 74 68  ULT_FULLMUTEX th
165a0 65 6e 20 6d 75 74 65 78 65 73 20 64 65 66 61 75  en mutexes defau
165b0 6c 74 20 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64  lt on..  */.#ifd
165c0 65 66 20 53 51 4c 49 54 45 5f 54 43 4c 5f 44 45  ef SQLITE_TCL_DE
165d0 46 41 55 4c 54 5f 46 55 4c 4c 4d 55 54 45 58 0a  FAULT_FULLMUTEX.
165e0 20 20 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45    flags = SQLITE
165f0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
16600 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  | SQLITE_OPEN_CR
16610 45 41 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  EATE | SQLITE_OP
16620 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 3b 0a 23 65  EN_FULLMUTEX;.#e
16630 6c 73 65 0a 20 20 66 6c 61 67 73 20 3d 20 53 51  lse.  flags = SQ
16640 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
16650 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE | SQLITE_OPE
16660 4e 5f 43 52 45 41 54 45 20 7c 20 53 51 4c 49 54  N_CREATE | SQLIT
16670 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 3b 0a  E_OPEN_NOMUTEX;.
16680 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6f 62  #endif..  if( ob
16690 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 7a 41 72  jc==2 ){.    zAr
166a0 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  g = Tcl_GetStrin
166b0 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d  gFromObj(objv[1]
166c0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 73 74  , 0);.    if( st
166d0 72 63 6d 70 28 7a 41 72 67 2c 22 2d 76 65 72 73  rcmp(zArg,"-vers
166e0 69 6f 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ion")==0 ){.    
166f0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
16700 6c 74 28 69 6e 74 65 72 70 2c 73 71 6c 69 74 65  lt(interp,sqlite
16710 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28 29 2c 20  3_libversion(), 
16720 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
16730 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
16740 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74      }.    if( st
16750 72 63 6d 70 28 7a 41 72 67 2c 22 2d 68 61 73 2d  rcmp(zArg,"-has-
16760 63 6f 64 65 63 22 29 3d 3d 30 20 29 7b 0a 23 69  codec")==0 ){.#i
16770 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
16780 43 4f 44 45 43 0a 20 20 20 20 20 20 54 63 6c 5f  CODEC.      Tcl_
16790 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
167a0 65 72 70 2c 22 31 22 2c 28 63 68 61 72 2a 29 30  erp,"1",(char*)0
167b0 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 54  );.#else.      T
167c0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
167d0 69 6e 74 65 72 70 2c 22 30 22 2c 28 63 68 61 72  interp,"0",(char
167e0 2a 29 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  *)0);.#endif.   
167f0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
16800 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  ;.    }.  }.  fo
16810 72 28 69 3d 33 3b 20 69 2b 31 3c 6f 62 6a 63 3b  r(i=3; i+1<objc;
16820 20 69 2b 3d 32 29 7b 0a 20 20 20 20 7a 41 72 67   i+=2){.    zArg
16830 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
16840 28 6f 62 6a 76 5b 69 5d 29 3b 0a 20 20 20 20 69  (objv[i]);.    i
16850 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22  f( strcmp(zArg,"
16860 2d 6b 65 79 22 29 3d 3d 30 20 29 7b 0a 23 69 66  -key")==0 ){.#if
16870 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
16880 4f 44 45 43 0a 20 20 20 20 20 20 70 4b 65 79 20  ODEC.      pKey 
16890 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72  = Tcl_GetByteArr
168a0 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 69  ayFromObj(objv[i
168b0 2b 31 5d 2c 20 26 6e 4b 65 79 29 3b 0a 23 65 6e  +1], &nKey);.#en
168c0 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  dif.    }else if
168d0 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22  ( strcmp(zArg, "
168e0 2d 76 66 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20  -vfs")==0 ){.   
168f0 20 20 20 7a 56 66 73 20 3d 20 54 63 6c 5f 47 65     zVfs = Tcl_Ge
16900 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69 2b 31  tString(objv[i+1
16910 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ]);.    }else if
16920 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22  ( strcmp(zArg, "
16930 2d 72 65 61 64 6f 6e 6c 79 22 29 3d 3d 30 20 29  -readonly")==0 )
16940 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 3b 0a 20  {.      int b;. 
16950 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74       if( Tcl_Get
16960 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
16970 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d  nterp, objv[i+1]
16980 2c 20 26 62 29 20 29 20 72 65 74 75 72 6e 20 54  , &b) ) return T
16990 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
169a0 69 66 28 20 62 20 29 7b 0a 20 20 20 20 20 20 20  if( b ){.       
169b0 20 66 6c 61 67 73 20 26 3d 20 7e 28 53 51 4c 49   flags &= ~(SQLI
169c0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
169d0 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  E|SQLITE_OPEN_CR
169e0 45 41 54 45 29 3b 0a 20 20 20 20 20 20 20 20 66  EATE);.        f
169f0 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
16a00 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  PEN_READONLY;.  
16a10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16a20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c     flags &= ~SQL
16a30 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
16a40 59 3b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  Y;.        flags
16a50 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   |= SQLITE_OPEN_
16a60 52 45 41 44 57 52 49 54 45 3b 0a 20 20 20 20 20  READWRITE;.     
16a70 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
16a80 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d   strcmp(zArg, "-
16a90 63 72 65 61 74 65 22 29 3d 3d 30 20 29 7b 0a 20  create")==0 ){. 
16aa0 20 20 20 20 20 69 6e 74 20 62 3b 0a 20 20 20 20       int b;.    
16ab0 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f    if( Tcl_GetBoo
16ac0 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
16ad0 72 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26  rp, objv[i+1], &
16ae0 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
16af0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 69 66 28  ERROR;.      if(
16b00 20 62 20 26 26 20 28 66 6c 61 67 73 20 26 20 53   b && (flags & S
16b10 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
16b20 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  NLY)==0 ){.     
16b30 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49     flags |= SQLI
16b40 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 3b 0a  TE_OPEN_CREATE;.
16b50 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
16b60 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53       flags &= ~S
16b70 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
16b80 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
16b90 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
16ba0 7a 41 72 67 2c 20 22 2d 6e 6f 6d 75 74 65 78 22  zArg, "-nomutex"
16bb0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
16bc0 74 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20 54  t b;.      if( T
16bd0 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f  cl_GetBooleanFro
16be0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
16bf0 76 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20 72 65  v[i+1], &b) ) re
16c00 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
16c10 20 20 20 20 20 20 69 66 28 20 62 20 29 7b 0a 20        if( b ){. 
16c20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20         flags |= 
16c30 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55  SQLITE_OPEN_NOMU
16c40 54 45 58 3b 0a 20 20 20 20 20 20 20 20 66 6c 61  TEX;.        fla
16c50 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50  gs &= ~SQLITE_OP
16c60 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 3b 0a 20 20  EN_FULLMUTEX;.  
16c70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16c80 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c     flags &= ~SQL
16c90 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58  ITE_OPEN_NOMUTEX
16ca0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
16cb0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
16cc0 41 72 67 2c 20 22 2d 66 75 6c 6c 6d 75 74 65 78  Arg, "-fullmutex
16cd0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
16ce0 6e 74 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20  nt b;.      if( 
16cf0 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
16d00 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
16d10 6a 76 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20 72  jv[i+1], &b) ) r
16d20 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
16d30 0a 20 20 20 20 20 20 69 66 28 20 62 20 29 7b 0a  .      if( b ){.
16d40 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d          flags |=
16d50 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c   SQLITE_OPEN_FUL
16d60 4c 4d 55 54 45 58 3b 0a 20 20 20 20 20 20 20 20  LMUTEX;.        
16d70 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
16d80 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 3b 0a 20  _OPEN_NOMUTEX;. 
16d90 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
16da0 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51      flags &= ~SQ
16db0 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55  LITE_OPEN_FULLMU
16dc0 54 45 58 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  TEX;.      }.   
16dd0 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
16de0 70 28 7a 41 72 67 2c 20 22 2d 75 72 69 22 29 3d  p(zArg, "-uri")=
16df0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
16e00 62 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c  b;.      if( Tcl
16e10 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
16e20 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
16e30 69 2b 31 5d 2c 20 26 62 29 20 29 20 72 65 74 75  i+1], &b) ) retu
16e40 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
16e50 20 20 20 20 69 66 28 20 62 20 29 7b 0a 20 20 20      if( b ){.   
16e60 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51       flags |= SQ
16e70 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 20  LITE_OPEN_URI;. 
16e80 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
16e90 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51      flags &= ~SQ
16ea0 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 20  LITE_OPEN_URI;. 
16eb0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
16ec0 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
16ed0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
16ee0 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e   "unknown option
16ef0 3a 20 22 2c 20 7a 41 72 67 2c 20 28 63 68 61 72  : ", zArg, (char
16f00 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  *)0);.      retu
16f10 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
16f20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62    }.  }.  if( ob
16f30 6a 63 3c 33 20 7c 7c 20 28 6f 62 6a 63 26 31 29  jc<3 || (objc&1)
16f40 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=1 ){.    Tcl_W
16f50 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
16f60 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 0a 20 20  rp, 1, objv, .  
16f70 20 20 20 20 22 48 41 4e 44 4c 45 20 46 49 4c 45      "HANDLE FILE
16f80 4e 41 4d 45 20 3f 2d 76 66 73 20 56 46 53 4e 41  NAME ?-vfs VFSNA
16f90 4d 45 3f 20 3f 2d 72 65 61 64 6f 6e 6c 79 20 42  ME? ?-readonly B
16fa0 4f 4f 4c 45 41 4e 3f 20 3f 2d 63 72 65 61 74 65  OOLEAN? ?-create
16fb0 20 42 4f 4f 4c 45 41 4e 3f 22 0a 20 20 20 20 20   BOOLEAN?".     
16fc0 20 22 20 3f 2d 6e 6f 6d 75 74 65 78 20 42 4f 4f   " ?-nomutex BOO
16fd0 4c 45 41 4e 3f 20 3f 2d 66 75 6c 6c 6d 75 74 65  LEAN? ?-fullmute
16fe0 78 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d 75 72 69  x BOOLEAN? ?-uri
16ff0 20 42 4f 4f 4c 45 41 4e 3f 22 0a 23 69 66 64 65   BOOLEAN?".#ifde
17000 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
17010 45 43 0a 20 20 20 20 20 20 22 20 3f 2d 6b 65 79  EC.      " ?-key
17020 20 43 4f 44 45 43 4b 45 59 3f 22 0a 23 65 6e 64   CODECKEY?".#end
17030 69 66 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 65  if.    );.    re
17040 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
17050 20 20 7d 0a 20 20 7a 45 72 72 4d 73 67 20 3d 20    }.  zErrMsg = 
17060 30 3b 0a 20 20 70 20 3d 20 28 53 71 6c 69 74 65  0;.  p = (Sqlite
17070 44 62 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73  Db*)Tcl_Alloc( s
17080 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69  izeof(*p) );.  i
17090 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 54  f( p==0 ){.    T
170a0 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
170b0 65 72 70 2c 20 28 63 68 61 72 20 2a 29 22 6d 61  erp, (char *)"ma
170c0 6c 6c 6f 63 20 66 61 69 6c 65 64 22 2c 20 54 43  lloc failed", TC
170d0 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72  L_STATIC);.    r
170e0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
170f0 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 2c  .  }.  memset(p,
17100 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b   0, sizeof(*p));
17110 0a 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47  .  zFile = Tcl_G
17120 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
17130 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 7a  objv[2], 0);.  z
17140 46 69 6c 65 20 3d 20 54 63 6c 5f 54 72 61 6e 73  File = Tcl_Trans
17150 6c 61 74 65 46 69 6c 65 4e 61 6d 65 28 69 6e 74  lateFileName(int
17160 65 72 70 2c 20 7a 46 69 6c 65 2c 20 26 74 72 61  erp, zFile, &tra
17170 6e 73 6c 61 74 65 64 46 69 6c 65 6e 61 6d 65 29  nslatedFilename)
17180 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
17190 5f 6f 70 65 6e 5f 76 32 28 7a 46 69 6c 65 2c 20  _open_v2(zFile, 
171a0 26 70 2d 3e 64 62 2c 20 66 6c 61 67 73 2c 20 7a  &p->db, flags, z
171b0 56 66 73 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72  Vfs);.  Tcl_DStr
171c0 69 6e 67 46 72 65 65 28 26 74 72 61 6e 73 6c 61  ingFree(&transla
171d0 74 65 64 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  tedFilename);.  
171e0 69 66 28 20 70 2d 3e 64 62 20 29 7b 0a 20 20 20  if( p->db ){.   
171f0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
17200 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
17210 70 2d 3e 64 62 29 20 29 7b 0a 20 20 20 20 20 20  p->db) ){.      
17220 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
17230 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20  3_mprintf("%s", 
17240 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
17250 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 73 71  ->db));.      sq
17260 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64  lite3_close(p->d
17270 62 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64 62 20  b);.      p->db 
17280 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 0;.    }.  }el
17290 73 65 7b 0a 20 20 20 20 7a 45 72 72 4d 73 67 20  se{.    zErrMsg 
172a0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
172b0 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f  f("%s", sqlite3_
172c0 65 72 72 73 74 72 28 72 63 29 29 3b 0a 20 20 7d  errstr(rc));.  }
172d0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
172e0 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 70  AS_CODEC.  if( p
172f0 2d 3e 64 62 20 29 7b 0a 20 20 20 20 73 71 6c 69  ->db ){.    sqli
17300 74 65 33 5f 6b 65 79 28 70 2d 3e 64 62 2c 20 70  te3_key(p->db, p
17310 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 7d 0a  Key, nKey);.  }.
17320 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e  #endif.  if( p->
17330 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c  db==0 ){.    Tcl
17340 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
17350 70 2c 20 7a 45 72 72 4d 73 67 2c 20 54 43 4c 5f  p, zErrMsg, TCL_
17360 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 54  VOLATILE);.    T
17370 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70  cl_Free((char*)p
17380 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
17390 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ree(zErrMsg);.  
173a0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
173b0 4f 52 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 78  OR;.  }.  p->max
173c0 53 74 6d 74 20 3d 20 4e 55 4d 5f 50 52 45 50 41  Stmt = NUM_PREPA
173d0 52 45 44 5f 53 54 4d 54 53 3b 0a 20 20 70 2d 3e  RED_STMTS;.  p->
173e0 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b  interp = interp;
173f0 0a 20 20 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65  .  zArg = Tcl_Ge
17400 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
17410 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 69 66  bjv[1], 0);.  if
17420 28 20 44 62 55 73 65 4e 72 65 28 29 20 29 7b 0a  ( DbUseNre() ){.
17430 20 20 20 20 54 63 6c 5f 4e 52 43 72 65 61 74 65      Tcl_NRCreate
17440 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
17450 7a 41 72 67 2c 20 44 62 4f 62 6a 43 6d 64 41 64  zArg, DbObjCmdAd
17460 61 70 74 6f 72 2c 20 44 62 4f 62 6a 43 6d 64 2c  aptor, DbObjCmd,
17470 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17480 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
17490 70 2c 20 44 62 44 65 6c 65 74 65 43 6d 64 29 3b  p, DbDeleteCmd);
174a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63  .  }else{.    Tc
174b0 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
174c0 6e 64 28 69 6e 74 65 72 70 2c 20 7a 41 72 67 2c  nd(interp, zArg,
174d0 20 44 62 4f 62 6a 43 6d 64 2c 20 28 63 68 61 72   DbObjCmd, (char
174e0 2a 29 70 2c 20 44 62 44 65 6c 65 74 65 43 6d 64  *)p, DbDeleteCmd
174f0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
17500 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
17510 20 50 72 6f 76 69 64 65 20 61 20 64 75 6d 6d 79   Provide a dummy
17520 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 20 69   Tcl_InitStubs i
17530 66 20 77 65 20 61 72 65 20 75 73 69 6e 67 20 74  f we are using t
17540 68 69 73 20 61 73 20 61 20 73 74 61 74 69 63 0a  his as a static.
17550 2a 2a 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23  ** library..*/.#
17560 69 66 6e 64 65 66 20 55 53 45 5f 54 43 4c 5f 53  ifndef USE_TCL_S
17570 54 55 42 53 0a 23 20 75 6e 64 65 66 20 20 54 63  TUBS.# undef  Tc
17580 6c 5f 49 6e 69 74 53 74 75 62 73 0a 23 20 64 65  l_InitStubs.# de
17590 66 69 6e 65 20 54 63 6c 5f 49 6e 69 74 53 74 75  fine Tcl_InitStu
175a0 62 73 28 61 2c 62 2c 63 29 20 54 43 4c 5f 56 45  bs(a,b,c) TCL_VE
175b0 52 53 49 4f 4e 0a 23 65 6e 64 69 66 0a 0a 2f 2a  RSION.#endif../*
175c0 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65  .** Make sure we
175d0 20 68 61 76 65 20 61 20 50 41 43 4b 41 47 45 5f   have a PACKAGE_
175e0 56 45 52 53 49 4f 4e 20 6d 61 63 72 6f 20 64 65  VERSION macro de
175f0 66 69 6e 65 64 2e 20 20 54 68 69 73 20 77 69 6c  fined.  This wil
17600 6c 20 62 65 0a 2a 2a 20 64 65 66 69 6e 65 64 20  l be.** defined 
17610 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 62 79  automatically by
17620 20 74 68 65 20 54 45 41 20 6d 61 6b 65 66 69 6c   the TEA makefil
17630 65 2e 20 20 42 75 74 20 6f 74 68 65 72 20 6d 61  e.  But other ma
17640 6b 65 66 69 6c 65 73 0a 2a 2a 20 64 6f 20 6e 6f  kefiles.** do no
17650 74 20 64 65 66 69 6e 65 20 69 74 2e 0a 2a 2f 0a  t define it..*/.
17660 23 69 66 6e 64 65 66 20 50 41 43 4b 41 47 45 5f  #ifndef PACKAGE_
17670 56 45 52 53 49 4f 4e 0a 23 20 64 65 66 69 6e 65  VERSION.# define
17680 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e   PACKAGE_VERSION
17690 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 0a   SQLITE_VERSION.
176a0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
176b0 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f  itialize this mo
176c0 64 75 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  dule..**.** This
176d0 20 54 63 6c 20 6d 6f 64 75 6c 65 20 63 6f 6e 74   Tcl module cont
176e0 61 69 6e 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67  ains only a sing
176f0 6c 65 20 6e 65 77 20 54 63 6c 20 63 6f 6d 6d 61  le new Tcl comma
17700 6e 64 20 6e 61 6d 65 64 20 22 73 71 6c 69 74 65  nd named "sqlite
17710 22 2e 0a 2a 2a 20 28 48 65 6e 63 65 20 74 68 65  "..** (Hence the
17720 72 65 20 69 73 20 6e 6f 20 6e 61 6d 65 73 70 61  re is no namespa
17730 63 65 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f  ce.  There is no
17740 20 70 6f 69 6e 74 20 69 6e 20 75 73 69 6e 67 20   point in using 
17750 61 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69  a namespace.** i
17760 66 20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e 20  f the extension 
17770 6f 6e 6c 79 20 73 75 70 70 6c 69 65 73 20 6f 6e  only supplies on
17780 65 20 6e 65 77 20 6e 61 6d 65 21 29 20 20 54 68  e new name!)  Th
17790 65 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d 61  e "sqlite" comma
177a0 6e 64 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f  nd is.** used to
177b0 20 6f 70 65 6e 20 61 20 6e 65 77 20 53 51 4c 69   open a new SQLi
177c0 74 65 20 64 61 74 61 62 61 73 65 2e 20 20 53 65  te database.  Se
177d0 65 20 74 68 65 20 44 62 4d 61 69 6e 28 29 20 72  e the DbMain() r
177e0 6f 75 74 69 6e 65 20 61 62 6f 76 65 0a 2a 2a 20  outine above.** 
177f0 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
17800 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a  nformation..**.*
17810 2a 20 54 68 65 20 45 58 54 45 52 4e 20 6d 61 63  * The EXTERN mac
17820 72 6f 73 20 61 72 65 20 72 65 71 75 69 72 65 64  ros are required
17830 20 62 79 20 54 43 4c 20 69 6e 20 6f 72 64 65 72   by TCL in order
17840 20 74 6f 20 77 6f 72 6b 20 6f 6e 20 77 69 6e 64   to work on wind
17850 6f 77 73 2e 0a 2a 2f 0a 45 58 54 45 52 4e 20 69  ows..*/.EXTERN i
17860 6e 74 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28  nt Sqlite3_Init(
17870 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
17880 72 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  rp){.  int rc = 
17890 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 69 6e  Tcl_InitStubs(in
178a0 74 65 72 70 2c 20 22 38 2e 34 22 2c 20 30 29 20  terp, "8.4", 0) 
178b0 3f 20 54 43 4c 5f 4f 4b 20 3a 20 54 43 4c 5f 45  ? TCL_OK : TCL_E
178c0 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 3d 3d  RROR;.  if( rc==
178d0 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63  TCL_OK ){.    Tc
178e0 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
178f0 6e 64 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  nd(interp, "sqli
17900 74 65 33 22 2c 20 28 54 63 6c 5f 4f 62 6a 43 6d  te3", (Tcl_ObjCm
17910 64 50 72 6f 63 2a 29 44 62 4d 61 69 6e 2c 20 30  dProc*)DbMain, 0
17920 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  , 0);.#ifndef SQ
17930 4c 49 54 45 5f 33 5f 53 55 46 46 49 58 5f 4f 4e  LITE_3_SUFFIX_ON
17940 4c 59 0a 20 20 20 20 2f 2a 20 54 68 65 20 22 73  LY.    /* The "s
17950 71 6c 69 74 65 22 20 61 6c 69 61 73 20 69 73 20  qlite" alias is 
17960 75 6e 64 6f 63 75 6d 65 6e 74 65 64 2e 20 20 49  undocumented.  I
17970 74 20 69 73 20 68 65 72 65 20 6f 6e 6c 79 20 74  t is here only t
17980 6f 20 73 75 70 70 6f 72 74 0a 20 20 20 20 2a 2a  o support.    **
17990 20 6c 65 67 61 63 79 20 73 63 72 69 70 74 73 2e   legacy scripts.
179a0 20 20 41 6c 6c 20 6e 65 77 20 73 63 72 69 70 74    All new script
179b0 73 20 73 68 6f 75 6c 64 20 75 73 65 20 6f 6e 6c  s should use onl
179c0 79 20 74 68 65 20 22 73 71 6c 69 74 65 33 22 0a  y the "sqlite3".
179d0 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20      ** command. 
179e0 2a 2f 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74  */.    Tcl_Creat
179f0 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
17a00 72 70 2c 20 22 73 71 6c 69 74 65 22 2c 20 28 54  rp, "sqlite", (T
17a10 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 2a 29 44  cl_ObjCmdProc*)D
17a20 62 4d 61 69 6e 2c 20 30 2c 20 30 29 3b 0a 23 65  bMain, 0, 0);.#e
17a30 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20 54 63  ndif.    rc = Tc
17a40 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74  l_PkgProvide(int
17a50 65 72 70 2c 20 22 73 71 6c 69 74 65 33 22 2c 20  erp, "sqlite3", 
17a60 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29  PACKAGE_VERSION)
17a70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
17a80 63 3b 0a 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20  c;.}.EXTERN int 
17a90 54 63 6c 73 71 6c 69 74 65 33 5f 49 6e 69 74 28  Tclsqlite3_Init(
17aa0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
17ab0 72 70 29 7b 20 72 65 74 75 72 6e 20 53 71 6c 69  rp){ return Sqli
17ac0 74 65 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  te3_Init(interp)
17ad0 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 53  ; }.EXTERN int S
17ae0 71 6c 69 74 65 33 5f 55 6e 6c 6f 61 64 28 54 63  qlite3_Unload(Tc
17af0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
17b00 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 20 72 65  , int flags){ re
17b10 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 45  turn TCL_OK; }.E
17b20 58 54 45 52 4e 20 69 6e 74 20 54 63 6c 73 71 6c  XTERN int Tclsql
17b30 69 74 65 33 5f 55 6e 6c 6f 61 64 28 54 63 6c 5f  ite3_Unload(Tcl_
17b40 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
17b50 69 6e 74 20 66 6c 61 67 73 29 7b 20 72 65 74 75  int flags){ retu
17b60 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 0a 2f 2a  rn TCL_OK; }../*
17b70 20 42 65 63 61 75 73 65 20 69 74 20 61 63 63 65   Because it acce
17b80 73 73 65 73 20 74 68 65 20 66 69 6c 65 2d 73 79  sses the file-sy
17b90 73 74 65 6d 20 61 6e 64 20 75 73 65 73 20 70 65  stem and uses pe
17ba0 72 73 69 73 74 65 6e 74 20 73 74 61 74 65 2c 20  rsistent state, 
17bb0 53 51 4c 69 74 65 0a 2a 2a 20 69 73 20 6e 6f 74  SQLite.** is not
17bc0 20 63 6f 6e 73 69 64 65 72 65 64 20 61 70 70 72   considered appr
17bd0 6f 70 72 69 61 74 65 20 66 6f 72 20 73 61 66 65  opriate for safe
17be0 20 69 6e 74 65 72 70 72 65 74 65 72 73 2e 20 20   interpreters.  
17bf0 48 65 6e 63 65 2c 20 77 65 20 64 65 6c 69 62 65  Hence, we delibe
17c00 72 61 74 65 6c 79 0a 2a 2a 20 6f 6d 69 74 20 74  rately.** omit t
17c10 68 65 20 5f 53 61 66 65 49 6e 69 74 28 29 20 69  he _SafeInit() i
17c20 6e 74 65 72 66 61 63 65 73 2e 0a 2a 2f 0a 0a 23  nterfaces..*/..#
17c30 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 33 5f  ifndef SQLITE_3_
17c40 53 55 46 46 49 58 5f 4f 4e 4c 59 0a 69 6e 74 20  SUFFIX_ONLY.int 
17c50 53 71 6c 69 74 65 5f 49 6e 69 74 28 54 63 6c 5f  Sqlite_Init(Tcl_
17c60 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b  Interp *interp){
17c70 20 72 65 74 75 72 6e 20 53 71 6c 69 74 65 33 5f   return Sqlite3_
17c80 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a  Init(interp); }.
17c90 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 5f 49 6e  int Tclsqlite_In
17ca0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  it(Tcl_Interp *i
17cb0 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20 53  nterp){ return S
17cc0 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74 65  qlite3_Init(inte
17cd0 72 70 29 3b 20 7d 0a 69 6e 74 20 53 71 6c 69 74  rp); }.int Sqlit
17ce0 65 5f 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74  e_Unload(Tcl_Int
17cf0 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
17d00 20 66 6c 61 67 73 29 7b 20 72 65 74 75 72 6e 20   flags){ return 
17d10 54 43 4c 5f 4f 4b 3b 20 7d 0a 69 6e 74 20 54 63  TCL_OK; }.int Tc
17d20 6c 73 71 6c 69 74 65 5f 55 6e 6c 6f 61 64 28 54  lsqlite_Unload(T
17d30 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
17d40 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 20 72  p, int flags){ r
17d50 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a  eturn TCL_OK; }.
17d60 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 54  #endif..#ifdef T
17d70 43 4c 53 48 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  CLSH./**********
17d80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17d90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17da0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17dc0 2a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68  ***.** All of th
17dd0 65 20 63 6f 64 65 20 74 68 61 74 20 66 6f 6c 6c  e code that foll
17de0 6f 77 73 20 69 73 20 75 73 65 64 20 74 6f 20 62  ows is used to b
17df0 75 69 6c 64 20 73 74 61 6e 64 61 6c 6f 6e 65 20  uild standalone 
17e00 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 73  TCL interpreters
17e10 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 73 74 61  .** that are sta
17e20 74 69 63 61 6c 6c 79 20 6c 69 6e 6b 65 64 20 77  tically linked w
17e30 69 74 68 20 53 51 4c 69 74 65 2e 20 20 45 6e 61  ith SQLite.  Ena
17e40 62 6c 65 20 74 68 65 73 65 20 62 79 20 63 6f 6d  ble these by com
17e50 70 69 6c 69 6e 67 0a 2a 2a 20 77 69 74 68 20 2d  piling.** with -
17e60 44 54 43 4c 53 48 3d 6e 20 77 68 65 72 65 20 6e  DTCLSH=n where n
17e70 20 63 61 6e 20 62 65 20 31 20 6f 72 20 32 2e 20   can be 1 or 2. 
17e80 20 41 6e 20 6e 20 6f 66 20 31 20 67 65 6e 65 72   An n of 1 gener
17e90 61 74 65 73 20 61 20 73 74 61 6e 64 61 72 64 0a  ates a standard.
17ea0 2a 2a 20 74 63 6c 73 68 20 62 75 74 20 77 69 74  ** tclsh but wit
17eb0 68 20 53 51 4c 69 74 65 20 62 75 69 6c 74 20 69  h SQLite built i
17ec0 6e 2e 20 20 41 6e 20 6e 20 6f 66 20 32 20 67 65  n.  An n of 2 ge
17ed0 6e 65 72 61 74 65 73 20 74 68 65 20 53 51 4c 69  nerates the SQLi
17ee0 74 65 20 73 70 61 63 65 0a 2a 2a 20 61 6e 61 6c  te space.** anal
17ef0 79 73 69 73 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f  ysis program..*/
17f00 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
17f10 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65  LITE_TEST) || de
17f20 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 43 4c  fined(SQLITE_TCL
17f30 4d 44 35 29 0a 2f 2a 0a 20 2a 20 54 68 69 73 20  MD5)./*. * This 
17f40 63 6f 64 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  code implements 
17f50 74 68 65 20 4d 44 35 20 6d 65 73 73 61 67 65 2d  the MD5 message-
17f60 64 69 67 65 73 74 20 61 6c 67 6f 72 69 74 68 6d  digest algorithm
17f70 2e 0a 20 2a 20 54 68 65 20 61 6c 67 6f 72 69 74  .. * The algorit
17f80 68 6d 20 69 73 20 64 75 65 20 74 6f 20 52 6f 6e  hm is due to Ron
17f90 20 52 69 76 65 73 74 2e 20 20 54 68 69 73 20 63   Rivest.  This c
17fa0 6f 64 65 20 77 61 73 0a 20 2a 20 77 72 69 74 74  ode was. * writt
17fb0 65 6e 20 62 79 20 43 6f 6c 69 6e 20 50 6c 75 6d  en by Colin Plum
17fc0 62 20 69 6e 20 31 39 39 33 2c 20 6e 6f 20 63 6f  b in 1993, no co
17fd0 70 79 72 69 67 68 74 20 69 73 20 63 6c 61 69 6d  pyright is claim
17fe0 65 64 2e 0a 20 2a 20 54 68 69 73 20 63 6f 64 65  ed.. * This code
17ff0 20 69 73 20 69 6e 20 74 68 65 20 70 75 62 6c 69   is in the publi
18000 63 20 64 6f 6d 61 69 6e 3b 20 64 6f 20 77 69 74  c domain; do wit
18010 68 20 69 74 20 77 68 61 74 20 79 6f 75 20 77 69  h it what you wi
18020 73 68 2e 0a 20 2a 0a 20 2a 20 45 71 75 69 76 61  sh.. *. * Equiva
18030 6c 65 6e 74 20 63 6f 64 65 20 69 73 20 61 76 61  lent code is ava
18040 69 6c 61 62 6c 65 20 66 72 6f 6d 20 52 53 41 20  ilable from RSA 
18050 44 61 74 61 20 53 65 63 75 72 69 74 79 2c 20 49  Data Security, I
18060 6e 63 2e 0a 20 2a 20 54 68 69 73 20 63 6f 64 65  nc.. * This code
18070 20 68 61 73 20 62 65 65 6e 20 74 65 73 74 65 64   has been tested
18080 20 61 67 61 69 6e 73 74 20 74 68 61 74 2c 20 61   against that, a
18090 6e 64 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  nd is equivalent
180a0 2c 0a 20 2a 20 65 78 63 65 70 74 20 74 68 61 74  ,. * except that
180b0 20 79 6f 75 20 64 6f 6e 27 74 20 6e 65 65 64 20   you don't need 
180c0 74 6f 20 69 6e 63 6c 75 64 65 20 74 77 6f 20 70  to include two p
180d0 61 67 65 73 20 6f 66 20 6c 65 67 61 6c 65 73 65  ages of legalese
180e0 0a 20 2a 20 77 69 74 68 20 65 76 65 72 79 20 63  . * with every c
180f0 6f 70 79 2e 0a 20 2a 0a 20 2a 20 54 6f 20 63 6f  opy.. *. * To co
18100 6d 70 75 74 65 20 74 68 65 20 6d 65 73 73 61 67  mpute the messag
18110 65 20 64 69 67 65 73 74 20 6f 66 20 61 20 63 68  e digest of a ch
18120 75 6e 6b 20 6f 66 20 62 79 74 65 73 2c 20 64 65  unk of bytes, de
18130 63 6c 61 72 65 20 61 6e 0a 20 2a 20 4d 44 35 43  clare an. * MD5C
18140 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75 72 65  ontext structure
18150 2c 20 70 61 73 73 20 69 74 20 74 6f 20 4d 44 35  , pass it to MD5
18160 49 6e 69 74 2c 20 63 61 6c 6c 20 4d 44 35 55 70  Init, call MD5Up
18170 64 61 74 65 20 61 73 0a 20 2a 20 6e 65 65 64 65  date as. * neede
18180 64 20 6f 6e 20 62 75 66 66 65 72 73 20 66 75 6c  d on buffers ful
18190 6c 20 6f 66 20 62 79 74 65 73 2c 20 61 6e 64 20  l of bytes, and 
181a0 74 68 65 6e 20 63 61 6c 6c 20 4d 44 35 46 69 6e  then call MD5Fin
181b0 61 6c 2c 20 77 68 69 63 68 0a 20 2a 20 77 69 6c  al, which. * wil
181c0 6c 20 66 69 6c 6c 20 61 20 73 75 70 70 6c 69 65  l fill a supplie
181d0 64 20 31 36 2d 62 79 74 65 20 61 72 72 61 79 20  d 16-byte array 
181e0 77 69 74 68 20 74 68 65 20 64 69 67 65 73 74 2e  with the digest.
181f0 0a 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 49 66 20 63  . */../*. * If c
18200 6f 6d 70 69 6c 65 64 20 6f 6e 20 61 20 6d 61 63  ompiled on a mac
18210 68 69 6e 65 20 74 68 61 74 20 64 6f 65 73 6e 27  hine that doesn'
18220 74 20 68 61 76 65 20 61 20 33 32 2d 62 69 74 20  t have a 32-bit 
18230 69 6e 74 65 67 65 72 2c 0a 20 2a 20 79 6f 75 20  integer,. * you 
18240 6a 75 73 74 20 73 65 74 20 22 75 69 6e 74 33 32  just set "uint32
18250 22 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72  " to the appropr
18260 69 61 74 65 20 64 61 74 61 74 79 70 65 20 66 6f  iate datatype fo
18270 72 20 61 6e 0a 20 2a 20 75 6e 73 69 67 6e 65 64  r an. * unsigned
18280 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2e   32-bit integer.
18290 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20    For example:. 
182a0 2a 0a 20 2a 20 20 20 20 20 20 20 63 63 20 2d 44  *. *       cc -D
182b0 75 69 6e 74 33 32 3d 27 75 6e 73 69 67 6e 65 64  uint32='unsigned
182c0 20 6c 6f 6e 67 27 20 6d 64 35 2e 63 0a 20 2a 0a   long' md5.c. *.
182d0 20 2a 2f 0a 23 69 66 6e 64 65 66 20 75 69 6e 74   */.#ifndef uint
182e0 33 32 0a 23 20 20 64 65 66 69 6e 65 20 75 69 6e  32.#  define uin
182f0 74 33 32 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  t32 unsigned int
18300 0a 23 65 6e 64 69 66 0a 0a 73 74 72 75 63 74 20  .#endif..struct 
18310 4d 44 35 43 6f 6e 74 65 78 74 20 7b 0a 20 20 69  MD5Context {.  i
18320 6e 74 20 69 73 49 6e 69 74 3b 0a 20 20 75 69 6e  nt isInit;.  uin
18330 74 33 32 20 62 75 66 5b 34 5d 3b 0a 20 20 75 69  t32 buf[4];.  ui
18340 6e 74 33 32 20 62 69 74 73 5b 32 5d 3b 0a 20 20  nt32 bits[2];.  
18350 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e  unsigned char in
18360 5b 36 34 5d 3b 0a 7d 3b 0a 74 79 70 65 64 65 66  [64];.};.typedef
18370 20 73 74 72 75 63 74 20 4d 44 35 43 6f 6e 74 65   struct MD5Conte
18380 78 74 20 4d 44 35 43 6f 6e 74 65 78 74 3b 0a 0a  xt MD5Context;..
18390 2f 2a 0a 20 2a 20 4e 6f 74 65 3a 20 74 68 69 73  /*. * Note: this
183a0 20 63 6f 64 65 20 69 73 20 68 61 72 6d 6c 65 73   code is harmles
183b0 73 20 6f 6e 20 6c 69 74 74 6c 65 2d 65 6e 64 69  s on little-endi
183c0 61 6e 20 6d 61 63 68 69 6e 65 73 2e 0a 20 2a 2f  an machines.. */
183d0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 79 74  .static void byt
183e0 65 52 65 76 65 72 73 65 20 28 75 6e 73 69 67 6e  eReverse (unsign
183f0 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20 75 6e  ed char *buf, un
18400 73 69 67 6e 65 64 20 6c 6f 6e 67 73 29 7b 0a 20  signed longs){. 
18410 20 20 20 20 20 20 20 75 69 6e 74 33 32 20 74 3b         uint32 t;
18420 0a 20 20 20 20 20 20 20 20 64 6f 20 7b 0a 20 20  .        do {.  
18430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 20                t 
18440 3d 20 28 75 69 6e 74 33 32 29 28 28 75 6e 73 69  = (uint32)((unsi
18450 67 6e 65 64 29 62 75 66 5b 33 5d 3c 3c 38 20 7c  gned)buf[3]<<8 |
18460 20 62 75 66 5b 32 5d 29 20 3c 3c 20 31 36 20 7c   buf[2]) << 16 |
18470 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18480 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 75               ((u
18490 6e 73 69 67 6e 65 64 29 62 75 66 5b 31 5d 3c 3c  nsigned)buf[1]<<
184a0 38 20 7c 20 62 75 66 5b 30 5d 29 3b 0a 20 20 20  8 | buf[0]);.   
184b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 28 75               *(u
184c0 69 6e 74 33 32 20 2a 29 62 75 66 20 3d 20 74 3b  int32 *)buf = t;
184d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
184e0 20 62 75 66 20 2b 3d 20 34 3b 0a 20 20 20 20 20   buf += 4;.     
184f0 20 20 20 7d 20 77 68 69 6c 65 20 28 2d 2d 6c 6f     } while (--lo
18500 6e 67 73 29 3b 0a 7d 0a 2f 2a 20 54 68 65 20 66  ngs);.}./* The f
18510 6f 75 72 20 63 6f 72 65 20 66 75 6e 63 74 69 6f  our core functio
18520 6e 73 20 2d 20 46 31 20 69 73 20 6f 70 74 69 6d  ns - F1 is optim
18530 69 7a 65 64 20 73 6f 6d 65 77 68 61 74 20 2a 2f  ized somewhat */
18540 0a 0a 2f 2a 20 23 64 65 66 69 6e 65 20 46 31 28  ../* #define F1(
18550 78 2c 20 79 2c 20 7a 29 20 28 78 20 26 20 79 20  x, y, z) (x & y 
18560 7c 20 7e 78 20 26 20 7a 29 20 2a 2f 0a 23 64 65  | ~x & z) */.#de
18570 66 69 6e 65 20 46 31 28 78 2c 20 79 2c 20 7a 29  fine F1(x, y, z)
18580 20 28 7a 20 5e 20 28 78 20 26 20 28 79 20 5e 20   (z ^ (x & (y ^ 
18590 7a 29 29 29 0a 23 64 65 66 69 6e 65 20 46 32 28  z))).#define F2(
185a0 78 2c 20 79 2c 20 7a 29 20 46 31 28 7a 2c 20 78  x, y, z) F1(z, x
185b0 2c 20 79 29 0a 23 64 65 66 69 6e 65 20 46 33 28  , y).#define F3(
185c0 78 2c 20 79 2c 20 7a 29 20 28 78 20 5e 20 79 20  x, y, z) (x ^ y 
185d0 5e 20 7a 29 0a 23 64 65 66 69 6e 65 20 46 34 28  ^ z).#define F4(
185e0 78 2c 20 79 2c 20 7a 29 20 28 79 20 5e 20 28 78  x, y, z) (y ^ (x
185f0 20 7c 20 7e 7a 29 29 0a 0a 2f 2a 20 54 68 69 73   | ~z))../* This
18600 20 69 73 20 74 68 65 20 63 65 6e 74 72 61 6c 20   is the central 
18610 73 74 65 70 20 69 6e 20 74 68 65 20 4d 44 35 20  step in the MD5 
18620 61 6c 67 6f 72 69 74 68 6d 2e 20 2a 2f 0a 23 64  algorithm. */.#d
18630 65 66 69 6e 65 20 4d 44 35 53 54 45 50 28 66 2c  efine MD5STEP(f,
18640 20 77 2c 20 78 2c 20 79 2c 20 7a 2c 20 64 61 74   w, x, y, z, dat
18650 61 2c 20 73 29 20 5c 0a 20 20 20 20 20 20 20 20  a, s) \.        
18660 28 20 77 20 2b 3d 20 66 28 78 2c 20 79 2c 20 7a  ( w += f(x, y, z
18670 29 20 2b 20 64 61 74 61 2c 20 20 77 20 3d 20 77  ) + data,  w = w
18680 3c 3c 73 20 7c 20 77 3e 3e 28 33 32 2d 73 29 2c  <<s | w>>(32-s),
18690 20 20 77 20 2b 3d 20 78 20 29 0a 0a 2f 2a 0a 20    w += x )../*. 
186a0 2a 20 54 68 65 20 63 6f 72 65 20 6f 66 20 74 68  * The core of th
186b0 65 20 4d 44 35 20 61 6c 67 6f 72 69 74 68 6d 2c  e MD5 algorithm,
186c0 20 74 68 69 73 20 61 6c 74 65 72 73 20 61 6e 20   this alters an 
186d0 65 78 69 73 74 69 6e 67 20 4d 44 35 20 68 61 73  existing MD5 has
186e0 68 20 74 6f 0a 20 2a 20 72 65 66 6c 65 63 74 20  h to. * reflect 
186f0 74 68 65 20 61 64 64 69 74 69 6f 6e 20 6f 66 20  the addition of 
18700 31 36 20 6c 6f 6e 67 77 6f 72 64 73 20 6f 66 20  16 longwords of 
18710 6e 65 77 20 64 61 74 61 2e 20 20 4d 44 35 55 70  new data.  MD5Up
18720 64 61 74 65 20 62 6c 6f 63 6b 73 0a 20 2a 20 74  date blocks. * t
18730 68 65 20 64 61 74 61 20 61 6e 64 20 63 6f 6e 76  he data and conv
18740 65 72 74 73 20 62 79 74 65 73 20 69 6e 74 6f 20  erts bytes into 
18750 6c 6f 6e 67 77 6f 72 64 73 20 66 6f 72 20 74 68  longwords for th
18760 69 73 20 72 6f 75 74 69 6e 65 2e 0a 20 2a 2f 0a  is routine.. */.
18770 73 74 61 74 69 63 20 76 6f 69 64 20 4d 44 35 54  static void MD5T
18780 72 61 6e 73 66 6f 72 6d 28 75 69 6e 74 33 32 20  ransform(uint32 
18790 62 75 66 5b 34 5d 2c 20 63 6f 6e 73 74 20 75 69  buf[4], const ui
187a0 6e 74 33 32 20 69 6e 5b 31 36 5d 29 7b 0a 20 20  nt32 in[16]){.  
187b0 20 20 20 20 20 20 72 65 67 69 73 74 65 72 20 75        register u
187c0 69 6e 74 33 32 20 61 2c 20 62 2c 20 63 2c 20 64  int32 a, b, c, d
187d0 3b 0a 0a 20 20 20 20 20 20 20 20 61 20 3d 20 62  ;..        a = b
187e0 75 66 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 62  uf[0];.        b
187f0 20 3d 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20   = buf[1];.     
18800 20 20 20 63 20 3d 20 62 75 66 5b 32 5d 3b 0a 20     c = buf[2];. 
18810 20 20 20 20 20 20 20 64 20 3d 20 62 75 66 5b 33         d = buf[3
18820 5d 3b 0a 0a 20 20 20 20 20 20 20 20 4d 44 35 53  ];..        MD5S
18830 54 45 50 28 46 31 2c 20 61 2c 20 62 2c 20 63 2c  TEP(F1, a, b, c,
18840 20 64 2c 20 69 6e 5b 20 30 5d 2b 30 78 64 37 36   d, in[ 0]+0xd76
18850 61 61 34 37 38 2c 20 20 37 29 3b 0a 20 20 20 20  aa478,  7);.    
18860 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20      MD5STEP(F1, 
18870 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20  d, a, b, c, in[ 
18880 31 5d 2b 30 78 65 38 63 37 62 37 35 36 2c 20 31  1]+0xe8c7b756, 1
18890 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  2);.        MD5S
188a0 54 45 50 28 46 31 2c 20 63 2c 20 64 2c 20 61 2c  TEP(F1, c, d, a,
188b0 20 62 2c 20 69 6e 5b 20 32 5d 2b 30 78 32 34 32   b, in[ 2]+0x242
188c0 30 37 30 64 62 2c 20 31 37 29 3b 0a 20 20 20 20  070db, 17);.    
188d0 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20      MD5STEP(F1, 
188e0 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 20  b, c, d, a, in[ 
188f0 33 5d 2b 30 78 63 31 62 64 63 65 65 65 2c 20 32  3]+0xc1bdceee, 2
18900 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  2);.        MD5S
18910 54 45 50 28 46 31 2c 20 61 2c 20 62 2c 20 63 2c  TEP(F1, a, b, c,
18920 20 64 2c 20 69 6e 5b 20 34 5d 2b 30 78 66 35 37   d, in[ 4]+0xf57
18930 63 30 66 61 66 2c 20 20 37 29 3b 0a 20 20 20 20  c0faf,  7);.    
18940 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20      MD5STEP(F1, 
18950 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20  d, a, b, c, in[ 
18960 35 5d 2b 30 78 34 37 38 37 63 36 32 61 2c 20 31  5]+0x4787c62a, 1
18970 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  2);.        MD5S
18980 54 45 50 28 46 31 2c 20 63 2c 20 64 2c 20 61 2c  TEP(F1, c, d, a,
18990 20 62 2c 20 69 6e 5b 20 36 5d 2b 30 78 61 38 33   b, in[ 6]+0xa83
189a0 30 34 36 31 33 2c 20 31 37 29 3b 0a 20 20 20 20  04613, 17);.    
189b0 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20      MD5STEP(F1, 
189c0 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 20  b, c, d, a, in[ 
189d0 37 5d 2b 30 78 66 64 34 36 39 35 30 31 2c 20 32  7]+0xfd469501, 2
189e0 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  2);.        MD5S
189f0 54 45 50 28 46 31 2c 20 61 2c 20 62 2c 20 63 2c  TEP(F1, a, b, c,
18a00 20 64 2c 20 69 6e 5b 20 38 5d 2b 30 78 36 39 38   d, in[ 8]+0x698
18a10 30 39 38 64 38 2c 20 20 37 29 3b 0a 20 20 20 20  098d8,  7);.    
18a20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20      MD5STEP(F1, 
18a30 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20  d, a, b, c, in[ 
18a40 39 5d 2b 30 78 38 62 34 34 66 37 61 66 2c 20 31  9]+0x8b44f7af, 1
18a50 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  2);.        MD5S
18a60 54 45 50 28 46 31 2c 20 63 2c 20 64 2c 20 61 2c  TEP(F1, c, d, a,
18a70 20 62 2c 20 69 6e 5b 31 30 5d 2b 30 78 66 66 66   b, in[10]+0xfff
18a80 66 35 62 62 31 2c 20 31 37 29 3b 0a 20 20 20 20  f5bb1, 17);.    
18a90 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20      MD5STEP(F1, 
18aa0 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 31  b, c, d, a, in[1
18ab0 31 5d 2b 30 78 38 39 35 63 64 37 62 65 2c 20 32  1]+0x895cd7be, 2
18ac0 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  2);.        MD5S
18ad0 54 45 50 28 46 31 2c 20 61 2c 20 62 2c 20 63 2c  TEP(F1, a, b, c,
18ae0 20 64 2c 20 69 6e 5b 31 32 5d 2b 30 78 36 62 39   d, in[12]+0x6b9
18af0 30 31 31 32 32 2c 20 20 37 29 3b 0a 20 20 20 20  01122,  7);.    
18b00 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20      MD5STEP(F1, 
18b10 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 31  d, a, b, c, in[1
18b20 33 5d 2b 30 78 66 64 39 38 37 31 39 33 2c 20 31  3]+0xfd987193, 1
18b30 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  2);.        MD5S
18b40 54 45 50 28 46 31 2c 20 63 2c 20 64 2c 20 61 2c  TEP(F1, c, d, a,
18b50 20 62 2c 20 69 6e 5b 31 34 5d 2b 30 78 61 36 37   b, in[14]+0xa67
18b60 39 34 33 38 65 2c 20 31 37 29 3b 0a 20 20 20 20  9438e, 17);.    
18b70 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20      MD5STEP(F1, 
18b80 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 31  b, c, d, a, in[1
18b90 35 5d 2b 30 78 34 39 62 34 30 38 32 31 2c 20 32  5]+0x49b40821, 2
18ba0 32 29 3b 0a 0a 20 20 20 20 20 20 20 20 4d 44 35  2);..        MD5
18bb0 53 54 45 50 28 46 32 2c 20 61 2c 20 62 2c 20 63  STEP(F2, a, b, c
18bc0 2c 20 64 2c 20 69 6e 5b 20 31 5d 2b 30 78 66 36  , d, in[ 1]+0xf6
18bd0 31 65 32 35 36 32 2c 20 20 35 29 3b 0a 20 20 20  1e2562,  5);.   
18be0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c       MD5STEP(F2,
18bf0 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b   d, a, b, c, in[
18c00 20 36 5d 2b 30 78 63 30 34 30 62 33 34 30 2c 20   6]+0xc040b340, 
18c10 20 39 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35   9);.        MD5
18c20 53 54 45 50 28 46 32 2c 20 63 2c 20 64 2c 20 61  STEP(F2, c, d, a
18c30 2c 20 62 2c 20 69 6e 5b 31 31 5d 2b 30 78 32 36  , b, in[11]+0x26
18c40 35 65 35 61 35 31 2c 20 31 34 29 3b 0a 20 20 20  5e5a51, 14);.   
18c50 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c       MD5STEP(F2,
18c60 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b   b, c, d, a, in[
18c70 20 30 5d 2b 30 78 65 39 62 36 63 37 61 61 2c 20   0]+0xe9b6c7aa, 
18c80 32 30 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  20);.        MD5
18c90 53 54 45 50 28 46 32 2c 20 61 2c 20 62 2c 20 63  STEP(F2, a, b, c
18ca0 2c 20 64 2c 20 69 6e 5b 20 35 5d 2b 30 78 64 36  , d, in[ 5]+0xd6
18cb0 32 66 31 30 35 64 2c 20 20 35 29 3b 0a 20 20 20  2f105d,  5);.   
18cc0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c       MD5STEP(F2,
18cd0 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b   d, a, b, c, in[
18ce0 31 30 5d 2b 30 78 30 32 34 34 31 34 35 33 2c 20  10]+0x02441453, 
18cf0 20 39 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35   9);.        MD5
18d00 53 54 45 50 28 46 32 2c 20 63 2c 20 64 2c 20 61  STEP(F2, c, d, a
18d10 2c 20 62 2c 20 69 6e 5b 31 35 5d 2b 30 78 64 38  , b, in[15]+0xd8
18d20 61 31 65 36 38 31 2c 20 31 34 29 3b 0a 20 20 20  a1e681, 14);.   
18d30 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c       MD5STEP(F2,
18d40 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b   b, c, d, a, in[
18d50 20 34 5d 2b 30 78 65 37 64 33 66 62 63 38 2c 20   4]+0xe7d3fbc8, 
18d60 32 30 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  20);.        MD5
18d70 53 54 45 50 28 46 32 2c 20 61 2c 20 62 2c 20 63  STEP(F2, a, b, c
18d80 2c 20 64 2c 20 69 6e 5b 20 39 5d 2b 30 78 32 31  , d, in[ 9]+0x21
18d90 65 31 63 64 65 36 2c 20 20 35 29 3b 0a 20 20 20  e1cde6,  5);.   
18da0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c       MD5STEP(F2,
18db0 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b   d, a, b, c, in[
18dc0 31 34 5d 2b 30 78 63 33 33 37 30 37 64 36 2c 20  14]+0xc33707d6, 
18dd0 20 39 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35   9);.        MD5
18de0 53 54 45 50 28 46 32 2c 20 63 2c 20 64 2c 20 61  STEP(F2, c, d, a
18df0 2c 20 62 2c 20 69 6e 5b 20 33 5d 2b 30 78 66 34  , b, in[ 3]+0xf4
18e00 64 35 30 64 38 37 2c 20 31 34 29 3b 0a 20 20 20  d50d87, 14);.   
18e10 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c       MD5STEP(F2,
18e20 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b   b, c, d, a, in[
18e30 20 38 5d 2b 30 78 34 35 35 61 31 34 65 64 2c 20   8]+0x455a14ed, 
18e40 32 30 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  20);.        MD5
18e50 53 54 45 50 28 46 32 2c 20 61 2c 20 62 2c 20 63  STEP(F2, a, b, c
18e60 2c 20 64 2c 20 69 6e 5b 31 33 5d 2b 30 78 61 39  , d, in[13]+0xa9
18e70 65 33 65 39 30 35 2c 20 20 35 29 3b 0a 20 20 20  e3e905,  5);.   
18e80 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c       MD5STEP(F2,
18e90 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b   d, a, b, c, in[
18ea0 20 32 5d 2b 30 78 66 63 65 66 61 33 66 38 2c 20   2]+0xfcefa3f8, 
18eb0 20 39 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35   9);.        MD5
18ec0 53 54 45 50 28 46 32 2c 20 63 2c 20 64 2c 20 61  STEP(F2, c, d, a
18ed0 2c 20 62 2c 20 69 6e 5b 20 37 5d 2b 30 78 36 37  , b, in[ 7]+0x67
18ee0 36 66 30 32 64 39 2c 20 31 34 29 3b 0a 20 20 20  6f02d9, 14);.   
18ef0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c       MD5STEP(F2,
18f00 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b   b, c, d, a, in[
18f10 31 32 5d 2b 30 78 38 64 32 61 34 63 38 61 2c 20  12]+0x8d2a4c8a, 
18f20 32 30 29 3b 0a 0a 20 20 20 20 20 20 20 20 4d 44  20);..        MD
18f30 35 53 54 45 50 28 46 33 2c 20 61 2c 20 62 2c 20  5STEP(F3, a, b, 
18f40 63 2c 20 64 2c 20 69 6e 5b 20 35 5d 2b 30 78 66  c, d, in[ 5]+0xf
18f50 66 66 61 33 39 34 32 2c 20 20 34 29 3b 0a 20 20  ffa3942,  4);.  
18f60 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33        MD5STEP(F3
18f70 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e  , d, a, b, c, in
18f80 5b 20 38 5d 2b 30 78 38 37 37 31 66 36 38 31 2c  [ 8]+0x8771f681,
18f90 20 31 31 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   11);.        MD
18fa0 35 53 54 45 50 28 46 33 2c 20 63 2c 20 64 2c 20  5STEP(F3, c, d, 
18fb0 61 2c 20 62 2c 20 69 6e 5b 31 31 5d 2b 30 78 36  a, b, in[11]+0x6
18fc0 64 39 64 36 31 32 32 2c 20 31 36 29 3b 0a 20 20  d9d6122, 16);.  
18fd0 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33        MD5STEP(F3
18fe0 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
18ff0 5b 31 34 5d 2b 30 78 66 64 65 35 33 38 30 63 2c  [14]+0xfde5380c,
19000 20 32 33 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   23);.        MD
19010 35 53 54 45 50 28 46 33 2c 20 61 2c 20 62 2c 20  5STEP(F3, a, b, 
19020 63 2c 20 64 2c 20 69 6e 5b 20 31 5d 2b 30 78 61  c, d, in[ 1]+0xa
19030 34 62 65 65 61 34 34 2c 20 20 34 29 3b 0a 20 20  4beea44,  4);.  
19040 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33        MD5STEP(F3
19050 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e  , d, a, b, c, in
19060 5b 20 34 5d 2b 30 78 34 62 64 65 63 66 61 39 2c  [ 4]+0x4bdecfa9,
19070 20 31 31 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   11);.        MD
19080 35 53 54 45 50 28 46 33 2c 20 63 2c 20 64 2c 20  5STEP(F3, c, d, 
19090 61 2c 20 62 2c 20 69 6e 5b 20 37 5d 2b 30 78 66  a, b, in[ 7]+0xf
190a0 36 62 62 34 62 36 30 2c 20 31 36 29 3b 0a 20 20  6bb4b60, 16);.  
190b0 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33        MD5STEP(F3
190c0 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
190d0 5b 31 30 5d 2b 30 78 62 65 62 66 62 63 37 30 2c  [10]+0xbebfbc70,
190e0 20 32 33 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   23);.        MD
190f0 35 53 54 45 50 28 46 33 2c 20 61 2c 20 62 2c 20  5STEP(F3, a, b, 
19100 63 2c 20 64 2c 20 69 6e 5b 31 33 5d 2b 30 78 32  c, d, in[13]+0x2
19110 38 39 62 37 65 63 36 2c 20 20 34 29 3b 0a 20 20  89b7ec6,  4);.  
19120 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33        MD5STEP(F3
19130 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e  , d, a, b, c, in
19140 5b 20 30 5d 2b 30 78 65 61 61 31 32 37 66 61 2c  [ 0]+0xeaa127fa,
19150 20 31 31 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   11);.        MD
19160 35 53 54 45 50 28 46 33 2c 20 63 2c 20 64 2c 20  5STEP(F3, c, d, 
19170 61 2c 20 62 2c 20 69 6e 5b 20 33 5d 2b 30 78 64  a, b, in[ 3]+0xd
19180 34 65 66 33 30 38 35 2c 20 31 36 29 3b 0a 20 20  4ef3085, 16);.  
19190 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33        MD5STEP(F3
191a0 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
191b0 5b 20 36 5d 2b 30 78 30 34 38 38 31 64 30 35 2c  [ 6]+0x04881d05,
191c0 20 32 33 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   23);.        MD
191d0 35 53 54 45 50 28 46 33 2c 20 61 2c 20 62 2c 20  5STEP(F3, a, b, 
191e0 63 2c 20 64 2c 20 69 6e 5b 20 39 5d 2b 30 78 64  c, d, in[ 9]+0xd
191f0 39 64 34 64 30 33 39 2c 20 20 34 29 3b 0a 20 20  9d4d039,  4);.  
19200 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33        MD5STEP(F3
19210 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e  , d, a, b, c, in
19220 5b 31 32 5d 2b 30 78 65 36 64 62 39 39 65 35 2c  [12]+0xe6db99e5,
19230 20 31 31 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   11);.        MD
19240 35 53 54 45 50 28 46 33 2c 20 63 2c 20 64 2c 20  5STEP(F3, c, d, 
19250 61 2c 20 62 2c 20 69 6e 5b 31 35 5d 2b 30 78 31  a, b, in[15]+0x1
19260 66 61 32 37 63 66 38 2c 20 31 36 29 3b 0a 20 20  fa27cf8, 16);.  
19270 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33        MD5STEP(F3
19280 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
19290 5b 20 32 5d 2b 30 78 63 34 61 63 35 36 36 35 2c  [ 2]+0xc4ac5665,
192a0 20 32 33 29 3b 0a 0a 20 20 20 20 20 20 20 20 4d   23);..        M
192b0 44 35 53 54 45 50 28 46 34 2c 20 61 2c 20 62 2c  D5STEP(F4, a, b,
192c0 20 63 2c 20 64 2c 20 69 6e 5b 20 30 5d 2b 30 78   c, d, in[ 0]+0x
192d0 66 34 32 39 32 32 34 34 2c 20 20 36 29 3b 0a 20  f4292244,  6);. 
192e0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
192f0 34 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69  4, d, a, b, c, i
19300 6e 5b 20 37 5d 2b 30 78 34 33 32 61 66 66 39 37  n[ 7]+0x432aff97
19310 2c 20 31 30 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 10);.        M
19320 44 35 53 54 45 50 28 46 34 2c 20 63 2c 20 64 2c  D5STEP(F4, c, d,
19330 20 61 2c 20 62 2c 20 69 6e 5b 31 34 5d 2b 30 78   a, b, in[14]+0x
19340 61 62 39 34 32 33 61 37 2c 20 31 35 29 3b 0a 20  ab9423a7, 15);. 
19350 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
19360 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  4, b, c, d, a, i
19370 6e 5b 20 35 5d 2b 30 78 66 63 39 33 61 30 33 39  n[ 5]+0xfc93a039
19380 2c 20 32 31 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 21);.        M
19390 44 35 53 54 45 50 28 46 34 2c 20 61 2c 20 62 2c  D5STEP(F4, a, b,
193a0 20 63 2c 20 64 2c 20 69 6e 5b 31 32 5d 2b 30 78   c, d, in[12]+0x
193b0 36 35 35 62 35 39 63 33 2c 20 20 36 29 3b 0a 20  655b59c3,  6);. 
193c0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
193d0 34 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69  4, d, a, b, c, i
193e0 6e 5b 20 33 5d 2b 30 78 38 66 30 63 63 63 39 32  n[ 3]+0x8f0ccc92
193f0 2c 20 31 30 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 10);.        M
19400 44 35 53 54 45 50 28 46 34 2c 20 63 2c 20 64 2c  D5STEP(F4, c, d,
19410 20 61 2c 20 62 2c 20 69 6e 5b 31 30 5d 2b 30 78   a, b, in[10]+0x
19420 66 66 65 66 66 34 37 64 2c 20 31 35 29 3b 0a 20  ffeff47d, 15);. 
19430 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
19440 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  4, b, c, d, a, i
19450 6e 5b 20 31 5d 2b 30 78 38 35 38 34 35 64 64 31  n[ 1]+0x85845dd1
19460 2c 20 32 31 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 21);.        M
19470 44 35 53 54 45 50 28 46 34 2c 20 61 2c 20 62 2c  D5STEP(F4, a, b,
19480 20 63 2c 20 64 2c 20 69 6e 5b 20 38 5d 2b 30 78   c, d, in[ 8]+0x
19490 36 66 61 38 37 65 34 66 2c 20 20 36 29 3b 0a 20  6fa87e4f,  6);. 
194a0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
194b0 34 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69  4, d, a, b, c, i
194c0 6e 5b 31 35 5d 2b 30 78 66 65 32 63 65 36 65 30  n[15]+0xfe2ce6e0
194d0 2c 20 31 30 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 10);.        M
194e0 44 35 53 54 45 50 28 46 34 2c 20 63 2c 20 64 2c  D5STEP(F4, c, d,
194f0 20 61 2c 20 62 2c 20 69 6e 5b 20 36 5d 2b 30 78   a, b, in[ 6]+0x
19500 61 33 30 31 34 33 31 34 2c 20 31 35 29 3b 0a 20  a3014314, 15);. 
19510 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
19520 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  4, b, c, d, a, i
19530 6e 5b 31 33 5d 2b 30 78 34 65 30 38 31 31 61 31  n[13]+0x4e0811a1
19540 2c 20 32 31 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 21);.        M
19550 44 35 53 54 45 50 28 46 34 2c 20 61 2c 20 62 2c  D5STEP(F4, a, b,
19560 20 63 2c 20 64 2c 20 69 6e 5b 20 34 5d 2b 30 78   c, d, in[ 4]+0x
19570 66 37 35 33 37 65 38 32 2c 20 20 36 29 3b 0a 20  f7537e82,  6);. 
19580 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
19590 34 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69  4, d, a, b, c, i
195a0 6e 5b 31 31 5d 2b 30 78 62 64 33 61 66 32 33 35  n[11]+0xbd3af235
195b0 2c 20 31 30 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 10);.        M
195c0 44 35 53 54 45 50 28 46 34 2c 20 63 2c 20 64 2c  D5STEP(F4, c, d,
195d0 20 61 2c 20 62 2c 20 69 6e 5b 20 32 5d 2b 30 78   a, b, in[ 2]+0x
195e0 32 61 64 37 64 32 62 62 2c 20 31 35 29 3b 0a 20  2ad7d2bb, 15);. 
195f0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
19600 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  4, b, c, d, a, i
19610 6e 5b 20 39 5d 2b 30 78 65 62 38 36 64 33 39 31  n[ 9]+0xeb86d391
19620 2c 20 32 31 29 3b 0a 0a 20 20 20 20 20 20 20 20  , 21);..        
19630 62 75 66 5b 30 5d 20 2b 3d 20 61 3b 0a 20 20 20  buf[0] += a;.   
19640 20 20 20 20 20 62 75 66 5b 31 5d 20 2b 3d 20 62       buf[1] += b
19650 3b 0a 20 20 20 20 20 20 20 20 62 75 66 5b 32 5d  ;.        buf[2]
19660 20 2b 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 62   += c;.        b
19670 75 66 5b 33 5d 20 2b 3d 20 64 3b 0a 7d 0a 0a 2f  uf[3] += d;.}../
19680 2a 0a 20 2a 20 53 74 61 72 74 20 4d 44 35 20 61  *. * Start MD5 a
19690 63 63 75 6d 75 6c 61 74 69 6f 6e 2e 20 20 53 65  ccumulation.  Se
196a0 74 20 62 69 74 20 63 6f 75 6e 74 20 74 6f 20 30  t bit count to 0
196b0 20 61 6e 64 20 62 75 66 66 65 72 20 74 6f 20 6d   and buffer to m
196c0 79 73 74 65 72 69 6f 75 73 0a 20 2a 20 69 6e 69  ysterious. * ini
196d0 74 69 61 6c 69 7a 61 74 69 6f 6e 20 63 6f 6e 73  tialization cons
196e0 74 61 6e 74 73 2e 0a 20 2a 2f 0a 73 74 61 74 69  tants.. */.stati
196f0 63 20 76 6f 69 64 20 4d 44 35 49 6e 69 74 28 4d  c void MD5Init(M
19700 44 35 43 6f 6e 74 65 78 74 20 2a 63 74 78 29 7b  D5Context *ctx){
19710 0a 20 20 20 20 20 20 20 20 63 74 78 2d 3e 69 73  .        ctx->is
19720 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  Init = 1;.      
19730 20 20 63 74 78 2d 3e 62 75 66 5b 30 5d 20 3d 20    ctx->buf[0] = 
19740 30 78 36 37 34 35 32 33 30 31 3b 0a 20 20 20 20  0x67452301;.    
19750 20 20 20 20 63 74 78 2d 3e 62 75 66 5b 31 5d 20      ctx->buf[1] 
19760 3d 20 30 78 65 66 63 64 61 62 38 39 3b 0a 20 20  = 0xefcdab89;.  
19770 20 20 20 20 20 20 63 74 78 2d 3e 62 75 66 5b 32        ctx->buf[2
19780 5d 20 3d 20 30 78 39 38 62 61 64 63 66 65 3b 0a  ] = 0x98badcfe;.
19790 20 20 20 20 20 20 20 20 63 74 78 2d 3e 62 75 66          ctx->buf
197a0 5b 33 5d 20 3d 20 30 78 31 30 33 32 35 34 37 36  [3] = 0x10325476
197b0 3b 0a 20 20 20 20 20 20 20 20 63 74 78 2d 3e 62  ;.        ctx->b
197c0 69 74 73 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  its[0] = 0;.    
197d0 20 20 20 20 63 74 78 2d 3e 62 69 74 73 5b 31 5d      ctx->bits[1]
197e0 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 55   = 0;.}../*. * U
197f0 70 64 61 74 65 20 63 6f 6e 74 65 78 74 20 74 6f  pdate context to
19800 20 72 65 66 6c 65 63 74 20 74 68 65 20 63 6f 6e   reflect the con
19810 63 61 74 65 6e 61 74 69 6f 6e 20 6f 66 20 61 6e  catenation of an
19820 6f 74 68 65 72 20 62 75 66 66 65 72 20 66 75 6c  other buffer ful
19830 6c 0a 20 2a 20 6f 66 20 62 79 74 65 73 2e 0a 20  l. * of bytes.. 
19840 2a 2f 0a 73 74 61 74 69 63 20 0a 76 6f 69 64 20  */.static .void 
19850 4d 44 35 55 70 64 61 74 65 28 4d 44 35 43 6f 6e  MD5Update(MD5Con
19860 74 65 78 74 20 2a 63 74 78 2c 20 63 6f 6e 73 74  text *ctx, const
19870 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
19880 62 75 66 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e  buf, unsigned in
19890 74 20 6c 65 6e 29 7b 0a 20 20 20 20 20 20 20 20  t len){.        
198a0 75 69 6e 74 33 32 20 74 3b 0a 0a 20 20 20 20 20  uint32 t;..     
198b0 20 20 20 2f 2a 20 55 70 64 61 74 65 20 62 69 74     /* Update bit
198c0 63 6f 75 6e 74 20 2a 2f 0a 0a 20 20 20 20 20 20  count */..      
198d0 20 20 74 20 3d 20 63 74 78 2d 3e 62 69 74 73 5b    t = ctx->bits[
198e0 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28  0];.        if (
198f0 28 63 74 78 2d 3e 62 69 74 73 5b 30 5d 20 3d 20  (ctx->bits[0] = 
19900 74 20 2b 20 28 28 75 69 6e 74 33 32 29 6c 65 6e  t + ((uint32)len
19910 20 3c 3c 20 33 29 29 20 3c 20 74 29 0a 20 20 20   << 3)) < t).   
19920 20 20 20 20 20 20 20 20 20 20 20 20 20 63 74 78               ctx
19930 2d 3e 62 69 74 73 5b 31 5d 2b 2b 3b 20 2f 2a 20  ->bits[1]++; /* 
19940 43 61 72 72 79 20 66 72 6f 6d 20 6c 6f 77 20 74  Carry from low t
19950 6f 20 68 69 67 68 20 2a 2f 0a 20 20 20 20 20 20  o high */.      
19960 20 20 63 74 78 2d 3e 62 69 74 73 5b 31 5d 20 2b    ctx->bits[1] +
19970 3d 20 6c 65 6e 20 3e 3e 20 32 39 3b 0a 0a 20 20  = len >> 29;..  
19980 20 20 20 20 20 20 74 20 3d 20 28 74 20 3e 3e 20        t = (t >> 
19990 33 29 20 26 20 30 78 33 66 3b 20 20 20 20 2f 2a  3) & 0x3f;    /*
199a0 20 42 79 74 65 73 20 61 6c 72 65 61 64 79 20 69   Bytes already i
199b0 6e 20 73 68 73 49 6e 66 6f 2d 3e 64 61 74 61 20  n shsInfo->data 
199c0 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 48  */..        /* H
199d0 61 6e 64 6c 65 20 61 6e 79 20 6c 65 61 64 69 6e  andle any leadin
199e0 67 20 6f 64 64 2d 73 69 7a 65 64 20 63 68 75 6e  g odd-sized chun
199f0 6b 73 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 69  ks */..        i
19a00 66 20 28 20 74 20 29 20 7b 0a 20 20 20 20 20 20  f ( t ) {.      
19a10 20 20 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e            unsign
19a20 65 64 20 63 68 61 72 20 2a 70 20 3d 20 28 75 6e  ed char *p = (un
19a30 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 63 74  signed char *)ct
19a40 78 2d 3e 69 6e 20 2b 20 74 3b 0a 0a 20 20 20 20  x->in + t;..    
19a50 20 20 20 20 20 20 20 20 20 20 20 20 74 20 3d 20              t = 
19a60 36 34 2d 74 3b 0a 20 20 20 20 20 20 20 20 20 20  64-t;.          
19a70 20 20 20 20 20 20 69 66 20 28 6c 65 6e 20 3c 20        if (len < 
19a80 74 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t) {.           
19a90 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d               mem
19aa0 63 70 79 28 70 2c 20 62 75 66 2c 20 6c 65 6e 29  cpy(p, buf, len)
19ab0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
19ac0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
19ad0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
19ae0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
19af0 20 20 20 20 6d 65 6d 63 70 79 28 70 2c 20 62 75      memcpy(p, bu
19b00 66 2c 20 74 29 3b 0a 20 20 20 20 20 20 20 20 20  f, t);.         
19b10 20 20 20 20 20 20 20 62 79 74 65 52 65 76 65 72         byteRever
19b20 73 65 28 63 74 78 2d 3e 69 6e 2c 20 31 36 29 3b  se(ctx->in, 16);
19b30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19b40 20 4d 44 35 54 72 61 6e 73 66 6f 72 6d 28 63 74   MD5Transform(ct
19b50 78 2d 3e 62 75 66 2c 20 28 75 69 6e 74 33 32 20  x->buf, (uint32 
19b60 2a 29 63 74 78 2d 3e 69 6e 29 3b 0a 20 20 20 20  *)ctx->in);.    
19b70 20 20 20 20 20 20 20 20 20 20 20 20 62 75 66 20              buf 
19b80 2b 3d 20 74 3b 0a 20 20 20 20 20 20 20 20 20 20  += t;.          
19b90 20 20 20 20 20 20 6c 65 6e 20 2d 3d 20 74 3b 0a        len -= t;.
19ba0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
19bb0 20 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 64 61     /* Process da
19bc0 74 61 20 69 6e 20 36 34 2d 62 79 74 65 20 63 68  ta in 64-byte ch
19bd0 75 6e 6b 73 20 2a 2f 0a 0a 20 20 20 20 20 20 20  unks */..       
19be0 20 77 68 69 6c 65 20 28 6c 65 6e 20 3e 3d 20 36   while (len >= 6
19bf0 34 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  4) {.           
19c00 20 20 20 20 20 6d 65 6d 63 70 79 28 63 74 78 2d       memcpy(ctx-
19c10 3e 69 6e 2c 20 62 75 66 2c 20 36 34 29 3b 0a 20  >in, buf, 64);. 
19c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
19c30 79 74 65 52 65 76 65 72 73 65 28 63 74 78 2d 3e  yteReverse(ctx->
19c40 69 6e 2c 20 31 36 29 3b 0a 20 20 20 20 20 20 20  in, 16);.       
19c50 20 20 20 20 20 20 20 20 20 4d 44 35 54 72 61 6e           MD5Tran
19c60 73 66 6f 72 6d 28 63 74 78 2d 3e 62 75 66 2c 20  sform(ctx->buf, 
19c70 28 75 69 6e 74 33 32 20 2a 29 63 74 78 2d 3e 69  (uint32 *)ctx->i
19c80 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
19c90 20 20 20 20 62 75 66 20 2b 3d 20 36 34 3b 0a 20      buf += 64;. 
19ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
19cb0 65 6e 20 2d 3d 20 36 34 3b 0a 20 20 20 20 20 20  en -= 64;.      
19cc0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
19cd0 48 61 6e 64 6c 65 20 61 6e 79 20 72 65 6d 61 69  Handle any remai
19ce0 6e 69 6e 67 20 62 79 74 65 73 20 6f 66 20 64 61  ning bytes of da
19cf0 74 61 2e 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ta. */..        
19d00 6d 65 6d 63 70 79 28 63 74 78 2d 3e 69 6e 2c 20  memcpy(ctx->in, 
19d10 62 75 66 2c 20 6c 65 6e 29 3b 0a 7d 0a 0a 2f 2a  buf, len);.}../*
19d20 0a 20 2a 20 46 69 6e 61 6c 20 77 72 61 70 75 70  . * Final wrapup
19d30 20 2d 20 70 61 64 20 74 6f 20 36 34 2d 62 79 74   - pad to 64-byt
19d40 65 20 62 6f 75 6e 64 61 72 79 20 77 69 74 68 20  e boundary with 
19d50 74 68 65 20 62 69 74 20 70 61 74 74 65 72 6e 20  the bit pattern 
19d60 0a 20 2a 20 31 20 30 2a 20 28 36 34 2d 62 69 74  . * 1 0* (64-bit
19d70 20 63 6f 75 6e 74 20 6f 66 20 62 69 74 73 20 70   count of bits p
19d80 72 6f 63 65 73 73 65 64 2c 20 4d 53 42 2d 66 69  rocessed, MSB-fi
19d90 72 73 74 29 0a 20 2a 2f 0a 73 74 61 74 69 63 20  rst). */.static 
19da0 76 6f 69 64 20 4d 44 35 46 69 6e 61 6c 28 75 6e  void MD5Final(un
19db0 73 69 67 6e 65 64 20 63 68 61 72 20 64 69 67 65  signed char dige
19dc0 73 74 5b 31 36 5d 2c 20 4d 44 35 43 6f 6e 74 65  st[16], MD5Conte
19dd0 78 74 20 2a 63 74 78 29 7b 0a 20 20 20 20 20 20  xt *ctx){.      
19de0 20 20 75 6e 73 69 67 6e 65 64 20 63 6f 75 6e 74    unsigned count
19df0 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e  ;.        unsign
19e00 65 64 20 63 68 61 72 20 2a 70 3b 0a 0a 20 20 20  ed char *p;..   
19e10 20 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20       /* Compute 
19e20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
19e30 6d 6f 64 20 36 34 20 2a 2f 0a 20 20 20 20 20 20  mod 64 */.      
19e40 20 20 63 6f 75 6e 74 20 3d 20 28 63 74 78 2d 3e    count = (ctx->
19e50 62 69 74 73 5b 30 5d 20 3e 3e 20 33 29 20 26 20  bits[0] >> 3) & 
19e60 30 78 33 46 3b 0a 0a 20 20 20 20 20 20 20 20 2f  0x3F;..        /
19e70 2a 20 53 65 74 20 74 68 65 20 66 69 72 73 74 20  * Set the first 
19e80 63 68 61 72 20 6f 66 20 70 61 64 64 69 6e 67 20  char of padding 
19e90 74 6f 20 30 78 38 30 2e 20 20 54 68 69 73 20 69  to 0x80.  This i
19ea0 73 20 73 61 66 65 20 73 69 6e 63 65 20 74 68 65  s safe since the
19eb0 72 65 20 69 73 0a 20 20 20 20 20 20 20 20 20 20  re is.          
19ec0 20 61 6c 77 61 79 73 20 61 74 20 6c 65 61 73 74   always at least
19ed0 20 6f 6e 65 20 62 79 74 65 20 66 72 65 65 20 2a   one byte free *
19ee0 2f 0a 20 20 20 20 20 20 20 20 70 20 3d 20 63 74  /.        p = ct
19ef0 78 2d 3e 69 6e 20 2b 20 63 6f 75 6e 74 3b 0a 20  x->in + count;. 
19f00 20 20 20 20 20 20 20 2a 70 2b 2b 20 3d 20 30 78         *p++ = 0x
19f10 38 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  80;..        /* 
19f20 42 79 74 65 73 20 6f 66 20 70 61 64 64 69 6e 67  Bytes of padding
19f30 20 6e 65 65 64 65 64 20 74 6f 20 6d 61 6b 65 20   needed to make 
19f40 36 34 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20  64 bytes */.    
19f50 20 20 20 20 63 6f 75 6e 74 20 3d 20 36 34 20 2d      count = 64 -
19f60 20 31 20 2d 20 63 6f 75 6e 74 3b 0a 0a 20 20 20   1 - count;..   
19f70 20 20 20 20 20 2f 2a 20 50 61 64 20 6f 75 74 20       /* Pad out 
19f80 74 6f 20 35 36 20 6d 6f 64 20 36 34 20 2a 2f 0a  to 56 mod 64 */.
19f90 20 20 20 20 20 20 20 20 69 66 20 28 63 6f 75 6e          if (coun
19fa0 74 20 3c 20 38 29 20 7b 0a 20 20 20 20 20 20 20  t < 8) {.       
19fb0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20           /* Two 
19fc0 6c 6f 74 73 20 6f 66 20 70 61 64 64 69 6e 67 3a  lots of padding:
19fd0 20 20 50 61 64 20 74 68 65 20 66 69 72 73 74 20    Pad the first 
19fe0 62 6c 6f 63 6b 20 74 6f 20 36 34 20 62 79 74 65  block to 64 byte
19ff0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  s */.           
1a000 20 20 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30       memset(p, 0
1a010 2c 20 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20  , count);.      
1a020 20 20 20 20 20 20 20 20 20 20 62 79 74 65 52 65            byteRe
1a030 76 65 72 73 65 28 63 74 78 2d 3e 69 6e 2c 20 31  verse(ctx->in, 1
1a040 36 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  6);.            
1a050 20 20 20 20 4d 44 35 54 72 61 6e 73 66 6f 72 6d      MD5Transform
1a060 28 63 74 78 2d 3e 62 75 66 2c 20 28 75 69 6e 74  (ctx->buf, (uint
1a070 33 32 20 2a 29 63 74 78 2d 3e 69 6e 29 3b 0a 0a  32 *)ctx->in);..
1a080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a090 2f 2a 20 4e 6f 77 20 66 69 6c 6c 20 74 68 65 20  /* Now fill the 
1a0a0 6e 65 78 74 20 62 6c 6f 63 6b 20 77 69 74 68 20  next block with 
1a0b0 35 36 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20  56 bytes */.    
1a0c0 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73              mems
1a0d0 65 74 28 63 74 78 2d 3e 69 6e 2c 20 30 2c 20 35  et(ctx->in, 0, 5
1a0e0 36 29 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c  6);.        } el
1a0f0 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  se {.           
1a100 20 20 20 20 20 2f 2a 20 50 61 64 20 62 6c 6f 63       /* Pad bloc
1a110 6b 20 74 6f 20 35 36 20 62 79 74 65 73 20 2a 2f  k to 56 bytes */
1a120 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a130 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 63 6f   memset(p, 0, co
1a140 75 6e 74 2d 38 29 3b 0a 20 20 20 20 20 20 20 20  unt-8);.        
1a150 7d 0a 20 20 20 20 20 20 20 20 62 79 74 65 52 65  }.        byteRe
1a160 76 65 72 73 65 28 63 74 78 2d 3e 69 6e 2c 20 31  verse(ctx->in, 1
1a170 34 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  4);..        /* 
1a180 41 70 70 65 6e 64 20 6c 65 6e 67 74 68 20 69 6e  Append length in
1a190 20 62 69 74 73 20 61 6e 64 20 74 72 61 6e 73 66   bits and transf
1a1a0 6f 72 6d 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d  orm */.        m
1a1b0 65 6d 63 70 79 28 63 74 78 2d 3e 69 6e 20 2b 20  emcpy(ctx->in + 
1a1c0 31 34 2a 34 2c 20 63 74 78 2d 3e 62 69 74 73 2c  14*4, ctx->bits,
1a1d0 20 38 29 3b 0a 0a 20 20 20 20 20 20 20 20 4d 44   8);..        MD
1a1e0 35 54 72 61 6e 73 66 6f 72 6d 28 63 74 78 2d 3e  5Transform(ctx->
1a1f0 62 75 66 2c 20 28 75 69 6e 74 33 32 20 2a 29 63  buf, (uint32 *)c
1a200 74 78 2d 3e 69 6e 29 3b 0a 20 20 20 20 20 20 20  tx->in);.       
1a210 20 62 79 74 65 52 65 76 65 72 73 65 28 28 75 6e   byteReverse((un
1a220 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 63 74  signed char *)ct
1a230 78 2d 3e 62 75 66 2c 20 34 29 3b 0a 20 20 20 20  x->buf, 4);.    
1a240 20 20 20 20 6d 65 6d 63 70 79 28 64 69 67 65 73      memcpy(diges
1a250 74 2c 20 63 74 78 2d 3e 62 75 66 2c 20 31 36 29  t, ctx->buf, 16)
1a260 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  ;.}../*.** Conve
1a270 72 74 20 61 20 31 32 38 2d 62 69 74 20 4d 44 35  rt a 128-bit MD5
1a280 20 64 69 67 65 73 74 20 69 6e 74 6f 20 61 20 33   digest into a 3
1a290 32 2d 64 69 67 69 74 20 62 61 73 65 2d 31 36 20  2-digit base-16 
1a2a0 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  number..*/.stati
1a2b0 63 20 76 6f 69 64 20 4d 44 35 44 69 67 65 73 74  c void MD5Digest
1a2c0 54 6f 42 61 73 65 31 36 28 75 6e 73 69 67 6e 65  ToBase16(unsigne
1a2d0 64 20 63 68 61 72 20 2a 64 69 67 65 73 74 2c 20  d char *digest, 
1a2e0 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73  char *zBuf){.  s
1a2f0 74 61 74 69 63 20 63 68 61 72 20 63 6f 6e 73 74  tatic char const
1a300 20 7a 45 6e 63 6f 64 65 5b 5d 20 3d 20 22 30 31   zEncode[] = "01
1a310 32 33 34 35 36 37 38 39 61 62 63 64 65 66 22 3b  23456789abcdef";
1a320 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20  .  int i, j;..  
1a330 66 6f 72 28 6a 3d 69 3d 30 3b 20 69 3c 31 36 3b  for(j=i=0; i<16;
1a340 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 61   i++){.    int a
1a350 20 3d 20 64 69 67 65 73 74 5b 69 5d 3b 0a 20 20   = digest[i];.  
1a360 20 20 7a 42 75 66 5b 6a 2b 2b 5d 20 3d 20 7a 45    zBuf[j++] = zE
1a370 6e 63 6f 64 65 5b 28 61 3e 3e 34 29 26 30 78 66  ncode[(a>>4)&0xf
1a380 5d 3b 0a 20 20 20 20 7a 42 75 66 5b 6a 2b 2b 5d  ];.    zBuf[j++]
1a390 20 3d 20 7a 45 6e 63 6f 64 65 5b 61 20 26 20 30   = zEncode[a & 0
1a3a0 78 66 5d 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b  xf];.  }.  zBuf[
1a3b0 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  j] = 0;.}.../*.*
1a3c0 2a 20 43 6f 6e 76 65 72 74 20 61 20 31 32 38 2d  * Convert a 128-
1a3d0 62 69 74 20 4d 44 35 20 64 69 67 65 73 74 20 69  bit MD5 digest i
1a3e0 6e 74 6f 20 73 65 71 75 65 6e 63 79 20 6f 66 20  nto sequency of 
1a3f0 65 69 67 68 74 20 35 2d 64 69 67 69 74 20 69 6e  eight 5-digit in
1a400 74 65 67 65 72 73 0a 2a 2a 20 65 61 63 68 20 72  tegers.** each r
1a410 65 70 72 65 73 65 6e 74 69 6e 67 20 31 36 20 62  epresenting 16 b
1a420 69 74 73 20 6f 66 20 74 68 65 20 64 69 67 65 73  its of the diges
1a430 74 20 61 6e 64 20 73 65 70 61 72 61 74 65 64 20  t and separated 
1a440 66 72 6f 6d 20 65 61 63 68 0a 2a 2a 20 6f 74 68  from each.** oth
1a450 65 72 20 62 79 20 61 20 22 2d 22 20 63 68 61 72  er by a "-" char
1a460 61 63 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  acter..*/.static
1a470 20 76 6f 69 64 20 4d 44 35 44 69 67 65 73 74 54   void MD5DigestT
1a480 6f 42 61 73 65 31 30 78 38 28 75 6e 73 69 67 6e  oBase10x8(unsign
1a490 65 64 20 63 68 61 72 20 64 69 67 65 73 74 5b 31  ed char digest[1
1a4a0 36 5d 2c 20 63 68 61 72 20 7a 44 69 67 65 73 74  6], char zDigest
1a4b0 5b 35 30 5d 29 7b 0a 20 20 69 6e 74 20 69 2c 20  [50]){.  int i, 
1a4c0 6a 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  j;.  unsigned in
1a4d0 74 20 78 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  t x;.  for(i=j=0
1a4e0 3b 20 69 3c 31 36 3b 20 69 2b 3d 32 29 7b 0a 20  ; i<16; i+=2){. 
1a4f0 20 20 20 78 20 3d 20 64 69 67 65 73 74 5b 69 5d     x = digest[i]
1a500 2a 32 35 36 20 2b 20 64 69 67 65 73 74 5b 69 2b  *256 + digest[i+
1a510 31 5d 3b 0a 20 20 20 20 69 66 28 20 69 3e 30 20  1];.    if( i>0 
1a520 29 20 7a 44 69 67 65 73 74 5b 6a 2b 2b 5d 20 3d  ) zDigest[j++] =
1a530 20 27 2d 27 3b 0a 20 20 20 20 73 71 6c 69 74 65   '-';.    sqlite
1a540 33 5f 73 6e 70 72 69 6e 74 66 28 31 36 2d 6a 2c  3_snprintf(16-j,
1a550 20 26 7a 44 69 67 65 73 74 5b 6a 5d 2c 20 22 25   &zDigest[j], "%
1a560 30 35 75 22 2c 20 78 29 3b 0a 20 20 20 20 6a 20  05u", x);.    j 
1a570 2b 3d 20 35 3b 0a 20 20 7d 0a 20 20 7a 44 69 67  += 5;.  }.  zDig
1a580 65 73 74 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f  est[j] = 0;.}../
1a590 2a 0a 2a 2a 20 41 20 54 43 4c 20 63 6f 6d 6d 61  *.** A TCL comma
1a5a0 6e 64 20 66 6f 72 20 6d 64 35 2e 20 20 54 68 65  nd for md5.  The
1a5b0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
1a5c0 20 74 65 78 74 20 74 6f 20 62 65 20 68 61 73 68   text to be hash
1a5d0 65 64 2e 20 20 54 68 65 0a 2a 2a 20 52 65 73 75  ed.  The.** Resu
1a5e0 6c 74 20 69 73 20 74 68 65 20 68 61 73 68 20 69  lt is the hash i
1a5f0 6e 20 62 61 73 65 36 34 2e 20 20 0a 2a 2f 0a 73  n base64.  .*/.s
1a600 74 61 74 69 63 20 69 6e 74 20 6d 64 35 5f 63 6d  tatic int md5_cm
1a610 64 28 76 6f 69 64 2a 63 64 2c 20 54 63 6c 5f 49  d(void*cd, Tcl_I
1a620 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
1a630 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73 74 20 63  nt argc, const c
1a640 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 4d  har **argv){.  M
1a650 44 35 43 6f 6e 74 65 78 74 20 63 74 78 3b 0a 20  D5Context ctx;. 
1a660 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64   unsigned char d
1a670 69 67 65 73 74 5b 31 36 5d 3b 0a 20 20 63 68 61  igest[16];.  cha
1a680 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 76 6f  r zBuf[50];.  vo
1a690 69 64 20 28 2a 63 6f 6e 76 65 72 74 65 72 29 28  id (*converter)(
1a6a0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 2c 20  unsigned char*, 
1a6b0 63 68 61 72 2a 29 3b 0a 0a 20 20 69 66 28 20 61  char*);..  if( a
1a6c0 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  rgc!=2 ){.    Tc
1a6d0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1a6e0 6e 74 65 72 70 2c 22 77 72 6f 6e 67 20 23 20 61  nterp,"wrong # a
1a6f0 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
1a700 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20  "", argv[0], .  
1a710 20 20 20 20 20 20 22 20 54 45 58 54 5c 22 22 2c        " TEXT\"",
1a720 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
1a730 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1a740 3b 0a 20 20 7d 0a 20 20 4d 44 35 49 6e 69 74 28  ;.  }.  MD5Init(
1a750 26 63 74 78 29 3b 0a 20 20 4d 44 35 55 70 64 61  &ctx);.  MD5Upda
1a760 74 65 28 26 63 74 78 2c 20 28 75 6e 73 69 67 6e  te(&ctx, (unsign
1a770 65 64 20 63 68 61 72 2a 29 61 72 67 76 5b 31 5d  ed char*)argv[1]
1a780 2c 20 28 75 6e 73 69 67 6e 65 64 29 73 74 72 6c  , (unsigned)strl
1a790 65 6e 28 61 72 67 76 5b 31 5d 29 29 3b 0a 20 20  en(argv[1]));.  
1a7a0 4d 44 35 46 69 6e 61 6c 28 64 69 67 65 73 74 2c  MD5Final(digest,
1a7b0 20 26 63 74 78 29 3b 0a 20 20 63 6f 6e 76 65 72   &ctx);.  conver
1a7c0 74 65 72 20 3d 20 28 76 6f 69 64 28 2a 29 28 75  ter = (void(*)(u
1a7d0 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 2c 63 68  nsigned char*,ch
1a7e0 61 72 2a 29 29 63 64 3b 0a 20 20 63 6f 6e 76 65  ar*))cd;.  conve
1a7f0 72 74 65 72 28 64 69 67 65 73 74 2c 20 7a 42 75  rter(digest, zBu
1a800 66 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  f);.  Tcl_Append
1a810 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
1a820 42 75 66 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  Buf, (char*)0);.
1a830 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1a840 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 54 43 4c 20  .}../*.** A TCL 
1a850 63 6f 6d 6d 61 6e 64 20 74 6f 20 74 61 6b 65 20  command to take 
1a860 74 68 65 20 6d 64 35 20 68 61 73 68 20 6f 66 20  the md5 hash of 
1a870 61 20 66 69 6c 65 2e 20 20 54 68 65 20 61 72 67  a file.  The arg
1a880 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20  ument is the.** 
1a890 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  name of the file
1a8a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1a8b0 6d 64 35 66 69 6c 65 5f 63 6d 64 28 76 6f 69 64  md5file_cmd(void
1a8c0 2a 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70 2a  *cd, Tcl_Interp*
1a8d0 69 6e 74 65 72 70 2c 20 69 6e 74 20 61 72 67 63  interp, int argc
1a8e0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61  , const char **a
1a8f0 72 67 76 29 7b 0a 20 20 46 49 4c 45 20 2a 69 6e  rgv){.  FILE *in
1a900 3b 0a 20 20 4d 44 35 43 6f 6e 74 65 78 74 20 63  ;.  MD5Context c
1a910 74 78 3b 0a 20 20 76 6f 69 64 20 28 2a 63 6f 6e  tx;.  void (*con
1a920 76 65 72 74 65 72 29 28 75 6e 73 69 67 6e 65 64  verter)(unsigned
1a930 20 63 68 61 72 2a 2c 20 63 68 61 72 2a 29 3b 0a   char*, char*);.
1a940 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1a950 64 69 67 65 73 74 5b 31 36 5d 3b 0a 20 20 63 68  digest[16];.  ch
1a960 61 72 20 7a 42 75 66 5b 31 30 32 34 30 5d 3b 0a  ar zBuf[10240];.
1a970 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29  .  if( argc!=2 )
1a980 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1a990 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 77  Result(interp,"w
1a9a0 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
1a9b0 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
1a9c0 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 20 22 20  [0], .        " 
1a9d0 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 28 63 68  FILENAME\"", (ch
1a9e0 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75  ar*)0);.    retu
1a9f0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1aa00 7d 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 61  }.  in = fopen(a
1aa10 72 67 76 5b 31 5d 2c 22 72 62 22 29 3b 0a 20 20  rgv[1],"rb");.  
1aa20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20  if( in==0 ){.   
1aa30 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1aa40 74 28 69 6e 74 65 72 70 2c 22 75 6e 61 62 6c 65  t(interp,"unable
1aa50 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65 20 5c 22   to open file \"
1aa60 22 2c 20 61 72 67 76 5b 31 5d 2c 20 0a 20 20 20  ", argv[1], .   
1aa70 20 20 20 20 20 20 22 5c 22 20 66 6f 72 20 72 65        "\" for re
1aa80 61 64 69 6e 67 22 2c 20 28 63 68 61 72 2a 29 30  ading", (char*)0
1aa90 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1aaa0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 4d  L_ERROR;.  }.  M
1aab0 44 35 49 6e 69 74 28 26 63 74 78 29 3b 0a 20 20  D5Init(&ctx);.  
1aac0 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74  for(;;){.    int
1aad0 20 6e 3b 0a 20 20 20 20 6e 20 3d 20 28 69 6e 74   n;.    n = (int
1aae0 29 66 72 65 61 64 28 7a 42 75 66 2c 20 31 2c 20  )fread(zBuf, 1, 
1aaf0 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 69 6e  sizeof(zBuf), in
1ab00 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c 3d 30 20  );.    if( n<=0 
1ab10 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 4d 44 35  ) break;.    MD5
1ab20 55 70 64 61 74 65 28 26 63 74 78 2c 20 28 75 6e  Update(&ctx, (un
1ab30 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 42 75  signed char*)zBu
1ab40 66 2c 20 28 75 6e 73 69 67 6e 65 64 29 6e 29 3b  f, (unsigned)n);
1ab50 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 69 6e  .  }.  fclose(in
1ab60 29 3b 0a 20 20 4d 44 35 46 69 6e 61 6c 28 64 69  );.  MD5Final(di
1ab70 67 65 73 74 2c 20 26 63 74 78 29 3b 0a 20 20 63  gest, &ctx);.  c
1ab80 6f 6e 76 65 72 74 65 72 20 3d 20 28 76 6f 69 64  onverter = (void
1ab90 28 2a 29 28 75 6e 73 69 67 6e 65 64 20 63 68 61  (*)(unsigned cha
1aba0 72 2a 2c 63 68 61 72 2a 29 29 63 64 3b 0a 20 20  r*,char*))cd;.  
1abb0 63 6f 6e 76 65 72 74 65 72 28 64 69 67 65 73 74  converter(digest
1abc0 2c 20 7a 42 75 66 29 3b 0a 20 20 54 63 6c 5f 41  , zBuf);.  Tcl_A
1abd0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1abe0 72 70 2c 20 7a 42 75 66 2c 20 28 63 68 61 72 2a  rp, zBuf, (char*
1abf0 29 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  )0);.  return TC
1ac00 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  L_OK;.}../*.** R
1ac10 65 67 69 73 74 65 72 20 74 68 65 20 66 6f 75 72  egister the four
1ac20 20 6e 65 77 20 54 43 4c 20 63 6f 6d 6d 61 6e 64   new TCL command
1ac30 73 20 66 6f 72 20 67 65 6e 65 72 61 74 69 6e 67  s for generating
1ac40 20 4d 44 35 20 63 68 65 63 6b 73 75 6d 73 0a 2a   MD5 checksums.*
1ac50 2a 20 77 69 74 68 20 74 68 65 20 54 43 4c 20 69  * with the TCL i
1ac60 6e 74 65 72 70 72 65 74 65 72 2e 0a 2a 2f 0a 69  nterpreter..*/.i
1ac70 6e 74 20 4d 64 35 5f 49 6e 69 74 28 54 63 6c 5f  nt Md5_Init(Tcl_
1ac80 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b  Interp *interp){
1ac90 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 43 6f 6d  .  Tcl_CreateCom
1aca0 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 6d 64  mand(interp, "md
1acb0 35 22 2c 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63  5", (Tcl_CmdProc
1acc0 2a 29 6d 64 35 5f 63 6d 64 2c 0a 20 20 20 20 20  *)md5_cmd,.     
1acd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4d                 M
1ace0 44 35 44 69 67 65 73 74 54 6f 42 61 73 65 31 36  D5DigestToBase16
1acf0 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61  , 0);.  Tcl_Crea
1ad00 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  teCommand(interp
1ad10 2c 20 22 6d 64 35 2d 31 30 78 38 22 2c 20 28 54  , "md5-10x8", (T
1ad20 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 6d 64 35 5f  cl_CmdProc*)md5_
1ad30 63 6d 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  cmd,.           
1ad40 20 20 20 20 20 20 20 20 20 4d 44 35 44 69 67 65           MD5Dige
1ad50 73 74 54 6f 42 61 73 65 31 30 78 38 2c 20 30 29  stToBase10x8, 0)
1ad60 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 43 6f  ;.  Tcl_CreateCo
1ad70 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 6d  mmand(interp, "m
1ad80 64 35 66 69 6c 65 22 2c 20 28 54 63 6c 5f 43 6d  d5file", (Tcl_Cm
1ad90 64 50 72 6f 63 2a 29 6d 64 35 66 69 6c 65 5f 63  dProc*)md5file_c
1ada0 6d 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  md,.            
1adb0 20 20 20 20 20 20 20 20 4d 44 35 44 69 67 65 73          MD5Diges
1adc0 74 54 6f 42 61 73 65 31 36 2c 20 30 29 3b 0a 20  tToBase16, 0);. 
1add0 20 54 63 6c 5f 43 72 65 61 74 65 43 6f 6d 6d 61   Tcl_CreateComma
1ade0 6e 64 28 69 6e 74 65 72 70 2c 20 22 6d 64 35 66  nd(interp, "md5f
1adf0 69 6c 65 2d 31 30 78 38 22 2c 20 28 54 63 6c 5f  ile-10x8", (Tcl_
1ae00 43 6d 64 50 72 6f 63 2a 29 6d 64 35 66 69 6c 65  CmdProc*)md5file
1ae10 5f 63 6d 64 2c 0a 20 20 20 20 20 20 20 20 20 20  _cmd,.          
1ae20 20 20 20 20 20 20 20 20 20 20 4d 44 35 44 69 67            MD5Dig
1ae30 65 73 74 54 6f 42 61 73 65 31 30 78 38 2c 20 30  estToBase10x8, 0
1ae40 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
1ae50 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
1ae60 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
1ae70 45 53 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  EST) || defined(
1ae80 53 51 4c 49 54 45 5f 54 43 4c 4d 44 35 29 20 2a  SQLITE_TCLMD5) *
1ae90 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  /..#if defined(S
1aea0 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a  QLITE_TEST)./*.*
1aeb0 2a 20 44 75 72 69 6e 67 20 74 65 73 74 69 6e 67  * During testing
1aec0 2c 20 74 68 65 20 73 70 65 63 69 61 6c 20 6d 64  , the special md
1aed0 35 73 75 6d 28 29 20 61 67 67 72 65 67 61 74 65  5sum() aggregate
1aee0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 76 61   function is ava
1aef0 69 6c 61 62 6c 65 2e 0a 2a 2a 20 69 6e 73 69 64  ilable..** insid
1af00 65 20 53 51 4c 69 74 65 2e 20 20 54 68 65 20 66  e SQLite.  The f
1af10 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
1af20 73 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74  s implement that
1af30 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
1af40 61 74 69 63 20 76 6f 69 64 20 6d 64 35 73 74 65  atic void md5ste
1af50 70 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  p(sqlite3_contex
1af60 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20  t *context, int 
1af70 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
1af80 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 4d  lue **argv){.  M
1af90 44 35 43 6f 6e 74 65 78 74 20 2a 70 3b 0a 20 20  D5Context *p;.  
1afa0 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 61 72 67  int i;.  if( arg
1afb0 63 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  c<1 ) return;.  
1afc0 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72  p = sqlite3_aggr
1afd0 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f  egate_context(co
1afe0 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70  ntext, sizeof(*p
1aff0 29 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  ));.  if( p==0 )
1b000 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21   return;.  if( !
1b010 70 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20  p->isInit ){.   
1b020 20 4d 44 35 49 6e 69 74 28 70 29 3b 0a 20 20 7d   MD5Init(p);.  }
1b030 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72  .  for(i=0; i<ar
1b040 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f  gc; i++){.    co
1b050 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74 61 20  nst char *zData 
1b060 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  = (char*)sqlite3
1b070 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
1b080 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 7a 44  [i]);.    if( zD
1b090 61 74 61 20 29 7b 0a 20 20 20 20 20 20 4d 44 35  ata ){.      MD5
1b0a0 55 70 64 61 74 65 28 70 2c 20 28 75 6e 73 69 67  Update(p, (unsig
1b0b0 6e 65 64 20 63 68 61 72 2a 29 7a 44 61 74 61 2c  ned char*)zData,
1b0c0 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 44 61   (int)strlen(zDa
1b0d0 74 61 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ta));.    }.  }.
1b0e0 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 64  }.static void md
1b0f0 35 66 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65  5finalize(sqlite
1b100 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
1b110 78 74 29 7b 0a 20 20 4d 44 35 43 6f 6e 74 65 78  xt){.  MD5Contex
1b120 74 20 2a 70 3b 0a 20 20 75 6e 73 69 67 6e 65 64  t *p;.  unsigned
1b130 20 63 68 61 72 20 64 69 67 65 73 74 5b 31 36 5d   char digest[16]
1b140 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33 33  ;.  char zBuf[33
1b150 5d 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  ];.  p = sqlite3
1b160 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65  _aggregate_conte
1b170 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65  xt(context, size
1b180 6f 66 28 2a 70 29 29 3b 0a 20 20 4d 44 35 46 69  of(*p));.  MD5Fi
1b190 6e 61 6c 28 64 69 67 65 73 74 2c 70 29 3b 0a 20  nal(digest,p);. 
1b1a0 20 4d 44 35 44 69 67 65 73 74 54 6f 42 61 73 65   MD5DigestToBase
1b1b0 31 36 28 64 69 67 65 73 74 2c 20 7a 42 75 66 29  16(digest, zBuf)
1b1c0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ;.  sqlite3_resu
1b1d0 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
1b1e0 20 7a 42 75 66 2c 20 2d 31 2c 20 53 51 4c 49 54   zBuf, -1, SQLIT
1b1f0 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a  E_TRANSIENT);.}.
1b200 69 6e 74 20 4d 64 35 5f 52 65 67 69 73 74 65 72  int Md5_Register
1b210 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
1b220 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
1b230 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
1b240 6e 28 64 62 2c 20 22 6d 64 35 73 75 6d 22 2c 20  n(db, "md5sum", 
1b250 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  -1, SQLITE_UTF8,
1b260 20 30 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20   0, 0, .        
1b270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b280 20 20 20 20 20 20 20 20 20 6d 64 35 73 74 65 70           md5step
1b290 2c 20 6d 64 35 66 69 6e 61 6c 69 7a 65 29 3b 0a  , md5finalize);.
1b2a0 20 20 73 71 6c 69 74 65 33 5f 6f 76 65 72 6c 6f    sqlite3_overlo
1b2b0 61 64 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  ad_function(db, 
1b2c0 22 6d 64 35 73 75 6d 22 2c 20 2d 31 29 3b 20 20  "md5sum", -1);  
1b2d0 2f 2a 20 54 6f 20 65 78 65 72 63 69 73 65 20 74  /* To exercise t
1b2e0 68 69 73 20 41 50 49 20 2a 2f 0a 20 20 72 65 74  his API */.  ret
1b2f0 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
1b300 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49   /* defined(SQLI
1b310 54 45 5f 54 45 53 54 29 20 2a 2f 0a 0a 0a 2f 2a  TE_TEST) */.../*
1b320 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61 63 72 6f  .** If the macro
1b330 20 54 43 4c 53 48 20 69 73 20 6f 6e 65 2c 20 74   TCLSH is one, t
1b340 68 65 6e 20 70 75 74 20 69 6e 20 63 6f 64 65 20  hen put in code 
1b350 74 68 69 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20  this for the.** 
1b360 22 6d 61 69 6e 22 20 72 6f 75 74 69 6e 65 20 74  "main" routine t
1b370 68 61 74 20 77 69 6c 6c 20 69 6e 69 74 69 61 6c  hat will initial
1b380 69 7a 65 20 54 63 6c 20 61 6e 64 20 74 61 6b 65  ize Tcl and take
1b390 20 69 6e 70 75 74 20 66 72 6f 6d 0a 2a 2a 20 73   input from.** s
1b3a0 74 61 6e 64 61 72 64 20 69 6e 70 75 74 2c 20 6f  tandard input, o
1b3b0 72 20 69 66 20 61 20 66 69 6c 65 20 69 73 20 6e  r if a file is n
1b3c0 61 6d 65 64 20 6f 6e 20 74 68 65 20 63 6f 6d 6d  amed on the comm
1b3d0 61 6e 64 20 6c 69 6e 65 0a 2a 2a 20 74 68 65 20  and line.** the 
1b3e0 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
1b3f0 72 65 61 64 73 20 61 6e 64 20 65 76 61 6c 75 61  reads and evalua
1b400 74 65 73 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a  tes that file..*
1b410 2f 0a 23 69 66 20 54 43 4c 53 48 3d 3d 31 0a 73  /.#if TCLSH==1.s
1b420 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
1b430 20 2a 74 63 6c 73 68 5f 6d 61 69 6e 5f 6c 6f 6f   *tclsh_main_loo
1b440 70 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69  p(void){.  stati
1b450 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61  c const char zMa
1b460 69 6e 6c 6f 6f 70 5b 5d 20 3d 0a 20 20 20 20 22  inloop[] =.    "
1b470 73 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e 22 0a 20  set line {}\n". 
1b480 20 20 20 22 77 68 69 6c 65 20 7b 21 5b 65 6f 66     "while {![eof
1b490 20 73 74 64 69 6e 5d 7d 20 7b 5c 6e 22 0a 20 20   stdin]} {\n".  
1b4a0 20 20 20 20 22 69 66 20 7b 24 6c 69 6e 65 21 3d      "if {$line!=
1b4b0 5c 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20 20 20 20  \"\"} {\n".     
1b4c0 20 20 20 22 70 75 74 73 20 2d 6e 6f 6e 65 77 6c     "puts -nonewl
1b4d0 69 6e 65 20 5c 22 3e 20 5c 22 5c 6e 22 0a 20 20  ine \"> \"\n".  
1b4e0 20 20 20 20 22 7d 20 65 6c 73 65 20 7b 5c 6e 22      "} else {\n"
1b4f0 0a 20 20 20 20 20 20 20 20 22 70 75 74 73 20 2d  .        "puts -
1b500 6e 6f 6e 65 77 6c 69 6e 65 20 5c 22 25 20 5c 22  nonewline \"% \"
1b510 5c 6e 22 0a 20 20 20 20 20 20 22 7d 5c 6e 22 0a  \n".      "}\n".
1b520 20 20 20 20 20 20 22 66 6c 75 73 68 20 73 74 64        "flush std
1b530 6f 75 74 5c 6e 22 0a 20 20 20 20 20 20 22 61 70  out\n".      "ap
1b540 70 65 6e 64 20 6c 69 6e 65 20 5b 67 65 74 73 20  pend line [gets 
1b550 73 74 64 69 6e 5d 5c 6e 22 0a 20 20 20 20 20 20  stdin]\n".      
1b560 22 69 66 20 7b 5b 69 6e 66 6f 20 63 6f 6d 70 6c  "if {[info compl
1b570 65 74 65 20 24 6c 69 6e 65 5d 7d 20 7b 5c 6e 22  ete $line]} {\n"
1b580 0a 20 20 20 20 20 20 20 20 22 69 66 20 7b 5b 63  .        "if {[c
1b590 61 74 63 68 20 7b 75 70 6c 65 76 65 6c 20 23 30  atch {uplevel #0
1b5a0 20 24 6c 69 6e 65 7d 20 72 65 73 75 6c 74 5d 7d   $line} result]}
1b5b0 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20   {\n".          
1b5c0 22 70 75 74 73 20 73 74 64 65 72 72 20 5c 22 45  "puts stderr \"E
1b5d0 72 72 6f 72 3a 20 24 72 65 73 75 6c 74 5c 22 5c  rror: $result\"\
1b5e0 6e 22 0a 20 20 20 20 20 20 20 20 22 7d 20 65 6c  n".        "} el
1b5f0 73 65 69 66 20 7b 24 72 65 73 75 6c 74 21 3d 5c  seif {$result!=\
1b600 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20  "\"} {\n".      
1b610 20 20 20 20 22 70 75 74 73 20 24 72 65 73 75 6c      "puts $resul
1b620 74 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 7d 5c  t\n".        "}\
1b630 6e 22 0a 20 20 20 20 20 20 20 20 22 73 65 74 20  n".        "set 
1b640 6c 69 6e 65 20 7b 7d 5c 6e 22 0a 20 20 20 20 20  line {}\n".     
1b650 20 22 7d 20 65 6c 73 65 20 7b 5c 6e 22 0a 20 20   "} else {\n".  
1b660 20 20 20 20 20 20 22 61 70 70 65 6e 64 20 6c 69        "append li
1b670 6e 65 20 5c 5c 6e 5c 6e 22 0a 20 20 20 20 20 20  ne \\n\n".      
1b680 22 7d 5c 6e 22 0a 20 20 20 20 22 7d 5c 6e 22 0a  "}\n".    "}\n".
1b690 20 20 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4d 61    ;.  return zMa
1b6a0 69 6e 6c 6f 6f 70 3b 0a 7d 0a 23 65 6e 64 69 66  inloop;.}.#endif
1b6b0 0a 23 69 66 20 54 43 4c 53 48 3d 3d 32 0a 73 74  .#if TCLSH==2.st
1b6c0 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
1b6d0 2a 74 63 6c 73 68 5f 6d 61 69 6e 5f 6c 6f 6f 70  *tclsh_main_loop
1b6e0 28 76 6f 69 64 29 3b 0a 23 65 6e 64 69 66 0a 0a  (void);.#endif..
1b6f0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
1b700 53 54 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  ST.static void i
1b710 6e 69 74 5f 61 6c 6c 28 54 63 6c 5f 49 6e 74 65  nit_all(Tcl_Inte
1b720 72 70 20 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e  rp *);.static in
1b730 74 20 69 6e 69 74 5f 61 6c 6c 5f 63 6d 64 28 0a  t init_all_cmd(.
1b740 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 64 2c    ClientData cd,
1b750 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1b760 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1b770 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1b780 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 0a 20  NST objv[].){.. 
1b790 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 73 6c 61   Tcl_Interp *sla
1b7a0 76 65 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  ve;.  if( objc!=
1b7b0 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
1b7c0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
1b7d0 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 4c 41 56  , 1, objv, "SLAV
1b7e0 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  E");.    return 
1b7f0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
1b800 20 20 73 6c 61 76 65 20 3d 20 54 63 6c 5f 47 65    slave = Tcl_Ge
1b810 74 53 6c 61 76 65 28 69 6e 74 65 72 70 2c 20 54  tSlave(interp, T
1b820 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1b830 76 5b 31 5d 29 29 3b 0a 20 20 69 66 28 20 21 73  v[1]));.  if( !s
1b840 6c 61 76 65 20 29 7b 0a 20 20 20 20 72 65 74 75  lave ){.    retu
1b850 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1b860 7d 0a 0a 20 20 69 6e 69 74 5f 61 6c 6c 28 73 6c  }..  init_all(sl
1b870 61 76 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  ave);.  return T
1b880 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1b890 54 63 6c 63 6d 64 3a 20 64 62 5f 75 73 65 5f 6c  Tclcmd: db_use_l
1b8a0 65 67 61 63 79 5f 70 72 65 70 61 72 65 20 44 42  egacy_prepare DB
1b8b0 20 42 4f 4f 4c 45 41 4e 0a 2a 2a 0a 2a 2a 20 20   BOOLEAN.**.**  
1b8c0 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
1b8d0 65 6e 74 20 74 6f 20 74 68 69 73 20 63 6f 6d 6d  ent to this comm
1b8e0 61 6e 64 20 6d 75 73 74 20 62 65 20 61 20 64 61  and must be a da
1b8f0 74 61 62 61 73 65 20 63 6f 6d 6d 61 6e 64 20 63  tabase command c
1b900 72 65 61 74 65 64 20 62 79 0a 2a 2a 20 20 20 5b  reated by.**   [
1b910 73 71 6c 69 74 65 33 5d 2e 20 49 66 20 74 68 65  sqlite3]. If the
1b920 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
1b930 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
1b940 68 65 20 68 61 6e 64 6c 65 20 69 73 20 63 6f 6e  he handle is con
1b950 66 69 67 75 72 65 64 0a 2a 2a 20 20 20 74 6f 20  figured.**   to 
1b960 75 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f  use the sqlite3_
1b970 70 72 65 70 61 72 65 5f 76 32 28 29 20 66 75 6e  prepare_v2() fun
1b980 63 74 69 6f 6e 20 74 6f 20 70 72 65 70 61 72 65  ction to prepare
1b990 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 49 66 20   statements. If 
1b9a0 69 74 0a 2a 2a 20 20 20 69 73 20 66 61 6c 73 65  it.**   is false
1b9b0 2c 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  , sqlite3_prepar
1b9c0 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e()..*/.static i
1b9d0 6e 74 20 64 62 5f 75 73 65 5f 6c 65 67 61 63 79  nt db_use_legacy
1b9e0 5f 70 72 65 70 61 72 65 5f 63 6d 64 28 0a 20 20  _prepare_cmd(.  
1b9f0 43 6c 69 65 6e 74 44 61 74 61 20 63 64 2c 0a 20  ClientData cd,. 
1ba00 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1ba10 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1ba20 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1ba30 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 54 63  T objv[].){.  Tc
1ba40 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49 6e 66  l_CmdInfo cmdInf
1ba50 6f 3b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  o;.  SqliteDb *p
1ba60 44 62 3b 0a 20 20 69 6e 74 20 62 50 72 65 70 61  Db;.  int bPrepa
1ba70 72 65 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  re;..  if( objc!
1ba80 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =3 ){.    Tcl_Wr
1ba90 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
1baa0 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20  p, 1, objv, "DB 
1bab0 42 4f 4f 4c 45 41 4e 22 29 3b 0a 20 20 20 20 72  BOOLEAN");.    r
1bac0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1bad0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 54 63 6c  .  }..  if( !Tcl
1bae0 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28  _GetCommandInfo(
1baf0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
1bb00 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
1bb10 26 63 6d 64 49 6e 66 6f 29 20 29 7b 0a 20 20 20  &cmdInfo) ){.   
1bb20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1bb30 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 73 75  t(interp, "no su
1bb40 63 68 20 64 62 3a 20 22 2c 20 54 63 6c 5f 47 65  ch db: ", Tcl_Ge
1bb50 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
1bb60 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
1bb70 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1bb80 52 3b 0a 20 20 7d 0a 20 20 70 44 62 20 3d 20 28  R;.  }.  pDb = (
1bb90 53 71 6c 69 74 65 44 62 2a 29 63 6d 64 49 6e 66  SqliteDb*)cmdInf
1bba0 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44 61 74 61 3b  o.objClientData;
1bbb0 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f  .  if( Tcl_GetBo
1bbc0 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
1bbd0 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 62  erp, objv[2], &b
1bbe0 50 72 65 70 61 72 65 29 20 29 7b 0a 20 20 20 20  Prepare) ){.    
1bbf0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1bc00 3b 0a 20 20 7d 0a 0a 20 20 70 44 62 2d 3e 62 4c  ;.  }..  pDb->bL
1bc10 65 67 61 63 79 50 72 65 70 61 72 65 20 3d 20 62  egacyPrepare = b
1bc20 50 72 65 70 61 72 65 3b 0a 0a 20 20 54 63 6c 5f  Prepare;..  Tcl_
1bc30 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65  ResetResult(inte
1bc40 72 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  rp);.  return TC
1bc50 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  L_OK;.}../*.** T
1bc60 63 6c 63 6d 64 3a 20 64 62 5f 6c 61 73 74 5f 73  clcmd: db_last_s
1bc70 74 6d 74 5f 70 74 72 20 44 42 0a 2a 2a 0a 2a 2a  tmt_ptr DB.**.**
1bc80 20 20 20 49 66 20 74 68 65 20 73 74 61 74 65 6d     If the statem
1bc90 65 6e 74 20 63 61 63 68 65 20 61 73 73 6f 63 69  ent cache associ
1bca0 61 74 65 64 20 77 69 74 68 20 64 61 74 61 62 61  ated with databa
1bcb0 73 65 20 44 42 20 69 73 20 6e 6f 74 20 65 6d 70  se DB is not emp
1bcc0 74 79 2c 0a 2a 2a 20 20 20 72 65 74 75 72 6e 20  ty,.**   return 
1bcd0 74 68 65 20 74 65 78 74 20 72 65 70 72 65 73 65  the text represe
1bce0 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d  ntation of the m
1bcf0 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 75 73 65  ost recently use
1bd00 64 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20  d statement.**  
1bd10 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74   handle..*/.stat
1bd20 69 63 20 69 6e 74 20 64 62 5f 6c 61 73 74 5f 73  ic int db_last_s
1bd30 74 6d 74 5f 70 74 72 28 0a 20 20 43 6c 69 65 6e  tmt_ptr(.  Clien
1bd40 74 44 61 74 61 20 63 64 2c 0a 20 20 54 63 6c 5f  tData cd,.  Tcl_
1bd50 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1bd60 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1bd70 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1bd80 76 5b 5d 0a 29 7b 0a 20 20 65 78 74 65 72 6e 20  v[].){.  extern 
1bd90 69 6e 74 20 73 71 6c 69 74 65 33 54 65 73 74 4d  int sqlite3TestM
1bda0 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 54 63  akePointerStr(Tc
1bdb0 6c 5f 49 6e 74 65 72 70 2a 2c 20 63 68 61 72 2a  l_Interp*, char*
1bdc0 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 54 63 6c 5f  , void*);.  Tcl_
1bdd0 43 6d 64 49 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b  CmdInfo cmdInfo;
1bde0 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
1bdf0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
1be00 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63   *pStmt = 0;.  c
1be10 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 0a  har zBuf[100];..
1be20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
1be30 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
1be40 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
1be50 20 6f 62 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20   objv, "DB");.  
1be60 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1be70 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21  OR;.  }..  if( !
1be80 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e  Tcl_GetCommandIn
1be90 66 6f 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  fo(interp, Tcl_G
1bea0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
1beb0 29 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29 7b 0a  ), &cmdInfo) ){.
1bec0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1bed0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f  sult(interp, "no
1bee0 20 73 75 63 68 20 64 62 3a 20 22 2c 20 54 63 6c   such db: ", Tcl
1bef0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1bf00 31 5d 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  1]), (char*)0);.
1bf10 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1bf20 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 44 62 20  RROR;.  }.  pDb 
1bf30 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 6d 64  = (SqliteDb*)cmd
1bf40 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44 61  Info.objClientDa
1bf50 74 61 3b 0a 0a 20 20 69 66 28 20 70 44 62 2d 3e  ta;..  if( pDb->
1bf60 73 74 6d 74 4c 69 73 74 20 29 20 70 53 74 6d 74  stmtList ) pStmt
1bf70 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74   = pDb->stmtList
1bf80 2d 3e 70 53 74 6d 74 3b 0a 20 20 69 66 28 20 73  ->pStmt;.  if( s
1bf90 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f  qlite3TestMakePo
1bfa0 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c  interStr(interp,
1bfb0 20 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29 7b   zBuf, pStmt) ){
1bfc0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1bfd0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c  ERROR;.  }.  Tcl
1bfe0 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
1bff0 70 2c 20 7a 42 75 66 2c 20 54 43 4c 5f 56 4f 4c  p, zBuf, TCL_VOL
1c000 41 54 49 4c 45 29 3b 0a 0a 20 20 72 65 74 75 72  ATILE);..  retur
1c010 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  n TCL_OK;.}.#end
1c020 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67  if../*.** Config
1c030 75 72 65 20 74 68 65 20 69 6e 74 65 72 70 72 65  ure the interpre
1c040 74 65 72 20 70 61 73 73 65 64 20 61 73 20 74 68  ter passed as th
1c050 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
1c060 20 74 6f 20 68 61 76 65 20 61 63 63 65 73 73 0a   to have access.
1c070 2a 2a 20 74 6f 20 74 68 65 20 63 6f 6d 6d 61 6e  ** to the comman
1c080 64 73 20 61 6e 64 20 6c 69 6e 6b 65 64 20 76 61  ds and linked va
1c090 72 69 61 62 6c 65 73 20 74 68 61 74 20 6d 61 6b  riables that mak
1c0a0 65 20 75 70 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  e up:.**.**   * 
1c0b0 74 68 65 20 5b 73 71 6c 69 74 65 33 5d 20 65 78  the [sqlite3] ex
1c0c0 74 65 6e 73 69 6f 6e 20 69 74 73 65 6c 66 2c 20  tension itself, 
1c0d0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 53 51  .**.**   * If SQ
1c0e0 4c 49 54 45 5f 54 43 4c 4d 44 35 20 6f 72 20 53  LITE_TCLMD5 or S
1c0f0 51 4c 49 54 45 5f 54 45 53 54 20 69 73 20 64 65  QLITE_TEST is de
1c100 66 69 6e 65 64 2c 20 74 68 65 20 4d 64 35 20 63  fined, the Md5 c
1c110 6f 6d 6d 61 6e 64 73 2c 20 61 6e 64 0a 2a 2a 0a  ommands, and.**.
1c120 2a 2a 20 20 20 2a 20 49 66 20 53 51 4c 49 54 45  **   * If SQLITE
1c130 5f 54 45 53 54 20 69 73 20 73 65 74 2c 20 74 68  _TEST is set, th
1c140 65 20 76 61 72 69 6f 75 73 20 74 65 73 74 20 69  e various test i
1c150 6e 74 65 72 66 61 63 65 73 20 75 73 65 64 20 62  nterfaces used b
1c160 79 20 74 68 65 20 54 63 6c 0a 2a 2a 20 20 20 20  y the Tcl.**    
1c170 20 74 65 73 74 20 73 75 69 74 65 2e 0a 2a 2f 0a   test suite..*/.
1c180 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 69 74  static void init
1c190 5f 61 6c 6c 28 54 63 6c 5f 49 6e 74 65 72 70 20  _all(Tcl_Interp 
1c1a0 2a 69 6e 74 65 72 70 29 7b 0a 20 20 53 71 6c 69  *interp){.  Sqli
1c1b0 74 65 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  te3_Init(interp)
1c1c0 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  ;..#if defined(S
1c1d0 51 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64  QLITE_TEST) || d
1c1e0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 43  efined(SQLITE_TC
1c1f0 4c 4d 44 35 29 0a 20 20 4d 64 35 5f 49 6e 69 74  LMD5).  Md5_Init
1c200 28 69 6e 74 65 72 70 29 3b 0a 23 65 6e 64 69 66  (interp);.#endif
1c210 0a 0a 20 20 2f 2a 20 49 6e 73 74 61 6c 6c 20 74  ..  /* Install t
1c220 68 65 20 5b 72 65 67 69 73 74 65 72 5f 64 62 73  he [register_dbs
1c230 74 61 74 5f 76 74 61 62 5d 20 63 6f 6d 6d 61 6e  tat_vtab] comman
1c240 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  d to access the 
1c250 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 20  implementation. 
1c260 20 2a 2a 20 6f 66 20 76 69 72 74 75 61 6c 20 74   ** of virtual t
1c270 61 62 6c 65 20 64 62 73 74 61 74 20 28 73 6f 75  able dbstat (sou
1c280 72 63 65 20 66 69 6c 65 20 74 65 73 74 5f 73 74  rce file test_st
1c290 61 74 2e 63 29 2e 20 54 68 69 73 20 63 6f 6d 6d  at.c). This comm
1c2a0 61 6e 64 20 69 73 0a 20 20 2a 2a 20 72 65 71 75  and is.  ** requ
1c2b0 69 72 65 64 20 66 6f 72 20 74 65 73 74 66 69 78  ired for testfix
1c2c0 74 75 72 65 20 61 6e 64 20 73 71 6c 69 74 65 33  ture and sqlite3
1c2d0 5f 61 6e 61 6c 79 7a 65 72 2c 20 62 75 74 20 6e  _analyzer, but n
1c2e0 6f 74 20 62 79 20 74 68 65 20 70 72 6f 64 75 63  ot by the produc
1c2f0 74 69 6f 6e 0a 20 20 2a 2a 20 54 63 6c 20 65 78  tion.  ** Tcl ex
1c300 74 65 6e 73 69 6f 6e 2e 20 20 2a 2f 0a 23 69 66  tension.  */.#if
1c310 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1c320 54 45 53 54 29 20 7c 7c 20 54 43 4c 53 48 3d 3d  TEST) || TCLSH==
1c330 32 0a 20 20 7b 0a 20 20 20 20 65 78 74 65 72 6e  2.  {.    extern
1c340 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 53   int SqlitetestS
1c350 74 61 74 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  tat_Init(Tcl_Int
1c360 65 72 70 2a 29 3b 0a 20 20 20 20 53 71 6c 69 74  erp*);.    Sqlit
1c370 65 74 65 73 74 53 74 61 74 5f 49 6e 69 74 28 69  etestStat_Init(i
1c380 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 23 65 6e 64  nterp);.  }.#end
1c390 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
1c3a0 45 5f 54 45 53 54 0a 20 20 7b 0a 20 20 20 20 65  E_TEST.  {.    e
1c3b0 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1c3c0 63 6f 6e 66 69 67 5f 49 6e 69 74 28 54 63 6c 5f  config_Init(Tcl_
1c3d0 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
1c3e0 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1c3f0 65 73 74 31 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  est1_Init(Tcl_In
1c400 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
1c410 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1c420 74 32 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  t2_Init(Tcl_Inte
1c430 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
1c440 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 33   int Sqlitetest3
1c450 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1c460 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1c470 6e 74 20 53 71 6c 69 74 65 74 65 73 74 34 5f 49  nt Sqlitetest4_I
1c480 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
1c490 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
1c4a0 20 53 71 6c 69 74 65 74 65 73 74 35 5f 49 6e 69   Sqlitetest5_Ini
1c4b0 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
1c4c0 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1c4d0 71 6c 69 74 65 74 65 73 74 36 5f 49 6e 69 74 28  qlitetest6_Init(
1c4e0 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1c4f0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1c500 69 74 65 74 65 73 74 37 5f 49 6e 69 74 28 54 63  itetest7_Init(Tc
1c510 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1c520 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1c530 65 74 65 73 74 38 5f 49 6e 69 74 28 54 63 6c 5f  etest8_Init(Tcl_
1c540 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
1c550 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1c560 65 73 74 39 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  est9_Init(Tcl_In
1c570 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
1c580 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1c590 74 61 73 79 6e 63 5f 49 6e 69 74 28 54 63 6c 5f  tasync_Init(Tcl_
1c5a0 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
1c5b0 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1c5c0 65 73 74 5f 61 75 74 6f 65 78 74 5f 49 6e 69 74  est_autoext_Init
1c5d0 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1c5e0 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1c5f0 6c 69 74 65 74 65 73 74 5f 62 6c 6f 62 5f 49 6e  litetest_blob_In
1c600 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1c610 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1c620 53 71 6c 69 74 65 74 65 73 74 5f 64 65 6d 6f 76  Sqlitetest_demov
1c630 66 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  fs_Init(Tcl_Inte
1c640 72 70 20 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  rp *);.    exter
1c650 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1c660 5f 66 75 6e 63 5f 49 6e 69 74 28 54 63 6c 5f 49  _func_Init(Tcl_I
1c670 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1c680 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1c690 73 74 5f 68 65 78 69 6f 5f 49 6e 69 74 28 54 63  st_hexio_Init(Tc
1c6a0 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1c6b0 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1c6c0 65 74 65 73 74 5f 69 6e 69 74 5f 49 6e 69 74 28  etest_init_Init(
1c6d0 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1c6e0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1c6f0 69 74 65 74 65 73 74 5f 6d 61 6c 6c 6f 63 5f 49  itetest_malloc_I
1c700 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
1c710 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
1c720 20 53 71 6c 69 74 65 74 65 73 74 5f 6d 75 74 65   Sqlitetest_mute
1c730 78 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  x_Init(Tcl_Inter
1c740 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1c750 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 73 63  int Sqlitetestsc
1c760 68 65 6d 61 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  hema_Init(Tcl_In
1c770 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
1c780 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1c790 74 73 73 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  tsse_Init(Tcl_In
1c7a0 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
1c7b0 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1c7c0 74 74 63 6c 76 61 72 5f 49 6e 69 74 28 54 63 6c  ttclvar_Init(Tcl
1c7d0 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1c7e0 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1c7f0 74 65 73 74 66 73 5f 49 6e 69 74 28 54 63 6c 5f  testfs_Init(Tcl_
1c800 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
1c810 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1c820 65 73 74 54 68 72 65 61 64 5f 49 6e 69 74 28 54  estThread_Init(T
1c830 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1c840 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1c850 74 65 74 65 73 74 4f 6e 65 66 69 6c 65 5f 49 6e  tetestOnefile_In
1c860 69 74 28 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  it();.    extern
1c870 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 4f   int SqlitetestO
1c880 73 69 6e 73 74 5f 49 6e 69 74 28 54 63 6c 5f 49  sinst_Init(Tcl_I
1c890 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1c8a0 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1c8b0 73 74 62 61 63 6b 75 70 5f 49 6e 69 74 28 54 63  stbackup_Init(Tc
1c8c0 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1c8d0 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1c8e0 65 74 65 73 74 69 6e 74 61 72 72 61 79 5f 49 6e  etestintarray_In
1c8f0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1c900 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1c910 53 71 6c 69 74 65 74 65 73 74 76 66 73 5f 49 6e  Sqlitetestvfs_In
1c920 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29  it(Tcl_Interp *)
1c930 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
1c940 20 53 71 6c 69 74 65 74 65 73 74 72 74 72 65 65   Sqlitetestrtree
1c950 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1c960 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1c970 6e 74 20 53 71 6c 69 74 65 71 75 6f 74 61 5f 49  nt Sqlitequota_I
1c980 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
1c990 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
1c9a0 20 53 71 6c 69 74 65 6d 75 6c 74 69 70 6c 65 78   Sqlitemultiplex
1c9b0 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1c9c0 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1c9d0 6e 74 20 53 71 6c 69 74 65 53 75 70 65 72 6c 6f  nt SqliteSuperlo
1c9e0 63 6b 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  ck_Init(Tcl_Inte
1c9f0 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
1ca00 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 53   int SqlitetestS
1ca10 79 73 63 61 6c 6c 5f 49 6e 69 74 28 54 63 6c 5f  yscall_Init(Tcl_
1ca20 49 6e 74 65 72 70 2a 29 3b 0a 0a 23 69 66 20 64  Interp*);..#if d
1ca30 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
1ca40 41 42 4c 45 5f 46 54 53 33 29 20 7c 7c 20 64 65  ABLE_FTS3) || de
1ca50 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
1ca60 42 4c 45 5f 46 54 53 34 29 0a 20 20 20 20 65 78  BLE_FTS4).    ex
1ca70 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1ca80 65 73 74 66 74 73 33 5f 49 6e 69 74 28 54 63 6c  estfts3_Init(Tcl
1ca90 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
1caa0 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  ;.#endif..#ifdef
1cab0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 5a   SQLITE_ENABLE_Z
1cac0 49 50 56 46 53 0a 20 20 20 20 65 78 74 65 72 6e  IPVFS.    extern
1cad0 20 69 6e 74 20 5a 69 70 76 66 73 5f 49 6e 69 74   int Zipvfs_Init
1cae0 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1caf0 20 20 20 5a 69 70 76 66 73 5f 49 6e 69 74 28 69     Zipvfs_Init(i
1cb00 6e 74 65 72 70 29 3b 0a 23 65 6e 64 69 66 0a 0a  nterp);.#endif..
1cb10 20 20 20 20 53 71 6c 69 74 65 63 6f 6e 66 69 67      Sqliteconfig
1cb20 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
1cb30 20 20 20 53 71 6c 69 74 65 74 65 73 74 31 5f 49     Sqlitetest1_I
1cb40 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1cb50 20 53 71 6c 69 74 65 74 65 73 74 32 5f 49 6e 69   Sqlitetest2_Ini
1cb60 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
1cb70 71 6c 69 74 65 74 65 73 74 33 5f 49 6e 69 74 28  qlitetest3_Init(
1cb80 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
1cb90 69 74 65 74 65 73 74 34 5f 49 6e 69 74 28 69 6e  itetest4_Init(in
1cba0 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
1cbb0 65 74 65 73 74 35 5f 49 6e 69 74 28 69 6e 74 65  etest5_Init(inte
1cbc0 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
1cbd0 65 73 74 36 5f 49 6e 69 74 28 69 6e 74 65 72 70  est6_Init(interp
1cbe0 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
1cbf0 74 37 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  t7_Init(interp);
1cc00 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 38  .    Sqlitetest8
1cc10 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
1cc20 20 20 20 53 71 6c 69 74 65 74 65 73 74 39 5f 49     Sqlitetest9_I
1cc30 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1cc40 20 53 71 6c 69 74 65 74 65 73 74 61 73 79 6e 63   Sqlitetestasync
1cc50 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
1cc60 20 20 20 53 71 6c 69 74 65 74 65 73 74 5f 61 75     Sqlitetest_au
1cc70 74 6f 65 78 74 5f 49 6e 69 74 28 69 6e 74 65 72  toext_Init(inter
1cc80 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
1cc90 73 74 5f 62 6c 6f 62 5f 49 6e 69 74 28 69 6e 74  st_blob_Init(int
1cca0 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1ccb0 74 65 73 74 5f 64 65 6d 6f 76 66 73 5f 49 6e 69  test_demovfs_Ini
1ccc0 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
1ccd0 71 6c 69 74 65 74 65 73 74 5f 66 75 6e 63 5f 49  qlitetest_func_I
1cce0 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1ccf0 20 53 71 6c 69 74 65 74 65 73 74 5f 68 65 78 69   Sqlitetest_hexi
1cd00 6f 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  o_Init(interp);.
1cd10 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 5f 69      Sqlitetest_i
1cd20 6e 69 74 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  nit_Init(interp)
1cd30 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
1cd40 5f 6d 61 6c 6c 6f 63 5f 49 6e 69 74 28 69 6e 74  _malloc_Init(int
1cd50 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1cd60 74 65 73 74 5f 6d 75 74 65 78 5f 49 6e 69 74 28  test_mutex_Init(
1cd70 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
1cd80 69 74 65 74 65 73 74 73 63 68 65 6d 61 5f 49 6e  itetestschema_In
1cd90 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1cda0 53 71 6c 69 74 65 74 65 73 74 74 63 6c 76 61 72  Sqlitetesttclvar
1cdb0 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
1cdc0 20 20 20 53 71 6c 69 74 65 74 65 73 74 66 73 5f     Sqlitetestfs_
1cdd0 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
1cde0 20 20 53 71 6c 69 74 65 74 65 73 74 54 68 72 65    SqlitetestThre
1cdf0 61 64 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  ad_Init(interp);
1ce00 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 4f  .    SqlitetestO
1ce10 6e 65 66 69 6c 65 5f 49 6e 69 74 28 69 6e 74 65  nefile_Init(inte
1ce20 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
1ce30 65 73 74 4f 73 69 6e 73 74 5f 49 6e 69 74 28 69  estOsinst_Init(i
1ce40 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1ce50 74 65 74 65 73 74 62 61 63 6b 75 70 5f 49 6e 69  tetestbackup_Ini
1ce60 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
1ce70 71 6c 69 74 65 74 65 73 74 69 6e 74 61 72 72 61  qlitetestintarra
1ce80 79 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  y_Init(interp);.
1ce90 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 76 66      Sqlitetestvf
1cea0 73 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  s_Init(interp);.
1ceb0 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 72 74      Sqlitetestrt
1cec0 72 65 65 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  ree_Init(interp)
1ced0 3b 0a 20 20 20 20 53 71 6c 69 74 65 71 75 6f 74  ;.    Sqlitequot
1cee0 61 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  a_Init(interp);.
1cef0 20 20 20 20 53 71 6c 69 74 65 6d 75 6c 74 69 70      Sqlitemultip
1cf00 6c 65 78 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  lex_Init(interp)
1cf10 3b 0a 20 20 20 20 53 71 6c 69 74 65 53 75 70 65  ;.    SqliteSupe
1cf20 72 6c 6f 63 6b 5f 49 6e 69 74 28 69 6e 74 65 72  rlock_Init(inter
1cf30 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
1cf40 73 74 53 79 73 63 61 6c 6c 5f 49 6e 69 74 28 69  stSyscall_Init(i
1cf50 6e 74 65 72 70 29 3b 0a 0a 23 69 66 20 64 65 66  nterp);..#if def
1cf60 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
1cf70 4c 45 5f 46 54 53 33 29 20 7c 7c 20 64 65 66 69  LE_FTS3) || defi
1cf80 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
1cf90 45 5f 46 54 53 34 29 0a 20 20 20 20 53 71 6c 69  E_FTS4).    Sqli
1cfa0 74 65 74 65 73 74 66 74 73 33 5f 49 6e 69 74 28  tetestfts3_Init(
1cfb0 69 6e 74 65 72 70 29 3b 0a 23 65 6e 64 69 66 0a  interp);.#endif.
1cfc0 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
1cfd0 62 6a 43 6f 6d 6d 61 6e 64 28 0a 20 20 20 20 20  bjCommand(.     
1cfe0 20 20 20 69 6e 74 65 72 70 2c 20 22 6c 6f 61 64     interp, "load
1cff0 5f 74 65 73 74 66 69 78 74 75 72 65 5f 65 78 74  _testfixture_ext
1d000 65 6e 73 69 6f 6e 73 22 2c 20 69 6e 69 74 5f 61  ensions", init_a
1d010 6c 6c 5f 63 6d 64 2c 20 30 2c 20 30 0a 20 20 20  ll_cmd, 0, 0.   
1d020 20 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61   );.    Tcl_Crea
1d030 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 0a 20 20  teObjCommand(.  
1d040 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20 22 64        interp, "d
1d050 62 5f 75 73 65 5f 6c 65 67 61 63 79 5f 70 72 65  b_use_legacy_pre
1d060 70 61 72 65 22 2c 20 64 62 5f 75 73 65 5f 6c 65  pare", db_use_le
1d070 67 61 63 79 5f 70 72 65 70 61 72 65 5f 63 6d 64  gacy_prepare_cmd
1d080 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20  , 0, 0.    );.  
1d090 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
1d0a0 6f 6d 6d 61 6e 64 28 0a 20 20 20 20 20 20 20 20  ommand(.        
1d0b0 69 6e 74 65 72 70 2c 20 22 64 62 5f 6c 61 73 74  interp, "db_last
1d0c0 5f 73 74 6d 74 5f 70 74 72 22 2c 20 64 62 5f 6c  _stmt_ptr", db_l
1d0d0 61 73 74 5f 73 74 6d 74 5f 70 74 72 2c 20 30 2c  ast_stmt_ptr, 0,
1d0e0 20 30 0a 20 20 20 20 29 3b 0a 0a 23 69 66 64 65   0.    );..#ifde
1d0f0 66 20 53 51 4c 49 54 45 5f 53 53 45 0a 20 20 20  f SQLITE_SSE.   
1d100 20 53 71 6c 69 74 65 74 65 73 74 73 73 65 5f 49   Sqlitetestsse_I
1d110 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 23 65 6e  nit(interp);.#en
1d120 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d  dif.  }.#endif.}
1d130 0a 0a 2f 2a 20 4e 65 65 64 65 64 20 66 6f 72 20  ../* Needed for 
1d140 74 68 65 20 73 65 74 72 6c 69 6d 69 74 28 29 20  the setrlimit() 
1d150 73 79 73 74 65 6d 20 63 61 6c 6c 20 6f 6e 20 75  system call on u
1d160 6e 69 78 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  nix */.#if defin
1d170 65 64 28 75 6e 69 78 29 0a 23 69 6e 63 6c 75 64  ed(unix).#includ
1d180 65 20 3c 73 79 73 2f 72 65 73 6f 75 72 63 65 2e  e <sys/resource.
1d190 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  h>.#endif..#defi
1d1a0 6e 65 20 54 43 4c 53 48 5f 4d 41 49 4e 20 6d 61  ne TCLSH_MAIN ma
1d1b0 69 6e 20 20 20 2f 2a 20 4e 65 65 64 65 64 20 74  in   /* Needed t
1d1c0 6f 20 66 61 6b 65 20 6f 75 74 20 6d 6b 74 63 6c  o fake out mktcl
1d1d0 61 70 70 20 2a 2f 0a 69 6e 74 20 54 43 4c 53 48  app */.int TCLSH
1d1e0 5f 4d 41 49 4e 28 69 6e 74 20 61 72 67 63 2c 20  _MAIN(int argc, 
1d1f0 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20  char **argv){.  
1d200 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1d210 72 70 3b 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  rp;..#if !define
1d220 64 28 5f 57 49 4e 33 32 5f 57 43 45 29 0a 20 20  d(_WIN32_WCE).  
1d230 69 66 28 20 67 65 74 65 6e 76 28 22 42 52 45 41  if( getenv("BREA
1d240 4b 22 29 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  K") ){.    fprin
1d250 74 66 28 73 74 64 65 72 72 2c 0a 20 20 20 20 20  tf(stderr,.     
1d260 20 20 20 22 61 74 74 61 63 68 20 64 65 62 75 67     "attach debug
1d270 67 65 72 20 74 6f 20 70 72 6f 63 65 73 73 20 25  ger to process %
1d280 64 20 61 6e 64 20 70 72 65 73 73 20 61 6e 79 20  d and press any 
1d290 6b 65 79 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e  key to continue.
1d2a0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 47 45 54  \n",.        GET
1d2b0 50 49 44 28 29 29 3b 0a 20 20 20 20 66 67 65 74  PID());.    fget
1d2c0 63 28 73 74 64 69 6e 29 3b 0a 20 20 7d 0a 23 65  c(stdin);.  }.#e
1d2d0 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 69 6e 63 65  ndif..  /* Since
1d2e0 20 74 68 65 20 70 72 69 6d 61 72 79 20 75 73 65   the primary use
1d2f0 20 63 61 73 65 20 66 6f 72 20 74 68 69 73 20 62   case for this b
1d300 69 6e 61 72 79 20 69 73 20 74 65 73 74 69 6e 67  inary is testing
1d310 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20 20 2a 2a   of SQLite,.  **
1d320 20 62 65 20 73 75 72 65 20 74 6f 20 67 65 6e 65   be sure to gene
1d330 72 61 74 65 20 63 6f 72 65 20 66 69 6c 65 73 20  rate core files 
1d340 69 66 20 77 65 20 63 72 61 73 68 20 2a 2f 0a 23  if we crash */.#
1d350 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1d360 45 5f 54 45 53 54 29 20 26 26 20 64 65 66 69 6e  E_TEST) && defin
1d370 65 64 28 75 6e 69 78 29 0a 20 20 7b 20 73 74 72  ed(unix).  { str
1d380 75 63 74 20 72 6c 69 6d 69 74 20 78 3b 0a 20 20  uct rlimit x;.  
1d390 20 20 67 65 74 72 6c 69 6d 69 74 28 52 4c 49 4d    getrlimit(RLIM
1d3a0 49 54 5f 43 4f 52 45 2c 20 26 78 29 3b 0a 20 20  IT_CORE, &x);.  
1d3b0 20 20 78 2e 72 6c 69 6d 5f 63 75 72 20 3d 20 78    x.rlim_cur = x
1d3c0 2e 72 6c 69 6d 5f 6d 61 78 3b 0a 20 20 20 20 73  .rlim_max;.    s
1d3d0 65 74 72 6c 69 6d 69 74 28 52 4c 49 4d 49 54 5f  etrlimit(RLIMIT_
1d3e0 43 4f 52 45 2c 20 26 78 29 3b 0a 20 20 7d 0a 23  CORE, &x);.  }.#
1d3f0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1d400 54 45 53 54 20 26 26 20 75 6e 69 78 20 2a 2f 0a  TEST && unix */.
1d410 0a 0a 20 20 2f 2a 20 43 61 6c 6c 20 73 71 6c 69  ..  /* Call sqli
1d420 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 29 20 6f  te3_shutdown() o
1d430 6e 63 65 20 62 65 66 6f 72 65 20 64 6f 69 6e 67  nce before doing
1d440 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 2e 20   anything else. 
1d450 54 68 69 73 20 69 73 20 74 6f 0a 20 20 2a 2a 20  This is to.  ** 
1d460 74 65 73 74 20 74 68 61 74 20 73 71 6c 69 74 65  test that sqlite
1d470 33 5f 73 68 75 74 64 6f 77 6e 28 29 20 63 61 6e  3_shutdown() can
1d480 20 62 65 20 73 61 66 65 6c 79 20 63 61 6c 6c 65   be safely calle
1d490 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 62  d by a process b
1d4a0 65 66 6f 72 65 0a 20 20 2a 2a 20 73 71 6c 69 74  efore.  ** sqlit
1d4b0 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20  e3_initialize() 
1d4c0 69 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  is. */.  sqlite3
1d4d0 5f 73 68 75 74 64 6f 77 6e 28 29 3b 0a 0a 20 20  _shutdown();..  
1d4e0 54 63 6c 5f 46 69 6e 64 45 78 65 63 75 74 61 62  Tcl_FindExecutab
1d4f0 6c 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 54  le(argv[0]);.  T
1d500 63 6c 5f 53 65 74 53 79 73 74 65 6d 45 6e 63 6f  cl_SetSystemEnco
1d510 64 69 6e 67 28 4e 55 4c 4c 2c 20 22 75 74 66 2d  ding(NULL, "utf-
1d520 38 22 29 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20  8");.  interp = 
1d530 54 63 6c 5f 43 72 65 61 74 65 49 6e 74 65 72 70  Tcl_CreateInterp
1d540 28 29 3b 0a 0a 23 69 66 20 54 43 4c 53 48 3d 3d  ();..#if TCLSH==
1d550 32 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66  2.  sqlite3_conf
1d560 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  ig(SQLITE_CONFIG
1d570 5f 53 49 4e 47 4c 45 54 48 52 45 41 44 29 3b 0a  _SINGLETHREAD);.
1d580 23 65 6e 64 69 66 0a 0a 20 20 69 6e 69 74 5f 61  #endif..  init_a
1d590 6c 6c 28 69 6e 74 65 72 70 29 3b 0a 20 20 69 66  ll(interp);.  if
1d5a0 28 20 61 72 67 63 3e 3d 32 20 29 7b 0a 20 20 20  ( argc>=2 ){.   
1d5b0 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 68 61 72   int i;.    char
1d5c0 20 7a 41 72 67 63 5b 33 32 5d 3b 0a 20 20 20 20   zArgc[32];.    
1d5d0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1d5e0 28 73 69 7a 65 6f 66 28 7a 41 72 67 63 29 2c 20  (sizeof(zArgc), 
1d5f0 7a 41 72 67 63 2c 20 22 25 64 22 2c 20 61 72 67  zArgc, "%d", arg
1d600 63 2d 28 33 2d 54 43 4c 53 48 29 29 3b 0a 20 20  c-(3-TCLSH));.  
1d610 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74    Tcl_SetVar(int
1d620 65 72 70 2c 22 61 72 67 63 22 2c 20 7a 41 72 67  erp,"argc", zArg
1d630 63 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e  c, TCL_GLOBAL_ON
1d640 4c 59 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  LY);.    Tcl_Set
1d650 56 61 72 28 69 6e 74 65 72 70 2c 22 61 72 67 76  Var(interp,"argv
1d660 30 22 2c 61 72 67 76 5b 31 5d 2c 54 43 4c 5f 47  0",argv[1],TCL_G
1d670 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20  LOBAL_ONLY);.   
1d680 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65   Tcl_SetVar(inte
1d690 72 70 2c 22 61 72 67 76 22 2c 20 22 22 2c 20 54  rp,"argv", "", T
1d6a0 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b  CL_GLOBAL_ONLY);
1d6b0 0a 20 20 20 20 66 6f 72 28 69 3d 33 2d 54 43 4c  .    for(i=3-TCL
1d6c0 53 48 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29  SH; i<argc; i++)
1d6d0 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 56  {.      Tcl_SetV
1d6e0 61 72 28 69 6e 74 65 72 70 2c 20 22 61 72 67 76  ar(interp, "argv
1d6f0 22 2c 20 61 72 67 76 5b 69 5d 2c 0a 20 20 20 20  ", argv[i],.    
1d700 20 20 20 20 20 20 54 43 4c 5f 47 4c 4f 42 41 4c        TCL_GLOBAL
1d710 5f 4f 4e 4c 59 20 7c 20 54 43 4c 5f 4c 49 53 54  _ONLY | TCL_LIST
1d720 5f 45 4c 45 4d 45 4e 54 20 7c 20 54 43 4c 5f 41  _ELEMENT | TCL_A
1d730 50 50 45 4e 44 5f 56 41 4c 55 45 29 3b 0a 20 20  PPEND_VALUE);.  
1d740 20 20 7d 0a 20 20 20 20 69 66 28 20 54 43 4c 53    }.    if( TCLS
1d750 48 3d 3d 31 20 26 26 20 54 63 6c 5f 45 76 61 6c  H==1 && Tcl_Eval
1d760 46 69 6c 65 28 69 6e 74 65 72 70 2c 20 61 72 67  File(interp, arg
1d770 76 5b 31 5d 29 21 3d 54 43 4c 5f 4f 4b 20 29 7b  v[1])!=TCL_OK ){
1d780 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
1d790 72 20 2a 7a 49 6e 66 6f 20 3d 20 54 63 6c 5f 47  r *zInfo = Tcl_G
1d7a0 65 74 56 61 72 28 69 6e 74 65 72 70 2c 20 22 65  etVar(interp, "e
1d7b0 72 72 6f 72 49 6e 66 6f 22 2c 20 54 43 4c 5f 47  rrorInfo", TCL_G
1d7c0 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20  LOBAL_ONLY);.   
1d7d0 20 20 20 69 66 28 20 7a 49 6e 66 6f 3d 3d 30 20     if( zInfo==0 
1d7e0 29 20 7a 49 6e 66 6f 20 3d 20 54 63 6c 5f 47 65  ) zInfo = Tcl_Ge
1d7f0 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e  tStringResult(in
1d800 74 65 72 70 29 3b 0a 20 20 20 20 20 20 66 70 72  terp);.      fpr
1d810 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25 73 3a  intf(stderr,"%s:
1d820 20 25 73 5c 6e 22 2c 20 2a 61 72 67 76 2c 20 7a   %s\n", *argv, z
1d830 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 72 65 74  Info);.      ret
1d840 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
1d850 0a 20 20 69 66 28 20 54 43 4c 53 48 3d 3d 32 20  .  if( TCLSH==2 
1d860 7c 7c 20 61 72 67 63 3c 3d 31 20 29 7b 0a 20 20  || argc<=1 ){.  
1d870 20 20 54 63 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c    Tcl_GlobalEval
1d880 28 69 6e 74 65 72 70 2c 20 74 63 6c 73 68 5f 6d  (interp, tclsh_m
1d890 61 69 6e 5f 6c 6f 6f 70 28 29 29 3b 0a 20 20 7d  ain_loop());.  }
1d8a0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
1d8b0 65 6e 64 69 66 20 2f 2a 20 54 43 4c 53 48 20 2a  endif /* TCLSH *
1d8c0 2f 0a                                            /.