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

Artifact 47f303d6572a3c01700d5e57ea04f8833bd8059b:


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 20 3d 20 7a 54 79 70 65 5b        c = zType[
9620: 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0];.        if( 
9630: 7a 56 61 72 5b 30 5d 3d 3d 27 40 27 20 7c 7c 0a  zVar[0]=='@' ||.
9640: 20 20 20 20 20 20 20 20 20 20 20 28 63 3d 3d 27             (c=='
9650: 62 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79  b' && strcmp(zTy
9660: 70 65 2c 22 62 79 74 65 61 72 72 61 79 22 29 3d  pe,"bytearray")=
9670: 3d 30 20 26 26 20 70 56 61 72 2d 3e 62 79 74 65  =0 && pVar->byte
9680: 73 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  s==0) ){.       
9690: 20 20 20 2f 2a 20 4c 6f 61 64 20 61 20 42 4c 4f     /* Load a BLO
96a0: 42 20 74 79 70 65 20 69 66 20 74 68 65 20 54 63  B type if the Tc
96b0: 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 61 20  l variable is a 
96c0: 62 79 74 65 61 72 72 61 79 20 61 6e 64 0a 20 20  bytearray and.  
96d0: 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 68 61          ** it ha
96e0: 73 20 6e 6f 20 73 74 72 69 6e 67 20 72 65 70 72  s no string repr
96f0: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 72 20 74 68  esentation or th
9700: 65 20 68 6f 73 74 0a 20 20 20 20 20 20 20 20 20  e host.         
9710: 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 6e 61   ** parameter na
9720: 6d 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 22  me begins with "
9730: 40 22 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  @". */.         
9740: 20 64 61 74 61 20 3d 20 54 63 6c 5f 47 65 74 42   data = Tcl_GetB
9750: 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28  yteArrayFromObj(
9760: 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20  pVar, &n);.     
9770: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
9780: 64 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 69 2c  d_blob(pStmt, i,
9790: 20 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45   data, n, SQLITE
97a0: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
97b0: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
97c0: 6f 75 6e 74 28 70 56 61 72 29 3b 0a 20 20 20 20  ount(pVar);.    
97d0: 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e        pPreStmt->
97e0: 61 70 50 61 72 6d 5b 69 50 61 72 6d 2b 2b 5d 20  apParm[iParm++] 
97f0: 3d 20 70 56 61 72 3b 0a 20 20 20 20 20 20 20 20  = pVar;.        
9800: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 62 27  }else if( c=='b'
9810: 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65   && strcmp(zType
9820: 2c 22 62 6f 6f 6c 65 61 6e 22 29 3d 3d 30 20 29  ,"boolean")==0 )
9830: 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  {.          Tcl_
9840: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
9850: 74 65 72 70 2c 20 70 56 61 72 2c 20 26 6e 29 3b  terp, pVar, &n);
9860: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
9870: 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d  e3_bind_int(pStm
9880: 74 2c 20 69 2c 20 6e 29 3b 0a 20 20 20 20 20 20  t, i, n);.      
9890: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
98a0: 64 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79  d' && strcmp(zTy
98b0: 70 65 2c 22 64 6f 75 62 6c 65 22 29 3d 3d 30 20  pe,"double")==0 
98c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 64 6f 75  ){.          dou
98d0: 62 6c 65 20 72 3b 0a 20 20 20 20 20 20 20 20 20  ble r;.         
98e0: 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72   Tcl_GetDoubleFr
98f0: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 56  omObj(interp, pV
9900: 61 72 2c 20 26 72 29 3b 0a 20 20 20 20 20 20 20  ar, &r);.       
9910: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
9920: 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20 69 2c  double(pStmt, i,
9930: 20 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   r);.        }el
9940: 73 65 20 69 66 28 20 28 63 3d 3d 27 77 27 20 26  se if( (c=='w' &
9950: 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22  & strcmp(zType,"
9960: 77 69 64 65 49 6e 74 22 29 3d 3d 30 29 20 7c 7c  wideInt")==0) ||
9970: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  .              (
9980: 63 3d 3d 27 69 27 20 26 26 20 73 74 72 63 6d 70  c=='i' && strcmp
9990: 28 7a 54 79 70 65 2c 22 69 6e 74 22 29 3d 3d 30  (zType,"int")==0
99a0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  ) ){.          T
99b0: 63 6c 5f 57 69 64 65 49 6e 74 20 76 3b 0a 20 20  cl_WideInt v;.  
99c0: 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 57          Tcl_GetW
99d0: 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  ideIntFromObj(in
99e0: 74 65 72 70 2c 20 70 56 61 72 2c 20 26 76 29 3b  terp, pVar, &v);
99f0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
9a00: 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53  e3_bind_int64(pS
9a10: 74 6d 74 2c 20 69 2c 20 76 29 3b 0a 20 20 20 20  tmt, i, v);.    
9a20: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9a30: 20 20 20 20 20 64 61 74 61 20 3d 20 28 75 6e 73       data = (uns
9a40: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 54 63 6c  igned char *)Tcl
9a50: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
9a60: 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20  j(pVar, &n);.   
9a70: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
9a80: 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  ind_text(pStmt, 
9a90: 69 2c 20 28 63 68 61 72 20 2a 29 64 61 74 61 2c  i, (char *)data,
9aa0: 20 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49   n, SQLITE_STATI
9ab0: 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 54 63  C);.          Tc
9ac0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
9ad0: 56 61 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Var);.          
9ae0: 70 50 72 65 53 74 6d 74 2d 3e 61 70 50 61 72 6d  pPreStmt->apParm
9af0: 5b 69 50 61 72 6d 2b 2b 5d 20 3d 20 70 56 61 72  [iParm++] = pVar
9b00: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
9b10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
9b20: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75   sqlite3_bind_nu
9b30: 6c 6c 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20  ll(pStmt, i);.  
9b40: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
9b50: 20 20 70 50 72 65 53 74 6d 74 2d 3e 6e 50 61 72    pPreStmt->nPar
9b60: 6d 20 3d 20 69 50 61 72 6d 3b 0a 20 20 2a 70 70  m = iParm;.  *pp
9b70: 50 72 65 53 74 6d 74 20 3d 20 70 50 72 65 53 74  PreStmt = pPreSt
9b80: 6d 74 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54 43  mt;..  return TC
9b90: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  L_OK;.}../*.** R
9ba0: 65 6c 65 61 73 65 20 61 20 73 74 61 74 65 6d 65  elease a stateme
9bb0: 6e 74 20 72 65 66 65 72 65 6e 63 65 20 6f 62 74  nt reference obt
9bc0: 61 69 6e 65 64 20 62 79 20 63 61 6c 6c 69 6e 67  ained by calling
9bd0: 20 64 62 50 72 65 70 61 72 65 41 6e 64 42 69 6e   dbPrepareAndBin
9be0: 64 28 29 2e 0a 2a 2a 20 54 68 65 72 65 20 73 68  d()..** There sh
9bf0: 6f 75 6c 64 20 62 65 20 65 78 61 63 74 6c 79 20  ould be exactly 
9c00: 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  one call to this
9c10: 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 65 61   function for ea
9c20: 63 68 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 64 62  ch call to.** db
9c30: 50 72 65 70 61 72 65 41 6e 64 42 69 6e 64 28 29  PrepareAndBind()
9c40: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64  ..**.** If the d
9c50: 69 73 63 61 72 64 20 70 61 72 61 6d 65 74 65 72  iscard parameter
9c60: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
9c70: 65 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  en the statement
9c80: 20 69 73 20 64 65 6c 65 74 65 64 0a 2a 2a 20 69   is deleted.** i
9c90: 6d 6d 65 64 69 61 74 65 6c 79 2e 20 4f 74 68 65  mmediately. Othe
9ca0: 72 77 69 73 65 20 69 74 20 69 73 20 61 64 64 65  rwise it is adde
9cb0: 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73  d to the LRU lis
9cc0: 74 20 61 6e 64 20 6d 61 79 20 62 65 20 72 65 74  t and may be ret
9cd0: 75 72 6e 65 64 0a 2a 2a 20 62 79 20 61 20 73 75  urned.** by a su
9ce0: 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f  bsequent call to
9cf0: 20 64 62 50 72 65 70 61 72 65 41 6e 64 42 69 6e   dbPrepareAndBin
9d00: 64 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  d()..*/.static v
9d10: 6f 69 64 20 64 62 52 65 6c 65 61 73 65 53 74 6d  oid dbReleaseStm
9d20: 74 28 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  t(.  SqliteDb *p
9d30: 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Db,             
9d40: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
9d50: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 53 71 6c   handle */.  Sql
9d60: 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70 50  PreparedStmt *pP
9d70: 72 65 53 74 6d 74 2c 20 20 20 20 20 20 2f 2a 20  reStmt,      /* 
9d80: 50 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  Prepared stateme
9d90: 6e 74 20 68 61 6e 64 6c 65 20 74 6f 20 72 65 6c  nt handle to rel
9da0: 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 64 69  ease */.  int di
9db0: 73 63 61 72 64 20 20 20 20 20 20 20 20 20 20 20  scard           
9dc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
9dd0: 65 20 74 6f 20 64 65 6c 65 74 65 20 28 6e 6f 74  e to delete (not
9de0: 20 63 61 63 68 65 29 20 74 68 65 20 70 50 72 65   cache) the pPre
9df0: 53 74 6d 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  Stmt */.){.  int
9e00: 20 69 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74   i;..  /* Free t
9e10: 68 65 20 62 6f 75 6e 64 20 73 74 72 69 6e 67 20  he bound string 
9e20: 61 6e 64 20 62 6c 6f 62 20 70 61 72 61 6d 65 74  and blob paramet
9e30: 65 72 73 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ers */.  for(i=0
9e40: 3b 20 69 3c 70 50 72 65 53 74 6d 74 2d 3e 6e 50  ; i<pPreStmt->nP
9e50: 61 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54  arm; i++){.    T
9e60: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
9e70: 70 50 72 65 53 74 6d 74 2d 3e 61 70 50 61 72 6d  pPreStmt->apParm
9e80: 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 70 50 72 65  [i]);.  }.  pPre
9e90: 53 74 6d 74 2d 3e 6e 50 61 72 6d 20 3d 20 30 3b  Stmt->nParm = 0;
9ea0: 0a 0a 20 20 69 66 28 20 70 44 62 2d 3e 6d 61 78  ..  if( pDb->max
9eb0: 53 74 6d 74 3c 3d 30 20 7c 7c 20 64 69 73 63 61  Stmt<=0 || disca
9ec0: 72 64 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  rd ){.    /* If 
9ed0: 74 68 65 20 63 61 63 68 65 20 69 73 20 74 75 72  the cache is tur
9ee0: 6e 65 64 20 6f 66 66 2c 20 64 65 61 6c 6c 6f 63  ned off, dealloc
9ef0: 61 74 65 64 20 74 68 65 20 73 74 61 74 65 6d 65  ated the stateme
9f00: 6e 74 20 2a 2f 0a 20 20 20 20 64 62 46 72 65 65  nt */.    dbFree
9f10: 53 74 6d 74 28 70 50 72 65 53 74 6d 74 29 3b 0a  Stmt(pPreStmt);.
9f20: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
9f30: 41 64 64 20 74 68 65 20 70 72 65 70 61 72 65 64  Add the prepared
9f40: 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 74 68   statement to th
9f50: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
9f60: 68 65 20 63 61 63 68 65 20 6c 69 73 74 2e 20 2a  he cache list. *
9f70: 2f 0a 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e  /.    pPreStmt->
9f80: 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e 73 74 6d  pNext = pDb->stm
9f90: 74 4c 69 73 74 3b 0a 20 20 20 20 70 50 72 65 53  tList;.    pPreS
9fa0: 74 6d 74 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a  tmt->pPrev = 0;.
9fb0: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 73 74 6d      if( pDb->stm
9fc0: 74 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 70 44  tList ){.     pD
9fd0: 62 2d 3e 73 74 6d 74 4c 69 73 74 2d 3e 70 50 72  b->stmtList->pPr
9fe0: 65 76 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a 20  ev = pPreStmt;. 
9ff0: 20 20 20 7d 0a 20 20 20 20 70 44 62 2d 3e 73 74     }.    pDb->st
a000: 6d 74 4c 69 73 74 20 3d 20 70 50 72 65 53 74 6d  mtList = pPreStm
a010: 74 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e  t;.    if( pDb->
a020: 73 74 6d 74 4c 61 73 74 3d 3d 30 20 29 7b 0a 20  stmtLast==0 ){. 
a030: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44 62       assert( pDb
a040: 2d 3e 6e 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20  ->nStmt==0 );.  
a050: 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73      pDb->stmtLas
a060: 74 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a 20 20  t = pPreStmt;.  
a070: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
a080: 73 73 65 72 74 28 20 70 44 62 2d 3e 6e 53 74 6d  ssert( pDb->nStm
a090: 74 3e 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  t>0 );.    }.   
a0a0: 20 70 44 62 2d 3e 6e 53 74 6d 74 2b 2b 3b 0a 20   pDb->nStmt++;. 
a0b0: 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20    .    /* If we 
a0c0: 68 61 76 65 20 74 6f 6f 20 6d 61 6e 79 20 73 74  have too many st
a0d0: 61 74 65 6d 65 6e 74 20 69 6e 20 63 61 63 68 65  atement in cache
a0e0: 2c 20 72 65 6d 6f 76 65 20 74 68 65 20 73 75 72  , remove the sur
a0f0: 70 6c 75 73 20 66 72 6f 6d 20 0a 20 20 20 20 2a  plus from .    *
a100: 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  * the end of the
a110: 20 63 61 63 68 65 20 6c 69 73 74 2e 20 20 2a 2f   cache list.  */
a120: 0a 20 20 20 20 77 68 69 6c 65 28 20 70 44 62 2d  .    while( pDb-
a130: 3e 6e 53 74 6d 74 3e 70 44 62 2d 3e 6d 61 78 53  >nStmt>pDb->maxS
a140: 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 53 71 6c  tmt ){.      Sql
a150: 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70 4c  PreparedStmt *pL
a160: 61 73 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c  ast = pDb->stmtL
a170: 61 73 74 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e  ast;.      pDb->
a180: 73 74 6d 74 4c 61 73 74 20 3d 20 70 4c 61 73 74  stmtLast = pLast
a190: 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20 70  ->pPrev;.      p
a1a0: 44 62 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e 70 4e  Db->stmtLast->pN
a1b0: 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ext = 0;.      p
a1c0: 44 62 2d 3e 6e 53 74 6d 74 2d 2d 3b 0a 20 20 20  Db->nStmt--;.   
a1d0: 20 20 20 64 62 46 72 65 65 53 74 6d 74 28 70 4c     dbFreeStmt(pL
a1e0: 61 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ast);.    }.  }.
a1f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75  }../*.** Structu
a200: 72 65 20 75 73 65 64 20 77 69 74 68 20 64 62 45  re used with dbE
a210: 76 61 6c 58 58 58 28 29 20 66 75 6e 63 74 69 6f  valXXX() functio
a220: 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 64 62 45 76  ns:.**.**   dbEv
a230: 61 6c 49 6e 69 74 28 29 0a 2a 2a 20 20 20 64 62  alInit().**   db
a240: 45 76 61 6c 53 74 65 70 28 29 0a 2a 2a 20 20 20  EvalStep().**   
a250: 64 62 45 76 61 6c 46 69 6e 61 6c 69 7a 65 28 29  dbEvalFinalize()
a260: 0a 2a 2a 20 20 20 64 62 45 76 61 6c 52 6f 77 49  .**   dbEvalRowI
a270: 6e 66 6f 28 29 0a 2a 2a 20 20 20 64 62 45 76 61  nfo().**   dbEva
a280: 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65 28 29 0a 2a  lColumnValue().*
a290: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
a2a0: 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 44   DbEvalContext D
a2b0: 62 45 76 61 6c 43 6f 6e 74 65 78 74 3b 0a 73 74  bEvalContext;.st
a2c0: 72 75 63 74 20 44 62 45 76 61 6c 43 6f 6e 74 65  ruct DbEvalConte
a2d0: 78 74 20 7b 0a 20 20 53 71 6c 69 74 65 44 62 20  xt {.  SqliteDb 
a2e0: 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  *pDb;           
a2f0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
a300: 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 54  se handle */.  T
a310: 63 6c 5f 4f 62 6a 20 2a 70 53 71 6c 3b 20 20 20  cl_Obj *pSql;   
a320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a330: 2a 20 4f 62 6a 65 63 74 20 68 6f 6c 64 69 6e 67  * Object holding
a340: 20 73 74 72 69 6e 67 20 7a 53 71 6c 20 2a 2f 0a   string zSql */.
a350: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
a360: 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ql;             
a370: 20 20 2f 2a 20 52 65 6d 61 69 6e 69 6e 67 20 53    /* Remaining S
a380: 51 4c 20 74 6f 20 65 78 65 63 75 74 65 20 2a 2f  QL to execute */
a390: 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74  .  SqlPreparedSt
a3a0: 6d 74 20 2a 70 50 72 65 53 74 6d 74 3b 20 20 20  mt *pPreStmt;   
a3b0: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 74     /* Current st
a3c0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
a3d0: 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   nCol;          
a3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a3f0: 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
a400: 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 70 53  s returned by pS
a410: 74 6d 74 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  tmt */.  Tcl_Obj
a420: 20 2a 70 41 72 72 61 79 3b 20 20 20 20 20 20 20   *pArray;       
a430: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
a440: 20 6f 66 20 61 72 72 61 79 20 76 61 72 69 61 62   of array variab
a450: 6c 65 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  le */.  Tcl_Obj 
a460: 2a 2a 61 70 43 6f 6c 4e 61 6d 65 3b 20 20 20 20  **apColName;    
a470: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
a480: 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73   of column names
a490: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65   */.};../*.** Re
a4a0: 6c 65 61 73 65 20 61 6e 79 20 63 61 63 68 65 20  lease any cache 
a4b0: 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  of column names 
a4c0: 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 61  currently held a
a4d0: 73 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65  s part of.** the
a4e0: 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 73   DbEvalContext s
a4f0: 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20  tructure passed 
a500: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
a510: 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
a520: 20 76 6f 69 64 20 64 62 52 65 6c 65 61 73 65 43   void dbReleaseC
a530: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 44 62 45 76 61  olumnNames(DbEva
a540: 6c 43 6f 6e 74 65 78 74 20 2a 70 29 7b 0a 20 20  lContext *p){.  
a550: 69 66 28 20 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65  if( p->apColName
a560: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
a570: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
a580: 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
a590: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
a5a0: 75 6e 74 28 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65  unt(p->apColName
a5b0: 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [i]);.    }.    
a5c0: 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 20 2a  Tcl_Free((char *
a5d0: 29 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65 29 3b 0a  )p->apColName);.
a5e0: 20 20 20 20 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65      p->apColName
a5f0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e   = 0;.  }.  p->n
a600: 43 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Col = 0;.}../*.*
a610: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 44  * Initialize a D
a620: 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 73 74 72  bEvalContext str
a630: 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  ucture..**.** If
a640: 20 70 41 72 72 61 79 20 69 73 20 6e 6f 74 20 4e   pArray is not N
a650: 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 63 6f 6e  ULL, then it con
a660: 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f  tains the name o
a670: 66 20 61 20 54 63 6c 20 61 72 72 61 79 0a 2a 2a  f a Tcl array.**
a680: 20 76 61 72 69 61 62 6c 65 2e 20 54 68 65 20 22   variable. The "
a690: 2a 22 20 6d 65 6d 62 65 72 20 6f 66 20 74 68 69  *" member of thi
a6a0: 73 20 61 72 72 61 79 20 69 73 20 73 65 74 20 74  s array is set t
a6b0: 6f 20 61 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e  o a list contain
a6c0: 69 6e 67 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 73  ing.** the names
a6d0: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20   of the columns 
a6e0: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
a6f0: 73 74 61 74 65 6d 65 6e 74 20 61 73 20 70 61 72  statement as par
a700: 74 20 6f 66 20 65 61 63 68 0a 2a 2a 20 63 61 6c  t of each.** cal
a710: 6c 20 74 6f 20 64 62 45 76 61 6c 53 74 65 70 28  l to dbEvalStep(
a720: 29 2c 20 69 6e 20 6f 72 64 65 72 20 66 72 6f 6d  ), in order from
a730: 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e 20   left to right. 
a740: 65 2e 67 2e 20 69 66 20 74 68 65 20 6e 61 6d 65  e.g. if the name
a750: 73 20 0a 2a 2a 20 6f 66 20 74 68 65 20 72 65 74  s .** of the ret
a760: 75 72 6e 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72  urned columns ar
a770: 65 20 61 2c 20 62 20 61 6e 64 20 63 2c 20 69 74  e a, b and c, it
a780: 20 64 6f 65 73 20 74 68 65 20 65 71 75 69 76 61   does the equiva
a790: 6c 65 6e 74 20 6f 66 20 74 68 65 20 0a 2a 2a 20  lent of the .** 
a7a0: 74 63 6c 20 63 6f 6d 6d 61 6e 64 3a 0a 2a 2a 0a  tcl command:.**.
a7b0: 2a 2a 20 20 20 20 20 73 65 74 20 24 7b 70 41 72  **     set ${pAr
a7c0: 72 61 79 7d 28 2a 29 20 7b 61 20 62 20 63 7d 0a  ray}(*) {a b c}.
a7d0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
a7e0: 62 45 76 61 6c 49 6e 69 74 28 0a 20 20 44 62 45  bEvalInit(.  DbE
a7f0: 76 61 6c 43 6f 6e 74 65 78 74 20 2a 70 2c 20 20  valContext *p,  
a800: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a810: 50 6f 69 6e 74 65 72 20 74 6f 20 73 74 72 75 63  Pointer to struc
a820: 74 75 72 65 20 74 6f 20 69 6e 69 74 69 61 6c 69  ture to initiali
a830: 7a 65 20 2a 2f 0a 20 20 53 71 6c 69 74 65 44 62  ze */.  SqliteDb
a840: 20 2a 70 44 62 2c 20 20 20 20 20 20 20 20 20 20   *pDb,          
a850: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
a860: 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ase handle */.  
a870: 54 63 6c 5f 4f 62 6a 20 2a 70 53 71 6c 2c 20 20  Tcl_Obj *pSql,  
a880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a890: 2f 2a 20 4f 62 6a 65 63 74 20 63 6f 6e 74 61 69  /* Object contai
a8a0: 6e 69 6e 67 20 53 51 4c 20 73 63 72 69 70 74 20  ning SQL script 
a8b0: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 41  */.  Tcl_Obj *pA
a8c0: 72 72 61 79 20 20 20 20 20 20 20 20 20 20 20 20  rray            
a8d0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
a8e0: 54 63 6c 20 61 72 72 61 79 20 74 6f 20 73 65 74  Tcl array to set
a8f0: 20 28 2a 29 20 65 6c 65 6d 65 6e 74 20 6f 66 20   (*) element of 
a900: 2a 2f 0a 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70  */.){.  memset(p
a910: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 44 62 45 76  , 0, sizeof(DbEv
a920: 61 6c 43 6f 6e 74 65 78 74 29 29 3b 0a 20 20 70  alContext));.  p
a930: 2d 3e 70 44 62 20 3d 20 70 44 62 3b 0a 20 20 70  ->pDb = pDb;.  p
a940: 2d 3e 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74  ->zSql = Tcl_Get
a950: 53 74 72 69 6e 67 28 70 53 71 6c 29 3b 0a 20 20  String(pSql);.  
a960: 70 2d 3e 70 53 71 6c 20 3d 20 70 53 71 6c 3b 0a  p->pSql = pSql;.
a970: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
a980: 6e 74 28 70 53 71 6c 29 3b 0a 20 20 69 66 28 20  nt(pSql);.  if( 
a990: 70 41 72 72 61 79 20 29 7b 0a 20 20 20 20 70 2d  pArray ){.    p-
a9a0: 3e 70 41 72 72 61 79 20 3d 20 70 41 72 72 61 79  >pArray = pArray
a9b0: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ;.    Tcl_IncrRe
a9c0: 66 43 6f 75 6e 74 28 70 41 72 72 61 79 29 3b 0a  fCount(pArray);.
a9d0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74    }.}../*.** Obt
a9e0: 61 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ain information 
a9f0: 61 62 6f 75 74 20 74 68 65 20 72 6f 77 20 74 68  about the row th
aa00: 61 74 20 74 68 65 20 44 62 45 76 61 6c 43 6f 6e  at the DbEvalCon
aa10: 74 65 78 74 20 70 61 73 73 65 64 20 61 73 20 74  text passed as t
aa20: 68 65 0a 2a 2a 20 66 69 72 73 74 20 61 72 67 75  he.** first argu
aa30: 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c 79 20 70  ment currently p
aa40: 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61  oints to..*/.sta
aa50: 74 69 63 20 76 6f 69 64 20 64 62 45 76 61 6c 52  tic void dbEvalR
aa60: 6f 77 49 6e 66 6f 28 0a 20 20 44 62 45 76 61 6c  owInfo(.  DbEval
aa70: 43 6f 6e 74 65 78 74 20 2a 70 2c 20 20 20 20 20  Context *p,     
aa80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 76 61            /* Eva
aa90: 6c 75 61 74 69 6f 6e 20 63 6f 6e 74 65 78 74 20  luation context 
aaa0: 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 6f 6c 2c  */.  int *pnCol,
aab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aac0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 75 6d       /* OUT: Num
aad0: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61  ber of column na
aae0: 6d 65 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  mes */.  Tcl_Obj
aaf0: 20 2a 2a 2a 70 61 70 43 6f 6c 4e 61 6d 65 20 20   ***papColName  
ab00: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
ab10: 20 41 72 72 61 79 20 6f 66 20 63 6f 6c 75 6d 6e   Array of column
ab20: 20 6e 61 6d 65 73 20 2a 2f 0a 29 7b 0a 20 20 2f   names */.){.  /
ab30: 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 75 6d 6e  * Compute column
ab40: 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 66 28 20   names */.  if( 
ab50: 30 3d 3d 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65 20  0==p->apColName 
ab60: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
ab70: 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 70 2d 3e  tmt *pStmt = p->
ab80: 70 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74 3b  pPreStmt->pStmt;
ab90: 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20  .    int i;     
aba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abb0: 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76     /* Iterator v
abc0: 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69  ariable */.    i
abd0: 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt nCol;        
abe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
abf0: 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
ac00: 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 70 53  s returned by pS
ac10: 74 6d 74 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f  tmt */.    Tcl_O
ac20: 62 6a 20 2a 2a 61 70 43 6f 6c 4e 61 6d 65 20 3d  bj **apColName =
ac30: 20 30 3b 20 20 20 20 20 20 2f 2a 20 41 72 72 61   0;      /* Arra
ac40: 79 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  y of column name
ac50: 73 20 2a 2f 0a 0a 20 20 20 20 70 2d 3e 6e 43 6f  s */..    p->nCo
ac60: 6c 20 3d 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74  l = nCol = sqlit
ac70: 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28  e3_column_count(
ac80: 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20  pStmt);.    if( 
ac90: 6e 43 6f 6c 3e 30 20 26 26 20 28 70 61 70 43 6f  nCol>0 && (papCo
aca0: 6c 4e 61 6d 65 20 7c 7c 20 70 2d 3e 70 41 72 72  lName || p->pArr
acb0: 61 79 29 20 29 7b 0a 20 20 20 20 20 20 61 70 43  ay) ){.      apC
acc0: 6f 6c 4e 61 6d 65 20 3d 20 28 54 63 6c 5f 4f 62  olName = (Tcl_Ob
acd0: 6a 2a 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73  j**)Tcl_Alloc( s
ace0: 69 7a 65 6f 66 28 54 63 6c 5f 4f 62 6a 2a 29 2a  izeof(Tcl_Obj*)*
acf0: 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 66 6f  nCol );.      fo
ad00: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
ad10: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 70 43  ++){.        apC
ad20: 6f 6c 4e 61 6d 65 5b 69 5d 20 3d 20 54 63 6c 5f  olName[i] = Tcl_
ad30: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c  NewStringObj(sql
ad40: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65  ite3_column_name
ad50: 28 70 53 74 6d 74 2c 69 29 2c 20 2d 31 29 3b 0a  (pStmt,i), -1);.
ad60: 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72          Tcl_Incr
ad70: 52 65 66 43 6f 75 6e 74 28 61 70 43 6f 6c 4e 61  RefCount(apColNa
ad80: 6d 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  me[i]);.      }.
ad90: 20 20 20 20 20 20 70 2d 3e 61 70 43 6f 6c 4e 61        p->apColNa
ada0: 6d 65 20 3d 20 61 70 43 6f 6c 4e 61 6d 65 3b 0a  me = apColName;.
adb0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
adc0: 20 72 65 73 75 6c 74 73 20 61 72 65 20 62 65 69   results are bei
add0: 6e 67 20 73 74 6f 72 65 64 20 69 6e 20 61 6e 20  ng stored in an 
ade0: 61 72 72 61 79 20 76 61 72 69 61 62 6c 65 2c 20  array variable, 
adf0: 74 68 65 6e 20 63 72 65 61 74 65 0a 20 20 20 20  then create.    
ae00: 2a 2a 20 74 68 65 20 61 72 72 61 79 28 2a 29 20  ** the array(*) 
ae10: 65 6e 74 72 79 20 66 6f 72 20 74 68 61 74 20 61  entry for that a
ae20: 72 72 61 79 0a 20 20 20 20 2a 2f 0a 20 20 20 20  rray.    */.    
ae30: 69 66 28 20 70 2d 3e 70 41 72 72 61 79 20 29 7b  if( p->pArray ){
ae40: 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 74 65 72  .      Tcl_Inter
ae50: 70 20 2a 69 6e 74 65 72 70 20 3d 20 70 2d 3e 70  p *interp = p->p
ae60: 44 62 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20  Db->interp;.    
ae70: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6f 6c 4c    Tcl_Obj *pColL
ae80: 69 73 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a  ist = Tcl_NewObj
ae90: 28 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62  ();.      Tcl_Ob
aea0: 6a 20 2a 70 53 74 61 72 20 3d 20 54 63 6c 5f 4e  j *pStar = Tcl_N
aeb0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 2a 22 2c  ewStringObj("*",
aec0: 20 2d 31 29 3b 0a 0a 20 20 20 20 20 20 66 6f 72   -1);..      for
aed0: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
aee0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  +){.        Tcl_
aef0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
af00: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 43 6f  ment(interp, pCo
af10: 6c 4c 69 73 74 2c 20 61 70 43 6f 6c 4e 61 6d 65  lList, apColName
af20: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [i]);.      }.  
af30: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
af40: 6f 75 6e 74 28 70 53 74 61 72 29 3b 0a 20 20 20  ount(pStar);.   
af50: 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72     Tcl_ObjSetVar
af60: 32 28 69 6e 74 65 72 70 2c 20 70 2d 3e 70 41 72  2(interp, p->pAr
af70: 72 61 79 2c 20 70 53 74 61 72 2c 20 70 43 6f 6c  ray, pStar, pCol
af80: 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  List, 0);.      
af90: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
afa0: 28 70 53 74 61 72 29 3b 0a 20 20 20 20 7d 0a 20  (pStar);.    }. 
afb0: 20 7d 0a 0a 20 20 69 66 28 20 70 61 70 43 6f 6c   }..  if( papCol
afc0: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 2a 70 61 70  Name ){.    *pap
afd0: 43 6f 6c 4e 61 6d 65 20 3d 20 70 2d 3e 61 70 43  ColName = p->apC
afe0: 6f 6c 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 69 66  olName;.  }.  if
aff0: 28 20 70 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 2a  ( pnCol ){.    *
b000: 70 6e 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 3b  pnCol = p->nCol;
b010: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
b020: 74 75 72 6e 20 6f 6e 65 20 6f 66 20 54 43 4c 5f  turn one of TCL_
b030: 4f 4b 2c 20 54 43 4c 5f 42 52 45 41 4b 20 6f 72  OK, TCL_BREAK or
b040: 20 54 43 4c 5f 45 52 52 4f 52 2e 20 49 66 20 54   TCL_ERROR. If T
b050: 43 4c 5f 45 52 52 4f 52 20 69 73 0a 2a 2a 20 72  CL_ERROR is.** r
b060: 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 61 6e  eturned, then an
b070: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
b080: 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  s stored in the 
b090: 69 6e 74 65 72 70 72 65 74 65 72 20 62 65 66 6f  interpreter befo
b0a0: 72 65 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2e  re.** returning.
b0b0: 0a 2a 2a 0a 2a 2a 20 41 20 72 65 74 75 72 6e 20  .**.** A return 
b0c0: 76 61 6c 75 65 20 6f 66 20 54 43 4c 5f 4f 4b 20  value of TCL_OK 
b0d0: 6d 65 61 6e 73 20 74 68 65 72 65 20 69 73 20 61  means there is a
b0e0: 20 72 6f 77 20 6f 66 20 64 61 74 61 20 61 76 61   row of data ava
b0f0: 69 6c 61 62 6c 65 2e 20 54 68 65 0a 2a 2a 20 64  ilable. The.** d
b100: 61 74 61 20 6d 61 79 20 62 65 20 61 63 63 65 73  ata may be acces
b110: 73 65 64 20 75 73 69 6e 67 20 64 62 45 76 61 6c  sed using dbEval
b120: 52 6f 77 49 6e 66 6f 28 29 20 61 6e 64 20 64 62  RowInfo() and db
b130: 45 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65 28  EvalColumnValue(
b140: 29 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 61 6e  ). This.** is an
b150: 61 6c 6f 67 6f 75 73 20 74 6f 20 61 20 72 65 74  alogous to a ret
b160: 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 52 4f  urn of SQLITE_RO
b170: 57 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 73  W from sqlite3_s
b180: 74 65 70 28 29 2e 20 49 66 20 54 43 4c 5f 42 52  tep(). If TCL_BR
b190: 45 41 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  EAK.** is return
b1a0: 65 64 2c 20 74 68 65 6e 20 74 68 65 20 53 51 4c  ed, then the SQL
b1b0: 20 73 63 72 69 70 74 20 68 61 73 20 66 69 6e 69   script has fini
b1c0: 73 68 65 64 20 65 78 65 63 75 74 69 6e 67 20 61  shed executing a
b1d0: 6e 64 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20  nd there are.** 
b1e0: 6e 6f 20 66 75 72 74 68 65 72 20 72 6f 77 73 20  no further rows 
b1f0: 61 76 61 69 6c 61 62 6c 65 2e 20 54 68 69 73 20  available. This 
b200: 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 53 51  is similar to SQ
b210: 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2f 0a 73 74  LITE_DONE..*/.st
b220: 61 74 69 63 20 69 6e 74 20 64 62 45 76 61 6c 53  atic int dbEvalS
b230: 74 65 70 28 44 62 45 76 61 6c 43 6f 6e 74 65 78  tep(DbEvalContex
b240: 74 20 2a 70 29 7b 0a 20 20 63 6f 6e 73 74 20 63  t *p){.  const c
b250: 68 61 72 20 2a 7a 50 72 65 76 53 71 6c 20 3d 20  har *zPrevSql = 
b260: 30 3b 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76  0;       /* Prev
b270: 69 6f 75 73 20 76 61 6c 75 65 20 6f 66 20 70 2d  ious value of p-
b280: 3e 7a 53 71 6c 20 2a 2f 0a 0a 20 20 77 68 69 6c  >zSql */..  whil
b290: 65 28 20 70 2d 3e 7a 53 71 6c 5b 30 5d 20 7c 7c  e( p->zSql[0] ||
b2a0: 20 70 2d 3e 70 50 72 65 53 74 6d 74 20 29 7b 0a   p->pPreStmt ){.
b2b0: 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
b2c0: 69 66 28 20 70 2d 3e 70 50 72 65 53 74 6d 74 3d  if( p->pPreStmt=
b2d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 50 72 65  =0 ){.      zPre
b2e0: 76 53 71 6c 20 3d 20 28 70 2d 3e 7a 53 71 6c 3d  vSql = (p->zSql=
b2f0: 3d 7a 50 72 65 76 53 71 6c 20 3f 20 30 20 3a 20  =zPrevSql ? 0 : 
b300: 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20  p->zSql);.      
b310: 72 63 20 3d 20 64 62 50 72 65 70 61 72 65 41 6e  rc = dbPrepareAn
b320: 64 42 69 6e 64 28 70 2d 3e 70 44 62 2c 20 70 2d  dBind(p->pDb, p-
b330: 3e 7a 53 71 6c 2c 20 26 70 2d 3e 7a 53 71 6c 2c  >zSql, &p->zSql,
b340: 20 26 70 2d 3e 70 50 72 65 53 74 6d 74 29 3b 0a   &p->pPreStmt);.
b350: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 54 43        if( rc!=TC
b360: 4c 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  L_OK ) return rc
b370: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
b380: 20 20 20 69 6e 74 20 72 63 73 3b 0a 20 20 20 20     int rcs;.    
b390: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
b3a0: 3d 20 70 2d 3e 70 44 62 3b 0a 20 20 20 20 20 20  = p->pDb;.      
b3b0: 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20  SqlPreparedStmt 
b3c0: 2a 70 50 72 65 53 74 6d 74 20 3d 20 70 2d 3e 70  *pPreStmt = p->p
b3d0: 50 72 65 53 74 6d 74 3b 0a 20 20 20 20 20 20 73  PreStmt;.      s
b3e0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
b3f0: 6d 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70  mt = pPreStmt->p
b400: 53 74 6d 74 3b 0a 0a 20 20 20 20 20 20 72 63 73  Stmt;..      rcs
b410: 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28   = sqlite3_step(
b420: 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 69 66  pStmt);.      if
b430: 28 20 72 63 73 3d 3d 53 51 4c 49 54 45 5f 52 4f  ( rcs==SQLITE_RO
b440: 57 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  W ){.        ret
b450: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20  urn TCL_OK;.    
b460: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d    }.      if( p-
b470: 3e 70 41 72 72 61 79 20 29 7b 0a 20 20 20 20 20  >pArray ){.     
b480: 20 20 20 64 62 45 76 61 6c 52 6f 77 49 6e 66 6f     dbEvalRowInfo
b490: 28 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  (p, 0, 0);.     
b4a0: 20 7d 0a 20 20 20 20 20 20 72 63 73 20 3d 20 73   }.      rcs = s
b4b0: 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74  qlite3_reset(pSt
b4c0: 6d 74 29 3b 0a 0a 20 20 20 20 20 20 70 44 62 2d  mt);..      pDb-
b4d0: 3e 6e 53 74 65 70 20 3d 20 73 71 6c 69 74 65 33  >nStep = sqlite3
b4e0: 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70 53 74  _stmt_status(pSt
b4f0: 6d 74 2c 53 51 4c 49 54 45 5f 53 54 4d 54 53 54  mt,SQLITE_STMTST
b500: 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54  ATUS_FULLSCAN_ST
b510: 45 50 2c 31 29 3b 0a 20 20 20 20 20 20 70 44 62  EP,1);.      pDb
b520: 2d 3e 6e 53 6f 72 74 20 3d 20 73 71 6c 69 74 65  ->nSort = sqlite
b530: 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70 53  3_stmt_status(pS
b540: 74 6d 74 2c 53 51 4c 49 54 45 5f 53 54 4d 54 53  tmt,SQLITE_STMTS
b550: 54 41 54 55 53 5f 53 4f 52 54 2c 31 29 3b 0a 20  TATUS_SORT,1);. 
b560: 20 20 20 20 20 70 44 62 2d 3e 6e 49 6e 64 65 78       pDb->nIndex
b570: 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f   = sqlite3_stmt_
b580: 73 74 61 74 75 73 28 70 53 74 6d 74 2c 53 51 4c  status(pStmt,SQL
b590: 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 41  ITE_STMTSTATUS_A
b5a0: 55 54 4f 49 4e 44 45 58 2c 31 29 3b 0a 20 20 20  UTOINDEX,1);.   
b5b0: 20 20 20 64 62 52 65 6c 65 61 73 65 43 6f 6c 75     dbReleaseColu
b5c0: 6d 6e 4e 61 6d 65 73 28 70 29 3b 0a 20 20 20 20  mnNames(p);.    
b5d0: 20 20 70 2d 3e 70 50 72 65 53 74 6d 74 20 3d 20    p->pPreStmt = 
b5e0: 30 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63  0;..      if( rc
b5f0: 73 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  s!=SQLITE_OK ){.
b600: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20          /* If a 
b610: 72 75 6e 2d 74 69 6d 65 20 65 72 72 6f 72 20 6f  run-time error o
b620: 63 63 75 72 73 2c 20 72 65 70 6f 72 74 20 74 68  ccurs, report th
b630: 65 20 65 72 72 6f 72 20 61 6e 64 20 73 74 6f 70  e error and stop
b640: 20 72 65 61 64 69 6e 67 0a 20 20 20 20 20 20 20   reading.       
b650: 20 2a 2a 20 74 68 65 20 53 51 4c 2e 20 20 2a 2f   ** the SQL.  */
b660: 0a 20 20 20 20 20 20 20 20 64 62 52 65 6c 65 61  .        dbRelea
b670: 73 65 53 74 6d 74 28 70 44 62 2c 20 70 50 72 65  seStmt(pDb, pPre
b680: 53 74 6d 74 2c 20 31 29 3b 0a 23 69 66 20 53 51  Stmt, 1);.#if SQ
b690: 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20 20 20  LITE_TEST.      
b6a0: 20 20 69 66 28 20 70 2d 3e 70 44 62 2d 3e 62 4c    if( p->pDb->bL
b6b0: 65 67 61 63 79 50 72 65 70 61 72 65 20 26 26 20  egacyPrepare && 
b6c0: 72 63 73 3d 3d 53 51 4c 49 54 45 5f 53 43 48 45  rcs==SQLITE_SCHE
b6d0: 4d 41 20 26 26 20 7a 50 72 65 76 53 71 6c 20 29  MA && zPrevSql )
b6e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
b6f0: 66 20 74 68 65 20 72 75 6e 74 69 6d 65 20 65 72  f the runtime er
b700: 72 6f 72 20 77 61 73 20 61 6e 20 53 51 4c 49 54  ror was an SQLIT
b710: 45 5f 53 43 48 45 4d 41 2c 20 61 6e 64 20 74 68  E_SCHEMA, and th
b720: 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20  e database.     
b730: 20 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 20 69       ** handle i
b740: 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20  s configured to 
b750: 75 73 65 20 74 68 65 20 6c 65 67 61 63 79 20 73  use the legacy s
b760: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 29  qlite3_prepare()
b770: 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69   .          ** i
b780: 6e 74 65 72 66 61 63 65 2c 20 72 65 74 72 79 20  nterface, retry 
b790: 70 72 65 70 61 72 65 28 29 2f 73 74 65 70 28 29  prepare()/step()
b7a0: 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 53 51 4c   on the same SQL
b7b0: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20   statement..    
b7c0: 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6f 6e        ** This on
b7d0: 6c 79 20 68 61 70 70 65 6e 73 20 6f 6e 63 65 2e  ly happens once.
b7e0: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 73   If there is a s
b7f0: 65 63 6f 6e 64 20 53 51 4c 49 54 45 5f 53 43 48  econd SQLITE_SCH
b800: 45 4d 41 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  EMA.          **
b810: 20 65 72 72 6f 72 2c 20 74 68 65 20 65 72 72 6f   error, the erro
b820: 72 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  r will be return
b830: 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ed to the caller
b840: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70  . */.          p
b850: 2d 3e 7a 53 71 6c 20 3d 20 7a 50 72 65 76 53 71  ->zSql = zPrevSq
b860: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  l;.          con
b870: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d  tinue;.        }
b880: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
b890: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
b8a0: 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 0a 20 20  (pDb->interp,.  
b8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8c0: 20 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74         Tcl_NewSt
b8d0: 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 5f  ringObj(sqlite3_
b8e0: 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c  errmsg(pDb->db),
b8f0: 20 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20 72   -1));.        r
b900: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
b910: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
b920: 20 20 20 20 20 20 64 62 52 65 6c 65 61 73 65 53        dbReleaseS
b930: 74 6d 74 28 70 44 62 2c 20 70 50 72 65 53 74 6d  tmt(pDb, pPreStm
b940: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 0);.      }. 
b950: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
b960: 69 6e 69 73 68 65 64 20 2a 2f 0a 20 20 72 65 74  inished */.  ret
b970: 75 72 6e 20 54 43 4c 5f 42 52 45 41 4b 3b 0a 7d  urn TCL_BREAK;.}
b980: 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c  ../*.** Free all
b990: 20 72 65 73 6f 75 72 63 65 73 20 63 75 72 72 65   resources curre
b9a0: 6e 74 6c 79 20 68 65 6c 64 20 62 79 20 74 68 65  ntly held by the
b9b0: 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 73   DbEvalContext s
b9c0: 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64 0a  tructure passed.
b9d0: 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ** as the first 
b9e0: 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 72 65 20  argument. There 
b9f0: 73 68 6f 75 6c 64 20 62 65 20 65 78 61 63 74 6c  should be exactl
ba00: 79 20 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 74 68  y one call to th
ba10: 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66  is function.** f
ba20: 6f 72 20 65 61 63 68 20 63 61 6c 6c 20 74 6f 20  or each call to 
ba30: 64 62 45 76 61 6c 49 6e 69 74 28 29 2e 0a 2a 2f  dbEvalInit()..*/
ba40: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 62 45  .static void dbE
ba50: 76 61 6c 46 69 6e 61 6c 69 7a 65 28 44 62 45 76  valFinalize(DbEv
ba60: 61 6c 43 6f 6e 74 65 78 74 20 2a 70 29 7b 0a 20  alContext *p){. 
ba70: 20 69 66 28 20 70 2d 3e 70 50 72 65 53 74 6d 74   if( p->pPreStmt
ba80: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
ba90: 72 65 73 65 74 28 70 2d 3e 70 50 72 65 53 74 6d  reset(p->pPreStm
baa0: 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 64  t->pStmt);.    d
bab0: 62 52 65 6c 65 61 73 65 53 74 6d 74 28 70 2d 3e  bReleaseStmt(p->
bac0: 70 44 62 2c 20 70 2d 3e 70 50 72 65 53 74 6d 74  pDb, p->pPreStmt
bad0: 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 70 50 72  , 0);.    p->pPr
bae0: 65 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  eStmt = 0;.  }. 
baf0: 20 69 66 28 20 70 2d 3e 70 41 72 72 61 79 20 29   if( p->pArray )
bb00: 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  {.    Tcl_DecrRe
bb10: 66 43 6f 75 6e 74 28 70 2d 3e 70 41 72 72 61 79  fCount(p->pArray
bb20: 29 3b 0a 20 20 20 20 70 2d 3e 70 41 72 72 61 79  );.    p->pArray
bb30: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f   = 0;.  }.  Tcl_
bb40: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e  DecrRefCount(p->
bb50: 70 53 71 6c 29 3b 0a 20 20 64 62 52 65 6c 65 61  pSql);.  dbRelea
bb60: 73 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 29  seColumnNames(p)
bb70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
bb80: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
bb90: 20 54 63 6c 5f 4f 62 6a 20 73 74 72 75 63 74 75   Tcl_Obj structu
bba0: 72 65 20 77 69 74 68 20 72 65 66 2d 63 6f 75 6e  re with ref-coun
bbb0: 74 20 30 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  t 0 that contain
bbc0: 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 66  s.** the value f
bbd0: 6f 72 20 74 68 65 20 69 43 6f 6c 27 74 68 20 63  or the iCol'th c
bbe0: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 72 6f 77  olumn of the row
bbf0: 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
bc00: 65 64 20 74 6f 20 62 79 0a 2a 2a 20 74 68 65 20  ed to by.** the 
bc10: 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 73 74  DbEvalContext st
bc20: 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61  ructure passed a
bc30: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
bc40: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
bc50: 54 63 6c 5f 4f 62 6a 20 2a 64 62 45 76 61 6c 43  Tcl_Obj *dbEvalC
bc60: 6f 6c 75 6d 6e 56 61 6c 75 65 28 44 62 45 76 61  olumnValue(DbEva
bc70: 6c 43 6f 6e 74 65 78 74 20 2a 70 2c 20 69 6e 74  lContext *p, int
bc80: 20 69 43 6f 6c 29 7b 0a 20 20 73 71 6c 69 74 65   iCol){.  sqlite
bc90: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
bca0: 70 2d 3e 70 50 72 65 53 74 6d 74 2d 3e 70 53 74  p->pPreStmt->pSt
bcb0: 6d 74 3b 0a 20 20 73 77 69 74 63 68 28 20 73 71  mt;.  switch( sq
bcc0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70  lite3_column_typ
bcd0: 65 28 70 53 74 6d 74 2c 20 69 43 6f 6c 29 20 29  e(pStmt, iCol) )
bce0: 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
bcf0: 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20  E_BLOB: {.      
bd00: 69 6e 74 20 62 79 74 65 73 20 3d 20 73 71 6c 69  int bytes = sqli
bd10: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73  te3_column_bytes
bd20: 28 70 53 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20  (pStmt, iCol);. 
bd30: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
bd40: 2a 7a 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33  *zBlob = sqlite3
bd50: 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74  _column_blob(pSt
bd60: 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20  mt, iCol);.     
bd70: 20 69 66 28 20 21 7a 42 6c 6f 62 20 29 20 62 79   if( !zBlob ) by
bd80: 74 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  tes = 0;.      r
bd90: 65 74 75 72 6e 20 54 63 6c 5f 4e 65 77 42 79 74  eturn Tcl_NewByt
bda0: 65 41 72 72 61 79 4f 62 6a 28 28 75 38 2a 29 7a  eArrayObj((u8*)z
bdb0: 42 6c 6f 62 2c 20 62 79 74 65 73 29 3b 0a 20 20  Blob, bytes);.  
bdc0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
bdd0: 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20  ITE_INTEGER: {. 
bde0: 20 20 20 20 20 73 71 6c 69 74 65 5f 69 6e 74 36       sqlite_int6
bdf0: 34 20 76 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  4 v = sqlite3_co
be00: 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74  lumn_int64(pStmt
be10: 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 69  , iCol);.      i
be20: 66 28 20 76 3e 3d 2d 32 31 34 37 34 38 33 36 34  f( v>=-214748364
be30: 37 20 26 26 20 76 3c 3d 32 31 34 37 34 38 33 36  7 && v<=21474836
be40: 34 37 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  47 ){.        re
be50: 74 75 72 6e 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  turn Tcl_NewIntO
be60: 62 6a 28 28 69 6e 74 29 76 29 3b 0a 20 20 20 20  bj((int)v);.    
be70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
be80: 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e 65 77 57   return Tcl_NewW
be90: 69 64 65 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20  ideIntObj(v);.  
bea0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
beb0: 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41  case SQLITE_FLOA
bec0: 54 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  T: {.      retur
bed0: 6e 20 54 63 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f  n Tcl_NewDoubleO
bee0: 62 6a 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  bj(sqlite3_colum
bef0: 6e 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20  n_double(pStmt, 
bf00: 69 43 6f 6c 29 29 3b 0a 20 20 20 20 7d 0a 20 20  iCol));.    }.  
bf10: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55    case SQLITE_NU
bf20: 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  LL: {.      retu
bf30: 72 6e 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  rn Tcl_NewString
bf40: 4f 62 6a 28 70 2d 3e 70 44 62 2d 3e 7a 4e 75 6c  Obj(p->pDb->zNul
bf50: 6c 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20  l, -1);.    }.  
bf60: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 63 6c 5f  }..  return Tcl_
bf70: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68  NewStringObj((ch
bf80: 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
bf90: 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69  mn_text(pStmt, i
bfa0: 43 6f 6c 29 2c 20 2d 31 29 3b 0a 7d 0a 0a 2f 2a  Col), -1);.}../*
bfb0: 0a 2a 2a 20 49 66 20 75 73 69 6e 67 20 54 63 6c  .** If using Tcl
bfc0: 20 76 65 72 73 69 6f 6e 20 38 2e 36 20 6f 72 20   version 8.6 or 
bfd0: 67 72 65 61 74 65 72 2c 20 75 73 65 20 74 68 65  greater, use the
bfe0: 20 4e 52 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f   NR functions to
bff0: 20 61 76 6f 69 64 0a 2a 2a 20 72 65 63 75 72 73   avoid.** recurs
c000: 69 76 65 20 65 76 61 6c 75 74 69 6f 6e 20 6f 66  ive evalution of
c010: 20 73 63 72 69 70 74 73 20 62 79 20 74 68 65 20   scripts by the 
c020: 5b 64 62 20 65 76 61 6c 5d 20 61 6e 64 20 5b 64  [db eval] and [d
c030: 62 20 74 72 61 6e 73 5d 0a 2a 2a 20 63 6f 6d 6d  b trans].** comm
c040: 61 6e 64 73 2e 20 45 76 65 6e 20 69 66 20 74 68  ands. Even if th
c050: 65 20 68 65 61 64 65 72 73 20 75 73 65 64 20 77  e headers used w
c060: 68 69 6c 65 20 63 6f 6d 70 69 6c 69 6e 67 20 74  hile compiling t
c070: 68 65 20 65 78 74 65 6e 73 69 6f 6e 0a 2a 2a 20  he extension.** 
c080: 61 72 65 20 38 2e 36 20 6f 72 20 6e 65 77 65 72  are 8.6 or newer
c090: 2c 20 74 68 65 20 63 6f 64 65 20 73 74 69 6c 6c  , the code still
c0a0: 20 74 65 73 74 73 20 74 68 65 20 54 63 6c 20 76   tests the Tcl v
c0b0: 65 72 73 69 6f 6e 20 61 74 20 72 75 6e 74 69 6d  ersion at runtim
c0c0: 65 2e 0a 2a 2a 20 54 68 69 73 20 61 6c 6c 6f 77  e..** This allow
c0d0: 73 20 73 74 75 62 73 2d 65 6e 61 62 6c 65 64 20  s stubs-enabled 
c0e0: 62 75 69 6c 64 73 20 74 6f 20 62 65 20 75 73 65  builds to be use
c0f0: 64 20 77 69 74 68 20 6f 6c 64 65 72 20 54 63 6c  d with older Tcl
c100: 20 6c 69 62 72 61 72 69 65 73 2e 0a 2a 2f 0a 23   libraries..*/.#
c110: 69 66 20 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52  if TCL_MAJOR_VER
c120: 53 49 4f 4e 3e 38 20 7c 7c 20 28 54 43 4c 5f 4d  SION>8 || (TCL_M
c130: 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 3d 3d 38 20  AJOR_VERSION==8 
c140: 26 26 20 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52  && TCL_MINOR_VER
c150: 53 49 4f 4e 3e 3d 36 29 0a 23 20 64 65 66 69 6e  SION>=6).# defin
c160: 65 20 53 51 4c 49 54 45 5f 54 43 4c 5f 4e 52 45  e SQLITE_TCL_NRE
c170: 20 31 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62   1.static int Db
c180: 55 73 65 4e 72 65 28 76 6f 69 64 29 7b 0a 20 20  UseNre(void){.  
c190: 69 6e 74 20 6d 61 6a 6f 72 2c 20 6d 69 6e 6f 72  int major, minor
c1a0: 3b 0a 20 20 54 63 6c 5f 47 65 74 56 65 72 73 69  ;.  Tcl_GetVersi
c1b0: 6f 6e 28 26 6d 61 6a 6f 72 2c 20 26 6d 69 6e 6f  on(&major, &mino
c1c0: 72 2c 20 30 2c 20 30 29 3b 0a 20 20 72 65 74 75  r, 0, 0);.  retu
c1d0: 72 6e 28 20 28 6d 61 6a 6f 72 3d 3d 38 20 26 26  rn( (major==8 &&
c1e0: 20 6d 69 6e 6f 72 3e 3d 36 29 20 7c 7c 20 6d 61   minor>=6) || ma
c1f0: 6a 6f 72 3e 38 20 29 3b 0a 7d 0a 23 65 6c 73 65  jor>8 );.}.#else
c200: 0a 2f 2a 20 0a 2a 2a 20 43 6f 6d 70 69 6c 69 6e  ./* .** Compilin
c210: 67 20 75 73 69 6e 67 20 68 65 61 64 65 72 73 20  g using headers 
c220: 65 61 72 6c 69 65 72 20 74 68 61 6e 20 38 2e 36  earlier than 8.6
c230: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 4e  . In this case N
c240: 52 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 75  R cannot be.** u
c250: 73 65 64 2c 20 73 6f 20 44 62 55 73 65 4e 72 65  sed, so DbUseNre
c260: 28 29 20 74 6f 20 61 6c 77 61 79 73 20 72 65 74  () to always ret
c270: 75 72 6e 20 7a 65 72 6f 2e 20 41 64 64 20 23 64  urn zero. Add #d
c280: 65 66 69 6e 65 73 20 66 6f 72 20 74 68 65 20 6f  efines for the o
c290: 74 68 65 72 0a 2a 2a 20 54 63 6c 5f 4e 52 78 78  ther.** Tcl_NRxx
c2a0: 78 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f  x() functions to
c2b0: 20 70 72 65 76 65 6e 74 20 74 68 65 6d 20 66 72   prevent them fr
c2c0: 6f 6d 20 63 61 75 73 69 6e 67 20 63 6f 6d 70 69  om causing compi
c2d0: 6c 61 74 69 6f 6e 20 65 72 72 6f 72 73 2c 0a 2a  lation errors,.*
c2e0: 2a 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68  * even though th
c2f0: 65 20 6f 6e 6c 79 20 69 6e 76 6f 63 61 74 69 6f  e only invocatio
c300: 6e 73 20 6f 66 20 74 68 65 6d 20 61 72 65 20 77  ns of them are w
c310: 69 74 68 69 6e 20 63 6f 6e 64 69 74 69 6f 6e 61  ithin conditiona
c320: 6c 20 62 6c 6f 63 6b 73 20 0a 2a 2a 20 6f 66 20  l blocks .** of 
c330: 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  the form:.**.** 
c340: 20 20 69 66 28 20 44 62 55 73 65 4e 72 65 28 29    if( DbUseNre()
c350: 20 29 20 7b 20 2e 2e 2e 20 7d 0a 2a 2f 0a 23 20   ) { ... }.*/.# 
c360: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 54 43  define SQLITE_TC
c370: 4c 5f 4e 52 45 20 30 0a 23 20 64 65 66 69 6e 65  L_NRE 0.# define
c380: 20 44 62 55 73 65 4e 72 65 28 29 20 30 0a 23 20   DbUseNre() 0.# 
c390: 64 65 66 69 6e 65 20 54 63 6c 5f 4e 52 41 64 64  define Tcl_NRAdd
c3a0: 43 61 6c 6c 62 61 63 6b 28 61 2c 62 2c 63 2c 64  Callback(a,b,c,d
c3b0: 2c 65 2c 66 29 20 28 76 6f 69 64 29 30 0a 23 20  ,e,f) (void)0.# 
c3c0: 64 65 66 69 6e 65 20 54 63 6c 5f 4e 52 45 76 61  define Tcl_NREva
c3d0: 6c 4f 62 6a 28 61 2c 62 2c 63 29 20 30 0a 23 20  lObj(a,b,c) 0.# 
c3e0: 64 65 66 69 6e 65 20 54 63 6c 5f 4e 52 43 72 65  define Tcl_NRCre
c3f0: 61 74 65 43 6f 6d 6d 61 6e 64 28 61 2c 62 2c 63  ateCommand(a,b,c
c400: 2c 64 2c 65 2c 66 29 20 28 76 6f 69 64 29 30 0a  ,d,e,f) (void)0.
c410: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
c420: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 70  is function is p
c430: 61 72 74 20 6f 66 20 74 68 65 20 69 6d 70 6c 65  art of the imple
c440: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
c450: 20 63 6f 6d 6d 61 6e 64 3a 0a 2a 2a 0a 2a 2a 20   command:.**.** 
c460: 20 20 24 64 62 20 65 76 61 6c 20 53 51 4c 20 3f    $db eval SQL ?
c470: 41 52 52 41 59 4e 41 4d 45 3f 20 53 43 52 49 50  ARRAYNAME? SCRIP
c480: 54 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  T.*/.static int 
c490: 44 62 45 76 61 6c 4e 65 78 74 43 6d 64 28 0a 20  DbEvalNextCmd(. 
c4a0: 20 43 6c 69 65 6e 74 44 61 74 61 20 64 61 74 61   ClientData data
c4b0: 5b 5d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  [],             
c4c0: 20 20 20 20 20 20 2f 2a 20 64 61 74 61 5b 30 5d        /* data[0]
c4d0: 20 69 73 20 74 68 65 20 28 44 62 45 76 61 6c 43   is the (DbEvalC
c4e0: 6f 6e 74 65 78 74 2a 29 20 2a 2f 0a 20 20 54 63  ontext*) */.  Tc
c4f0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
c500: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
c510: 20 20 20 2f 2a 20 54 63 6c 20 69 6e 74 65 72 70     /* Tcl interp
c520: 72 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  reter */.  int r
c530: 65 73 75 6c 74 20 20 20 20 20 20 20 20 20 20 20  esult           
c540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c550: 2f 2a 20 52 65 73 75 6c 74 20 73 6f 20 66 61 72  /* Result so far
c560: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
c570: 3d 20 72 65 73 75 6c 74 3b 20 20 20 20 20 20 20  = result;       
c580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c590: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
c5a0: 0a 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20  .  /* The first 
c5b0: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 64  element of the d
c5c0: 61 74 61 5b 5d 20 61 72 72 61 79 20 69 73 20 61  ata[] array is a
c5d0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 44 62   pointer to a Db
c5e0: 45 76 61 6c 43 6f 6e 74 65 78 74 0a 20 20 2a 2a  EvalContext.  **
c5f0: 20 73 74 72 75 63 74 75 72 65 20 61 6c 6c 6f 63   structure alloc
c600: 61 74 65 64 20 75 73 69 6e 67 20 54 63 6c 5f 41  ated using Tcl_A
c610: 6c 6c 6f 63 28 29 2e 20 54 68 65 20 73 65 63 6f  lloc(). The seco
c620: 6e 64 20 65 6c 65 6d 65 6e 74 20 6f 66 20 64 61  nd element of da
c630: 74 61 5b 5d 0a 20 20 2a 2a 20 69 73 20 61 20 70  ta[].  ** is a p
c640: 6f 69 6e 74 65 72 20 74 6f 20 61 20 54 63 6c 5f  ointer to a Tcl_
c650: 4f 62 6a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  Obj containing t
c660: 68 65 20 73 63 72 69 70 74 20 74 6f 20 72 75 6e  he script to run
c670: 20 66 6f 72 20 65 61 63 68 20 72 6f 77 0a 20 20   for each row.  
c680: 2a 2a 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ** returned by t
c690: 68 65 20 71 75 65 72 69 65 73 20 65 6e 63 61 70  he queries encap
c6a0: 73 75 6c 61 74 65 64 20 69 6e 20 64 61 74 61 5b  sulated in data[
c6b0: 30 5d 2e 20 2a 2f 0a 20 20 44 62 45 76 61 6c 43  0]. */.  DbEvalC
c6c0: 6f 6e 74 65 78 74 20 2a 70 20 3d 20 28 44 62 45  ontext *p = (DbE
c6d0: 76 61 6c 43 6f 6e 74 65 78 74 20 2a 29 64 61 74  valContext *)dat
c6e0: 61 5b 30 5d 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  a[0];.  Tcl_Obj 
c6f0: 2a 70 53 63 72 69 70 74 20 3d 20 28 54 63 6c 5f  *pScript = (Tcl_
c700: 4f 62 6a 20 2a 29 64 61 74 61 5b 31 5d 3b 0a 20  Obj *)data[1];. 
c710: 20 54 63 6c 5f 4f 62 6a 20 2a 70 41 72 72 61 79   Tcl_Obj *pArray
c720: 20 3d 20 70 2d 3e 70 41 72 72 61 79 3b 0a 0a 20   = p->pArray;.. 
c730: 20 77 68 69 6c 65 28 20 28 72 63 3d 3d 54 43 4c   while( (rc==TCL
c740: 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 54 43 4c 5f 43  _OK || rc==TCL_C
c750: 4f 4e 54 49 4e 55 45 29 20 26 26 20 54 43 4c 5f  ONTINUE) && TCL_
c760: 4f 4b 3d 3d 28 72 63 20 3d 20 64 62 45 76 61 6c  OK==(rc = dbEval
c770: 53 74 65 70 28 70 29 29 20 29 7b 0a 20 20 20 20  Step(p)) ){.    
c780: 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e  int i;.    int n
c790: 43 6f 6c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  Col;.    Tcl_Obj
c7a0: 20 2a 2a 61 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20   **apColName;.  
c7b0: 20 20 64 62 45 76 61 6c 52 6f 77 49 6e 66 6f 28    dbEvalRowInfo(
c7c0: 70 2c 20 26 6e 43 6f 6c 2c 20 26 61 70 43 6f 6c  p, &nCol, &apCol
c7d0: 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28 69  Name);.    for(i
c7e0: 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
c7f0: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20  {.      Tcl_Obj 
c800: 2a 70 56 61 6c 20 3d 20 64 62 45 76 61 6c 43 6f  *pVal = dbEvalCo
c810: 6c 75 6d 6e 56 61 6c 75 65 28 70 2c 20 69 29 3b  lumnValue(p, i);
c820: 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 72 61  .      if( pArra
c830: 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  y==0 ){.        
c840: 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69  Tcl_ObjSetVar2(i
c850: 6e 74 65 72 70 2c 20 61 70 43 6f 6c 4e 61 6d 65  nterp, apColName
c860: 5b 69 5d 2c 20 30 2c 20 70 56 61 6c 2c 20 30 29  [i], 0, pVal, 0)
c870: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
c880: 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65         Tcl_ObjSe
c890: 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 70 41  tVar2(interp, pA
c8a0: 72 72 61 79 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b  rray, apColName[
c8b0: 69 5d 2c 20 70 56 61 6c 2c 20 30 29 3b 0a 20 20  i], pVal, 0);.  
c8c0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
c8d0: 20 2f 2a 20 54 68 65 20 72 65 71 75 69 72 65 64   /* The required
c8e0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 76 61 72   interpreter var
c8f0: 69 61 62 6c 65 73 20 61 72 65 20 6e 6f 77 20 70  iables are now p
c900: 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68  opulated with th
c910: 65 20 64 61 74 61 20 0a 20 20 20 20 2a 2a 20 66  e data .    ** f
c920: 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20  rom the current 
c930: 72 6f 77 2e 20 49 66 20 75 73 69 6e 67 20 4e 52  row. If using NR
c940: 45 2c 20 73 63 68 65 64 75 6c 65 20 63 61 6c 6c  E, schedule call
c950: 62 61 63 6b 73 20 74 6f 20 65 76 61 6c 75 61 74  backs to evaluat
c960: 65 0a 20 20 20 20 2a 2a 20 73 63 72 69 70 74 20  e.    ** script 
c970: 70 53 63 72 69 70 74 2c 20 74 68 65 6e 20 74 6f  pScript, then to
c980: 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 66 75 6e   invoke this fun
c990: 63 74 69 6f 6e 20 61 67 61 69 6e 20 74 6f 20 66  ction again to f
c9a0: 65 74 63 68 20 74 68 65 20 6e 65 78 74 0a 20 20  etch the next.  
c9b0: 20 20 2a 2a 20 72 6f 77 20 28 6f 72 20 63 6c 65    ** row (or cle
c9c0: 61 6e 20 75 70 20 69 66 20 74 68 65 72 65 20 69  an up if there i
c9d0: 73 20 6e 6f 20 6e 65 78 74 20 72 6f 77 20 6f 72  s no next row or
c9e0: 20 74 68 65 20 73 63 72 69 70 74 20 74 68 72 6f   the script thro
c9f0: 77 73 20 61 6e 0a 20 20 20 20 2a 2a 20 65 78 63  ws an.    ** exc
ca00: 65 70 74 69 6f 6e 29 2e 20 41 66 74 65 72 20 73  eption). After s
ca10: 63 68 65 64 75 6c 69 6e 67 20 74 68 65 20 63 61  cheduling the ca
ca20: 6c 6c 62 61 63 6b 73 2c 20 72 65 74 75 72 6e 20  llbacks, return 
ca30: 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20 0a  control to the .
ca40: 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 2e 0a 20      ** caller.. 
ca50: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
ca60: 6e 6f 74 20 75 73 69 6e 67 20 4e 52 45 2c 20 65  not using NRE, e
ca70: 76 61 6c 75 61 74 65 20 70 53 63 72 69 70 74 20  valuate pScript 
ca80: 64 69 72 65 63 74 6c 79 20 61 6e 64 20 63 6f 6e  directly and con
ca90: 74 69 6e 75 65 20 77 69 74 68 20 74 68 65 0a 20  tinue with the. 
caa0: 20 20 20 2a 2a 20 6e 65 78 74 20 69 74 65 72 61     ** next itera
cab0: 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 77 68 69  tion of this whi
cac0: 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 2e 20 20 2a  le(...) loop.  *
cad0: 2f 0a 20 20 20 20 69 66 28 20 44 62 55 73 65 4e  /.    if( DbUseN
cae0: 72 65 28 29 20 29 7b 0a 20 20 20 20 20 20 54 63  re() ){.      Tc
caf0: 6c 5f 4e 52 41 64 64 43 61 6c 6c 62 61 63 6b 28  l_NRAddCallback(
cb00: 69 6e 74 65 72 70 2c 20 44 62 45 76 61 6c 4e 65  interp, DbEvalNe
cb10: 78 74 43 6d 64 2c 20 28 76 6f 69 64 2a 29 70 2c  xtCmd, (void*)p,
cb20: 20 28 76 6f 69 64 2a 29 70 53 63 72 69 70 74 2c   (void*)pScript,
cb30: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65   0, 0);.      re
cb40: 74 75 72 6e 20 54 63 6c 5f 4e 52 45 76 61 6c 4f  turn Tcl_NREvalO
cb50: 62 6a 28 69 6e 74 65 72 70 2c 20 70 53 63 72 69  bj(interp, pScri
cb60: 70 74 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  pt, 0);.    }els
cb70: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 63  e{.      rc = Tc
cb80: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65  l_EvalObjEx(inte
cb90: 72 70 2c 20 70 53 63 72 69 70 74 2c 20 30 29 3b  rp, pScript, 0);
cba0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 54 63  .    }.  }..  Tc
cbb0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
cbc0: 53 63 72 69 70 74 29 3b 0a 20 20 64 62 45 76 61  Script);.  dbEva
cbd0: 6c 46 69 6e 61 6c 69 7a 65 28 70 29 3b 0a 20 20  lFinalize(p);.  
cbe0: 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 20 2a  Tcl_Free((char *
cbf0: 29 70 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d  )p);..  if( rc==
cc00: 54 43 4c 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 54 43  TCL_OK || rc==TC
cc10: 4c 5f 42 52 45 41 4b 20 29 7b 0a 20 20 20 20 54  L_BREAK ){.    T
cc20: 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69  cl_ResetResult(i
cc30: 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 63 20 3d  nterp);.    rc =
cc40: 20 54 43 4c 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72   TCL_OK;.  }.  r
cc50: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
cc60: 2a 2a 20 54 68 65 20 22 73 71 6c 69 74 65 22 20  ** The "sqlite" 
cc70: 63 6f 6d 6d 61 6e 64 20 62 65 6c 6f 77 20 63 72  command below cr
cc80: 65 61 74 65 73 20 61 20 6e 65 77 20 54 63 6c 20  eates a new Tcl 
cc90: 63 6f 6d 6d 61 6e 64 20 66 6f 72 20 65 61 63 68  command for each
cca0: 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  .** connection i
ccb0: 74 20 6f 70 65 6e 73 20 74 6f 20 61 6e 20 53 51  t opens to an SQ
ccc0: 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e 20 20  Lite database.  
ccd0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
cce0: 69 6e 76 6f 6b 65 64 0a 2a 2a 20 77 68 65 6e 65  invoked.** whene
ccf0: 76 65 72 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65  ver one of those
cd00: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2d 73 70 65 63   connection-spec
cd10: 69 66 69 63 20 63 6f 6d 6d 61 6e 64 73 20 69 73  ific commands is
cd20: 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 69 6e 20   executed.** in 
cd30: 54 63 6c 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  Tcl.  For exampl
cd40: 65 2c 20 69 66 20 79 6f 75 20 72 75 6e 20 54 63  e, if you run Tc
cd50: 6c 20 63 6f 64 65 20 6c 69 6b 65 20 74 68 69 73  l code like this
cd60: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 73 71  :.**.**       sq
cd70: 6c 69 74 65 33 20 64 62 31 20 20 22 6d 79 5f 64  lite3 db1  "my_d
cd80: 61 74 61 62 61 73 65 22 0a 2a 2a 20 20 20 20 20  atabase".**     
cd90: 20 20 64 62 31 20 63 6c 6f 73 65 0a 2a 2a 0a 2a    db1 close.**.*
cda0: 2a 20 54 68 65 20 66 69 72 73 74 20 63 6f 6d 6d  * The first comm
cdb0: 61 6e 64 20 6f 70 65 6e 73 20 61 20 63 6f 6e 6e  and opens a conn
cdc0: 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 22 6d  ection to the "m
cdd0: 79 5f 64 61 74 61 62 61 73 65 22 20 64 61 74 61  y_database" data
cde0: 62 61 73 65 0a 2a 2a 20 61 6e 64 20 63 61 6c 6c  base.** and call
cdf0: 73 20 74 68 61 74 20 63 6f 6e 6e 65 63 74 69 6f  s that connectio
ce00: 6e 20 22 64 62 31 22 2e 20 20 54 68 65 20 73 65  n "db1".  The se
ce10: 63 6f 6e 64 20 63 6f 6d 6d 61 6e 64 20 63 61 75  cond command cau
ce20: 73 65 73 20 74 68 69 73 0a 2a 2a 20 73 75 62 72  ses this.** subr
ce30: 6f 75 74 69 6e 65 20 74 6f 20 62 65 20 69 6e 76  outine to be inv
ce40: 6f 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oked..*/.static 
ce50: 69 6e 74 20 44 62 4f 62 6a 43 6d 64 28 76 6f 69  int DbObjCmd(voi
ce60: 64 20 2a 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72  d *cd, Tcl_Inter
ce70: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
ce80: 62 6a 63 2c 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e  bjc,Tcl_Obj *con
ce90: 73 74 2a 6f 62 6a 76 29 7b 0a 20 20 53 71 6c 69  st*objv){.  Sqli
cea0: 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c  teDb *pDb = (Sql
ceb0: 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69 6e 74  iteDb*)cd;.  int
cec0: 20 63 68 6f 69 63 65 3b 0a 20 20 69 6e 74 20 72   choice;.  int r
ced0: 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 73 74  c = TCL_OK;.  st
cee0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
cef0: 2a 44 42 5f 73 74 72 73 5b 5d 20 3d 20 7b 0a 20  *DB_strs[] = {. 
cf00: 20 20 20 22 61 75 74 68 6f 72 69 7a 65 72 22 2c     "authorizer",
cf10: 20 20 20 20 20 20 20 20 20 22 62 61 63 6b 75 70           "backup
cf20: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 22 62  ",            "b
cf30: 75 73 79 22 2c 0a 20 20 20 20 22 63 61 63 68 65  usy",.    "cache
cf40: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
cf50: 22 63 68 61 6e 67 65 73 22 2c 20 20 20 20 20 20  "changes",      
cf60: 20 20 20 20 20 22 63 6c 6f 73 65 22 2c 0a 20 20       "close",.  
cf70: 20 20 22 63 6f 6c 6c 61 74 65 22 2c 20 20 20 20    "collate",    
cf80: 20 20 20 20 20 20 20 20 22 63 6f 6c 6c 61 74 69          "collati
cf90: 6f 6e 5f 6e 65 65 64 65 64 22 2c 20 20 22 63 6f  on_needed",  "co
cfa0: 6d 6d 69 74 5f 68 6f 6f 6b 22 2c 0a 20 20 20 20  mmit_hook",.    
cfb0: 22 63 6f 6d 70 6c 65 74 65 22 2c 20 20 20 20 20  "complete",     
cfc0: 20 20 20 20 20 20 22 63 6f 70 79 22 2c 20 20 20        "copy",   
cfd0: 20 20 20 20 20 20 20 20 20 20 20 22 65 6e 61 62             "enab
cfe0: 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f  le_load_extensio
cff0: 6e 22 2c 0a 20 20 20 20 22 65 72 72 6f 72 63 6f  n",.    "errorco
d000: 64 65 22 2c 20 20 20 20 20 20 20 20 20 20 22 65  de",          "e
d010: 76 61 6c 22 2c 20 20 20 20 20 20 20 20 20 20 20  val",           
d020: 20 20 20 22 65 78 69 73 74 73 22 2c 0a 20 20 20     "exists",.   
d030: 20 22 66 75 6e 63 74 69 6f 6e 22 2c 20 20 20 20   "function",    
d040: 20 20 20 20 20 20 20 22 69 6e 63 72 62 6c 6f 62         "incrblob
d050: 22 2c 20 20 20 20 20 20 20 20 20 20 22 69 6e 74  ",          "int
d060: 65 72 72 75 70 74 22 2c 0a 20 20 20 20 22 6c 61  errupt",.    "la
d070: 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 22  st_insert_rowid"
d080: 2c 20 20 22 6e 75 6c 6c 76 61 6c 75 65 22 2c 20  ,  "nullvalue", 
d090: 20 20 20 20 20 20 20 20 22 6f 6e 65 63 6f 6c 75          "onecolu
d0a0: 6d 6e 22 2c 0a 20 20 20 20 22 70 72 6f 66 69 6c  mn",.    "profil
d0b0: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 22  e",            "
d0c0: 70 72 6f 67 72 65 73 73 22 2c 20 20 20 20 20 20  progress",      
d0d0: 20 20 20 20 22 72 65 6b 65 79 22 2c 0a 20 20 20      "rekey",.   
d0e0: 20 22 72 65 73 74 6f 72 65 22 2c 20 20 20 20 20   "restore",     
d0f0: 20 20 20 20 20 20 20 22 72 6f 6c 6c 62 61 63 6b         "rollback
d100: 5f 68 6f 6f 6b 22 2c 20 20 20 20 20 22 73 74 61  _hook",     "sta
d110: 74 75 73 22 2c 0a 20 20 20 20 22 74 69 6d 65 6f  tus",.    "timeo
d120: 75 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ut",            
d130: 22 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 22 2c  "total_changes",
d140: 20 20 20 20 20 22 74 72 61 63 65 22 2c 0a 20 20       "trace",.  
d150: 20 20 22 74 72 61 6e 73 61 63 74 69 6f 6e 22 2c    "transaction",
d160: 20 20 20 20 20 20 20 20 22 75 6e 6c 6f 63 6b 5f          "unlock_
d170: 6e 6f 74 69 66 79 22 2c 20 20 20 20 20 22 75 70  notify",     "up
d180: 64 61 74 65 5f 68 6f 6f 6b 22 2c 0a 20 20 20 20  date_hook",.    
d190: 22 76 65 72 73 69 6f 6e 22 2c 20 20 20 20 20 20  "version",      
d1a0: 20 20 20 20 20 20 22 77 61 6c 5f 68 6f 6f 6b 22        "wal_hook"
d1b0: 2c 20 20 20 20 20 20 20 20 20 20 30 0a 20 20 7d  ,          0.  }
d1c0: 3b 0a 20 20 65 6e 75 6d 20 44 42 5f 65 6e 75 6d  ;.  enum DB_enum
d1d0: 20 7b 0a 20 20 20 20 44 42 5f 41 55 54 48 4f 52   {.    DB_AUTHOR
d1e0: 49 5a 45 52 2c 20 20 20 20 20 20 20 20 44 42 5f  IZER,        DB_
d1f0: 42 41 43 4b 55 50 2c 20 20 20 20 20 20 20 20 20  BACKUP,         
d200: 20 20 44 42 5f 42 55 53 59 2c 0a 20 20 20 20 44    DB_BUSY,.    D
d210: 42 5f 43 41 43 48 45 2c 20 20 20 20 20 20 20 20  B_CACHE,        
d220: 20 20 20 20 20 44 42 5f 43 48 41 4e 47 45 53 2c       DB_CHANGES,
d230: 20 20 20 20 20 20 20 20 20 20 44 42 5f 43 4c 4f            DB_CLO
d240: 53 45 2c 0a 20 20 20 20 44 42 5f 43 4f 4c 4c 41  SE,.    DB_COLLA
d250: 54 45 2c 20 20 20 20 20 20 20 20 20 20 20 44 42  TE,           DB
d260: 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4e 45 45 44 45  _COLLATION_NEEDE
d270: 44 2c 20 44 42 5f 43 4f 4d 4d 49 54 5f 48 4f 4f  D, DB_COMMIT_HOO
d280: 4b 2c 0a 20 20 20 20 44 42 5f 43 4f 4d 50 4c 45  K,.    DB_COMPLE
d290: 54 45 2c 20 20 20 20 20 20 20 20 20 20 44 42 5f  TE,          DB_
d2a0: 43 4f 50 59 2c 20 20 20 20 20 20 20 20 20 20 20  COPY,           
d2b0: 20 20 44 42 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44    DB_ENABLE_LOAD
d2c0: 5f 45 58 54 45 4e 53 49 4f 4e 2c 0a 20 20 20 20  _EXTENSION,.    
d2d0: 44 42 5f 45 52 52 4f 52 43 4f 44 45 2c 20 20 20  DB_ERRORCODE,   
d2e0: 20 20 20 20 20 20 44 42 5f 45 56 41 4c 2c 20 20        DB_EVAL,  
d2f0: 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 45 58             DB_EX
d300: 49 53 54 53 2c 0a 20 20 20 20 44 42 5f 46 55 4e  ISTS,.    DB_FUN
d310: 43 54 49 4f 4e 2c 20 20 20 20 20 20 20 20 20 20  CTION,          
d320: 44 42 5f 49 4e 43 52 42 4c 4f 42 2c 20 20 20 20  DB_INCRBLOB,    
d330: 20 20 20 20 20 44 42 5f 49 4e 54 45 52 52 55 50       DB_INTERRUP
d340: 54 2c 0a 20 20 20 20 44 42 5f 4c 41 53 54 5f 49  T,.    DB_LAST_I
d350: 4e 53 45 52 54 5f 52 4f 57 49 44 2c 20 44 42 5f  NSERT_ROWID, DB_
d360: 4e 55 4c 4c 56 41 4c 55 45 2c 20 20 20 20 20 20  NULLVALUE,      
d370: 20 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 2c 0a    DB_ONECOLUMN,.
d380: 20 20 20 20 44 42 5f 50 52 4f 46 49 4c 45 2c 20      DB_PROFILE, 
d390: 20 20 20 20 20 20 20 20 20 20 44 42 5f 50 52 4f            DB_PRO
d3a0: 47 52 45 53 53 2c 20 20 20 20 20 20 20 20 20 44  GRESS,         D
d3b0: 42 5f 52 45 4b 45 59 2c 0a 20 20 20 20 44 42 5f  B_REKEY,.    DB_
d3c0: 52 45 53 54 4f 52 45 2c 20 20 20 20 20 20 20 20  RESTORE,        
d3d0: 20 20 20 44 42 5f 52 4f 4c 4c 42 41 43 4b 5f 48     DB_ROLLBACK_H
d3e0: 4f 4f 4b 2c 20 20 20 20 44 42 5f 53 54 41 54 55  OOK,    DB_STATU
d3f0: 53 2c 0a 20 20 20 20 44 42 5f 54 49 4d 45 4f 55  S,.    DB_TIMEOU
d400: 54 2c 20 20 20 20 20 20 20 20 20 20 20 44 42 5f  T,           DB_
d410: 54 4f 54 41 4c 5f 43 48 41 4e 47 45 53 2c 20 20  TOTAL_CHANGES,  
d420: 20 20 44 42 5f 54 52 41 43 45 2c 0a 20 20 20 20    DB_TRACE,.    
d430: 44 42 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20  DB_TRANSACTION, 
d440: 20 20 20 20 20 20 44 42 5f 55 4e 4c 4f 43 4b 5f        DB_UNLOCK_
d450: 4e 4f 54 49 46 59 2c 20 20 20 20 44 42 5f 55 50  NOTIFY,    DB_UP
d460: 44 41 54 45 5f 48 4f 4f 4b 2c 0a 20 20 20 20 44  DATE_HOOK,.    D
d470: 42 5f 56 45 52 53 49 4f 4e 2c 20 20 20 20 20 20  B_VERSION,      
d480: 20 20 20 20 20 44 42 5f 57 41 4c 5f 48 4f 4f 4b       DB_WAL_HOOK
d490: 0a 20 20 7d 3b 0a 20 20 2f 2a 20 64 6f 6e 27 74  .  };.  /* don't
d4a0: 20 6c 65 61 76 65 20 74 72 61 69 6c 69 6e 67 20   leave trailing 
d4b0: 63 6f 6d 6d 61 73 20 6f 6e 20 44 42 5f 65 6e 75  commas on DB_enu
d4c0: 6d 2c 20 69 74 20 63 6f 6e 66 75 73 65 73 20 74  m, it confuses t
d4d0: 68 65 20 41 49 58 20 78 6c 63 20 63 6f 6d 70 69  he AIX xlc compi
d4e0: 6c 65 72 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62  ler */..  if( ob
d4f0: 6a 63 3c 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  jc<2 ){.    Tcl_
d500: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
d510: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53  erp, 1, objv, "S
d520: 55 42 43 4f 4d 4d 41 4e 44 20 2e 2e 2e 22 29 3b  UBCOMMAND ...");
d530: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
d540: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
d550: 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f   Tcl_GetIndexFro
d560: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
d570: 76 5b 31 5d 2c 20 44 42 5f 73 74 72 73 2c 20 22  v[1], DB_strs, "
d580: 6f 70 74 69 6f 6e 22 2c 20 30 2c 20 26 63 68 6f  option", 0, &cho
d590: 69 63 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ice) ){.    retu
d5a0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
d5b0: 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 28 65 6e  }..  switch( (en
d5c0: 75 6d 20 44 42 5f 65 6e 75 6d 29 63 68 6f 69 63  um DB_enum)choic
d5d0: 65 20 29 7b 0a 0a 20 20 2f 2a 20 20 20 20 24 64  e ){..  /*    $d
d5e0: 62 20 61 75 74 68 6f 72 69 7a 65 72 20 3f 43 41  b authorizer ?CA
d5f0: 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a  LLBACK?.  **.  *
d600: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76  * Invoke the giv
d610: 65 6e 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61  en callback to a
d620: 75 74 68 6f 72 69 7a 65 20 65 61 63 68 20 53 51  uthorize each SQ
d630: 4c 20 6f 70 65 72 61 74 69 6f 6e 20 61 73 20 69  L operation as i
d640: 74 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 69 6c  t is.  ** compil
d650: 65 64 2e 20 20 35 20 61 72 67 75 6d 65 6e 74 73  ed.  5 arguments
d660: 20 61 72 65 20 61 70 70 65 6e 64 65 64 20 74 6f   are appended to
d670: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 62 65   the callback be
d680: 66 6f 72 65 20 69 74 20 69 73 0a 20 20 2a 2a 20  fore it is.  ** 
d690: 69 6e 76 6f 6b 65 64 3a 0a 20 20 2a 2a 0a 20 20  invoked:.  **.  
d6a0: 2a 2a 20 20 20 28 31 29 20 54 68 65 20 61 75 74  **   (1) The aut
d6b0: 68 6f 72 69 7a 61 74 69 6f 6e 20 74 79 70 65 20  horization type 
d6c0: 28 65 78 3a 20 53 51 4c 49 54 45 5f 43 52 45 41  (ex: SQLITE_CREA
d6d0: 54 45 5f 54 41 42 4c 45 2c 20 53 51 4c 49 54 45  TE_TABLE, SQLITE
d6e0: 5f 49 4e 53 45 52 54 2c 20 2e 2e 2e 29 0a 20 20  _INSERT, ...).  
d6f0: 2a 2a 20 20 20 28 32 29 20 46 69 72 73 74 20 64  **   (2) First d
d700: 65 73 63 72 69 70 74 69 76 65 20 6e 61 6d 65 20  escriptive name 
d710: 28 64 65 70 65 6e 64 73 20 6f 6e 20 61 75 74 68  (depends on auth
d720: 6f 72 69 7a 61 74 69 6f 6e 20 74 79 70 65 29 0a  orization type).
d730: 20 20 2a 2a 20 20 20 28 33 29 20 53 65 63 6f 6e    **   (3) Secon
d740: 64 20 64 65 73 63 72 69 70 74 69 76 65 20 6e 61  d descriptive na
d750: 6d 65 0a 20 20 2a 2a 20 20 20 28 34 29 20 4e 61  me.  **   (4) Na
d760: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
d770: 73 65 20 28 65 78 3a 20 22 6d 61 69 6e 22 2c 20  se (ex: "main", 
d780: 22 74 65 6d 70 22 29 0a 20 20 2a 2a 20 20 20 28  "temp").  **   (
d790: 35 29 20 4e 61 6d 65 20 6f 66 20 74 72 69 67 67  5) Name of trigg
d7a0: 65 72 20 74 68 61 74 20 69 73 20 64 6f 69 6e 67  er that is doing
d7b0: 20 74 68 65 20 61 63 63 65 73 73 0a 20 20 2a 2a   the access.  **
d7c0: 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61  .  ** The callba
d7d0: 63 6b 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e  ck should return
d7e0: 20 6f 6e 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f   on of the follo
d7f0: 77 69 6e 67 20 73 74 72 69 6e 67 73 3a 20 53 51  wing strings: SQ
d800: 4c 49 54 45 5f 4f 4b 2c 0a 20 20 2a 2a 20 53 51  LITE_OK,.  ** SQ
d810: 4c 49 54 45 5f 49 47 4e 4f 52 45 2c 20 6f 72 20  LITE_IGNORE, or 
d820: 53 51 4c 49 54 45 5f 44 45 4e 59 2e 20 20 41 6e  SQLITE_DENY.  An
d830: 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76  y other return v
d840: 61 6c 75 65 20 69 73 20 61 6e 20 65 72 72 6f 72  alue is an error
d850: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  **.  ** If t
d860: 68 69 73 20 6d 65 74 68 6f 64 20 69 73 20 69 6e  his method is in
d870: 76 6f 6b 65 64 20 77 69 74 68 20 6e 6f 20 61 72  voked with no ar
d880: 67 75 6d 65 6e 74 73 2c 20 74 68 65 20 63 75 72  guments, the cur
d890: 72 65 6e 74 20 61 75 74 68 6f 72 69 7a 61 74 69  rent authorizati
d8a0: 6f 6e 0a 20 20 2a 2a 20 63 61 6c 6c 62 61 63 6b  on.  ** callback
d8b0: 20 73 74 72 69 6e 67 20 69 73 20 72 65 74 75 72   string is retur
d8c0: 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ned..  */.  case
d8d0: 20 44 42 5f 41 55 54 48 4f 52 49 5a 45 52 3a 20   DB_AUTHORIZER: 
d8e0: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
d8f0: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
d900: 4f 4e 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ON.    Tcl_Appen
d910: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
d920: 22 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 6e  "authorization n
d930: 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  ot available in 
d940: 74 68 69 73 20 62 75 69 6c 64 22 2c 0a 20 20 20  this build",.   
d950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d960: 20 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20    (char*)0);.   
d970: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
d980: 52 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28  R;.#else.    if(
d990: 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20   objc>3 ){.     
d9a0: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
d9b0: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
d9c0: 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29  v, "?CALLBACK?")
d9d0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
d9e0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65  CL_ERROR;.    }e
d9f0: 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20  lse if( objc==2 
da00: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  ){.      if( pDb
da10: 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 20  ->zAuth ){.     
da20: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
da30: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d  ult(interp, pDb-
da40: 3e 7a 41 75 74 68 2c 20 28 63 68 61 72 2a 29 30  >zAuth, (char*)0
da50: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
da60: 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72  else{.      char
da70: 20 2a 7a 41 75 74 68 3b 0a 20 20 20 20 20 20 69   *zAuth;.      i
da80: 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66  nt len;.      if
da90: 28 20 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a  ( pDb->zAuth ){.
daa0: 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65          Tcl_Free
dab0: 28 70 44 62 2d 3e 7a 41 75 74 68 29 3b 0a 20 20  (pDb->zAuth);.  
dac0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 41 75 74      }.      zAut
dad0: 68 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  h = Tcl_GetStrin
dae0: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
daf0: 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69  , &len);.      i
db00: 66 28 20 7a 41 75 74 68 20 26 26 20 6c 65 6e 3e  f( zAuth && len>
db10: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  0 ){.        pDb
db20: 2d 3e 7a 41 75 74 68 20 3d 20 54 63 6c 5f 41 6c  ->zAuth = Tcl_Al
db30: 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a  loc( len + 1 );.
db40: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
db50: 44 62 2d 3e 7a 41 75 74 68 2c 20 7a 41 75 74 68  Db->zAuth, zAuth
db60: 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20  , len+1);.      
db70: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
db80: 44 62 2d 3e 7a 41 75 74 68 20 3d 20 30 3b 0a 20  Db->zAuth = 0;. 
db90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
dba0: 20 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20   pDb->zAuth ){. 
dbb0: 20 20 20 20 20 20 20 74 79 70 65 64 65 66 20 69         typedef i
dbc0: 6e 74 20 28 2a 73 71 6c 69 74 65 33 5f 61 75 74  nt (*sqlite3_aut
dbd0: 68 5f 63 62 29 28 0a 20 20 20 20 20 20 20 20 20  h_cb)(.         
dbe0: 20 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73    void*,int,cons
dbf0: 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68  t char*,const ch
dc00: 61 72 2a 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ar*,.           
dc10: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73  const char*,cons
dc20: 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20  t char*);.      
dc30: 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20    pDb->interp = 
dc40: 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20  interp;.        
dc50: 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75 74 68  sqlite3_set_auth
dc60: 6f 72 69 7a 65 72 28 70 44 62 2d 3e 64 62 2c 28  orizer(pDb->db,(
dc70: 73 71 6c 69 74 65 33 5f 61 75 74 68 5f 63 62 29  sqlite3_auth_cb)
dc80: 61 75 74 68 5f 63 61 6c 6c 62 61 63 6b 2c 70 44  auth_callback,pD
dc90: 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  b);.      }else{
dca0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
dcb0: 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65 72 28  _set_authorizer(
dcc0: 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a  pDb->db, 0, 0);.
dcd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
dce0: 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a  ndif.    break;.
dcf0: 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62    }..  /*    $db
dd00: 20 62 61 63 6b 75 70 20 3f 44 41 54 41 42 41 53   backup ?DATABAS
dd10: 45 3f 20 46 49 4c 45 4e 41 4d 45 0a 20 20 2a 2a  E? FILENAME.  **
dd20: 0a 20 20 2a 2a 20 4f 70 65 6e 20 6f 72 20 63 72  .  ** Open or cr
dd30: 65 61 74 65 20 61 20 64 61 74 61 62 61 73 65 20  eate a database 
dd40: 66 69 6c 65 20 6e 61 6d 65 64 20 46 49 4c 45 4e  file named FILEN
dd50: 41 4d 45 2e 20 20 54 72 61 6e 73 66 65 72 20 74  AME.  Transfer t
dd60: 68 65 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 20  he.  ** content 
dd70: 6f 66 20 6c 6f 63 61 6c 20 64 61 74 61 62 61 73  of local databas
dd80: 65 20 44 41 54 41 42 41 53 45 20 28 64 65 66 61  e DATABASE (defa
dd90: 75 6c 74 3a 20 22 6d 61 69 6e 22 29 20 69 6e 74  ult: "main") int
dda0: 6f 20 74 68 65 0a 20 20 2a 2a 20 46 49 4c 45 4e  o the.  ** FILEN
ddb0: 41 4d 45 20 64 61 74 61 62 61 73 65 2e 0a 20 20  AME database..  
ddc0: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 42 41 43  */.  case DB_BAC
ddd0: 4b 55 50 3a 20 7b 0a 20 20 20 20 63 6f 6e 73 74  KUP: {.    const
dde0: 20 63 68 61 72 20 2a 7a 44 65 73 74 46 69 6c 65   char *zDestFile
ddf0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
de00: 20 2a 7a 53 72 63 44 62 3b 0a 20 20 20 20 73 71   *zSrcDb;.    sq
de10: 6c 69 74 65 33 20 2a 70 44 65 73 74 3b 0a 20 20  lite3 *pDest;.  
de20: 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70    sqlite3_backup
de30: 20 2a 70 42 61 63 6b 75 70 3b 0a 0a 20 20 20 20   *pBackup;..    
de40: 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20  if( objc==3 ){. 
de50: 20 20 20 20 20 7a 53 72 63 44 62 20 3d 20 22 6d       zSrcDb = "m
de60: 61 69 6e 22 3b 0a 20 20 20 20 20 20 7a 44 65 73  ain";.      zDes
de70: 74 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53  tFile = Tcl_GetS
de80: 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
de90: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62      }else if( ob
dea0: 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 7a  jc==4 ){.      z
deb0: 53 72 63 44 62 20 3d 20 54 63 6c 5f 47 65 74 53  SrcDb = Tcl_GetS
dec0: 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
ded0: 20 20 20 20 20 20 7a 44 65 73 74 46 69 6c 65 20        zDestFile 
dee0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
def0: 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 20 20 7d 65  objv[3]);.    }e
df00: 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  lse{.      Tcl_W
df10: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
df20: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 44  rp, 2, objv, "?D
df30: 41 54 41 42 41 53 45 3f 20 46 49 4c 45 4e 41 4d  ATABASE? FILENAM
df40: 45 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  E");.      retur
df50: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
df60: 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
df70: 74 65 33 5f 6f 70 65 6e 28 7a 44 65 73 74 46 69  te3_open(zDestFi
df80: 6c 65 2c 20 26 70 44 65 73 74 29 3b 0a 20 20 20  le, &pDest);.   
df90: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
dfa0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  OK ){.      Tcl_
dfb0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
dfc0: 65 72 70 2c 20 22 63 61 6e 6e 6f 74 20 6f 70 65  erp, "cannot ope
dfd0: 6e 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73  n target databas
dfe0: 65 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20  e: ",.          
dff0: 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
e000: 70 44 65 73 74 29 2c 20 28 63 68 61 72 2a 29 30  pDest), (char*)0
e010: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
e020: 5f 63 6c 6f 73 65 28 70 44 65 73 74 29 3b 0a 20  _close(pDest);. 
e030: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
e040: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
e050: 20 70 42 61 63 6b 75 70 20 3d 20 73 71 6c 69 74   pBackup = sqlit
e060: 65 33 5f 62 61 63 6b 75 70 5f 69 6e 69 74 28 70  e3_backup_init(p
e070: 44 65 73 74 2c 20 22 6d 61 69 6e 22 2c 20 70 44  Dest, "main", pD
e080: 62 2d 3e 64 62 2c 20 7a 53 72 63 44 62 29 3b 0a  b->db, zSrcDb);.
e090: 20 20 20 20 69 66 28 20 70 42 61 63 6b 75 70 3d      if( pBackup=
e0a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =0 ){.      Tcl_
e0b0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
e0c0: 65 72 70 2c 20 22 62 61 63 6b 75 70 20 66 61 69  erp, "backup fai
e0d0: 6c 65 64 3a 20 22 2c 0a 20 20 20 20 20 20 20 20  led: ",.        
e0e0: 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73     sqlite3_errms
e0f0: 67 28 70 44 65 73 74 29 2c 20 28 63 68 61 72 2a  g(pDest), (char*
e100: 29 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  )0);.      sqlit
e110: 65 33 5f 63 6c 6f 73 65 28 70 44 65 73 74 29 3b  e3_close(pDest);
e120: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
e130: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
e140: 20 20 20 77 68 69 6c 65 28 20 20 28 72 63 20 3d     while(  (rc =
e150: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f   sqlite3_backup_
e160: 73 74 65 70 28 70 42 61 63 6b 75 70 2c 31 30 30  step(pBackup,100
e170: 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  ))==SQLITE_OK ){
e180: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61  }.    sqlite3_ba
e190: 63 6b 75 70 5f 66 69 6e 69 73 68 28 70 42 61 63  ckup_finish(pBac
e1a0: 6b 75 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63  kup);.    if( rc
e1b0: 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
e1c0: 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f  .      rc = TCL_
e1d0: 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  OK;.    }else{. 
e1e0: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
e1f0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62  esult(interp, "b
e200: 61 63 6b 75 70 20 66 61 69 6c 65 64 3a 20 22 2c  ackup failed: ",
e210: 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  .           sqli
e220: 74 65 33 5f 65 72 72 6d 73 67 28 70 44 65 73 74  te3_errmsg(pDest
e230: 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ), (char*)0);.  
e240: 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52      rc = TCL_ERR
e250: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  OR;.    }.    sq
e260: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 44 65 73  lite3_close(pDes
e270: 74 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  t);.    break;. 
e280: 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20   }..  /*    $db 
e290: 62 75 73 79 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a  busy ?CALLBACK?.
e2a0: 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65    **.  ** Invoke
e2b0: 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62   the given callb
e2c0: 61 63 6b 20 69 66 20 61 6e 20 53 51 4c 20 73 74  ack if an SQL st
e2d0: 61 74 65 6d 65 6e 74 20 61 74 74 65 6d 70 74 73  atement attempts
e2e0: 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20   to open.  ** a 
e2f0: 6c 6f 63 6b 65 64 20 64 61 74 61 62 61 73 65 20  locked database 
e300: 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  file..  */.  cas
e310: 65 20 44 42 5f 42 55 53 59 3a 20 7b 0a 20 20 20  e DB_BUSY: {.   
e320: 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20   if( objc>3 ){. 
e330: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
e340: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
e350: 20 6f 62 6a 76 2c 20 22 43 41 4c 4c 42 41 43 4b   objv, "CALLBACK
e360: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
e370: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
e380: 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d  }else if( objc==
e390: 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  2 ){.      if( p
e3a0: 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20  Db->zBusy ){.   
e3b0: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
e3c0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44  esult(interp, pD
e3d0: 62 2d 3e 7a 42 75 73 79 2c 20 28 63 68 61 72 2a  b->zBusy, (char*
e3e0: 29 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  )0);.      }.   
e3f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
e400: 61 72 20 2a 7a 42 75 73 79 3b 0a 20 20 20 20 20  ar *zBusy;.     
e410: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20   int len;.      
e420: 69 66 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29  if( pDb->zBusy )
e430: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72  {.        Tcl_Fr
e440: 65 65 28 70 44 62 2d 3e 7a 42 75 73 79 29 3b 0a  ee(pDb->zBusy);.
e450: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 42        }.      zB
e460: 75 73 79 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  usy = Tcl_GetStr
e470: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
e480: 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20  2], &len);.     
e490: 20 69 66 28 20 7a 42 75 73 79 20 26 26 20 6c 65   if( zBusy && le
e4a0: 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  n>0 ){.        p
e4b0: 44 62 2d 3e 7a 42 75 73 79 20 3d 20 54 63 6c 5f  Db->zBusy = Tcl_
e4c0: 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29  Alloc( len + 1 )
e4d0: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
e4e0: 28 70 44 62 2d 3e 7a 42 75 73 79 2c 20 7a 42 75  (pDb->zBusy, zBu
e4f0: 73 79 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20  sy, len+1);.    
e500: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e510: 20 70 44 62 2d 3e 7a 42 75 73 79 20 3d 20 30 3b   pDb->zBusy = 0;
e520: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
e530: 66 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b  f( pDb->zBusy ){
e540: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e  .        pDb->in
e550: 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20  terp = interp;. 
e560: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
e570: 75 73 79 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d  usy_handler(pDb-
e580: 3e 64 62 2c 20 44 62 42 75 73 79 48 61 6e 64 6c  >db, DbBusyHandl
e590: 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20  er, pDb);.      
e5a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
e5b0: 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64  qlite3_busy_hand
e5c0: 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20  ler(pDb->db, 0, 
e5d0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
e5e0: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
e5f0: 0a 0a 20 20 2f 2a 20 20 20 20 20 24 64 62 20 63  ..  /*     $db c
e600: 61 63 68 65 20 66 6c 75 73 68 0a 20 20 2a 2a 20  ache flush.  ** 
e610: 20 20 20 20 24 64 62 20 63 61 63 68 65 20 73 69      $db cache si
e620: 7a 65 20 6e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46  ze n.  **.  ** F
e630: 6c 75 73 68 20 74 68 65 20 70 72 65 70 61 72 65  lush the prepare
e640: 64 20 73 74 61 74 65 6d 65 6e 74 20 63 61 63 68  d statement cach
e650: 65 2c 20 6f 72 20 73 65 74 20 74 68 65 20 6d 61  e, or set the ma
e660: 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 0a  ximum number of.
e670: 20 20 2a 2a 20 63 61 63 68 65 64 20 73 74 61 74    ** cached stat
e680: 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 63  ements..  */.  c
e690: 61 73 65 20 44 42 5f 43 41 43 48 45 3a 20 7b 0a  ase DB_CACHE: {.
e6a0: 20 20 20 20 63 68 61 72 20 2a 73 75 62 43 6d 64      char *subCmd
e6b0: 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 0a 20 20  ;.    int n;..  
e6c0: 20 20 69 66 28 20 6f 62 6a 63 3c 3d 32 20 29 7b    if( objc<=2 ){
e6d0: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
e6e0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
e6f0: 31 2c 20 6f 62 6a 76 2c 20 22 63 61 63 68 65 20  1, objv, "cache 
e700: 6f 70 74 69 6f 6e 20 3f 61 72 67 3f 22 29 3b 0a  option ?arg?");.
e710: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
e720: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
e730: 20 20 73 75 62 43 6d 64 20 3d 20 54 63 6c 5f 47    subCmd = Tcl_G
e740: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
e750: 20 6f 62 6a 76 5b 32 5d 2c 20 30 20 29 3b 0a 20   objv[2], 0 );. 
e760: 20 20 20 69 66 28 20 2a 73 75 62 43 6d 64 3d 3d     if( *subCmd==
e770: 27 66 27 20 26 26 20 73 74 72 63 6d 70 28 73 75  'f' && strcmp(su
e780: 62 43 6d 64 2c 22 66 6c 75 73 68 22 29 3d 3d 30  bCmd,"flush")==0
e790: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f 62   ){.      if( ob
e7a0: 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 20  jc!=3 ){.       
e7b0: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
e7c0: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
e7d0: 76 2c 20 22 66 6c 75 73 68 22 29 3b 0a 20 20 20  v, "flush");.   
e7e0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
e7f0: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c  ERROR;.      }el
e800: 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 75 73  se{.        flus
e810: 68 53 74 6d 74 43 61 63 68 65 28 20 70 44 62 20  hStmtCache( pDb 
e820: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
e830: 65 6c 73 65 20 69 66 28 20 2a 73 75 62 43 6d 64  else if( *subCmd
e840: 3d 3d 27 73 27 20 26 26 20 73 74 72 63 6d 70 28  =='s' && strcmp(
e850: 73 75 62 43 6d 64 2c 22 73 69 7a 65 22 29 3d 3d  subCmd,"size")==
e860: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f  0 ){.      if( o
e870: 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20  bjc!=4 ){.      
e880: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
e890: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
e8a0: 6a 76 2c 20 22 73 69 7a 65 20 6e 22 29 3b 0a 20  jv, "size n");. 
e8b0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
e8c0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  L_ERROR;.      }
e8d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66  else{.        if
e8e0: 28 20 54 43 4c 5f 45 52 52 4f 52 3d 3d 54 63 6c  ( TCL_ERROR==Tcl
e8f0: 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
e900: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20  nterp, objv[3], 
e910: 26 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  &n) ){.         
e920: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
e930: 74 28 20 69 6e 74 65 72 70 2c 20 22 63 61 6e 6e  t( interp, "cann
e940: 6f 74 20 63 6f 6e 76 65 72 74 20 5c 22 22 2c 20  ot convert \"", 
e950: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e960: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
e970: 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 30 29 2c  mObj(objv[3],0),
e980: 20 22 5c 22 20 74 6f 20 69 6e 74 65 67 65 72 22   "\" to integer"
e990: 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
e9a0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
e9b0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  L_ERROR;.       
e9c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
e9d0: 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20    if( n<0 ){.   
e9e0: 20 20 20 20 20 20 20 20 20 66 6c 75 73 68 53 74           flushSt
e9f0: 6d 74 43 61 63 68 65 28 20 70 44 62 20 29 3b 0a  mtCache( pDb );.
ea00: 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20              n = 
ea10: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  0;.          }el
ea20: 73 65 20 69 66 28 20 6e 3e 4d 41 58 5f 50 52 45  se if( n>MAX_PRE
ea30: 50 41 52 45 44 5f 53 54 4d 54 53 20 29 7b 0a 20  PARED_STMTS ){. 
ea40: 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 4d             n = M
ea50: 41 58 5f 50 52 45 50 41 52 45 44 5f 53 54 4d 54  AX_PREPARED_STMT
ea60: 53 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  S;.          }. 
ea70: 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 6d 61           pDb->ma
ea80: 78 53 74 6d 74 20 3d 20 6e 3b 0a 20 20 20 20 20  xStmt = n;.     
ea90: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
eaa0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63   }else{.      Tc
eab0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 20  l_AppendResult( 
eac0: 69 6e 74 65 72 70 2c 20 22 62 61 64 20 6f 70 74  interp, "bad opt
ead0: 69 6f 6e 20 5c 22 22 2c 20 0a 20 20 20 20 20 20  ion \"", .      
eae0: 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
eaf0: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
eb00: 2c 30 29 2c 20 22 5c 22 3a 20 6d 75 73 74 20 62  ,0), "\": must b
eb10: 65 20 66 6c 75 73 68 20 6f 72 20 73 69 7a 65 22  e flush or size"
eb20: 2c 0a 20 20 20 20 20 20 20 20 20 20 28 63 68 61  ,.          (cha
eb30: 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 65 74  r*)0);.      ret
eb40: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
eb50: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
eb60: 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 20 24 64    }..  /*     $d
eb70: 62 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 0a 20  b changes.  **. 
eb80: 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e   ** Return the n
eb90: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68  umber of rows th
eba0: 61 74 20 77 65 72 65 20 6d 6f 64 69 66 69 65 64  at were modified
ebb0: 2c 20 69 6e 73 65 72 74 65 64 2c 20 6f 72 20 64  , inserted, or d
ebc0: 65 6c 65 74 65 64 20 62 79 0a 20 20 2a 2a 20 74  eleted by.  ** t
ebd0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 49  he most recent I
ebe0: 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72  NSERT, UPDATE or
ebf0: 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e   DELETE statemen
ec00: 74 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67  t, not including
ec10: 20 0a 20 20 2a 2a 20 61 6e 79 20 63 68 61 6e 67   .  ** any chang
ec20: 65 73 20 6d 61 64 65 20 62 79 20 74 72 69 67 67  es made by trigg
ec30: 65 72 20 70 72 6f 67 72 61 6d 73 2e 0a 20 20 2a  er programs..  *
ec40: 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 48 41 4e  /.  case DB_CHAN
ec50: 47 45 53 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f  GES: {.    Tcl_O
ec60: 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20  bj *pResult;.   
ec70: 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
ec80: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
ec90: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
eca0: 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20  , objv, "");.   
ecb0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
ecc0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ROR;.    }.    p
ecd0: 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74  Result = Tcl_Get
ece0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
ecf0: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 49 6e  );.    Tcl_SetIn
ed00: 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 73 71  tObj(pResult, sq
ed10: 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 70 44  lite3_changes(pD
ed20: 62 2d 3e 64 62 29 29 3b 0a 20 20 20 20 62 72 65  b->db));.    bre
ed30: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
ed40: 20 24 64 62 20 63 6c 6f 73 65 0a 20 20 2a 2a 0a   $db close.  **.
ed50: 20 20 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68    ** Shutdown th
ed60: 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2f 0a  e database.  */.
ed70: 20 20 63 61 73 65 20 44 42 5f 43 4c 4f 53 45 3a    case DB_CLOSE:
ed80: 20 7b 0a 20 20 20 20 54 63 6c 5f 44 65 6c 65 74   {.    Tcl_Delet
ed90: 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  eCommand(interp,
eda0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
edb0: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
edc0: 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  ));.    break;. 
edd0: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
ede0: 20 20 24 64 62 20 63 6f 6c 6c 61 74 65 20 4e 41    $db collate NA
edf0: 4d 45 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20  ME SCRIPT.  **. 
ee00: 20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77   ** Create a new
ee10: 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   SQL collation f
ee20: 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e  unction called N
ee30: 41 4d 45 2e 20 20 57 68 65 6e 65 76 65 72 0a 20  AME.  Whenever. 
ee40: 20 2a 2a 20 74 68 61 74 20 66 75 6e 63 74 69 6f   ** that functio
ee50: 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 6e 76  n is called, inv
ee60: 6f 6b 65 20 53 43 52 49 50 54 20 74 6f 20 65 76  oke SCRIPT to ev
ee70: 61 6c 75 61 74 65 20 74 68 65 20 66 75 6e 63 74  aluate the funct
ee80: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ion..  */.  case
ee90: 20 44 42 5f 43 4f 4c 4c 41 54 45 3a 20 7b 0a 20   DB_COLLATE: {. 
eea0: 20 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70     SqlCollate *p
eeb0: 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 63 68 61  Collate;.    cha
eec0: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 68  r *zName;.    ch
eed0: 61 72 20 2a 7a 53 63 72 69 70 74 3b 0a 20 20 20  ar *zScript;.   
eee0: 20 69 6e 74 20 6e 53 63 72 69 70 74 3b 0a 20 20   int nScript;.  
eef0: 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b    if( objc!=4 ){
ef00: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
ef10: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
ef20: 32 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 20 53  2, objv, "NAME S
ef30: 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72  CRIPT");.      r
ef40: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
ef50: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65  .    }.    zName
ef60: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
ef70: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
ef80: 20 30 29 3b 0a 20 20 20 20 7a 53 63 72 69 70 74   0);.    zScript
ef90: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
efa0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c  FromObj(objv[3],
efb0: 20 26 6e 53 63 72 69 70 74 29 3b 0a 20 20 20 20   &nScript);.    
efc0: 70 43 6f 6c 6c 61 74 65 20 3d 20 28 53 71 6c 43  pCollate = (SqlC
efd0: 6f 6c 6c 61 74 65 2a 29 54 63 6c 5f 41 6c 6c 6f  ollate*)Tcl_Allo
efe0: 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 6f 6c 6c  c( sizeof(*pColl
eff0: 61 74 65 29 20 2b 20 6e 53 63 72 69 70 74 20 2b  ate) + nScript +
f000: 20 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43   1 );.    if( pC
f010: 6f 6c 6c 61 74 65 3d 3d 30 20 29 20 72 65 74 75  ollate==0 ) retu
f020: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
f030: 20 20 70 43 6f 6c 6c 61 74 65 2d 3e 69 6e 74 65    pCollate->inte
f040: 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20  rp = interp;.   
f050: 20 70 43 6f 6c 6c 61 74 65 2d 3e 70 4e 65 78 74   pCollate->pNext
f060: 20 3d 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65   = pDb->pCollate
f070: 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65 2d 3e  ;.    pCollate->
f080: 7a 53 63 72 69 70 74 20 3d 20 28 63 68 61 72 2a  zScript = (char*
f090: 29 26 70 43 6f 6c 6c 61 74 65 5b 31 5d 3b 0a 20  )&pCollate[1];. 
f0a0: 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65     pDb->pCollate
f0b0: 20 3d 20 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20   = pCollate;.   
f0c0: 20 6d 65 6d 63 70 79 28 70 43 6f 6c 6c 61 74 65   memcpy(pCollate
f0d0: 2d 3e 7a 53 63 72 69 70 74 2c 20 7a 53 63 72 69  ->zScript, zScri
f0e0: 70 74 2c 20 6e 53 63 72 69 70 74 2b 31 29 3b 0a  pt, nScript+1);.
f0f0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
f100: 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
f110: 28 70 44 62 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c  (pDb->db, zName,
f120: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20   SQLITE_UTF8, . 
f130: 20 20 20 20 20 20 20 70 43 6f 6c 6c 61 74 65 2c         pCollate,
f140: 20 74 63 6c 53 71 6c 43 6f 6c 6c 61 74 65 29 20   tclSqlCollate) 
f150: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  ){.      Tcl_Set
f160: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
f170: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 65  char *)sqlite3_e
f180: 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20  rrmsg(pDb->db), 
f190: 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20  TCL_VOLATILE);. 
f1a0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
f1b0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
f1c0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
f1d0: 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 63  *.  **     $db c
f1e0: 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 20  ollation_needed 
f1f0: 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a  SCRIPT.  **.  **
f200: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 51   Create a new SQ
f210: 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63  L collation func
f220: 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45  tion called NAME
f230: 2e 20 20 57 68 65 6e 65 76 65 72 0a 20 20 2a 2a  .  Whenever.  **
f240: 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 69   that function i
f250: 73 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65  s called, invoke
f260: 20 53 43 52 49 50 54 20 74 6f 20 65 76 61 6c 75   SCRIPT to evalu
f270: 61 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  ate the function
f280: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
f290: 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4e 45 45 44 45  _COLLATION_NEEDE
f2a0: 44 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a  D: {.    if( obj
f2b0: 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=3 ){.      Tc
f2c0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
f2d0: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
f2e0: 22 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20  "SCRIPT");.     
f2f0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
f300: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  R;.    }.    if(
f310: 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65   pDb->pCollateNe
f320: 65 64 65 64 20 29 7b 0a 20 20 20 20 20 20 54 63  eded ){.      Tc
f330: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
f340: 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64  Db->pCollateNeed
f350: 65 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ed);.    }.    p
f360: 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64  Db->pCollateNeed
f370: 65 64 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  ed = Tcl_Duplica
f380: 74 65 4f 62 6a 28 6f 62 6a 76 5b 32 5d 29 3b 0a  teObj(objv[2]);.
f390: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
f3a0: 6f 75 6e 74 28 70 44 62 2d 3e 70 43 6f 6c 6c 61  ount(pDb->pColla
f3b0: 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 73  teNeeded);.    s
f3c0: 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e  qlite3_collation
f3d0: 5f 6e 65 65 64 65 64 28 70 44 62 2d 3e 64 62 2c  _needed(pDb->db,
f3e0: 20 70 44 62 2c 20 74 63 6c 43 6f 6c 6c 61 74 65   pDb, tclCollate
f3f0: 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 62 72 65  Needed);.    bre
f400: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
f410: 20 24 64 62 20 63 6f 6d 6d 69 74 5f 68 6f 6f 6b   $db commit_hook
f420: 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a   ?CALLBACK?.  **
f430: 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  .  ** Invoke the
f440: 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20   given callback 
f450: 6a 75 73 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d  just before comm
f460: 69 74 74 69 6e 67 20 65 76 65 72 79 20 53 51 4c  itting every SQL
f470: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
f480: 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 62 61  ** If the callba
f490: 63 6b 20 74 68 72 6f 77 73 20 61 6e 20 65 78 63  ck throws an exc
f4a0: 65 70 74 69 6f 6e 20 6f 72 20 72 65 74 75 72 6e  eption or return
f4b0: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
f4c0: 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61   the.  ** transa
f4d0: 63 74 69 6f 6e 20 69 73 20 61 62 6f 72 74 65 64  ction is aborted
f4e0: 2e 20 20 49 66 20 43 41 4c 4c 42 41 43 4b 20 69  .  If CALLBACK i
f4f0: 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  s an empty strin
f500: 67 2c 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 0a  g, the callback.
f510: 20 20 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64    ** is disabled
f520: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
f530: 5f 43 4f 4d 4d 49 54 5f 48 4f 4f 4b 3a 20 7b 0a  _COMMIT_HOOK: {.
f540: 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29      if( objc>3 )
f550: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
f560: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
f570: 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c   2, objv, "?CALL
f580: 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72  BACK?");.      r
f590: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
f5a0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
f5b0: 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  bjc==2 ){.      
f5c0: 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74  if( pDb->zCommit
f5d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
f5e0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
f5f0: 65 72 70 2c 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69  erp, pDb->zCommi
f600: 74 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  t, (char*)0);.  
f610: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
f620: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
f630: 72 20 2a 7a 43 6f 6d 6d 69 74 3b 0a 20 20 20 20  r *zCommit;.    
f640: 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20    int len;.     
f650: 20 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69   if( pDb->zCommi
f660: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  t ){.        Tcl
f670: 5f 46 72 65 65 28 70 44 62 2d 3e 7a 43 6f 6d 6d  _Free(pDb->zComm
f680: 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  it);.      }.   
f690: 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 54 63 6c     zCommit = Tcl
f6a0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
f6b0: 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29  j(objv[2], &len)
f6c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 43 6f 6d  ;.      if( zCom
f6d0: 6d 69 74 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a  mit && len>0 ){.
f6e0: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 43 6f          pDb->zCo
f6f0: 6d 6d 69 74 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63  mmit = Tcl_Alloc
f700: 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20  ( len + 1 );.   
f710: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d       memcpy(pDb-
f720: 3e 7a 43 6f 6d 6d 69 74 2c 20 7a 43 6f 6d 6d 69  >zCommit, zCommi
f730: 74 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20  t, len+1);.     
f740: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
f750: 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20 30  pDb->zCommit = 0
f760: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f770: 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74  if( pDb->zCommit
f780: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
f790: 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  >interp = interp
f7a0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
f7b0: 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 70 44  3_commit_hook(pD
f7c0: 62 2d 3e 64 62 2c 20 44 62 43 6f 6d 6d 69 74 48  b->db, DbCommitH
f7d0: 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20  andler, pDb);.  
f7e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f7f0: 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69     sqlite3_commi
f800: 74 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 20  t_hook(pDb->db, 
f810: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  0, 0);.      }. 
f820: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
f830: 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62    }..  /*    $db
f840: 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c 0a 20 20   complete SQL.  
f850: 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 54  **.  ** Return T
f860: 52 55 45 20 69 66 20 53 51 4c 20 69 73 20 61 20  RUE if SQL is a 
f870: 63 6f 6d 70 6c 65 74 65 20 53 51 4c 20 73 74 61  complete SQL sta
f880: 74 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20  tement.  Return 
f890: 46 41 4c 53 45 20 69 66 0a 20 20 2a 2a 20 61 64  FALSE if.  ** ad
f8a0: 64 69 74 69 6f 6e 61 6c 20 6c 69 6e 65 73 20 6f  ditional lines o
f8b0: 66 20 69 6e 70 75 74 20 61 72 65 20 6e 65 65 64  f input are need
f8c0: 65 64 2e 20 20 54 68 69 73 20 69 73 20 73 69 6d  ed.  This is sim
f8d0: 69 6c 61 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a  ilar to the.  **
f8e0: 20 62 75 69 6c 74 2d 69 6e 20 22 69 6e 66 6f 20   built-in "info 
f8f0: 63 6f 6d 70 6c 65 74 65 22 20 63 6f 6d 6d 61 6e  complete" comman
f900: 64 20 6f 66 20 54 63 6c 2e 0a 20 20 2a 2f 0a 20  d of Tcl..  */. 
f910: 20 63 61 73 65 20 44 42 5f 43 4f 4d 50 4c 45 54   case DB_COMPLET
f920: 45 3a 20 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  E: {.#ifndef SQL
f930: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4c 45 54  ITE_OMIT_COMPLET
f940: 45 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  E.    Tcl_Obj *p
f950: 52 65 73 75 6c 74 3b 0a 20 20 20 20 69 6e 74 20  Result;.    int 
f960: 69 73 43 6f 6d 70 6c 65 74 65 3b 0a 20 20 20 20  isComplete;.    
f970: 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
f980: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
f990: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
f9a0: 20 6f 62 6a 76 2c 20 22 53 51 4c 22 29 3b 0a 20   objv, "SQL");. 
f9b0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
f9c0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
f9d0: 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 73 71   isComplete = sq
f9e0: 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 28 20  lite3_complete( 
f9f0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
fa00: 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29  mObj(objv[2], 0)
fa10: 20 29 3b 0a 20 20 20 20 70 52 65 73 75 6c 74 20   );.    pResult 
fa20: 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75  = Tcl_GetObjResu
fa30: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  lt(interp);.    
fa40: 54 63 6c 5f 53 65 74 42 6f 6f 6c 65 61 6e 4f 62  Tcl_SetBooleanOb
fa50: 6a 28 70 52 65 73 75 6c 74 2c 20 69 73 43 6f 6d  j(pResult, isCom
fa60: 70 6c 65 74 65 29 3b 0a 23 65 6e 64 69 66 0a 20  plete);.#endif. 
fa70: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
fa80: 20 2f 2a 20 20 20 20 24 64 62 20 63 6f 70 79 20   /*    $db copy 
fa90: 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74  conflict-algorit
faa0: 68 6d 20 74 61 62 6c 65 20 66 69 6c 65 6e 61 6d  hm table filenam
fab0: 65 20 3f 53 45 50 41 52 41 54 4f 52 3f 20 3f 4e  e ?SEPARATOR? ?N
fac0: 55 4c 4c 49 4e 44 49 43 41 54 4f 52 3f 0a 20 20  ULLINDICATOR?.  
fad0: 2a 2a 0a 20 20 2a 2a 20 43 6f 70 79 20 64 61 74  **.  ** Copy dat
fae0: 61 20 69 6e 74 6f 20 74 61 62 6c 65 20 66 72 6f  a into table fro
faf0: 6d 20 66 69 6c 65 6e 61 6d 65 2c 20 6f 70 74 69  m filename, opti
fb00: 6f 6e 61 6c 6c 79 20 75 73 69 6e 67 20 53 45 50  onally using SEP
fb10: 41 52 41 54 4f 52 0a 20 20 2a 2a 20 61 73 20 63  ARATOR.  ** as c
fb20: 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 73  olumn separators
fb30: 2e 20 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 63  .  If a column c
fb40: 6f 6e 74 61 69 6e 73 20 61 20 6e 75 6c 6c 20 73  ontains a null s
fb50: 74 72 69 6e 67 2c 20 6f 72 20 74 68 65 0a 20 20  tring, or the.  
fb60: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 4e 55 4c 4c  ** value of NULL
fb70: 49 4e 44 49 43 41 54 4f 52 2c 20 61 20 4e 55 4c  INDICATOR, a NUL
fb80: 4c 20 69 73 20 69 6e 73 65 72 74 65 64 20 66 6f  L is inserted fo
fb90: 72 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20  r the column..  
fba0: 2a 2a 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f  ** conflict-algo
fbb0: 72 69 74 68 6d 20 69 73 20 6f 6e 65 20 6f 66 20  rithm is one of 
fbc0: 74 68 65 20 73 71 6c 69 74 65 20 63 6f 6e 66 6c  the sqlite confl
fbd0: 69 63 74 20 61 6c 67 6f 72 69 74 68 6d 73 3a 0a  ict algorithms:.
fbe0: 20 20 2a 2a 20 20 20 20 72 6f 6c 6c 62 61 63 6b    **    rollback
fbf0: 2c 20 61 62 6f 72 74 2c 20 66 61 69 6c 2c 20 69  , abort, fail, i
fc00: 67 6e 6f 72 65 2c 20 72 65 70 6c 61 63 65 0a 20  gnore, replace. 
fc10: 20 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20   ** On success, 
fc20: 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  return the numbe
fc30: 72 20 6f 66 20 6c 69 6e 65 73 20 70 72 6f 63 65  r of lines proce
fc40: 73 73 65 64 2c 20 6e 6f 74 20 6e 65 63 65 73 73  ssed, not necess
fc50: 61 72 69 6c 79 20 73 61 6d 65 0a 20 20 2a 2a 20  arily same.  ** 
fc60: 61 73 20 27 64 62 20 63 68 61 6e 67 65 73 27 20  as 'db changes' 
fc70: 64 75 65 20 74 6f 20 63 6f 6e 66 6c 69 63 74 2d  due to conflict-
fc80: 61 6c 67 6f 72 69 74 68 6d 20 73 65 6c 65 63 74  algorithm select
fc90: 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ed..  **.  ** Th
fca0: 69 73 20 63 6f 64 65 20 69 73 20 62 61 73 69 63  is code is basic
fcb0: 61 6c 6c 79 20 61 6e 20 69 6d 70 6c 65 6d 65 6e  ally an implemen
fcc0: 74 61 74 69 6f 6e 2f 65 6e 68 61 6e 63 65 6d 65  tation/enhanceme
fcd0: 6e 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73  nt of.  ** the s
fce0: 71 6c 69 74 65 33 20 73 68 65 6c 6c 2e 63 20 22  qlite3 shell.c "
fcf0: 2e 69 6d 70 6f 72 74 22 20 63 6f 6d 6d 61 6e 64  .import" command
fd00: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
fd10: 20 63 6f 6d 6d 61 6e 64 20 75 73 61 67 65 20 69   command usage i
fd20: 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
fd30: 74 68 65 20 73 71 6c 69 74 65 32 2e 78 20 43 4f  the sqlite2.x CO
fd40: 50 59 20 73 74 61 74 65 6d 65 6e 74 2c 0a 20 20  PY statement,.  
fd50: 2a 2a 20 77 68 69 63 68 20 69 6d 70 6f 72 74 73  ** which imports
fd60: 20 66 69 6c 65 20 64 61 74 61 20 69 6e 74 6f 20   file data into 
fd70: 61 20 74 61 62 6c 65 20 75 73 69 6e 67 20 74 68  a table using th
fd80: 65 20 50 6f 73 74 67 72 65 53 51 4c 20 43 4f 50  e PostgreSQL COP
fd90: 59 20 66 69 6c 65 20 66 6f 72 6d 61 74 3a 0a 20  Y file format:. 
fda0: 20 2a 2a 20 20 20 24 64 62 20 63 6f 70 79 20 24   **   $db copy $
fdb0: 63 6f 6e 66 6c 69 74 5f 61 6c 67 6f 20 24 74 61  conflit_algo $ta
fdc0: 62 6c 65 5f 6e 61 6d 65 20 24 66 69 6c 65 6e 61  ble_name $filena
fdd0: 6d 65 20 5c 74 20 5c 5c 4e 0a 20 20 2a 2f 0a 20  me \t \\N.  */. 
fde0: 20 63 61 73 65 20 44 42 5f 43 4f 50 59 3a 20 7b   case DB_COPY: {
fdf0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 6c  .    char *zTabl
fe00: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
fe10: 20 2f 2a 20 49 6e 73 65 72 74 20 64 61 74 61 20   /* Insert data 
fe20: 69 6e 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20  into this table 
fe30: 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 46 69  */.    char *zFi
fe40: 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
fe50: 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 66     /* The file f
fe60: 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 65 78 74  rom which to ext
fe70: 72 61 63 74 20 64 61 74 61 20 2a 2f 0a 20 20 20  ract data */.   
fe80: 20 63 68 61 72 20 2a 7a 43 6f 6e 66 6c 69 63 74   char *zConflict
fe90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
fea0: 54 68 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c 67  The conflict alg
feb0: 6f 72 69 74 68 6d 20 74 6f 20 75 73 65 20 2a 2f  orithm to use */
fec0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
fed0: 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20  t *pStmt;       
fee0: 20 2f 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20   /* A statement 
fef0: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b  */.    int nCol;
ff00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff10: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
ff20: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74  columns in the t
ff30: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  able */.    int 
ff40: 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20  nByte;          
ff50: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
ff60: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61 6e  r of bytes in an
ff70: 20 53 51 4c 20 73 74 72 69 6e 67 20 2a 2f 0a 20   SQL string */. 
ff80: 20 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20     int i, j;    
ff90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ffa0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
ffb0: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 70 3b  */.    int nSep;
ffc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ffd0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
ffe0: 62 79 74 65 73 20 69 6e 20 7a 53 65 70 5b 5d 20  bytes in zSep[] 
fff0: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4e 75 6c 6c  */.    int nNull
10000 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10010 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
10020 62 79 74 65 73 20 69 6e 20 7a 4e 75 6c 6c 5b 5d  bytes in zNull[]
10030 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53   */.    char *zS
10040 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ql;             
10050 20 20 20 20 2f 2a 20 41 6e 20 53 51 4c 20 73 74      /* An SQL st
10060 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 63  atement */.    c
10070 68 61 72 20 2a 7a 4c 69 6e 65 3b 20 20 20 20 20  har *zLine;     
10080 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
10090 73 69 6e 67 6c 65 20 6c 69 6e 65 20 6f 66 20 69  single line of i
100a0 6e 70 75 74 20 66 72 6f 6d 20 74 68 65 20 66 69  nput from the fi
100b0 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  le */.    char *
100c0 2a 61 7a 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  *azCol;         
100d0 20 20 20 20 20 20 2f 2a 20 7a 4c 69 6e 65 5b 5d        /* zLine[]
100e0 20 62 72 6f 6b 65 6e 20 75 70 20 69 6e 74 6f 20   broken up into 
100f0 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 63  columns */.    c
10100 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6d 6d  onst char *zComm
10110 69 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 48 6f  it;        /* Ho
10120 77 20 74 6f 20 63 6f 6d 6d 69 74 20 63 68 61 6e  w to commit chan
10130 67 65 73 20 2a 2f 0a 20 20 20 20 46 49 4c 45 20  ges */.    FILE 
10140 2a 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  *in;            
10150 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
10160 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  put file */.    
10170 69 6e 74 20 6c 69 6e 65 6e 6f 20 3d 20 30 3b 20  int lineno = 0; 
10180 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
10190 69 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  ine number of in
101a0 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  put file */.    
101b0 63 68 61 72 20 7a 4c 69 6e 65 4e 75 6d 5b 38 30  char zLineNum[80
101c0 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ];          /* L
101d0 69 6e 65 20 6e 75 6d 62 65 72 20 70 72 69 6e 74  ine number print
101e0 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 54   buffer */.    T
101f0 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b  cl_Obj *pResult;
10200 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e             /* in
10210 74 65 72 70 20 72 65 73 75 6c 74 20 2a 2f 0a 0a  terp result */..
10220 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
10230 7a 53 65 70 3b 0a 20 20 20 20 63 6f 6e 73 74 20  zSep;.    const 
10240 63 68 61 72 20 2a 7a 4e 75 6c 6c 3b 0a 20 20 20  char *zNull;.   
10250 20 69 66 28 20 6f 62 6a 63 3c 35 20 7c 7c 20 6f   if( objc<5 || o
10260 62 6a 63 3e 37 20 29 7b 0a 20 20 20 20 20 20 54  bjc>7 ){.      T
10270 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
10280 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
10290 20 0a 20 20 20 20 20 20 20 20 20 22 43 4f 4e 46   .         "CONF
102a0 4c 49 43 54 2d 41 4c 47 4f 52 49 54 48 4d 20 54  LICT-ALGORITHM T
102b0 41 42 4c 45 20 46 49 4c 45 4e 41 4d 45 20 3f 53  ABLE FILENAME ?S
102c0 45 50 41 52 41 54 4f 52 3f 20 3f 4e 55 4c 4c 49  EPARATOR? ?NULLI
102d0 4e 44 49 43 41 54 4f 52 3f 22 29 3b 0a 20 20 20  NDICATOR?");.   
102e0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
102f0 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
10300 66 28 20 6f 62 6a 63 3e 3d 36 20 29 7b 0a 20 20  f( objc>=6 ){.  
10310 20 20 20 20 7a 53 65 70 20 3d 20 54 63 6c 5f 47      zSep = Tcl_G
10320 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
10330 6f 62 6a 76 5b 35 5d 2c 20 30 29 3b 0a 20 20 20  objv[5], 0);.   
10340 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 53   }else{.      zS
10350 65 70 20 3d 20 22 5c 74 22 3b 0a 20 20 20 20 7d  ep = "\t";.    }
10360 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 3d 37  .    if( objc>=7
10370 20 29 7b 0a 20 20 20 20 20 20 7a 4e 75 6c 6c 20   ){.      zNull 
10380 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
10390 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 36 5d 2c 20  romObj(objv[6], 
103a0 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
103b0 20 20 20 20 20 7a 4e 75 6c 6c 20 3d 20 22 22 3b       zNull = "";
103c0 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43 6f 6e 66  .    }.    zConf
103d0 6c 69 63 74 20 3d 20 54 63 6c 5f 47 65 74 53 74  lict = Tcl_GetSt
103e0 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
103f0 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20 7a 54 61  [2], 0);.    zTa
10400 62 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ble = Tcl_GetStr
10410 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
10420 33 5d 2c 20 30 29 3b 0a 20 20 20 20 7a 46 69 6c  3], 0);.    zFil
10430 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
10440 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 34 5d  gFromObj(objv[4]
10450 2c 20 30 29 3b 0a 20 20 20 20 6e 53 65 70 20 3d  , 0);.    nSep =
10460 20 73 74 72 6c 65 6e 33 30 28 7a 53 65 70 29 3b   strlen30(zSep);
10470 0a 20 20 20 20 6e 4e 75 6c 6c 20 3d 20 73 74 72  .    nNull = str
10480 6c 65 6e 33 30 28 7a 4e 75 6c 6c 29 3b 0a 20 20  len30(zNull);.  
10490 20 20 69 66 28 20 6e 53 65 70 3d 3d 30 20 29 7b    if( nSep==0 ){
104a0 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
104b0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22  dResult(interp,"
104c0 45 72 72 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c 20  Error: non-null 
104d0 73 65 70 61 72 61 74 6f 72 20 72 65 71 75 69 72  separator requir
104e0 65 64 20 66 6f 72 20 63 6f 70 79 22 2c 0a 20 20  ed for copy",.  
104f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10500 20 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b 0a       (char*)0);.
10510 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
10520 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
10530 20 20 69 66 28 73 74 72 63 6d 70 28 7a 43 6f 6e    if(strcmp(zCon
10540 66 6c 69 63 74 2c 20 22 72 6f 6c 6c 62 61 63 6b  flict, "rollback
10550 22 29 20 21 3d 20 30 20 26 26 0a 20 20 20 20 20  ") != 0 &&.     
10560 20 20 73 74 72 63 6d 70 28 7a 43 6f 6e 66 6c 69    strcmp(zConfli
10570 63 74 2c 20 22 61 62 6f 72 74 22 20 20 20 29 20  ct, "abort"   ) 
10580 21 3d 20 30 20 26 26 0a 20 20 20 20 20 20 20 73  != 0 &&.       s
10590 74 72 63 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c  trcmp(zConflict,
105a0 20 22 66 61 69 6c 22 20 20 20 20 29 20 21 3d 20   "fail"    ) != 
105b0 30 20 26 26 0a 20 20 20 20 20 20 20 73 74 72 63  0 &&.       strc
105c0 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 69  mp(zConflict, "i
105d0 67 6e 6f 72 65 22 20 20 29 20 21 3d 20 30 20 26  gnore"  ) != 0 &
105e0 26 0a 20 20 20 20 20 20 20 73 74 72 63 6d 70 28  &.       strcmp(
105f0 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 72 65 70 6c  zConflict, "repl
10600 61 63 65 22 20 29 20 21 3d 20 30 20 29 20 7b 0a  ace" ) != 0 ) {.
10610 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
10620 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
10630 45 72 72 6f 72 3a 20 5c 22 22 2c 20 7a 43 6f 6e  Error: \"", zCon
10640 66 6c 69 63 74 2c 20 0a 20 20 20 20 20 20 20 20  flict, .        
10650 20 20 20 20 22 5c 22 2c 20 63 6f 6e 66 6c 69 63      "\", conflic
10660 74 2d 61 6c 67 6f 72 69 74 68 6d 20 6d 75 73 74  t-algorithm must
10670 20 62 65 20 6f 6e 65 20 6f 66 3a 20 72 6f 6c 6c   be one of: roll
10680 62 61 63 6b 2c 20 22 0a 20 20 20 20 20 20 20 20  back, ".        
10690 20 20 20 20 22 61 62 6f 72 74 2c 20 66 61 69 6c      "abort, fail
106a0 2c 20 69 67 6e 6f 72 65 2c 20 6f 72 20 72 65 70  , ignore, or rep
106b0 6c 61 63 65 22 2c 20 28 63 68 61 72 2a 29 30 29  lace", (char*)0)
106c0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
106d0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
106e0 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
106f0 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45  e3_mprintf("SELE
10700 43 54 20 2a 20 46 52 4f 4d 20 27 25 71 27 22 2c  CT * FROM '%q'",
10710 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 69 66   zTable);.    if
10720 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20  ( zSql==0 ){.   
10730 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
10740 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72  ult(interp, "Err
10750 6f 72 3a 20 6e 6f 20 73 75 63 68 20 74 61 62 6c  or: no such tabl
10760 65 3a 20 22 2c 20 7a 54 61 62 6c 65 2c 20 28 63  e: ", zTable, (c
10770 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72  har*)0);.      r
10780 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
10790 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65  .    }.    nByte
107a0 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 53 71 6c   = strlen30(zSql
107b0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
107c0 74 65 33 5f 70 72 65 70 61 72 65 28 70 44 62 2d  te3_prepare(pDb-
107d0 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  >db, zSql, -1, &
107e0 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73  pStmt, 0);.    s
107f0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
10800 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
10810 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
10820 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
10830 22 45 72 72 6f 72 3a 20 22 2c 20 73 71 6c 69 74  "Error: ", sqlit
10840 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64  e3_errmsg(pDb->d
10850 62 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  b), (char*)0);. 
10860 20 20 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20       nCol = 0;. 
10870 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10880 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63  nCol = sqlite3_c
10890 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d  olumn_count(pStm
108a0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  t);.    }.    sq
108b0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
108c0 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 6e  Stmt);.    if( n
108d0 43 6f 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20  Col==0 ) {.     
108e0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
108f0 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71  R;.    }.    zSq
10900 6c 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42 79 74  l = malloc( nByt
10910 65 20 2b 20 35 30 20 2b 20 6e 43 6f 6c 2a 32 20  e + 50 + nCol*2 
10920 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d  );.    if( zSql=
10930 3d 30 20 29 20 7b 0a 20 20 20 20 20 20 54 63 6c  =0 ) {.      Tcl
10940 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
10950 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 63 61  terp, "Error: ca
10960 6e 27 74 20 6d 61 6c 6c 6f 63 28 29 22 2c 20 28  n't malloc()", (
10970 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
10980 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
10990 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
109a0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 79  te3_snprintf(nBy
109b0 74 65 2b 35 30 2c 20 7a 53 71 6c 2c 20 22 49 4e  te+50, zSql, "IN
109c0 53 45 52 54 20 4f 52 20 25 71 20 49 4e 54 4f 20  SERT OR %q INTO 
109d0 27 25 71 27 20 56 41 4c 55 45 53 28 3f 22 2c 0a  '%q' VALUES(?",.
109e0 20 20 20 20 20 20 20 20 20 7a 43 6f 6e 66 6c 69           zConfli
109f0 63 74 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20  ct, zTable);.   
10a00 20 6a 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 53   j = strlen30(zS
10a10 71 6c 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31  ql);.    for(i=1
10a20 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
10a30 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20        zSql[j++] 
10a40 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 7a 53 71  = ',';.      zSq
10a50 6c 5b 6a 2b 2b 5d 20 3d 20 27 3f 27 3b 0a 20 20  l[j++] = '?';.  
10a60 20 20 7d 0a 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b    }.    zSql[j++
10a70 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20 7a 53 71  ] = ')';.    zSq
10a80 6c 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 72 63  l[j] = 0;.    rc
10a90 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
10aa0 72 65 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c  re(pDb->db, zSql
10ab0 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29  , -1, &pStmt, 0)
10ac0 3b 0a 20 20 20 20 66 72 65 65 28 7a 53 71 6c 29  ;.    free(zSql)
10ad0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
10ae0 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
10af0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
10b00 45 72 72 6f 72 3a 20 22 2c 20 73 71 6c 69 74 65  Error: ", sqlite
10b10 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62  3_errmsg(pDb->db
10b20 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ), (char*)0);.  
10b30 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
10b40 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
10b50 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
10b60 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
10b70 6e 20 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c  n = fopen(zFile,
10b80 20 22 72 62 22 29 3b 0a 20 20 20 20 69 66 28 20   "rb");.    if( 
10b90 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54  in==0 ){.      T
10ba0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
10bb0 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20  interp, "Error: 
10bc0 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65  cannot open file
10bd0 3a 20 22 2c 20 7a 46 69 6c 65 2c 20 4e 55 4c 4c  : ", zFile, NULL
10be0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10bf0 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
10c00 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
10c10 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
10c20 20 20 20 20 61 7a 43 6f 6c 20 3d 20 6d 61 6c 6c      azCol = mall
10c30 6f 63 28 20 73 69 7a 65 6f 66 28 61 7a 43 6f 6c  oc( sizeof(azCol
10c40 5b 30 5d 29 2a 28 6e 43 6f 6c 2b 31 29 20 29 3b  [0])*(nCol+1) );
10c50 0a 20 20 20 20 69 66 28 20 61 7a 43 6f 6c 3d 3d  .    if( azCol==
10c60 30 20 29 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f  0 ) {.      Tcl_
10c70 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
10c80 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e  erp, "Error: can
10c90 27 74 20 6d 61 6c 6c 6f 63 28 29 22 2c 20 28 63  't malloc()", (c
10ca0 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 66  har*)0);.      f
10cb0 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 20  close(in);.     
10cc0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
10cd0 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28 76 6f  R;.    }.    (vo
10ce0 69 64 29 73 71 6c 69 74 65 33 5f 65 78 65 63 28  id)sqlite3_exec(
10cf0 70 44 62 2d 3e 64 62 2c 20 22 42 45 47 49 4e 22  pDb->db, "BEGIN"
10d00 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
10d10 7a 43 6f 6d 6d 69 74 20 3d 20 22 43 4f 4d 4d 49  zCommit = "COMMI
10d20 54 22 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  T";.    while( (
10d30 7a 4c 69 6e 65 20 3d 20 6c 6f 63 61 6c 5f 67 65  zLine = local_ge
10d40 74 6c 69 6e 65 28 30 2c 20 69 6e 29 29 21 3d 30  tline(0, in))!=0
10d50 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
10d60 7a 3b 0a 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2b  z;.      lineno+
10d70 2b 3b 0a 20 20 20 20 20 20 61 7a 43 6f 6c 5b 30  +;.      azCol[0
10d80 5d 20 3d 20 7a 4c 69 6e 65 3b 0a 20 20 20 20 20  ] = zLine;.     
10d90 20 66 6f 72 28 69 3d 30 2c 20 7a 3d 7a 4c 69 6e   for(i=0, z=zLin
10da0 65 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20 20 20  e; *z; z++){.   
10db0 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d 7a 53 65       if( *z==zSe
10dc0 70 5b 30 5d 20 26 26 20 73 74 72 6e 63 6d 70 28  p[0] && strncmp(
10dd0 7a 2c 20 7a 53 65 70 2c 20 6e 53 65 70 29 3d 3d  z, zSep, nSep)==
10de0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a  0 ){.          *
10df0 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  z = 0;.         
10e00 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20   i++;.          
10e10 69 66 28 20 69 3c 6e 43 6f 6c 20 29 7b 0a 20 20  if( i<nCol ){.  
10e20 20 20 20 20 20 20 20 20 20 20 61 7a 43 6f 6c 5b            azCol[
10e30 69 5d 20 3d 20 26 7a 5b 6e 53 65 70 5d 3b 0a 20  i] = &z[nSep];. 
10e40 20 20 20 20 20 20 20 20 20 20 20 7a 20 2b 3d 20             z += 
10e50 6e 53 65 70 2d 31 3b 0a 20 20 20 20 20 20 20 20  nSep-1;.        
10e60 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
10e70 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
10e80 69 2b 31 21 3d 6e 43 6f 6c 20 29 7b 0a 20 20 20  i+1!=nCol ){.   
10e90 20 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 3b       char *zErr;
10ea0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 45 72  .        int nEr
10eb0 72 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 46 69  r = strlen30(zFi
10ec0 6c 65 29 20 2b 20 32 30 30 3b 0a 20 20 20 20 20  le) + 200;.     
10ed0 20 20 20 7a 45 72 72 20 3d 20 6d 61 6c 6c 6f 63     zErr = malloc
10ee0 28 6e 45 72 72 29 3b 0a 20 20 20 20 20 20 20 20  (nErr);.        
10ef0 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20  if( zErr ){.    
10f00 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
10f10 70 72 69 6e 74 66 28 6e 45 72 72 2c 20 7a 45 72  printf(nErr, zEr
10f20 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
10f30 22 45 72 72 6f 72 3a 20 25 73 20 6c 69 6e 65 20  "Error: %s line 
10f40 25 64 3a 20 65 78 70 65 63 74 65 64 20 25 64 20  %d: expected %d 
10f50 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20  columns of data 
10f60 62 75 74 20 66 6f 75 6e 64 20 25 64 22 2c 0a 20  but found %d",. 
10f70 20 20 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c              zFil
10f80 65 2c 20 6c 69 6e 65 6e 6f 2c 20 6e 43 6f 6c 2c  e, lineno, nCol,
10f90 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20   i+1);.         
10fa0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
10fb0 74 28 69 6e 74 65 72 70 2c 20 7a 45 72 72 2c 20  t(interp, zErr, 
10fc0 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
10fd0 20 20 20 20 20 66 72 65 65 28 7a 45 72 72 29 3b       free(zErr);
10fe0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
10ff0 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22 52 4f     zCommit = "RO
11000 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20 20 20  LLBACK";.       
11010 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
11020 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
11030 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
11040 20 20 20 20 20 2f 2a 20 63 68 65 63 6b 20 66 6f       /* check fo
11050 72 20 6e 75 6c 6c 20 64 61 74 61 2c 20 69 66 20  r null data, if 
11060 73 6f 2c 20 62 69 6e 64 20 61 73 20 6e 75 6c 6c  so, bind as null
11070 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
11080 28 6e 4e 75 6c 6c 3e 30 20 26 26 20 73 74 72 63  (nNull>0 && strc
11090 6d 70 28 61 7a 43 6f 6c 5b 69 5d 2c 20 7a 4e 75  mp(azCol[i], zNu
110a0 6c 6c 29 3d 3d 30 29 0a 20 20 20 20 20 20 20 20  ll)==0).        
110b0 20 20 7c 7c 20 73 74 72 6c 65 6e 33 30 28 61 7a    || strlen30(az
110c0 43 6f 6c 5b 69 5d 29 3d 3d 30 20 0a 20 20 20 20  Col[i])==0 .    
110d0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
110e0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75   sqlite3_bind_nu
110f0 6c 6c 28 70 53 74 6d 74 2c 20 69 2b 31 29 3b 0a  ll(pStmt, i+1);.
11100 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
11110 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
11120 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74  _bind_text(pStmt
11130 2c 20 69 2b 31 2c 20 61 7a 43 6f 6c 5b 69 5d 2c  , i+1, azCol[i],
11140 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54   -1, SQLITE_STAT
11150 49 43 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  IC);.        }. 
11160 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
11170 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
11180 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
11190 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74  ite3_reset(pStmt
111a0 29 3b 0a 20 20 20 20 20 20 66 72 65 65 28 7a 4c  );.      free(zL
111b0 69 6e 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ine);.      if( 
111c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
111d0 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70  .        Tcl_App
111e0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
111f0 2c 22 45 72 72 6f 72 3a 20 22 2c 20 73 71 6c 69  ,"Error: ", sqli
11200 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e  te3_errmsg(pDb->
11210 64 62 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  db), (char*)0);.
11220 20 20 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20          zCommit 
11230 3d 20 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20  = "ROLLBACK";.  
11240 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11250 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66     }.    }.    f
11260 72 65 65 28 61 7a 43 6f 6c 29 3b 0a 20 20 20 20  ree(azCol);.    
11270 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20  fclose(in);.    
11280 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
11290 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 28 76 6f  (pStmt);.    (vo
112a0 69 64 29 73 71 6c 69 74 65 33 5f 65 78 65 63 28  id)sqlite3_exec(
112b0 70 44 62 2d 3e 64 62 2c 20 7a 43 6f 6d 6d 69 74  pDb->db, zCommit
112c0 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20  , 0, 0, 0);..   
112d0 20 69 66 28 20 7a 43 6f 6d 6d 69 74 5b 30 5d 20   if( zCommit[0] 
112e0 3d 3d 20 27 43 27 20 29 7b 0a 20 20 20 20 20 20  == 'C' ){.      
112f0 2f 2a 20 73 75 63 63 65 73 73 2c 20 73 65 74 20  /* success, set 
11300 72 65 73 75 6c 74 20 61 73 20 6e 75 6d 62 65 72  result as number
11310 20 6f 66 20 6c 69 6e 65 73 20 70 72 6f 63 65 73   of lines proces
11320 73 65 64 20 2a 2f 0a 20 20 20 20 20 20 70 52 65  sed */.      pRe
11330 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62  sult = Tcl_GetOb
11340 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  jResult(interp);
11350 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 49 6e  .      Tcl_SetIn
11360 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 6c 69  tObj(pResult, li
11370 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63 20  neno);.      rc 
11380 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 65  = TCL_OK;.    }e
11390 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 66 61  lse{.      /* fa
113a0 69 6c 75 72 65 2c 20 61 70 70 65 6e 64 20 6c 69  ilure, append li
113b0 6e 65 6e 6f 20 77 68 65 72 65 20 66 61 69 6c 65  neno where faile
113c0 64 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  d */.      sqlit
113d0 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
113e0 6f 66 28 7a 4c 69 6e 65 4e 75 6d 29 2c 20 7a 4c  of(zLineNum), zL
113f0 69 6e 65 4e 75 6d 2c 22 25 64 22 2c 6c 69 6e 65  ineNum,"%d",line
11400 6e 6f 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 41  no);.      Tcl_A
11410 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
11420 72 70 2c 22 2c 20 66 61 69 6c 65 64 20 77 68 69  rp,", failed whi
11430 6c 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 69  le processing li
11440 6e 65 3a 20 22 2c 7a 4c 69 6e 65 4e 75 6d 2c 0a  ne: ",zLineNum,.
11450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11460 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 30 29         (char*)0)
11470 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c  ;.      rc = TCL
11480 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
11490 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
114a0 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 65  /*.  **    $db e
114b0 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e  nable_load_exten
114c0 73 69 6f 6e 20 42 4f 4f 4c 45 41 4e 0a 20 20 2a  sion BOOLEAN.  *
114d0 2a 0a 20 20 2a 2a 20 54 75 72 6e 20 74 68 65 20  *.  ** Turn the 
114e0 65 78 74 65 6e 73 69 6f 6e 20 6c 6f 61 64 69 6e  extension loadin
114f0 67 20 66 65 61 74 75 72 65 20 6f 6e 20 6f 72 20  g feature on or 
11500 6f 66 66 2e 20 20 49 74 20 69 66 20 6f 66 66 20  off.  It if off 
11510 62 79 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74 2e  by.  ** default.
11520 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
11530 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45  ENABLE_LOAD_EXTE
11540 4e 53 49 4f 4e 3a 20 7b 0a 23 69 66 6e 64 65 66  NSION: {.#ifndef
11550 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
11560 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20  D_EXTENSION.    
11570 69 6e 74 20 6f 6e 6f 66 66 3b 0a 20 20 20 20 69  int onoff;.    i
11580 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
11590 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
115a0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
115b0 6f 62 6a 76 2c 20 22 42 4f 4f 4c 45 41 4e 22 29  objv, "BOOLEAN")
115c0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
115d0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
115e0 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42      if( Tcl_GetB
115f0 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
11600 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
11610 6f 6e 6f 66 66 29 20 29 7b 0a 20 20 20 20 20 20  onoff) ){.      
11620 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
11630 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
11640 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f  te3_enable_load_
11650 65 78 74 65 6e 73 69 6f 6e 28 70 44 62 2d 3e 64  extension(pDb->d
11660 62 2c 20 6f 6e 6f 66 66 29 3b 0a 20 20 20 20 62  b, onoff);.    b
11670 72 65 61 6b 3b 0a 23 65 6c 73 65 0a 20 20 20 20  reak;.#else.    
11680 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
11690 28 69 6e 74 65 72 70 2c 20 22 65 78 74 65 6e 73  (interp, "extens
116a0 69 6f 6e 20 6c 6f 61 64 69 6e 67 20 69 73 20 74  ion loading is t
116b0 75 72 6e 65 64 20 6f 66 66 20 61 74 20 63 6f 6d  urned off at com
116c0 70 69 6c 65 2d 74 69 6d 65 22 2c 0a 20 20 20 20  pile-time",.    
116d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
116e0 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
116f0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
11700 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  ;.#endif.  }..  
11710 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 65  /*.  **    $db e
11720 72 72 6f 72 63 6f 64 65 0a 20 20 2a 2a 0a 20 20  rrorcode.  **.  
11730 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
11740 6d 65 72 69 63 20 65 72 72 6f 72 20 63 6f 64 65  meric error code
11750 20 74 68 61 74 20 77 61 73 20 72 65 74 75 72 6e   that was return
11760 65 64 20 62 79 20 74 68 65 20 6d 6f 73 74 20 72  ed by the most r
11770 65 63 65 6e 74 0a 20 20 2a 2a 20 63 61 6c 6c 20  ecent.  ** call 
11780 74 6f 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  to sqlite3_exec(
11790 29 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  )..  */.  case D
117a0 42 5f 45 52 52 4f 52 43 4f 44 45 3a 20 7b 0a 20  B_ERRORCODE: {. 
117b0 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
117c0 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
117d0 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65  NewIntObj(sqlite
117e0 33 5f 65 72 72 63 6f 64 65 28 70 44 62 2d 3e 64  3_errcode(pDb->d
117f0 62 29 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  b)));.    break;
11800 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
11810 20 20 20 24 64 62 20 65 78 69 73 74 73 20 24 73     $db exists $s
11820 71 6c 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 6f  ql.  **    $db o
11830 6e 65 63 6f 6c 75 6d 6e 20 24 73 71 6c 0a 20 20  necolumn $sql.  
11840 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 65 63  **.  ** The onec
11850 6f 6c 75 6d 6e 20 6d 65 74 68 6f 64 20 69 73 20  olumn method is 
11860 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6f  the equivalent o
11870 66 3a 0a 20 20 2a 2a 20 20 20 20 20 6c 69 6e 64  f:.  **     lind
11880 65 78 20 5b 24 64 62 20 65 76 61 6c 20 24 73 71  ex [$db eval $sq
11890 6c 5d 20 30 0a 20 20 2a 2f 0a 20 20 63 61 73 65  l] 0.  */.  case
118a0 20 44 42 5f 45 58 49 53 54 53 3a 20 0a 20 20 63   DB_EXISTS: .  c
118b0 61 73 65 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e  ase DB_ONECOLUMN
118c0 3a 20 7b 0a 20 20 20 20 44 62 45 76 61 6c 43 6f  : {.    DbEvalCo
118d0 6e 74 65 78 74 20 73 45 76 61 6c 3b 0a 20 20 20  ntext sEval;.   
118e0 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
118f0 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
11900 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
11910 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 22 29 3b 0a  , objv, "SQL");.
11920 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
11930 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
11940 20 20 20 64 62 45 76 61 6c 49 6e 69 74 28 26 73     dbEvalInit(&s
11950 45 76 61 6c 2c 20 70 44 62 2c 20 6f 62 6a 76 5b  Eval, pDb, objv[
11960 32 5d 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d  2], 0);.    rc =
11970 20 64 62 45 76 61 6c 53 74 65 70 28 26 73 45 76   dbEvalStep(&sEv
11980 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 63 68 6f  al);.    if( cho
11990 69 63 65 3d 3d 44 42 5f 4f 4e 45 43 4f 4c 55 4d  ice==DB_ONECOLUM
119a0 4e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72  N ){.      if( r
119b0 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20  c==TCL_OK ){.   
119c0 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52       Tcl_SetObjR
119d0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 64 62  esult(interp, db
119e0 45 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65 28  EvalColumnValue(
119f0 26 73 45 76 61 6c 2c 20 30 29 29 3b 0a 20 20 20  &sEval, 0));.   
11a00 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d     }else if( rc=
11a10 3d 54 43 4c 5f 42 52 45 41 4b 20 29 7b 0a 20 20  =TCL_BREAK ){.  
11a20 20 20 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52        Tcl_ResetR
11a30 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
11a40 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
11a50 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 42 52 45   if( rc==TCL_BRE
11a60 41 4b 20 7c 7c 20 72 63 3d 3d 54 43 4c 5f 4f 4b  AK || rc==TCL_OK
11a70 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65   ){.      Tcl_Se
11a80 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
11a90 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61  p, Tcl_NewBoolea
11aa0 6e 4f 62 6a 28 72 63 3d 3d 54 43 4c 5f 4f 4b 29  nObj(rc==TCL_OK)
11ab0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 45  );.    }.    dbE
11ac0 76 61 6c 46 69 6e 61 6c 69 7a 65 28 26 73 45 76  valFinalize(&sEv
11ad0 61 6c 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63  al);..    if( rc
11ae0 3d 3d 54 43 4c 5f 42 52 45 41 4b 20 29 7b 0a 20  ==TCL_BREAK ){. 
11af0 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b       rc = TCL_OK
11b00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  ;.    }.    brea
11b10 6b 3b 0a 20 20 7d 0a 20 20 20 0a 20 20 2f 2a 0a  k;.  }.   .  /*.
11b20 20 20 2a 2a 20 20 20 20 24 64 62 20 65 76 61 6c    **    $db eval
11b30 20 24 73 71 6c 20 3f 61 72 72 61 79 3f 20 3f 7b   $sql ?array? ?{
11b40 20 20 2e 2e 2e 63 6f 64 65 2e 2e 2e 20 7d 3f 0a    ...code... }?.
11b50 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 53 51    **.  ** The SQ
11b60 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 24  L statement in $
11b70 73 71 6c 20 69 73 20 65 76 61 6c 75 61 74 65 64  sql is evaluated
11b80 2e 20 20 46 6f 72 20 65 61 63 68 20 72 6f 77 2c  .  For each row,
11b90 20 74 68 65 20 76 61 6c 75 65 73 20 61 72 65 0a   the values are.
11ba0 20 20 2a 2a 20 70 6c 61 63 65 64 20 69 6e 20 65    ** placed in e
11bb0 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 61  lements of the a
11bc0 72 72 61 79 20 6e 61 6d 65 64 20 22 61 72 72 61  rray named "arra
11bd0 79 22 20 61 6e 64 20 2e 2e 2e 63 6f 64 65 2e 2e  y" and ...code..
11be0 2e 20 69 73 20 65 78 65 63 75 74 65 64 2e 0a 20  . is executed.. 
11bf0 20 2a 2a 20 49 66 20 22 61 72 72 61 79 22 20 61   ** If "array" a
11c00 6e 64 20 22 63 6f 64 65 22 20 61 72 65 20 6f 6d  nd "code" are om
11c10 69 74 74 65 64 2c 20 74 68 65 6e 20 6e 6f 20 63  itted, then no c
11c20 61 6c 6c 62 61 63 6b 20 69 73 20 65 76 65 72 79  allback is every
11c30 20 69 6e 76 6f 6b 65 64 2e 0a 20 20 2a 2a 20 49   invoked..  ** I
11c40 66 20 22 61 72 72 61 79 22 20 69 73 20 61 6e 20  f "array" is an 
11c50 65 6d 70 74 79 20 73 74 72 69 6e 67 2c 20 74 68  empty string, th
11c60 65 6e 20 74 68 65 20 76 61 6c 75 65 73 20 61 72  en the values ar
11c70 65 20 70 6c 61 63 65 64 20 69 6e 20 76 61 72 69  e placed in vari
11c80 61 62 6c 65 73 0a 20 20 2a 2a 20 74 68 61 74 20  ables.  ** that 
11c90 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 61  have the same na
11ca0 6d 65 20 61 73 20 74 68 65 20 66 69 65 6c 64 73  me as the fields
11cb0 20 65 78 74 72 61 63 74 65 64 20 62 79 20 74 68   extracted by th
11cc0 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  e query..  */.  
11cd0 63 61 73 65 20 44 42 5f 45 56 41 4c 3a 20 7b 0a  case DB_EVAL: {.
11ce0 20 20 20 20 69 66 28 20 6f 62 6a 63 3c 33 20 7c      if( objc<3 |
11cf0 7c 20 6f 62 6a 63 3e 35 20 29 7b 0a 20 20 20 20  | objc>5 ){.    
11d00 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
11d10 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
11d20 6a 76 2c 20 22 53 51 4c 20 3f 41 52 52 41 59 2d  jv, "SQL ?ARRAY-
11d30 4e 41 4d 45 3f 20 3f 53 43 52 49 50 54 3f 22 29  NAME? ?SCRIPT?")
11d40 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
11d50 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
11d60 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33  .    if( objc==3
11d70 20 29 7b 0a 20 20 20 20 20 20 44 62 45 76 61 6c   ){.      DbEval
11d80 43 6f 6e 74 65 78 74 20 73 45 76 61 6c 3b 0a 20  Context sEval;. 
11d90 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52       Tcl_Obj *pR
11da0 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28  et = Tcl_NewObj(
11db0 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 63  );.      Tcl_Inc
11dc0 72 52 65 66 43 6f 75 6e 74 28 70 52 65 74 29 3b  rRefCount(pRet);
11dd0 0a 20 20 20 20 20 20 64 62 45 76 61 6c 49 6e 69  .      dbEvalIni
11de0 74 28 26 73 45 76 61 6c 2c 20 70 44 62 2c 20 6f  t(&sEval, pDb, o
11df0 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20  bjv[2], 0);.    
11e00 20 20 77 68 69 6c 65 28 20 54 43 4c 5f 4f 4b 3d    while( TCL_OK=
11e10 3d 28 72 63 20 3d 20 64 62 45 76 61 6c 53 74 65  =(rc = dbEvalSte
11e20 70 28 26 73 45 76 61 6c 29 29 20 29 7b 0a 20 20  p(&sEval)) ){.  
11e30 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
11e40 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20       int nCol;. 
11e50 20 20 20 20 20 20 20 64 62 45 76 61 6c 52 6f 77         dbEvalRow
11e60 49 6e 66 6f 28 26 73 45 76 61 6c 2c 20 26 6e 43  Info(&sEval, &nC
11e70 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ol, 0);.        
11e80 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
11e90 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
11ea0 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
11eb0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
11ec0 2c 20 70 52 65 74 2c 20 64 62 45 76 61 6c 43 6f  , pRet, dbEvalCo
11ed0 6c 75 6d 6e 56 61 6c 75 65 28 26 73 45 76 61 6c  lumnValue(&sEval
11ee0 2c 20 69 29 29 3b 0a 20 20 20 20 20 20 20 20 7d  , i));.        }
11ef0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64  .      }.      d
11f00 62 45 76 61 6c 46 69 6e 61 6c 69 7a 65 28 26 73  bEvalFinalize(&s
11f10 45 76 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  Eval);.      if(
11f20 20 72 63 3d 3d 54 43 4c 5f 42 52 45 41 4b 20 29   rc==TCL_BREAK )
11f30 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65  {.        Tcl_Se
11f40 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
11f50 70 2c 20 70 52 65 74 29 3b 0a 20 20 20 20 20 20  p, pRet);.      
11f60 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20    rc = TCL_OK;. 
11f70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 63 6c       }.      Tcl
11f80 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 52  _DecrRefCount(pR
11f90 65 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  et);.    }else{.
11fa0 20 20 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61        ClientData
11fb0 20 63 64 32 5b 32 5d 3b 0a 20 20 20 20 20 20 44   cd2[2];.      D
11fc0 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 70 3b  bEvalContext *p;
11fd0 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  .      Tcl_Obj *
11fe0 70 41 72 72 61 79 20 3d 20 30 3b 0a 20 20 20 20  pArray = 0;.    
11ff0 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69    Tcl_Obj *pScri
12000 70 74 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6f  pt;..      if( o
12010 62 6a 63 3d 3d 35 20 26 26 20 2a 28 63 68 61 72  bjc==5 && *(char
12020 20 2a 29 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   *)Tcl_GetString
12030 28 6f 62 6a 76 5b 33 5d 29 20 29 7b 0a 20 20 20  (objv[3]) ){.   
12040 20 20 20 20 20 70 41 72 72 61 79 20 3d 20 6f 62       pArray = ob
12050 6a 76 5b 33 5d 3b 0a 20 20 20 20 20 20 7d 0a 20  jv[3];.      }. 
12060 20 20 20 20 20 70 53 63 72 69 70 74 20 3d 20 6f       pScript = o
12070 62 6a 76 5b 6f 62 6a 63 2d 31 5d 3b 0a 20 20 20  bjv[objc-1];.   
12080 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
12090 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 20 20  unt(pScript);.  
120a0 20 20 20 20 0a 20 20 20 20 20 20 70 20 3d 20 28      .      p = (
120b0 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 29  DbEvalContext *)
120c0 54 63 6c 5f 41 6c 6c 6f 63 28 73 69 7a 65 6f 66  Tcl_Alloc(sizeof
120d0 28 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 29 29  (DbEvalContext))
120e0 3b 0a 20 20 20 20 20 20 64 62 45 76 61 6c 49 6e  ;.      dbEvalIn
120f0 69 74 28 70 2c 20 70 44 62 2c 20 6f 62 6a 76 5b  it(p, pDb, objv[
12100 32 5d 2c 20 70 41 72 72 61 79 29 3b 0a 0a 20 20  2], pArray);..  
12110 20 20 20 20 63 64 32 5b 30 5d 20 3d 20 28 76 6f      cd2[0] = (vo
12120 69 64 20 2a 29 70 3b 0a 20 20 20 20 20 20 63 64  id *)p;.      cd
12130 32 5b 31 5d 20 3d 20 28 76 6f 69 64 20 2a 29 70  2[1] = (void *)p
12140 53 63 72 69 70 74 3b 0a 20 20 20 20 20 20 72 63  Script;.      rc
12150 20 3d 20 44 62 45 76 61 6c 4e 65 78 74 43 6d 64   = DbEvalNextCmd
12160 28 63 64 32 2c 20 69 6e 74 65 72 70 2c 20 54 43  (cd2, interp, TC
12170 4c 5f 4f 4b 29 3b 0a 20 20 20 20 7d 0a 20 20 20  L_OK);.    }.   
12180 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
12190 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 66  *.  **     $db f
121a0 75 6e 63 74 69 6f 6e 20 4e 41 4d 45 20 5b 2d 61  unction NAME [-a
121b0 72 67 63 6f 75 6e 74 20 4e 5d 20 5b 2d 64 65 74  rgcount N] [-det
121c0 65 72 6d 69 6e 69 73 74 69 63 5d 20 53 43 52 49  erministic] SCRI
121d0 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 72 65  PT.  **.  ** Cre
121e0 61 74 65 20 61 20 6e 65 77 20 53 51 4c 20 66 75  ate a new SQL fu
121f0 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41  nction called NA
12200 4d 45 2e 20 20 57 68 65 6e 65 76 65 72 20 74 68  ME.  Whenever th
12210 61 74 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 20  at function is. 
12220 20 2a 2a 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f   ** called, invo
12230 6b 65 20 53 43 52 49 50 54 20 74 6f 20 65 76 61  ke SCRIPT to eva
12240 6c 75 61 74 65 20 74 68 65 20 66 75 6e 63 74 69  luate the functi
12250 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  on..  */.  case 
12260 44 42 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  DB_FUNCTION: {. 
12270 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 53     int flags = S
12280 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20  QLITE_UTF8;.    
12290 53 71 6c 46 75 6e 63 20 2a 70 46 75 6e 63 3b 0a  SqlFunc *pFunc;.
122a0 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63      Tcl_Obj *pSc
122b0 72 69 70 74 3b 0a 20 20 20 20 63 68 61 72 20 2a  ript;.    char *
122c0 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20 6e  zName;.    int n
122d0 41 72 67 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e  Arg = -1;.    in
122e0 74 20 69 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a  t i;.    if( obj
122f0 63 3c 34 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  c<4 ){.      Tcl
12300 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
12310 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
12320 4e 41 4d 45 20 3f 53 57 49 54 43 48 45 53 3f 20  NAME ?SWITCHES? 
12330 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20  SCRIPT");.      
12340 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
12350 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
12360 69 3d 33 3b 20 69 3c 28 6f 62 6a 63 2d 31 29 3b  i=3; i<(objc-1);
12370 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e   i++){.      con
12380 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 54 63 6c  st char *z = Tcl
12390 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
123a0 69 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  i]);.      int n
123b0 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 29 3b 0a   = strlen30(z);.
123c0 20 20 20 20 20 20 69 66 28 20 6e 3e 32 20 26 26        if( n>2 &&
123d0 20 73 74 72 6e 63 6d 70 28 7a 2c 20 22 2d 61 72   strncmp(z, "-ar
123e0 67 63 6f 75 6e 74 22 2c 6e 29 3d 3d 30 20 29 7b  gcount",n)==0 ){
123f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d  .        if( i==
12400 28 6f 62 6a 63 2d 32 29 20 29 7b 0a 20 20 20 20  (objc-2) ){.    
12410 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
12420 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
12430 6f 70 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20  option requires 
12440 61 6e 20 61 72 67 75 6d 65 6e 74 3a 20 22 2c 20  an argument: ", 
12450 7a 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  z, 0);.         
12460 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
12470 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  R;.        }.   
12480 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74       if( Tcl_Get
12490 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
124a0 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 6e  p, objv[i+1], &n
124b0 41 72 67 29 20 29 20 72 65 74 75 72 6e 20 54 43  Arg) ) return TC
124c0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  L_ERROR;.       
124d0 20 69 66 28 20 6e 41 72 67 3c 30 20 29 7b 0a 20   if( nArg<0 ){. 
124e0 20 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70           Tcl_App
124f0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
12500 2c 20 22 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  , "number of arg
12510 75 6d 65 6e 74 73 20 6d 75 73 74 20 62 65 20 6e  uments must be n
12520 6f 6e 2d 6e 65 67 61 74 69 76 65 22 2c 0a 20 20  on-negative",.  
12530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12540 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
12550 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  0);.          re
12560 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
12570 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12580 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c    i++;.      }el
12590 73 65 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 32  se.      if( n>2
125a0 20 26 26 20 73 74 72 6e 63 6d 70 28 7a 2c 20 22   && strncmp(z, "
125b0 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63 22 2c  -deterministic",
125c0 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  n)==0 ){.       
125d0 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45   flags |= SQLITE
125e0 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 3b 0a  _DETERMINISTIC;.
125f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
12600 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
12610 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62  esult(interp, "b
12620 61 64 20 6f 70 74 69 6f 6e 20 5c 22 22 2c 20 7a  ad option \"", z
12630 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  , .            "
12640 5c 22 3a 20 6d 75 73 74 20 62 65 20 2d 61 72 67  \": must be -arg
12650 63 6f 75 6e 74 20 6f 72 20 2d 64 65 74 65 72 6d  count or -determ
12660 69 6e 69 73 74 69 63 22 2c 20 30 0a 20 20 20 20  inistic", 0.    
12670 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 72      );.        r
12680 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
12690 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
126a0 20 20 20 20 70 53 63 72 69 70 74 20 3d 20 6f 62      pScript = ob
126b0 6a 76 5b 6f 62 6a 63 2d 31 5d 3b 0a 20 20 20 20  jv[objc-1];.    
126c0 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53  zName = Tcl_GetS
126d0 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
126e0 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20 70 46  v[2], 0);.    pF
126f0 75 6e 63 20 3d 20 66 69 6e 64 53 71 6c 46 75 6e  unc = findSqlFun
12700 63 28 70 44 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  c(pDb, zName);. 
12710 20 20 20 69 66 28 20 70 46 75 6e 63 3d 3d 30 20     if( pFunc==0 
12720 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
12730 4f 52 3b 0a 20 20 20 20 69 66 28 20 70 46 75 6e  OR;.    if( pFun
12740 63 2d 3e 70 53 63 72 69 70 74 20 29 7b 0a 20 20  c->pScript ){.  
12750 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
12760 6f 75 6e 74 28 70 46 75 6e 63 2d 3e 70 53 63 72  ount(pFunc->pScr
12770 69 70 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ipt);.    }.    
12780 70 46 75 6e 63 2d 3e 70 53 63 72 69 70 74 20 3d  pFunc->pScript =
12790 20 70 53 63 72 69 70 74 3b 0a 20 20 20 20 54 63   pScript;.    Tc
127a0 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
127b0 53 63 72 69 70 74 29 3b 0a 20 20 20 20 70 46 75  Script);.    pFu
127c0 6e 63 2d 3e 75 73 65 45 76 61 6c 4f 62 6a 76 20  nc->useEvalObjv 
127d0 3d 20 73 61 66 65 54 6f 55 73 65 45 76 61 6c 4f  = safeToUseEvalO
127e0 62 6a 76 28 69 6e 74 65 72 70 2c 20 70 53 63 72  bjv(interp, pScr
127f0 69 70 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  ipt);.    rc = s
12800 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
12810 6e 63 74 69 6f 6e 28 70 44 62 2d 3e 64 62 2c 20  nction(pDb->db, 
12820 7a 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 66 6c 61  zName, nArg, fla
12830 67 73 2c 0a 20 20 20 20 20 20 20 20 70 46 75 6e  gs,.        pFun
12840 63 2c 20 74 63 6c 53 71 6c 46 75 6e 63 2c 20 30  c, tclSqlFunc, 0
12850 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
12860 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
12870 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52       rc = TCL_ER
12880 52 4f 52 3b 0a 20 20 20 20 20 20 54 63 6c 5f 53  ROR;.      Tcl_S
12890 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
128a0 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
128b0 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29  _errmsg(pDb->db)
128c0 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b  , TCL_VOLATILE);
128d0 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
128e0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
128f0 20 20 20 20 20 24 64 62 20 69 6e 63 72 62 6c 6f       $db incrblo
12900 62 20 3f 2d 72 65 61 64 6f 6e 6c 79 3f 20 3f 44  b ?-readonly? ?D
12910 42 3f 20 54 41 42 4c 45 20 43 4f 4c 55 4d 4e 20  B? TABLE COLUMN 
12920 52 4f 57 49 44 0a 20 20 2a 2f 0a 20 20 63 61 73  ROWID.  */.  cas
12930 65 20 44 42 5f 49 4e 43 52 42 4c 4f 42 3a 20 7b  e DB_INCRBLOB: {
12940 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
12950 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20  MIT_INCRBLOB.   
12960 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
12970 74 28 69 6e 74 65 72 70 2c 20 22 69 6e 63 72 62  t(interp, "incrb
12980 6c 6f 62 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  lob not availabl
12990 65 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64 22  e in this build"
129a0 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
129b0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
129c0 52 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69 6e 74  R;.#else.    int
129d0 20 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20 30 3b   isReadonly = 0;
129e0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
129f0 2a 7a 44 62 20 3d 20 22 6d 61 69 6e 22 3b 0a 20  *zDb = "main";. 
12a00 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
12a10 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74  Table;.    const
12a20 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 3b 0a   char *zColumn;.
12a30 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20      Tcl_WideInt 
12a40 69 52 6f 77 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  iRow;..    /* Ch
12a50 65 63 6b 20 66 6f 72 20 74 68 65 20 2d 72 65 61  eck for the -rea
12a60 64 6f 6e 6c 79 20 6f 70 74 69 6f 6e 20 2a 2f 0a  donly option */.
12a70 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 26      if( objc>3 &
12a80 26 20 73 74 72 63 6d 70 28 54 63 6c 5f 47 65 74  & strcmp(Tcl_Get
12a90 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c  String(objv[2]),
12aa0 20 22 2d 72 65 61 64 6f 6e 6c 79 22 29 3d 3d 30   "-readonly")==0
12ab0 20 29 7b 0a 20 20 20 20 20 20 69 73 52 65 61 64   ){.      isRead
12ac0 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  only = 1;.    }.
12ad0 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 28  .    if( objc!=(
12ae0 35 2b 69 73 52 65 61 64 6f 6e 6c 79 29 20 26 26  5+isReadonly) &&
12af0 20 6f 62 6a 63 21 3d 28 36 2b 69 73 52 65 61 64   objc!=(6+isRead
12b00 6f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 54  only) ){.      T
12b10 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
12b20 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
12b30 20 22 3f 2d 72 65 61 64 6f 6e 6c 79 3f 20 3f 44   "?-readonly? ?D
12b40 42 3f 20 54 41 42 4c 45 20 43 4f 4c 55 4d 4e 20  B? TABLE COLUMN 
12b50 52 4f 57 49 44 22 29 3b 0a 20 20 20 20 20 20 72  ROWID");.      r
12b60 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
12b70 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
12b80 6f 62 6a 63 3d 3d 28 36 2b 69 73 52 65 61 64 6f  objc==(6+isReado
12b90 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 7a 44  nly) ){.      zD
12ba0 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  b = Tcl_GetStrin
12bb0 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20  g(objv[2]);.    
12bc0 7d 0a 20 20 20 20 7a 54 61 62 6c 65 20 3d 20 54  }.    zTable = T
12bd0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
12be0 76 5b 6f 62 6a 63 2d 33 5d 29 3b 0a 20 20 20 20  v[objc-3]);.    
12bf0 7a 43 6f 6c 75 6d 6e 20 3d 20 54 63 6c 5f 47 65  zColumn = Tcl_Ge
12c00 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 6f 62 6a  tString(objv[obj
12c10 63 2d 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20  c-2]);.    rc = 
12c20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72  Tcl_GetWideIntFr
12c30 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
12c40 6a 76 5b 6f 62 6a 63 2d 31 5d 2c 20 26 69 52 6f  jv[objc-1], &iRo
12c50 77 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d  w);..    if( rc=
12c60 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  =TCL_OK ){.     
12c70 20 72 63 20 3d 20 63 72 65 61 74 65 49 6e 63 72   rc = createIncr
12c80 62 6c 6f 62 43 68 61 6e 6e 65 6c 28 0a 20 20 20  blobChannel(.   
12c90 20 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20 70         interp, p
12ca0 44 62 2c 20 7a 44 62 2c 20 7a 54 61 62 6c 65 2c  Db, zDb, zTable,
12cb0 20 7a 43 6f 6c 75 6d 6e 2c 20 28 73 71 6c 69 74   zColumn, (sqlit
12cc0 65 33 5f 69 6e 74 36 34 29 69 52 6f 77 2c 20 69  e3_int64)iRow, i
12cd0 73 52 65 61 64 6f 6e 6c 79 0a 20 20 20 20 20 20  sReadonly.      
12ce0 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
12cf0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
12d00 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64    /*.  **     $d
12d10 62 20 69 6e 74 65 72 72 75 70 74 0a 20 20 2a 2a  b interrupt.  **
12d20 0a 20 20 2a 2a 20 49 6e 74 65 72 72 75 70 74 20  .  ** Interrupt 
12d30 74 68 65 20 65 78 65 63 75 74 69 6f 6e 20 6f 66  the execution of
12d40 20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74 20   the inner-most 
12d50 53 51 4c 20 69 6e 74 65 72 70 72 65 74 65 72 2e  SQL interpreter.
12d60 20 20 54 68 69 73 0a 20 20 2a 2a 20 63 61 75 73    This.  ** caus
12d70 65 73 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  es the SQL state
12d80 6d 65 6e 74 20 74 6f 20 72 65 74 75 72 6e 20 61  ment to return a
12d90 6e 20 65 72 72 6f 72 20 6f 66 20 53 51 4c 49 54  n error of SQLIT
12da0 45 5f 49 4e 54 45 52 52 55 50 54 2e 0a 20 20 2a  E_INTERRUPT..  *
12db0 2f 0a 20 20 63 61 73 65 20 44 42 5f 49 4e 54 45  /.  case DB_INTE
12dc0 52 52 55 50 54 3a 20 7b 0a 20 20 20 20 73 71 6c  RRUPT: {.    sql
12dd0 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28 70  ite3_interrupt(p
12de0 44 62 2d 3e 64 62 29 3b 0a 20 20 20 20 62 72 65  Db->db);.    bre
12df0 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
12e00 2a 2a 20 20 20 20 20 24 64 62 20 6e 75 6c 6c 76  **     $db nullv
12e10 61 6c 75 65 20 3f 53 54 52 49 4e 47 3f 0a 20 20  alue ?STRING?.  
12e20 2a 2a 0a 20 20 2a 2a 20 43 68 61 6e 67 65 20 74  **.  ** Change t
12e30 65 78 74 20 75 73 65 64 20 77 68 65 6e 20 61 20  ext used when a 
12e40 4e 55 4c 4c 20 63 6f 6d 65 73 20 62 61 63 6b 20  NULL comes back 
12e50 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
12e60 65 2e 20 49 66 20 3f 53 54 52 49 4e 47 3f 0a 20  e. If ?STRING?. 
12e70 20 2a 2a 20 69 73 20 6e 6f 74 20 70 72 65 73 65   ** is not prese
12e80 6e 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  nt, then the cur
12e90 72 65 6e 74 20 73 74 72 69 6e 67 20 75 73 65 64  rent string used
12ea0 20 66 6f 72 20 4e 55 4c 4c 20 69 73 20 72 65 74   for NULL is ret
12eb0 75 72 6e 65 64 2e 0a 20 20 2a 2a 20 49 66 20 53  urned..  ** If S
12ec0 54 52 49 4e 47 20 69 73 20 70 72 65 73 65 6e 74  TRING is present
12ed0 2c 20 74 68 65 6e 20 53 54 52 49 4e 47 20 69 73  , then STRING is
12ee0 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2a 0a   returned..  **.
12ef0 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 4e    */.  case DB_N
12f00 55 4c 4c 56 41 4c 55 45 3a 20 7b 0a 20 20 20 20  ULLVALUE: {.    
12f10 69 66 28 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f  if( objc!=2 && o
12f20 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc!=3 ){.      
12f30 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
12f40 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
12f50 2c 20 22 4e 55 4c 4c 56 41 4c 55 45 22 29 3b 0a  , "NULLVALUE");.
12f60 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
12f70 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
12f80 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b    if( objc==3 ){
12f90 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a  .      int len;.
12fa0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 75 6c        char *zNul
12fb0 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  l = Tcl_GetStrin
12fc0 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
12fd0 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69  , &len);.      i
12fe0 66 28 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 29 7b  f( pDb->zNull ){
12ff0 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65  .        Tcl_Fre
13000 65 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20  e(pDb->zNull);. 
13010 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
13020 20 7a 4e 75 6c 6c 20 26 26 20 6c 65 6e 3e 30 20   zNull && len>0 
13030 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
13040 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f 41 6c 6c 6f  zNull = Tcl_Allo
13050 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20  c( len + 1 );.  
13060 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62        memcpy(pDb
13070 2d 3e 7a 4e 75 6c 6c 2c 20 7a 4e 75 6c 6c 2c 20  ->zNull, zNull, 
13080 6c 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 44  len);.        pD
13090 62 2d 3e 7a 4e 75 6c 6c 5b 6c 65 6e 5d 20 3d 20  b->zNull[len] = 
130a0 27 5c 30 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73  '\0';.      }els
130b0 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  e{.        pDb->
130c0 7a 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20  zNull = 0;.     
130d0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c   }.    }.    Tcl
130e0 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
130f0 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72  terp, Tcl_NewStr
13100 69 6e 67 4f 62 6a 28 70 44 62 2d 3e 7a 4e 75 6c  ingObj(pDb->zNul
13110 6c 2c 20 2d 31 29 29 3b 0a 20 20 20 20 62 72 65  l, -1));.    bre
13120 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
13130 2a 2a 20 20 20 20 20 24 64 62 20 6c 61 73 74 5f  **     $db last_
13140 69 6e 73 65 72 74 5f 72 6f 77 69 64 20 0a 20 20  insert_rowid .  
13150 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 61  **.  ** Return a
13160 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
13170 69 73 20 74 68 65 20 52 4f 57 49 44 20 66 6f 72  is the ROWID for
13180 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
13190 20 69 6e 73 65 72 74 2e 0a 20 20 2a 2f 0a 20 20   insert..  */.  
131a0 63 61 73 65 20 44 42 5f 4c 41 53 54 5f 49 4e 53  case DB_LAST_INS
131b0 45 52 54 5f 52 4f 57 49 44 3a 20 7b 0a 20 20 20  ERT_ROWID: {.   
131c0 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c   Tcl_Obj *pResul
131d0 74 3b 0a 20 20 20 20 54 63 6c 5f 57 69 64 65 49  t;.    Tcl_WideI
131e0 6e 74 20 72 6f 77 69 64 3b 0a 20 20 20 20 69 66  nt rowid;.    if
131f0 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
13200 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
13210 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
13220 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 20 20  bjv, "");.      
13230 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
13240 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 6f 77 69  ;.    }.    rowi
13250 64 20 3d 20 73 71 6c 69 74 65 33 5f 6c 61 73 74  d = sqlite3_last
13260 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 70 44  _insert_rowid(pD
13270 62 2d 3e 64 62 29 3b 0a 20 20 20 20 70 52 65 73  b->db);.    pRes
13280 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a  ult = Tcl_GetObj
13290 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
132a0 20 20 20 20 54 63 6c 5f 53 65 74 57 69 64 65 49      Tcl_SetWideI
132b0 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 72  ntObj(pResult, r
132c0 6f 77 69 64 29 3b 0a 20 20 20 20 62 72 65 61 6b  owid);.    break
132d0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
132e0 20 54 68 65 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d   The DB_ONECOLUM
132f0 4e 20 6d 65 74 68 6f 64 20 69 73 20 69 6d 70 6c  N method is impl
13300 65 6d 65 6e 74 65 64 20 74 6f 67 65 74 68 65 72  emented together
13310 20 77 69 74 68 20 44 42 5f 45 58 49 53 54 53 2e   with DB_EXISTS.
13320 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 20 20 20 24  .  */..  /*    $
13330 64 62 20 70 72 6f 67 72 65 73 73 20 3f 4e 20 43  db progress ?N C
13340 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 20 0a 20  ALLBACK?.  ** . 
13350 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67   ** Invoke the g
13360 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 65 76  iven callback ev
13370 65 72 79 20 4e 20 76 69 72 74 75 61 6c 20 6d 61  ery N virtual ma
13380 63 68 69 6e 65 20 6f 70 63 6f 64 65 73 20 77 68  chine opcodes wh
13390 69 6c 65 20 65 78 65 63 75 74 69 6e 67 0a 20 20  ile executing.  
133a0 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f  ** queries..  */
133b0 0a 20 20 63 61 73 65 20 44 42 5f 50 52 4f 47 52  .  case DB_PROGR
133c0 45 53 53 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f  ESS: {.    if( o
133d0 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  bjc==2 ){.      
133e0 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65  if( pDb->zProgre
133f0 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  ss ){.        Tc
13400 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
13410 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 50 72 6f  nterp, pDb->zPro
13420 67 72 65 73 73 2c 20 28 63 68 61 72 2a 29 30 29  gress, (char*)0)
13430 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
13440 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20  lse if( objc==4 
13450 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
13460 50 72 6f 67 72 65 73 73 3b 0a 20 20 20 20 20 20  Progress;.      
13470 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69  int len;.      i
13480 6e 74 20 4e 3b 0a 20 20 20 20 20 20 69 66 28 20  nt N;.      if( 
13490 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49  TCL_OK!=Tcl_GetI
134a0 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
134b0 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 4e 29 20 29  , objv[2], &N) )
134c0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
134d0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
134e0 20 20 7d 3b 0a 20 20 20 20 20 20 69 66 28 20 70    };.      if( p
134f0 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29 7b  Db->zProgress ){
13500 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65  .        Tcl_Fre
13510 65 28 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73  e(pDb->zProgress
13520 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
13530 20 7a 50 72 6f 67 72 65 73 73 20 3d 20 54 63 6c   zProgress = Tcl
13540 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
13550 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6c 65 6e 29  j(objv[3], &len)
13560 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 72 6f  ;.      if( zPro
13570 67 72 65 73 73 20 26 26 20 6c 65 6e 3e 30 20 29  gress && len>0 )
13580 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
13590 50 72 6f 67 72 65 73 73 20 3d 20 54 63 6c 5f 41  Progress = Tcl_A
135a0 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b  lloc( len + 1 );
135b0 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
135c0 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 2c 20  pDb->zProgress, 
135d0 7a 50 72 6f 67 72 65 73 73 2c 20 6c 65 6e 2b 31  zProgress, len+1
135e0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
135f0 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 50 72          pDb->zPr
13600 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20  ogress = 0;.    
13610 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
13620 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53  TE_OMIT_PROGRESS
13630 5f 43 41 4c 4c 42 41 43 4b 0a 20 20 20 20 20 20  _CALLBACK.      
13640 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65  if( pDb->zProgre
13650 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  ss ){.        pD
13660 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65  b->interp = inte
13670 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  rp;.        sqli
13680 74 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e  te3_progress_han
13690 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20 4e 2c  dler(pDb->db, N,
136a0 20 44 62 50 72 6f 67 72 65 73 73 48 61 6e 64 6c   DbProgressHandl
136b0 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20  er, pDb);.      
136c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
136d0 71 6c 69 74 65 33 5f 70 72 6f 67 72 65 73 73 5f  qlite3_progress_
136e0 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c  handler(pDb->db,
136f0 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
13700 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65   }.#endif.    }e
13710 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  lse{.      Tcl_W
13720 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
13730 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 20  rp, 2, objv, "N 
13740 43 41 4c 4c 42 41 43 4b 22 29 3b 0a 20 20 20 20  CALLBACK");.    
13750 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
13760 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72  OR;.    }.    br
13770 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
13780 20 20 24 64 62 20 70 72 6f 66 69 6c 65 20 3f 43    $db profile ?C
13790 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20  ALLBACK?.  **.  
137a0 2a 2a 20 4d 61 6b 65 20 61 72 72 61 6e 67 65 6d  ** Make arrangem
137b0 65 6e 74 73 20 74 6f 20 69 6e 76 6f 6b 65 20 74  ents to invoke t
137c0 68 65 20 43 41 4c 4c 42 41 43 4b 20 72 6f 75 74  he CALLBACK rout
137d0 69 6e 65 20 61 66 74 65 72 20 65 61 63 68 20 53  ine after each S
137e0 51 4c 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a  QL statement.  *
137f0 2a 20 74 68 61 74 20 68 61 73 20 72 75 6e 2e 20  * that has run. 
13800 20 54 68 65 20 74 65 78 74 20 6f 66 20 74 68 65   The text of the
13810 20 53 51 4c 20 61 6e 64 20 74 68 65 20 61 6d 6f   SQL and the amo
13820 75 6e 74 20 6f 66 20 65 6c 61 70 73 65 20 74 69  unt of elapse ti
13830 6d 65 20 61 72 65 0a 20 20 2a 2a 20 61 70 70 65  me are.  ** appe
13840 6e 64 65 64 20 74 6f 20 43 41 4c 4c 42 41 43 4b  nded to CALLBACK
13850 20 62 65 66 6f 72 65 20 74 68 65 20 73 63 72 69   before the scri
13860 70 74 20 69 73 20 72 75 6e 2e 0a 20 20 2a 2f 0a  pt is run..  */.
13870 20 20 63 61 73 65 20 44 42 5f 50 52 4f 46 49 4c    case DB_PROFIL
13880 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a  E: {.    if( obj
13890 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  c>3 ){.      Tcl
138a0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
138b0 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
138c0 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20  ?CALLBACK?");.  
138d0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
138e0 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20  RROR;.    }else 
138f0 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20  if( objc==2 ){. 
13900 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50       if( pDb->zP
13910 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  rofile ){.      
13920 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
13930 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e  lt(interp, pDb->
13940 7a 50 72 6f 66 69 6c 65 2c 20 28 63 68 61 72 2a  zProfile, (char*
13950 29 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  )0);.      }.   
13960 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
13970 61 72 20 2a 7a 50 72 6f 66 69 6c 65 3b 0a 20 20  ar *zProfile;.  
13980 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
13990 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f     if( pDb->zPro
139a0 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  file ){.        
139b0 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 50  Tcl_Free(pDb->zP
139c0 72 6f 66 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d  rofile);.      }
139d0 0a 20 20 20 20 20 20 7a 50 72 6f 66 69 6c 65 20  .      zProfile 
139e0 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
139f0 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
13a00 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  &len);.      if(
13a10 20 7a 50 72 6f 66 69 6c 65 20 26 26 20 6c 65 6e   zProfile && len
13a20 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  >0 ){.        pD
13a30 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 3d 20 54 63  b->zProfile = Tc
13a40 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31  l_Alloc( len + 1
13a50 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   );.        memc
13a60 70 79 28 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65  py(pDb->zProfile
13a70 2c 20 7a 50 72 6f 66 69 6c 65 2c 20 6c 65 6e 2b  , zProfile, len+
13a80 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
13a90 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 50  .        pDb->zP
13aa0 72 6f 66 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20  rofile = 0;.    
13ab0 20 20 7d 0a 23 69 66 20 21 64 65 66 69 6e 65 64    }.#if !defined
13ac0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41  (SQLITE_OMIT_TRA
13ad0 43 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  CE) && !defined(
13ae0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
13af0 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20  TING_POINT).    
13b00 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66    if( pDb->zProf
13b10 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ile ){.        p
13b20 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74  Db->interp = int
13b30 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  erp;.        sql
13b40 69 74 65 33 5f 70 72 6f 66 69 6c 65 28 70 44 62  ite3_profile(pDb
13b50 2d 3e 64 62 2c 20 44 62 50 72 6f 66 69 6c 65 48  ->db, DbProfileH
13b60 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20  andler, pDb);.  
13b70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13b80 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 66 69     sqlite3_profi
13b90 6c 65 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30  le(pDb->db, 0, 0
13ba0 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
13bb0 66 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  f.    }.    brea
13bc0 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
13bd0 2a 20 20 20 20 20 24 64 62 20 72 65 6b 65 79 20  *     $db rekey 
13be0 4b 45 59 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 68  KEY.  **.  ** Ch
13bf0 61 6e 67 65 20 74 68 65 20 65 6e 63 72 79 70 74  ange the encrypt
13c00 69 6f 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 63  ion key on the c
13c10 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20 64 61  urrently open da
13c20 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63  tabase..  */.  c
13c30 61 73 65 20 44 42 5f 52 45 4b 45 59 3a 20 7b 0a  ase DB_REKEY: {.
13c40 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
13c50 53 5f 43 4f 44 45 43 0a 20 20 20 20 69 6e 74 20  S_CODEC.    int 
13c60 6e 4b 65 79 3b 0a 20 20 20 20 76 6f 69 64 20 2a  nKey;.    void *
13c70 70 4b 65 79 3b 0a 23 65 6e 64 69 66 0a 20 20 20  pKey;.#endif.   
13c80 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
13c90 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
13ca0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
13cb0 2c 20 6f 62 6a 76 2c 20 22 4b 45 59 22 29 3b 0a  , objv, "KEY");.
13cc0 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
13cd0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 69  _ERROR;.    }.#i
13ce0 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
13cf0 43 4f 44 45 43 0a 20 20 20 20 70 4b 65 79 20 3d  CODEC.    pKey =
13d00 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61   Tcl_GetByteArra
13d10 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  yFromObj(objv[2]
13d20 2c 20 26 6e 4b 65 79 29 3b 0a 20 20 20 20 72 63  , &nKey);.    rc
13d30 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 6b 65 79   = sqlite3_rekey
13d40 28 70 44 62 2d 3e 64 62 2c 20 70 4b 65 79 2c 20  (pDb->db, pKey, 
13d50 6e 4b 65 79 29 3b 0a 20 20 20 20 69 66 28 20 72  nKey);.    if( r
13d60 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  c ){.      Tcl_A
13d70 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
13d80 72 70 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 73  rp, sqlite3_errs
13d90 74 72 28 72 63 29 2c 20 28 63 68 61 72 2a 29 30  tr(rc), (char*)0
13da0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43  );.      rc = TC
13db0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23  L_ERROR;.    }.#
13dc0 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b  endif.    break;
13dd0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64  .  }..  /*    $d
13de0 62 20 72 65 73 74 6f 72 65 20 3f 44 41 54 41 42  b restore ?DATAB
13df0 41 53 45 3f 20 46 49 4c 45 4e 41 4d 45 0a 20 20  ASE? FILENAME.  
13e00 2a 2a 0a 20 20 2a 2a 20 4f 70 65 6e 20 61 20 64  **.  ** Open a d
13e10 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d  atabase file nam
13e20 65 64 20 46 49 4c 45 4e 41 4d 45 2e 20 20 54 72  ed FILENAME.  Tr
13e30 61 6e 73 66 65 72 20 74 68 65 20 63 6f 6e 74 65  ansfer the conte
13e40 6e 74 20 0a 20 20 2a 2a 20 6f 66 20 46 49 4c 45  nt .  ** of FILE
13e50 4e 41 4d 45 20 69 6e 74 6f 20 74 68 65 20 6c 6f  NAME into the lo
13e60 63 61 6c 20 64 61 74 61 62 61 73 65 20 44 41 54  cal database DAT
13e70 41 42 41 53 45 20 28 64 65 66 61 75 6c 74 3a 20  ABASE (default: 
13e80 22 6d 61 69 6e 22 29 2e 0a 20 20 2a 2f 0a 20 20  "main")..  */.  
13e90 63 61 73 65 20 44 42 5f 52 45 53 54 4f 52 45 3a  case DB_RESTORE:
13ea0 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61   {.    const cha
13eb0 72 20 2a 7a 53 72 63 46 69 6c 65 3b 0a 20 20 20  r *zSrcFile;.   
13ec0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65   const char *zDe
13ed0 73 74 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65  stDb;.    sqlite
13ee0 33 20 2a 70 53 72 63 3b 0a 20 20 20 20 73 71 6c  3 *pSrc;.    sql
13ef0 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61  ite3_backup *pBa
13f00 63 6b 75 70 3b 0a 20 20 20 20 69 6e 74 20 6e 54  ckup;.    int nT
13f10 69 6d 65 6f 75 74 20 3d 20 30 3b 0a 0a 20 20 20  imeout = 0;..   
13f20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a   if( objc==3 ){.
13f30 20 20 20 20 20 20 7a 44 65 73 74 44 62 20 3d 20        zDestDb = 
13f40 22 6d 61 69 6e 22 3b 0a 20 20 20 20 20 20 7a 53  "main";.      zS
13f50 72 63 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74  rcFile = Tcl_Get
13f60 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
13f70 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
13f80 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20  bjc==4 ){.      
13f90 7a 44 65 73 74 44 62 20 3d 20 54 63 6c 5f 47 65  zDestDb = Tcl_Ge
13fa0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
13fb0 3b 0a 20 20 20 20 20 20 7a 53 72 63 46 69 6c 65  ;.      zSrcFile
13fc0 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
13fd0 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 20 20 7d  (objv[3]);.    }
13fe0 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f  else{.      Tcl_
13ff0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
14000 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f  erp, 2, objv, "?
14010 44 41 54 41 42 41 53 45 3f 20 46 49 4c 45 4e 41  DATABASE? FILENA
14020 4d 45 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ME");.      retu
14030 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
14040 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
14050 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 7a 53 72  ite3_open_v2(zSr
14060 63 46 69 6c 65 2c 20 26 70 53 72 63 2c 20 53 51  cFile, &pSrc, SQ
14070 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
14080 4c 59 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  LY, 0);.    if( 
14090 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
140a0 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
140b0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
140c0 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 73 6f 75  "cannot open sou
140d0 72 63 65 20 64 61 74 61 62 61 73 65 3a 20 22 2c  rce database: ",
140e0 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  .           sqli
140f0 74 65 33 5f 65 72 72 6d 73 67 28 70 53 72 63 29  te3_errmsg(pSrc)
14100 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
14110 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
14120 28 70 53 72 63 29 3b 0a 20 20 20 20 20 20 72 65  (pSrc);.      re
14130 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
14140 20 20 20 20 7d 0a 20 20 20 20 70 42 61 63 6b 75      }.    pBacku
14150 70 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  p = sqlite3_back
14160 75 70 5f 69 6e 69 74 28 70 44 62 2d 3e 64 62 2c  up_init(pDb->db,
14170 20 7a 44 65 73 74 44 62 2c 20 70 53 72 63 2c 20   zDestDb, pSrc, 
14180 22 6d 61 69 6e 22 29 3b 0a 20 20 20 20 69 66 28  "main");.    if(
14190 20 70 42 61 63 6b 75 70 3d 3d 30 20 29 7b 0a 20   pBackup==0 ){. 
141a0 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
141b0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 72  esult(interp, "r
141c0 65 73 74 6f 72 65 20 66 61 69 6c 65 64 3a 20 22  estore failed: "
141d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  ,.           sql
141e0 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d  ite3_errmsg(pDb-
141f0 3e 64 62 29 2c 20 28 63 68 61 72 2a 29 30 29 3b  >db), (char*)0);
14200 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63  .      sqlite3_c
14210 6c 6f 73 65 28 70 53 72 63 29 3b 0a 20 20 20 20  lose(pSrc);.    
14220 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
14230 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68  OR;.    }.    wh
14240 69 6c 65 28 20 28 72 63 20 3d 20 73 71 6c 69 74  ile( (rc = sqlit
14250 65 33 5f 62 61 63 6b 75 70 5f 73 74 65 70 28 70  e3_backup_step(p
14260 42 61 63 6b 75 70 2c 31 30 30 29 29 3d 3d 53 51  Backup,100))==SQ
14270 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20  LITE_OK.        
14280 20 20 20 20 20 20 7c 7c 20 72 63 3d 3d 53 51 4c        || rc==SQL
14290 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20  ITE_BUSY ){.    
142a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
142b0 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20  _BUSY ){.       
142c0 20 69 66 28 20 6e 54 69 6d 65 6f 75 74 2b 2b 20   if( nTimeout++ 
142d0 3e 3d 20 33 20 29 20 62 72 65 61 6b 3b 0a 20 20  >= 3 ) break;.  
142e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6c        sqlite3_sl
142f0 65 65 70 28 31 30 30 29 3b 0a 20 20 20 20 20 20  eep(100);.      
14300 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
14310 74 65 33 5f 62 61 63 6b 75 70 5f 66 69 6e 69 73  te3_backup_finis
14320 68 28 70 42 61 63 6b 75 70 29 3b 0a 20 20 20 20  h(pBackup);.    
14330 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
14340 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ONE ){.      rc 
14350 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 65  = TCL_OK;.    }e
14360 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  lse if( rc==SQLI
14370 54 45 5f 42 55 53 59 20 7c 7c 20 72 63 3d 3d 53  TE_BUSY || rc==S
14380 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 29 7b 0a  QLITE_LOCKED ){.
14390 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
143a0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
143b0 72 65 73 74 6f 72 65 20 66 61 69 6c 65 64 3a 20  restore failed: 
143c0 73 6f 75 72 63 65 20 64 61 74 61 62 61 73 65 20  source database 
143d0 62 75 73 79 22 2c 0a 20 20 20 20 20 20 20 20 20  busy",.         
143e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
143f0 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72  har*)0);.      r
14400 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  c = TCL_ERROR;. 
14410 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14420 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
14430 28 69 6e 74 65 72 70 2c 20 22 72 65 73 74 6f 72  (interp, "restor
14440 65 20 66 61 69 6c 65 64 3a 20 22 2c 0a 20 20 20  e failed: ",.   
14450 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
14460 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c  errmsg(pDb->db),
14470 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
14480 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52    rc = TCL_ERROR
14490 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
144a0 74 65 33 5f 63 6c 6f 73 65 28 70 53 72 63 29 3b  te3_close(pSrc);
144b0 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
144c0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24  .  /*.  **     $
144d0 64 62 20 73 74 61 74 75 73 20 28 73 74 65 70 7c  db status (step|
144e0 73 6f 72 74 7c 61 75 74 6f 69 6e 64 65 78 29 0a  sort|autoindex).
144f0 20 20 2a 2a 0a 20 20 2a 2a 20 44 69 73 70 6c 61    **.  ** Displa
14500 79 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  y SQLITE_STMTSTA
14510 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45  TUS_FULLSCAN_STE
14520 50 20 6f 72 20 0a 20 20 2a 2a 20 53 51 4c 49 54  P or .  ** SQLIT
14530 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 53 4f 52  E_STMTSTATUS_SOR
14540 54 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72  T for the most r
14550 65 63 65 6e 74 20 65 76 61 6c 2e 0a 20 20 2a 2f  ecent eval..  */
14560 0a 20 20 63 61 73 65 20 44 42 5f 53 54 41 54 55  .  case DB_STATU
14570 53 3a 20 7b 0a 20 20 20 20 69 6e 74 20 76 3b 0a  S: {.    int v;.
14580 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
14590 7a 4f 70 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a  zOp;.    if( obj
145a0 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=3 ){.      Tc
145b0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
145c0 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
145d0 22 28 73 74 65 70 7c 73 6f 72 74 7c 61 75 74 6f  "(step|sort|auto
145e0 69 6e 64 65 78 29 22 29 3b 0a 20 20 20 20 20 20  index)");.      
145f0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
14600 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4f 70 20  ;.    }.    zOp 
14610 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
14620 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 69 66  objv[2]);.    if
14630 28 20 73 74 72 63 6d 70 28 7a 4f 70 2c 20 22 73  ( strcmp(zOp, "s
14640 74 65 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  tep")==0 ){.    
14650 20 20 76 20 3d 20 70 44 62 2d 3e 6e 53 74 65 70    v = pDb->nStep
14660 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
14670 73 74 72 63 6d 70 28 7a 4f 70 2c 20 22 73 6f 72  strcmp(zOp, "sor
14680 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  t")==0 ){.      
14690 76 20 3d 20 70 44 62 2d 3e 6e 53 6f 72 74 3b 0a  v = pDb->nSort;.
146a0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
146b0 72 63 6d 70 28 7a 4f 70 2c 20 22 61 75 74 6f 69  rcmp(zOp, "autoi
146c0 6e 64 65 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ndex")==0 ){.   
146d0 20 20 20 76 20 3d 20 70 44 62 2d 3e 6e 49 6e 64     v = pDb->nInd
146e0 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ex;.    }else{. 
146f0 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
14700 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 0a 20  esult(interp, . 
14710 20 20 20 20 20 20 20 20 20 20 20 22 62 61 64 20             "bad 
14720 61 72 67 75 6d 65 6e 74 3a 20 73 68 6f 75 6c 64  argument: should
14730 20 62 65 20 61 75 74 6f 69 6e 64 65 78 2c 20 73   be autoindex, s
14740 74 65 70 2c 20 6f 72 20 73 6f 72 74 22 2c 20 0a  tep, or sort", .
14750 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
14760 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 65 74  r*)0);.      ret
14770 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
14780 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 53 65 74     }.    Tcl_Set
14790 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
147a0 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
147b0 76 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  v));.    break;.
147c0 20 20 7d 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a    }.  .  /*.  **
147d0 20 20 20 20 20 24 64 62 20 74 69 6d 65 6f 75 74       $db timeout
147e0 20 4d 49 4c 4c 45 53 45 43 4f 4e 44 53 0a 20 20   MILLESECONDS.  
147f0 2a 2a 0a 20 20 2a 2a 20 44 65 6c 61 79 20 66 6f  **.  ** Delay fo
14800 72 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  r the number of 
14810 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 70 65  milliseconds spe
14820 63 69 66 69 65 64 20 77 68 65 6e 20 61 20 66 69  cified when a fi
14830 6c 65 20 69 73 20 6c 6f 63 6b 65 64 2e 0a 20 20  le is locked..  
14840 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 54 49 4d  */.  case DB_TIM
14850 45 4f 55 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20  EOUT: {.    int 
14860 6d 73 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  ms;.    if( objc
14870 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=3 ){.      Tcl
14880 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
14890 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
148a0 4d 49 4c 4c 49 53 45 43 4f 4e 44 53 22 29 3b 0a  MILLISECONDS");.
148b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
148c0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
148d0 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
148e0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
148f0 6f 62 6a 76 5b 32 5d 2c 20 26 6d 73 29 20 29 20  objv[2], &ms) ) 
14900 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
14910 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75  ;.    sqlite3_bu
14920 73 79 5f 74 69 6d 65 6f 75 74 28 70 44 62 2d 3e  sy_timeout(pDb->
14930 64 62 2c 20 6d 73 29 3b 0a 20 20 20 20 62 72 65  db, ms);.    bre
14940 61 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 0a  ak;.  }.  .  /*.
14950 20 20 2a 2a 20 20 20 20 20 24 64 62 20 74 6f 74    **     $db tot
14960 61 6c 5f 63 68 61 6e 67 65 73 0a 20 20 2a 2a 0a  al_changes.  **.
14970 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20    ** Return the 
14980 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74  number of rows t
14990 68 61 74 20 77 65 72 65 20 6d 6f 64 69 66 69 65  hat were modifie
149a0 64 2c 20 69 6e 73 65 72 74 65 64 2c 20 6f 72 20  d, inserted, or 
149b0 64 65 6c 65 74 65 64 20 0a 20 20 2a 2a 20 73 69  deleted .  ** si
149c0 6e 63 65 20 74 68 65 20 64 61 74 61 62 61 73 65  nce the database
149d0 20 68 61 6e 64 6c 65 20 77 61 73 20 63 72 65 61   handle was crea
149e0 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ted..  */.  case
149f0 20 44 42 5f 54 4f 54 41 4c 5f 43 48 41 4e 47 45   DB_TOTAL_CHANGE
14a00 53 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  S: {.    Tcl_Obj
14a10 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20 20 69   *pResult;.    i
14a20 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
14a30 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
14a40 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
14a50 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 20  objv, "");.     
14a60 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
14a70 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 52 65  R;.    }.    pRe
14a80 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62  sult = Tcl_GetOb
14a90 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  jResult(interp);
14aa0 0a 20 20 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f  .    Tcl_SetIntO
14ab0 62 6a 28 70 52 65 73 75 6c 74 2c 20 73 71 6c 69  bj(pResult, sqli
14ac0 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65  te3_total_change
14ad0 73 28 70 44 62 2d 3e 64 62 29 29 3b 0a 20 20 20  s(pDb->db));.   
14ae0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
14af0 2a 20 20 20 20 24 64 62 20 74 72 61 63 65 20 3f  *    $db trace ?
14b00 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20  CALLBACK?.  **. 
14b10 20 2a 2a 20 4d 61 6b 65 20 61 72 72 61 6e 67 65   ** Make arrange
14b20 6d 65 6e 74 73 20 74 6f 20 69 6e 76 6f 6b 65 20  ments to invoke 
14b30 74 68 65 20 43 41 4c 4c 42 41 43 4b 20 72 6f 75  the CALLBACK rou
14b40 74 69 6e 65 20 66 6f 72 20 65 61 63 68 20 53 51  tine for each SQ
14b50 4c 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a  L statement.  **
14b60 20 74 68 61 74 20 69 73 20 65 78 65 63 75 74 65   that is execute
14b70 64 2e 20 20 54 68 65 20 74 65 78 74 20 6f 66 20  d.  The text of 
14b80 74 68 65 20 53 51 4c 20 69 73 20 61 70 70 65 6e  the SQL is appen
14b90 64 65 64 20 74 6f 20 43 41 4c 4c 42 41 43 4b 20  ded to CALLBACK 
14ba0 62 65 66 6f 72 65 0a 20 20 2a 2a 20 69 74 20 69  before.  ** it i
14bb0 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20 2a 2f  s executed..  */
14bc0 0a 20 20 63 61 73 65 20 44 42 5f 54 52 41 43 45  .  case DB_TRACE
14bd0 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  : {.    if( objc
14be0 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  >3 ){.      Tcl_
14bf0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
14c00 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f  erp, 2, objv, "?
14c10 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20  CALLBACK?");.   
14c20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
14c30 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ROR;.    }else i
14c40 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20  f( objc==2 ){.  
14c50 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72      if( pDb->zTr
14c60 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54  ace ){.        T
14c70 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
14c80 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 54 72  interp, pDb->zTr
14c90 61 63 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  ace, (char*)0);.
14ca0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
14cb0 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  e{.      char *z
14cc0 54 72 61 63 65 3b 0a 20 20 20 20 20 20 69 6e 74  Trace;.      int
14cd0 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20   len;.      if( 
14ce0 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20  pDb->zTrace ){. 
14cf0 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28         Tcl_Free(
14d00 70 44 62 2d 3e 7a 54 72 61 63 65 29 3b 0a 20 20  pDb->zTrace);.  
14d10 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54 72 61      }.      zTra
14d20 63 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  ce = Tcl_GetStri
14d30 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
14d40 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20  ], &len);.      
14d50 69 66 28 20 7a 54 72 61 63 65 20 26 26 20 6c 65  if( zTrace && le
14d60 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  n>0 ){.        p
14d70 44 62 2d 3e 7a 54 72 61 63 65 20 3d 20 54 63 6c  Db->zTrace = Tcl
14d80 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20  _Alloc( len + 1 
14d90 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  );.        memcp
14da0 79 28 70 44 62 2d 3e 7a 54 72 61 63 65 2c 20 7a  y(pDb->zTrace, z
14db0 54 72 61 63 65 2c 20 6c 65 6e 2b 31 29 3b 0a 20  Trace, len+1);. 
14dc0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
14dd0 20 20 20 20 70 44 62 2d 3e 7a 54 72 61 63 65 20      pDb->zTrace 
14de0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  = 0;.      }.#if
14df0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
14e00 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20  _OMIT_TRACE) && 
14e10 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
14e20 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
14e30 49 4e 54 29 0a 20 20 20 20 20 20 69 66 28 20 70  INT).      if( p
14e40 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20  Db->zTrace ){.  
14e50 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72        pDb->inter
14e60 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20  p = interp;.    
14e70 20 20 20 20 73 71 6c 69 74 65 33 5f 74 72 61 63      sqlite3_trac
14e80 65 28 70 44 62 2d 3e 64 62 2c 20 44 62 54 72 61  e(pDb->db, DbTra
14e90 63 65 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b  ceHandler, pDb);
14ea0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
14eb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 72        sqlite3_tr
14ec0 61 63 65 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20  ace(pDb->db, 0, 
14ed0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  0);.      }.#end
14ee0 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65  if.    }.    bre
14ef0 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
14f00 20 24 64 62 20 74 72 61 6e 73 61 63 74 69 6f 6e   $db transaction
14f10 20 5b 2d 64 65 66 65 72 72 65 64 7c 2d 69 6d 6d   [-deferred|-imm
14f20 65 64 69 61 74 65 7c 2d 65 78 63 6c 75 73 69 76  ediate|-exclusiv
14f30 65 5d 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20  e] SCRIPT.  **. 
14f40 20 2a 2a 20 53 74 61 72 74 20 61 20 6e 65 77 20   ** Start a new 
14f50 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 66 20  transaction (if 
14f60 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65 61  we are not alrea
14f70 64 79 20 69 6e 20 74 68 65 20 6d 69 64 73 74 20  dy in the midst 
14f80 6f 66 20 61 0a 20 20 2a 2a 20 74 72 61 6e 73 61  of a.  ** transa
14f90 63 74 69 6f 6e 29 20 61 6e 64 20 65 78 65 63 75  ction) and execu
14fa0 74 65 20 74 68 65 20 54 43 4c 20 73 63 72 69 70  te the TCL scrip
14fb0 74 20 53 43 52 49 50 54 2e 20 20 41 66 74 65 72  t SCRIPT.  After
14fc0 20 53 43 52 49 50 54 0a 20 20 2a 2a 20 63 6f 6d   SCRIPT.  ** com
14fd0 70 6c 65 74 65 73 2c 20 65 69 74 68 65 72 20 63  pletes, either c
14fe0 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61  ommit the transa
14ff0 63 74 69 6f 6e 20 6f 72 20 72 6f 6c 6c 20 69 74  ction or roll it
15000 20 62 61 63 6b 20 69 66 20 53 43 52 49 50 54 0a   back if SCRIPT.
15010 20 20 2a 2a 20 74 68 72 6f 77 73 20 61 6e 20 65    ** throws an e
15020 78 63 65 70 74 69 6f 6e 2e 20 20 4f 72 20 69 66  xception.  Or if
15030 20 6e 6f 20 6e 65 77 20 74 72 61 6e 73 61 74 69   no new transati
15040 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64 2c 20  on was started, 
15050 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 20 20 2a 2a  do nothing..  **
15060 20 70 61 73 73 20 74 68 65 20 65 78 63 65 70 74   pass the except
15070 69 6f 6e 20 6f 6e 20 75 70 20 74 68 65 20 73 74  ion on up the st
15080 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ack..  **.  ** T
15090 68 69 73 20 63 6f 6d 6d 61 6e 64 20 77 61 73 20  his command was 
150a0 69 6e 73 70 69 72 65 64 20 62 79 20 44 61 76 65  inspired by Dave
150b0 20 54 68 6f 6d 61 73 27 73 20 74 61 6c 6b 20 6f   Thomas's talk o
150c0 6e 20 52 75 62 79 20 61 74 20 74 68 65 0a 20 20  n Ruby at the.  
150d0 2a 2a 20 32 30 30 35 20 4f 27 52 65 69 6c 6c 79  ** 2005 O'Reilly
150e0 20 4f 70 65 6e 20 53 6f 75 72 63 65 20 43 6f 6e   Open Source Con
150f0 76 65 6e 74 69 6f 6e 20 28 4f 53 43 4f 4e 29 2e  vention (OSCON).
15100 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
15110 54 52 41 4e 53 41 43 54 49 4f 4e 3a 20 7b 0a 20  TRANSACTION: {. 
15120 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72     Tcl_Obj *pScr
15130 69 70 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ipt;.    const c
15140 68 61 72 20 2a 7a 42 65 67 69 6e 20 3d 20 22 53  har *zBegin = "S
15150 41 56 45 50 4f 49 4e 54 20 5f 74 63 6c 5f 74 72  AVEPOINT _tcl_tr
15160 61 6e 73 61 63 74 69 6f 6e 22 3b 0a 20 20 20 20  ansaction";.    
15170 69 66 28 20 6f 62 6a 63 21 3d 33 20 26 26 20 6f  if( objc!=3 && o
15180 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20  bjc!=4 ){.      
15190 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
151a0 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
151b0 2c 20 22 5b 54 59 50 45 5d 20 53 43 52 49 50 54  , "[TYPE] SCRIPT
151c0 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
151d0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
151e0 7d 0a 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e  }..    if( pDb->
151f0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 30 20  nTransaction==0 
15200 26 26 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20  && objc==4 ){.  
15210 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
15220 20 63 68 61 72 20 2a 54 54 59 50 45 5f 73 74 72   char *TTYPE_str
15230 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  s[] = {.        
15240 22 64 65 66 65 72 72 65 64 22 2c 20 20 20 22 65  "deferred",   "e
15250 78 63 6c 75 73 69 76 65 22 2c 20 20 22 69 6d 6d  xclusive",  "imm
15260 65 64 69 61 74 65 22 2c 20 30 0a 20 20 20 20 20  ediate", 0.     
15270 20 7d 3b 0a 20 20 20 20 20 20 65 6e 75 6d 20 54   };.      enum T
15280 54 59 50 45 5f 65 6e 75 6d 20 7b 0a 20 20 20 20  TYPE_enum {.    
15290 20 20 20 20 54 54 59 50 45 5f 44 45 46 45 52 52      TTYPE_DEFERR
152a0 45 44 2c 20 54 54 59 50 45 5f 45 58 43 4c 55 53  ED, TTYPE_EXCLUS
152b0 49 56 45 2c 20 54 54 59 50 45 5f 49 4d 4d 45 44  IVE, TTYPE_IMMED
152c0 49 41 54 45 0a 20 20 20 20 20 20 7d 3b 0a 20 20  IATE.      };.  
152d0 20 20 20 20 69 6e 74 20 74 74 79 70 65 3b 0a 20      int ttype;. 
152e0 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74       if( Tcl_Get
152f0 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74  IndexFromObj(int
15300 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 54 54  erp, objv[2], TT
15310 59 50 45 5f 73 74 72 73 2c 20 22 74 72 61 6e 73  YPE_strs, "trans
15320 61 63 74 69 6f 6e 20 74 79 70 65 22 2c 0a 20 20  action type",.  
15330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15340 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 26              0, &
15350 74 74 79 70 65 29 20 29 7b 0a 20 20 20 20 20 20  ttype) ){.      
15360 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
15370 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
15380 20 20 73 77 69 74 63 68 28 20 28 65 6e 75 6d 20    switch( (enum 
15390 54 54 59 50 45 5f 65 6e 75 6d 29 74 74 79 70 65  TTYPE_enum)ttype
153a0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65   ){.        case
153b0 20 54 54 59 50 45 5f 44 45 46 45 52 52 45 44 3a   TTYPE_DEFERRED:
153c0 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 3b      /* no-op */;
153d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
153f0 63 61 73 65 20 54 54 59 50 45 5f 45 58 43 4c 55  case TTYPE_EXCLU
15400 53 49 56 45 3a 20 20 20 7a 42 65 67 69 6e 20 3d  SIVE:   zBegin =
15410 20 22 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56   "BEGIN EXCLUSIV
15420 45 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  E";  break;.    
15430 20 20 20 20 63 61 73 65 20 54 54 59 50 45 5f 49      case TTYPE_I
15440 4d 4d 45 44 49 41 54 45 3a 20 20 20 7a 42 65 67  MMEDIATE:   zBeg
15450 69 6e 20 3d 20 22 42 45 47 49 4e 20 49 4d 4d 45  in = "BEGIN IMME
15460 44 49 41 54 45 22 3b 20 20 62 72 65 61 6b 3b 0a  DIATE";  break;.
15470 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
15480 20 20 70 53 63 72 69 70 74 20 3d 20 6f 62 6a 76    pScript = objv
15490 5b 6f 62 6a 63 2d 31 5d 3b 0a 0a 20 20 20 20 2f  [objc-1];..    /
154a0 2a 20 52 75 6e 20 74 68 65 20 53 51 4c 69 74 65  * Run the SQLite
154b0 20 42 45 47 49 4e 20 63 6f 6d 6d 61 6e 64 20 74   BEGIN command t
154c0 6f 20 6f 70 65 6e 20 61 20 74 72 61 6e 73 61 63  o open a transac
154d0 74 69 6f 6e 20 6f 72 20 73 61 76 65 70 6f 69 6e  tion or savepoin
154e0 74 2e 20 2a 2f 0a 20 20 20 20 70 44 62 2d 3e 64  t. */.    pDb->d
154f0 69 73 61 62 6c 65 41 75 74 68 2b 2b 3b 0a 20 20  isableAuth++;.  
15500 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
15510 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 7a 42 65  xec(pDb->db, zBe
15520 67 69 6e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  gin, 0, 0, 0);. 
15530 20 20 20 70 44 62 2d 3e 64 69 73 61 62 6c 65 41     pDb->disableA
15540 75 74 68 2d 2d 3b 0a 20 20 20 20 69 66 28 20 72  uth--;.    if( r
15550 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
15560 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
15570 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73  Result(interp, s
15580 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44  qlite3_errmsg(pD
15590 62 2d 3e 64 62 29 2c 20 28 63 68 61 72 2a 29 30  b->db), (char*)0
155a0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
155b0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
155c0 0a 20 20 20 20 70 44 62 2d 3e 6e 54 72 61 6e 73  .    pDb->nTrans
155d0 61 63 74 69 6f 6e 2b 2b 3b 0a 0a 20 20 20 20 2f  action++;..    /
155e0 2a 20 49 66 20 75 73 69 6e 67 20 4e 52 45 2c 20  * If using NRE, 
155f0 73 63 68 65 64 75 6c 65 20 61 20 63 61 6c 6c 62  schedule a callb
15600 61 63 6b 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68  ack to invoke th
15610 65 20 73 63 72 69 70 74 20 70 53 63 72 69 70 74  e script pScript
15620 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61 20  , then.    ** a 
15630 73 65 63 6f 6e 64 20 63 61 6c 6c 62 61 63 6b 20  second callback 
15640 74 6f 20 63 6f 6d 6d 69 74 20 28 6f 72 20 72 6f  to commit (or ro
15650 6c 6c 62 61 63 6b 29 20 74 68 65 20 74 72 61 6e  llback) the tran
15660 73 61 63 74 69 6f 6e 20 6f 72 20 73 61 76 65 70  saction or savep
15670 6f 69 6e 74 0a 20 20 20 20 2a 2a 20 6f 70 65 6e  oint.    ** open
15680 65 64 20 61 62 6f 76 65 2e 20 49 66 20 6e 6f 74  ed above. If not
15690 20 75 73 69 6e 67 20 4e 52 45 2c 20 65 76 61 6c   using NRE, eval
156a0 75 61 74 65 20 74 68 65 20 73 63 72 69 70 74 20  uate the script 
156b0 64 69 72 65 63 74 6c 79 2c 20 74 68 65 6e 0a 20  directly, then. 
156c0 20 20 20 2a 2a 20 63 61 6c 6c 20 66 75 6e 63 74     ** call funct
156d0 69 6f 6e 20 44 62 54 72 61 6e 73 50 6f 73 74 43  ion DbTransPostC
156e0 6d 64 28 29 20 74 6f 20 63 6f 6d 6d 69 74 20 28  md() to commit (
156f0 6f 72 20 72 6f 6c 6c 62 61 63 6b 29 20 74 68 65  or rollback) the
15700 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20   transaction .  
15710 20 20 2a 2a 20 6f 72 20 73 61 76 65 70 6f 69 6e    ** or savepoin
15720 74 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 44  t.  */.    if( D
15730 62 55 73 65 4e 72 65 28 29 20 29 7b 0a 20 20 20  bUseNre() ){.   
15740 20 20 20 54 63 6c 5f 4e 52 41 64 64 43 61 6c 6c     Tcl_NRAddCall
15750 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 44 62 54  back(interp, DbT
15760 72 61 6e 73 50 6f 73 74 43 6d 64 2c 20 63 64 2c  ransPostCmd, cd,
15770 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
15780 20 28 76 6f 69 64 29 54 63 6c 5f 4e 52 45 76 61   (void)Tcl_NREva
15790 6c 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 53 63  lObj(interp, pSc
157a0 72 69 70 74 2c 20 30 29 3b 0a 20 20 20 20 7d 65  ript, 0);.    }e
157b0 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
157c0 44 62 54 72 61 6e 73 50 6f 73 74 43 6d 64 28 26  DbTransPostCmd(&
157d0 63 64 2c 20 69 6e 74 65 72 70 2c 20 54 63 6c 5f  cd, interp, Tcl_
157e0 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70  EvalObjEx(interp
157f0 2c 20 70 53 63 72 69 70 74 2c 20 30 29 29 3b 0a  , pScript, 0));.
15800 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
15810 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
15820 20 20 20 24 64 62 20 75 6e 6c 6f 63 6b 5f 6e 6f     $db unlock_no
15830 74 69 66 79 20 3f 73 63 72 69 70 74 3f 0a 20 20  tify ?script?.  
15840 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 55 4e 4c  */.  case DB_UNL
15850 4f 43 4b 5f 4e 4f 54 49 46 59 3a 20 7b 0a 23 69  OCK_NOTIFY: {.#i
15860 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  fndef SQLITE_ENA
15870 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46  BLE_UNLOCK_NOTIF
15880 59 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  Y.    Tcl_Append
15890 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
158a0 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 20 6e 6f  unlock_notify no
158b0 74 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74  t available in t
158c0 68 69 73 20 62 75 69 6c 64 22 2c 0a 20 20 20 20  his build",.    
158d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158e0 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
158f0 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  rc = TCL_ERROR;.
15900 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 6f 62  #else.    if( ob
15910 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33  jc!=2 && objc!=3
15920 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
15930 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
15940 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 53 43  p, 2, objv, "?SC
15950 52 49 50 54 3f 22 29 3b 0a 20 20 20 20 20 20 72  RIPT?");.      r
15960 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  c = TCL_ERROR;. 
15970 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15980 76 6f 69 64 20 28 2a 78 4e 6f 74 69 66 79 29 28  void (*xNotify)(
15990 76 6f 69 64 20 2a 2a 2c 20 69 6e 74 29 20 3d 20  void **, int) = 
159a0 30 3b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70  0;.      void *p
159b0 4e 6f 74 69 66 79 41 72 67 20 3d 20 30 3b 0a 0a  NotifyArg = 0;..
159c0 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70        if( pDb->p
159d0 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 20 29 7b 0a  UnlockNotify ){.
159e0 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72          Tcl_Decr
159f0 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 55  RefCount(pDb->pU
15a00 6e 6c 6f 63 6b 4e 6f 74 69 66 79 29 3b 0a 20 20  nlockNotify);.  
15a10 20 20 20 20 20 20 70 44 62 2d 3e 70 55 6e 6c 6f        pDb->pUnlo
15a20 63 6b 4e 6f 74 69 66 79 20 3d 20 30 3b 0a 20 20  ckNotify = 0;.  
15a30 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 69      }.  .      i
15a40 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20  f( objc==3 ){.  
15a50 20 20 20 20 20 20 78 4e 6f 74 69 66 79 20 3d 20        xNotify = 
15a60 44 62 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 3b 0a  DbUnlockNotify;.
15a70 20 20 20 20 20 20 20 20 70 4e 6f 74 69 66 79 41          pNotifyA
15a80 72 67 20 3d 20 28 76 6f 69 64 20 2a 29 70 44 62  rg = (void *)pDb
15a90 3b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 70  ;.        pDb->p
15aa0 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 20 3d 20 6f  UnlockNotify = o
15ab0 62 6a 76 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20  bjv[2];.        
15ac0 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
15ad0 28 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74  (pDb->pUnlockNot
15ae0 69 66 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ify);.      }.  
15af0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
15b00 65 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79  e3_unlock_notify
15b10 28 70 44 62 2d 3e 64 62 2c 20 78 4e 6f 74 69 66  (pDb->db, xNotif
15b20 79 2c 20 70 4e 6f 74 69 66 79 41 72 67 29 20 29  y, pNotifyArg) )
15b30 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70  {.        Tcl_Ap
15b40 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
15b50 70 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  p, sqlite3_errms
15b60 67 28 70 44 62 2d 3e 64 62 29 2c 20 28 63 68 61  g(pDb->db), (cha
15b70 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 20 20 72  r*)0);.        r
15b80 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  c = TCL_ERROR;. 
15b90 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
15ba0 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  dif.    break;. 
15bb0 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
15bc0 20 24 64 62 20 77 61 6c 5f 68 6f 6f 6b 20 3f 73   $db wal_hook ?s
15bd0 63 72 69 70 74 3f 0a 20 20 2a 2a 20 20 20 20 24  cript?.  **    $
15be0 64 62 20 75 70 64 61 74 65 5f 68 6f 6f 6b 20 3f  db update_hook ?
15bf0 73 63 72 69 70 74 3f 0a 20 20 2a 2a 20 20 20 20  script?.  **    
15c00 24 64 62 20 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f  $db rollback_hoo
15c10 6b 20 3f 73 63 72 69 70 74 3f 0a 20 20 2a 2f 0a  k ?script?.  */.
15c20 20 20 63 61 73 65 20 44 42 5f 57 41 4c 5f 48 4f    case DB_WAL_HO
15c30 4f 4b 3a 20 0a 20 20 63 61 73 65 20 44 42 5f 55  OK: .  case DB_U
15c40 50 44 41 54 45 5f 48 4f 4f 4b 3a 20 0a 20 20 63  PDATE_HOOK: .  c
15c50 61 73 65 20 44 42 5f 52 4f 4c 4c 42 41 43 4b 5f  ase DB_ROLLBACK_
15c60 48 4f 4f 4b 3a 20 7b 0a 0a 20 20 20 20 2f 2a 20  HOOK: {..    /* 
15c70 73 65 74 20 70 70 48 6f 6f 6b 20 74 6f 20 70 6f  set ppHook to po
15c80 69 6e 74 20 61 74 20 70 55 70 64 61 74 65 48 6f  int at pUpdateHo
15c90 6f 6b 20 6f 72 20 70 52 6f 6c 6c 62 61 63 6b 48  ok or pRollbackH
15ca0 6f 6f 6b 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f  ook, depending o
15cb0 6e 20 0a 20 20 20 20 2a 2a 20 77 68 65 74 68 65  n .    ** whethe
15cc0 72 20 5b 24 64 62 20 75 70 64 61 74 65 5f 68 6f  r [$db update_ho
15cd0 6f 6b 5d 20 6f 72 20 5b 24 64 62 20 72 6f 6c 6c  ok] or [$db roll
15ce0 62 61 63 6b 5f 68 6f 6f 6b 5d 20 77 61 73 20 69  back_hook] was i
15cf0 6e 76 6f 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  nvoked..    */. 
15d00 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 70 70 48     Tcl_Obj **ppH
15d10 6f 6f 6b 3b 20 0a 20 20 20 20 69 66 28 20 63 68  ook; .    if( ch
15d20 6f 69 63 65 3d 3d 44 42 5f 55 50 44 41 54 45 5f  oice==DB_UPDATE_
15d30 48 4f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 70  HOOK ){.      pp
15d40 48 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e 70 55 70  Hook = &pDb->pUp
15d50 64 61 74 65 48 6f 6f 6b 3b 0a 20 20 20 20 7d 65  dateHook;.    }e
15d60 6c 73 65 20 69 66 28 20 63 68 6f 69 63 65 3d 3d  lse if( choice==
15d70 44 42 5f 57 41 4c 5f 48 4f 4f 4b 20 29 7b 0a 20  DB_WAL_HOOK ){. 
15d80 20 20 20 20 20 70 70 48 6f 6f 6b 20 3d 20 26 70       ppHook = &p
15d90 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 3b 0a 20 20  Db->pWalHook;.  
15da0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
15db0 70 48 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e 70 52  pHook = &pDb->pR
15dc0 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3b 0a 20 20 20  ollbackHook;.   
15dd0 20 7d 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63   }..    if( objc
15de0 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33 20 29  !=2 && objc!=3 )
15df0 7b 0a 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  {.       Tcl_Wro
15e00 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
15e10 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 53 43 52  , 2, objv, "?SCR
15e20 49 50 54 3f 22 29 3b 0a 20 20 20 20 20 20 20 72  IPT?");.       r
15e30 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
15e40 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 2a  .    }.    if( *
15e50 70 70 48 6f 6f 6b 20 29 7b 0a 20 20 20 20 20 20  ppHook ){.      
15e60 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
15e70 28 69 6e 74 65 72 70 2c 20 2a 70 70 48 6f 6f 6b  (interp, *ppHook
15e80 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a  );.      if( obj
15e90 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20  c==3 ){.        
15ea0 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
15eb0 28 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20 20 20 20  (*ppHook);.     
15ec0 20 20 20 2a 70 70 48 6f 6f 6b 20 3d 20 30 3b 0a     *ppHook = 0;.
15ed0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
15ee0 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b    if( objc==3 ){
15ef0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
15f00 28 2a 70 70 48 6f 6f 6b 29 20 29 3b 0a 20 20 20  (*ppHook) );.   
15f10 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 43 68     if( Tcl_GetCh
15f20 61 72 4c 65 6e 67 74 68 28 6f 62 6a 76 5b 32 5d  arLength(objv[2]
15f30 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  )>0 ){.        *
15f40 70 70 48 6f 6f 6b 20 3d 20 6f 62 6a 76 5b 32 5d  ppHook = objv[2]
15f50 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e  ;.        Tcl_In
15f60 63 72 52 65 66 43 6f 75 6e 74 28 2a 70 70 48 6f  crRefCount(*ppHo
15f70 6f 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ok);.      }.   
15f80 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   }..    sqlite3_
15f90 75 70 64 61 74 65 5f 68 6f 6f 6b 28 70 44 62 2d  update_hook(pDb-
15fa0 3e 64 62 2c 20 28 70 44 62 2d 3e 70 55 70 64 61  >db, (pDb->pUpda
15fb0 74 65 48 6f 6f 6b 3f 44 62 55 70 64 61 74 65 48  teHook?DbUpdateH
15fc0 61 6e 64 6c 65 72 3a 30 29 2c 20 70 44 62 29 3b  andler:0), pDb);
15fd0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 6f 6c  .    sqlite3_rol
15fe0 6c 62 61 63 6b 5f 68 6f 6f 6b 28 70 44 62 2d 3e  lback_hook(pDb->
15ff0 64 62 2c 28 70 44 62 2d 3e 70 52 6f 6c 6c 62 61  db,(pDb->pRollba
16000 63 6b 48 6f 6f 6b 3f 44 62 52 6f 6c 6c 62 61 63  ckHook?DbRollbac
16010 6b 48 61 6e 64 6c 65 72 3a 30 29 2c 70 44 62 29  kHandler:0),pDb)
16020 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61  ;.    sqlite3_wa
16030 6c 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 28  l_hook(pDb->db,(
16040 70 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 3f 44 62  pDb->pWalHook?Db
16050 57 61 6c 48 61 6e 64 6c 65 72 3a 30 29 2c 70 44  WalHandler:0),pD
16060 62 29 3b 0a 0a 20 20 20 20 62 72 65 61 6b 3b 0a  b);..    break;.
16070 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62    }..  /*    $db
16080 20 76 65 72 73 69 6f 6e 0a 20 20 2a 2a 0a 20 20   version.  **.  
16090 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 65  ** Return the ve
160a0 72 73 69 6f 6e 20 73 74 72 69 6e 67 20 66 6f 72  rsion string for
160b0 20 74 68 69 73 20 64 61 74 61 62 61 73 65 2e 0a   this database..
160c0 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 56    */.  case DB_V
160d0 45 52 53 49 4f 4e 3a 20 7b 0a 20 20 20 20 54 63  ERSION: {.    Tc
160e0 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
160f0 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69  rp, (char *)sqli
16100 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28 29  te3_libversion()
16110 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20  , TCL_STATIC);. 
16120 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 0a     break;.  }...
16130 20 20 7d 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68    } /* End of th
16140 65 20 53 57 49 54 43 48 20 73 74 61 74 65 6d 65  e SWITCH stateme
16150 6e 74 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72  nt */.  return r
16160 63 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  c;.}..#if SQLITE
16170 5f 54 43 4c 5f 4e 52 45 0a 2f 2a 0a 2a 2a 20 41  _TCL_NRE./*.** A
16180 64 61 70 74 6f 72 20 74 68 61 74 20 70 72 6f 76  daptor that prov
16190 69 64 65 73 20 61 6e 20 6f 62 6a 43 6d 64 20 69  ides an objCmd i
161a0 6e 74 65 72 66 61 63 65 20 74 6f 20 74 68 65 20  nterface to the 
161b0 4e 52 45 2d 65 6e 61 62 6c 65 64 0a 2a 2a 20 69  NRE-enabled.** i
161c0 6e 74 65 72 66 61 63 65 20 69 6d 70 6c 65 6d 65  nterface impleme
161d0 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ntation..*/.stat
161e0 69 63 20 69 6e 74 20 44 62 4f 62 6a 43 6d 64 41  ic int DbObjCmdA
161f0 64 61 70 74 6f 72 28 0a 20 20 76 6f 69 64 20 2a  daptor(.  void *
16200 63 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  cd,.  Tcl_Interp
16210 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
16220 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
16230 2a 63 6f 6e 73 74 2a 6f 62 6a 76 0a 29 7b 0a 20  *const*objv.){. 
16240 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e 52 43 61   return Tcl_NRCa
16250 6c 6c 4f 62 6a 50 72 6f 63 28 69 6e 74 65 72 70  llObjProc(interp
16260 2c 20 44 62 4f 62 6a 43 6d 64 2c 20 63 64 2c 20  , DbObjCmd, cd, 
16270 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b 0a 7d 0a 23  objc, objv);.}.#
16280 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
16290 54 43 4c 5f 4e 52 45 20 2a 2f 0a 0a 2f 2a 0a 2a  TCL_NRE */../*.*
162a0 2a 20 20 20 73 71 6c 69 74 65 33 20 44 42 4e 41  *   sqlite3 DBNA
162b0 4d 45 20 46 49 4c 45 4e 41 4d 45 20 3f 2d 76 66  ME FILENAME ?-vf
162c0 73 20 56 46 53 4e 41 4d 45 3f 20 3f 2d 6b 65 79  s VFSNAME? ?-key
162d0 20 4b 45 59 3f 20 3f 2d 72 65 61 64 6f 6e 6c 79   KEY? ?-readonly
162e0 20 42 4f 4f 4c 45 41 4e 3f 0a 2a 2a 20 20 20 20   BOOLEAN?.**    
162f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16300 20 20 20 20 20 20 20 3f 2d 63 72 65 61 74 65 20         ?-create 
16310 42 4f 4f 4c 45 41 4e 3f 20 3f 2d 6e 6f 6d 75 74  BOOLEAN? ?-nomut
16320 65 78 20 42 4f 4f 4c 45 41 4e 3f 0a 2a 2a 0a 2a  ex BOOLEAN?.**.*
16330 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 6d 61  * This is the ma
16340 69 6e 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 2e 20  in Tcl command. 
16350 20 57 68 65 6e 20 74 68 65 20 22 73 71 6c 69 74   When the "sqlit
16360 65 22 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 69  e" Tcl command i
16370 73 0a 2a 2a 20 69 6e 76 6f 6b 65 64 2c 20 74 68  s.** invoked, th
16380 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20  is routine runs 
16390 74 6f 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  to process that 
163a0 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54  command..**.** T
163b0 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
163c0 74 2c 20 44 42 4e 41 4d 45 2c 20 69 73 20 61 6e  t, DBNAME, is an
163d0 20 61 72 62 69 74 72 61 72 79 20 6e 61 6d 65 20   arbitrary name 
163e0 66 6f 72 20 61 20 6e 65 77 0a 2a 2a 20 64 61 74  for a new.** dat
163f0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
16400 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20  .  This command 
16410 63 72 65 61 74 65 73 20 61 20 6e 65 77 20 63 6f  creates a new co
16420 6d 6d 61 6e 64 20 6e 61 6d 65 64 0a 2a 2a 20 44  mmand named.** D
16430 42 4e 41 4d 45 20 74 68 61 74 20 69 73 20 75 73  BNAME that is us
16440 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68  ed to control th
16450 61 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20  at connection.  
16460 54 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  The database.** 
16470 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 64 65  connection is de
16480 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 44  leted when the D
16490 42 4e 41 4d 45 20 63 6f 6d 6d 61 6e 64 20 69 73  BNAME command is
164a0 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   deleted..**.** 
164b0 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
164c0 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ent is the name 
164d0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
164e0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74  file..**.*/.stat
164f0 69 63 20 69 6e 74 20 44 62 4d 61 69 6e 28 76 6f  ic int DbMain(vo
16500 69 64 20 2a 63 64 2c 20 54 63 6c 5f 49 6e 74 65  id *cd, Tcl_Inte
16510 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
16520 6f 62 6a 63 2c 54 63 6c 5f 4f 62 6a 20 2a 63 6f  objc,Tcl_Obj *co
16530 6e 73 74 2a 6f 62 6a 76 29 7b 0a 20 20 53 71 6c  nst*objv){.  Sql
16540 69 74 65 44 62 20 2a 70 3b 0a 20 20 63 6f 6e 73  iteDb *p;.  cons
16550 74 20 63 68 61 72 20 2a 7a 41 72 67 3b 0a 20 20  t char *zArg;.  
16560 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 3b 0a 20  char *zErrMsg;. 
16570 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20   int i;.  const 
16580 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 63  char *zFile;.  c
16590 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20  onst char *zVfs 
165a0 3d 20 30 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73  = 0;.  int flags
165b0 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20  ;.  Tcl_DString 
165c0 74 72 61 6e 73 6c 61 74 65 64 46 69 6c 65 6e 61  translatedFilena
165d0 6d 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  me;.#ifdef SQLIT
165e0 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f  E_HAS_CODEC.  vo
165f0 69 64 20 2a 70 4b 65 79 20 3d 20 30 3b 0a 20 20  id *pKey = 0;.  
16600 69 6e 74 20 6e 4b 65 79 20 3d 20 30 3b 0a 23 65  int nKey = 0;.#e
16610 6e 64 69 66 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ndif.  int rc;..
16620 20 20 2f 2a 20 49 6e 20 6e 6f 72 6d 61 6c 20 75    /* In normal u
16630 73 65 2c 20 65 61 63 68 20 54 43 4c 20 69 6e 74  se, each TCL int
16640 65 72 70 72 65 74 65 72 20 72 75 6e 73 20 69 6e  erpreter runs in
16650 20 61 20 73 69 6e 67 6c 65 20 74 68 72 65 61 64   a single thread
16660 2e 20 20 53 6f 0a 20 20 2a 2a 20 62 79 20 64 65  .  So.  ** by de
16670 66 61 75 6c 74 2c 20 77 65 20 63 61 6e 20 74 75  fault, we can tu
16680 72 6e 20 6f 66 20 6d 75 74 65 78 69 6e 67 20 6f  rn of mutexing o
16690 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  n SQLite databas
166a0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20  e connections.. 
166b0 20 2a 2a 20 48 6f 77 65 76 65 72 2c 20 66 6f 72   ** However, for
166c0 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65   testing purpose
166d0 73 20 69 74 20 69 73 20 75 73 65 66 75 6c 20 74  s it is useful t
166e0 6f 20 68 61 76 65 20 6d 75 74 65 78 65 73 20 74  o have mutexes t
166f0 75 72 6e 65 64 0a 20 20 2a 2a 20 6f 6e 2e 20 20  urned.  ** on.  
16700 53 6f 2c 20 62 79 20 64 65 66 61 75 6c 74 2c 20  So, by default, 
16710 6d 75 74 65 78 65 73 20 64 65 66 61 75 6c 74 20  mutexes default 
16720 6f 66 66 2e 20 20 42 75 74 20 69 66 20 63 6f 6d  off.  But if com
16730 70 69 6c 65 64 20 77 69 74 68 0a 20 20 2a 2a 20  piled with.  ** 
16740 53 51 4c 49 54 45 5f 54 43 4c 5f 44 45 46 41 55  SQLITE_TCL_DEFAU
16750 4c 54 5f 46 55 4c 4c 4d 55 54 45 58 20 74 68 65  LT_FULLMUTEX the
16760 6e 20 6d 75 74 65 78 65 73 20 64 65 66 61 75 6c  n mutexes defaul
16770 74 20 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65  t on..  */.#ifde
16780 66 20 53 51 4c 49 54 45 5f 54 43 4c 5f 44 45 46  f SQLITE_TCL_DEF
16790 41 55 4c 54 5f 46 55 4c 4c 4d 55 54 45 58 0a 20  AULT_FULLMUTEX. 
167a0 20 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f   flags = SQLITE_
167b0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
167c0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
167d0 41 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ATE | SQLITE_OPE
167e0 4e 5f 46 55 4c 4c 4d 55 54 45 58 3b 0a 23 65 6c  N_FULLMUTEX;.#el
167f0 73 65 0a 20 20 66 6c 61 67 73 20 3d 20 53 51 4c  se.  flags = SQL
16800 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
16810 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
16820 5f 43 52 45 41 54 45 20 7c 20 53 51 4c 49 54 45  _CREATE | SQLITE
16830 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 3b 0a 23  _OPEN_NOMUTEX;.#
16840 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6f 62 6a  endif..  if( obj
16850 63 3d 3d 32 20 29 7b 0a 20 20 20 20 7a 41 72 67  c==2 ){.    zArg
16860 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
16870 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c  FromObj(objv[1],
16880 20 30 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72   0);.    if( str
16890 63 6d 70 28 7a 41 72 67 2c 22 2d 76 65 72 73 69  cmp(zArg,"-versi
168a0 6f 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  on")==0 ){.     
168b0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
168c0 74 28 69 6e 74 65 72 70 2c 73 71 6c 69 74 65 33  t(interp,sqlite3
168d0 5f 6c 69 62 76 65 72 73 69 6f 6e 28 29 2c 20 28  _libversion(), (
168e0 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
168f0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20  return TCL_OK;. 
16900 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72     }.    if( str
16910 63 6d 70 28 7a 41 72 67 2c 22 2d 68 61 73 2d 63  cmp(zArg,"-has-c
16920 6f 64 65 63 22 29 3d 3d 30 20 29 7b 0a 23 69 66  odec")==0 ){.#if
16930 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
16940 4f 44 45 43 0a 20 20 20 20 20 20 54 63 6c 5f 41  ODEC.      Tcl_A
16950 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
16960 72 70 2c 22 31 22 2c 28 63 68 61 72 2a 29 30 29  rp,"1",(char*)0)
16970 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 54 63  ;.#else.      Tc
16980 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
16990 6e 74 65 72 70 2c 22 30 22 2c 28 63 68 61 72 2a  nterp,"0",(char*
169a0 29 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  )0);.#endif.    
169b0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
169c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72  .    }.  }.  for
169d0 28 69 3d 33 3b 20 69 2b 31 3c 6f 62 6a 63 3b 20  (i=3; i+1<objc; 
169e0 69 2b 3d 32 29 7b 0a 20 20 20 20 7a 41 72 67 20  i+=2){.    zArg 
169f0 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
16a00 6f 62 6a 76 5b 69 5d 29 3b 0a 20 20 20 20 69 66  objv[i]);.    if
16a10 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d  ( strcmp(zArg,"-
16a20 6b 65 79 22 29 3d 3d 30 20 29 7b 0a 23 69 66 64  key")==0 ){.#ifd
16a30 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
16a40 44 45 43 0a 20 20 20 20 20 20 70 4b 65 79 20 3d  DEC.      pKey =
16a50 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61   Tcl_GetByteArra
16a60 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 69 2b  yFromObj(objv[i+
16a70 31 5d 2c 20 26 6e 4b 65 79 29 3b 0a 23 65 6e 64  1], &nKey);.#end
16a80 69 66 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  if.    }else if(
16a90 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d   strcmp(zArg, "-
16aa0 76 66 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  vfs")==0 ){.    
16ab0 20 20 7a 56 66 73 20 3d 20 54 63 6c 5f 47 65 74    zVfs = Tcl_Get
16ac0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69 2b 31 5d  String(objv[i+1]
16ad0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
16ae0 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d   strcmp(zArg, "-
16af0 72 65 61 64 6f 6e 6c 79 22 29 3d 3d 30 20 29 7b  readonly")==0 ){
16b00 0a 20 20 20 20 20 20 69 6e 74 20 62 3b 0a 20 20  .      int b;.  
16b10 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42      if( Tcl_GetB
16b20 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
16b30 74 65 72 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c  terp, objv[i+1],
16b40 20 26 62 29 20 29 20 72 65 74 75 72 6e 20 54 43   &b) ) return TC
16b50 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 69  L_ERROR;.      i
16b60 66 28 20 62 20 29 7b 0a 20 20 20 20 20 20 20 20  f( b ){.        
16b70 66 6c 61 67 73 20 26 3d 20 7e 28 53 51 4c 49 54  flags &= ~(SQLIT
16b80 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
16b90 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  |SQLITE_OPEN_CRE
16ba0 41 54 45 29 3b 0a 20 20 20 20 20 20 20 20 66 6c  ATE);.        fl
16bb0 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50  ags |= SQLITE_OP
16bc0 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  EN_READONLY;.   
16bd0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16be0 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49    flags &= ~SQLI
16bf0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
16c00 3b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  ;.        flags 
16c10 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  |= SQLITE_OPEN_R
16c20 45 41 44 57 52 49 54 45 3b 0a 20 20 20 20 20 20  EADWRITE;.      
16c30 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
16c40 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d 63  strcmp(zArg, "-c
16c50 72 65 61 74 65 22 29 3d 3d 30 20 29 7b 0a 20 20  reate")==0 ){.  
16c60 20 20 20 20 69 6e 74 20 62 3b 0a 20 20 20 20 20      int b;.     
16c70 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c   if( Tcl_GetBool
16c80 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
16c90 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 62  p, objv[i+1], &b
16ca0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
16cb0 52 52 4f 52 3b 0a 20 20 20 20 20 20 69 66 28 20  RROR;.      if( 
16cc0 62 20 26 26 20 28 66 6c 61 67 73 20 26 20 53 51  b && (flags & SQ
16cd0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
16ce0 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  LY)==0 ){.      
16cf0 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54    flags |= SQLIT
16d00 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 3b 0a 20  E_OPEN_CREATE;. 
16d10 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
16d20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51      flags &= ~SQ
16d30 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
16d40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
16d50 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
16d60 41 72 67 2c 20 22 2d 6e 6f 6d 75 74 65 78 22 29  Arg, "-nomutex")
16d70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
16d80 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63   b;.      if( Tc
16d90 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
16da0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
16db0 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20 72 65 74  [i+1], &b) ) ret
16dc0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
16dd0 20 20 20 20 20 69 66 28 20 62 20 29 7b 0a 20 20       if( b ){.  
16de0 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53        flags |= S
16df0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54  QLITE_OPEN_NOMUT
16e00 45 58 3b 0a 20 20 20 20 20 20 20 20 66 6c 61 67  EX;.        flag
16e10 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45  s &= ~SQLITE_OPE
16e20 4e 5f 46 55 4c 4c 4d 55 54 45 58 3b 0a 20 20 20  N_FULLMUTEX;.   
16e30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16e40 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49    flags &= ~SQLI
16e50 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 3b  TE_OPEN_NOMUTEX;
16e60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
16e70 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41  se if( strcmp(zA
16e80 72 67 2c 20 22 2d 66 75 6c 6c 6d 75 74 65 78 22  rg, "-fullmutex"
16e90 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
16ea0 74 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20 54  t b;.      if( T
16eb0 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f  cl_GetBooleanFro
16ec0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
16ed0 76 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20 72 65  v[i+1], &b) ) re
16ee0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
16ef0 20 20 20 20 20 20 69 66 28 20 62 20 29 7b 0a 20        if( b ){. 
16f00 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20         flags |= 
16f10 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c  SQLITE_OPEN_FULL
16f20 4d 55 54 45 58 3b 0a 20 20 20 20 20 20 20 20 66  MUTEX;.        f
16f30 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
16f40 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 3b 0a 20 20  OPEN_NOMUTEX;.  
16f50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16f60 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c     flags &= ~SQL
16f70 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54  ITE_OPEN_FULLMUT
16f80 45 58 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EX;.      }.    
16f90 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
16fa0 28 7a 41 72 67 2c 20 22 2d 75 72 69 22 29 3d 3d  (zArg, "-uri")==
16fb0 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62  0 ){.      int b
16fc0 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f  ;.      if( Tcl_
16fd0 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62  GetBooleanFromOb
16fe0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69  j(interp, objv[i
16ff0 2b 31 5d 2c 20 26 62 29 20 29 20 72 65 74 75 72  +1], &b) ) retur
17000 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
17010 20 20 20 69 66 28 20 62 20 29 7b 0a 20 20 20 20     if( b ){.    
17020 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c      flags |= SQL
17030 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 20 20  ITE_OPEN_URI;.  
17040 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17050 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c     flags &= ~SQL
17060 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 20 20  ITE_OPEN_URI;.  
17070 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
17080 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
17090 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
170a0 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a  "unknown option:
170b0 20 22 2c 20 7a 41 72 67 2c 20 28 63 68 61 72 2a   ", zArg, (char*
170c0 29 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  )0);.      retur
170d0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
170e0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a   }.  }.  if( obj
170f0 63 3c 33 20 7c 7c 20 28 6f 62 6a 63 26 31 29 21  c<3 || (objc&1)!
17100 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =1 ){.    Tcl_Wr
17110 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
17120 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 0a 20 20 20  p, 1, objv, .   
17130 20 20 20 22 48 41 4e 44 4c 45 20 46 49 4c 45 4e     "HANDLE FILEN
17140 41 4d 45 20 3f 2d 76 66 73 20 56 46 53 4e 41 4d  AME ?-vfs VFSNAM
17150 45 3f 20 3f 2d 72 65 61 64 6f 6e 6c 79 20 42 4f  E? ?-readonly BO
17160 4f 4c 45 41 4e 3f 20 3f 2d 63 72 65 61 74 65 20  OLEAN? ?-create 
17170 42 4f 4f 4c 45 41 4e 3f 22 0a 20 20 20 20 20 20  BOOLEAN?".      
17180 22 20 3f 2d 6e 6f 6d 75 74 65 78 20 42 4f 4f 4c  " ?-nomutex BOOL
17190 45 41 4e 3f 20 3f 2d 66 75 6c 6c 6d 75 74 65 78  EAN? ?-fullmutex
171a0 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d 75 72 69 20   BOOLEAN? ?-uri 
171b0 42 4f 4f 4c 45 41 4e 3f 22 0a 23 69 66 64 65 66  BOOLEAN?".#ifdef
171c0 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
171d0 43 0a 20 20 20 20 20 20 22 20 3f 2d 6b 65 79 20  C.      " ?-key 
171e0 43 4f 44 45 43 4b 45 59 3f 22 0a 23 65 6e 64 69  CODECKEY?".#endi
171f0 66 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 65 74  f.    );.    ret
17200 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
17210 20 7d 0a 20 20 7a 45 72 72 4d 73 67 20 3d 20 30   }.  zErrMsg = 0
17220 3b 0a 20 20 70 20 3d 20 28 53 71 6c 69 74 65 44  ;.  p = (SqliteD
17230 62 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69  b*)Tcl_Alloc( si
17240 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66  zeof(*p) );.  if
17250 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63  ( p==0 ){.    Tc
17260 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
17270 72 70 2c 20 28 63 68 61 72 20 2a 29 22 6d 61 6c  rp, (char *)"mal
17280 6c 6f 63 20 66 61 69 6c 65 64 22 2c 20 54 43 4c  loc failed", TCL
17290 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72 65  _STATIC);.    re
172a0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
172b0 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20    }.  memset(p, 
172c0 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  0, sizeof(*p));.
172d0 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65    zFile = Tcl_Ge
172e0 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
172f0 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 7a 46  bjv[2], 0);.  zF
17300 69 6c 65 20 3d 20 54 63 6c 5f 54 72 61 6e 73 6c  ile = Tcl_Transl
17310 61 74 65 46 69 6c 65 4e 61 6d 65 28 69 6e 74 65  ateFileName(inte
17320 72 70 2c 20 7a 46 69 6c 65 2c 20 26 74 72 61 6e  rp, zFile, &tran
17330 73 6c 61 74 65 64 46 69 6c 65 6e 61 6d 65 29 3b  slatedFilename);
17340 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
17350 6f 70 65 6e 5f 76 32 28 7a 46 69 6c 65 2c 20 26  open_v2(zFile, &
17360 70 2d 3e 64 62 2c 20 66 6c 61 67 73 2c 20 7a 56  p->db, flags, zV
17370 66 73 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  fs);.  Tcl_DStri
17380 6e 67 46 72 65 65 28 26 74 72 61 6e 73 6c 61 74  ngFree(&translat
17390 65 64 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69  edFilename);.  i
173a0 66 28 20 70 2d 3e 64 62 20 29 7b 0a 20 20 20 20  f( p->db ){.    
173b0 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
173c0 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 70  qlite3_errcode(p
173d0 2d 3e 64 62 29 20 29 7b 0a 20 20 20 20 20 20 7a  ->db) ){.      z
173e0 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33  ErrMsg = sqlite3
173f0 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73  _mprintf("%s", s
17400 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d  qlite3_errmsg(p-
17410 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  >db));.      sql
17420 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64 62  ite3_close(p->db
17430 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64 62 20 3d  );.      p->db =
17440 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   0;.    }.  }els
17450 65 7b 0a 20 20 20 20 7a 45 72 72 4d 73 67 20 3d  e{.    zErrMsg =
17460 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
17470 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65  ("%s", sqlite3_e
17480 72 72 73 74 72 28 72 63 29 29 3b 0a 20 20 7d 0a  rrstr(rc));.  }.
17490 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
174a0 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 70 2d  S_CODEC.  if( p-
174b0 3e 64 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >db ){.    sqlit
174c0 65 33 5f 6b 65 79 28 70 2d 3e 64 62 2c 20 70 4b  e3_key(p->db, pK
174d0 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 7d 0a 23  ey, nKey);.  }.#
174e0 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 64  endif.  if( p->d
174f0 62 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f  b==0 ){.    Tcl_
17500 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
17510 2c 20 7a 45 72 72 4d 73 67 2c 20 54 43 4c 5f 56  , zErrMsg, TCL_V
17520 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 54 63  OLATILE);.    Tc
17530 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 29  l_Free((char*)p)
17540 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
17550 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ee(zErrMsg);.   
17560 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
17570 52 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 78 53  R;.  }.  p->maxS
17580 74 6d 74 20 3d 20 4e 55 4d 5f 50 52 45 50 41 52  tmt = NUM_PREPAR
17590 45 44 5f 53 54 4d 54 53 3b 0a 20 20 70 2d 3e 69  ED_STMTS;.  p->i
175a0 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a  nterp = interp;.
175b0 20 20 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65 74    zArg = Tcl_Get
175c0 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
175d0 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 69 66 28  jv[1], 0);.  if(
175e0 20 44 62 55 73 65 4e 72 65 28 29 20 29 7b 0a 20   DbUseNre() ){. 
175f0 20 20 20 54 63 6c 5f 4e 52 43 72 65 61 74 65 43     Tcl_NRCreateC
17600 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 7a  ommand(interp, z
17610 41 72 67 2c 20 44 62 4f 62 6a 43 6d 64 41 64 61  Arg, DbObjCmdAda
17620 70 74 6f 72 2c 20 44 62 4f 62 6a 43 6d 64 2c 0a  ptor, DbObjCmd,.
17630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17640 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
17650 2c 20 44 62 44 65 6c 65 74 65 43 6d 64 29 3b 0a  , DbDeleteCmd);.
17660 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c    }else{.    Tcl
17670 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
17680 64 28 69 6e 74 65 72 70 2c 20 7a 41 72 67 2c 20  d(interp, zArg, 
17690 44 62 4f 62 6a 43 6d 64 2c 20 28 63 68 61 72 2a  DbObjCmd, (char*
176a0 29 70 2c 20 44 62 44 65 6c 65 74 65 43 6d 64 29  )p, DbDeleteCmd)
176b0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
176c0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
176d0 50 72 6f 76 69 64 65 20 61 20 64 75 6d 6d 79 20  Provide a dummy 
176e0 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 20 69 66  Tcl_InitStubs if
176f0 20 77 65 20 61 72 65 20 75 73 69 6e 67 20 74 68   we are using th
17700 69 73 20 61 73 20 61 20 73 74 61 74 69 63 0a 2a  is as a static.*
17710 2a 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69  * library..*/.#i
17720 66 6e 64 65 66 20 55 53 45 5f 54 43 4c 5f 53 54  fndef USE_TCL_ST
17730 55 42 53 0a 23 20 75 6e 64 65 66 20 20 54 63 6c  UBS.# undef  Tcl
17740 5f 49 6e 69 74 53 74 75 62 73 0a 23 20 64 65 66  _InitStubs.# def
17750 69 6e 65 20 54 63 6c 5f 49 6e 69 74 53 74 75 62  ine Tcl_InitStub
17760 73 28 61 2c 62 2c 63 29 20 54 43 4c 5f 56 45 52  s(a,b,c) TCL_VER
17770 53 49 4f 4e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  SION.#endif../*.
17780 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20  ** Make sure we 
17790 68 61 76 65 20 61 20 50 41 43 4b 41 47 45 5f 56  have a PACKAGE_V
177a0 45 52 53 49 4f 4e 20 6d 61 63 72 6f 20 64 65 66  ERSION macro def
177b0 69 6e 65 64 2e 20 20 54 68 69 73 20 77 69 6c 6c  ined.  This will
177c0 20 62 65 0a 2a 2a 20 64 65 66 69 6e 65 64 20 61   be.** defined a
177d0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 62 79 20  utomatically by 
177e0 74 68 65 20 54 45 41 20 6d 61 6b 65 66 69 6c 65  the TEA makefile
177f0 2e 20 20 42 75 74 20 6f 74 68 65 72 20 6d 61 6b  .  But other mak
17800 65 66 69 6c 65 73 0a 2a 2a 20 64 6f 20 6e 6f 74  efiles.** do not
17810 20 64 65 66 69 6e 65 20 69 74 2e 0a 2a 2f 0a 23   define it..*/.#
17820 69 66 6e 64 65 66 20 50 41 43 4b 41 47 45 5f 56  ifndef PACKAGE_V
17830 45 52 53 49 4f 4e 0a 23 20 64 65 66 69 6e 65 20  ERSION.# define 
17840 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 20  PACKAGE_VERSION 
17850 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 0a 23  SQLITE_VERSION.#
17860 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  endif../*.** Ini
17870 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64  tialize this mod
17880 75 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ule..**.** This 
17890 54 63 6c 20 6d 6f 64 75 6c 65 20 63 6f 6e 74 61  Tcl module conta
178a0 69 6e 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c  ins only a singl
178b0 65 20 6e 65 77 20 54 63 6c 20 63 6f 6d 6d 61 6e  e new Tcl comman
178c0 64 20 6e 61 6d 65 64 20 22 73 71 6c 69 74 65 22  d named "sqlite"
178d0 2e 0a 2a 2a 20 28 48 65 6e 63 65 20 74 68 65 72  ..** (Hence ther
178e0 65 20 69 73 20 6e 6f 20 6e 61 6d 65 73 70 61 63  e is no namespac
178f0 65 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  e.  There is no 
17900 70 6f 69 6e 74 20 69 6e 20 75 73 69 6e 67 20 61  point in using a
17910 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69 66   namespace.** if
17920 20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e 20 6f   the extension o
17930 6e 6c 79 20 73 75 70 70 6c 69 65 73 20 6f 6e 65  nly supplies one
17940 20 6e 65 77 20 6e 61 6d 65 21 29 20 20 54 68 65   new name!)  The
17950 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d 61 6e   "sqlite" comman
17960 64 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20  d is.** used to 
17970 6f 70 65 6e 20 61 20 6e 65 77 20 53 51 4c 69 74  open a new SQLit
17980 65 20 64 61 74 61 62 61 73 65 2e 20 20 53 65 65  e database.  See
17990 20 74 68 65 20 44 62 4d 61 69 6e 28 29 20 72 6f   the DbMain() ro
179a0 75 74 69 6e 65 20 61 62 6f 76 65 0a 2a 2a 20 66  utine above.** f
179b0 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
179c0 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  formation..**.**
179d0 20 54 68 65 20 45 58 54 45 52 4e 20 6d 61 63 72   The EXTERN macr
179e0 6f 73 20 61 72 65 20 72 65 71 75 69 72 65 64 20  os are required 
179f0 62 79 20 54 43 4c 20 69 6e 20 6f 72 64 65 72 20  by TCL in order 
17a00 74 6f 20 77 6f 72 6b 20 6f 6e 20 77 69 6e 64 6f  to work on windo
17a10 77 73 2e 0a 2a 2f 0a 45 58 54 45 52 4e 20 69 6e  ws..*/.EXTERN in
17a20 74 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 54  t Sqlite3_Init(T
17a30 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
17a40 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 54  p){.  int rc = T
17a50 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 69 6e 74  cl_InitStubs(int
17a60 65 72 70 2c 20 22 38 2e 34 22 2c 20 30 29 20 3f  erp, "8.4", 0) ?
17a70 20 54 43 4c 5f 4f 4b 20 3a 20 54 43 4c 5f 45 52   TCL_OK : TCL_ER
17a80 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 3d 3d 54  ROR;.  if( rc==T
17a90 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c  CL_OK ){.    Tcl
17aa0 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
17ab0 64 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  d(interp, "sqlit
17ac0 65 33 22 2c 20 28 54 63 6c 5f 4f 62 6a 43 6d 64  e3", (Tcl_ObjCmd
17ad0 50 72 6f 63 2a 29 44 62 4d 61 69 6e 2c 20 30 2c  Proc*)DbMain, 0,
17ae0 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c   0);.#ifndef SQL
17af0 49 54 45 5f 33 5f 53 55 46 46 49 58 5f 4f 4e 4c  ITE_3_SUFFIX_ONL
17b00 59 0a 20 20 20 20 2f 2a 20 54 68 65 20 22 73 71  Y.    /* The "sq
17b10 6c 69 74 65 22 20 61 6c 69 61 73 20 69 73 20 75  lite" alias is u
17b20 6e 64 6f 63 75 6d 65 6e 74 65 64 2e 20 20 49 74  ndocumented.  It
17b30 20 69 73 20 68 65 72 65 20 6f 6e 6c 79 20 74 6f   is here only to
17b40 20 73 75 70 70 6f 72 74 0a 20 20 20 20 2a 2a 20   support.    ** 
17b50 6c 65 67 61 63 79 20 73 63 72 69 70 74 73 2e 20  legacy scripts. 
17b60 20 41 6c 6c 20 6e 65 77 20 73 63 72 69 70 74 73   All new scripts
17b70 20 73 68 6f 75 6c 64 20 75 73 65 20 6f 6e 6c 79   should use only
17b80 20 74 68 65 20 22 73 71 6c 69 74 65 33 22 0a 20   the "sqlite3". 
17b90 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 2a     ** command. *
17ba0 2f 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  /.    Tcl_Create
17bb0 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
17bc0 70 2c 20 22 73 71 6c 69 74 65 22 2c 20 28 54 63  p, "sqlite", (Tc
17bd0 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 2a 29 44 62  l_ObjCmdProc*)Db
17be0 4d 61 69 6e 2c 20 30 2c 20 30 29 3b 0a 23 65 6e  Main, 0, 0);.#en
17bf0 64 69 66 0a 20 20 20 20 72 63 20 3d 20 54 63 6c  dif.    rc = Tcl
17c00 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65  _PkgProvide(inte
17c10 72 70 2c 20 22 73 71 6c 69 74 65 33 22 2c 20 50  rp, "sqlite3", P
17c20 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29 3b  ACKAGE_VERSION);
17c30 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
17c40 3b 0a 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 54  ;.}.EXTERN int T
17c50 63 6c 73 71 6c 69 74 65 33 5f 49 6e 69 74 28 54  clsqlite3_Init(T
17c60 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
17c70 70 29 7b 20 72 65 74 75 72 6e 20 53 71 6c 69 74  p){ return Sqlit
17c80 65 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  e3_Init(interp);
17c90 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 53 71   }.EXTERN int Sq
17ca0 6c 69 74 65 33 5f 55 6e 6c 6f 61 64 28 54 63 6c  lite3_Unload(Tcl
17cb0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
17cc0 20 69 6e 74 20 66 6c 61 67 73 29 7b 20 72 65 74   int flags){ ret
17cd0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 45 58  urn TCL_OK; }.EX
17ce0 54 45 52 4e 20 69 6e 74 20 54 63 6c 73 71 6c 69  TERN int Tclsqli
17cf0 74 65 33 5f 55 6e 6c 6f 61 64 28 54 63 6c 5f 49  te3_Unload(Tcl_I
17d00 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
17d10 6e 74 20 66 6c 61 67 73 29 7b 20 72 65 74 75 72  nt flags){ retur
17d20 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 0a 2f 2a 20  n TCL_OK; }../* 
17d30 42 65 63 61 75 73 65 20 69 74 20 61 63 63 65 73  Because it acces
17d40 73 65 73 20 74 68 65 20 66 69 6c 65 2d 73 79 73  ses the file-sys
17d50 74 65 6d 20 61 6e 64 20 75 73 65 73 20 70 65 72  tem and uses per
17d60 73 69 73 74 65 6e 74 20 73 74 61 74 65 2c 20 53  sistent state, S
17d70 51 4c 69 74 65 0a 2a 2a 20 69 73 20 6e 6f 74 20  QLite.** is not 
17d80 63 6f 6e 73 69 64 65 72 65 64 20 61 70 70 72 6f  considered appro
17d90 70 72 69 61 74 65 20 66 6f 72 20 73 61 66 65 20  priate for safe 
17da0 69 6e 74 65 72 70 72 65 74 65 72 73 2e 20 20 48  interpreters.  H
17db0 65 6e 63 65 2c 20 77 65 20 64 65 6c 69 62 65 72  ence, we deliber
17dc0 61 74 65 6c 79 0a 2a 2a 20 6f 6d 69 74 20 74 68  ately.** omit th
17dd0 65 20 5f 53 61 66 65 49 6e 69 74 28 29 20 69 6e  e _SafeInit() in
17de0 74 65 72 66 61 63 65 73 2e 0a 2a 2f 0a 0a 23 69  terfaces..*/..#i
17df0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 33 5f 53  fndef SQLITE_3_S
17e00 55 46 46 49 58 5f 4f 4e 4c 59 0a 69 6e 74 20 53  UFFIX_ONLY.int S
17e10 71 6c 69 74 65 5f 49 6e 69 74 28 54 63 6c 5f 49  qlite_Init(Tcl_I
17e20 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20  nterp *interp){ 
17e30 72 65 74 75 72 6e 20 53 71 6c 69 74 65 33 5f 49  return Sqlite3_I
17e40 6e 69 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a 69  nit(interp); }.i
17e50 6e 74 20 54 63 6c 73 71 6c 69 74 65 5f 49 6e 69  nt Tclsqlite_Ini
17e60 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  t(Tcl_Interp *in
17e70 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20 53 71  terp){ return Sq
17e80 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74 65 72  lite3_Init(inter
17e90 70 29 3b 20 7d 0a 69 6e 74 20 53 71 6c 69 74 65  p); }.int Sqlite
17ea0 5f 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65  _Unload(Tcl_Inte
17eb0 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
17ec0 66 6c 61 67 73 29 7b 20 72 65 74 75 72 6e 20 54  flags){ return T
17ed0 43 4c 5f 4f 4b 3b 20 7d 0a 69 6e 74 20 54 63 6c  CL_OK; }.int Tcl
17ee0 73 71 6c 69 74 65 5f 55 6e 6c 6f 61 64 28 54 63  sqlite_Unload(Tc
17ef0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
17f00 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 20 72 65  , int flags){ re
17f10 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 23  turn TCL_OK; }.#
17f20 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 54 43  endif..#ifdef TC
17f30 4c 53 48 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  LSH./***********
17f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17f80 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65  **.** All of the
17f90 20 63 6f 64 65 20 74 68 61 74 20 66 6f 6c 6c 6f   code that follo
17fa0 77 73 20 69 73 20 75 73 65 64 20 74 6f 20 62 75  ws is used to bu
17fb0 69 6c 64 20 73 74 61 6e 64 61 6c 6f 6e 65 20 54  ild standalone T
17fc0 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 73 0a  CL interpreters.
17fd0 2a 2a 20 74 68 61 74 20 61 72 65 20 73 74 61 74  ** that are stat
17fe0 69 63 61 6c 6c 79 20 6c 69 6e 6b 65 64 20 77 69  ically linked wi
17ff0 74 68 20 53 51 4c 69 74 65 2e 20 20 45 6e 61 62  th SQLite.  Enab
18000 6c 65 20 74 68 65 73 65 20 62 79 20 63 6f 6d 70  le these by comp
18010 69 6c 69 6e 67 0a 2a 2a 20 77 69 74 68 20 2d 44  iling.** with -D
18020 54 43 4c 53 48 3d 6e 20 77 68 65 72 65 20 6e 20  TCLSH=n where n 
18030 63 61 6e 20 62 65 20 31 20 6f 72 20 32 2e 20 20  can be 1 or 2.  
18040 41 6e 20 6e 20 6f 66 20 31 20 67 65 6e 65 72 61  An n of 1 genera
18050 74 65 73 20 61 20 73 74 61 6e 64 61 72 64 0a 2a  tes a standard.*
18060 2a 20 74 63 6c 73 68 20 62 75 74 20 77 69 74 68  * tclsh but with
18070 20 53 51 4c 69 74 65 20 62 75 69 6c 74 20 69 6e   SQLite built in
18080 2e 20 20 41 6e 20 6e 20 6f 66 20 32 20 67 65 6e  .  An n of 2 gen
18090 65 72 61 74 65 73 20 74 68 65 20 53 51 4c 69 74  erates the SQLit
180a0 65 20 73 70 61 63 65 0a 2a 2a 20 61 6e 61 6c 79  e space.** analy
180b0 73 69 73 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a  sis program..*/.
180c0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
180d0 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66  ITE_TEST) || def
180e0 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 43 4c 4d  ined(SQLITE_TCLM
180f0 44 35 29 0a 2f 2a 0a 20 2a 20 54 68 69 73 20 63  D5)./*. * This c
18100 6f 64 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  ode implements t
18110 68 65 20 4d 44 35 20 6d 65 73 73 61 67 65 2d 64  he MD5 message-d
18120 69 67 65 73 74 20 61 6c 67 6f 72 69 74 68 6d 2e  igest algorithm.
18130 0a 20 2a 20 54 68 65 20 61 6c 67 6f 72 69 74 68  . * The algorith
18140 6d 20 69 73 20 64 75 65 20 74 6f 20 52 6f 6e 20  m is due to Ron 
18150 52 69 76 65 73 74 2e 20 20 54 68 69 73 20 63 6f  Rivest.  This co
18160 64 65 20 77 61 73 0a 20 2a 20 77 72 69 74 74 65  de was. * writte
18170 6e 20 62 79 20 43 6f 6c 69 6e 20 50 6c 75 6d 62  n by Colin Plumb
18180 20 69 6e 20 31 39 39 33 2c 20 6e 6f 20 63 6f 70   in 1993, no cop
18190 79 72 69 67 68 74 20 69 73 20 63 6c 61 69 6d 65  yright is claime
181a0 64 2e 0a 20 2a 20 54 68 69 73 20 63 6f 64 65 20  d.. * This code 
181b0 69 73 20 69 6e 20 74 68 65 20 70 75 62 6c 69 63  is in the public
181c0 20 64 6f 6d 61 69 6e 3b 20 64 6f 20 77 69 74 68   domain; do with
181d0 20 69 74 20 77 68 61 74 20 79 6f 75 20 77 69 73   it what you wis
181e0 68 2e 0a 20 2a 0a 20 2a 20 45 71 75 69 76 61 6c  h.. *. * Equival
181f0 65 6e 74 20 63 6f 64 65 20 69 73 20 61 76 61 69  ent code is avai
18200 6c 61 62 6c 65 20 66 72 6f 6d 20 52 53 41 20 44  lable from RSA D
18210 61 74 61 20 53 65 63 75 72 69 74 79 2c 20 49 6e  ata Security, In
18220 63 2e 0a 20 2a 20 54 68 69 73 20 63 6f 64 65 20  c.. * This code 
18230 68 61 73 20 62 65 65 6e 20 74 65 73 74 65 64 20  has been tested 
18240 61 67 61 69 6e 73 74 20 74 68 61 74 2c 20 61 6e  against that, an
18250 64 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 2c  d is equivalent,
18260 0a 20 2a 20 65 78 63 65 70 74 20 74 68 61 74 20  . * except that 
18270 79 6f 75 20 64 6f 6e 27 74 20 6e 65 65 64 20 74  you don't need t
18280 6f 20 69 6e 63 6c 75 64 65 20 74 77 6f 20 70 61  o include two pa
18290 67 65 73 20 6f 66 20 6c 65 67 61 6c 65 73 65 0a  ges of legalese.
182a0 20 2a 20 77 69 74 68 20 65 76 65 72 79 20 63 6f   * with every co
182b0 70 79 2e 0a 20 2a 0a 20 2a 20 54 6f 20 63 6f 6d  py.. *. * To com
182c0 70 75 74 65 20 74 68 65 20 6d 65 73 73 61 67 65  pute the message
182d0 20 64 69 67 65 73 74 20 6f 66 20 61 20 63 68 75   digest of a chu
182e0 6e 6b 20 6f 66 20 62 79 74 65 73 2c 20 64 65 63  nk of bytes, dec
182f0 6c 61 72 65 20 61 6e 0a 20 2a 20 4d 44 35 43 6f  lare an. * MD5Co
18300 6e 74 65 78 74 20 73 74 72 75 63 74 75 72 65 2c  ntext structure,
18310 20 70 61 73 73 20 69 74 20 74 6f 20 4d 44 35 49   pass it to MD5I
18320 6e 69 74 2c 20 63 61 6c 6c 20 4d 44 35 55 70 64  nit, call MD5Upd
18330 61 74 65 20 61 73 0a 20 2a 20 6e 65 65 64 65 64  ate as. * needed
18340 20 6f 6e 20 62 75 66 66 65 72 73 20 66 75 6c 6c   on buffers full
18350 20 6f 66 20 62 79 74 65 73 2c 20 61 6e 64 20 74   of bytes, and t
18360 68 65 6e 20 63 61 6c 6c 20 4d 44 35 46 69 6e 61  hen call MD5Fina
18370 6c 2c 20 77 68 69 63 68 0a 20 2a 20 77 69 6c 6c  l, which. * will
18380 20 66 69 6c 6c 20 61 20 73 75 70 70 6c 69 65 64   fill a supplied
18390 20 31 36 2d 62 79 74 65 20 61 72 72 61 79 20 77   16-byte array w
183a0 69 74 68 20 74 68 65 20 64 69 67 65 73 74 2e 0a  ith the digest..
183b0 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 49 66 20 63 6f   */../*. * If co
183c0 6d 70 69 6c 65 64 20 6f 6e 20 61 20 6d 61 63 68  mpiled on a mach
183d0 69 6e 65 20 74 68 61 74 20 64 6f 65 73 6e 27 74  ine that doesn't
183e0 20 68 61 76 65 20 61 20 33 32 2d 62 69 74 20 69   have a 32-bit i
183f0 6e 74 65 67 65 72 2c 0a 20 2a 20 79 6f 75 20 6a  nteger,. * you j
18400 75 73 74 20 73 65 74 20 22 75 69 6e 74 33 32 22  ust set "uint32"
18410 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69   to the appropri
18420 61 74 65 20 64 61 74 61 74 79 70 65 20 66 6f 72  ate datatype for
18430 20 61 6e 0a 20 2a 20 75 6e 73 69 67 6e 65 64 20   an. * unsigned 
18440 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 20  32-bit integer. 
18450 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20 2a   For example:. *
18460 0a 20 2a 20 20 20 20 20 20 20 63 63 20 2d 44 75  . *       cc -Du
18470 69 6e 74 33 32 3d 27 75 6e 73 69 67 6e 65 64 20  int32='unsigned 
18480 6c 6f 6e 67 27 20 6d 64 35 2e 63 0a 20 2a 0a 20  long' md5.c. *. 
18490 2a 2f 0a 23 69 66 6e 64 65 66 20 75 69 6e 74 33  */.#ifndef uint3
184a0 32 0a 23 20 20 64 65 66 69 6e 65 20 75 69 6e 74  2.#  define uint
184b0 33 32 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 0a  32 unsigned int.
184c0 23 65 6e 64 69 66 0a 0a 73 74 72 75 63 74 20 4d  #endif..struct M
184d0 44 35 43 6f 6e 74 65 78 74 20 7b 0a 20 20 69 6e  D5Context {.  in
184e0 74 20 69 73 49 6e 69 74 3b 0a 20 20 75 69 6e 74  t isInit;.  uint
184f0 33 32 20 62 75 66 5b 34 5d 3b 0a 20 20 75 69 6e  32 buf[4];.  uin
18500 74 33 32 20 62 69 74 73 5b 32 5d 3b 0a 20 20 75  t32 bits[2];.  u
18510 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e 5b  nsigned char in[
18520 36 34 5d 3b 0a 7d 3b 0a 74 79 70 65 64 65 66 20  64];.};.typedef 
18530 73 74 72 75 63 74 20 4d 44 35 43 6f 6e 74 65 78  struct MD5Contex
18540 74 20 4d 44 35 43 6f 6e 74 65 78 74 3b 0a 0a 2f  t MD5Context;../
18550 2a 0a 20 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20  *. * Note: this 
18560 63 6f 64 65 20 69 73 20 68 61 72 6d 6c 65 73 73  code is harmless
18570 20 6f 6e 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61   on little-endia
18580 6e 20 6d 61 63 68 69 6e 65 73 2e 0a 20 2a 2f 0a  n machines.. */.
18590 73 74 61 74 69 63 20 76 6f 69 64 20 62 79 74 65  static void byte
185a0 52 65 76 65 72 73 65 20 28 75 6e 73 69 67 6e 65  Reverse (unsigne
185b0 64 20 63 68 61 72 20 2a 62 75 66 2c 20 75 6e 73  d char *buf, uns
185c0 69 67 6e 65 64 20 6c 6f 6e 67 73 29 7b 0a 20 20  igned longs){.  
185d0 20 20 20 20 20 20 75 69 6e 74 33 32 20 74 3b 0a        uint32 t;.
185e0 20 20 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20          do {.   
185f0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 20 3d               t =
18600 20 28 75 69 6e 74 33 32 29 28 28 75 6e 73 69 67   (uint32)((unsig
18610 6e 65 64 29 62 75 66 5b 33 5d 3c 3c 38 20 7c 20  ned)buf[3]<<8 | 
18620 62 75 66 5b 32 5d 29 20 3c 3c 20 31 36 20 7c 0a  buf[2]) << 16 |.
18630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18640 20 20 20 20 20 20 20 20 20 20 20 20 28 28 75 6e              ((un
18650 73 69 67 6e 65 64 29 62 75 66 5b 31 5d 3c 3c 38  signed)buf[1]<<8
18660 20 7c 20 62 75 66 5b 30 5d 29 3b 0a 20 20 20 20   | buf[0]);.    
18670 20 20 20 20 20 20 20 20 20 20 20 20 2a 28 75 69              *(ui
18680 6e 74 33 32 20 2a 29 62 75 66 20 3d 20 74 3b 0a  nt32 *)buf = t;.
18690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
186a0 62 75 66 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20  buf += 4;.      
186b0 20 20 7d 20 77 68 69 6c 65 20 28 2d 2d 6c 6f 6e    } while (--lon
186c0 67 73 29 3b 0a 7d 0a 2f 2a 20 54 68 65 20 66 6f  gs);.}./* The fo
186d0 75 72 20 63 6f 72 65 20 66 75 6e 63 74 69 6f 6e  ur core function
186e0 73 20 2d 20 46 31 20 69 73 20 6f 70 74 69 6d 69  s - F1 is optimi
186f0 7a 65 64 20 73 6f 6d 65 77 68 61 74 20 2a 2f 0a  zed somewhat */.
18700 0a 2f 2a 20 23 64 65 66 69 6e 65 20 46 31 28 78  ./* #define F1(x
18710 2c 20 79 2c 20 7a 29 20 28 78 20 26 20 79 20 7c  , y, z) (x & y |
18720 20 7e 78 20 26 20 7a 29 20 2a 2f 0a 23 64 65 66   ~x & z) */.#def
18730 69 6e 65 20 46 31 28 78 2c 20 79 2c 20 7a 29 20  ine F1(x, y, z) 
18740 28 7a 20 5e 20 28 78 20 26 20 28 79 20 5e 20 7a  (z ^ (x & (y ^ z
18750 29 29 29 0a 23 64 65 66 69 6e 65 20 46 32 28 78  ))).#define F2(x
18760 2c 20 79 2c 20 7a 29 20 46 31 28 7a 2c 20 78 2c  , y, z) F1(z, x,
18770 20 79 29 0a 23 64 65 66 69 6e 65 20 46 33 28 78   y).#define F3(x
18780 2c 20 79 2c 20 7a 29 20 28 78 20 5e 20 79 20 5e  , y, z) (x ^ y ^
18790 20 7a 29 0a 23 64 65 66 69 6e 65 20 46 34 28 78   z).#define F4(x
187a0 2c 20 79 2c 20 7a 29 20 28 79 20 5e 20 28 78 20  , y, z) (y ^ (x 
187b0 7c 20 7e 7a 29 29 0a 0a 2f 2a 20 54 68 69 73 20  | ~z))../* This 
187c0 69 73 20 74 68 65 20 63 65 6e 74 72 61 6c 20 73  is the central s
187d0 74 65 70 20 69 6e 20 74 68 65 20 4d 44 35 20 61  tep in the MD5 a
187e0 6c 67 6f 72 69 74 68 6d 2e 20 2a 2f 0a 23 64 65  lgorithm. */.#de
187f0 66 69 6e 65 20 4d 44 35 53 54 45 50 28 66 2c 20  fine MD5STEP(f, 
18800 77 2c 20 78 2c 20 79 2c 20 7a 2c 20 64 61 74 61  w, x, y, z, data
18810 2c 20 73 29 20 5c 0a 20 20 20 20 20 20 20 20 28  , s) \.        (
18820 20 77 20 2b 3d 20 66 28 78 2c 20 79 2c 20 7a 29   w += f(x, y, z)
18830 20 2b 20 64 61 74 61 2c 20 20 77 20 3d 20 77 3c   + data,  w = w<
18840 3c 73 20 7c 20 77 3e 3e 28 33 32 2d 73 29 2c 20  <s | w>>(32-s), 
18850 20 77 20 2b 3d 20 78 20 29 0a 0a 2f 2a 0a 20 2a   w += x )../*. *
18860 20 54 68 65 20 63 6f 72 65 20 6f 66 20 74 68 65   The core of the
18870 20 4d 44 35 20 61 6c 67 6f 72 69 74 68 6d 2c 20   MD5 algorithm, 
18880 74 68 69 73 20 61 6c 74 65 72 73 20 61 6e 20 65  this alters an e
18890 78 69 73 74 69 6e 67 20 4d 44 35 20 68 61 73 68  xisting MD5 hash
188a0 20 74 6f 0a 20 2a 20 72 65 66 6c 65 63 74 20 74   to. * reflect t
188b0 68 65 20 61 64 64 69 74 69 6f 6e 20 6f 66 20 31  he addition of 1
188c0 36 20 6c 6f 6e 67 77 6f 72 64 73 20 6f 66 20 6e  6 longwords of n
188d0 65 77 20 64 61 74 61 2e 20 20 4d 44 35 55 70 64  ew data.  MD5Upd
188e0 61 74 65 20 62 6c 6f 63 6b 73 0a 20 2a 20 74 68  ate blocks. * th
188f0 65 20 64 61 74 61 20 61 6e 64 20 63 6f 6e 76 65  e data and conve
18900 72 74 73 20 62 79 74 65 73 20 69 6e 74 6f 20 6c  rts bytes into l
18910 6f 6e 67 77 6f 72 64 73 20 66 6f 72 20 74 68 69  ongwords for thi
18920 73 20 72 6f 75 74 69 6e 65 2e 0a 20 2a 2f 0a 73  s routine.. */.s
18930 74 61 74 69 63 20 76 6f 69 64 20 4d 44 35 54 72  tatic void MD5Tr
18940 61 6e 73 66 6f 72 6d 28 75 69 6e 74 33 32 20 62  ansform(uint32 b
18950 75 66 5b 34 5d 2c 20 63 6f 6e 73 74 20 75 69 6e  uf[4], const uin
18960 74 33 32 20 69 6e 5b 31 36 5d 29 7b 0a 20 20 20  t32 in[16]){.   
18970 20 20 20 20 20 72 65 67 69 73 74 65 72 20 75 69       register ui
18980 6e 74 33 32 20 61 2c 20 62 2c 20 63 2c 20 64 3b  nt32 a, b, c, d;
18990 0a 0a 20 20 20 20 20 20 20 20 61 20 3d 20 62 75  ..        a = bu
189a0 66 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 62 20  f[0];.        b 
189b0 3d 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20  = buf[1];.      
189c0 20 20 63 20 3d 20 62 75 66 5b 32 5d 3b 0a 20 20    c = buf[2];.  
189d0 20 20 20 20 20 20 64 20 3d 20 62 75 66 5b 33 5d        d = buf[3]
189e0 3b 0a 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  ;..        MD5ST
189f0 45 50 28 46 31 2c 20 61 2c 20 62 2c 20 63 2c 20  EP(F1, a, b, c, 
18a00 64 2c 20 69 6e 5b 20 30 5d 2b 30 78 64 37 36 61  d, in[ 0]+0xd76a
18a10 61 34 37 38 2c 20 20 37 29 3b 0a 20 20 20 20 20  a478,  7);.     
18a20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 64     MD5STEP(F1, d
18a30 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20 31  , a, b, c, in[ 1
18a40 5d 2b 30 78 65 38 63 37 62 37 35 36 2c 20 31 32  ]+0xe8c7b756, 12
18a50 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
18a60 45 50 28 46 31 2c 20 63 2c 20 64 2c 20 61 2c 20  EP(F1, c, d, a, 
18a70 62 2c 20 69 6e 5b 20 32 5d 2b 30 78 32 34 32 30  b, in[ 2]+0x2420
18a80 37 30 64 62 2c 20 31 37 29 3b 0a 20 20 20 20 20  70db, 17);.     
18a90 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 62     MD5STEP(F1, b
18aa0 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 20 33  , c, d, a, in[ 3
18ab0 5d 2b 30 78 63 31 62 64 63 65 65 65 2c 20 32 32  ]+0xc1bdceee, 22
18ac0 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
18ad0 45 50 28 46 31 2c 20 61 2c 20 62 2c 20 63 2c 20  EP(F1, a, b, c, 
18ae0 64 2c 20 69 6e 5b 20 34 5d 2b 30 78 66 35 37 63  d, in[ 4]+0xf57c
18af0 30 66 61 66 2c 20 20 37 29 3b 0a 20 20 20 20 20  0faf,  7);.     
18b00 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 64     MD5STEP(F1, d
18b10 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20 35  , a, b, c, in[ 5
18b20 5d 2b 30 78 34 37 38 37 63 36 32 61 2c 20 31 32  ]+0x4787c62a, 12
18b30 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
18b40 45 50 28 46 31 2c 20 63 2c 20 64 2c 20 61 2c 20  EP(F1, c, d, a, 
18b50 62 2c 20 69 6e 5b 20 36 5d 2b 30 78 61 38 33 30  b, in[ 6]+0xa830
18b60 34 36 31 33 2c 20 31 37 29 3b 0a 20 20 20 20 20  4613, 17);.     
18b70 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 62     MD5STEP(F1, b
18b80 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 20 37  , c, d, a, in[ 7
18b90 5d 2b 30 78 66 64 34 36 39 35 30 31 2c 20 32 32  ]+0xfd469501, 22
18ba0 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
18bb0 45 50 28 46 31 2c 20 61 2c 20 62 2c 20 63 2c 20  EP(F1, a, b, c, 
18bc0 64 2c 20 69 6e 5b 20 38 5d 2b 30 78 36 39 38 30  d, in[ 8]+0x6980
18bd0 39 38 64 38 2c 20 20 37 29 3b 0a 20 20 20 20 20  98d8,  7);.     
18be0 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 64     MD5STEP(F1, d
18bf0 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20 39  , a, b, c, in[ 9
18c00 5d 2b 30 78 38 62 34 34 66 37 61 66 2c 20 31 32  ]+0x8b44f7af, 12
18c10 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
18c20 45 50 28 46 31 2c 20 63 2c 20 64 2c 20 61 2c 20  EP(F1, c, d, a, 
18c30 62 2c 20 69 6e 5b 31 30 5d 2b 30 78 66 66 66 66  b, in[10]+0xffff
18c40 35 62 62 31 2c 20 31 37 29 3b 0a 20 20 20 20 20  5bb1, 17);.     
18c50 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 62     MD5STEP(F1, b
18c60 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 31 31  , c, d, a, in[11
18c70 5d 2b 30 78 38 39 35 63 64 37 62 65 2c 20 32 32  ]+0x895cd7be, 22
18c80 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
18c90 45 50 28 46 31 2c 20 61 2c 20 62 2c 20 63 2c 20  EP(F1, a, b, c, 
18ca0 64 2c 20 69 6e 5b 31 32 5d 2b 30 78 36 62 39 30  d, in[12]+0x6b90
18cb0 31 31 32 32 2c 20 20 37 29 3b 0a 20 20 20 20 20  1122,  7);.     
18cc0 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 64     MD5STEP(F1, d
18cd0 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 31 33  , a, b, c, in[13
18ce0 5d 2b 30 78 66 64 39 38 37 31 39 33 2c 20 31 32  ]+0xfd987193, 12
18cf0 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
18d00 45 50 28 46 31 2c 20 63 2c 20 64 2c 20 61 2c 20  EP(F1, c, d, a, 
18d10 62 2c 20 69 6e 5b 31 34 5d 2b 30 78 61 36 37 39  b, in[14]+0xa679
18d20 34 33 38 65 2c 20 31 37 29 3b 0a 20 20 20 20 20  438e, 17);.     
18d30 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 62     MD5STEP(F1, b
18d40 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 31 35  , c, d, a, in[15
18d50 5d 2b 30 78 34 39 62 34 30 38 32 31 2c 20 32 32  ]+0x49b40821, 22
18d60 29 3b 0a 0a 20 20 20 20 20 20 20 20 4d 44 35 53  );..        MD5S
18d70 54 45 50 28 46 32 2c 20 61 2c 20 62 2c 20 63 2c  TEP(F2, a, b, c,
18d80 20 64 2c 20 69 6e 5b 20 31 5d 2b 30 78 66 36 31   d, in[ 1]+0xf61
18d90 65 32 35 36 32 2c 20 20 35 29 3b 0a 20 20 20 20  e2562,  5);.    
18da0 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20      MD5STEP(F2, 
18db0 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20  d, a, b, c, in[ 
18dc0 36 5d 2b 30 78 63 30 34 30 62 33 34 30 2c 20 20  6]+0xc040b340,  
18dd0 39 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  9);.        MD5S
18de0 54 45 50 28 46 32 2c 20 63 2c 20 64 2c 20 61 2c  TEP(F2, c, d, a,
18df0 20 62 2c 20 69 6e 5b 31 31 5d 2b 30 78 32 36 35   b, in[11]+0x265
18e00 65 35 61 35 31 2c 20 31 34 29 3b 0a 20 20 20 20  e5a51, 14);.    
18e10 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20      MD5STEP(F2, 
18e20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 20  b, c, d, a, in[ 
18e30 30 5d 2b 30 78 65 39 62 36 63 37 61 61 2c 20 32  0]+0xe9b6c7aa, 2
18e40 30 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  0);.        MD5S
18e50 54 45 50 28 46 32 2c 20 61 2c 20 62 2c 20 63 2c  TEP(F2, a, b, c,
18e60 20 64 2c 20 69 6e 5b 20 35 5d 2b 30 78 64 36 32   d, in[ 5]+0xd62
18e70 66 31 30 35 64 2c 20 20 35 29 3b 0a 20 20 20 20  f105d,  5);.    
18e80 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20      MD5STEP(F2, 
18e90 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 31  d, a, b, c, in[1
18ea0 30 5d 2b 30 78 30 32 34 34 31 34 35 33 2c 20 20  0]+0x02441453,  
18eb0 39 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  9);.        MD5S
18ec0 54 45 50 28 46 32 2c 20 63 2c 20 64 2c 20 61 2c  TEP(F2, c, d, a,
18ed0 20 62 2c 20 69 6e 5b 31 35 5d 2b 30 78 64 38 61   b, in[15]+0xd8a
18ee0 31 65 36 38 31 2c 20 31 34 29 3b 0a 20 20 20 20  1e681, 14);.    
18ef0 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20      MD5STEP(F2, 
18f00 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 20  b, c, d, a, in[ 
18f10 34 5d 2b 30 78 65 37 64 33 66 62 63 38 2c 20 32  4]+0xe7d3fbc8, 2
18f20 30 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  0);.        MD5S
18f30 54 45 50 28 46 32 2c 20 61 2c 20 62 2c 20 63 2c  TEP(F2, a, b, c,
18f40 20 64 2c 20 69 6e 5b 20 39 5d 2b 30 78 32 31 65   d, in[ 9]+0x21e
18f50 31 63 64 65 36 2c 20 20 35 29 3b 0a 20 20 20 20  1cde6,  5);.    
18f60 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20      MD5STEP(F2, 
18f70 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 31  d, a, b, c, in[1
18f80 34 5d 2b 30 78 63 33 33 37 30 37 64 36 2c 20 20  4]+0xc33707d6,  
18f90 39 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  9);.        MD5S
18fa0 54 45 50 28 46 32 2c 20 63 2c 20 64 2c 20 61 2c  TEP(F2, c, d, a,
18fb0 20 62 2c 20 69 6e 5b 20 33 5d 2b 30 78 66 34 64   b, in[ 3]+0xf4d
18fc0 35 30 64 38 37 2c 20 31 34 29 3b 0a 20 20 20 20  50d87, 14);.    
18fd0 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20      MD5STEP(F2, 
18fe0 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 20  b, c, d, a, in[ 
18ff0 38 5d 2b 30 78 34 35 35 61 31 34 65 64 2c 20 32  8]+0x455a14ed, 2
19000 30 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  0);.        MD5S
19010 54 45 50 28 46 32 2c 20 61 2c 20 62 2c 20 63 2c  TEP(F2, a, b, c,
19020 20 64 2c 20 69 6e 5b 31 33 5d 2b 30 78 61 39 65   d, in[13]+0xa9e
19030 33 65 39 30 35 2c 20 20 35 29 3b 0a 20 20 20 20  3e905,  5);.    
19040 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20      MD5STEP(F2, 
19050 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20  d, a, b, c, in[ 
19060 32 5d 2b 30 78 66 63 65 66 61 33 66 38 2c 20 20  2]+0xfcefa3f8,  
19070 39 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  9);.        MD5S
19080 54 45 50 28 46 32 2c 20 63 2c 20 64 2c 20 61 2c  TEP(F2, c, d, a,
19090 20 62 2c 20 69 6e 5b 20 37 5d 2b 30 78 36 37 36   b, in[ 7]+0x676
190a0 66 30 32 64 39 2c 20 31 34 29 3b 0a 20 20 20 20  f02d9, 14);.    
190b0 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20      MD5STEP(F2, 
190c0 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 31  b, c, d, a, in[1
190d0 32 5d 2b 30 78 38 64 32 61 34 63 38 61 2c 20 32  2]+0x8d2a4c8a, 2
190e0 30 29 3b 0a 0a 20 20 20 20 20 20 20 20 4d 44 35  0);..        MD5
190f0 53 54 45 50 28 46 33 2c 20 61 2c 20 62 2c 20 63  STEP(F3, a, b, c
19100 2c 20 64 2c 20 69 6e 5b 20 35 5d 2b 30 78 66 66  , d, in[ 5]+0xff
19110 66 61 33 39 34 32 2c 20 20 34 29 3b 0a 20 20 20  fa3942,  4);.   
19120 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c       MD5STEP(F3,
19130 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b   d, a, b, c, in[
19140 20 38 5d 2b 30 78 38 37 37 31 66 36 38 31 2c 20   8]+0x8771f681, 
19150 31 31 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  11);.        MD5
19160 53 54 45 50 28 46 33 2c 20 63 2c 20 64 2c 20 61  STEP(F3, c, d, a
19170 2c 20 62 2c 20 69 6e 5b 31 31 5d 2b 30 78 36 64  , b, in[11]+0x6d
19180 39 64 36 31 32 32 2c 20 31 36 29 3b 0a 20 20 20  9d6122, 16);.   
19190 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c       MD5STEP(F3,
191a0 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b   b, c, d, a, in[
191b0 31 34 5d 2b 30 78 66 64 65 35 33 38 30 63 2c 20  14]+0xfde5380c, 
191c0 32 33 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  23);.        MD5
191d0 53 54 45 50 28 46 33 2c 20 61 2c 20 62 2c 20 63  STEP(F3, a, b, c
191e0 2c 20 64 2c 20 69 6e 5b 20 31 5d 2b 30 78 61 34  , d, in[ 1]+0xa4
191f0 62 65 65 61 34 34 2c 20 20 34 29 3b 0a 20 20 20  beea44,  4);.   
19200 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c       MD5STEP(F3,
19210 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b   d, a, b, c, in[
19220 20 34 5d 2b 30 78 34 62 64 65 63 66 61 39 2c 20   4]+0x4bdecfa9, 
19230 31 31 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  11);.        MD5
19240 53 54 45 50 28 46 33 2c 20 63 2c 20 64 2c 20 61  STEP(F3, c, d, a
19250 2c 20 62 2c 20 69 6e 5b 20 37 5d 2b 30 78 66 36  , b, in[ 7]+0xf6
19260 62 62 34 62 36 30 2c 20 31 36 29 3b 0a 20 20 20  bb4b60, 16);.   
19270 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c       MD5STEP(F3,
19280 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b   b, c, d, a, in[
19290 31 30 5d 2b 30 78 62 65 62 66 62 63 37 30 2c 20  10]+0xbebfbc70, 
192a0 32 33 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  23);.        MD5
192b0 53 54 45 50 28 46 33 2c 20 61 2c 20 62 2c 20 63  STEP(F3, a, b, c
192c0 2c 20 64 2c 20 69 6e 5b 31 33 5d 2b 30 78 32 38  , d, in[13]+0x28
192d0 39 62 37 65 63 36 2c 20 20 34 29 3b 0a 20 20 20  9b7ec6,  4);.   
192e0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c       MD5STEP(F3,
192f0 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b   d, a, b, c, in[
19300 20 30 5d 2b 30 78 65 61 61 31 32 37 66 61 2c 20   0]+0xeaa127fa, 
19310 31 31 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  11);.        MD5
19320 53 54 45 50 28 46 33 2c 20 63 2c 20 64 2c 20 61  STEP(F3, c, d, a
19330 2c 20 62 2c 20 69 6e 5b 20 33 5d 2b 30 78 64 34  , b, in[ 3]+0xd4
19340 65 66 33 30 38 35 2c 20 31 36 29 3b 0a 20 20 20  ef3085, 16);.   
19350 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c       MD5STEP(F3,
19360 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b   b, c, d, a, in[
19370 20 36 5d 2b 30 78 30 34 38 38 31 64 30 35 2c 20   6]+0x04881d05, 
19380 32 33 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  23);.        MD5
19390 53 54 45 50 28 46 33 2c 20 61 2c 20 62 2c 20 63  STEP(F3, a, b, c
193a0 2c 20 64 2c 20 69 6e 5b 20 39 5d 2b 30 78 64 39  , d, in[ 9]+0xd9
193b0 64 34 64 30 33 39 2c 20 20 34 29 3b 0a 20 20 20  d4d039,  4);.   
193c0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c       MD5STEP(F3,
193d0 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b   d, a, b, c, in[
193e0 31 32 5d 2b 30 78 65 36 64 62 39 39 65 35 2c 20  12]+0xe6db99e5, 
193f0 31 31 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  11);.        MD5
19400 53 54 45 50 28 46 33 2c 20 63 2c 20 64 2c 20 61  STEP(F3, c, d, a
19410 2c 20 62 2c 20 69 6e 5b 31 35 5d 2b 30 78 31 66  , b, in[15]+0x1f
19420 61 32 37 63 66 38 2c 20 31 36 29 3b 0a 20 20 20  a27cf8, 16);.   
19430 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c       MD5STEP(F3,
19440 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b   b, c, d, a, in[
19450 20 32 5d 2b 30 78 63 34 61 63 35 36 36 35 2c 20   2]+0xc4ac5665, 
19460 32 33 29 3b 0a 0a 20 20 20 20 20 20 20 20 4d 44  23);..        MD
19470 35 53 54 45 50 28 46 34 2c 20 61 2c 20 62 2c 20  5STEP(F4, a, b, 
19480 63 2c 20 64 2c 20 69 6e 5b 20 30 5d 2b 30 78 66  c, d, in[ 0]+0xf
19490 34 32 39 32 32 34 34 2c 20 20 36 29 3b 0a 20 20  4292244,  6);.  
194a0 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34        MD5STEP(F4
194b0 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e  , d, a, b, c, in
194c0 5b 20 37 5d 2b 30 78 34 33 32 61 66 66 39 37 2c  [ 7]+0x432aff97,
194d0 20 31 30 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   10);.        MD
194e0 35 53 54 45 50 28 46 34 2c 20 63 2c 20 64 2c 20  5STEP(F4, c, d, 
194f0 61 2c 20 62 2c 20 69 6e 5b 31 34 5d 2b 30 78 61  a, b, in[14]+0xa
19500 62 39 34 32 33 61 37 2c 20 31 35 29 3b 0a 20 20  b9423a7, 15);.  
19510 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34        MD5STEP(F4
19520 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
19530 5b 20 35 5d 2b 30 78 66 63 39 33 61 30 33 39 2c  [ 5]+0xfc93a039,
19540 20 32 31 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   21);.        MD
19550 35 53 54 45 50 28 46 34 2c 20 61 2c 20 62 2c 20  5STEP(F4, a, b, 
19560 63 2c 20 64 2c 20 69 6e 5b 31 32 5d 2b 30 78 36  c, d, in[12]+0x6
19570 35 35 62 35 39 63 33 2c 20 20 36 29 3b 0a 20 20  55b59c3,  6);.  
19580 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34        MD5STEP(F4
19590 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e  , d, a, b, c, in
195a0 5b 20 33 5d 2b 30 78 38 66 30 63 63 63 39 32 2c  [ 3]+0x8f0ccc92,
195b0 20 31 30 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   10);.        MD
195c0 35 53 54 45 50 28 46 34 2c 20 63 2c 20 64 2c 20  5STEP(F4, c, d, 
195d0 61 2c 20 62 2c 20 69 6e 5b 31 30 5d 2b 30 78 66  a, b, in[10]+0xf
195e0 66 65 66 66 34 37 64 2c 20 31 35 29 3b 0a 20 20  feff47d, 15);.  
195f0 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34        MD5STEP(F4
19600 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
19610 5b 20 31 5d 2b 30 78 38 35 38 34 35 64 64 31 2c  [ 1]+0x85845dd1,
19620 20 32 31 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   21);.        MD
19630 35 53 54 45 50 28 46 34 2c 20 61 2c 20 62 2c 20  5STEP(F4, a, b, 
19640 63 2c 20 64 2c 20 69 6e 5b 20 38 5d 2b 30 78 36  c, d, in[ 8]+0x6
19650 66 61 38 37 65 34 66 2c 20 20 36 29 3b 0a 20 20  fa87e4f,  6);.  
19660 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34        MD5STEP(F4
19670 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e  , d, a, b, c, in
19680 5b 31 35 5d 2b 30 78 66 65 32 63 65 36 65 30 2c  [15]+0xfe2ce6e0,
19690 20 31 30 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   10);.        MD
196a0 35 53 54 45 50 28 46 34 2c 20 63 2c 20 64 2c 20  5STEP(F4, c, d, 
196b0 61 2c 20 62 2c 20 69 6e 5b 20 36 5d 2b 30 78 61  a, b, in[ 6]+0xa
196c0 33 30 31 34 33 31 34 2c 20 31 35 29 3b 0a 20 20  3014314, 15);.  
196d0 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34        MD5STEP(F4
196e0 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
196f0 5b 31 33 5d 2b 30 78 34 65 30 38 31 31 61 31 2c  [13]+0x4e0811a1,
19700 20 32 31 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   21);.        MD
19710 35 53 54 45 50 28 46 34 2c 20 61 2c 20 62 2c 20  5STEP(F4, a, b, 
19720 63 2c 20 64 2c 20 69 6e 5b 20 34 5d 2b 30 78 66  c, d, in[ 4]+0xf
19730 37 35 33 37 65 38 32 2c 20 20 36 29 3b 0a 20 20  7537e82,  6);.  
19740 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34        MD5STEP(F4
19750 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e  , d, a, b, c, in
19760 5b 31 31 5d 2b 30 78 62 64 33 61 66 32 33 35 2c  [11]+0xbd3af235,
19770 20 31 30 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   10);.        MD
19780 35 53 54 45 50 28 46 34 2c 20 63 2c 20 64 2c 20  5STEP(F4, c, d, 
19790 61 2c 20 62 2c 20 69 6e 5b 20 32 5d 2b 30 78 32  a, b, in[ 2]+0x2
197a0 61 64 37 64 32 62 62 2c 20 31 35 29 3b 0a 20 20  ad7d2bb, 15);.  
197b0 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34        MD5STEP(F4
197c0 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
197d0 5b 20 39 5d 2b 30 78 65 62 38 36 64 33 39 31 2c  [ 9]+0xeb86d391,
197e0 20 32 31 29 3b 0a 0a 20 20 20 20 20 20 20 20 62   21);..        b
197f0 75 66 5b 30 5d 20 2b 3d 20 61 3b 0a 20 20 20 20  uf[0] += a;.    
19800 20 20 20 20 62 75 66 5b 31 5d 20 2b 3d 20 62 3b      buf[1] += b;
19810 0a 20 20 20 20 20 20 20 20 62 75 66 5b 32 5d 20  .        buf[2] 
19820 2b 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 62 75  += c;.        bu
19830 66 5b 33 5d 20 2b 3d 20 64 3b 0a 7d 0a 0a 2f 2a  f[3] += d;.}../*
19840 0a 20 2a 20 53 74 61 72 74 20 4d 44 35 20 61 63  . * Start MD5 ac
19850 63 75 6d 75 6c 61 74 69 6f 6e 2e 20 20 53 65 74  cumulation.  Set
19860 20 62 69 74 20 63 6f 75 6e 74 20 74 6f 20 30 20   bit count to 0 
19870 61 6e 64 20 62 75 66 66 65 72 20 74 6f 20 6d 79  and buffer to my
19880 73 74 65 72 69 6f 75 73 0a 20 2a 20 69 6e 69 74  sterious. * init
19890 69 61 6c 69 7a 61 74 69 6f 6e 20 63 6f 6e 73 74  ialization const
198a0 61 6e 74 73 2e 0a 20 2a 2f 0a 73 74 61 74 69 63  ants.. */.static
198b0 20 76 6f 69 64 20 4d 44 35 49 6e 69 74 28 4d 44   void MD5Init(MD
198c0 35 43 6f 6e 74 65 78 74 20 2a 63 74 78 29 7b 0a  5Context *ctx){.
198d0 20 20 20 20 20 20 20 20 63 74 78 2d 3e 69 73 49          ctx->isI
198e0 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  nit = 1;.       
198f0 20 63 74 78 2d 3e 62 75 66 5b 30 5d 20 3d 20 30   ctx->buf[0] = 0
19900 78 36 37 34 35 32 33 30 31 3b 0a 20 20 20 20 20  x67452301;.     
19910 20 20 20 63 74 78 2d 3e 62 75 66 5b 31 5d 20 3d     ctx->buf[1] =
19920 20 30 78 65 66 63 64 61 62 38 39 3b 0a 20 20 20   0xefcdab89;.   
19930 20 20 20 20 20 63 74 78 2d 3e 62 75 66 5b 32 5d       ctx->buf[2]
19940 20 3d 20 30 78 39 38 62 61 64 63 66 65 3b 0a 20   = 0x98badcfe;. 
19950 20 20 20 20 20 20 20 63 74 78 2d 3e 62 75 66 5b         ctx->buf[
19960 33 5d 20 3d 20 30 78 31 30 33 32 35 34 37 36 3b  3] = 0x10325476;
19970 0a 20 20 20 20 20 20 20 20 63 74 78 2d 3e 62 69  .        ctx->bi
19980 74 73 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20  ts[0] = 0;.     
19990 20 20 20 63 74 78 2d 3e 62 69 74 73 5b 31 5d 20     ctx->bits[1] 
199a0 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 55 70  = 0;.}../*. * Up
199b0 64 61 74 65 20 63 6f 6e 74 65 78 74 20 74 6f 20  date context to 
199c0 72 65 66 6c 65 63 74 20 74 68 65 20 63 6f 6e 63  reflect the conc
199d0 61 74 65 6e 61 74 69 6f 6e 20 6f 66 20 61 6e 6f  atenation of ano
199e0 74 68 65 72 20 62 75 66 66 65 72 20 66 75 6c 6c  ther buffer full
199f0 0a 20 2a 20 6f 66 20 62 79 74 65 73 2e 0a 20 2a  . * of bytes.. *
19a00 2f 0a 73 74 61 74 69 63 20 0a 76 6f 69 64 20 4d  /.static .void M
19a10 44 35 55 70 64 61 74 65 28 4d 44 35 43 6f 6e 74  D5Update(MD5Cont
19a20 65 78 74 20 2a 63 74 78 2c 20 63 6f 6e 73 74 20  ext *ctx, const 
19a30 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62  unsigned char *b
19a40 75 66 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  uf, unsigned int
19a50 20 6c 65 6e 29 7b 0a 20 20 20 20 20 20 20 20 75   len){.        u
19a60 69 6e 74 33 32 20 74 3b 0a 0a 20 20 20 20 20 20  int32 t;..      
19a70 20 20 2f 2a 20 55 70 64 61 74 65 20 62 69 74 63    /* Update bitc
19a80 6f 75 6e 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20  ount */..       
19a90 20 74 20 3d 20 63 74 78 2d 3e 62 69 74 73 5b 30   t = ctx->bits[0
19aa0 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28 28  ];.        if ((
19ab0 63 74 78 2d 3e 62 69 74 73 5b 30 5d 20 3d 20 74  ctx->bits[0] = t
19ac0 20 2b 20 28 28 75 69 6e 74 33 32 29 6c 65 6e 20   + ((uint32)len 
19ad0 3c 3c 20 33 29 29 20 3c 20 74 29 0a 20 20 20 20  << 3)) < t).    
19ae0 20 20 20 20 20 20 20 20 20 20 20 20 63 74 78 2d              ctx-
19af0 3e 62 69 74 73 5b 31 5d 2b 2b 3b 20 2f 2a 20 43  >bits[1]++; /* C
19b00 61 72 72 79 20 66 72 6f 6d 20 6c 6f 77 20 74 6f  arry from low to
19b10 20 68 69 67 68 20 2a 2f 0a 20 20 20 20 20 20 20   high */.       
19b20 20 63 74 78 2d 3e 62 69 74 73 5b 31 5d 20 2b 3d   ctx->bits[1] +=
19b30 20 6c 65 6e 20 3e 3e 20 32 39 3b 0a 0a 20 20 20   len >> 29;..   
19b40 20 20 20 20 20 74 20 3d 20 28 74 20 3e 3e 20 33       t = (t >> 3
19b50 29 20 26 20 30 78 33 66 3b 20 20 20 20 2f 2a 20  ) & 0x3f;    /* 
19b60 42 79 74 65 73 20 61 6c 72 65 61 64 79 20 69 6e  Bytes already in
19b70 20 73 68 73 49 6e 66 6f 2d 3e 64 61 74 61 20 2a   shsInfo->data *
19b80 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 48 61  /..        /* Ha
19b90 6e 64 6c 65 20 61 6e 79 20 6c 65 61 64 69 6e 67  ndle any leading
19ba0 20 6f 64 64 2d 73 69 7a 65 64 20 63 68 75 6e 6b   odd-sized chunk
19bb0 73 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 69 66  s */..        if
19bc0 20 28 20 74 20 29 20 7b 0a 20 20 20 20 20 20 20   ( t ) {.       
19bd0 20 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65           unsigne
19be0 64 20 63 68 61 72 20 2a 70 20 3d 20 28 75 6e 73  d char *p = (uns
19bf0 69 67 6e 65 64 20 63 68 61 72 20 2a 29 63 74 78  igned char *)ctx
19c00 2d 3e 69 6e 20 2b 20 74 3b 0a 0a 20 20 20 20 20  ->in + t;..     
19c10 20 20 20 20 20 20 20 20 20 20 20 74 20 3d 20 36             t = 6
19c20 34 2d 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  4-t;.           
19c30 20 20 20 20 20 69 66 20 28 6c 65 6e 20 3c 20 74       if (len < t
19c40 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
19c50 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
19c60 70 79 28 70 2c 20 62 75 66 2c 20 6c 65 6e 29 3b  py(p, buf, len);
19c70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19c80 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b           return;
19c90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19ca0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
19cb0 20 20 20 6d 65 6d 63 70 79 28 70 2c 20 62 75 66     memcpy(p, buf
19cc0 2c 20 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , t);.          
19cd0 20 20 20 20 20 20 62 79 74 65 52 65 76 65 72 73        byteRevers
19ce0 65 28 63 74 78 2d 3e 69 6e 2c 20 31 36 29 3b 0a  e(ctx->in, 16);.
19cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d00 4d 44 35 54 72 61 6e 73 66 6f 72 6d 28 63 74 78  MD5Transform(ctx
19d10 2d 3e 62 75 66 2c 20 28 75 69 6e 74 33 32 20 2a  ->buf, (uint32 *
19d20 29 63 74 78 2d 3e 69 6e 29 3b 0a 20 20 20 20 20  )ctx->in);.     
19d30 20 20 20 20 20 20 20 20 20 20 20 62 75 66 20 2b             buf +
19d40 3d 20 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = t;.           
19d50 20 20 20 20 20 6c 65 6e 20 2d 3d 20 74 3b 0a 20       len -= t;. 
19d60 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
19d70 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 64 61 74    /* Process dat
19d80 61 20 69 6e 20 36 34 2d 62 79 74 65 20 63 68 75  a in 64-byte chu
19d90 6e 6b 73 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  nks */..        
19da0 77 68 69 6c 65 20 28 6c 65 6e 20 3e 3d 20 36 34  while (len >= 64
19db0 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
19dc0 20 20 20 20 6d 65 6d 63 70 79 28 63 74 78 2d 3e      memcpy(ctx->
19dd0 69 6e 2c 20 62 75 66 2c 20 36 34 29 3b 0a 20 20  in, buf, 64);.  
19de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 79                by
19df0 74 65 52 65 76 65 72 73 65 28 63 74 78 2d 3e 69  teReverse(ctx->i
19e00 6e 2c 20 31 36 29 3b 0a 20 20 20 20 20 20 20 20  n, 16);.        
19e10 20 20 20 20 20 20 20 20 4d 44 35 54 72 61 6e 73          MD5Trans
19e20 66 6f 72 6d 28 63 74 78 2d 3e 62 75 66 2c 20 28  form(ctx->buf, (
19e30 75 69 6e 74 33 32 20 2a 29 63 74 78 2d 3e 69 6e  uint32 *)ctx->in
19e40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
19e50 20 20 20 62 75 66 20 2b 3d 20 36 34 3b 0a 20 20     buf += 64;.  
19e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 65                le
19e70 6e 20 2d 3d 20 36 34 3b 0a 20 20 20 20 20 20 20  n -= 64;.       
19e80 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 48   }..        /* H
19e90 61 6e 64 6c 65 20 61 6e 79 20 72 65 6d 61 69 6e  andle any remain
19ea0 69 6e 67 20 62 79 74 65 73 20 6f 66 20 64 61 74  ing bytes of dat
19eb0 61 2e 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 6d  a. */..        m
19ec0 65 6d 63 70 79 28 63 74 78 2d 3e 69 6e 2c 20 62  emcpy(ctx->in, b
19ed0 75 66 2c 20 6c 65 6e 29 3b 0a 7d 0a 0a 2f 2a 0a  uf, len);.}../*.
19ee0 20 2a 20 46 69 6e 61 6c 20 77 72 61 70 75 70 20   * Final wrapup 
19ef0 2d 20 70 61 64 20 74 6f 20 36 34 2d 62 79 74 65  - pad to 64-byte
19f00 20 62 6f 75 6e 64 61 72 79 20 77 69 74 68 20 74   boundary with t
19f10 68 65 20 62 69 74 20 70 61 74 74 65 72 6e 20 0a  he bit pattern .
19f20 20 2a 20 31 20 30 2a 20 28 36 34 2d 62 69 74 20   * 1 0* (64-bit 
19f30 63 6f 75 6e 74 20 6f 66 20 62 69 74 73 20 70 72  count of bits pr
19f40 6f 63 65 73 73 65 64 2c 20 4d 53 42 2d 66 69 72  ocessed, MSB-fir
19f50 73 74 29 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76  st). */.static v
19f60 6f 69 64 20 4d 44 35 46 69 6e 61 6c 28 75 6e 73  oid MD5Final(uns
19f70 69 67 6e 65 64 20 63 68 61 72 20 64 69 67 65 73  igned char diges
19f80 74 5b 31 36 5d 2c 20 4d 44 35 43 6f 6e 74 65 78  t[16], MD5Contex
19f90 74 20 2a 63 74 78 29 7b 0a 20 20 20 20 20 20 20  t *ctx){.       
19fa0 20 75 6e 73 69 67 6e 65 64 20 63 6f 75 6e 74 3b   unsigned count;
19fb0 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65  .        unsigne
19fc0 64 20 63 68 61 72 20 2a 70 3b 0a 0a 20 20 20 20  d char *p;..    
19fd0 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 6e      /* Compute n
19fe0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6d  umber of bytes m
19ff0 6f 64 20 36 34 20 2a 2f 0a 20 20 20 20 20 20 20  od 64 */.       
1a000 20 63 6f 75 6e 74 20 3d 20 28 63 74 78 2d 3e 62   count = (ctx->b
1a010 69 74 73 5b 30 5d 20 3e 3e 20 33 29 20 26 20 30  its[0] >> 3) & 0
1a020 78 33 46 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  x3F;..        /*
1a030 20 53 65 74 20 74 68 65 20 66 69 72 73 74 20 63   Set the first c
1a040 68 61 72 20 6f 66 20 70 61 64 64 69 6e 67 20 74  har of padding t
1a050 6f 20 30 78 38 30 2e 20 20 54 68 69 73 20 69 73  o 0x80.  This is
1a060 20 73 61 66 65 20 73 69 6e 63 65 20 74 68 65 72   safe since ther
1a070 65 20 69 73 0a 20 20 20 20 20 20 20 20 20 20 20  e is.           
1a080 61 6c 77 61 79 73 20 61 74 20 6c 65 61 73 74 20  always at least 
1a090 6f 6e 65 20 62 79 74 65 20 66 72 65 65 20 2a 2f  one byte free */
1a0a0 0a 20 20 20 20 20 20 20 20 70 20 3d 20 63 74 78  .        p = ctx
1a0b0 2d 3e 69 6e 20 2b 20 63 6f 75 6e 74 3b 0a 20 20  ->in + count;.  
1a0c0 20 20 20 20 20 20 2a 70 2b 2b 20 3d 20 30 78 38        *p++ = 0x8
1a0d0 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 42  0;..        /* B
1a0e0 79 74 65 73 20 6f 66 20 70 61 64 64 69 6e 67 20  ytes of padding 
1a0f0 6e 65 65 64 65 64 20 74 6f 20 6d 61 6b 65 20 36  needed to make 6
1a100 34 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20  4 bytes */.     
1a110 20 20 20 63 6f 75 6e 74 20 3d 20 36 34 20 2d 20     count = 64 - 
1a120 31 20 2d 20 63 6f 75 6e 74 3b 0a 0a 20 20 20 20  1 - count;..    
1a130 20 20 20 20 2f 2a 20 50 61 64 20 6f 75 74 20 74      /* Pad out t
1a140 6f 20 35 36 20 6d 6f 64 20 36 34 20 2a 2f 0a 20  o 56 mod 64 */. 
1a150 20 20 20 20 20 20 20 69 66 20 28 63 6f 75 6e 74         if (count
1a160 20 3c 20 38 29 20 7b 0a 20 20 20 20 20 20 20 20   < 8) {.        
1a170 20 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20 6c          /* Two l
1a180 6f 74 73 20 6f 66 20 70 61 64 64 69 6e 67 3a 20  ots of padding: 
1a190 20 50 61 64 20 74 68 65 20 66 69 72 73 74 20 62   Pad the first b
1a1a0 6c 6f 63 6b 20 74 6f 20 36 34 20 62 79 74 65 73  lock to 64 bytes
1a1b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
1a1c0 20 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c      memset(p, 0,
1a1d0 20 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 20   count);.       
1a1e0 20 20 20 20 20 20 20 20 20 62 79 74 65 52 65 76           byteRev
1a1f0 65 72 73 65 28 63 74 78 2d 3e 69 6e 2c 20 31 36  erse(ctx->in, 16
1a200 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1a210 20 20 20 4d 44 35 54 72 61 6e 73 66 6f 72 6d 28     MD5Transform(
1a220 63 74 78 2d 3e 62 75 66 2c 20 28 75 69 6e 74 33  ctx->buf, (uint3
1a230 32 20 2a 29 63 74 78 2d 3e 69 6e 29 3b 0a 0a 20  2 *)ctx->in);.. 
1a240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a250 2a 20 4e 6f 77 20 66 69 6c 6c 20 74 68 65 20 6e  * Now fill the n
1a260 65 78 74 20 62 6c 6f 63 6b 20 77 69 74 68 20 35  ext block with 5
1a270 36 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20  6 bytes */.     
1a280 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65             memse
1a290 74 28 63 74 78 2d 3e 69 6e 2c 20 30 2c 20 35 36  t(ctx->in, 0, 56
1a2a0 29 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  );.        } els
1a2b0 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e {.            
1a2c0 20 20 20 20 2f 2a 20 50 61 64 20 62 6c 6f 63 6b      /* Pad block
1a2d0 20 74 6f 20 35 36 20 62 79 74 65 73 20 2a 2f 0a   to 56 bytes */.
1a2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a2f0 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 63 6f 75  memset(p, 0, cou
1a300 6e 74 2d 38 29 3b 0a 20 20 20 20 20 20 20 20 7d  nt-8);.        }
1a310 0a 20 20 20 20 20 20 20 20 62 79 74 65 52 65 76  .        byteRev
1a320 65 72 73 65 28 63 74 78 2d 3e 69 6e 2c 20 31 34  erse(ctx->in, 14
1a330 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41  );..        /* A
1a340 70 70 65 6e 64 20 6c 65 6e 67 74 68 20 69 6e 20  ppend length in 
1a350 62 69 74 73 20 61 6e 64 20 74 72 61 6e 73 66 6f  bits and transfo
1a360 72 6d 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65  rm */.        me
1a370 6d 63 70 79 28 63 74 78 2d 3e 69 6e 20 2b 20 31  mcpy(ctx->in + 1
1a380 34 2a 34 2c 20 63 74 78 2d 3e 62 69 74 73 2c 20  4*4, ctx->bits, 
1a390 38 29 3b 0a 0a 20 20 20 20 20 20 20 20 4d 44 35  8);..        MD5
1a3a0 54 72 61 6e 73 66 6f 72 6d 28 63 74 78 2d 3e 62  Transform(ctx->b
1a3b0 75 66 2c 20 28 75 69 6e 74 33 32 20 2a 29 63 74  uf, (uint32 *)ct
1a3c0 78 2d 3e 69 6e 29 3b 0a 20 20 20 20 20 20 20 20  x->in);.        
1a3d0 62 79 74 65 52 65 76 65 72 73 65 28 28 75 6e 73  byteReverse((uns
1a3e0 69 67 6e 65 64 20 63 68 61 72 20 2a 29 63 74 78  igned char *)ctx
1a3f0 2d 3e 62 75 66 2c 20 34 29 3b 0a 20 20 20 20 20  ->buf, 4);.     
1a400 20 20 20 6d 65 6d 63 70 79 28 64 69 67 65 73 74     memcpy(digest
1a410 2c 20 63 74 78 2d 3e 62 75 66 2c 20 31 36 29 3b  , ctx->buf, 16);
1a420 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
1a430 74 20 61 20 31 32 38 2d 62 69 74 20 4d 44 35 20  t a 128-bit MD5 
1a440 64 69 67 65 73 74 20 69 6e 74 6f 20 61 20 33 32  digest into a 32
1a450 2d 64 69 67 69 74 20 62 61 73 65 2d 31 36 20 6e  -digit base-16 n
1a460 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  umber..*/.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 36 28 75 6e 73 69 67 6e 65 64  oBase16(unsigned
1a490 20 63 68 61 72 20 2a 64 69 67 65 73 74 2c 20 63   char *digest, c
1a4a0 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73 74  har *zBuf){.  st
1a4b0 61 74 69 63 20 63 68 61 72 20 63 6f 6e 73 74 20  atic char const 
1a4c0 7a 45 6e 63 6f 64 65 5b 5d 20 3d 20 22 30 31 32  zEncode[] = "012
1a4d0 33 34 35 36 37 38 39 61 62 63 64 65 66 22 3b 0a  3456789abcdef";.
1a4e0 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20 66    int i, j;..  f
1a4f0 6f 72 28 6a 3d 69 3d 30 3b 20 69 3c 31 36 3b 20  or(j=i=0; i<16; 
1a500 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 61 20  i++){.    int a 
1a510 3d 20 64 69 67 65 73 74 5b 69 5d 3b 0a 20 20 20  = digest[i];.   
1a520 20 7a 42 75 66 5b 6a 2b 2b 5d 20 3d 20 7a 45 6e   zBuf[j++] = zEn
1a530 63 6f 64 65 5b 28 61 3e 3e 34 29 26 30 78 66 5d  code[(a>>4)&0xf]
1a540 3b 0a 20 20 20 20 7a 42 75 66 5b 6a 2b 2b 5d 20  ;.    zBuf[j++] 
1a550 3d 20 7a 45 6e 63 6f 64 65 5b 61 20 26 20 30 78  = zEncode[a & 0x
1a560 66 5d 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 6a  f];.  }.  zBuf[j
1a570 5d 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  ] = 0;.}.../*.**
1a580 20 43 6f 6e 76 65 72 74 20 61 20 31 32 38 2d 62   Convert a 128-b
1a590 69 74 20 4d 44 35 20 64 69 67 65 73 74 20 69 6e  it MD5 digest in
1a5a0 74 6f 20 73 65 71 75 65 6e 63 79 20 6f 66 20 65  to sequency of e
1a5b0 69 67 68 74 20 35 2d 64 69 67 69 74 20 69 6e 74  ight 5-digit int
1a5c0 65 67 65 72 73 0a 2a 2a 20 65 61 63 68 20 72 65  egers.** each re
1a5d0 70 72 65 73 65 6e 74 69 6e 67 20 31 36 20 62 69  presenting 16 bi
1a5e0 74 73 20 6f 66 20 74 68 65 20 64 69 67 65 73 74  ts of the digest
1a5f0 20 61 6e 64 20 73 65 70 61 72 61 74 65 64 20 66   and separated f
1a600 72 6f 6d 20 65 61 63 68 0a 2a 2a 20 6f 74 68 65  rom each.** othe
1a610 72 20 62 79 20 61 20 22 2d 22 20 63 68 61 72 61  r by a "-" chara
1a620 63 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cter..*/.static 
1a630 76 6f 69 64 20 4d 44 35 44 69 67 65 73 74 54 6f  void MD5DigestTo
1a640 42 61 73 65 31 30 78 38 28 75 6e 73 69 67 6e 65  Base10x8(unsigne
1a650 64 20 63 68 61 72 20 64 69 67 65 73 74 5b 31 36  d char digest[16
1a660 5d 2c 20 63 68 61 72 20 7a 44 69 67 65 73 74 5b  ], char zDigest[
1a670 35 30 5d 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  50]){.  int i, j
1a680 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  ;.  unsigned int
1a690 20 78 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b   x;.  for(i=j=0;
1a6a0 20 69 3c 31 36 3b 20 69 2b 3d 32 29 7b 0a 20 20   i<16; i+=2){.  
1a6b0 20 20 78 20 3d 20 64 69 67 65 73 74 5b 69 5d 2a    x = digest[i]*
1a6c0 32 35 36 20 2b 20 64 69 67 65 73 74 5b 69 2b 31  256 + digest[i+1
1a6d0 5d 3b 0a 20 20 20 20 69 66 28 20 69 3e 30 20 29  ];.    if( i>0 )
1a6e0 20 7a 44 69 67 65 73 74 5b 6a 2b 2b 5d 20 3d 20   zDigest[j++] = 
1a6f0 27 2d 27 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  '-';.    sqlite3
1a700 5f 73 6e 70 72 69 6e 74 66 28 35 30 2d 6a 2c 20  _snprintf(50-j, 
1a710 26 7a 44 69 67 65 73 74 5b 6a 5d 2c 20 22 25 30  &zDigest[j], "%0
1a720 35 75 22 2c 20 78 29 3b 0a 20 20 20 20 6a 20 2b  5u", x);.    j +
1a730 3d 20 35 3b 0a 20 20 7d 0a 20 20 7a 44 69 67 65  = 5;.  }.  zDige
1a740 73 74 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  st[j] = 0;.}../*
1a750 0a 2a 2a 20 41 20 54 43 4c 20 63 6f 6d 6d 61 6e  .** A TCL comman
1a760 64 20 66 6f 72 20 6d 64 35 2e 20 20 54 68 65 20  d for md5.  The 
1a770 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
1a780 74 65 78 74 20 74 6f 20 62 65 20 68 61 73 68 65  text to be hashe
1a790 64 2e 20 20 54 68 65 0a 2a 2a 20 52 65 73 75 6c  d.  The.** Resul
1a7a0 74 20 69 73 20 74 68 65 20 68 61 73 68 20 69 6e  t is the hash in
1a7b0 20 62 61 73 65 36 34 2e 20 20 0a 2a 2f 0a 73 74   base64.  .*/.st
1a7c0 61 74 69 63 20 69 6e 74 20 6d 64 35 5f 63 6d 64  atic int md5_cmd
1a7d0 28 76 6f 69 64 2a 63 64 2c 20 54 63 6c 5f 49 6e  (void*cd, Tcl_In
1a7e0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
1a7f0 74 20 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68  t argc, const ch
1a800 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 4d 44  ar **argv){.  MD
1a810 35 43 6f 6e 74 65 78 74 20 63 74 78 3b 0a 20 20  5Context ctx;.  
1a820 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64 69  unsigned char di
1a830 67 65 73 74 5b 31 36 5d 3b 0a 20 20 63 68 61 72  gest[16];.  char
1a840 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 76 6f 69   zBuf[50];.  voi
1a850 64 20 28 2a 63 6f 6e 76 65 72 74 65 72 29 28 75  d (*converter)(u
1a860 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 2c 20 63  nsigned char*, c
1a870 68 61 72 2a 29 3b 0a 0a 20 20 69 66 28 20 61 72  har*);..  if( ar
1a880 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=2 ){.    Tcl
1a890 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1a8a0 74 65 72 70 2c 22 77 72 6f 6e 67 20 23 20 61 72  terp,"wrong # ar
1a8b0 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1a8c0 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20  ", argv[0], .   
1a8d0 20 20 20 20 20 22 20 54 45 58 54 5c 22 22 2c 20       " TEXT\"", 
1a8e0 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72  (char*)0);.    r
1a8f0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1a900 0a 20 20 7d 0a 20 20 4d 44 35 49 6e 69 74 28 26  .  }.  MD5Init(&
1a910 63 74 78 29 3b 0a 20 20 4d 44 35 55 70 64 61 74  ctx);.  MD5Updat
1a920 65 28 26 63 74 78 2c 20 28 75 6e 73 69 67 6e 65  e(&ctx, (unsigne
1a930 64 20 63 68 61 72 2a 29 61 72 67 76 5b 31 5d 2c  d char*)argv[1],
1a940 20 28 75 6e 73 69 67 6e 65 64 29 73 74 72 6c 65   (unsigned)strle
1a950 6e 28 61 72 67 76 5b 31 5d 29 29 3b 0a 20 20 4d  n(argv[1]));.  M
1a960 44 35 46 69 6e 61 6c 28 64 69 67 65 73 74 2c 20  D5Final(digest, 
1a970 26 63 74 78 29 3b 0a 20 20 63 6f 6e 76 65 72 74  &ctx);.  convert
1a980 65 72 20 3d 20 28 76 6f 69 64 28 2a 29 28 75 6e  er = (void(*)(un
1a990 73 69 67 6e 65 64 20 63 68 61 72 2a 2c 63 68 61  signed char*,cha
1a9a0 72 2a 29 29 63 64 3b 0a 20 20 63 6f 6e 76 65 72  r*))cd;.  conver
1a9b0 74 65 72 28 64 69 67 65 73 74 2c 20 7a 42 75 66  ter(digest, zBuf
1a9c0 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  );.  Tcl_AppendR
1a9d0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
1a9e0 75 66 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  uf, (char*)0);. 
1a9f0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1aa00 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 54 43 4c 20 63  }../*.** A TCL c
1aa10 6f 6d 6d 61 6e 64 20 74 6f 20 74 61 6b 65 20 74  ommand to take t
1aa20 68 65 20 6d 64 35 20 68 61 73 68 20 6f 66 20 61  he md5 hash of a
1aa30 20 66 69 6c 65 2e 20 20 54 68 65 20 61 72 67 75   file.  The argu
1aa40 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 6e  ment is the.** n
1aa50 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e  ame of the file.
1aa60 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
1aa70 64 35 66 69 6c 65 5f 63 6d 64 28 76 6f 69 64 2a  d5file_cmd(void*
1aa80 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70 2a 69  cd, Tcl_Interp*i
1aa90 6e 74 65 72 70 2c 20 69 6e 74 20 61 72 67 63 2c  nterp, int argc,
1aaa0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72   const char **ar
1aab0 67 76 29 7b 0a 20 20 46 49 4c 45 20 2a 69 6e 3b  gv){.  FILE *in;
1aac0 0a 20 20 4d 44 35 43 6f 6e 74 65 78 74 20 63 74  .  MD5Context ct
1aad0 78 3b 0a 20 20 76 6f 69 64 20 28 2a 63 6f 6e 76  x;.  void (*conv
1aae0 65 72 74 65 72 29 28 75 6e 73 69 67 6e 65 64 20  erter)(unsigned 
1aaf0 63 68 61 72 2a 2c 20 63 68 61 72 2a 29 3b 0a 20  char*, char*);. 
1ab00 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64   unsigned char d
1ab10 69 67 65 73 74 5b 31 36 5d 3b 0a 20 20 63 68 61  igest[16];.  cha
1ab20 72 20 7a 42 75 66 5b 31 30 32 34 30 5d 3b 0a 0a  r zBuf[10240];..
1ab30 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b    if( argc!=2 ){
1ab40 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1ab50 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 77 72  esult(interp,"wr
1ab60 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
1ab70 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
1ab80 30 5d 2c 20 0a 20 20 20 20 20 20 20 20 22 20 46  0], .        " F
1ab90 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 28 63 68 61  ILENAME\"", (cha
1aba0 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72  r*)0);.    retur
1abb0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1abc0 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 61 72  .  in = fopen(ar
1abd0 67 76 5b 31 5d 2c 22 72 62 22 29 3b 0a 20 20 69  gv[1],"rb");.  i
1abe0 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  f( in==0 ){.    
1abf0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1ac00 28 69 6e 74 65 72 70 2c 22 75 6e 61 62 6c 65 20  (interp,"unable 
1ac10 74 6f 20 6f 70 65 6e 20 66 69 6c 65 20 5c 22 22  to open file \""
1ac20 2c 20 61 72 67 76 5b 31 5d 2c 20 0a 20 20 20 20  , argv[1], .    
1ac30 20 20 20 20 20 22 5c 22 20 66 6f 72 20 72 65 61       "\" for rea
1ac40 64 69 6e 67 22 2c 20 28 63 68 61 72 2a 29 30 29  ding", (char*)0)
1ac50 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1ac60 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 4d 44  _ERROR;.  }.  MD
1ac70 35 49 6e 69 74 28 26 63 74 78 29 3b 0a 20 20 66  5Init(&ctx);.  f
1ac80 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20  or(;;){.    int 
1ac90 6e 3b 0a 20 20 20 20 6e 20 3d 20 28 69 6e 74 29  n;.    n = (int)
1aca0 66 72 65 61 64 28 7a 42 75 66 2c 20 31 2c 20 73  fread(zBuf, 1, s
1acb0 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 69 6e 29  izeof(zBuf), in)
1acc0 3b 0a 20 20 20 20 69 66 28 20 6e 3c 3d 30 20 29  ;.    if( n<=0 )
1acd0 20 62 72 65 61 6b 3b 0a 20 20 20 20 4d 44 35 55   break;.    MD5U
1ace0 70 64 61 74 65 28 26 63 74 78 2c 20 28 75 6e 73  pdate(&ctx, (uns
1acf0 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 42 75 66  igned char*)zBuf
1ad00 2c 20 28 75 6e 73 69 67 6e 65 64 29 6e 29 3b 0a  , (unsigned)n);.
1ad10 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29    }.  fclose(in)
1ad20 3b 0a 20 20 4d 44 35 46 69 6e 61 6c 28 64 69 67  ;.  MD5Final(dig
1ad30 65 73 74 2c 20 26 63 74 78 29 3b 0a 20 20 63 6f  est, &ctx);.  co
1ad40 6e 76 65 72 74 65 72 20 3d 20 28 76 6f 69 64 28  nverter = (void(
1ad50 2a 29 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  *)(unsigned char
1ad60 2a 2c 63 68 61 72 2a 29 29 63 64 3b 0a 20 20 63  *,char*))cd;.  c
1ad70 6f 6e 76 65 72 74 65 72 28 64 69 67 65 73 74 2c  onverter(digest,
1ad80 20 7a 42 75 66 29 3b 0a 20 20 54 63 6c 5f 41 70   zBuf);.  Tcl_Ap
1ad90 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1ada0 70 2c 20 7a 42 75 66 2c 20 28 63 68 61 72 2a 29  p, zBuf, (char*)
1adb0 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
1adc0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
1add0 67 69 73 74 65 72 20 74 68 65 20 66 6f 75 72 20  gister the four 
1ade0 6e 65 77 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 73  new TCL commands
1adf0 20 66 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20   for generating 
1ae00 4d 44 35 20 63 68 65 63 6b 73 75 6d 73 0a 2a 2a  MD5 checksums.**
1ae10 20 77 69 74 68 20 74 68 65 20 54 43 4c 20 69 6e   with the TCL in
1ae20 74 65 72 70 72 65 74 65 72 2e 0a 2a 2f 0a 69 6e  terpreter..*/.in
1ae30 74 20 4d 64 35 5f 49 6e 69 74 28 54 63 6c 5f 49  t Md5_Init(Tcl_I
1ae40 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a  nterp *interp){.
1ae50 20 20 54 63 6c 5f 43 72 65 61 74 65 43 6f 6d 6d    Tcl_CreateComm
1ae60 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 6d 64 35  and(interp, "md5
1ae70 22 2c 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a  ", (Tcl_CmdProc*
1ae80 29 6d 64 35 5f 63 6d 64 2c 0a 20 20 20 20 20 20  )md5_cmd,.      
1ae90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4d 44                MD
1aea0 35 44 69 67 65 73 74 54 6f 42 61 73 65 31 36 2c  5DigestToBase16,
1aeb0 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74   0);.  Tcl_Creat
1aec0 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  eCommand(interp,
1aed0 20 22 6d 64 35 2d 31 30 78 38 22 2c 20 28 54 63   "md5-10x8", (Tc
1aee0 6c 5f 43 6d 64 50 72 6f 63 2a 29 6d 64 35 5f 63  l_CmdProc*)md5_c
1aef0 6d 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  md,.            
1af00 20 20 20 20 20 20 20 20 4d 44 35 44 69 67 65 73          MD5Diges
1af10 74 54 6f 42 61 73 65 31 30 78 38 2c 20 30 29 3b  tToBase10x8, 0);
1af20 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 43 6f 6d  .  Tcl_CreateCom
1af30 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 6d 64  mand(interp, "md
1af40 35 66 69 6c 65 22 2c 20 28 54 63 6c 5f 43 6d 64  5file", (Tcl_Cmd
1af50 50 72 6f 63 2a 29 6d 64 35 66 69 6c 65 5f 63 6d  Proc*)md5file_cm
1af60 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
1af70 20 20 20 20 20 20 20 4d 44 35 44 69 67 65 73 74         MD5Digest
1af80 54 6f 42 61 73 65 31 36 2c 20 30 29 3b 0a 20 20  ToBase16, 0);.  
1af90 54 63 6c 5f 43 72 65 61 74 65 43 6f 6d 6d 61 6e  Tcl_CreateComman
1afa0 64 28 69 6e 74 65 72 70 2c 20 22 6d 64 35 66 69  d(interp, "md5fi
1afb0 6c 65 2d 31 30 78 38 22 2c 20 28 54 63 6c 5f 43  le-10x8", (Tcl_C
1afc0 6d 64 50 72 6f 63 2a 29 6d 64 35 66 69 6c 65 5f  mdProc*)md5file_
1afd0 63 6d 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  cmd,.           
1afe0 20 20 20 20 20 20 20 20 20 4d 44 35 44 69 67 65           MD5Dige
1aff0 73 74 54 6f 42 61 73 65 31 30 78 38 2c 20 30 29  stToBase10x8, 0)
1b000 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
1b010 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64  K;.}.#endif /* d
1b020 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
1b030 53 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  ST) || defined(S
1b040 51 4c 49 54 45 5f 54 43 4c 4d 44 35 29 20 2a 2f  QLITE_TCLMD5) */
1b050 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
1b060 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a  LITE_TEST)./*.**
1b070 20 44 75 72 69 6e 67 20 74 65 73 74 69 6e 67 2c   During testing,
1b080 20 74 68 65 20 73 70 65 63 69 61 6c 20 6d 64 35   the special md5
1b090 73 75 6d 28 29 20 61 67 67 72 65 67 61 74 65 20  sum() aggregate 
1b0a0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 76 61 69  function is avai
1b0b0 6c 61 62 6c 65 2e 0a 2a 2a 20 69 6e 73 69 64 65  lable..** inside
1b0c0 20 53 51 4c 69 74 65 2e 20 20 54 68 65 20 66 6f   SQLite.  The fo
1b0d0 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73  llowing routines
1b0e0 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74 20   implement that 
1b0f0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
1b100 74 69 63 20 76 6f 69 64 20 6d 64 35 73 74 65 70  tic void md5step
1b110 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
1b120 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61   *context, int a
1b130 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  rgc, sqlite3_val
1b140 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 4d 44  ue **argv){.  MD
1b150 35 43 6f 6e 74 65 78 74 20 2a 70 3b 0a 20 20 69  5Context *p;.  i
1b160 6e 74 20 69 3b 0a 20 20 69 66 28 20 61 72 67 63  nt i;.  if( argc
1b170 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  <1 ) return;.  p
1b180 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65   = sqlite3_aggre
1b190 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e  gate_context(con
1b1a0 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29  text, sizeof(*p)
1b1b0 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
1b1c0 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 70  return;.  if( !p
1b1d0 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20  ->isInit ){.    
1b1e0 4d 44 35 49 6e 69 74 28 70 29 3b 0a 20 20 7d 0a  MD5Init(p);.  }.
1b1f0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67    for(i=0; i<arg
1b200 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e  c; i++){.    con
1b210 73 74 20 63 68 61 72 20 2a 7a 44 61 74 61 20 3d  st char *zData =
1b220 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f   (char*)sqlite3_
1b230 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
1b240 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 7a 44 61  i]);.    if( zDa
1b250 74 61 20 29 7b 0a 20 20 20 20 20 20 4d 44 35 55  ta ){.      MD5U
1b260 70 64 61 74 65 28 70 2c 20 28 75 6e 73 69 67 6e  pdate(p, (unsign
1b270 65 64 20 63 68 61 72 2a 29 7a 44 61 74 61 2c 20  ed char*)zData, 
1b280 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 44 61 74  (int)strlen(zDat
1b290 61 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  a));.    }.  }.}
1b2a0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 64 35  .static void md5
1b2b0 66 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65 33  finalize(sqlite3
1b2c0 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
1b2d0 74 29 7b 0a 20 20 4d 44 35 43 6f 6e 74 65 78 74  t){.  MD5Context
1b2e0 20 2a 70 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20   *p;.  unsigned 
1b2f0 63 68 61 72 20 64 69 67 65 73 74 5b 31 36 5d 3b  char digest[16];
1b300 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33 33 5d  .  char zBuf[33]
1b310 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f  ;.  p = sqlite3_
1b320 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78  aggregate_contex
1b330 74 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f  t(context, sizeo
1b340 66 28 2a 70 29 29 3b 0a 20 20 4d 44 35 46 69 6e  f(*p));.  MD5Fin
1b350 61 6c 28 64 69 67 65 73 74 2c 70 29 3b 0a 20 20  al(digest,p);.  
1b360 4d 44 35 44 69 67 65 73 74 54 6f 42 61 73 65 31  MD5DigestToBase1
1b370 36 28 64 69 67 65 73 74 2c 20 7a 42 75 66 29 3b  6(digest, zBuf);
1b380 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
1b390 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
1b3a0 7a 42 75 66 2c 20 2d 31 2c 20 53 51 4c 49 54 45  zBuf, -1, SQLITE
1b3b0 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a 69  _TRANSIENT);.}.i
1b3c0 6e 74 20 4d 64 35 5f 52 65 67 69 73 74 65 72 28  nt Md5_Register(
1b3d0 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
1b3e0 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
1b3f0 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
1b400 28 64 62 2c 20 22 6d 64 35 73 75 6d 22 2c 20 2d  (db, "md5sum", -
1b410 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
1b420 30 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20  0, 0, .         
1b430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b440 20 20 20 20 20 20 20 20 6d 64 35 73 74 65 70 2c          md5step,
1b450 20 6d 64 35 66 69 6e 61 6c 69 7a 65 29 3b 0a 20   md5finalize);. 
1b460 20 73 71 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61   sqlite3_overloa
1b470 64 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22  d_function(db, "
1b480 6d 64 35 73 75 6d 22 2c 20 2d 31 29 3b 20 20 2f  md5sum", -1);  /
1b490 2a 20 54 6f 20 65 78 65 72 63 69 73 65 20 74 68  * To exercise th
1b4a0 69 73 20 41 50 49 20 2a 2f 0a 20 20 72 65 74 75  is API */.  retu
1b4b0 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
1b4c0 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  /* defined(SQLIT
1b4d0 45 5f 54 45 53 54 29 20 2a 2f 0a 0a 0a 2f 2a 0a  E_TEST) */.../*.
1b4e0 2a 2a 20 49 66 20 74 68 65 20 6d 61 63 72 6f 20  ** If the macro 
1b4f0 54 43 4c 53 48 20 69 73 20 6f 6e 65 2c 20 74 68  TCLSH is one, th
1b500 65 6e 20 70 75 74 20 69 6e 20 63 6f 64 65 20 74  en put in code t
1b510 68 69 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 22  his for the.** "
1b520 6d 61 69 6e 22 20 72 6f 75 74 69 6e 65 20 74 68  main" routine th
1b530 61 74 20 77 69 6c 6c 20 69 6e 69 74 69 61 6c 69  at will initiali
1b540 7a 65 20 54 63 6c 20 61 6e 64 20 74 61 6b 65 20  ze Tcl and take 
1b550 69 6e 70 75 74 20 66 72 6f 6d 0a 2a 2a 20 73 74  input from.** st
1b560 61 6e 64 61 72 64 20 69 6e 70 75 74 2c 20 6f 72  andard input, or
1b570 20 69 66 20 61 20 66 69 6c 65 20 69 73 20 6e 61   if a file is na
1b580 6d 65 64 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61  med on the comma
1b590 6e 64 20 6c 69 6e 65 0a 2a 2a 20 74 68 65 20 54  nd line.** the T
1b5a0 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 72  CL interpreter r
1b5b0 65 61 64 73 20 61 6e 64 20 65 76 61 6c 75 61 74  eads and evaluat
1b5c0 65 73 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2f  es that file..*/
1b5d0 0a 23 69 66 20 54 43 4c 53 48 3d 3d 31 0a 73 74  .#if TCLSH==1.st
1b5e0 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
1b5f0 2a 74 63 6c 73 68 5f 6d 61 69 6e 5f 6c 6f 6f 70  *tclsh_main_loop
1b600 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63  (void){.  static
1b610 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 69   const char zMai
1b620 6e 6c 6f 6f 70 5b 5d 20 3d 0a 20 20 20 20 22 73  nloop[] =.    "s
1b630 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e 22 0a 20 20  et line {}\n".  
1b640 20 20 22 77 68 69 6c 65 20 7b 21 5b 65 6f 66 20    "while {![eof 
1b650 73 74 64 69 6e 5d 7d 20 7b 5c 6e 22 0a 20 20 20  stdin]} {\n".   
1b660 20 20 20 22 69 66 20 7b 24 6c 69 6e 65 21 3d 5c     "if {$line!=\
1b670 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20  "\"} {\n".      
1b680 20 20 22 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69    "puts -nonewli
1b690 6e 65 20 5c 22 3e 20 5c 22 5c 6e 22 0a 20 20 20  ne \"> \"\n".   
1b6a0 20 20 20 22 7d 20 65 6c 73 65 20 7b 5c 6e 22 0a     "} else {\n".
1b6b0 20 20 20 20 20 20 20 20 22 70 75 74 73 20 2d 6e          "puts -n
1b6c0 6f 6e 65 77 6c 69 6e 65 20 5c 22 25 20 5c 22 5c  onewline \"% \"\
1b6d0 6e 22 0a 20 20 20 20 20 20 22 7d 5c 6e 22 0a 20  n".      "}\n". 
1b6e0 20 20 20 20 20 22 66 6c 75 73 68 20 73 74 64 6f       "flush stdo
1b6f0 75 74 5c 6e 22 0a 20 20 20 20 20 20 22 61 70 70  ut\n".      "app
1b700 65 6e 64 20 6c 69 6e 65 20 5b 67 65 74 73 20 73  end line [gets s
1b710 74 64 69 6e 5d 5c 6e 22 0a 20 20 20 20 20 20 22  tdin]\n".      "
1b720 69 66 20 7b 5b 69 6e 66 6f 20 63 6f 6d 70 6c 65  if {[info comple
1b730 74 65 20 24 6c 69 6e 65 5d 7d 20 7b 5c 6e 22 0a  te $line]} {\n".
1b740 20 20 20 20 20 20 20 20 22 69 66 20 7b 5b 63 61          "if {[ca
1b750 74 63 68 20 7b 75 70 6c 65 76 65 6c 20 23 30 20  tch {uplevel #0 
1b760 24 6c 69 6e 65 7d 20 72 65 73 75 6c 74 5d 7d 20  $line} result]} 
1b770 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 22  {\n".          "
1b780 70 75 74 73 20 73 74 64 65 72 72 20 5c 22 45 72  puts stderr \"Er
1b790 72 6f 72 3a 20 24 72 65 73 75 6c 74 5c 22 5c 6e  ror: $result\"\n
1b7a0 22 0a 20 20 20 20 20 20 20 20 22 7d 20 65 6c 73  ".        "} els
1b7b0 65 69 66 20 7b 24 72 65 73 75 6c 74 21 3d 5c 22  eif {$result!=\"
1b7c0 5c 22 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20  \"} {\n".       
1b7d0 20 20 20 22 70 75 74 73 20 24 72 65 73 75 6c 74     "puts $result
1b7e0 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 7d 5c 6e  \n".        "}\n
1b7f0 22 0a 20 20 20 20 20 20 20 20 22 73 65 74 20 6c  ".        "set l
1b800 69 6e 65 20 7b 7d 5c 6e 22 0a 20 20 20 20 20 20  ine {}\n".      
1b810 22 7d 20 65 6c 73 65 20 7b 5c 6e 22 0a 20 20 20  "} else {\n".   
1b820 20 20 20 20 20 22 61 70 70 65 6e 64 20 6c 69 6e       "append lin
1b830 65 20 5c 5c 6e 5c 6e 22 0a 20 20 20 20 20 20 22  e \\n\n".      "
1b840 7d 5c 6e 22 0a 20 20 20 20 22 7d 5c 6e 22 0a 20  }\n".    "}\n". 
1b850 20 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4d 61 69   ;.  return zMai
1b860 6e 6c 6f 6f 70 3b 0a 7d 0a 23 65 6e 64 69 66 0a  nloop;.}.#endif.
1b870 23 69 66 20 54 43 4c 53 48 3d 3d 32 0a 73 74 61  #if TCLSH==2.sta
1b880 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
1b890 74 63 6c 73 68 5f 6d 61 69 6e 5f 6c 6f 6f 70 28  tclsh_main_loop(
1b8a0 76 6f 69 64 29 3b 0a 23 65 6e 64 69 66 0a 0a 23  void);.#endif..#
1b8b0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
1b8c0 54 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  T.static void in
1b8d0 69 74 5f 61 6c 6c 28 54 63 6c 5f 49 6e 74 65 72  it_all(Tcl_Inter
1b8e0 70 20 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  p *);.static int
1b8f0 20 69 6e 69 74 5f 61 6c 6c 5f 63 6d 64 28 0a 20   init_all_cmd(. 
1b900 20 43 6c 69 65 6e 74 44 61 74 61 20 63 64 2c 0a   ClientData cd,.
1b910 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1b920 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
1b930 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
1b940 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 0a 20 20  ST objv[].){..  
1b950 54 63 6c 5f 49 6e 74 65 72 70 20 2a 73 6c 61 76  Tcl_Interp *slav
1b960 65 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  e;.  if( objc!=2
1b970 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
1b980 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
1b990 20 31 2c 20 6f 62 6a 76 2c 20 22 53 4c 41 56 45   1, objv, "SLAVE
1b9a0 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
1b9b0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
1b9c0 20 73 6c 61 76 65 20 3d 20 54 63 6c 5f 47 65 74   slave = Tcl_Get
1b9d0 53 6c 61 76 65 28 69 6e 74 65 72 70 2c 20 54 63  Slave(interp, Tc
1b9e0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1b9f0 5b 31 5d 29 29 3b 0a 20 20 69 66 28 20 21 73 6c  [1]));.  if( !sl
1ba00 61 76 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ave ){.    retur
1ba10 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1ba20 0a 0a 20 20 69 6e 69 74 5f 61 6c 6c 28 73 6c 61  ..  init_all(sla
1ba30 76 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  ve);.  return TC
1ba40 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  L_OK;.}../*.** T
1ba50 63 6c 63 6d 64 3a 20 64 62 5f 75 73 65 5f 6c 65  clcmd: db_use_le
1ba60 67 61 63 79 5f 70 72 65 70 61 72 65 20 44 42 20  gacy_prepare DB 
1ba70 42 4f 4f 4c 45 41 4e 0a 2a 2a 0a 2a 2a 20 20 20  BOOLEAN.**.**   
1ba80 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
1ba90 6e 74 20 74 6f 20 74 68 69 73 20 63 6f 6d 6d 61  nt to this comma
1baa0 6e 64 20 6d 75 73 74 20 62 65 20 61 20 64 61 74  nd must be a dat
1bab0 61 62 61 73 65 20 63 6f 6d 6d 61 6e 64 20 63 72  abase command cr
1bac0 65 61 74 65 64 20 62 79 0a 2a 2a 20 20 20 5b 73  eated by.**   [s
1bad0 71 6c 69 74 65 33 5d 2e 20 49 66 20 74 68 65 20  qlite3]. If the 
1bae0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
1baf0 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
1bb00 65 20 68 61 6e 64 6c 65 20 69 73 20 63 6f 6e 66  e handle is conf
1bb10 69 67 75 72 65 64 0a 2a 2a 20 20 20 74 6f 20 75  igured.**   to u
1bb20 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 70  se the sqlite3_p
1bb30 72 65 70 61 72 65 5f 76 32 28 29 20 66 75 6e 63  repare_v2() func
1bb40 74 69 6f 6e 20 74 6f 20 70 72 65 70 61 72 65 20  tion to prepare 
1bb50 73 74 61 74 65 6d 65 6e 74 73 2e 20 49 66 20 69  statements. If i
1bb60 74 0a 2a 2a 20 20 20 69 73 20 66 61 6c 73 65 2c  t.**   is false,
1bb70 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
1bb80 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
1bb90 74 20 64 62 5f 75 73 65 5f 6c 65 67 61 63 79 5f  t db_use_legacy_
1bba0 70 72 65 70 61 72 65 5f 63 6d 64 28 0a 20 20 43  prepare_cmd(.  C
1bbb0 6c 69 65 6e 74 44 61 74 61 20 63 64 2c 0a 20 20  lientData cd,.  
1bbc0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1bbd0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
1bbe0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1bbf0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 54 63 6c   objv[].){.  Tcl
1bc00 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49 6e 66 6f  _CmdInfo cmdInfo
1bc10 3b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  ;.  SqliteDb *pD
1bc20 62 3b 0a 20 20 69 6e 74 20 62 50 72 65 70 61 72  b;.  int bPrepar
1bc30 65 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  e;..  if( objc!=
1bc40 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  3 ){.    Tcl_Wro
1bc50 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
1bc60 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 42  , 1, objv, "DB B
1bc70 4f 4f 4c 45 41 4e 22 29 3b 0a 20 20 20 20 72 65  OOLEAN");.    re
1bc80 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1bc90 20 20 7d 0a 0a 20 20 69 66 28 20 21 54 63 6c 5f    }..  if( !Tcl_
1bca0 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69  GetCommandInfo(i
1bcb0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
1bcc0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
1bcd0 63 6d 64 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20  cmdInfo) ){.    
1bce0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1bcf0 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 73 75 63  (interp, "no suc
1bd00 68 20 64 62 3a 20 22 2c 20 54 63 6c 5f 47 65 74  h db: ", Tcl_Get
1bd10 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
1bd20 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
1bd30 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1bd40 3b 0a 20 20 7d 0a 20 20 70 44 62 20 3d 20 28 53  ;.  }.  pDb = (S
1bd50 71 6c 69 74 65 44 62 2a 29 63 6d 64 49 6e 66 6f  qliteDb*)cmdInfo
1bd60 2e 6f 62 6a 43 6c 69 65 6e 74 44 61 74 61 3b 0a  .objClientData;.
1bd70 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f    if( Tcl_GetBoo
1bd80 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
1bd90 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 62 50  rp, objv[2], &bP
1bda0 72 65 70 61 72 65 29 20 29 7b 0a 20 20 20 20 72  repare) ){.    r
1bdb0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1bdc0 0a 20 20 7d 0a 0a 20 20 70 44 62 2d 3e 62 4c 65  .  }..  pDb->bLe
1bdd0 67 61 63 79 50 72 65 70 61 72 65 20 3d 20 62 50  gacyPrepare = bP
1bde0 72 65 70 61 72 65 3b 0a 0a 20 20 54 63 6c 5f 52  repare;..  Tcl_R
1bdf0 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  esetResult(inter
1be00 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  p);.  return TCL
1be10 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 63  _OK;.}../*.** Tc
1be20 6c 63 6d 64 3a 20 64 62 5f 6c 61 73 74 5f 73 74  lcmd: db_last_st
1be30 6d 74 5f 70 74 72 20 44 42 0a 2a 2a 0a 2a 2a 20  mt_ptr DB.**.** 
1be40 20 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65    If the stateme
1be50 6e 74 20 63 61 63 68 65 20 61 73 73 6f 63 69 61  nt cache associa
1be60 74 65 64 20 77 69 74 68 20 64 61 74 61 62 61 73  ted with databas
1be70 65 20 44 42 20 69 73 20 6e 6f 74 20 65 6d 70 74  e DB is not empt
1be80 79 2c 0a 2a 2a 20 20 20 72 65 74 75 72 6e 20 74  y,.**   return t
1be90 68 65 20 74 65 78 74 20 72 65 70 72 65 73 65 6e  he text represen
1bea0 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f  tation of the mo
1beb0 73 74 20 72 65 63 65 6e 74 6c 79 20 75 73 65 64  st recently used
1bec0 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20   statement.**   
1bed0 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  handle..*/.stati
1bee0 63 20 69 6e 74 20 64 62 5f 6c 61 73 74 5f 73 74  c int db_last_st
1bef0 6d 74 5f 70 74 72 28 0a 20 20 43 6c 69 65 6e 74  mt_ptr(.  Client
1bf00 44 61 74 61 20 63 64 2c 0a 20 20 54 63 6c 5f 49  Data cd,.  Tcl_I
1bf10 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1bf20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1bf30 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1bf40 5b 5d 0a 29 7b 0a 20 20 65 78 74 65 72 6e 20 69  [].){.  extern i
1bf50 6e 74 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61  nt sqlite3TestMa
1bf60 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 54 63 6c  kePointerStr(Tcl
1bf70 5f 49 6e 74 65 72 70 2a 2c 20 63 68 61 72 2a 2c  _Interp*, char*,
1bf80 20 76 6f 69 64 2a 29 3b 0a 20 20 54 63 6c 5f 43   void*);.  Tcl_C
1bf90 6d 64 49 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a  mdInfo cmdInfo;.
1bfa0 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 3b    SqliteDb *pDb;
1bfb0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
1bfc0 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68  *pStmt = 0;.  ch
1bfd0 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 0a 20  ar zBuf[100];.. 
1bfe0 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
1bff0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
1c000 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
1c010 6f 62 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20 20  objv, "DB");.   
1c020 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1c030 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 54  R;.  }..  if( !T
1c040 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66  cl_GetCommandInf
1c050 6f 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  o(interp, Tcl_Ge
1c060 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
1c070 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29 7b 0a 20  , &cmdInfo) ){. 
1c080 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1c090 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20  ult(interp, "no 
1c0a0 73 75 63 68 20 64 62 3a 20 22 2c 20 54 63 6c 5f  such db: ", Tcl_
1c0b0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
1c0c0 5d 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  ]), (char*)0);. 
1c0d0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1c0e0 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 44 62 20 3d  ROR;.  }.  pDb =
1c0f0 20 28 53 71 6c 69 74 65 44 62 2a 29 63 6d 64 49   (SqliteDb*)cmdI
1c100 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44 61 74  nfo.objClientDat
1c110 61 3b 0a 0a 20 20 69 66 28 20 70 44 62 2d 3e 73  a;..  if( pDb->s
1c120 74 6d 74 4c 69 73 74 20 29 20 70 53 74 6d 74 20  tmtList ) pStmt 
1c130 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 2d  = pDb->stmtList-
1c140 3e 70 53 74 6d 74 3b 0a 20 20 69 66 28 20 73 71  >pStmt;.  if( sq
1c150 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69  lite3TestMakePoi
1c160 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20  nterStr(interp, 
1c170 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29 7b 0a  zBuf, pStmt) ){.
1c180 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1c190 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f  RROR;.  }.  Tcl_
1c1a0 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
1c1b0 2c 20 7a 42 75 66 2c 20 54 43 4c 5f 56 4f 4c 41  , zBuf, TCL_VOLA
1c1c0 54 49 4c 45 29 3b 0a 0a 20 20 72 65 74 75 72 6e  TILE);..  return
1c1d0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69   TCL_OK;.}.#endi
1c1e0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53 54  f /* SQLITE_TEST
1c1f0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69   */../*.** Confi
1c200 67 75 72 65 20 74 68 65 20 69 6e 74 65 72 70 72  gure the interpr
1c210 65 74 65 72 20 70 61 73 73 65 64 20 61 73 20 74  eter passed as t
1c220 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
1c230 74 20 74 6f 20 68 61 76 65 20 61 63 63 65 73 73  t to have access
1c240 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f 6d 6d 61  .** to the comma
1c250 6e 64 73 20 61 6e 64 20 6c 69 6e 6b 65 64 20 76  nds and linked v
1c260 61 72 69 61 62 6c 65 73 20 74 68 61 74 20 6d 61  ariables that ma
1c270 6b 65 20 75 70 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  ke up:.**.**   *
1c280 20 74 68 65 20 5b 73 71 6c 69 74 65 33 5d 20 65   the [sqlite3] e
1c290 78 74 65 6e 73 69 6f 6e 20 69 74 73 65 6c 66 2c  xtension itself,
1c2a0 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 53   .**.**   * If S
1c2b0 51 4c 49 54 45 5f 54 43 4c 4d 44 35 20 6f 72 20  QLITE_TCLMD5 or 
1c2c0 53 51 4c 49 54 45 5f 54 45 53 54 20 69 73 20 64  SQLITE_TEST is d
1c2d0 65 66 69 6e 65 64 2c 20 74 68 65 20 4d 64 35 20  efined, the Md5 
1c2e0 63 6f 6d 6d 61 6e 64 73 2c 20 61 6e 64 0a 2a 2a  commands, and.**
1c2f0 0a 2a 2a 20 20 20 2a 20 49 66 20 53 51 4c 49 54  .**   * If SQLIT
1c300 45 5f 54 45 53 54 20 69 73 20 73 65 74 2c 20 74  E_TEST is set, t
1c310 68 65 20 76 61 72 69 6f 75 73 20 74 65 73 74 20  he various test 
1c320 69 6e 74 65 72 66 61 63 65 73 20 75 73 65 64 20  interfaces used 
1c330 62 79 20 74 68 65 20 54 63 6c 0a 2a 2a 20 20 20  by the Tcl.**   
1c340 20 20 74 65 73 74 20 73 75 69 74 65 2e 0a 2a 2f    test suite..*/
1c350 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 69  .static void ini
1c360 74 5f 61 6c 6c 28 54 63 6c 5f 49 6e 74 65 72 70  t_all(Tcl_Interp
1c370 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 53 71 6c   *interp){.  Sql
1c380 69 74 65 33 5f 49 6e 69 74 28 69 6e 74 65 72 70  ite3_Init(interp
1c390 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  );..#if defined(
1c3a0 53 51 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c 20  SQLITE_TEST) || 
1c3b0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
1c3c0 43 4c 4d 44 35 29 0a 20 20 4d 64 35 5f 49 6e 69  CLMD5).  Md5_Ini
1c3d0 74 28 69 6e 74 65 72 70 29 3b 0a 23 65 6e 64 69  t(interp);.#endi
1c3e0 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
1c3f0 5f 54 45 53 54 0a 20 20 7b 0a 20 20 20 20 65 78  _TEST.  {.    ex
1c400 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 63  tern int Sqlitec
1c410 6f 6e 66 69 67 5f 49 6e 69 74 28 54 63 6c 5f 49  onfig_Init(Tcl_I
1c420 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1c430 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1c440 73 74 31 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  st1_Init(Tcl_Int
1c450 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1c460 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1c470 32 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  2_Init(Tcl_Inter
1c480 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1c490 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 33 5f  int Sqlitetest3_
1c4a0 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1c4b0 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
1c4c0 74 20 53 71 6c 69 74 65 74 65 73 74 34 5f 49 6e  t Sqlitetest4_In
1c4d0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1c4e0 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1c4f0 53 71 6c 69 74 65 74 65 73 74 35 5f 49 6e 69 74  Sqlitetest5_Init
1c500 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1c510 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1c520 6c 69 74 65 74 65 73 74 36 5f 49 6e 69 74 28 54  litetest6_Init(T
1c530 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1c540 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1c550 74 65 74 65 73 74 37 5f 49 6e 69 74 28 54 63 6c  tetest7_Init(Tcl
1c560 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1c570 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1c580 74 65 73 74 38 5f 49 6e 69 74 28 54 63 6c 5f 49  test8_Init(Tcl_I
1c590 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1c5a0 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1c5b0 73 74 39 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  st9_Init(Tcl_Int
1c5c0 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1c5d0 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1c5e0 61 73 79 6e 63 5f 49 6e 69 74 28 54 63 6c 5f 49  async_Init(Tcl_I
1c5f0 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1c600 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1c610 73 74 5f 61 75 74 6f 65 78 74 5f 49 6e 69 74 28  st_autoext_Init(
1c620 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1c630 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1c640 69 74 65 74 65 73 74 5f 62 6c 6f 62 5f 49 6e 69  itetest_blob_Ini
1c650 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
1c660 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1c670 71 6c 69 74 65 74 65 73 74 5f 64 65 6d 6f 76 66  qlitetest_demovf
1c680 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  s_Init(Tcl_Inter
1c690 70 20 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  p *);.    extern
1c6a0 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f   int Sqlitetest_
1c6b0 66 75 6e 63 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  func_Init(Tcl_In
1c6c0 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
1c6d0 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1c6e0 74 5f 68 65 78 69 6f 5f 49 6e 69 74 28 54 63 6c  t_hexio_Init(Tcl
1c6f0 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1c700 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1c710 74 65 73 74 5f 69 6e 69 74 5f 49 6e 69 74 28 54  test_init_Init(T
1c720 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1c730 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1c740 74 65 74 65 73 74 5f 6d 61 6c 6c 6f 63 5f 49 6e  tetest_malloc_In
1c750 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1c760 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1c770 53 71 6c 69 74 65 74 65 73 74 5f 6d 75 74 65 78  Sqlitetest_mutex
1c780 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1c790 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1c7a0 6e 74 20 53 71 6c 69 74 65 74 65 73 74 73 63 68  nt Sqlitetestsch
1c7b0 65 6d 61 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  ema_Init(Tcl_Int
1c7c0 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1c7d0 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1c7e0 73 73 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  sse_Init(Tcl_Int
1c7f0 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1c800 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1c810 74 63 6c 76 61 72 5f 49 6e 69 74 28 54 63 6c 5f  tclvar_Init(Tcl_
1c820 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
1c830 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1c840 65 73 74 66 73 5f 49 6e 69 74 28 54 63 6c 5f 49  estfs_Init(Tcl_I
1c850 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1c860 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1c870 73 74 54 68 72 65 61 64 5f 49 6e 69 74 28 54 63  stThread_Init(Tc
1c880 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1c890 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1c8a0 65 74 65 73 74 4f 6e 65 66 69 6c 65 5f 49 6e 69  etestOnefile_Ini
1c8b0 74 28 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  t();.    extern 
1c8c0 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 4f 73  int SqlitetestOs
1c8d0 69 6e 73 74 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  inst_Init(Tcl_In
1c8e0 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
1c8f0 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1c900 74 62 61 63 6b 75 70 5f 49 6e 69 74 28 54 63 6c  tbackup_Init(Tcl
1c910 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1c920 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1c930 74 65 73 74 69 6e 74 61 72 72 61 79 5f 49 6e 69  testintarray_Ini
1c940 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
1c950 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1c960 71 6c 69 74 65 74 65 73 74 76 66 73 5f 49 6e 69  qlitetestvfs_Ini
1c970 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29 3b  t(Tcl_Interp *);
1c980 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1c990 53 71 6c 69 74 65 74 65 73 74 72 74 72 65 65 5f  Sqlitetestrtree_
1c9a0 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1c9b0 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
1c9c0 74 20 53 71 6c 69 74 65 71 75 6f 74 61 5f 49 6e  t Sqlitequota_In
1c9d0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1c9e0 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1c9f0 53 71 6c 69 74 65 6d 75 6c 74 69 70 6c 65 78 5f  Sqlitemultiplex_
1ca00 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1ca10 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
1ca20 74 20 53 71 6c 69 74 65 53 75 70 65 72 6c 6f 63  t SqliteSuperloc
1ca30 6b 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  k_Init(Tcl_Inter
1ca40 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1ca50 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 53 79  int SqlitetestSy
1ca60 73 63 61 6c 6c 5f 49 6e 69 74 28 54 63 6c 5f 49  scall_Init(Tcl_I
1ca70 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1ca80 65 72 6e 20 69 6e 74 20 46 74 73 35 74 63 6c 5f  ern int Fts5tcl_
1ca90 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
1caa0 2a 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  *);..#if defined
1cab0 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46  (SQLITE_ENABLE_F
1cac0 54 53 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  TS3) || defined(
1cad0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54  SQLITE_ENABLE_FT
1cae0 53 34 29 0a 20 20 20 20 65 78 74 65 72 6e 20 69  S4).    extern i
1caf0 6e 74 20 53 71 6c 69 74 65 74 65 73 74 66 74 73  nt Sqlitetestfts
1cb00 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  3_Init(Tcl_Inter
1cb10 70 20 2a 69 6e 74 65 72 70 29 3b 0a 23 65 6e 64  p *interp);.#end
1cb20 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
1cb30 45 5f 45 4e 41 42 4c 45 5f 5a 49 50 56 46 53 0a  E_ENABLE_ZIPVFS.
1cb40 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 5a      extern int Z
1cb50 69 70 76 66 73 5f 49 6e 69 74 28 54 63 6c 5f 49  ipvfs_Init(Tcl_I
1cb60 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 5a 69 70  nterp*);.    Zip
1cb70 76 66 73 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  vfs_Init(interp)
1cb80 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 53 71  ;.#endif..    Sq
1cb90 6c 69 74 65 63 6f 6e 66 69 67 5f 49 6e 69 74 28  liteconfig_Init(
1cba0 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
1cbb0 69 74 65 74 65 73 74 31 5f 49 6e 69 74 28 69 6e  itetest1_Init(in
1cbc0 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
1cbd0 65 74 65 73 74 32 5f 49 6e 69 74 28 69 6e 74 65  etest2_Init(inte
1cbe0 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
1cbf0 65 73 74 33 5f 49 6e 69 74 28 69 6e 74 65 72 70  est3_Init(interp
1cc00 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
1cc10 74 34 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  t4_Init(interp);
1cc20 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 35  .    Sqlitetest5
1cc30 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
1cc40 20 20 20 53 71 6c 69 74 65 74 65 73 74 36 5f 49     Sqlitetest6_I
1cc50 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1cc60 20 53 71 6c 69 74 65 74 65 73 74 37 5f 49 6e 69   Sqlitetest7_Ini
1cc70 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
1cc80 71 6c 69 74 65 74 65 73 74 38 5f 49 6e 69 74 28  qlitetest8_Init(
1cc90 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
1cca0 69 74 65 74 65 73 74 39 5f 49 6e 69 74 28 69 6e  itetest9_Init(in
1ccb0 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
1ccc0 65 74 65 73 74 61 73 79 6e 63 5f 49 6e 69 74 28  etestasync_Init(
1ccd0 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
1cce0 69 74 65 74 65 73 74 5f 61 75 74 6f 65 78 74 5f  itetest_autoext_
1ccf0 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
1cd00 20 20 53 71 6c 69 74 65 74 65 73 74 5f 62 6c 6f    Sqlitetest_blo
1cd10 62 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  b_Init(interp);.
1cd20 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 5f 64      Sqlitetest_d
1cd30 65 6d 6f 76 66 73 5f 49 6e 69 74 28 69 6e 74 65  emovfs_Init(inte
1cd40 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
1cd50 65 73 74 5f 66 75 6e 63 5f 49 6e 69 74 28 69 6e  est_func_Init(in
1cd60 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
1cd70 65 74 65 73 74 5f 68 65 78 69 6f 5f 49 6e 69 74  etest_hexio_Init
1cd80 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1cd90 6c 69 74 65 74 65 73 74 5f 69 6e 69 74 5f 49 6e  litetest_init_In
1cda0 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1cdb0 53 71 6c 69 74 65 74 65 73 74 5f 6d 61 6c 6c 6f  Sqlitetest_mallo
1cdc0 63 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  c_Init(interp);.
1cdd0 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 5f 6d      Sqlitetest_m
1cde0 75 74 65 78 5f 49 6e 69 74 28 69 6e 74 65 72 70  utex_Init(interp
1cdf0 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
1ce00 74 73 63 68 65 6d 61 5f 49 6e 69 74 28 69 6e 74  tschema_Init(int
1ce10 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1ce20 74 65 73 74 74 63 6c 76 61 72 5f 49 6e 69 74 28  testtclvar_Init(
1ce30 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
1ce40 69 74 65 74 65 73 74 66 73 5f 49 6e 69 74 28 69  itetestfs_Init(i
1ce50 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1ce60 74 65 74 65 73 74 54 68 72 65 61 64 5f 49 6e 69  tetestThread_Ini
1ce70 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
1ce80 71 6c 69 74 65 74 65 73 74 4f 6e 65 66 69 6c 65  qlitetestOnefile
1ce90 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
1cea0 20 20 20 53 71 6c 69 74 65 74 65 73 74 4f 73 69     SqlitetestOsi
1ceb0 6e 73 74 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  nst_Init(interp)
1cec0 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
1ced0 62 61 63 6b 75 70 5f 49 6e 69 74 28 69 6e 74 65  backup_Init(inte
1cee0 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
1cef0 65 73 74 69 6e 74 61 72 72 61 79 5f 49 6e 69 74  estintarray_Init
1cf00 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1cf10 6c 69 74 65 74 65 73 74 76 66 73 5f 49 6e 69 74  litetestvfs_Init
1cf20 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1cf30 6c 69 74 65 74 65 73 74 72 74 72 65 65 5f 49 6e  litetestrtree_In
1cf40 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1cf50 53 71 6c 69 74 65 71 75 6f 74 61 5f 49 6e 69 74  Sqlitequota_Init
1cf60 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1cf70 6c 69 74 65 6d 75 6c 74 69 70 6c 65 78 5f 49 6e  litemultiplex_In
1cf80 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1cf90 53 71 6c 69 74 65 53 75 70 65 72 6c 6f 63 6b 5f  SqliteSuperlock_
1cfa0 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
1cfb0 20 20 53 71 6c 69 74 65 74 65 73 74 53 79 73 63    SqlitetestSysc
1cfc0 61 6c 6c 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  all_Init(interp)
1cfd0 3b 0a 20 20 20 20 46 74 73 35 74 63 6c 5f 49 6e  ;.    Fts5tcl_In
1cfe0 69 74 28 69 6e 74 65 72 70 29 3b 0a 0a 23 69 66  it(interp);..#if
1cff0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1d000 45 4e 41 42 4c 45 5f 46 54 53 33 29 20 7c 7c 20  ENABLE_FTS3) || 
1d010 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
1d020 4e 41 42 4c 45 5f 46 54 53 34 29 0a 20 20 20 20  NABLE_FTS4).    
1d030 53 71 6c 69 74 65 74 65 73 74 66 74 73 33 5f 49  Sqlitetestfts3_I
1d040 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 23 65 6e  nit(interp);.#en
1d050 64 69 66 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65  dif..    Tcl_Cre
1d060 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 0a 20  ateObjCommand(. 
1d070 20 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20 22         interp, "
1d080 6c 6f 61 64 5f 74 65 73 74 66 69 78 74 75 72 65  load_testfixture
1d090 5f 65 78 74 65 6e 73 69 6f 6e 73 22 2c 20 69 6e  _extensions", in
1d0a0 69 74 5f 61 6c 6c 5f 63 6d 64 2c 20 30 2c 20 30  it_all_cmd, 0, 0
1d0b0 0a 20 20 20 20 29 3b 0a 20 20 20 20 54 63 6c 5f  .    );.    Tcl_
1d0c0 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
1d0d0 28 0a 20 20 20 20 20 20 20 20 69 6e 74 65 72 70  (.        interp
1d0e0 2c 20 22 64 62 5f 75 73 65 5f 6c 65 67 61 63 79  , "db_use_legacy
1d0f0 5f 70 72 65 70 61 72 65 22 2c 20 64 62 5f 75 73  _prepare", db_us
1d100 65 5f 6c 65 67 61 63 79 5f 70 72 65 70 61 72 65  e_legacy_prepare
1d110 5f 63 6d 64 2c 20 30 2c 20 30 0a 20 20 20 20 29  _cmd, 0, 0.    )
1d120 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  ;.    Tcl_Create
1d130 4f 62 6a 43 6f 6d 6d 61 6e 64 28 0a 20 20 20 20  ObjCommand(.    
1d140 20 20 20 20 69 6e 74 65 72 70 2c 20 22 64 62 5f      interp, "db_
1d150 6c 61 73 74 5f 73 74 6d 74 5f 70 74 72 22 2c 20  last_stmt_ptr", 
1d160 64 62 5f 6c 61 73 74 5f 73 74 6d 74 5f 70 74 72  db_last_stmt_ptr
1d170 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 0a 23  , 0, 0.    );..#
1d180 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 53 45  ifdef SQLITE_SSE
1d190 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 73  .    Sqlitetests
1d1a0 73 65 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  se_Init(interp);
1d1b0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64  .#endif.  }.#end
1d1c0 69 66 0a 7d 0a 0a 2f 2a 20 4e 65 65 64 65 64 20  if.}../* Needed 
1d1d0 66 6f 72 20 74 68 65 20 73 65 74 72 6c 69 6d 69  for the setrlimi
1d1e0 74 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  t() system call 
1d1f0 6f 6e 20 75 6e 69 78 20 2a 2f 0a 23 69 66 20 64  on unix */.#if d
1d200 65 66 69 6e 65 64 28 75 6e 69 78 29 0a 23 69 6e  efined(unix).#in
1d210 63 6c 75 64 65 20 3c 73 79 73 2f 72 65 73 6f 75  clude <sys/resou
1d220 72 63 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23  rce.h>.#endif..#
1d230 64 65 66 69 6e 65 20 54 43 4c 53 48 5f 4d 41 49  define TCLSH_MAI
1d240 4e 20 6d 61 69 6e 20 20 20 2f 2a 20 4e 65 65 64  N main   /* Need
1d250 65 64 20 74 6f 20 66 61 6b 65 20 6f 75 74 20 6d  ed to fake out m
1d260 6b 74 63 6c 61 70 70 20 2a 2f 0a 69 6e 74 20 54  ktclapp */.int T
1d270 43 4c 53 48 5f 4d 41 49 4e 28 69 6e 74 20 61 72  CLSH_MAIN(int ar
1d280 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29  gc, char **argv)
1d290 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  {.  Tcl_Interp *
1d2a0 69 6e 74 65 72 70 3b 0a 0a 23 69 66 20 21 64 65  interp;..#if !de
1d2b0 66 69 6e 65 64 28 5f 57 49 4e 33 32 5f 57 43 45  fined(_WIN32_WCE
1d2c0 29 0a 20 20 69 66 28 20 67 65 74 65 6e 76 28 22  ).  if( getenv("
1d2d0 42 52 45 41 4b 22 29 20 29 7b 0a 20 20 20 20 66  BREAK") ){.    f
1d2e0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 0a 20  printf(stderr,. 
1d2f0 20 20 20 20 20 20 20 22 61 74 74 61 63 68 20 64         "attach d
1d300 65 62 75 67 67 65 72 20 74 6f 20 70 72 6f 63 65  ebugger to proce
1d310 73 73 20 25 64 20 61 6e 64 20 70 72 65 73 73 20  ss %d and press 
1d320 61 6e 79 20 6b 65 79 20 74 6f 20 63 6f 6e 74 69  any key to conti
1d330 6e 75 65 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 20  nue.\n",.       
1d340 20 47 45 54 50 49 44 28 29 29 3b 0a 20 20 20 20   GETPID());.    
1d350 66 67 65 74 63 28 73 74 64 69 6e 29 3b 0a 20 20  fgetc(stdin);.  
1d360 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53  }.#endif..  /* S
1d370 69 6e 63 65 20 74 68 65 20 70 72 69 6d 61 72 79  ince the primary
1d380 20 75 73 65 20 63 61 73 65 20 66 6f 72 20 74 68   use case for th
1d390 69 73 20 62 69 6e 61 72 79 20 69 73 20 74 65 73  is binary is tes
1d3a0 74 69 6e 67 20 6f 66 20 53 51 4c 69 74 65 2c 0a  ting of SQLite,.
1d3b0 20 20 2a 2a 20 62 65 20 73 75 72 65 20 74 6f 20    ** be sure to 
1d3c0 67 65 6e 65 72 61 74 65 20 63 6f 72 65 20 66 69  generate core fi
1d3d0 6c 65 73 20 69 66 20 77 65 20 63 72 61 73 68 20  les if we crash 
1d3e0 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
1d3f0 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20 64  QLITE_TEST) && d
1d400 65 66 69 6e 65 64 28 75 6e 69 78 29 0a 20 20 7b  efined(unix).  {
1d410 20 73 74 72 75 63 74 20 72 6c 69 6d 69 74 20 78   struct rlimit x
1d420 3b 0a 20 20 20 20 67 65 74 72 6c 69 6d 69 74 28  ;.    getrlimit(
1d430 52 4c 49 4d 49 54 5f 43 4f 52 45 2c 20 26 78 29  RLIMIT_CORE, &x)
1d440 3b 0a 20 20 20 20 78 2e 72 6c 69 6d 5f 63 75 72  ;.    x.rlim_cur
1d450 20 3d 20 78 2e 72 6c 69 6d 5f 6d 61 78 3b 0a 20   = x.rlim_max;. 
1d460 20 20 20 73 65 74 72 6c 69 6d 69 74 28 52 4c 49     setrlimit(RLI
1d470 4d 49 54 5f 43 4f 52 45 2c 20 26 78 29 3b 0a 20  MIT_CORE, &x);. 
1d480 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
1d490 49 54 45 5f 54 45 53 54 20 26 26 20 75 6e 69 78  ITE_TEST && unix
1d4a0 20 2a 2f 0a 0a 0a 20 20 2f 2a 20 43 61 6c 6c 20   */...  /* Call 
1d4b0 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e  sqlite3_shutdown
1d4c0 28 29 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 64  () once before d
1d4d0 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c  oing anything el
1d4e0 73 65 2e 20 54 68 69 73 20 69 73 20 74 6f 0a 20  se. This is to. 
1d4f0 20 2a 2a 20 74 65 73 74 20 74 68 61 74 20 73 71   ** test that sq
1d500 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 29  lite3_shutdown()
1d510 20 63 61 6e 20 62 65 20 73 61 66 65 6c 79 20 63   can be safely c
1d520 61 6c 6c 65 64 20 62 79 20 61 20 70 72 6f 63 65  alled by a proce
1d530 73 73 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 73  ss before.  ** s
1d540 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a  qlite3_initializ
1d550 65 28 29 20 69 73 2e 20 2a 2f 0a 20 20 73 71 6c  e() is. */.  sql
1d560 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 29 3b  ite3_shutdown();
1d570 0a 0a 20 20 54 63 6c 5f 46 69 6e 64 45 78 65 63  ..  Tcl_FindExec
1d580 75 74 61 62 6c 65 28 61 72 67 76 5b 30 5d 29 3b  utable(argv[0]);
1d590 0a 20 20 54 63 6c 5f 53 65 74 53 79 73 74 65 6d  .  Tcl_SetSystem
1d5a0 45 6e 63 6f 64 69 6e 67 28 4e 55 4c 4c 2c 20 22  Encoding(NULL, "
1d5b0 75 74 66 2d 38 22 29 3b 0a 20 20 69 6e 74 65 72  utf-8");.  inter
1d5c0 70 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 49 6e  p = Tcl_CreateIn
1d5d0 74 65 72 70 28 29 3b 0a 0a 23 69 66 20 54 43 4c  terp();..#if TCL
1d5e0 53 48 3d 3d 32 0a 20 20 73 71 6c 69 74 65 33 5f  SH==2.  sqlite3_
1d5f0 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f  config(SQLITE_CO
1d600 4e 46 49 47 5f 53 49 4e 47 4c 45 54 48 52 45 41  NFIG_SINGLETHREA
1d610 44 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 6e  D);.#endif..  in
1d620 69 74 5f 61 6c 6c 28 69 6e 74 65 72 70 29 3b 0a  it_all(interp);.
1d630 20 20 69 66 28 20 61 72 67 63 3e 3d 32 20 29 7b    if( argc>=2 ){
1d640 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
1d650 63 68 61 72 20 7a 41 72 67 63 5b 33 32 5d 3b 0a  char zArgc[32];.
1d660 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
1d670 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 41 72 67  intf(sizeof(zArg
1d680 63 29 2c 20 7a 41 72 67 63 2c 20 22 25 64 22 2c  c), zArgc, "%d",
1d690 20 61 72 67 63 2d 28 33 2d 54 43 4c 53 48 29 29   argc-(3-TCLSH))
1d6a0 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72  ;.    Tcl_SetVar
1d6b0 28 69 6e 74 65 72 70 2c 22 61 72 67 63 22 2c 20  (interp,"argc", 
1d6c0 7a 41 72 67 63 2c 20 54 43 4c 5f 47 4c 4f 42 41  zArgc, TCL_GLOBA
1d6d0 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 54 63 6c  L_ONLY);.    Tcl
1d6e0 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 22  _SetVar(interp,"
1d6f0 61 72 67 76 30 22 2c 61 72 67 76 5b 31 5d 2c 54  argv0",argv[1],T
1d700 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b  CL_GLOBAL_ONLY);
1d710 0a 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28  .    Tcl_SetVar(
1d720 69 6e 74 65 72 70 2c 22 61 72 67 76 22 2c 20 22  interp,"argv", "
1d730 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e  ", TCL_GLOBAL_ON
1d740 4c 59 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 33  LY);.    for(i=3
1d750 2d 54 43 4c 53 48 3b 20 69 3c 61 72 67 63 3b 20  -TCLSH; i<argc; 
1d760 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  i++){.      Tcl_
1d770 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 20 22  SetVar(interp, "
1d780 61 72 67 76 22 2c 20 61 72 67 76 5b 69 5d 2c 0a  argv", argv[i],.
1d790 20 20 20 20 20 20 20 20 20 20 54 43 4c 5f 47 4c            TCL_GL
1d7a0 4f 42 41 4c 5f 4f 4e 4c 59 20 7c 20 54 43 4c 5f  OBAL_ONLY | TCL_
1d7b0 4c 49 53 54 5f 45 4c 45 4d 45 4e 54 20 7c 20 54  LIST_ELEMENT | T
1d7c0 43 4c 5f 41 50 50 45 4e 44 5f 56 41 4c 55 45 29  CL_APPEND_VALUE)
1d7d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1d7e0 54 43 4c 53 48 3d 3d 31 20 26 26 20 54 63 6c 5f  TCLSH==1 && Tcl_
1d7f0 45 76 61 6c 46 69 6c 65 28 69 6e 74 65 72 70 2c  EvalFile(interp,
1d800 20 61 72 67 76 5b 31 5d 29 21 3d 54 43 4c 5f 4f   argv[1])!=TCL_O
1d810 4b 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  K ){.      const
1d820 20 63 68 61 72 20 2a 7a 49 6e 66 6f 20 3d 20 54   char *zInfo = T
1d830 63 6c 5f 47 65 74 56 61 72 28 69 6e 74 65 72 70  cl_GetVar(interp
1d840 2c 20 22 65 72 72 6f 72 49 6e 66 6f 22 2c 20 54  , "errorInfo", T
1d850 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b  CL_GLOBAL_ONLY);
1d860 0a 20 20 20 20 20 20 69 66 28 20 7a 49 6e 66 6f  .      if( zInfo
1d870 3d 3d 30 20 29 20 7a 49 6e 66 6f 20 3d 20 54 63  ==0 ) zInfo = Tc
1d880 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
1d890 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 20  t(interp);.     
1d8a0 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
1d8b0 22 25 73 3a 20 25 73 5c 6e 22 2c 20 2a 61 72 67  "%s: %s\n", *arg
1d8c0 76 2c 20 7a 49 6e 66 6f 29 3b 0a 20 20 20 20 20  v, zInfo);.     
1d8d0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
1d8e0 0a 20 20 7d 0a 20 20 69 66 28 20 54 43 4c 53 48  .  }.  if( TCLSH
1d8f0 3d 3d 32 20 7c 7c 20 61 72 67 63 3c 3d 31 20 29  ==2 || argc<=1 )
1d900 7b 0a 20 20 20 20 54 63 6c 5f 47 6c 6f 62 61 6c  {.    Tcl_Global
1d910 45 76 61 6c 28 69 6e 74 65 72 70 2c 20 74 63 6c  Eval(interp, tcl
1d920 73 68 5f 6d 61 69 6e 5f 6c 6f 6f 70 28 29 29 3b  sh_main_loop());
1d930 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
1d940 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 54 43 4c  .}.#endif /* TCL
1d950 53 48 20 2a 2f 0a                                SH */.