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

Artifact fa72a7c5278662357c105ba7925c1d0972506ff9:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 41 20 54 43 4c 20  ******.** A TCL 
0180: 49 6e 74 65 72 66 61 63 65 20 74 6f 20 53 51 4c  Interface to SQL
0190: 69 74 65 2e 20 20 41 70 70 65 6e 64 20 74 68 69  ite.  Append thi
01a0: 73 20 66 69 6c 65 20 74 6f 20 73 71 6c 69 74 65  s file to sqlite
01b0: 33 2e 63 20 61 6e 64 0a 2a 2a 20 63 6f 6d 70 69  3.c and.** compi
01c0: 6c 65 20 74 68 65 20 77 68 6f 6c 65 20 74 68 69  le the whole thi
01d0: 6e 67 20 74 6f 20 62 75 69 6c 64 20 61 20 54 43  ng to build a TC
01e0: 4c 2d 65 6e 61 62 6c 65 64 20 76 65 72 73 69 6f  L-enabled versio
01f0: 6e 20 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2a 0a  n of SQLite..**.
0200: 2a 2a 20 43 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  ** Compile-time 
0210: 6f 70 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20  options:.**.**  
0220: 2d 44 54 43 4c 53 48 3d 31 20 20 20 20 20 20 20  -DTCLSH=1       
0230: 20 20 20 20 20 20 41 64 64 20 61 20 22 6d 61 69        Add a "mai
0240: 6e 28 29 22 20 72 6f 75 74 69 6e 65 20 74 68 61  n()" routine tha
0250: 74 20 77 6f 72 6b 73 20 61 73 20 61 20 74 63 6c  t works as a tcl
0260: 73 68 2e 0a 2a 2a 0a 2a 2a 20 20 2d 44 53 51 4c  sh..**.**  -DSQL
0270: 49 54 45 5f 54 43 4c 4d 44 35 20 20 20 20 20 20  ITE_TCLMD5      
0280: 20 57 68 65 6e 20 75 73 65 64 20 69 6e 20 63 6f   When used in co
0290: 6e 6a 75 63 74 69 6f 6e 20 77 69 74 68 20 2d 44  njuction with -D
02a0: 54 43 4c 53 48 3d 31 2c 20 61 64 64 0a 2a 2a 20  TCLSH=1, add.** 
02b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
02c0: 20 20 20 20 20 20 20 66 6f 75 72 20 6e 65 77 20         four new 
02d0: 63 6f 6d 6d 61 6e 64 73 20 74 6f 20 74 68 65 20  commands to the 
02e0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
02f0: 66 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  for.**          
0300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 65                ge
0310: 6e 65 72 61 74 69 6e 67 20 4d 44 35 20 63 68 65  nerating MD5 che
0320: 63 6b 73 75 6d 73 3a 20 20 6d 64 35 2c 20 6d 64  cksums:  md5, md
0330: 35 66 69 6c 65 2c 0a 2a 2a 20 20 20 20 20 20 20  5file,.**       
0340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0350: 20 6d 64 35 2d 31 30 78 38 2c 20 61 6e 64 20 6d   md5-10x8, and m
0360: 64 35 66 69 6c 65 2d 31 30 78 38 2e 0a 2a 2a 0a  d5file-10x8..**.
0370: 2a 2a 20 20 2d 44 53 51 4c 49 54 45 5f 54 45 53  **  -DSQLITE_TES
0380: 54 20 20 20 20 20 20 20 20 20 57 68 65 6e 20 75  T         When u
0390: 73 65 64 20 69 6e 20 63 6f 6e 6a 75 63 74 69 6f  sed in conjuctio
03a0: 6e 20 77 69 74 68 20 2d 44 54 43 4c 53 48 3d 31  n with -DTCLSH=1
03b0: 2c 20 61 64 64 0a 2a 2a 20 20 20 20 20 20 20 20  , add.**        
03c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
03d0: 68 75 6e 64 72 65 64 73 20 6f 66 20 6e 65 77 20  hundreds of new 
03e0: 63 6f 6d 6d 61 6e 64 73 20 75 73 65 64 20 66 6f  commands used fo
03f0: 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20 20 20 20  r testing.**    
0400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0410: 20 20 20 20 53 51 4c 69 74 65 2e 20 20 54 68 69      SQLite.  Thi
0420: 73 20 6f 70 74 69 6f 6e 20 69 6d 70 6c 69 65 73  s option implies
0430: 20 2d 44 53 51 4c 49 54 45 5f 54 43 4c 4d 44 35   -DSQLITE_TCLMD5
0440: 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 72  ..*/../*.** If r
0450: 65 71 75 65 73 74 65 64 2c 20 69 6e 63 6c 75 64  equested, includ
0460: 65 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 6d  e the SQLite com
0470: 70 69 6c 65 72 20 6f 70 74 69 6f 6e 73 20 66 69  piler options fi
0480: 6c 65 20 66 6f 72 20 4d 53 56 43 2e 0a 2a 2f 0a  le for MSVC..*/.
0490: 23 69 66 20 64 65 66 69 6e 65 64 28 49 4e 43 4c  #if defined(INCL
04a0: 55 44 45 5f 4d 53 56 43 5f 48 29 0a 23 69 6e 63  UDE_MSVC_H).#inc
04b0: 6c 75 64 65 20 22 6d 73 76 63 2e 68 22 0a 23 65  lude "msvc.h".#e
04c0: 6e 64 69 66 0a 0a 23 69 6e 63 6c 75 64 65 20 22  ndif..#include "
04d0: 74 63 6c 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  tcl.h".#include 
04e0: 3c 65 72 72 6e 6f 2e 68 3e 0a 0a 2f 2a 0a 2a 2a  <errno.h>../*.**
04f0: 20 53 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c   Some additional
0500: 20 69 6e 63 6c 75 64 65 20 66 69 6c 65 73 20 61   include files a
0510: 72 65 20 6e 65 65 64 65 64 20 69 66 20 74 68 69  re needed if thi
0520: 73 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a  s file is not.**
0530: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
0540: 20 61 6d 61 6c 67 61 6d 61 74 69 6f 6e 2e 0a 2a   amalgamation..*
0550: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
0560: 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 0a 23 20  _AMALGAMATION.# 
0570: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33  include "sqlite3
0580: 2e 68 22 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73  .h".# include <s
0590: 74 64 6c 69 62 2e 68 3e 0a 23 20 69 6e 63 6c 75  tdlib.h>.# inclu
05a0: 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 20  de <string.h>.# 
05b0: 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e  include <assert.
05c0: 68 3e 0a 20 20 74 79 70 65 64 65 66 20 75 6e 73  h>.  typedef uns
05d0: 69 67 6e 65 64 20 63 68 61 72 20 75 38 3b 0a 23  igned char u8;.#
05e0: 65 6e 64 69 66 0a 23 69 6e 63 6c 75 64 65 20 3c  endif.#include <
05f0: 63 74 79 70 65 2e 68 3e 0a 0a 2f 2a 20 55 73 65  ctype.h>../* Use
0600: 64 20 74 6f 20 67 65 74 20 74 68 65 20 63 75 72  d to get the cur
0610: 72 65 6e 74 20 70 72 6f 63 65 73 73 20 49 44 20  rent process ID 
0620: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
0630: 5f 57 49 4e 33 32 29 0a 23 20 69 6e 63 6c 75 64  _WIN32).# includ
0640: 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 20 64  e <unistd.h>.# d
0650: 65 66 69 6e 65 20 47 45 54 50 49 44 20 67 65 74  efine GETPID get
0660: 70 69 64 0a 23 65 6c 69 66 20 21 64 65 66 69 6e  pid.#elif !defin
0670: 65 64 28 5f 57 49 4e 33 32 5f 57 43 45 29 0a 23  ed(_WIN32_WCE).#
0680: 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 41   ifndef SQLITE_A
0690: 4d 41 4c 47 41 4d 41 54 49 4f 4e 0a 23 20 20 64  MALGAMATION.#  d
06a0: 65 66 69 6e 65 20 57 49 4e 33 32 5f 4c 45 41 4e  efine WIN32_LEAN
06b0: 5f 41 4e 44 5f 4d 45 41 4e 0a 23 20 20 69 6e 63  _AND_MEAN.#  inc
06c0: 6c 75 64 65 20 3c 77 69 6e 64 6f 77 73 2e 68 3e  lude <windows.h>
06d0: 0a 23 20 65 6e 64 69 66 0a 23 20 64 65 66 69 6e  .# endif.# defin
06e0: 65 20 47 45 54 50 49 44 20 28 69 6e 74 29 47 65  e GETPID (int)Ge
06f0: 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
0700: 64 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20  d.#endif../*. * 
0710: 57 69 6e 64 6f 77 73 20 6e 65 65 64 73 20 74 6f  Windows needs to
0720: 20 6b 6e 6f 77 20 77 68 69 63 68 20 73 79 6d 62   know which symb
0730: 6f 6c 73 20 74 6f 20 65 78 70 6f 72 74 2e 20 20  ols to export.  
0740: 55 6e 69 78 20 64 6f 65 73 20 6e 6f 74 2e 0a 20  Unix does not.. 
0750: 2a 20 42 55 49 4c 44 5f 73 71 6c 69 74 65 20 73  * BUILD_sqlite s
0760: 68 6f 75 6c 64 20 62 65 20 75 6e 64 65 66 69 6e  hould be undefin
0770: 65 64 20 66 6f 72 20 55 6e 69 78 2e 0a 20 2a 2f  ed for Unix.. */
0780: 0a 23 69 66 64 65 66 20 42 55 49 4c 44 5f 73 71  .#ifdef BUILD_sq
0790: 6c 69 74 65 0a 23 75 6e 64 65 66 20 54 43 4c 5f  lite.#undef TCL_
07a0: 53 54 4f 52 41 47 45 5f 43 4c 41 53 53 0a 23 64  STORAGE_CLASS.#d
07b0: 65 66 69 6e 65 20 54 43 4c 5f 53 54 4f 52 41 47  efine TCL_STORAG
07c0: 45 5f 43 4c 41 53 53 20 44 4c 4c 45 58 50 4f 52  E_CLASS DLLEXPOR
07d0: 54 0a 23 65 6e 64 69 66 20 2f 2a 20 42 55 49 4c  T.#endif /* BUIL
07e0: 44 5f 73 71 6c 69 74 65 20 2a 2f 0a 0a 23 64 65  D_sqlite */..#de
07f0: 66 69 6e 65 20 4e 55 4d 5f 50 52 45 50 41 52 45  fine NUM_PREPARE
0800: 44 5f 53 54 4d 54 53 20 31 30 0a 23 64 65 66 69  D_STMTS 10.#defi
0810: 6e 65 20 4d 41 58 5f 50 52 45 50 41 52 45 44 5f  ne MAX_PREPARED_
0820: 53 54 4d 54 53 20 31 30 30 0a 0a 2f 2a 20 46 6f  STMTS 100../* Fo
0830: 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
0840: 6e 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  n */.typedef str
0850: 75 63 74 20 53 71 6c 69 74 65 44 62 20 53 71 6c  uct SqliteDb Sql
0860: 69 74 65 44 62 3b 0a 0a 2f 2a 0a 2a 2a 20 4e 65  iteDb;../*.** Ne
0870: 77 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20  w SQL functions 
0880: 63 61 6e 20 62 65 20 63 72 65 61 74 65 64 20 61  can be created a
0890: 73 20 54 43 4c 20 73 63 72 69 70 74 73 2e 20 20  s TCL scripts.  
08a0: 45 61 63 68 20 73 75 63 68 20 66 75 6e 63 74 69  Each such functi
08b0: 6f 6e 0a 2a 2a 20 69 73 20 64 65 73 63 72 69 62  on.** is describ
08c0: 65 64 20 62 79 20 61 6e 20 69 6e 73 74 61 6e 63  ed by an instanc
08d0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
08e0: 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  ng structure..*/
08f0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0900: 53 71 6c 46 75 6e 63 20 53 71 6c 46 75 6e 63 3b  SqlFunc SqlFunc;
0910: 0a 73 74 72 75 63 74 20 53 71 6c 46 75 6e 63 20  .struct SqlFunc 
0920: 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  {.  Tcl_Interp *
0930: 69 6e 74 65 72 70 3b 20 20 20 2f 2a 20 54 68 65  interp;   /* The
0940: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 20 74   TCL interpret t
0950: 6f 20 65 78 65 63 75 74 65 20 74 68 65 20 66 75  o execute the fu
0960: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
0970: 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 20 20 20  Obj *pScript;   
0980: 20 20 2f 2a 20 54 68 65 20 54 63 6c 5f 4f 62 6a    /* The Tcl_Obj
0990: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
09a0: 6f 66 20 74 68 65 20 73 63 72 69 70 74 20 2a 2f  of the script */
09b0: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
09c0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  ;        /* Data
09d0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
09e0: 74 68 61 74 20 6f 77 6e 73 20 74 68 69 73 20 66  that owns this f
09f0: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  unction */.  int
0a00: 20 75 73 65 45 76 61 6c 4f 62 6a 76 3b 20 20 20   useEvalObjv;   
0a10: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 74     /* True if it
0a20: 20 69 73 20 73 61 66 65 20 74 6f 20 75 73 65 20   is safe to use 
0a30: 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 20 2a 2f 0a  Tcl_EvalObjv */.
0a40: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20    char *zName;  
0a50: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
0a60: 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
0a70: 20 2a 2f 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70   */.  SqlFunc *p
0a80: 4e 65 78 74 3b 20 20 20 20 20 20 20 2f 2a 20 4e  Next;       /* N
0a90: 65 78 74 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 20  ext function on 
0aa0: 74 68 65 20 6c 69 73 74 20 6f 66 20 74 68 65 6d  the list of them
0ab0: 20 61 6c 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a   all */.};../*.*
0ac0: 2a 20 4e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20  * New collation 
0ad0: 73 65 71 75 65 6e 63 65 73 20 66 75 6e 63 74 69  sequences functi
0ae0: 6f 6e 20 63 61 6e 20 62 65 20 63 72 65 61 74 65  on can be create
0af0: 64 20 61 73 20 54 43 4c 20 73 63 72 69 70 74 73  d as TCL scripts
0b00: 2e 20 20 45 61 63 68 20 73 75 63 68 0a 2a 2a 20  .  Each such.** 
0b10: 66 75 6e 63 74 69 6f 6e 20 69 73 20 64 65 73 63  function is desc
0b20: 72 69 62 65 64 20 62 79 20 61 6e 20 69 6e 73 74  ribed by an inst
0b30: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
0b40: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e  owing structure.
0b50: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
0b60: 63 74 20 53 71 6c 43 6f 6c 6c 61 74 65 20 53 71  ct SqlCollate Sq
0b70: 6c 43 6f 6c 6c 61 74 65 3b 0a 73 74 72 75 63 74  lCollate;.struct
0b80: 20 53 71 6c 43 6f 6c 6c 61 74 65 20 7b 0a 20 20   SqlCollate {.  
0b90: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
0ba0: 72 70 3b 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  rp;   /* The TCL
0bb0: 20 69 6e 74 65 72 70 72 65 74 20 74 6f 20 65 78   interpret to ex
0bc0: 65 63 75 74 65 20 74 68 65 20 66 75 6e 63 74 69  ecute the functi
0bd0: 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53  on */.  char *zS
0be0: 63 72 69 70 74 3b 20 20 20 20 20 20 20 20 2f 2a  cript;        /*
0bf0: 20 54 68 65 20 73 63 72 69 70 74 20 74 6f 20 62   The script to b
0c00: 65 20 72 75 6e 20 2a 2f 0a 20 20 53 71 6c 43 6f  e run */.  SqlCo
0c10: 6c 6c 61 74 65 20 2a 70 4e 65 78 74 3b 20 20 20  llate *pNext;   
0c20: 20 2f 2a 20 4e 65 78 74 20 66 75 6e 63 74 69 6f   /* Next functio
0c30: 6e 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 6f 66  n on the list of
0c40: 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 7d 3b 0a   them all */.};.
0c50: 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 64 20  ./*.** Prepared 
0c60: 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 63  statements are c
0c70: 61 63 68 65 64 20 66 6f 72 20 66 61 73 74 65 72  ached for faster
0c80: 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 45 61 63   execution.  Eac
0c90: 68 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73 74  h prepared.** st
0ca0: 61 74 65 6d 65 6e 74 20 69 73 20 64 65 73 63 72  atement is descr
0cb0: 69 62 65 64 20 62 79 20 61 6e 20 69 6e 73 74 61  ibed by an insta
0cc0: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
0cd0: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
0ce0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
0cf0: 74 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d  t SqlPreparedStm
0d00: 74 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d  t SqlPreparedStm
0d10: 74 3b 0a 73 74 72 75 63 74 20 53 71 6c 50 72 65  t;.struct SqlPre
0d20: 70 61 72 65 64 53 74 6d 74 20 7b 0a 20 20 53 71  paredStmt {.  Sq
0d30: 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70  lPreparedStmt *p
0d40: 4e 65 78 74 3b 20 20 2f 2a 20 4e 65 78 74 20 69  Next;  /* Next i
0d50: 6e 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 2a 2f  n linked list */
0d60: 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74  .  SqlPreparedSt
0d70: 6d 74 20 2a 70 50 72 65 76 3b 20 20 2f 2a 20 50  mt *pPrev;  /* P
0d80: 72 65 76 69 6f 75 73 20 6f 6e 20 74 68 65 20 6c  revious on the l
0d90: 69 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ist */.  sqlite3
0da0: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20  _stmt *pStmt;   
0db0: 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65    /* The prepare
0dc0: 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  d statement */. 
0dd0: 20 69 6e 74 20 6e 53 71 6c 3b 20 20 20 20 20 20   int nSql;      
0de0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 68 61            /* cha
0df0: 72 73 20 69 6e 20 7a 53 71 6c 5b 5d 20 2a 2f 0a  rs in zSql[] */.
0e00: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
0e10: 71 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 65  ql;        /* Te
0e20: 78 74 20 6f 66 20 74 68 65 20 53 51 4c 20 73 74  xt of the SQL st
0e30: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
0e40: 20 6e 50 61 72 6d 3b 20 20 20 20 20 20 20 20 20   nParm;         
0e50: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
0e60: 20 61 70 50 61 72 6d 20 61 72 72 61 79 20 2a 2f   apParm array */
0e70: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 50  .  Tcl_Obj **apP
0e80: 61 72 6d 3b 20 20 20 20 20 20 20 20 2f 2a 20 41  arm;        /* A
0e90: 72 72 61 79 20 6f 66 20 72 65 66 65 72 65 6e 63  rray of referenc
0ea0: 65 64 20 6f 62 6a 65 63 74 20 70 6f 69 6e 74 65  ed object pointe
0eb0: 72 73 20 2a 2f 0a 7d 3b 0a 0a 74 79 70 65 64 65  rs */.};..typede
0ec0: 66 20 73 74 72 75 63 74 20 49 6e 63 72 62 6c 6f  f struct Incrblo
0ed0: 62 43 68 61 6e 6e 65 6c 20 49 6e 63 72 62 6c 6f  bChannel Incrblo
0ee0: 62 43 68 61 6e 6e 65 6c 3b 0a 0a 2f 2a 0a 2a 2a  bChannel;../*.**
0ef0: 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e   There is one in
0f00: 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73  stance of this s
0f10: 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 61 63  tructure for eac
0f20: 68 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  h SQLite databas
0f30: 65 0a 2a 2a 20 74 68 61 74 20 68 61 73 20 62 65  e.** that has be
0f40: 65 6e 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65  en opened by the
0f50: 20 53 51 4c 69 74 65 20 54 43 4c 20 69 6e 74 65   SQLite TCL inte
0f60: 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rface..**.** If 
0f70: 74 68 69 73 20 6d 6f 64 75 6c 65 20 69 73 20 62  this module is b
0f80: 75 69 6c 74 20 77 69 74 68 20 53 51 4c 49 54 45  uilt with SQLITE
0f90: 5f 54 45 53 54 20 64 65 66 69 6e 65 64 20 28 74  _TEST defined (t
0fa0: 6f 20 63 72 65 61 74 65 20 74 68 65 20 53 51 4c  o create the SQL
0fb0: 69 74 65 0a 2a 2a 20 74 65 73 74 66 69 78 74 75  ite.** testfixtu
0fc0: 72 65 20 65 78 65 63 75 74 61 62 6c 65 29 2c 20  re executable), 
0fd0: 74 68 65 6e 20 69 74 20 6d 61 79 20 62 65 20 63  then it may be c
0fe0: 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73 65  onfigured to use
0ff0: 20 65 69 74 68 65 72 0a 2a 2a 20 73 71 6c 69 74   either.** sqlit
1000: 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 29 20  e3_prepare_v2() 
1010: 6f 72 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  or sqlite3_prepa
1020: 72 65 28 29 20 74 6f 20 70 72 65 70 61 72 65 20  re() to prepare 
1030: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  SQL statements..
1040: 2a 2a 20 49 66 20 53 71 6c 69 74 65 44 62 2e 62  ** If SqliteDb.b
1050: 4c 65 67 61 63 79 50 72 65 70 61 72 65 20 69 73  LegacyPrepare is
1060: 20 74 72 75 65 2c 20 73 71 6c 69 74 65 33 5f 70   true, sqlite3_p
1070: 72 65 70 61 72 65 28 29 20 69 73 20 75 73 65 64  repare() is used
1080: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53 71 6c 69  ..*/.struct Sqli
1090: 74 65 44 62 20 7b 0a 20 20 73 71 6c 69 74 65 33  teDb {.  sqlite3
10a0: 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
10b0: 20 20 20 20 2f 2a 20 54 68 65 20 22 72 65 61 6c      /* The "real
10c0: 22 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63  " database struc
10d0: 74 75 72 65 2e 20 4d 55 53 54 20 42 45 20 46 49  ture. MUST BE FI
10e0: 52 53 54 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  RST */.  Tcl_Int
10f0: 65 72 70 20 2a 69 6e 74 65 72 70 3b 20 20 20 20  erp *interp;    
1100: 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 74 65 72      /* The inter
1110: 70 72 65 74 65 72 20 75 73 65 64 20 66 6f 72 20  preter used for 
1120: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f  this database */
1130: 0a 20 20 63 68 61 72 20 2a 7a 42 75 73 79 3b 20  .  char *zBusy; 
1140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1150: 20 54 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   The busy callba
1160: 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  ck routine */.  
1170: 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 20 20  char *zCommit;  
1180: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1190: 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 63 61  e commit hook ca
11a0: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a  llback routine *
11b0: 2f 0a 20 20 63 68 61 72 20 2a 7a 54 72 61 63 65  /.  char *zTrace
11c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
11d0: 2a 20 54 68 65 20 74 72 61 63 65 20 63 61 6c 6c  * The trace call
11e0: 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a  back routine */.
11f0: 20 20 63 68 61 72 20 2a 7a 50 72 6f 66 69 6c 65    char *zProfile
1200: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1210: 54 68 65 20 70 72 6f 66 69 6c 65 20 63 61 6c 6c  The profile call
1220: 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a  back routine */.
1230: 20 20 63 68 61 72 20 2a 7a 50 72 6f 67 72 65 73    char *zProgres
1240: 73 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s;           /* 
1250: 54 68 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c  The progress cal
1260: 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f  lback routine */
1270: 0a 20 20 63 68 61 72 20 2a 7a 41 75 74 68 3b 20  .  char *zAuth; 
1280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1290: 20 54 68 65 20 61 75 74 68 6f 72 69 7a 61 74 69   The authorizati
12a0: 6f 6e 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74  on callback rout
12b0: 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73  ine */.  int dis
12c0: 61 62 6c 65 41 75 74 68 3b 20 20 20 20 20 20 20  ableAuth;       
12d0: 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 74      /* Disable t
12e0: 68 65 20 61 75 74 68 6f 72 69 7a 65 72 20 69 66  he authorizer if
12f0: 20 69 74 20 65 78 69 73 74 73 20 2a 2f 0a 20 20   it exists */.  
1300: 63 68 61 72 20 2a 7a 4e 75 6c 6c 3b 20 20 20 20  char *zNull;    
1310: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
1320: 78 74 20 74 6f 20 73 75 62 73 74 69 74 75 74 65  xt to substitute
1330: 20 66 6f 72 20 61 6e 20 53 51 4c 20 4e 55 4c 4c   for an SQL NULL
1340: 20 76 61 6c 75 65 20 2a 2f 0a 20 20 53 71 6c 46   value */.  SqlF
1350: 75 6e 63 20 2a 70 46 75 6e 63 3b 20 20 20 20 20  unc *pFunc;     
1360: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
1370: 66 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20  f SQL functions 
1380: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 55  */.  Tcl_Obj *pU
1390: 70 64 61 74 65 48 6f 6f 6b 3b 20 20 20 20 20 20  pdateHook;      
13a0: 2f 2a 20 55 70 64 61 74 65 20 68 6f 6f 6b 20 73  /* Update hook s
13b0: 63 72 69 70 74 20 28 69 66 20 61 6e 79 29 20 2a  cript (if any) *
13c0: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 6f  /.  Tcl_Obj *pRo
13d0: 6c 6c 62 61 63 6b 48 6f 6f 6b 3b 20 20 20 20 2f  llbackHook;    /
13e0: 2a 20 52 6f 6c 6c 62 61 63 6b 20 68 6f 6f 6b 20  * Rollback hook 
13f0: 73 63 72 69 70 74 20 28 69 66 20 61 6e 79 29 20  script (if any) 
1400: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 57  */.  Tcl_Obj *pW
1410: 61 6c 48 6f 6f 6b 3b 20 20 20 20 20 20 20 20 20  alHook;         
1420: 2f 2a 20 57 41 4c 20 68 6f 6f 6b 20 73 63 72 69  /* WAL hook scri
1430: 70 74 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20  pt (if any) */. 
1440: 20 54 63 6c 5f 4f 62 6a 20 2a 70 55 6e 6c 6f 63   Tcl_Obj *pUnloc
1450: 6b 4e 6f 74 69 66 79 3b 20 20 20 20 2f 2a 20 55  kNotify;    /* U
1460: 6e 6c 6f 63 6b 20 6e 6f 74 69 66 79 20 73 63 72  nlock notify scr
1470: 69 70 74 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a  ipt (if any) */.
1480: 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 43    SqlCollate *pC
1490: 6f 6c 6c 61 74 65 3b 20 20 20 20 20 20 2f 2a 20  ollate;      /* 
14a0: 4c 69 73 74 20 6f 66 20 53 51 4c 20 63 6f 6c 6c  List of SQL coll
14b0: 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 73 20  ation functions 
14c0: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
14d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 6f  /* Return code o
14f0: 66 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71  f most recent sq
1500: 6c 69 74 65 33 5f 65 78 65 63 28 29 20 2a 2f 0a  lite3_exec() */.
1510: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6f 6c 6c    Tcl_Obj *pColl
1520: 61 74 65 4e 65 65 64 65 64 3b 20 20 20 2f 2a 20  ateNeeded;   /* 
1530: 43 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65 64 65 64  Collation needed
1540: 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 53 71 6c   script */.  Sql
1550: 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 73 74  PreparedStmt *st
1560: 6d 74 4c 69 73 74 3b 20 2f 2a 20 4c 69 73 74 20  mtList; /* List 
1570: 6f 66 20 70 72 65 70 61 72 65 64 20 73 74 61 74  of prepared stat
1580: 65 6d 65 6e 74 73 2a 2f 0a 20 20 53 71 6c 50 72  ements*/.  SqlPr
1590: 65 70 61 72 65 64 53 74 6d 74 20 2a 73 74 6d 74  eparedStmt *stmt
15a0: 4c 61 73 74 3b 20 2f 2a 20 4c 61 73 74 20 73 74  Last; /* Last st
15b0: 61 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 6c  atement in the l
15c0: 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 78  ist */.  int max
15d0: 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stmt;           
15e0: 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20      /* The next 
15f0: 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
1600: 66 20 73 74 6d 74 4c 69 73 74 20 2a 2f 0a 20 20  f stmtList */.  
1610: 69 6e 74 20 6e 53 74 6d 74 3b 20 20 20 20 20 20  int nStmt;      
1620: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1630: 6d 62 65 72 20 6f 66 20 73 74 61 74 65 6d 65 6e  mber of statemen
1640: 74 73 20 69 6e 20 73 74 6d 74 4c 69 73 74 20 2a  ts in stmtList *
1650: 2f 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e  /.  IncrblobChan
1660: 6e 65 6c 20 2a 70 49 6e 63 72 62 6c 6f 62 3b 2f  nel *pIncrblob;/
1670: 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  * Linked list of
1680: 20 6f 70 65 6e 20 69 6e 63 72 62 6c 6f 62 20 63   open incrblob c
1690: 68 61 6e 6e 65 6c 73 20 2a 2f 0a 20 20 69 6e 74  hannels */.  int
16a0: 20 6e 53 74 65 70 2c 20 6e 53 6f 72 74 2c 20 6e   nStep, nSort, n
16b0: 49 6e 64 65 78 3b 20 20 2f 2a 20 53 74 61 74 69  Index;  /* Stati
16c0: 73 74 69 63 73 20 66 6f 72 20 6d 6f 73 74 20 72  stics for most r
16d0: 65 63 65 6e 74 20 6f 70 65 72 61 74 69 6f 6e 20  ecent operation 
16e0: 2a 2f 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 61  */.  int nTransa
16f0: 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  ction;          
1700: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 73  /* Number of nes
1710: 74 65 64 20 5b 74 72 61 6e 73 61 63 74 69 6f 6e  ted [transaction
1720: 5d 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23 69 66  ] methods */.#if
1730: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
1740: 20 20 69 6e 74 20 62 4c 65 67 61 63 79 50 72 65    int bLegacyPre
1750: 70 61 72 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  pare;        /* 
1760: 54 72 75 65 20 74 6f 20 75 73 65 20 73 71 6c 69  True to use sqli
1770: 74 65 33 5f 70 72 65 70 61 72 65 28 29 20 2a 2f  te3_prepare() */
1780: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 73 74 72 75  .#endif.};..stru
1790: 63 74 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  ct IncrblobChann
17a0: 65 6c 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 62  el {.  sqlite3_b
17b0: 6c 6f 62 20 2a 70 42 6c 6f 62 3b 20 20 20 20 20  lob *pBlob;     
17c0: 20 2f 2a 20 73 71 6c 69 74 65 33 20 62 6c 6f 62   /* sqlite3 blob
17d0: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 53 71 6c   handle */.  Sql
17e0: 69 74 65 44 62 20 2a 70 44 62 3b 20 20 20 20 20  iteDb *pDb;     
17f0: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69         /* Associ
1800: 61 74 65 64 20 64 61 74 61 62 61 73 65 20 63 6f  ated database co
1810: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nnection */.  in
1820: 74 20 69 53 65 65 6b 3b 20 20 20 20 20 20 20 20  t iSeek;        
1830: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
1840: 6e 74 20 73 65 65 6b 20 6f 66 66 73 65 74 20 2a  nt seek offset *
1850: 2f 0a 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20  /.  Tcl_Channel 
1860: 63 68 61 6e 6e 65 6c 3b 20 20 20 20 20 20 2f 2a  channel;      /*
1870: 20 43 68 61 6e 6e 65 6c 20 69 64 65 6e 74 69 66   Channel identif
1880: 69 65 72 20 2a 2f 0a 20 20 49 6e 63 72 62 6c 6f  ier */.  Incrblo
1890: 62 43 68 61 6e 6e 65 6c 20 2a 70 4e 65 78 74 3b  bChannel *pNext;
18a0: 20 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73     /* Linked lis
18b0: 74 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 69 6e  t of all open in
18c0: 63 72 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 73 20  crblob channels 
18d0: 2a 2f 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61  */.  IncrblobCha
18e0: 6e 6e 65 6c 20 2a 70 50 72 65 76 3b 20 20 20 2f  nnel *pPrev;   /
18f0: 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  * Linked list of
1900: 20 61 6c 6c 20 6f 70 65 6e 20 69 6e 63 72 62 6c   all open incrbl
1910: 6f 62 20 63 68 61 6e 6e 65 6c 73 20 2a 2f 0a 7d  ob channels */.}
1920: 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  ;../*.** Compute
1930: 20 61 20 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   a string length
1940: 20 74 68 61 74 20 69 73 20 6c 69 6d 69 74 65 64   that is limited
1950: 20 74 6f 20 77 68 61 74 20 63 61 6e 20 62 65 20   to what can be 
1960: 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 6c 6f 77  stored in.** low
1970: 65 72 20 33 30 20 62 69 74 73 20 6f 66 20 61 20  er 30 bits of a 
1980: 33 32 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e  32-bit signed in
1990: 74 65 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  teger..*/.static
19a0: 20 69 6e 74 20 73 74 72 6c 65 6e 33 30 28 63 6f   int strlen30(co
19b0: 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
19c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 20 3d  const char *z2 =
19d0: 20 7a 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a 32   z;.  while( *z2
19e0: 20 29 7b 20 7a 32 2b 2b 3b 20 7d 0a 20 20 72 65   ){ z2++; }.  re
19f0: 74 75 72 6e 20 30 78 33 66 66 66 66 66 66 66 20  turn 0x3fffffff 
1a00: 26 20 28 69 6e 74 29 28 7a 32 20 2d 20 7a 29 3b  & (int)(z2 - z);
1a10: 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .}...#ifndef SQL
1a20: 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
1a30: 42 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c  B./*.** Close al
1a40: 6c 20 69 6e 63 72 62 6c 6f 62 20 63 68 61 6e 6e  l incrblob chann
1a50: 65 6c 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67  els opened using
1a60: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
1a70: 74 69 6f 6e 20 70 44 62 2e 0a 2a 2a 20 54 68 69  tion pDb..** Thi
1a80: 73 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  s is called when
1a90: 20 73 68 75 74 74 69 6e 67 20 64 6f 77 6e 20 74   shutting down t
1aa0: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
1ab0: 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ection..*/.stati
1ac0: 63 20 76 6f 69 64 20 63 6c 6f 73 65 49 6e 63 72  c void closeIncr
1ad0: 62 6c 6f 62 43 68 61 6e 6e 65 6c 73 28 53 71 6c  blobChannels(Sql
1ae0: 69 74 65 44 62 20 2a 70 44 62 29 7b 0a 20 20 49  iteDb *pDb){.  I
1af0: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a  ncrblobChannel *
1b00: 70 3b 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61  p;.  IncrblobCha
1b10: 6e 6e 65 6c 20 2a 70 4e 65 78 74 3b 0a 0a 20 20  nnel *pNext;..  
1b20: 66 6f 72 28 70 3d 70 44 62 2d 3e 70 49 6e 63 72  for(p=pDb->pIncr
1b30: 62 6c 6f 62 3b 20 70 3b 20 70 3d 70 4e 65 78 74  blob; p; p=pNext
1b40: 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
1b50: 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 20 20 2f 2a  ->pNext;..    /*
1b60: 20 4e 6f 74 65 3a 20 43 61 6c 6c 69 6e 67 20 75   Note: Calling u
1b70: 6e 72 65 67 69 73 74 65 72 20 68 65 72 65 20 63  nregister here c
1b80: 61 6c 6c 20 54 63 6c 5f 43 6c 6f 73 65 20 6f 6e  all Tcl_Close on
1b90: 20 74 68 65 20 69 6e 63 72 62 6c 6f 62 20 63 68   the incrblob ch
1ba0: 61 6e 6e 65 6c 2c 20 0a 20 20 20 20 2a 2a 20 77  annel, .    ** w
1bb0: 68 69 63 68 20 64 65 6c 65 74 65 73 20 74 68 65  hich deletes the
1bc0: 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c   IncrblobChannel
1bd0: 20 73 74 72 75 63 74 75 72 65 20 61 74 20 2a 70   structure at *p
1be0: 2e 20 53 6f 20 64 6f 20 6e 6f 74 0a 20 20 20 20  . So do not.    
1bf0: 2a 2a 20 63 61 6c 6c 20 54 63 6c 5f 46 72 65 65  ** call Tcl_Free
1c00: 28 29 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a  () here..    */.
1c10: 20 20 20 20 54 63 6c 5f 55 6e 72 65 67 69 73 74      Tcl_Unregist
1c20: 65 72 43 68 61 6e 6e 65 6c 28 70 44 62 2d 3e 69  erChannel(pDb->i
1c30: 6e 74 65 72 70 2c 20 70 2d 3e 63 68 61 6e 6e 65  nterp, p->channe
1c40: 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  l);.  }.}../*.**
1c50: 20 43 6c 6f 73 65 20 61 6e 20 69 6e 63 72 65 6d   Close an increm
1c60: 65 6e 74 61 6c 20 62 6c 6f 62 20 63 68 61 6e 6e  ental blob chann
1c70: 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
1c80: 74 20 69 6e 63 72 62 6c 6f 62 43 6c 6f 73 65 28  t incrblobClose(
1c90: 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61  ClientData insta
1ca0: 6e 63 65 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74  nceData, Tcl_Int
1cb0: 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20  erp *interp){.  
1cc0: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20  IncrblobChannel 
1cd0: 2a 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68  *p = (IncrblobCh
1ce0: 61 6e 6e 65 6c 20 2a 29 69 6e 73 74 61 6e 63 65  annel *)instance
1cf0: 44 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Data;.  int rc =
1d00: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c   sqlite3_blob_cl
1d10: 6f 73 65 28 70 2d 3e 70 42 6c 6f 62 29 3b 0a 20  ose(p->pBlob);. 
1d20: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1d30: 2d 3e 70 44 62 2d 3e 64 62 3b 0a 0a 20 20 2f 2a  ->pDb->db;..  /*
1d40: 20 52 65 6d 6f 76 65 20 74 68 65 20 63 68 61 6e   Remove the chan
1d50: 6e 65 6c 20 66 72 6f 6d 20 74 68 65 20 53 71 6c  nel from the Sql
1d60: 69 74 65 44 62 2e 70 49 6e 63 72 62 6c 6f 62 20  iteDb.pIncrblob 
1d70: 6c 69 73 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70  list. */.  if( p
1d80: 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70  ->pNext ){.    p
1d90: 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
1da0: 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20   p->pPrev;.  }. 
1db0: 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 7b   if( p->pPrev ){
1dc0: 0a 20 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70  .    p->pPrev->p
1dd0: 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Next = p->pNext;
1de0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 44  .  }.  if( p->pD
1df0: 62 2d 3e 70 49 6e 63 72 62 6c 6f 62 3d 3d 70 20  b->pIncrblob==p 
1e00: 29 7b 0a 20 20 20 20 70 2d 3e 70 44 62 2d 3e 70  ){.    p->pDb->p
1e10: 49 6e 63 72 62 6c 6f 62 20 3d 20 70 2d 3e 70 4e  Incrblob = p->pN
1e20: 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  ext;.  }..  /* F
1e30: 72 65 65 20 74 68 65 20 49 6e 63 72 62 6c 6f 62  ree the Incrblob
1e40: 43 68 61 6e 6e 65 6c 20 73 74 72 75 63 74 75 72  Channel structur
1e50: 65 20 2a 2f 0a 20 20 54 63 6c 5f 46 72 65 65 28  e */.  Tcl_Free(
1e60: 28 63 68 61 72 20 2a 29 70 29 3b 0a 0a 20 20 69  (char *)p);..  i
1e70: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1e80: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52   ){.    Tcl_SetR
1e90: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
1ea0: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 65 72  har *)sqlite3_er
1eb0: 72 6d 73 67 28 64 62 29 2c 20 54 43 4c 5f 56 4f  rmsg(db), TCL_VO
1ec0: 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 72 65 74  LATILE);.    ret
1ed0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1ee0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
1ef0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  OK;.}../*.** Rea
1f00: 64 20 64 61 74 61 20 66 72 6f 6d 20 61 6e 20 69  d data from an i
1f10: 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20  ncremental blob 
1f20: 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74  channel..*/.stat
1f30: 69 63 20 69 6e 74 20 69 6e 63 72 62 6c 6f 62 49  ic int incrblobI
1f40: 6e 70 75 74 28 0a 20 20 43 6c 69 65 6e 74 44 61  nput(.  ClientDa
1f50: 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c  ta instanceData,
1f60: 20 0a 20 20 63 68 61 72 20 2a 62 75 66 2c 20 0a   .  char *buf, .
1f70: 20 20 69 6e 74 20 62 75 66 53 69 7a 65 2c 0a 20    int bufSize,. 
1f80: 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50   int *errorCodeP
1f90: 74 72 0a 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62  tr.){.  Incrblob
1fa0: 43 68 61 6e 6e 65 6c 20 2a 70 20 3d 20 28 49 6e  Channel *p = (In
1fb0: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 29  crblobChannel *)
1fc0: 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20  instanceData;.  
1fd0: 69 6e 74 20 6e 52 65 61 64 20 3d 20 62 75 66 53  int nRead = bufS
1fe0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ize;         /* 
1ff0: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
2000: 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e 74  to read */.  int
2010: 20 6e 42 6c 6f 62 3b 20 20 20 20 20 20 20 20 20   nBlob;         
2020: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
2030: 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62  al size of the b
2040: 6c 6f 62 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  lob */.  int rc;
2050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2060: 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 20        /* sqlite 
2070: 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 0a 20  error code */.. 
2080: 20 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33   nBlob = sqlite3
2090: 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70  _blob_bytes(p->p
20a0: 42 6c 6f 62 29 3b 0a 20 20 69 66 28 20 28 70 2d  Blob);.  if( (p-
20b0: 3e 69 53 65 65 6b 2b 6e 52 65 61 64 29 3e 6e 42  >iSeek+nRead)>nB
20c0: 6c 6f 62 20 29 7b 0a 20 20 20 20 6e 52 65 61 64  lob ){.    nRead
20d0: 20 3d 20 6e 42 6c 6f 62 2d 70 2d 3e 69 53 65 65   = nBlob-p->iSee
20e0: 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65  k;.  }.  if( nRe
20f0: 61 64 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ad<=0 ){.    ret
2100: 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 63  urn 0;.  }..  rc
2110: 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f   = sqlite3_blob_
2120: 72 65 61 64 28 70 2d 3e 70 42 6c 6f 62 2c 20 28  read(p->pBlob, (
2130: 76 6f 69 64 20 2a 29 62 75 66 2c 20 6e 52 65 61  void *)buf, nRea
2140: 64 2c 20 70 2d 3e 69 53 65 65 6b 29 3b 0a 20 20  d, p->iSeek);.  
2150: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2160: 4b 20 29 7b 0a 20 20 20 20 2a 65 72 72 6f 72 43  K ){.    *errorC
2170: 6f 64 65 50 74 72 20 3d 20 72 63 3b 0a 20 20 20  odePtr = rc;.   
2180: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a   return -1;.  }.
2190: 0a 20 20 70 2d 3e 69 53 65 65 6b 20 2b 3d 20 6e  .  p->iSeek += n
21a0: 52 65 61 64 3b 0a 20 20 72 65 74 75 72 6e 20 6e  Read;.  return n
21b0: 52 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  Read;.}../*.** W
21c0: 72 69 74 65 20 64 61 74 61 20 74 6f 20 61 6e 20  rite data to an 
21d0: 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62  incremental blob
21e0: 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61   channel..*/.sta
21f0: 74 69 63 20 69 6e 74 20 69 6e 63 72 62 6c 6f 62  tic int incrblob
2200: 4f 75 74 70 75 74 28 0a 20 20 43 6c 69 65 6e 74  Output(.  Client
2210: 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74  Data instanceDat
2220: 61 2c 20 0a 20 20 43 4f 4e 53 54 20 63 68 61 72  a, .  CONST char
2230: 20 2a 62 75 66 2c 20 0a 20 20 69 6e 74 20 74 6f   *buf, .  int to
2240: 57 72 69 74 65 2c 0a 20 20 69 6e 74 20 2a 65 72  Write,.  int *er
2250: 72 6f 72 43 6f 64 65 50 74 72 0a 29 7b 0a 20 20  rorCodePtr.){.  
2260: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20  IncrblobChannel 
2270: 2a 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68  *p = (IncrblobCh
2280: 61 6e 6e 65 6c 20 2a 29 69 6e 73 74 61 6e 63 65  annel *)instance
2290: 44 61 74 61 3b 0a 20 20 69 6e 74 20 6e 57 72 69  Data;.  int nWri
22a0: 74 65 20 3d 20 74 6f 57 72 69 74 65 3b 20 20 20  te = toWrite;   
22b0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
22c0: 66 20 62 79 74 65 73 20 74 6f 20 77 72 69 74 65  f bytes to write
22d0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 6c 6f 62 3b   */.  int nBlob;
22e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f0: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65     /* Total size
2300: 20 6f 66 20 74 68 65 20 62 6c 6f 62 20 2a 2f 0a   of the blob */.
2310: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
2320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2330: 2a 20 73 71 6c 69 74 65 20 65 72 72 6f 72 20 63  * sqlite error c
2340: 6f 64 65 20 2a 2f 0a 0a 20 20 6e 42 6c 6f 62 20  ode */..  nBlob 
2350: 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 62  = sqlite3_blob_b
2360: 79 74 65 73 28 70 2d 3e 70 42 6c 6f 62 29 3b 0a  ytes(p->pBlob);.
2370: 20 20 69 66 28 20 28 70 2d 3e 69 53 65 65 6b 2b    if( (p->iSeek+
2380: 6e 57 72 69 74 65 29 3e 6e 42 6c 6f 62 20 29 7b  nWrite)>nBlob ){
2390: 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50  .    *errorCodeP
23a0: 74 72 20 3d 20 45 49 4e 56 41 4c 3b 0a 20 20 20  tr = EINVAL;.   
23b0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a   return -1;.  }.
23c0: 20 20 69 66 28 20 6e 57 72 69 74 65 3c 3d 30 20    if( nWrite<=0 
23d0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
23e0: 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c  .  }..  rc = sql
23f0: 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65 28  ite3_blob_write(
2400: 70 2d 3e 70 42 6c 6f 62 2c 20 28 76 6f 69 64 20  p->pBlob, (void 
2410: 2a 29 62 75 66 2c 20 6e 57 72 69 74 65 2c 20 70  *)buf, nWrite, p
2420: 2d 3e 69 53 65 65 6b 29 3b 0a 20 20 69 66 28 20  ->iSeek);.  if( 
2430: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2440: 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50  .    *errorCodeP
2450: 74 72 20 3d 20 45 49 4f 3b 0a 20 20 20 20 72 65  tr = EIO;.    re
2460: 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20  turn -1;.  }..  
2470: 70 2d 3e 69 53 65 65 6b 20 2b 3d 20 6e 57 72 69  p->iSeek += nWri
2480: 74 65 3b 0a 20 20 72 65 74 75 72 6e 20 6e 57 72  te;.  return nWr
2490: 69 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  ite;.}../*.** Se
24a0: 65 6b 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  ek an incrementa
24b0: 6c 20 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a  l blob channel..
24c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
24d0: 63 72 62 6c 6f 62 53 65 65 6b 28 0a 20 20 43 6c  crblobSeek(.  Cl
24e0: 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63  ientData instanc
24f0: 65 44 61 74 61 2c 20 0a 20 20 6c 6f 6e 67 20 6f  eData, .  long o
2500: 66 66 73 65 74 2c 0a 20 20 69 6e 74 20 73 65 65  ffset,.  int see
2510: 6b 4d 6f 64 65 2c 0a 20 20 69 6e 74 20 2a 65 72  kMode,.  int *er
2520: 72 6f 72 43 6f 64 65 50 74 72 0a 29 7b 0a 20 20  rorCodePtr.){.  
2530: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20  IncrblobChannel 
2540: 2a 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68  *p = (IncrblobCh
2550: 61 6e 6e 65 6c 20 2a 29 69 6e 73 74 61 6e 63 65  annel *)instance
2560: 44 61 74 61 3b 0a 0a 20 20 73 77 69 74 63 68 28  Data;..  switch(
2570: 20 73 65 65 6b 4d 6f 64 65 20 29 7b 0a 20 20 20   seekMode ){.   
2580: 20 63 61 73 65 20 53 45 45 4b 5f 53 45 54 3a 0a   case SEEK_SET:.
2590: 20 20 20 20 20 20 70 2d 3e 69 53 65 65 6b 20 3d        p->iSeek =
25a0: 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 62   offset;.      b
25b0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
25c0: 45 45 4b 5f 43 55 52 3a 0a 20 20 20 20 20 20 70  EEK_CUR:.      p
25d0: 2d 3e 69 53 65 65 6b 20 2b 3d 20 6f 66 66 73 65  ->iSeek += offse
25e0: 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  t;.      break;.
25f0: 20 20 20 20 63 61 73 65 20 53 45 45 4b 5f 45 4e      case SEEK_EN
2600: 44 3a 0a 20 20 20 20 20 20 70 2d 3e 69 53 65 65  D:.      p->iSee
2610: 6b 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  k = sqlite3_blob
2620: 5f 62 79 74 65 73 28 70 2d 3e 70 42 6c 6f 62 29  _bytes(p->pBlob)
2630: 20 2b 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20   + offset;.     
2640: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66   break;..    def
2650: 61 75 6c 74 3a 20 61 73 73 65 72 74 28 21 22 42  ault: assert(!"B
2660: 61 64 20 73 65 65 6b 4d 6f 64 65 22 29 3b 0a 20  ad seekMode");. 
2670: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e   }..  return p->
2680: 69 53 65 65 6b 3b 0a 7d 0a 0a 0a 73 74 61 74 69  iSeek;.}...stati
2690: 63 20 76 6f 69 64 20 69 6e 63 72 62 6c 6f 62 57  c void incrblobW
26a0: 61 74 63 68 28 43 6c 69 65 6e 74 44 61 74 61 20  atch(ClientData 
26b0: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 69 6e  instanceData, in
26c0: 74 20 6d 6f 64 65 29 7b 20 0a 20 20 2f 2a 20 4e  t mode){ .  /* N
26d0: 4f 2d 4f 50 20 2a 2f 20 0a 7d 0a 73 74 61 74 69  O-OP */ .}.stati
26e0: 63 20 69 6e 74 20 69 6e 63 72 62 6c 6f 62 48 61  c int incrblobHa
26f0: 6e 64 6c 65 28 43 6c 69 65 6e 74 44 61 74 61 20  ndle(ClientData 
2700: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 69 6e  instanceData, in
2710: 74 20 64 69 72 2c 20 43 6c 69 65 6e 74 44 61 74  t dir, ClientDat
2720: 61 20 2a 68 50 74 72 29 7b 0a 20 20 72 65 74 75  a *hPtr){.  retu
2730: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a  rn TCL_ERROR;.}.
2740: 0a 73 74 61 74 69 63 20 54 63 6c 5f 43 68 61 6e  .static Tcl_Chan
2750: 6e 65 6c 54 79 70 65 20 49 6e 63 72 62 6c 6f 62  nelType Incrblob
2760: 43 68 61 6e 6e 65 6c 54 79 70 65 20 3d 20 7b 0a  ChannelType = {.
2770: 20 20 22 69 6e 63 72 62 6c 6f 62 22 2c 20 20 20    "incrblob",   
2780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2790: 20 20 20 20 20 2f 2a 20 74 79 70 65 4e 61 6d 65       /* typeName
27a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
27c0: 20 20 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56 45    TCL_CHANNEL_VE
27d0: 52 53 49 4f 4e 5f 32 2c 20 20 20 20 20 20 20 20  RSION_2,        
27e0: 20 20 20 20 20 2f 2a 20 76 65 72 73 69 6f 6e 20       /* version 
27f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2800: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
2810: 20 20 69 6e 63 72 62 6c 6f 62 43 6c 6f 73 65 2c    incrblobClose,
2820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2830: 20 20 20 20 20 2f 2a 20 63 6c 6f 73 65 50 72 6f       /* closePro
2840: 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
2850: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
2860: 20 20 69 6e 63 72 62 6c 6f 62 49 6e 70 75 74 2c    incrblobInput,
2870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2880: 20 20 20 20 20 2f 2a 20 69 6e 70 75 74 50 72 6f       /* inputPro
2890: 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
28a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
28b0: 20 20 69 6e 63 72 62 6c 6f 62 4f 75 74 70 75 74    incrblobOutput
28c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28d0: 20 20 20 20 20 2f 2a 20 6f 75 74 70 75 74 50 72       /* outputPr
28e0: 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  oc              
28f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
2900: 20 20 69 6e 63 72 62 6c 6f 62 53 65 65 6b 2c 20    incrblobSeek, 
2910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2920: 20 20 20 20 20 2f 2a 20 73 65 65 6b 50 72 6f 63       /* seekProc
2930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2940: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
2950: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
2960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2970: 20 20 20 20 20 2f 2a 20 73 65 74 4f 70 74 69 6f       /* setOptio
2980: 6e 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20  nProc           
2990: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
29a0: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
29b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c0: 20 20 20 20 20 2f 2a 20 67 65 74 4f 70 74 69 6f       /* getOptio
29d0: 6e 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20  nProc           
29e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
29f0: 20 20 69 6e 63 72 62 6c 6f 62 57 61 74 63 68 2c    incrblobWatch,
2a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a10: 20 20 20 20 20 2f 2a 20 77 61 74 63 68 50 72 6f       /* watchPro
2a20: 63 20 28 74 68 69 73 20 69 73 20 61 20 6e 6f 2d  c (this is a no-
2a30: 6f 70 29 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  op)          */.
2a40: 20 20 69 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65    incrblobHandle
2a50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2a60: 20 20 20 20 20 2f 2a 20 67 65 74 48 61 6e 64 6c       /* getHandl
2a70: 65 50 72 6f 63 20 28 61 6c 77 61 79 73 20 72 65  eProc (always re
2a80: 74 75 72 6e 73 20 65 72 72 6f 72 29 20 2a 2f 0a  turns error) */.
2a90: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
2aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab0: 20 20 20 20 20 2f 2a 20 63 6c 6f 73 65 32 50 72       /* close2Pr
2ac0: 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  oc              
2ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
2ae0: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
2af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b00: 20 20 20 20 20 2f 2a 20 62 6c 6f 63 6b 4d 6f 64       /* blockMod
2b10: 65 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20  eProc           
2b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
2b30: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
2b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b50: 20 20 20 20 20 2f 2a 20 66 6c 75 73 68 50 72 6f       /* flushPro
2b60: 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
2b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
2b80: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
2b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba0: 20 20 20 20 20 2f 2a 20 68 61 6e 64 6c 65 72 50       /* handlerP
2bb0: 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20  roc             
2bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
2bd0: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
2be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf0: 20 20 20 20 20 2f 2a 20 77 69 64 65 53 65 65 6b       /* wideSeek
2c00: 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20  Proc            
2c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
2c20: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  };../*.** Create
2c30: 20 61 20 6e 65 77 20 69 6e 63 72 62 6c 6f 62 20   a new incrblob 
2c40: 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74  channel..*/.stat
2c50: 69 63 20 69 6e 74 20 63 72 65 61 74 65 49 6e 63  ic int createInc
2c60: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 28 0a 20 20  rblobChannel(.  
2c70: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
2c80: 72 70 2c 20 0a 20 20 53 71 6c 69 74 65 44 62 20  rp, .  SqliteDb 
2c90: 2a 70 44 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63  *pDb, .  const c
2ca0: 68 61 72 20 2a 7a 44 62 2c 0a 20 20 63 6f 6e 73  har *zDb,.  cons
2cb0: 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 2c 20  t char *zTable, 
2cc0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2cd0: 43 6f 6c 75 6d 6e 2c 20 0a 20 20 73 71 6c 69 74  Column, .  sqlit
2ce0: 65 5f 69 6e 74 36 34 20 69 52 6f 77 2c 0a 20 20  e_int64 iRow,.  
2cf0: 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 0a 29  int isReadonly.)
2d00: 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e  {.  IncrblobChan
2d10: 6e 65 6c 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65  nel *p;.  sqlite
2d20: 33 20 2a 64 62 20 3d 20 70 44 62 2d 3e 64 62 3b  3 *db = pDb->db;
2d30: 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20  .  sqlite3_blob 
2d40: 2a 70 42 6c 6f 62 3b 0a 20 20 69 6e 74 20 72 63  *pBlob;.  int rc
2d50: 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  ;.  int flags = 
2d60: 54 43 4c 5f 52 45 41 44 41 42 4c 45 7c 28 69 73  TCL_READABLE|(is
2d70: 52 65 61 64 6f 6e 6c 79 20 3f 20 30 20 3a 20 54  Readonly ? 0 : T
2d80: 43 4c 5f 57 52 49 54 41 42 4c 45 29 3b 0a 0a 20  CL_WRITABLE);.. 
2d90: 20 2f 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c   /* This variabl
2da0: 65 20 69 73 20 75 73 65 64 20 74 6f 20 6e 61 6d  e is used to nam
2db0: 65 20 74 68 65 20 63 68 61 6e 6e 65 6c 73 3a 20  e the channels: 
2dc0: 22 69 6e 63 72 62 6c 6f 62 5f 5b 69 6e 63 72 20  "incrblob_[incr 
2dd0: 63 6f 75 6e 74 5d 22 20 2a 2f 0a 20 20 73 74 61  count]" */.  sta
2de0: 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 20 3d 20  tic int count = 
2df0: 30 3b 0a 20 20 63 68 61 72 20 7a 43 68 61 6e 6e  0;.  char zChann
2e00: 65 6c 5b 36 34 5d 3b 0a 0a 20 20 72 63 20 3d 20  el[64];..  rc = 
2e10: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65  sqlite3_blob_ope
2e20: 6e 28 64 62 2c 20 7a 44 62 2c 20 7a 54 61 62 6c  n(db, zDb, zTabl
2e30: 65 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 69 52 6f 77  e, zColumn, iRow
2e40: 2c 20 21 69 73 52 65 61 64 6f 6e 6c 79 2c 20 26  , !isReadonly, &
2e50: 70 42 6c 6f 62 29 3b 0a 20 20 69 66 28 20 72 63  pBlob);.  if( rc
2e60: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2e70: 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
2e80: 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
2e90: 29 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28  )sqlite3_errmsg(
2ea0: 70 44 62 2d 3e 64 62 29 2c 20 54 43 4c 5f 56 4f  pDb->db), TCL_VO
2eb0: 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 72 65 74  LATILE);.    ret
2ec0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2ed0: 20 7d 0a 0a 20 20 70 20 3d 20 28 49 6e 63 72 62   }..  p = (Incrb
2ee0: 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 54 63 6c  lobChannel *)Tcl
2ef0: 5f 41 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 49 6e  _Alloc(sizeof(In
2f00: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 29 29 3b  crblobChannel));
2f10: 0a 20 20 70 2d 3e 69 53 65 65 6b 20 3d 20 30 3b  .  p->iSeek = 0;
2f20: 0a 20 20 70 2d 3e 70 42 6c 6f 62 20 3d 20 70 42  .  p->pBlob = pB
2f30: 6c 6f 62 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  lob;..  sqlite3_
2f40: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
2f50: 7a 43 68 61 6e 6e 65 6c 29 2c 20 7a 43 68 61 6e  zChannel), zChan
2f60: 6e 65 6c 2c 20 22 69 6e 63 72 62 6c 6f 62 5f 25  nel, "incrblob_%
2f70: 64 22 2c 20 2b 2b 63 6f 75 6e 74 29 3b 0a 20 20  d", ++count);.  
2f80: 70 2d 3e 63 68 61 6e 6e 65 6c 20 3d 20 54 63 6c  p->channel = Tcl
2f90: 5f 43 72 65 61 74 65 43 68 61 6e 6e 65 6c 28 26  _CreateChannel(&
2fa0: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 54  IncrblobChannelT
2fb0: 79 70 65 2c 20 7a 43 68 61 6e 6e 65 6c 2c 20 70  ype, zChannel, p
2fc0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 54 63 6c 5f  , flags);.  Tcl_
2fd0: 52 65 67 69 73 74 65 72 43 68 61 6e 6e 65 6c 28  RegisterChannel(
2fe0: 69 6e 74 65 72 70 2c 20 70 2d 3e 63 68 61 6e 6e  interp, p->chann
2ff0: 65 6c 29 3b 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20  el);..  /* Link 
3000: 74 68 65 20 6e 65 77 20 63 68 61 6e 6e 65 6c 20  the new channel 
3010: 69 6e 74 6f 20 74 68 65 20 53 71 6c 69 74 65 44  into the SqliteD
3020: 62 2e 70 49 6e 63 72 62 6c 6f 62 20 6c 69 73 74  b.pIncrblob list
3030: 2e 20 2a 2f 0a 20 20 70 2d 3e 70 4e 65 78 74 20  . */.  p->pNext 
3040: 3d 20 70 44 62 2d 3e 70 49 6e 63 72 62 6c 6f 62  = pDb->pIncrblob
3050: 3b 0a 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30  ;.  p->pPrev = 0
3060: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74  ;.  if( p->pNext
3070: 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74   ){.    p->pNext
3080: 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 7d  ->pPrev = p;.  }
3090: 0a 20 20 70 44 62 2d 3e 70 49 6e 63 72 62 6c 6f  .  pDb->pIncrblo
30a0: 62 20 3d 20 70 3b 0a 20 20 70 2d 3e 70 44 62 20  b = p;.  p->pDb 
30b0: 3d 20 70 44 62 3b 0a 0a 20 20 54 63 6c 5f 53 65  = pDb;..  Tcl_Se
30c0: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
30d0: 28 63 68 61 72 20 2a 29 54 63 6c 5f 47 65 74 43  (char *)Tcl_GetC
30e0: 68 61 6e 6e 65 6c 4e 61 6d 65 28 70 2d 3e 63 68  hannelName(p->ch
30f0: 61 6e 6e 65 6c 29 2c 20 54 43 4c 5f 56 4f 4c 41  annel), TCL_VOLA
3100: 54 49 4c 45 29 3b 0a 20 20 72 65 74 75 72 6e 20  TILE);.  return 
3110: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6c 73 65 20  TCL_OK;.}.#else 
3120: 20 2f 2a 20 65 6c 73 65 20 63 6c 61 75 73 65 20   /* else clause 
3130: 66 6f 72 20 22 23 69 66 6e 64 65 66 20 53 51 4c  for "#ifndef SQL
3140: 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
3150: 42 22 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  B" */.  #define 
3160: 63 6c 6f 73 65 49 6e 63 72 62 6c 6f 62 43 68 61  closeIncrblobCha
3170: 6e 6e 65 6c 73 28 70 44 62 29 0a 23 65 6e 64 69  nnels(pDb).#endi
3180: 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 61 74  f../*.** Look at
3190: 20 74 68 65 20 73 63 72 69 70 74 20 70 72 65 66   the script pref
31a0: 69 78 20 69 6e 20 70 43 6d 64 2e 20 20 57 65 20  ix in pCmd.  We 
31b0: 77 69 6c 6c 20 62 65 20 65 78 65 63 75 74 69 6e  will be executin
31c0: 67 20 74 68 69 73 20 73 63 72 69 70 74 0a 2a 2a  g this script.**
31d0: 20 61 66 74 65 72 20 66 69 72 73 74 20 61 70 70   after first app
31e0: 65 6e 64 69 6e 67 20 6f 6e 65 20 6f 72 20 6d 6f  ending one or mo
31f0: 72 65 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 54  re arguments.  T
3200: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c  his routine anal
3210: 79 7a 65 73 0a 2a 2a 20 74 68 65 20 73 63 72 69  yzes.** the scri
3220: 70 74 20 74 6f 20 73 65 65 20 69 66 20 69 74 20  pt to see if it 
3230: 69 73 20 73 61 66 65 20 74 6f 20 75 73 65 20 54  is safe to use T
3240: 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20 6f 6e  cl_EvalObjv() on
3250: 20 74 68 65 20 73 63 72 69 70 74 0a 2a 2a 20 72   the script.** r
3260: 61 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6d  ather than the m
3270: 6f 72 65 20 67 65 6e 65 72 61 6c 20 54 63 6c 5f  ore general Tcl_
3280: 45 76 61 6c 45 78 28 29 2e 20 20 54 63 6c 5f 45  EvalEx().  Tcl_E
3290: 76 61 6c 4f 62 6a 76 28 29 20 69 73 20 6d 75 63  valObjv() is muc
32a0: 68 0a 2a 2a 20 66 61 73 74 65 72 2e 0a 2a 2a 0a  h.** faster..**.
32b0: 2a 2a 20 53 63 72 69 70 74 73 20 74 68 61 74 20  ** Scripts that 
32c0: 61 72 65 20 73 61 66 65 20 74 6f 20 75 73 65 20  are safe to use 
32d0: 77 69 74 68 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  with Tcl_EvalObj
32e0: 76 28 29 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  v() consists of 
32f0: 61 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d  a.** command nam
3300: 65 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 7a 65  e followed by ze
3310: 72 6f 20 6f 72 20 6d 6f 72 65 20 61 72 67 75 6d  ro or more argum
3320: 65 6e 74 73 20 77 69 74 68 20 6e 6f 20 5b 2e 2e  ents with no [..
3330: 2e 5d 20 6f 72 20 24 0a 2a 2a 20 6f 72 20 7b 2e  .] or $.** or {.
3340: 2e 2e 7d 20 6f 72 20 3b 20 74 6f 20 62 65 20 73  ..} or ; to be s
3350: 65 65 6e 20 61 6e 79 77 68 65 72 65 2e 20 20 4d  een anywhere.  M
3360: 6f 73 74 20 63 61 6c 6c 62 61 63 6b 20 73 63 72  ost callback scr
3370: 69 70 74 73 20 63 6f 6e 73 69 73 74 0a 2a 2a 20  ipts consist.** 
3380: 6f 66 20 6a 75 73 74 20 61 20 73 69 6e 67 6c 65  of just a single
3390: 20 70 72 6f 63 65 64 75 72 65 20 6e 61 6d 65 20   procedure name 
33a0: 61 6e 64 20 74 68 65 79 20 6d 65 65 74 20 74 68  and they meet th
33b0: 69 73 20 72 65 71 75 69 72 65 6d 65 6e 74 2e 0a  is requirement..
33c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  */.static int sa
33d0: 66 65 54 6f 55 73 65 45 76 61 6c 4f 62 6a 76 28  feToUseEvalObjv(
33e0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
33f0: 72 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d  rp, Tcl_Obj *pCm
3400: 64 29 7b 0a 20 20 2f 2a 20 57 65 20 63 6f 75 6c  d){.  /* We coul
3410: 64 20 74 72 79 20 74 6f 20 64 6f 20 73 6f 6d 65  d try to do some
3420: 74 68 69 6e 67 20 77 69 74 68 20 54 63 6c 5f 50  thing with Tcl_P
3430: 61 72 73 65 28 29 2e 20 20 42 75 74 20 77 65 20  arse().  But we 
3440: 77 69 6c 6c 20 69 6e 73 74 65 61 64 0a 20 20 2a  will instead.  *
3450: 2a 20 6a 75 73 74 20 64 6f 20 61 20 73 65 61 72  * just do a sear
3460: 63 68 20 66 6f 72 20 66 6f 72 62 69 64 64 65 6e  ch for forbidden
3470: 20 63 68 61 72 61 63 74 65 72 73 2e 20 20 49 66   characters.  If
3480: 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 72 62   any of the forb
3490: 69 64 64 65 6e 0a 20 20 2a 2a 20 63 68 61 72 61  idden.  ** chara
34a0: 63 74 65 72 73 20 61 70 70 65 61 72 20 69 6e 20  cters appear in 
34b0: 70 43 6d 64 2c 20 77 65 20 77 69 6c 6c 20 72 65  pCmd, we will re
34c0: 70 6f 72 74 20 74 68 65 20 73 74 72 69 6e 67 20  port the string 
34d0: 61 73 20 75 6e 73 61 66 65 2e 0a 20 20 2a 2f 0a  as unsafe..  */.
34e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
34f0: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 7a 20 3d 20  .  int n;.  z = 
3500: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
3510: 6d 4f 62 6a 28 70 43 6d 64 2c 20 26 6e 29 3b 0a  mObj(pCmd, &n);.
3520: 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30    while( n-- > 0
3530: 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 20 3d 20   ){.    int c = 
3540: 2a 28 7a 2b 2b 29 3b 0a 20 20 20 20 69 66 28 20  *(z++);.    if( 
3550: 63 3d 3d 27 24 27 20 7c 7c 20 63 3d 3d 27 5b 27  c=='$' || c=='['
3560: 20 7c 7c 20 63 3d 3d 27 3b 27 20 29 20 72 65 74   || c==';' ) ret
3570: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
3580: 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 1;.}../*.** 
3590: 46 69 6e 64 20 61 6e 20 53 71 6c 46 75 6e 63 20  Find an SqlFunc 
35a0: 73 74 72 75 63 74 75 72 65 20 77 69 74 68 20 74  structure with t
35b0: 68 65 20 67 69 76 65 6e 20 6e 61 6d 65 2e 20 20  he given name.  
35c0: 4f 72 20 63 72 65 61 74 65 20 61 20 6e 65 77 0a  Or create a new.
35d0: 2a 2a 20 6f 6e 65 20 69 66 20 61 6e 20 65 78 69  ** one if an exi
35e0: 73 74 69 6e 67 20 6f 6e 65 20 63 61 6e 6e 6f 74  sting one cannot
35f0: 20 62 65 20 66 6f 75 6e 64 2e 20 20 52 65 74 75   be found.  Retu
3600: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
3610: 74 68 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  the.** structure
3620: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 71 6c 46  ..*/.static SqlF
3630: 75 6e 63 20 2a 66 69 6e 64 53 71 6c 46 75 6e 63  unc *findSqlFunc
3640: 28 53 71 6c 69 74 65 44 62 20 2a 70 44 62 2c 20  (SqliteDb *pDb, 
3650: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
3660: 65 29 7b 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70  e){.  SqlFunc *p
3670: 2c 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e  , *pNew;.  int n
3680: 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 33 30 28  Name = strlen30(
3690: 7a 4e 61 6d 65 29 3b 0a 20 20 70 4e 65 77 20 3d  zName);.  pNew =
36a0: 20 28 53 71 6c 46 75 6e 63 2a 29 54 63 6c 5f 41   (SqlFunc*)Tcl_A
36b0: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e  lloc( sizeof(*pN
36c0: 65 77 29 20 2b 20 6e 4e 61 6d 65 20 2b 20 31 20  ew) + nName + 1 
36d0: 29 3b 0a 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65  );.  pNew->zName
36e0: 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b   = (char*)&pNew[
36f0: 31 5d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65  1];.  memcpy(pNe
3700: 77 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c  w->zName, zName,
3710: 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 66 6f 72   nName+1);.  for
3720: 28 70 3d 70 44 62 2d 3e 70 46 75 6e 63 3b 20 70  (p=pDb->pFunc; p
3730: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 20 0a  ; p=p->pNext){ .
3740: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
3750: 73 74 72 69 63 6d 70 28 70 2d 3e 7a 4e 61 6d 65  stricmp(p->zName
3760: 2c 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 29 3d 3d  , pNew->zName)==
3770: 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 46  0 ){.      Tcl_F
3780: 72 65 65 28 28 63 68 61 72 2a 29 70 4e 65 77 29  ree((char*)pNew)
3790: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  ;.      return p
37a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e  ;.    }.  }.  pN
37b0: 65 77 2d 3e 69 6e 74 65 72 70 20 3d 20 70 44 62  ew->interp = pDb
37c0: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 70 4e 65 77  ->interp;.  pNew
37d0: 2d 3e 70 44 62 20 3d 20 70 44 62 3b 0a 20 20 70  ->pDb = pDb;.  p
37e0: 4e 65 77 2d 3e 70 53 63 72 69 70 74 20 3d 20 30  New->pScript = 0
37f0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20  ;.  pNew->pNext 
3800: 3d 20 70 44 62 2d 3e 70 46 75 6e 63 3b 0a 20 20  = pDb->pFunc;.  
3810: 70 44 62 2d 3e 70 46 75 6e 63 20 3d 20 70 4e 65  pDb->pFunc = pNe
3820: 77 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  w;.  return pNew
3830: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
3840: 61 20 73 69 6e 67 6c 65 20 53 71 6c 50 72 65 70  a single SqlPrep
3850: 61 72 65 64 53 74 6d 74 20 6f 62 6a 65 63 74 2e  aredStmt object.
3860: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3870: 64 62 46 72 65 65 53 74 6d 74 28 53 71 6c 50 72  dbFreeStmt(SqlPr
3880: 65 70 61 72 65 64 53 74 6d 74 20 2a 70 53 74 6d  eparedStmt *pStm
3890: 74 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  t){.#ifdef SQLIT
38a0: 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c  E_TEST.  if( sql
38b0: 69 74 65 33 5f 73 71 6c 28 70 53 74 6d 74 2d 3e  ite3_sql(pStmt->
38c0: 70 53 74 6d 74 29 3d 3d 30 20 29 7b 0a 20 20 20  pStmt)==0 ){.   
38d0: 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 20   Tcl_Free((char 
38e0: 2a 29 70 53 74 6d 74 2d 3e 7a 53 71 6c 29 3b 0a  *)pStmt->zSql);.
38f0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
3900: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
3910: 74 6d 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 54  tmt->pStmt);.  T
3920: 63 6c 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29  cl_Free((char *)
3930: 70 53 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pStmt);.}../*.**
3940: 20 46 69 6e 61 6c 69 7a 65 20 61 6e 64 20 66 72   Finalize and fr
3950: 65 65 20 61 20 6c 69 73 74 20 6f 66 20 70 72 65  ee a list of pre
3960: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73  pared statements
3970: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3980: 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28 53  flushStmtCache(S
3990: 71 6c 69 74 65 44 62 20 2a 70 44 62 29 7b 0a 20  qliteDb *pDb){. 
39a0: 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74   SqlPreparedStmt
39b0: 20 2a 70 50 72 65 53 74 6d 74 3b 0a 20 20 53 71   *pPreStmt;.  Sq
39c0: 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70  lPreparedStmt *p
39d0: 4e 65 78 74 3b 0a 0a 20 20 66 6f 72 28 70 50 72  Next;..  for(pPr
39e0: 65 53 74 6d 74 20 3d 20 70 44 62 2d 3e 73 74 6d  eStmt = pDb->stm
39f0: 74 4c 69 73 74 3b 20 70 50 72 65 53 74 6d 74 3b  tList; pPreStmt;
3a00: 20 70 50 72 65 53 74 6d 74 3d 70 4e 65 78 74 29   pPreStmt=pNext)
3a10: 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50  {.    pNext = pP
3a20: 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 3b 0a 20  reStmt->pNext;. 
3a30: 20 20 20 64 62 46 72 65 65 53 74 6d 74 28 70 50     dbFreeStmt(pP
3a40: 72 65 53 74 6d 74 29 3b 0a 20 20 7d 0a 20 20 70  reStmt);.  }.  p
3a50: 44 62 2d 3e 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  Db->nStmt = 0;. 
3a60: 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d   pDb->stmtLast =
3a70: 20 30 3b 0a 20 20 70 44 62 2d 3e 73 74 6d 74 4c   0;.  pDb->stmtL
3a80: 69 73 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ist = 0;.}../*.*
3a90: 2a 20 54 43 4c 20 63 61 6c 6c 73 20 74 68 69 73  * TCL calls this
3aa0: 20 70 72 6f 63 65 64 75 72 65 20 77 68 65 6e 20   procedure when 
3ab0: 61 6e 20 73 71 6c 69 74 65 33 20 64 61 74 61 62  an sqlite3 datab
3ac0: 61 73 65 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a  ase command is.*
3ad0: 2a 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74  * deleted..*/.st
3ae0: 61 74 69 63 20 76 6f 69 64 20 44 62 44 65 6c 65  atic void DbDele
3af0: 74 65 43 6d 64 28 76 6f 69 64 20 2a 64 62 29 7b  teCmd(void *db){
3b00: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
3b10: 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 64 62   = (SqliteDb*)db
3b20: 3b 0a 20 20 66 6c 75 73 68 53 74 6d 74 43 61 63  ;.  flushStmtCac
3b30: 68 65 28 70 44 62 29 3b 0a 20 20 63 6c 6f 73 65  he(pDb);.  close
3b40: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 73  IncrblobChannels
3b50: 28 70 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33  (pDb);.  sqlite3
3b60: 5f 63 6c 6f 73 65 28 70 44 62 2d 3e 64 62 29 3b  _close(pDb->db);
3b70: 0a 20 20 77 68 69 6c 65 28 20 70 44 62 2d 3e 70  .  while( pDb->p
3b80: 46 75 6e 63 20 29 7b 0a 20 20 20 20 53 71 6c 46  Func ){.    SqlF
3b90: 75 6e 63 20 2a 70 46 75 6e 63 20 3d 20 70 44 62  unc *pFunc = pDb
3ba0: 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 70 44 62  ->pFunc;.    pDb
3bb0: 2d 3e 70 46 75 6e 63 20 3d 20 70 46 75 6e 63 2d  ->pFunc = pFunc-
3bc0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61 73 73 65  >pNext;.    asse
3bd0: 72 74 28 20 70 46 75 6e 63 2d 3e 70 44 62 3d 3d  rt( pFunc->pDb==
3be0: 70 44 62 20 29 3b 0a 20 20 20 20 54 63 6c 5f 44  pDb );.    Tcl_D
3bf0: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 46 75 6e  ecrRefCount(pFun
3c00: 63 2d 3e 70 53 63 72 69 70 74 29 3b 0a 20 20 20  c->pScript);.   
3c10: 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a   Tcl_Free((char*
3c20: 29 70 46 75 6e 63 29 3b 0a 20 20 7d 0a 20 20 77  )pFunc);.  }.  w
3c30: 68 69 6c 65 28 20 70 44 62 2d 3e 70 43 6f 6c 6c  hile( pDb->pColl
3c40: 61 74 65 20 29 7b 0a 20 20 20 20 53 71 6c 43 6f  ate ){.    SqlCo
3c50: 6c 6c 61 74 65 20 2a 70 43 6f 6c 6c 61 74 65 20  llate *pCollate 
3c60: 3d 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 3b  = pDb->pCollate;
3c70: 0a 20 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61  .    pDb->pColla
3c80: 74 65 20 3d 20 70 43 6f 6c 6c 61 74 65 2d 3e 70  te = pCollate->p
3c90: 4e 65 78 74 3b 0a 20 20 20 20 54 63 6c 5f 46 72  Next;.    Tcl_Fr
3ca0: 65 65 28 28 63 68 61 72 2a 29 70 43 6f 6c 6c 61  ee((char*)pColla
3cb0: 74 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  te);.  }.  if( p
3cc0: 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20  Db->zBusy ){.   
3cd0: 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
3ce0: 42 75 73 79 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Busy);.  }.  if(
3cf0: 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a   pDb->zTrace ){.
3d00: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
3d10: 2d 3e 7a 54 72 61 63 65 29 3b 0a 20 20 7d 0a 20  ->zTrace);.  }. 
3d20: 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69   if( pDb->zProfi
3d30: 6c 65 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72  le ){.    Tcl_Fr
3d40: 65 65 28 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65  ee(pDb->zProfile
3d50: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62  );.  }.  if( pDb
3d60: 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 54  ->zAuth ){.    T
3d70: 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 41 75  cl_Free(pDb->zAu
3d80: 74 68 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  th);.  }.  if( p
3d90: 44 62 2d 3e 7a 4e 75 6c 6c 20 29 7b 0a 20 20 20  Db->zNull ){.   
3da0: 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
3db0: 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Null);.  }.  if(
3dc0: 20 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f   pDb->pUpdateHoo
3dd0: 6b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63  k ){.    Tcl_Dec
3de0: 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70  rRefCount(pDb->p
3df0: 55 70 64 61 74 65 48 6f 6f 6b 29 3b 0a 20 20 7d  UpdateHook);.  }
3e00: 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 52 6f 6c  .  if( pDb->pRol
3e10: 6c 62 61 63 6b 48 6f 6f 6b 20 29 7b 0a 20 20 20  lbackHook ){.   
3e20: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
3e30: 74 28 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b  t(pDb->pRollback
3e40: 48 6f 6f 6b 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Hook);.  }.  if(
3e50: 20 70 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 20 29   pDb->pWalHook )
3e60: 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  {.    Tcl_DecrRe
3e70: 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 57 61 6c  fCount(pDb->pWal
3e80: 48 6f 6f 6b 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Hook);.  }.  if(
3e90: 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65   pDb->pCollateNe
3ea0: 65 64 65 64 20 29 7b 0a 20 20 20 20 54 63 6c 5f  eded ){.    Tcl_
3eb0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62  DecrRefCount(pDb
3ec0: 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64  ->pCollateNeeded
3ed0: 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 46 72 65  );.  }.  Tcl_Fre
3ee0: 65 28 28 63 68 61 72 2a 29 70 44 62 29 3b 0a 7d  e((char*)pDb);.}
3ef0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
3f00: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
3f10: 68 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 66  hen a database f
3f20: 69 6c 65 20 69 73 20 6c 6f 63 6b 65 64 20 77 68  ile is locked wh
3f30: 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f  ile trying.** to
3f40: 20 65 78 65 63 75 74 65 20 53 51 4c 2e 0a 2a 2f   execute SQL..*/
3f50: 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 42 75  .static int DbBu
3f60: 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a  syHandler(void *
3f70: 63 64 2c 20 69 6e 74 20 6e 54 72 69 65 73 29 7b  cd, int nTries){
3f80: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
3f90: 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64   = (SqliteDb*)cd
3fa0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  ;.  int rc;.  ch
3fb0: 61 72 20 7a 56 61 6c 5b 33 30 5d 3b 0a 0a 20 20  ar zVal[30];..  
3fc0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
3fd0: 28 73 69 7a 65 6f 66 28 7a 56 61 6c 29 2c 20 7a  (sizeof(zVal), z
3fe0: 56 61 6c 2c 20 22 25 64 22 2c 20 6e 54 72 69 65  Val, "%d", nTrie
3ff0: 73 29 3b 0a 20 20 72 63 20 3d 20 54 63 6c 5f 56  s);.  rc = Tcl_V
4000: 61 72 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65  arEval(pDb->inte
4010: 72 70 2c 20 70 44 62 2d 3e 7a 42 75 73 79 2c 20  rp, pDb->zBusy, 
4020: 22 20 22 2c 20 7a 56 61 6c 2c 20 28 63 68 61 72  " ", zVal, (char
4030: 2a 29 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  *)0);.  if( rc!=
4040: 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28 54  TCL_OK || atoi(T
4050: 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
4060: 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 29  lt(pDb->interp))
4070: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
4080: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31  ;.  }.  return 1
4090: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
40a0: 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53  ITE_OMIT_PROGRES
40b0: 53 5f 43 41 4c 4c 42 41 43 4b 0a 2f 2a 0a 2a 2a  S_CALLBACK./*.**
40c0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
40d0: 20 69 6e 76 6f 6b 65 64 20 61 73 20 74 68 65 20   invoked as the 
40e0: 27 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61  'progress callba
40f0: 63 6b 27 20 66 6f 72 20 74 68 65 20 64 61 74 61  ck' for the data
4100: 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  base..*/.static 
4110: 69 6e 74 20 44 62 50 72 6f 67 72 65 73 73 48 61  int DbProgressHa
4120: 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 29 7b  ndler(void *cd){
4130: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
4140: 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64   = (SqliteDb*)cd
4150: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
4160: 73 73 65 72 74 28 20 70 44 62 2d 3e 7a 50 72 6f  ssert( pDb->zPro
4170: 67 72 65 73 73 20 29 3b 0a 20 20 72 63 20 3d 20  gress );.  rc = 
4180: 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69 6e  Tcl_Eval(pDb->in
4190: 74 65 72 70 2c 20 70 44 62 2d 3e 7a 50 72 6f 67  terp, pDb->zProg
41a0: 72 65 73 73 29 3b 0a 20 20 69 66 28 20 72 63 21  ress);.  if( rc!
41b0: 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28  =TCL_OK || atoi(
41c0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73  Tcl_GetStringRes
41d0: 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29  ult(pDb->interp)
41e0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
41f0: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
4200: 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  0;.}.#endif..#if
4210: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
4220: 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69  _TRACE./*.** Thi
4230: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
4240: 6c 65 64 20 62 79 20 74 68 65 20 53 51 4c 69 74  led by the SQLit
4250: 65 20 74 72 61 63 65 20 68 61 6e 64 6c 65 72 20  e trace handler 
4260: 77 68 65 6e 65 76 65 72 20 61 20 6e 65 77 0a 2a  whenever a new.*
4270: 2a 20 62 6c 6f 63 6b 20 6f 66 20 53 51 4c 20 69  * block of SQL i
4280: 73 20 65 78 65 63 75 74 65 64 2e 20 20 54 68 65  s executed.  The
4290: 20 54 43 4c 20 73 63 72 69 70 74 20 69 6e 20 70   TCL script in p
42a0: 44 62 2d 3e 7a 54 72 61 63 65 20 69 73 20 65 78  Db->zTrace is ex
42b0: 65 63 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  ecuted..*/.stati
42c0: 63 20 76 6f 69 64 20 44 62 54 72 61 63 65 48 61  c void DbTraceHa
42d0: 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 2c 20  ndler(void *cd, 
42e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
42f0: 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  ){.  SqliteDb *p
4300: 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29  Db = (SqliteDb*)
4310: 63 64 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  cd;.  Tcl_DStrin
4320: 67 20 73 74 72 3b 0a 0a 20 20 54 63 6c 5f 44 53  g str;..  Tcl_DS
4330: 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b  tringInit(&str);
4340: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70  .  Tcl_DStringAp
4350: 70 65 6e 64 28 26 73 74 72 2c 20 70 44 62 2d 3e  pend(&str, pDb->
4360: 7a 54 72 61 63 65 2c 20 2d 31 29 3b 0a 20 20 54  zTrace, -1);.  T
4370: 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64  cl_DStringAppend
4380: 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 53  Element(&str, zS
4390: 71 6c 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 28  ql);.  Tcl_Eval(
43a0: 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c  pDb->interp, Tcl
43b0: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 73  _DStringValue(&s
43c0: 74 72 29 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72  tr));.  Tcl_DStr
43d0: 69 6e 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20  ingFree(&str);. 
43e0: 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74   Tcl_ResetResult
43f0: 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 3b 0a 7d  (pDb->interp);.}
4400: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
4410: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41   SQLITE_OMIT_TRA
4420: 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  CE./*.** This ro
4430: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
4440: 62 79 20 74 68 65 20 53 51 4c 69 74 65 20 70 72  by the SQLite pr
4450: 6f 66 69 6c 65 20 68 61 6e 64 6c 65 72 20 61 66  ofile handler af
4460: 74 65 72 20 61 20 73 74 61 74 65 6d 65 6e 74 0a  ter a statement.
4470: 2a 2a 20 53 51 4c 20 68 61 73 20 65 78 65 63 75  ** SQL has execu
4480: 74 65 64 2e 20 20 54 68 65 20 54 43 4c 20 73 63  ted.  The TCL sc
4490: 72 69 70 74 20 69 6e 20 70 44 62 2d 3e 7a 50 72  ript in pDb->zPr
44a0: 6f 66 69 6c 65 20 69 73 20 65 76 61 6c 75 61 74  ofile is evaluat
44b0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
44c0: 69 64 20 44 62 50 72 6f 66 69 6c 65 48 61 6e 64  id DbProfileHand
44d0: 6c 65 72 28 76 6f 69 64 20 2a 63 64 2c 20 63 6f  ler(void *cd, co
44e0: 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20  nst char *zSql, 
44f0: 73 71 6c 69 74 65 5f 75 69 6e 74 36 34 20 74 6d  sqlite_uint64 tm
4500: 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  ){.  SqliteDb *p
4510: 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29  Db = (SqliteDb*)
4520: 63 64 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  cd;.  Tcl_DStrin
4530: 67 20 73 74 72 3b 0a 20 20 63 68 61 72 20 7a 54  g str;.  char zT
4540: 6d 5b 31 30 30 5d 3b 0a 0a 20 20 73 71 6c 69 74  m[100];..  sqlit
4550: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
4560: 6f 66 28 7a 54 6d 29 2d 31 2c 20 7a 54 6d 2c 20  of(zTm)-1, zTm, 
4570: 22 25 6c 6c 64 22 2c 20 74 6d 29 3b 0a 20 20 54  "%lld", tm);.  T
4580: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
4590: 73 74 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72  str);.  Tcl_DStr
45a0: 69 6e 67 41 70 70 65 6e 64 28 26 73 74 72 2c 20  ingAppend(&str, 
45b0: 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 2c 20 2d  pDb->zProfile, -
45c0: 31 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  1);.  Tcl_DStrin
45d0: 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26  gAppendElement(&
45e0: 73 74 72 2c 20 7a 53 71 6c 29 3b 0a 20 20 54 63  str, zSql);.  Tc
45f0: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45  l_DStringAppendE
4600: 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 54 6d  lement(&str, zTm
4610: 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 28 70 44  );.  Tcl_Eval(pD
4620: 62 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44  b->interp, Tcl_D
4630: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72  StringValue(&str
4640: 29 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  ));.  Tcl_DStrin
4650: 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20 54  gFree(&str);.  T
4660: 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 70  cl_ResetResult(p
4670: 44 62 2d 3e 69 6e 74 65 72 70 29 3b 0a 7d 0a 23  Db->interp);.}.#
4680: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
4690: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
46a0: 6c 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73  led when a trans
46b0: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
46c0: 74 65 64 2e 20 20 54 68 65 0a 2a 2a 20 54 43 4c  ted.  The.** TCL
46d0: 20 73 63 72 69 70 74 20 69 6e 20 70 44 62 2d 3e   script in pDb->
46e0: 7a 43 6f 6d 6d 69 74 20 69 73 20 65 78 65 63 75  zCommit is execu
46f0: 74 65 64 2e 20 20 49 66 20 69 74 20 72 65 74 75  ted.  If it retu
4700: 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 0a  rns non-zero or.
4710: 2a 2a 20 69 66 20 69 74 20 74 68 72 6f 77 73 20  ** if it throws 
4720: 61 6e 20 65 78 63 65 70 74 69 6f 6e 2c 20 74 68  an exception, th
4730: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
4740: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 73   rolled back ins
4750: 74 65 61 64 0a 2a 2a 20 6f 66 20 62 65 69 6e 67  tead.** of being
4760: 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2f 0a 73   committed..*/.s
4770: 74 61 74 69 63 20 69 6e 74 20 44 62 43 6f 6d 6d  tatic int DbComm
4780: 69 74 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a  itHandler(void *
4790: 63 64 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20  cd){.  SqliteDb 
47a0: 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62  *pDb = (SqliteDb
47b0: 2a 29 63 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  *)cd;.  int rc;.
47c0: 0a 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c  .  rc = Tcl_Eval
47d0: 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44  (pDb->interp, pD
47e0: 62 2d 3e 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20 69  b->zCommit);.  i
47f0: 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c  f( rc!=TCL_OK ||
4800: 20 61 74 6f 69 28 54 63 6c 5f 47 65 74 53 74 72   atoi(Tcl_GetStr
4810: 69 6e 67 52 65 73 75 6c 74 28 70 44 62 2d 3e 69  ingResult(pDb->i
4820: 6e 74 65 72 70 29 29 20 29 7b 0a 20 20 20 20 72  nterp)) ){.    r
4830: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
4840: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74  eturn 0;.}..stat
4850: 69 63 20 76 6f 69 64 20 44 62 52 6f 6c 6c 62 61  ic void DbRollba
4860: 63 6b 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a  ckHandler(void *
4870: 63 6c 69 65 6e 74 44 61 74 61 29 7b 0a 20 20 53  clientData){.  S
4880: 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28  qliteDb *pDb = (
4890: 53 71 6c 69 74 65 44 62 2a 29 63 6c 69 65 6e 74  SqliteDb*)client
48a0: 44 61 74 61 3b 0a 20 20 61 73 73 65 72 74 28 70  Data;.  assert(p
48b0: 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f  Db->pRollbackHoo
48c0: 6b 29 3b 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b  k);.  if( TCL_OK
48d0: 21 3d 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28  !=Tcl_EvalObjEx(
48e0: 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62  pDb->interp, pDb
48f0: 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 2c  ->pRollbackHook,
4900: 20 30 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 42   0) ){.    Tcl_B
4910: 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 70  ackgroundError(p
4920: 44 62 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 7d  Db->interp);.  }
4930: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 70  .}../*.** This p
4940: 72 6f 63 65 64 75 72 65 20 68 61 6e 64 6c 65 73  rocedure handles
4950: 20 77 61 6c 5f 68 6f 6f 6b 20 63 61 6c 6c 62 61   wal_hook callba
4960: 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  cks..*/.static i
4970: 6e 74 20 44 62 57 61 6c 48 61 6e 64 6c 65 72 28  nt DbWalHandler(
4980: 0a 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44  .  void *clientD
4990: 61 74 61 2c 20 0a 20 20 73 71 6c 69 74 65 33 20  ata, .  sqlite3 
49a0: 2a 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68  *db, .  const ch
49b0: 61 72 20 2a 7a 44 62 2c 20 0a 20 20 69 6e 74 20  ar *zDb, .  int 
49c0: 6e 45 6e 74 72 79 0a 29 7b 0a 20 20 69 6e 74 20  nEntry.){.  int 
49d0: 72 65 74 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  ret = SQLITE_OK;
49e0: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 3b 0a 20  .  Tcl_Obj *p;. 
49f0: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
4a00: 20 28 53 71 6c 69 74 65 44 62 2a 29 63 6c 69 65   (SqliteDb*)clie
4a10: 6e 74 44 61 74 61 3b 0a 20 20 54 63 6c 5f 49 6e  ntData;.  Tcl_In
4a20: 74 65 72 70 20 2a 69 6e 74 65 72 70 20 3d 20 70  terp *interp = p
4a30: 44 62 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 61 73  Db->interp;.  as
4a40: 73 65 72 74 28 70 44 62 2d 3e 70 57 61 6c 48 6f  sert(pDb->pWalHo
4a50: 6f 6b 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ok);..  assert( 
4a60: 64 62 3d 3d 70 44 62 2d 3e 64 62 20 29 3b 0a 20  db==pDb->db );. 
4a70: 20 70 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61   p = Tcl_Duplica
4a80: 74 65 4f 62 6a 28 70 44 62 2d 3e 70 57 61 6c 48  teObj(pDb->pWalH
4a90: 6f 6f 6b 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72  ook);.  Tcl_Incr
4aa0: 52 65 66 43 6f 75 6e 74 28 70 29 3b 0a 20 20 54  RefCount(p);.  T
4ab0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
4ac0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
4ad0: 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  p, Tcl_NewString
4ae0: 4f 62 6a 28 7a 44 62 2c 20 2d 31 29 29 3b 0a 20  Obj(zDb, -1));. 
4af0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
4b00: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
4b10: 2c 20 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  , p, Tcl_NewIntO
4b20: 62 6a 28 6e 45 6e 74 72 79 29 29 3b 0a 20 20 69  bj(nEntry));.  i
4b30: 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 45  f( TCL_OK!=Tcl_E
4b40: 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c  valObjEx(interp,
4b50: 20 70 2c 20 30 29 20 0a 20 20 20 7c 7c 20 54 43   p, 0) .   || TC
4b60: 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 74  L_OK!=Tcl_GetInt
4b70: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
4b80: 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_GetObjResult
4b90: 28 69 6e 74 65 72 70 29 2c 20 26 72 65 74 29 0a  (interp), &ret).
4ba0: 20 20 29 7b 0a 20 20 20 20 54 63 6c 5f 42 61 63    ){.    Tcl_Bac
4bb0: 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74  kgroundError(int
4bc0: 65 72 70 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f  erp);.  }.  Tcl_
4bd0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 29 3b  DecrRefCount(p);
4be0: 0a 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a  ..  return ret;.
4bf0: 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  }..#if defined(S
4c00: 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20 64  QLITE_TEST) && d
4c10: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
4c20: 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49  ABLE_UNLOCK_NOTI
4c30: 46 59 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20  FY).static void 
4c40: 73 65 74 54 65 73 74 55 6e 6c 6f 63 6b 4e 6f 74  setTestUnlockNot
4c50: 69 66 79 56 61 72 73 28 54 63 6c 5f 49 6e 74 65  ifyVars(Tcl_Inte
4c60: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
4c70: 69 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 29 7b  iArg, int nArg){
4c80: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 36 34 5d  .  char zBuf[64]
4c90: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ;.  sqlite3_snpr
4ca0: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66  intf(sizeof(zBuf
4cb0: 29 2c 20 7a 42 75 66 2c 20 22 25 64 22 2c 20 69  ), zBuf, "%d", i
4cc0: 41 72 67 29 3b 0a 20 20 54 63 6c 5f 53 65 74 56  Arg);.  Tcl_SetV
4cd0: 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
4ce0: 74 65 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79  te_unlock_notify
4cf0: 5f 61 72 67 22 2c 20 7a 42 75 66 2c 20 54 43 4c  _arg", zBuf, TCL
4d00: 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20  _GLOBAL_ONLY);. 
4d10: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
4d20: 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20  f(sizeof(zBuf), 
4d30: 7a 42 75 66 2c 20 22 25 64 22 2c 20 6e 41 72 67  zBuf, "%d", nArg
4d40: 29 3b 0a 20 20 54 63 6c 5f 53 65 74 56 61 72 28  );.  Tcl_SetVar(
4d50: 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
4d60: 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 5f 61 72  unlock_notify_ar
4d70: 67 63 6f 75 6e 74 22 2c 20 7a 42 75 66 2c 20 54  gcount", zBuf, T
4d80: 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b  CL_GLOBAL_ONLY);
4d90: 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
4da0: 65 20 73 65 74 54 65 73 74 55 6e 6c 6f 63 6b 4e  e setTestUnlockN
4db0: 6f 74 69 66 79 56 61 72 73 28 78 2c 79 2c 7a 29  otifyVars(x,y,z)
4dc0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
4dd0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e  SQLITE_ENABLE_UN
4de0: 4c 4f 43 4b 5f 4e 4f 54 49 46 59 0a 73 74 61 74  LOCK_NOTIFY.stat
4df0: 69 63 20 76 6f 69 64 20 44 62 55 6e 6c 6f 63 6b  ic void DbUnlock
4e00: 4e 6f 74 69 66 79 28 76 6f 69 64 20 2a 2a 61 70  Notify(void **ap
4e10: 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 29 7b 0a  Arg, int nArg){.
4e20: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
4e30: 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =0; i<nArg; i++)
4e40: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  {.    const int 
4e50: 66 6c 61 67 73 20 3d 20 28 54 43 4c 5f 45 56 41  flags = (TCL_EVA
4e60: 4c 5f 47 4c 4f 42 41 4c 7c 54 43 4c 5f 45 56 41  L_GLOBAL|TCL_EVA
4e70: 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20 20 20 53  L_DIRECT);.    S
4e80: 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28  qliteDb *pDb = (
4e90: 53 71 6c 69 74 65 44 62 20 2a 29 61 70 41 72 67  SqliteDb *)apArg
4ea0: 5b 69 5d 3b 0a 20 20 20 20 73 65 74 54 65 73 74  [i];.    setTest
4eb0: 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 56 61 72 73  UnlockNotifyVars
4ec0: 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 69 2c  (pDb->interp, i,
4ed0: 20 6e 41 72 67 29 3b 0a 20 20 20 20 61 73 73 65   nArg);.    asse
4ee0: 72 74 28 20 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b  rt( pDb->pUnlock
4ef0: 4e 6f 74 69 66 79 29 3b 0a 20 20 20 20 54 63 6c  Notify);.    Tcl
4f00: 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e  _EvalObjEx(pDb->
4f10: 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 70 55 6e  interp, pDb->pUn
4f20: 6c 6f 63 6b 4e 6f 74 69 66 79 2c 20 66 6c 61 67  lockNotify, flag
4f30: 73 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72  s);.    Tcl_Decr
4f40: 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 55  RefCount(pDb->pU
4f50: 6e 6c 6f 63 6b 4e 6f 74 69 66 79 29 3b 0a 20 20  nlockNotify);.  
4f60: 20 20 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f    pDb->pUnlockNo
4f70: 74 69 66 79 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  tify = 0;.  }.}.
4f80: 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 76  #endif..static v
4f90: 6f 69 64 20 44 62 55 70 64 61 74 65 48 61 6e 64  oid DbUpdateHand
4fa0: 6c 65 72 28 0a 20 20 76 6f 69 64 20 2a 70 2c 20  ler(.  void *p, 
4fb0: 0a 20 20 69 6e 74 20 6f 70 2c 0a 20 20 63 6f 6e  .  int op,.  con
4fc0: 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 0a 20  st char *zDb, . 
4fd0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 62   const char *zTb
4fe0: 6c 2c 20 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74  l, .  sqlite_int
4ff0: 36 34 20 72 6f 77 69 64 0a 29 7b 0a 20 20 53 71  64 rowid.){.  Sq
5000: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53  liteDb *pDb = (S
5010: 71 6c 69 74 65 44 62 20 2a 29 70 3b 0a 20 20 54  qliteDb *)p;.  T
5020: 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 0a 20  cl_Obj *pCmd;.. 
5030: 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 70 55   assert( pDb->pU
5040: 70 64 61 74 65 48 6f 6f 6b 20 29 3b 0a 20 20 61  pdateHook );.  a
5050: 73 73 65 72 74 28 20 6f 70 3d 3d 53 51 4c 49 54  ssert( op==SQLIT
5060: 45 5f 49 4e 53 45 52 54 20 7c 7c 20 6f 70 3d 3d  E_INSERT || op==
5070: 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20 7c 7c  SQLITE_UPDATE ||
5080: 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 44 45 4c 45   op==SQLITE_DELE
5090: 54 45 20 29 3b 0a 0a 20 20 70 43 6d 64 20 3d 20  TE );..  pCmd = 
50a0: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
50b0: 28 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f  (pDb->pUpdateHoo
50c0: 6b 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65  k);.  Tcl_IncrRe
50d0: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20  fCount(pCmd);.  
50e0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
50f0: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64  dElement(0, pCmd
5100: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
5110: 62 6a 28 0a 20 20 20 20 28 20 28 6f 70 3d 3d 53  bj(.    ( (op==S
5120: 51 4c 49 54 45 5f 49 4e 53 45 52 54 29 3f 22 49  QLITE_INSERT)?"I
5130: 4e 53 45 52 54 22 3a 28 6f 70 3d 3d 53 51 4c 49  NSERT":(op==SQLI
5140: 54 45 5f 55 50 44 41 54 45 29 3f 22 55 50 44 41  TE_UPDATE)?"UPDA
5150: 54 45 22 3a 22 44 45 4c 45 54 45 22 29 2c 20 2d  TE":"DELETE"), -
5160: 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  1));.  Tcl_ListO
5170: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
5180: 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77  0, pCmd, Tcl_New
5190: 53 74 72 69 6e 67 4f 62 6a 28 7a 44 62 2c 20 2d  StringObj(zDb, -
51a0: 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  1));.  Tcl_ListO
51b0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
51c0: 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77  0, pCmd, Tcl_New
51d0: 53 74 72 69 6e 67 4f 62 6a 28 7a 54 62 6c 2c 20  StringObj(zTbl, 
51e0: 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  -1));.  Tcl_List
51f0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
5200: 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65  (0, pCmd, Tcl_Ne
5210: 77 57 69 64 65 49 6e 74 4f 62 6a 28 72 6f 77 69  wWideIntObj(rowi
5220: 64 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f  d));.  Tcl_EvalO
5230: 62 6a 45 78 28 70 44 62 2d 3e 69 6e 74 65 72 70  bjEx(pDb->interp
5240: 2c 20 70 43 6d 64 2c 20 54 43 4c 5f 45 56 41 4c  , pCmd, TCL_EVAL
5250: 5f 44 49 52 45 43 54 29 3b 0a 20 20 54 63 6c 5f  _DIRECT);.  Tcl_
5260: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d  DecrRefCount(pCm
5270: 64 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  d);.}..static vo
5280: 69 64 20 74 63 6c 43 6f 6c 6c 61 74 65 4e 65 65  id tclCollateNee
5290: 64 65 64 28 0a 20 20 76 6f 69 64 20 2a 70 43 74  ded(.  void *pCt
52a0: 78 2c 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  x,.  sqlite3 *db
52b0: 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 63  ,.  int enc,.  c
52c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
52d0: 0a 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  .){.  SqliteDb *
52e0: 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 20  pDb = (SqliteDb 
52f0: 2a 29 70 43 74 78 3b 0a 20 20 54 63 6c 5f 4f 62  *)pCtx;.  Tcl_Ob
5300: 6a 20 2a 70 53 63 72 69 70 74 20 3d 20 54 63 6c  j *pScript = Tcl
5310: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 44  _DuplicateObj(pD
5320: 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65  b->pCollateNeede
5330: 64 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65  d);.  Tcl_IncrRe
5340: 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b  fCount(pScript);
5350: 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
5360: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
5370: 53 63 72 69 70 74 2c 20 54 63 6c 5f 4e 65 77 53  Script, Tcl_NewS
5380: 74 72 69 6e 67 4f 62 6a 28 7a 4e 61 6d 65 2c 20  tringObj(zName, 
5390: 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c  -1));.  Tcl_Eval
53a0: 4f 62 6a 45 78 28 70 44 62 2d 3e 69 6e 74 65 72  ObjEx(pDb->inter
53b0: 70 2c 20 70 53 63 72 69 70 74 2c 20 30 29 3b 0a  p, pScript, 0);.
53c0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
53d0: 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 7d 0a 0a  nt(pScript);.}..
53e0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
53f0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
5400: 65 76 61 6c 75 61 74 65 20 61 6e 20 53 51 4c 20  evaluate an SQL 
5410: 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69  collation functi
5420: 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a  on implemented.*
5430: 2a 20 75 73 69 6e 67 20 54 43 4c 20 73 63 72 69  * using TCL scri
5440: 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  pt..*/.static in
5450: 74 20 74 63 6c 53 71 6c 43 6f 6c 6c 61 74 65 28  t tclSqlCollate(
5460: 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 0a 20  .  void *pCtx,. 
5470: 20 69 6e 74 20 6e 41 2c 0a 20 20 63 6f 6e 73 74   int nA,.  const
5480: 20 76 6f 69 64 20 2a 7a 41 2c 0a 20 20 69 6e 74   void *zA,.  int
5490: 20 6e 42 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69   nB,.  const voi
54a0: 64 20 2a 7a 42 0a 29 7b 0a 20 20 53 71 6c 43 6f  d *zB.){.  SqlCo
54b0: 6c 6c 61 74 65 20 2a 70 20 3d 20 28 53 71 6c 43  llate *p = (SqlC
54c0: 6f 6c 6c 61 74 65 20 2a 29 70 43 74 78 3b 0a 20  ollate *)pCtx;. 
54d0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a   Tcl_Obj *pCmd;.
54e0: 0a 20 20 70 43 6d 64 20 3d 20 54 63 6c 5f 4e 65  .  pCmd = Tcl_Ne
54f0: 77 53 74 72 69 6e 67 4f 62 6a 28 70 2d 3e 7a 53  wStringObj(p->zS
5500: 63 72 69 70 74 2c 20 2d 31 29 3b 0a 20 20 54 63  cript, -1);.  Tc
5510: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
5520: 43 6d 64 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  Cmd);.  Tcl_List
5530: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
5540: 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64  (p->interp, pCmd
5550: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
5560: 62 6a 28 7a 41 2c 20 6e 41 29 29 3b 0a 20 20 54  bj(zA, nA));.  T
5570: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
5580: 45 6c 65 6d 65 6e 74 28 70 2d 3e 69 6e 74 65 72  Element(p->inter
5590: 70 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77  p, pCmd, Tcl_New
55a0: 53 74 72 69 6e 67 4f 62 6a 28 7a 42 2c 20 6e 42  StringObj(zB, nB
55b0: 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62  ));.  Tcl_EvalOb
55c0: 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70  jEx(p->interp, p
55d0: 43 6d 64 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49  Cmd, TCL_EVAL_DI
55e0: 52 45 43 54 29 3b 0a 20 20 54 63 6c 5f 44 65 63  RECT);.  Tcl_Dec
55f0: 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b  rRefCount(pCmd);
5600: 0a 20 20 72 65 74 75 72 6e 20 28 61 74 6f 69 28  .  return (atoi(
5610: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73  Tcl_GetStringRes
5620: 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 29 29  ult(p->interp)))
5630: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
5640: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
5650: 64 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e  d to evaluate an
5660: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 69 6d   SQL function im
5670: 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 75 73 69  plemented.** usi
5680: 6e 67 20 54 43 4c 20 73 63 72 69 70 74 2e 0a 2a  ng TCL script..*
5690: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 63  /.static void tc
56a0: 6c 53 71 6c 46 75 6e 63 28 73 71 6c 69 74 65 33  lSqlFunc(sqlite3
56b0: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
56c0: 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c  t, int argc, sql
56d0: 69 74 65 33 5f 76 61 6c 75 65 2a 2a 61 72 67 76  ite3_value**argv
56e0: 29 7b 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70 20  ){.  SqlFunc *p 
56f0: 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64  = sqlite3_user_d
5700: 61 74 61 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  ata(context);.  
5710: 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 20  Tcl_Obj *pCmd;. 
5720: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63   int i;.  int rc
5730: 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 30  ;..  if( argc==0
5740: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
5750: 65 72 65 20 61 72 65 20 6e 6f 20 61 72 67 75 6d  ere are no argum
5760: 65 6e 74 73 20 74 6f 20 74 68 65 20 66 75 6e 63  ents to the func
5770: 74 69 6f 6e 2c 20 63 61 6c 6c 20 54 63 6c 5f 45  tion, call Tcl_E
5780: 76 61 6c 4f 62 6a 45 78 20 6f 6e 20 74 68 65 0a  valObjEx on the.
5790: 20 20 20 20 2a 2a 20 73 63 72 69 70 74 20 6f 62      ** script ob
57a0: 6a 65 63 74 20 64 69 72 65 63 74 6c 79 2e 20 20  ject directly.  
57b0: 54 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20  This allows the 
57c0: 54 43 4c 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20  TCL compiler to 
57d0: 67 65 6e 65 72 61 74 65 0a 20 20 20 20 2a 2a 20  generate.    ** 
57e0: 62 79 74 65 63 6f 64 65 20 66 6f 72 20 74 68 65  bytecode for the
57f0: 20 63 6f 6d 6d 61 6e 64 20 6f 6e 20 74 68 65 20   command on the 
5800: 66 69 72 73 74 20 69 6e 76 6f 63 61 74 69 6f 6e  first invocation
5810: 20 61 6e 64 20 74 68 75 73 20 6d 61 6b 65 0a 20   and thus make. 
5820: 20 20 20 2a 2a 20 73 75 62 73 65 71 75 65 6e 74     ** subsequent
5830: 20 69 6e 76 6f 63 61 74 69 6f 6e 73 20 6d 75 63   invocations muc
5840: 68 20 66 61 73 74 65 72 2e 20 2a 2f 0a 20 20 20  h faster. */.   
5850: 20 70 43 6d 64 20 3d 20 70 2d 3e 70 53 63 72 69   pCmd = p->pScri
5860: 70 74 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72  pt;.    Tcl_Incr
5870: 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a  RefCount(pCmd);.
5880: 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61      rc = Tcl_Eva
5890: 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70  lObjEx(p->interp
58a0: 2c 20 70 43 6d 64 2c 20 30 29 3b 0a 20 20 20 20  , pCmd, 0);.    
58b0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
58c0: 28 70 43 6d 64 29 3b 0a 20 20 7d 65 6c 73 65 7b  (pCmd);.  }else{
58d0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
58e0: 20 61 72 65 20 61 72 67 75 6d 65 6e 74 73 20 74   are arguments t
58f0: 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2c 20  o the function, 
5900: 6d 61 6b 65 20 61 20 73 68 61 6c 6c 6f 77 20 63  make a shallow c
5910: 6f 70 79 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  opy of the.    *
5920: 2a 20 73 63 72 69 70 74 20 6f 62 6a 65 63 74 2c  * script object,
5930: 20 6c 61 70 70 65 6e 64 20 74 68 65 20 61 72 67   lappend the arg
5940: 75 6d 65 6e 74 73 2c 20 74 68 65 6e 20 65 76 61  uments, then eva
5950: 6c 75 61 74 65 20 74 68 65 20 63 6f 70 79 2e 0a  luate the copy..
5960: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 42 79      **.    ** By
5970: 20 22 73 68 61 6c 6c 6f 77 22 20 63 6f 70 79 2c   "shallow" copy,
5980: 20 77 65 20 6d 65 61 6e 20 6f 6e 6c 79 20 74 68   we mean only th
5990: 65 20 6f 75 74 65 72 20 6c 69 73 74 20 54 63 6c  e outer list Tcl
59a0: 5f 4f 62 6a 20 69 73 20 64 75 70 6c 69 63 61 74  _Obj is duplicat
59b0: 65 64 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6e  ed..    ** The n
59c0: 65 77 20 54 63 6c 5f 4f 62 6a 20 63 6f 6e 74 61  ew Tcl_Obj conta
59d0: 69 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  ins pointers to 
59e0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6c 69 73  the original lis
59f0: 74 20 65 6c 65 6d 65 6e 74 73 2e 20 0a 20 20 20  t elements. .   
5a00: 20 2a 2a 20 54 68 61 74 20 77 61 79 2c 20 77 68   ** That way, wh
5a10: 65 6e 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28  en Tcl_EvalObjv(
5a20: 29 20 69 73 20 72 75 6e 20 61 6e 64 20 73 68 69  ) is run and shi
5a30: 6d 6d 65 72 73 20 74 68 65 20 66 69 72 73 74 20  mmers the first 
5a40: 65 6c 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 6f  element.    ** o
5a50: 66 20 74 68 65 20 6c 69 73 74 20 74 6f 20 74 63  f the list to tc
5a60: 6c 43 6d 64 4e 61 6d 65 54 79 70 65 2c 20 74 68  lCmdNameType, th
5a70: 61 74 20 61 6c 74 65 72 6e 61 74 65 20 72 65 70  at alternate rep
5a80: 72 65 73 65 6e 74 61 74 69 6f 6e 20 77 69 6c 6c  resentation will
5a90: 0a 20 20 20 20 2a 2a 20 62 65 20 70 72 65 73 65  .    ** be prese
5aa0: 72 76 65 64 20 61 6e 64 20 72 65 75 73 65 64 20  rved and reused 
5ab0: 6f 6e 20 74 68 65 20 6e 65 78 74 20 69 6e 76 6f  on the next invo
5ac0: 63 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  cation..    */. 
5ad0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 41 72     Tcl_Obj **aAr
5ae0: 67 3b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b  g;.    int nArg;
5af0: 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 4c 69 73  .    if( Tcl_Lis
5b00: 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28  tObjGetElements(
5b10: 70 2d 3e 69 6e 74 65 72 70 2c 20 70 2d 3e 70 53  p->interp, p->pS
5b20: 63 72 69 70 74 2c 20 26 6e 41 72 67 2c 20 26 61  cript, &nArg, &a
5b30: 41 72 67 29 20 29 7b 0a 20 20 20 20 20 20 73 71  Arg) ){.      sq
5b40: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
5b50: 6f 72 28 63 6f 6e 74 65 78 74 2c 20 54 63 6c 5f  or(context, Tcl_
5b60: 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28  GetStringResult(
5b70: 70 2d 3e 69 6e 74 65 72 70 29 2c 20 2d 31 29 3b  p->interp), -1);
5b80: 20 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a   .      return;.
5b90: 20 20 20 20 7d 20 20 20 20 20 0a 20 20 20 20 70      }     .    p
5ba0: 43 6d 64 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73  Cmd = Tcl_NewLis
5bb0: 74 4f 62 6a 28 6e 41 72 67 2c 20 61 41 72 67 29  tObj(nArg, aArg)
5bc0: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ;.    Tcl_IncrRe
5bd0: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20  fCount(pCmd);.  
5be0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67    for(i=0; i<arg
5bf0: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  c; i++){.      s
5c00: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 49  qlite3_value *pI
5c10: 6e 20 3d 20 61 72 67 76 5b 69 5d 3b 0a 20 20 20  n = argv[i];.   
5c20: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c     Tcl_Obj *pVal
5c30: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 0a 20  ;.            . 
5c40: 20 20 20 20 20 2f 2a 20 53 65 74 20 70 56 61 6c       /* Set pVal
5c50: 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
5c60: 69 27 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  i'th column of t
5c70: 68 69 73 20 72 6f 77 2e 20 2a 2f 0a 20 20 20 20  his row. */.    
5c80: 20 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65    switch( sqlite
5c90: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 49 6e  3_value_type(pIn
5ca0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73  ) ){.        cas
5cb0: 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b  e SQLITE_BLOB: {
5cc0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 62  .          int b
5cd0: 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  ytes = sqlite3_v
5ce0: 61 6c 75 65 5f 62 79 74 65 73 28 70 49 6e 29 3b  alue_bytes(pIn);
5cf0: 0a 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20  .          pVal 
5d00: 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72  = Tcl_NewByteArr
5d10: 61 79 4f 62 6a 28 73 71 6c 69 74 65 33 5f 76 61  ayObj(sqlite3_va
5d20: 6c 75 65 5f 62 6c 6f 62 28 70 49 6e 29 2c 20 62  lue_blob(pIn), b
5d30: 79 74 65 73 29 3b 0a 20 20 20 20 20 20 20 20 20  ytes);.         
5d40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
5d50: 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53  }.        case S
5d60: 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b  QLITE_INTEGER: {
5d70: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
5d80: 65 5f 69 6e 74 36 34 20 76 20 3d 20 73 71 6c 69  e_int64 v = sqli
5d90: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28  te3_value_int64(
5da0: 70 49 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pIn);.          
5db0: 69 66 28 20 76 3e 3d 2d 32 31 34 37 34 38 33 36  if( v>=-21474836
5dc0: 34 37 20 26 26 20 76 3c 3d 32 31 34 37 34 38 33  47 && v<=2147483
5dd0: 36 34 37 20 29 7b 0a 20 20 20 20 20 20 20 20 20  647 ){.         
5de0: 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65     pVal = Tcl_Ne
5df0: 77 49 6e 74 4f 62 6a 28 28 69 6e 74 29 76 29 3b  wIntObj((int)v);
5e00: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
5e10: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 56  {.            pV
5e20: 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 57 69 64 65  al = Tcl_NewWide
5e30: 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20 20 20  IntObj(v);.     
5e40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
5e50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
5e60: 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53  }.        case S
5e70: 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20  QLITE_FLOAT: {. 
5e80: 20 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20           double 
5e90: 72 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  r = sqlite3_valu
5ea0: 65 5f 64 6f 75 62 6c 65 28 70 49 6e 29 3b 0a 20  e_double(pIn);. 
5eb0: 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20           pVal = 
5ec0: 54 63 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f 62 6a  Tcl_NewDoubleObj
5ed0: 28 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  (r);.          b
5ee0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
5ef0: 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
5f00: 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  ITE_NULL: {.    
5f10: 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c        pVal = Tcl
5f20: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 2d  _NewStringObj(p-
5f30: 3e 70 44 62 2d 3e 7a 4e 75 6c 6c 2c 20 2d 31 29  >pDb->zNull, -1)
5f40: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
5f50: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
5f60: 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a       default: {.
5f70: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 62 79            int by
5f80: 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  tes = sqlite3_va
5f90: 6c 75 65 5f 62 79 74 65 73 28 70 49 6e 29 3b 0a  lue_bytes(pIn);.
5fa0: 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d            pVal =
5fb0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
5fc0: 6a 28 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  j((char *)sqlite
5fd0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 49 6e  3_value_text(pIn
5fe0: 29 2c 20 62 79 74 65 73 29 3b 0a 20 20 20 20 20  ), bytes);.     
5ff0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6000: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
6010: 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 4c 69 73      rc = Tcl_Lis
6020: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
6030: 74 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d  t(p->interp, pCm
6040: 64 2c 20 70 56 61 6c 29 3b 0a 20 20 20 20 20 20  d, pVal);.      
6050: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
6060: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
6070: 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20 20 20 20  nt(pCmd);.      
6080: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
6090: 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20  _error(context, 
60a0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73  Tcl_GetStringRes
60b0: 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c 20  ult(p->interp), 
60c0: 2d 31 29 3b 20 0a 20 20 20 20 20 20 20 20 72 65  -1); .        re
60d0: 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
60e0: 20 20 7d 0a 20 20 20 20 69 66 28 20 21 70 2d 3e    }.    if( !p->
60f0: 75 73 65 45 76 61 6c 4f 62 6a 76 20 29 7b 0a 20  useEvalObjv ){. 
6100: 20 20 20 20 20 2f 2a 20 54 63 6c 5f 45 76 61 6c       /* Tcl_Eval
6110: 4f 62 6a 45 78 28 29 20 77 69 6c 6c 20 61 75 74  ObjEx() will aut
6120: 6f 6d 61 74 69 63 61 6c 6c 79 20 63 61 6c 6c 20  omatically call 
6130: 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20 69  Tcl_EvalObjv() i
6140: 66 20 70 43 6d 64 0a 20 20 20 20 20 20 2a 2a 20  f pCmd.      ** 
6150: 69 73 20 61 20 6c 69 73 74 20 77 69 74 68 6f 75  is a list withou
6160: 74 20 61 20 73 74 72 69 6e 67 20 72 65 70 72 65  t a string repre
6170: 73 65 6e 74 61 74 69 6f 6e 2e 20 20 54 6f 20 70  sentation.  To p
6180: 72 65 76 65 6e 74 20 74 68 69 73 20 66 72 6f 6d  revent this from
6190: 0a 20 20 20 20 20 20 2a 2a 20 68 61 70 70 65 6e  .      ** happen
61a0: 69 6e 67 2c 20 6d 61 6b 65 20 73 75 72 65 20 70  ing, make sure p
61b0: 43 6d 64 20 68 61 73 20 61 20 76 61 6c 69 64 20  Cmd has a valid 
61c0: 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74  string represent
61d0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 54  ation */.      T
61e0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 70 43 6d  cl_GetString(pCm
61f0: 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  d);.    }.    rc
6200: 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78   = Tcl_EvalObjEx
6210: 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64  (p->interp, pCmd
6220: 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43  , TCL_EVAL_DIREC
6230: 54 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72  T);.    Tcl_Decr
6240: 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a  RefCount(pCmd);.
6250: 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 20 26 26    }..  if( rc &&
6260: 20 72 63 21 3d 54 43 4c 5f 52 45 54 55 52 4e 20   rc!=TCL_RETURN 
6270: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
6280: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
6290: 65 78 74 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  ext, Tcl_GetStri
62a0: 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65  ngResult(p->inte
62b0: 72 70 29 2c 20 2d 31 29 3b 20 0a 20 20 7d 65 6c  rp), -1); .  }el
62c0: 73 65 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  se{.    Tcl_Obj 
62d0: 2a 70 56 61 72 20 3d 20 54 63 6c 5f 47 65 74 4f  *pVar = Tcl_GetO
62e0: 62 6a 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65  bjResult(p->inte
62f0: 72 70 29 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a  rp);.    int n;.
6300: 20 20 20 20 75 38 20 2a 64 61 74 61 3b 0a 20 20      u8 *data;.  
6310: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
6320: 79 70 65 20 3d 20 28 70 56 61 72 2d 3e 74 79 70  ype = (pVar->typ
6330: 65 50 74 72 20 3f 20 70 56 61 72 2d 3e 74 79 70  ePtr ? pVar->typ
6340: 65 50 74 72 2d 3e 6e 61 6d 65 20 3a 20 22 22 29  ePtr->name : "")
6350: 3b 0a 20 20 20 20 63 68 61 72 20 63 20 3d 20 7a  ;.    char c = z
6360: 54 79 70 65 5b 30 5d 3b 0a 20 20 20 20 69 66 28  Type[0];.    if(
6370: 20 63 3d 3d 27 62 27 20 26 26 20 73 74 72 63 6d   c=='b' && strcm
6380: 70 28 7a 54 79 70 65 2c 22 62 79 74 65 61 72 72  p(zType,"bytearr
6390: 61 79 22 29 3d 3d 30 20 26 26 20 70 56 61 72 2d  ay")==0 && pVar-
63a0: 3e 62 79 74 65 73 3d 3d 30 20 29 7b 0a 20 20 20  >bytes==0 ){.   
63b0: 20 20 20 2f 2a 20 4f 6e 6c 79 20 72 65 74 75 72     /* Only retur
63c0: 6e 20 61 20 42 4c 4f 42 20 74 79 70 65 20 69 66  n a BLOB type if
63d0: 20 74 68 65 20 54 63 6c 20 76 61 72 69 61 62 6c   the Tcl variabl
63e0: 65 20 69 73 20 61 20 62 79 74 65 61 72 72 61 79  e is a bytearray
63f0: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 68 61   and.      ** ha
6400: 73 20 6e 6f 20 73 74 72 69 6e 67 20 72 65 70 72  s no string repr
6410: 65 73 65 6e 74 61 74 69 6f 6e 2e 20 2a 2f 0a 20  esentation. */. 
6420: 20 20 20 20 20 64 61 74 61 20 3d 20 54 63 6c 5f       data = Tcl_
6430: 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d  GetByteArrayFrom
6440: 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a 20  Obj(pVar, &n);. 
6450: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
6460: 75 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74  ult_blob(context
6470: 2c 20 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54  , data, n, SQLIT
6480: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
6490: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
64a0: 62 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79  b' && strcmp(zTy
64b0: 70 65 2c 22 62 6f 6f 6c 65 61 6e 22 29 3d 3d 30  pe,"boolean")==0
64c0: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 47 65   ){.      Tcl_Ge
64d0: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 30 2c 20 70  tIntFromObj(0, p
64e0: 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20  Var, &n);.      
64f0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
6500: 6e 74 28 63 6f 6e 74 65 78 74 2c 20 6e 29 3b 0a  nt(context, n);.
6510: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
6520: 3d 27 64 27 20 26 26 20 73 74 72 63 6d 70 28 7a  ='d' && strcmp(z
6530: 54 79 70 65 2c 22 64 6f 75 62 6c 65 22 29 3d 3d  Type,"double")==
6540: 30 20 29 7b 0a 20 20 20 20 20 20 64 6f 75 62 6c  0 ){.      doubl
6550: 65 20 72 3b 0a 20 20 20 20 20 20 54 63 6c 5f 47  e r;.      Tcl_G
6560: 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28  etDoubleFromObj(
6570: 30 2c 20 70 56 61 72 2c 20 26 72 29 3b 0a 20 20  0, pVar, &r);.  
6580: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
6590: 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78  lt_double(contex
65a0: 74 2c 20 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t, r);.    }else
65b0: 20 69 66 28 20 28 63 3d 3d 27 77 27 20 26 26 20   if( (c=='w' && 
65c0: 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 77 69  strcmp(zType,"wi
65d0: 64 65 49 6e 74 22 29 3d 3d 30 29 20 7c 7c 0a 20  deInt")==0) ||. 
65e0: 20 20 20 20 20 20 20 20 20 28 63 3d 3d 27 69 27           (c=='i'
65f0: 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65   && strcmp(zType
6600: 2c 22 69 6e 74 22 29 3d 3d 30 29 20 29 7b 0a 20  ,"int")==0) ){. 
6610: 20 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74       Tcl_WideInt
6620: 20 76 3b 0a 20 20 20 20 20 20 54 63 6c 5f 47 65   v;.      Tcl_Ge
6630: 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28  tWideIntFromObj(
6640: 30 2c 20 70 56 61 72 2c 20 26 76 29 3b 0a 20 20  0, pVar, &v);.  
6650: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
6660: 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74  lt_int64(context
6670: 2c 20 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , v);.    }else{
6680: 0a 20 20 20 20 20 20 64 61 74 61 20 3d 20 28 75  .      data = (u
6690: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 54  nsigned char *)T
66a0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
66b0: 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a 20  Obj(pVar, &n);. 
66c0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
66d0: 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74  ult_text(context
66e0: 2c 20 28 63 68 61 72 20 2a 29 64 61 74 61 2c 20  , (char *)data, 
66f0: 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  n, SQLITE_TRANSI
6700: 45 4e 54 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ENT);.    }.  }.
6710: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
6720: 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
6730: 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  TION./*.** This 
6740: 69 73 20 74 68 65 20 61 75 74 68 65 6e 74 69 63  is the authentic
6750: 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 2e 20  ation function. 
6760: 20 49 74 20 61 70 70 65 6e 64 73 20 74 68 65 20   It appends the 
6770: 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 0a 2a  authentication.*
6780: 2a 20 74 79 70 65 20 63 6f 64 65 20 61 6e 64 20  * type code and 
6790: 74 68 65 20 74 77 6f 20 61 72 67 75 6d 65 6e 74  the two argument
67a0: 73 20 74 6f 20 7a 43 6d 64 5b 5d 20 74 68 65 6e  s to zCmd[] then
67b0: 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 72 65 73   invokes the res
67c0: 75 6c 74 0a 2a 2a 20 6f 6e 20 74 68 65 20 69 6e  ult.** on the in
67d0: 74 65 72 70 72 65 74 65 72 2e 20 20 54 68 65 20  terpreter.  The 
67e0: 72 65 70 6c 79 20 69 73 20 65 78 61 6d 69 6e 65  reply is examine
67f0: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  d to determine i
6800: 66 20 74 68 65 0a 2a 2a 20 61 75 74 68 65 6e 74  f the.** authent
6810: 69 63 61 74 69 6f 6e 20 66 61 69 6c 73 20 6f 72  ication fails or
6820: 20 73 75 63 63 65 65 64 73 2e 0a 2a 2f 0a 73 74   succeeds..*/.st
6830: 61 74 69 63 20 69 6e 74 20 61 75 74 68 5f 63 61  atic int auth_ca
6840: 6c 6c 62 61 63 6b 28 0a 20 20 76 6f 69 64 20 2a  llback(.  void *
6850: 70 41 72 67 2c 0a 20 20 69 6e 74 20 63 6f 64 65  pArg,.  int code
6860: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
6870: 7a 41 72 67 31 2c 0a 20 20 63 6f 6e 73 74 20 63  zArg1,.  const c
6880: 68 61 72 20 2a 7a 41 72 67 32 2c 0a 20 20 63 6f  har *zArg2,.  co
6890: 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 33 2c  nst char *zArg3,
68a0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
68b0: 41 72 67 34 0a 23 69 66 64 65 66 20 53 51 4c 49  Arg4.#ifdef SQLI
68c0: 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49  TE_USER_AUTHENTI
68d0: 43 41 54 49 4f 4e 0a 20 20 2c 63 6f 6e 73 74 20  CATION.  ,const 
68e0: 63 68 61 72 20 2a 7a 41 72 67 35 0a 23 65 6e 64  char *zArg5.#end
68f0: 69 66 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  if.){.  const ch
6900: 61 72 20 2a 7a 43 6f 64 65 3b 0a 20 20 54 63 6c  ar *zCode;.  Tcl
6910: 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a 20 20  _DString str;.  
6920: 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20  int rc;.  const 
6930: 63 68 61 72 20 2a 7a 52 65 70 6c 79 3b 0a 20 20  char *zReply;.  
6940: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20  SqliteDb *pDb = 
6950: 28 53 71 6c 69 74 65 44 62 2a 29 70 41 72 67 3b  (SqliteDb*)pArg;
6960: 0a 20 20 69 66 28 20 70 44 62 2d 3e 64 69 73 61  .  if( pDb->disa
6970: 62 6c 65 41 75 74 68 20 29 20 72 65 74 75 72 6e  bleAuth ) return
6980: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73   SQLITE_OK;..  s
6990: 77 69 74 63 68 28 20 63 6f 64 65 20 29 7b 0a 20  witch( code ){. 
69a0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
69b0: 4f 50 59 20 20 20 20 20 20 20 20 20 20 20 20 20  OPY             
69c0: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
69d0: 5f 43 4f 50 59 22 3b 20 62 72 65 61 6b 3b 0a 20  _COPY"; break;. 
69e0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
69f0: 52 45 41 54 45 5f 49 4e 44 45 58 20 20 20 20 20  REATE_INDEX     
6a00: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
6a10: 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 22 3b 20  _CREATE_INDEX"; 
6a20: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
6a30: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41  SQLITE_CREATE_TA
6a40: 42 4c 45 20 20 20 20 20 20 3a 20 7a 43 6f 64 65  BLE      : zCode
6a50: 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  ="SQLITE_CREATE_
6a60: 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20  TABLE"; break;. 
6a70: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
6a80: 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58  REATE_TEMP_INDEX
6a90: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
6aa0: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44  _CREATE_TEMP_IND
6ab0: 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  EX"; break;.    
6ac0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41  case SQLITE_CREA
6ad0: 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 20 3a 20  TE_TEMP_TABLE : 
6ae0: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52  zCode="SQLITE_CR
6af0: 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 22  EATE_TEMP_TABLE"
6b00: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
6b10: 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  e SQLITE_CREATE_
6b20: 54 45 4d 50 5f 54 52 49 47 47 45 52 3a 20 7a 43  TEMP_TRIGGER: zC
6b30: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41  ode="SQLITE_CREA
6b40: 54 45 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 22  TE_TEMP_TRIGGER"
6b50: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
6b60: 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  e SQLITE_CREATE_
6b70: 54 45 4d 50 5f 56 49 45 57 20 20 3a 20 7a 43 6f  TEMP_VIEW  : zCo
6b80: 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54  de="SQLITE_CREAT
6b90: 45 5f 54 45 4d 50 5f 56 49 45 57 22 3b 20 62 72  E_TEMP_VIEW"; br
6ba0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
6bb0: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 52 49 47  LITE_CREATE_TRIG
6bc0: 47 45 52 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22  GER    : zCode="
6bd0: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 52  SQLITE_CREATE_TR
6be0: 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20  IGGER"; break;. 
6bf0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
6c00: 52 45 41 54 45 5f 56 49 45 57 20 20 20 20 20 20  REATE_VIEW      
6c10: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
6c20: 5f 43 52 45 41 54 45 5f 56 49 45 57 22 3b 20 62  _CREATE_VIEW"; b
6c30: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
6c40: 51 4c 49 54 45 5f 44 45 4c 45 54 45 20 20 20 20  QLITE_DELETE    
6c50: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
6c60: 22 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 22 3b  "SQLITE_DELETE";
6c70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
6c80: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44   SQLITE_DROP_IND
6c90: 45 58 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64  EX        : zCod
6ca0: 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49  e="SQLITE_DROP_I
6cb0: 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20  NDEX"; break;.  
6cc0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52    case SQLITE_DR
6cd0: 4f 50 5f 54 41 42 4c 45 20 20 20 20 20 20 20 20  OP_TABLE        
6ce0: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
6cf0: 44 52 4f 50 5f 54 41 42 4c 45 22 3b 20 62 72 65  DROP_TABLE"; bre
6d00: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
6d10: 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e  ITE_DROP_TEMP_IN
6d20: 44 45 58 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53  DEX   : zCode="S
6d30: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
6d40: 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20  INDEX"; break;. 
6d50: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
6d60: 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 20 20  ROP_TEMP_TABLE  
6d70: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
6d80: 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45  _DROP_TEMP_TABLE
6d90: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
6da0: 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54  se SQLITE_DROP_T
6db0: 45 4d 50 5f 54 52 49 47 47 45 52 20 3a 20 7a 43  EMP_TRIGGER : zC
6dc0: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50  ode="SQLITE_DROP
6dd0: 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 22 3b 20  _TEMP_TRIGGER"; 
6de0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
6df0: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
6e00: 5f 56 49 45 57 20 20 20 20 3a 20 7a 43 6f 64 65  _VIEW    : zCode
6e10: 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  ="SQLITE_DROP_TE
6e20: 4d 50 5f 56 49 45 57 22 3b 20 62 72 65 61 6b 3b  MP_VIEW"; break;
6e30: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
6e40: 5f 44 52 4f 50 5f 54 52 49 47 47 45 52 20 20 20  _DROP_TRIGGER   
6e50: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
6e60: 54 45 5f 44 52 4f 50 5f 54 52 49 47 47 45 52 22  TE_DROP_TRIGGER"
6e70: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
6e80: 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49  e SQLITE_DROP_VI
6e90: 45 57 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f  EW         : zCo
6ea0: 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f  de="SQLITE_DROP_
6eb0: 56 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20  VIEW"; break;.  
6ec0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e    case SQLITE_IN
6ed0: 53 45 52 54 20 20 20 20 20 20 20 20 20 20 20 20  SERT            
6ee0: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
6ef0: 49 4e 53 45 52 54 22 3b 20 62 72 65 61 6b 3b 0a  INSERT"; break;.
6f00: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
6f10: 50 52 41 47 4d 41 20 20 20 20 20 20 20 20 20 20  PRAGMA          
6f20: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
6f30: 45 5f 50 52 41 47 4d 41 22 3b 20 62 72 65 61 6b  E_PRAGMA"; break
6f40: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
6f50: 45 5f 52 45 41 44 20 20 20 20 20 20 20 20 20 20  E_READ          
6f60: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
6f70: 49 54 45 5f 52 45 41 44 22 3b 20 62 72 65 61 6b  ITE_READ"; break
6f80: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
6f90: 45 5f 53 45 4c 45 43 54 20 20 20 20 20 20 20 20  E_SELECT        
6fa0: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
6fb0: 49 54 45 5f 53 45 4c 45 43 54 22 3b 20 62 72 65  ITE_SELECT"; bre
6fc0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
6fd0: 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 20  ITE_TRANSACTION 
6fe0: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
6ff0: 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f  QLITE_TRANSACTIO
7000: 4e 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  N"; break;.    c
7010: 61 73 65 20 53 51 4c 49 54 45 5f 55 50 44 41 54  ase SQLITE_UPDAT
7020: 45 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a  E            : z
7030: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 55 50 44  Code="SQLITE_UPD
7040: 41 54 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ATE"; break;.   
7050: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 54 54   case SQLITE_ATT
7060: 41 43 48 20 20 20 20 20 20 20 20 20 20 20 20 3a  ACH            :
7070: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 41   zCode="SQLITE_A
7080: 54 54 41 43 48 22 3b 20 62 72 65 61 6b 3b 0a 20  TTACH"; break;. 
7090: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
70a0: 45 54 41 43 48 20 20 20 20 20 20 20 20 20 20 20  ETACH           
70b0: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
70c0: 5f 44 45 54 41 43 48 22 3b 20 62 72 65 61 6b 3b  _DETACH"; break;
70d0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
70e0: 5f 41 4c 54 45 52 5f 54 41 42 4c 45 20 20 20 20  _ALTER_TABLE    
70f0: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
7100: 54 45 5f 41 4c 54 45 52 5f 54 41 42 4c 45 22 3b  TE_ALTER_TABLE";
7110: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
7120: 20 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58 20   SQLITE_REINDEX 
7130: 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64            : zCod
7140: 65 3d 22 53 51 4c 49 54 45 5f 52 45 49 4e 44 45  e="SQLITE_REINDE
7150: 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  X"; break;.    c
7160: 61 73 65 20 53 51 4c 49 54 45 5f 41 4e 41 4c 59  ase SQLITE_ANALY
7170: 5a 45 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a  ZE           : z
7180: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 41 4e 41  Code="SQLITE_ANA
7190: 4c 59 5a 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20  LYZE"; break;.  
71a0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52    case SQLITE_CR
71b0: 45 41 54 45 5f 56 54 41 42 4c 45 20 20 20 20 20  EATE_VTABLE     
71c0: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
71d0: 43 52 45 41 54 45 5f 56 54 41 42 4c 45 22 3b 20  CREATE_VTABLE"; 
71e0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
71f0: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54 41 42  SQLITE_DROP_VTAB
7200: 4c 45 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65  LE       : zCode
7210: 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54  ="SQLITE_DROP_VT
7220: 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20  ABLE"; break;.  
7230: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 55    case SQLITE_FU
7240: 4e 43 54 49 4f 4e 20 20 20 20 20 20 20 20 20 20  NCTION          
7250: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
7260: 46 55 4e 43 54 49 4f 4e 22 3b 20 62 72 65 61 6b  FUNCTION"; break
7270: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
7280: 45 5f 53 41 56 45 50 4f 49 4e 54 20 20 20 20 20  E_SAVEPOINT     
7290: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
72a0: 49 54 45 5f 53 41 56 45 50 4f 49 4e 54 22 3b 20  ITE_SAVEPOINT"; 
72b0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
72c0: 53 51 4c 49 54 45 5f 52 45 43 55 52 53 49 56 45  SQLITE_RECURSIVE
72d0: 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65           : zCode
72e0: 3d 22 53 51 4c 49 54 45 5f 52 45 43 55 52 53 49  ="SQLITE_RECURSI
72f0: 56 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  VE"; break;.    
7300: 64 65 66 61 75 6c 74 20 20 20 20 20 20 20 20 20  default         
7310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3a 20                : 
7320: 7a 43 6f 64 65 3d 22 3f 3f 3f 3f 22 3b 20 62 72  zCode="????"; br
7330: 65 61 6b 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 44  eak;.  }.  Tcl_D
7340: 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29  StringInit(&str)
7350: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41  ;.  Tcl_DStringA
7360: 70 70 65 6e 64 28 26 73 74 72 2c 20 70 44 62 2d  ppend(&str, pDb-
7370: 3e 7a 41 75 74 68 2c 20 2d 31 29 3b 0a 20 20 54  >zAuth, -1);.  T
7380: 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64  cl_DStringAppend
7390: 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 43  Element(&str, zC
73a0: 6f 64 65 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72  ode);.  Tcl_DStr
73b0: 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ingAppendElement
73c0: 28 26 73 74 72 2c 20 7a 41 72 67 31 20 3f 20 7a  (&str, zArg1 ? z
73d0: 41 72 67 31 20 3a 20 22 22 29 3b 0a 20 20 54 63  Arg1 : "");.  Tc
73e0: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45  l_DStringAppendE
73f0: 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41 72  lement(&str, zAr
7400: 67 32 20 3f 20 7a 41 72 67 32 20 3a 20 22 22 29  g2 ? zArg2 : "")
7410: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41  ;.  Tcl_DStringA
7420: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74  ppendElement(&st
7430: 72 2c 20 7a 41 72 67 33 20 3f 20 7a 41 72 67 33  r, zArg3 ? zArg3
7440: 20 3a 20 22 22 29 3b 0a 20 20 54 63 6c 5f 44 53   : "");.  Tcl_DS
7450: 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65  tringAppendEleme
7460: 6e 74 28 26 73 74 72 2c 20 7a 41 72 67 34 20 3f  nt(&str, zArg4 ?
7470: 20 7a 41 72 67 34 20 3a 20 22 22 29 3b 0a 23 69   zArg4 : "");.#i
7480: 66 64 65 66 20 53 51 4c 49 54 45 5f 55 53 45 52  fdef SQLITE_USER
7490: 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a  _AUTHENTICATION.
74a0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
74b0: 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c  endElement(&str,
74c0: 20 7a 41 72 67 35 20 3f 20 7a 41 72 67 35 20 3a   zArg5 ? zArg5 :
74d0: 20 22 22 29 3b 0a 23 65 6e 64 69 66 20 20 0a 20   "");.#endif  . 
74e0: 20 72 63 20 3d 20 54 63 6c 5f 47 6c 6f 62 61 6c   rc = Tcl_Global
74f0: 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70  Eval(pDb->interp
7500: 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c  , Tcl_DStringVal
7510: 75 65 28 26 73 74 72 29 29 3b 0a 20 20 54 63 6c  ue(&str));.  Tcl
7520: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 73 74  _DStringFree(&st
7530: 72 29 3b 0a 20 20 7a 52 65 70 6c 79 20 3d 20 72  r);.  zReply = r
7540: 63 3d 3d 54 43 4c 5f 4f 4b 20 3f 20 54 63 6c 5f  c==TCL_OK ? Tcl_
7550: 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28  GetStringResult(
7560: 70 44 62 2d 3e 69 6e 74 65 72 70 29 20 3a 20 22  pDb->interp) : "
7570: 53 51 4c 49 54 45 5f 44 45 4e 59 22 3b 0a 20 20  SQLITE_DENY";.  
7580: 69 66 28 20 73 74 72 63 6d 70 28 7a 52 65 70 6c  if( strcmp(zRepl
7590: 79 2c 22 53 51 4c 49 54 45 5f 4f 4b 22 29 3d 3d  y,"SQLITE_OK")==
75a0: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
75b0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
75c0: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 52 65 70   if( strcmp(zRep
75d0: 6c 79 2c 22 53 51 4c 49 54 45 5f 44 45 4e 59 22  ly,"SQLITE_DENY"
75e0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  )==0 ){.    rc =
75f0: 20 53 51 4c 49 54 45 5f 44 45 4e 59 3b 0a 20 20   SQLITE_DENY;.  
7600: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
7610: 28 7a 52 65 70 6c 79 2c 22 53 51 4c 49 54 45 5f  (zReply,"SQLITE_
7620: 49 47 4e 4f 52 45 22 29 3d 3d 30 20 29 7b 0a 20  IGNORE")==0 ){. 
7630: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
7640: 47 4e 4f 52 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a  GNORE;.  }else{.
7650: 20 20 20 20 72 63 20 3d 20 39 39 39 3b 0a 20 20      rc = 999;.  
7660: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
7670: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
7680: 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
7690: 54 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  TION */../*.** T
76a0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 61 64  his routine read
76b0: 73 20 61 20 6c 69 6e 65 20 6f 66 20 74 65 78 74  s a line of text
76c0: 20 66 72 6f 6d 20 46 49 4c 45 20 69 6e 2c 20 73   from FILE in, s
76d0: 74 6f 72 65 73 0a 2a 2a 20 74 68 65 20 74 65 78  tores.** the tex
76e0: 74 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61  t in memory obta
76f0: 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
7700: 28 29 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61  () and returns a
7710: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
7720: 68 65 20 74 65 78 74 2e 20 20 4e 55 4c 4c 20 69  he text.  NULL i
7730: 73 20 72 65 74 75 72 6e 65 64 20 61 74 20 65 6e  s returned at en
7740: 64 20 6f 66 20 66 69 6c 65 2c 20 6f 72 20 69 66  d of file, or if
7750: 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 66 61 69   malloc().** fai
7760: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e  ls..**.** The in
7770: 74 65 72 66 61 63 65 20 69 73 20 6c 69 6b 65 20  terface is like 
7780: 22 72 65 61 64 6c 69 6e 65 22 20 62 75 74 20 6e  "readline" but n
7790: 6f 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 65  o command-line e
77a0: 64 69 74 69 6e 67 0a 2a 2a 20 69 73 20 64 6f 6e  diting.** is don
77b0: 65 2e 0a 2a 2a 0a 2a 2a 20 63 6f 70 69 65 64 20  e..**.** copied 
77c0: 66 72 6f 6d 20 73 68 65 6c 6c 2e 63 20 66 72 6f  from shell.c fro
77d0: 6d 20 27 2e 69 6d 70 6f 72 74 27 20 63 6f 6d 6d  m '.import' comm
77e0: 61 6e 64 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  and.*/.static ch
77f0: 61 72 20 2a 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e  ar *local_getlin
7800: 65 28 63 68 61 72 20 2a 7a 50 72 6f 6d 70 74 2c  e(char *zPrompt,
7810: 20 46 49 4c 45 20 2a 69 6e 29 7b 0a 20 20 63 68   FILE *in){.  ch
7820: 61 72 20 2a 7a 4c 69 6e 65 3b 0a 20 20 69 6e 74  ar *zLine;.  int
7830: 20 6e 4c 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 3b   nLine;.  int n;
7840: 0a 0a 20 20 6e 4c 69 6e 65 20 3d 20 31 30 30 3b  ..  nLine = 100;
7850: 0a 20 20 7a 4c 69 6e 65 20 3d 20 6d 61 6c 6c 6f  .  zLine = mallo
7860: 63 28 20 6e 4c 69 6e 65 20 29 3b 0a 20 20 69 66  c( nLine );.  if
7870: 28 20 7a 4c 69 6e 65 3d 3d 30 20 29 20 72 65 74  ( zLine==0 ) ret
7880: 75 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 30 3b 0a  urn 0;.  n = 0;.
7890: 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
78a0: 20 20 69 66 28 20 6e 2b 31 30 30 3e 6e 4c 69 6e    if( n+100>nLin
78b0: 65 20 29 7b 0a 20 20 20 20 20 20 6e 4c 69 6e 65  e ){.      nLine
78c0: 20 3d 20 6e 4c 69 6e 65 2a 32 20 2b 20 31 30 30   = nLine*2 + 100
78d0: 3b 0a 20 20 20 20 20 20 7a 4c 69 6e 65 20 3d 20  ;.      zLine = 
78e0: 72 65 61 6c 6c 6f 63 28 7a 4c 69 6e 65 2c 20 6e  realloc(zLine, n
78f0: 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Line);.      if(
7900: 20 7a 4c 69 6e 65 3d 3d 30 20 29 20 72 65 74 75   zLine==0 ) retu
7910: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
7920: 69 66 28 20 66 67 65 74 73 28 26 7a 4c 69 6e 65  if( fgets(&zLine
7930: 5b 6e 5d 2c 20 6e 4c 69 6e 65 20 2d 20 6e 2c 20  [n], nLine - n, 
7940: 69 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  in)==0 ){.      
7950: 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  if( n==0 ){.    
7960: 20 20 20 20 66 72 65 65 28 7a 4c 69 6e 65 29 3b      free(zLine);
7970: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
7980: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
7990: 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20   zLine[n] = 0;. 
79a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
79b0: 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 4c 69  }.    while( zLi
79c0: 6e 65 5b 6e 5d 20 29 7b 20 6e 2b 2b 3b 20 7d 0a  ne[n] ){ n++; }.
79d0: 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20 7a      if( n>0 && z
79e0: 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 6e 27 20  Line[n-1]=='\n' 
79f0: 29 7b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20  ){.      n--;.  
7a00: 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30      zLine[n] = 0
7a10: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
7a20: 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 4c 69 6e 65     }.  }.  zLine
7a30: 20 3d 20 72 65 61 6c 6c 6f 63 28 20 7a 4c 69 6e   = realloc( zLin
7a40: 65 2c 20 6e 2b 31 20 29 3b 0a 20 20 72 65 74 75  e, n+1 );.  retu
7a50: 72 6e 20 7a 4c 69 6e 65 3b 0a 7d 0a 0a 0a 2f 2a  rn zLine;.}.../*
7a60: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
7a70: 6e 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  n is part of the
7a80: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
7a90: 6f 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64 3a 0a  of the command:.
7aa0: 2a 2a 0a 2a 2a 20 20 20 24 64 62 20 74 72 61 6e  **.**   $db tran
7ab0: 73 61 63 74 69 6f 6e 20 5b 2d 64 65 66 65 72 72  saction [-deferr
7ac0: 65 64 7c 2d 69 6d 6d 65 64 69 61 74 65 7c 2d 65  ed|-immediate|-e
7ad0: 78 63 6c 75 73 69 76 65 5d 20 53 43 52 49 50 54  xclusive] SCRIPT
7ae0: 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6e 76  .**.** It is inv
7af0: 6f 6b 65 64 20 61 66 74 65 72 20 65 76 61 6c 75  oked after evalu
7b00: 61 74 69 6e 67 20 74 68 65 20 73 63 72 69 70 74  ating the script
7b10: 20 53 43 52 49 50 54 20 74 6f 20 63 6f 6d 6d 69   SCRIPT to commi
7b20: 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  t or rollback.**
7b30: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
7b40: 20 6f 72 20 73 61 76 65 70 6f 69 6e 74 20 6f 70   or savepoint op
7b50: 65 6e 65 64 20 62 79 20 74 68 65 20 5b 74 72 61  ened by the [tra
7b60: 6e 73 61 63 74 69 6f 6e 5d 20 63 6f 6d 6d 61 6e  nsaction] comman
7b70: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
7b80: 20 44 62 54 72 61 6e 73 50 6f 73 74 43 6d 64 28   DbTransPostCmd(
7b90: 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 64 61  .  ClientData da
7ba0: 74 61 5b 5d 2c 20 20 20 20 20 20 20 20 20 20 20  ta[],           
7bb0: 20 20 20 20 20 20 20 20 2f 2a 20 64 61 74 61 5b          /* data[
7bc0: 30 5d 20 69 73 20 74 68 65 20 53 71 6c 69 74 65  0] is the Sqlite
7bd0: 33 44 62 2a 20 66 6f 72 20 24 64 62 20 2a 2f 0a  3Db* for $db */.
7be0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
7bf0: 74 65 72 70 2c 20 20 20 20 20 20 20 20 20 20 20  terp,           
7c00: 20 20 20 20 20 20 20 2f 2a 20 54 63 6c 20 69 6e         /* Tcl in
7c10: 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 20 20 69  terpreter */.  i
7c20: 6e 74 20 72 65 73 75 6c 74 20 20 20 20 20 20 20  nt result       
7c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c40: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66      /* Result of
7c50: 20 65 76 61 6c 75 61 74 69 6e 67 20 53 43 52 49   evaluating SCRI
7c60: 50 54 20 2a 2f 0a 29 7b 0a 20 20 73 74 61 74 69  PT */.){.  stati
7c70: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f  c const char *co
7c80: 6e 73 74 20 61 7a 45 6e 64 5b 5d 20 3d 20 7b 0a  nst azEnd[] = {.
7c90: 20 20 20 20 22 52 45 4c 45 41 53 45 20 5f 74 63      "RELEASE _tc
7ca0: 6c 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22 2c 20  l_transaction", 
7cb0: 20 20 20 20 20 20 20 2f 2a 20 72 63 3d 3d 54 43         /* rc==TC
7cc0: 4c 5f 45 52 52 4f 52 2c 20 6e 54 72 61 6e 73 61  L_ERROR, nTransa
7cd0: 63 74 69 6f 6e 21 3d 30 20 2a 2f 0a 20 20 20 20  ction!=0 */.    
7ce0: 22 43 4f 4d 4d 49 54 22 2c 20 20 20 20 20 20 20  "COMMIT",       
7cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d00: 20 20 20 2f 2a 20 72 63 21 3d 54 43 4c 5f 45 52     /* rc!=TCL_ER
7d10: 52 4f 52 2c 20 6e 54 72 61 6e 73 61 63 74 69 6f  ROR, nTransactio
7d20: 6e 3d 3d 30 20 2a 2f 0a 20 20 20 20 22 52 4f 4c  n==0 */.    "ROL
7d30: 4c 42 41 43 4b 20 54 4f 20 5f 74 63 6c 5f 74 72  LBACK TO _tcl_tr
7d40: 61 6e 73 61 63 74 69 6f 6e 20 3b 20 52 45 4c 45  ansaction ; RELE
7d50: 41 53 45 20 5f 74 63 6c 5f 74 72 61 6e 73 61 63  ASE _tcl_transac
7d60: 74 69 6f 6e 22 2c 0a 20 20 20 20 22 52 4f 4c 4c  tion",.    "ROLL
7d70: 42 41 43 4b 22 20 20 20 20 20 20 20 20 20 20 20  BACK"           
7d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7d90: 20 72 63 3d 3d 54 43 4c 5f 45 52 52 4f 52 2c 20   rc==TCL_ERROR, 
7da0: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 30 20  nTransaction==0 
7db0: 2a 2f 0a 20 20 7d 3b 0a 20 20 53 71 6c 69 74 65  */.  };.  Sqlite
7dc0: 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74  Db *pDb = (Sqlit
7dd0: 65 44 62 2a 29 64 61 74 61 5b 30 5d 3b 0a 20 20  eDb*)data[0];.  
7de0: 69 6e 74 20 72 63 20 3d 20 72 65 73 75 6c 74 3b  int rc = result;
7df0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
7e00: 45 6e 64 3b 0a 0a 20 20 70 44 62 2d 3e 6e 54 72  End;..  pDb->nTr
7e10: 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 7a  ansaction--;.  z
7e20: 45 6e 64 20 3d 20 61 7a 45 6e 64 5b 28 72 63 3d  End = azEnd[(rc=
7e30: 3d 54 43 4c 5f 45 52 52 4f 52 29 2a 32 20 2b 20  =TCL_ERROR)*2 + 
7e40: 28 70 44 62 2d 3e 6e 54 72 61 6e 73 61 63 74 69  (pDb->nTransacti
7e50: 6f 6e 3d 3d 30 29 5d 3b 0a 0a 20 20 70 44 62 2d  on==0)];..  pDb-
7e60: 3e 64 69 73 61 62 6c 65 41 75 74 68 2b 2b 3b 0a  >disableAuth++;.
7e70: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 65 78    if( sqlite3_ex
7e80: 65 63 28 70 44 62 2d 3e 64 62 2c 20 7a 45 6e 64  ec(pDb->db, zEnd
7e90: 2c 20 30 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20  , 0, 0, 0) ){.  
7ea0: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61      /* This is a
7eb0: 20 74 72 69 63 6b 79 20 73 63 65 6e 61 72 69 6f   tricky scenario
7ec0: 20 74 6f 20 68 61 6e 64 6c 65 2e 20 54 68 65 20   to handle. The 
7ed0: 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 63 61 75 73  most likely caus
7ee0: 65 20 6f 66 20 61 6e 0a 20 20 20 20 20 20 2a 2a  e of an.      **
7ef0: 20 65 72 72 6f 72 20 69 73 20 74 68 61 74 20 74   error is that t
7f00: 68 65 20 65 78 65 63 28 29 20 61 62 6f 76 65 20  he exec() above 
7f10: 77 61 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74  was an attempt t
7f20: 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 0a 20 20  o commit the .  
7f30: 20 20 20 20 2a 2a 20 74 6f 70 2d 6c 65 76 65 6c      ** top-level
7f40: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61   transaction tha
7f50: 74 20 72 65 74 75 72 6e 65 64 20 53 51 4c 49 54  t returned SQLIT
7f60: 45 5f 42 55 53 59 2e 20 4f 72 2c 20 6c 65 73 73  E_BUSY. Or, less
7f70: 20 6c 69 6b 65 6c 79 2c 0a 20 20 20 20 20 20 2a   likely,.      *
7f80: 2a 20 74 68 61 74 20 61 6e 20 49 4f 2d 65 72 72  * that an IO-err
7f90: 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e  or has occurred.
7fa0: 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c   In either case,
7fb0: 20 74 68 72 6f 77 20 61 20 54 63 6c 20 65 78 63   throw a Tcl exc
7fc0: 65 70 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  eption.      ** 
7fd0: 61 6e 64 20 74 72 79 20 74 6f 20 72 6f 6c 6c 62  and try to rollb
7fe0: 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74  ack the transact
7ff0: 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ion..      **.  
8000: 20 20 20 20 2a 2a 20 42 75 74 20 69 74 20 63 6f      ** But it co
8010: 75 6c 64 20 61 6c 73 6f 20 62 65 20 74 68 61 74  uld also be that
8020: 20 74 68 65 20 75 73 65 72 20 65 78 65 63 75 74   the user execut
8030: 65 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 42  ed one or more B
8040: 45 47 49 4e 2c 20 0a 20 20 20 20 20 20 2a 2a 20  EGIN, .      ** 
8050: 43 4f 4d 4d 49 54 2c 20 53 41 56 45 50 4f 49 4e  COMMIT, SAVEPOIN
8060: 54 2c 20 52 45 4c 45 41 53 45 20 6f 72 20 52 4f  T, RELEASE or RO
8070: 4c 4c 42 41 43 4b 20 63 6f 6d 6d 61 6e 64 73 20  LLBACK commands 
8080: 74 68 61 74 20 61 72 65 20 63 6f 6e 66 75 73 69  that are confusi
8090: 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73  ng.      ** this
80a0: 20 6d 65 74 68 6f 64 27 73 20 6c 6f 67 69 63 2e   method's logic.
80b0: 20 4e 6f 74 20 63 6c 65 61 72 20 68 6f 77 20 74   Not clear how t
80c0: 68 69 73 20 77 6f 75 6c 64 20 62 65 20 62 65 73  his would be bes
80d0: 74 20 68 61 6e 64 6c 65 64 2e 0a 20 20 20 20 20  t handled..     
80e0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 21 3d   */.    if( rc!=
80f0: 54 43 4c 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20  TCL_ERROR ){.   
8100: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
8110: 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69  ult(interp, sqli
8120: 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e  te3_errmsg(pDb->
8130: 64 62 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  db), (char*)0);.
8140: 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45        rc = TCL_E
8150: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
8160: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62  sqlite3_exec(pDb
8170: 2d 3e 64 62 2c 20 22 52 4f 4c 4c 42 41 43 4b 22  ->db, "ROLLBACK"
8180: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  , 0, 0, 0);.  }.
8190: 20 20 70 44 62 2d 3e 64 69 73 61 62 6c 65 41 75    pDb->disableAu
81a0: 74 68 2d 2d 3b 0a 0a 20 20 72 65 74 75 72 6e 20  th--;..  return 
81b0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c  rc;.}../*.** Unl
81c0: 65 73 73 20 53 51 4c 49 54 45 5f 54 45 53 54 20  ess SQLITE_TEST 
81d0: 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68 69 73  is defined, this
81e0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 73   function is a s
81f0: 69 6d 70 6c 65 20 77 72 61 70 70 65 72 20 61 72  imple wrapper ar
8200: 6f 75 6e 64 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  ound.** sqlite3_
8210: 70 72 65 70 61 72 65 5f 76 32 28 29 2e 20 49 66  prepare_v2(). If
8220: 20 53 51 4c 49 54 45 5f 54 45 53 54 20 69 73 20   SQLITE_TEST is 
8230: 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 69 74  defined, then it
8240: 20 75 73 65 73 20 65 69 74 68 65 72 0a 2a 2a 20   uses either.** 
8250: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
8260: 76 32 28 29 20 6f 72 20 6c 65 67 61 63 79 20 69  v2() or legacy i
8270: 6e 74 65 72 66 61 63 65 20 73 71 6c 69 74 65 33  nterface sqlite3
8280: 5f 70 72 65 70 61 72 65 28 29 2c 20 64 65 70 65  _prepare(), depe
8290: 6e 64 69 6e 67 0a 2a 2a 20 6f 6e 20 77 68 65 74  nding.** on whet
82a0: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 5b  her or not the [
82b0: 64 62 5f 75 73 65 5f 6c 65 67 61 63 79 5f 70 72  db_use_legacy_pr
82c0: 65 70 61 72 65 5d 20 63 6f 6d 6d 61 6e 64 20 68  epare] command h
82d0: 61 73 20 62 65 65 6e 20 75 73 65 64 20 74 6f 20  as been used to 
82e0: 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 65 20 74 68  .** configure th
82f0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  e connection..*/
8300: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 62 50 72  .static int dbPr
8310: 65 70 61 72 65 28 0a 20 20 53 71 6c 69 74 65 44  epare(.  SqliteD
8320: 62 20 2a 70 44 62 2c 20 20 20 20 20 20 20 20 20  b *pDb,         
8330: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
8340: 62 61 73 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  base object */. 
8350: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
8360: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
8370: 20 2f 2a 20 53 51 4c 20 74 6f 20 63 6f 6d 70 69   /* SQL to compi
8380: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  le */.  sqlite3_
8390: 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 20 20  stmt **ppStmt,  
83a0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
83b0: 50 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  Prepared stateme
83c0: 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  nt */.  const ch
83d0: 61 72 20 2a 2a 70 7a 4f 75 74 20 20 20 20 20 20  ar **pzOut      
83e0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
83f0: 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 78 74 20  Pointer to next 
8400: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  SQL statement */
8410: 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .){.#ifdef SQLIT
8420: 45 5f 54 45 53 54 0a 20 20 69 66 28 20 70 44 62  E_TEST.  if( pDb
8430: 2d 3e 62 4c 65 67 61 63 79 50 72 65 70 61 72 65  ->bLegacyPrepare
8440: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73   ){.    return s
8450: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 70  qlite3_prepare(p
8460: 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  Db->db, zSql, -1
8470: 2c 20 70 70 53 74 6d 74 2c 20 70 7a 4f 75 74 29  , ppStmt, pzOut)
8480: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
8490: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 70 72  eturn sqlite3_pr
84a0: 65 70 61 72 65 5f 76 32 28 70 44 62 2d 3e 64 62  epare_v2(pDb->db
84b0: 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 70 70 53 74  , zSql, -1, ppSt
84c0: 6d 74 2c 20 70 7a 4f 75 74 29 3b 0a 7d 0a 0a 2f  mt, pzOut);.}../
84d0: 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74 68 65 20  *.** Search the 
84e0: 63 61 63 68 65 20 66 6f 72 20 61 20 70 72 65 70  cache for a prep
84f0: 61 72 65 64 2d 73 74 61 74 65 6d 65 6e 74 20 6f  ared-statement o
8500: 62 6a 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65  bject that imple
8510: 6d 65 6e 74 73 20 74 68 65 0a 2a 2a 20 66 69 72  ments the.** fir
8520: 73 74 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  st SQL statement
8530: 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 20 70   in the buffer p
8540: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70 61 72  ointed to by par
8550: 61 6d 65 74 65 72 20 7a 49 6e 2e 20 49 66 0a 2a  ameter zIn. If.*
8560: 2a 20 6e 6f 20 73 75 63 68 20 70 72 65 70 61 72  * no such prepar
8570: 65 64 2d 73 74 61 74 65 6d 65 6e 74 20 63 61 6e  ed-statement can
8580: 20 62 65 20 66 6f 75 6e 64 2c 20 61 6c 6c 6f 63   be found, alloc
8590: 61 74 65 20 61 6e 64 20 70 72 65 70 61 72 65 20  ate and prepare 
85a0: 61 20 6e 65 77 0a 2a 2a 20 6f 6e 65 2e 20 49 6e  a new.** one. In
85b0: 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 62 69   either case, bi
85c0: 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  nd the current v
85d0: 61 6c 75 65 73 20 6f 66 20 74 68 65 20 72 65 6c  alues of the rel
85e0: 65 76 61 6e 74 20 54 63 6c 0a 2a 2a 20 76 61 72  evant Tcl.** var
85f0: 69 61 62 6c 65 73 20 74 6f 20 61 6e 79 20 24 76  iables to any $v
8600: 61 72 2c 20 3a 76 61 72 20 6f 72 20 40 76 61 72  ar, :var or @var
8610: 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68   variables in th
8620: 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 42 65 66  e statement. Bef
8630: 6f 72 65 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67  ore.** returning
8640: 2c 20 73 65 74 20 2a 70 70 50 72 65 53 74 6d 74  , set *ppPreStmt
8650: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
8660: 20 70 72 65 70 61 72 65 64 2d 73 74 61 74 65 6d   prepared-statem
8670: 65 6e 74 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a  ent object..**.*
8680: 2a 20 4f 75 74 70 75 74 20 70 61 72 61 6d 65 74  * Output paramet
8690: 65 72 20 2a 70 7a 4f 75 74 20 69 73 20 73 65 74  er *pzOut is set
86a0: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
86b0: 20 6e 65 78 74 20 53 51 4c 20 73 74 61 74 65 6d   next SQL statem
86c0: 65 6e 74 20 69 6e 0a 2a 2a 20 62 75 66 66 65 72  ent in.** buffer
86d0: 20 7a 49 6e 2c 20 6f 72 20 74 6f 20 74 68 65 20   zIn, or to the 
86e0: 27 5c 30 27 20 62 79 74 65 20 61 74 20 74 68 65  '\0' byte at the
86f0: 20 65 6e 64 20 6f 66 20 7a 49 6e 20 69 66 20 74   end of zIn if t
8700: 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 6e 65  here is no.** ne
8710: 78 74 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  xt statement..**
8720: 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
8730: 6c 2c 20 54 43 4c 5f 4f 4b 20 69 73 20 72 65 74  l, TCL_OK is ret
8740: 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
8750: 2c 20 54 43 4c 5f 45 52 52 4f 52 20 69 73 20 72  , TCL_ERROR is r
8760: 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 61  eturned.** and a
8770: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
8780: 6c 6f 61 64 65 64 20 69 6e 74 6f 20 69 6e 74 65  loaded into inte
8790: 72 70 72 65 74 65 72 20 70 44 62 2d 3e 69 6e 74  rpreter pDb->int
87a0: 65 72 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  erp..*/.static i
87b0: 6e 74 20 64 62 50 72 65 70 61 72 65 41 6e 64 42  nt dbPrepareAndB
87c0: 69 6e 64 28 0a 20 20 53 71 6c 69 74 65 44 62 20  ind(.  SqliteDb 
87d0: 2a 70 44 62 2c 20 20 20 20 20 20 20 20 20 20 20  *pDb,           
87e0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
87f0: 73 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  se object */.  c
8800: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 49 6e 2c 20  har const *zIn, 
8810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8820: 2a 20 53 51 4c 20 74 6f 20 63 6f 6d 70 69 6c 65  * SQL to compile
8830: 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74   */.  char const
8840: 20 2a 2a 70 7a 4f 75 74 2c 20 20 20 20 20 20 20   **pzOut,       
8850: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f        /* OUT: Po
8860: 69 6e 74 65 72 20 74 6f 20 6e 65 78 74 20 53 51  inter to next SQ
8870: 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  L statement */. 
8880: 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74   SqlPreparedStmt
8890: 20 2a 2a 70 70 50 72 65 53 74 6d 74 20 20 20 20   **ppPreStmt    
88a0: 20 2f 2a 20 4f 55 54 3a 20 4f 62 6a 65 63 74 20   /* OUT: Object 
88b0: 75 73 65 64 20 74 6f 20 63 61 63 68 65 20 73 74  used to cache st
88c0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  atement */.){.  
88d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
88e0: 20 3d 20 7a 49 6e 3b 20 20 20 20 20 20 20 20 20   = zIn;         
88f0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 66 69  /* Pointer to fi
8900: 72 73 74 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  rst SQL statemen
8910: 74 20 69 6e 20 7a 49 6e 20 2a 2f 0a 20 20 73 71  t in zIn */.  sq
8920: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
8930: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  t = 0;        /*
8940: 20 50 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   Prepared statem
8950: 65 6e 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ent object */.  
8960: 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20  SqlPreparedStmt 
8970: 2a 70 50 72 65 53 74 6d 74 3b 20 20 20 20 20 20  *pPreStmt;      
8980: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 61  /* Pointer to ca
8990: 63 68 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a  ched statement *
89a0: 2f 0a 20 20 69 6e 74 20 6e 53 71 6c 3b 20 20 20  /.  int nSql;   
89b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
89c0: 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66      /* Length of
89d0: 20 7a 53 71 6c 20 69 6e 20 62 79 74 65 73 20 2a   zSql in bytes *
89e0: 2f 0a 20 20 69 6e 74 20 6e 56 61 72 20 3d 20 30  /.  int nVar = 0
89f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8a00: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8a10: 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20 73 74   variables in st
8a20: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
8a30: 20 69 50 61 72 6d 20 3d 20 30 3b 20 20 20 20 20   iParm = 0;     
8a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8a50: 4e 65 78 74 20 66 72 65 65 20 65 6e 74 72 79 20  Next free entry 
8a60: 69 6e 20 61 70 50 61 72 6d 20 2a 2f 0a 20 20 63  in apParm */.  c
8a70: 68 61 72 20 63 3b 0a 20 20 69 6e 74 20 69 3b 0a  har c;.  int i;.
8a80: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
8a90: 74 65 72 70 20 3d 20 70 44 62 2d 3e 69 6e 74 65  terp = pDb->inte
8aa0: 72 70 3b 0a 0a 20 20 2a 70 70 50 72 65 53 74 6d  rp;..  *ppPreStm
8ab0: 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 72 69  t = 0;..  /* Tri
8ac0: 6d 20 73 70 61 63 65 73 20 66 72 6f 6d 20 74 68  m spaces from th
8ad0: 65 20 73 74 61 72 74 20 6f 66 20 7a 53 71 6c 20  e start of zSql 
8ae0: 61 6e 64 20 63 61 6c 63 75 6c 61 74 65 20 74 68  and calculate th
8af0: 65 20 72 65 6d 61 69 6e 69 6e 67 20 6c 65 6e 67  e remaining leng
8b00: 74 68 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  th. */.  while( 
8b10: 28 63 20 3d 20 7a 53 71 6c 5b 30 5d 29 3d 3d 27  (c = zSql[0])=='
8b20: 20 27 20 7c 7c 20 63 3d 3d 27 5c 74 27 20 7c 7c   ' || c=='\t' ||
8b30: 20 63 3d 3d 27 5c 72 27 20 7c 7c 20 63 3d 3d 27   c=='\r' || c=='
8b40: 5c 6e 27 20 29 7b 20 7a 53 71 6c 2b 2b 3b 20 7d  \n' ){ zSql++; }
8b50: 0a 20 20 6e 53 71 6c 20 3d 20 73 74 72 6c 65 6e  .  nSql = strlen
8b60: 33 30 28 7a 53 71 6c 29 3b 0a 0a 20 20 66 6f 72  30(zSql);..  for
8b70: 28 70 50 72 65 53 74 6d 74 20 3d 20 70 44 62 2d  (pPreStmt = pDb-
8b80: 3e 73 74 6d 74 4c 69 73 74 3b 20 70 50 72 65 53  >stmtList; pPreS
8b90: 74 6d 74 3b 20 70 50 72 65 53 74 6d 74 3d 70 50  tmt; pPreStmt=pP
8ba0: 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 29 7b 0a  reStmt->pNext){.
8bb0: 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 50 72 65      int n = pPre
8bc0: 53 74 6d 74 2d 3e 6e 53 71 6c 3b 0a 20 20 20 20  Stmt->nSql;.    
8bd0: 69 66 28 20 6e 53 71 6c 3e 3d 6e 20 0a 20 20 20  if( nSql>=n .   
8be0: 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70       && memcmp(p
8bf0: 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 2c 20 7a  PreStmt->zSql, z
8c00: 53 71 6c 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 20  Sql, n)==0.     
8c10: 20 20 20 26 26 20 28 7a 53 71 6c 5b 6e 5d 3d 3d     && (zSql[n]==
8c20: 30 20 7c 7c 20 7a 53 71 6c 5b 6e 2d 31 5d 3d 3d  0 || zSql[n-1]==
8c30: 27 3b 27 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  ';').    ){.    
8c40: 20 20 70 53 74 6d 74 20 3d 20 70 50 72 65 53 74    pStmt = pPreSt
8c50: 6d 74 2d 3e 70 53 74 6d 74 3b 0a 20 20 20 20 20  mt->pStmt;.     
8c60: 20 2a 70 7a 4f 75 74 20 3d 20 26 7a 53 71 6c 5b   *pzOut = &zSql[
8c70: 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 5d 3b  pPreStmt->nSql];
8c80: 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 6e 20  ..      /* When 
8c90: 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
8ca0: 6d 65 6e 74 20 69 73 20 66 6f 75 6e 64 2c 20 75  ment is found, u
8cb0: 6e 6c 69 6e 6b 20 69 74 20 66 72 6f 6d 20 74 68  nlink it from th
8cc0: 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 63 68 65  e.      ** cache
8cd0: 20 6c 69 73 74 2e 20 20 49 74 20 77 69 6c 6c 20   list.  It will 
8ce0: 6c 61 74 65 72 20 62 65 20 61 64 64 65 64 20 62  later be added b
8cf0: 61 63 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e  ack to the begin
8d00: 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 6f 66  ning.      ** of
8d10: 20 74 68 65 20 63 61 63 68 65 20 6c 69 73 74 20   the cache list 
8d20: 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6d 70 6c  in order to impl
8d30: 65 6d 65 6e 74 20 4c 52 55 20 72 65 70 6c 61 63  ement LRU replac
8d40: 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  ement..      */.
8d50: 20 20 20 20 20 20 69 66 28 20 70 50 72 65 53 74        if( pPreSt
8d60: 6d 74 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20  mt->pPrev ){.   
8d70: 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 70       pPreStmt->p
8d80: 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 50  Prev->pNext = pP
8d90: 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 3b 0a 20  reStmt->pNext;. 
8da0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8db0: 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73      pDb->stmtLis
8dc0: 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e  t = pPreStmt->pN
8dd0: 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
8de0: 20 20 20 69 66 28 20 70 50 72 65 53 74 6d 74 2d     if( pPreStmt-
8df0: 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  >pNext ){.      
8e00: 20 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78    pPreStmt->pNex
8e10: 74 2d 3e 70 50 72 65 76 20 3d 20 70 50 72 65 53  t->pPrev = pPreS
8e20: 74 6d 74 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20  tmt->pPrev;.    
8e30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8e40: 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d   pDb->stmtLast =
8e50: 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76   pPreStmt->pPrev
8e60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8e70: 70 44 62 2d 3e 6e 53 74 6d 74 2d 2d 3b 0a 20 20  pDb->nStmt--;.  
8e80: 20 20 20 20 6e 56 61 72 20 3d 20 73 71 6c 69 74      nVar = sqlit
8e90: 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
8ea0: 72 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a  r_count(pStmt);.
8eb0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8ec0: 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49   }.  }.  .  /* I
8ed0: 66 20 6e 6f 20 70 72 65 70 61 72 65 64 20 73 74  f no prepared st
8ee0: 61 74 65 6d 65 6e 74 20 77 61 73 20 66 6f 75 6e  atement was foun
8ef0: 64 2e 20 43 6f 6d 70 69 6c 65 20 74 68 65 20 53  d. Compile the S
8f00: 51 4c 20 74 65 78 74 2e 20 41 6c 73 6f 20 61 6c  QL text. Also al
8f10: 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 61 20 6e 65  locate.  ** a ne
8f20: 77 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d  w SqlPreparedStm
8f30: 74 20 73 74 72 75 63 74 75 72 65 2e 20 20 2a 2f  t structure.  */
8f40: 0a 20 20 69 66 28 20 70 50 72 65 53 74 6d 74 3d  .  if( pPreStmt=
8f50: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42  =0 ){.    int nB
8f60: 79 74 65 3b 0a 0a 20 20 20 20 69 66 28 20 53 51  yte;..    if( SQ
8f70: 4c 49 54 45 5f 4f 4b 21 3d 64 62 50 72 65 70 61  LITE_OK!=dbPrepa
8f80: 72 65 28 70 44 62 2c 20 7a 53 71 6c 2c 20 26 70  re(pDb, zSql, &p
8f90: 53 74 6d 74 2c 20 70 7a 4f 75 74 29 20 29 7b 0a  Stmt, pzOut) ){.
8fa0: 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a        Tcl_SetObj
8fb0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
8fc0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
8fd0: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
8fe0: 44 62 2d 3e 64 62 29 2c 20 2d 31 29 29 3b 0a 20  Db->db), -1));. 
8ff0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
9000: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
9010: 20 69 66 28 20 70 53 74 6d 74 3d 3d 30 20 29 7b   if( pStmt==0 ){
9020: 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
9030: 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 65 72  E_OK!=sqlite3_er
9040: 72 63 6f 64 65 28 70 44 62 2d 3e 64 62 29 20 29  rcode(pDb->db) )
9050: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63  {.        /* A c
9060: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 65 72 72 6f  ompile-time erro
9070: 72 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  r in the stateme
9080: 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 54  nt. */.        T
9090: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
90a0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53  interp, Tcl_NewS
90b0: 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33  tringObj(sqlite3
90c0: 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29  _errmsg(pDb->db)
90d0: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20  , -1));.        
90e0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
90f0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
9100: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 74         /* The st
9110: 61 74 65 6d 65 6e 74 20 77 61 73 20 61 20 6e 6f  atement was a no
9120: 2d 6f 70 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74  -op.  Continue t
9130: 6f 20 74 68 65 20 6e 65 78 74 20 73 74 61 74 65  o the next state
9140: 6d 65 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  ment.        ** 
9150: 69 6e 20 74 68 65 20 53 51 4c 20 73 74 72 69 6e  in the SQL strin
9160: 67 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  g..        */.  
9170: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
9180: 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
9190: 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20   }..    assert( 
91a0: 70 50 72 65 53 74 6d 74 3d 3d 30 20 29 3b 0a 20  pPreStmt==0 );. 
91b0: 20 20 20 6e 56 61 72 20 3d 20 73 71 6c 69 74 65     nVar = sqlite
91c0: 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
91d0: 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20  _count(pStmt);. 
91e0: 20 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f     nByte = sizeo
91f0: 66 28 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d  f(SqlPreparedStm
9200: 74 29 20 2b 20 6e 56 61 72 2a 73 69 7a 65 6f 66  t) + nVar*sizeof
9210: 28 54 63 6c 5f 4f 62 6a 20 2a 29 3b 0a 20 20 20  (Tcl_Obj *);.   
9220: 20 70 50 72 65 53 74 6d 74 20 3d 20 28 53 71 6c   pPreStmt = (Sql
9230: 50 72 65 70 61 72 65 64 53 74 6d 74 2a 29 54 63  PreparedStmt*)Tc
9240: 6c 5f 41 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a  l_Alloc(nByte);.
9250: 20 20 20 20 6d 65 6d 73 65 74 28 70 50 72 65 53      memset(pPreS
9260: 74 6d 74 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a  tmt, 0, nByte);.
9270: 0a 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 70  .    pPreStmt->p
9280: 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20 20  Stmt = pStmt;.  
9290: 20 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c    pPreStmt->nSql
92a0: 20 3d 20 28 69 6e 74 29 28 2a 70 7a 4f 75 74 20   = (int)(*pzOut 
92b0: 2d 20 7a 53 71 6c 29 3b 0a 20 20 20 20 70 50 72  - zSql);.    pPr
92c0: 65 53 74 6d 74 2d 3e 7a 53 71 6c 20 3d 20 73 71  eStmt->zSql = sq
92d0: 6c 69 74 65 33 5f 73 71 6c 28 70 53 74 6d 74 29  lite3_sql(pStmt)
92e0: 3b 0a 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e  ;.    pPreStmt->
92f0: 61 70 50 61 72 6d 20 3d 20 28 54 63 6c 5f 4f 62  apParm = (Tcl_Ob
9300: 6a 20 2a 2a 29 26 70 50 72 65 53 74 6d 74 5b 31  j **)&pPreStmt[1
9310: 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ];.#ifdef SQLITE
9320: 5f 54 45 53 54 0a 20 20 20 20 69 66 28 20 70 50  _TEST.    if( pP
9330: 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 3d 3d 30 20  reStmt->zSql==0 
9340: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
9350: 43 6f 70 79 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63  Copy = Tcl_Alloc
9360: 28 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 20  (pPreStmt->nSql 
9370: 2b 20 31 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  + 1);.      memc
9380: 70 79 28 7a 43 6f 70 79 2c 20 7a 53 71 6c 2c 20  py(zCopy, zSql, 
9390: 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 29 3b  pPreStmt->nSql);
93a0: 0a 20 20 20 20 20 20 7a 43 6f 70 79 5b 70 50 72  .      zCopy[pPr
93b0: 65 53 74 6d 74 2d 3e 6e 53 71 6c 5d 20 3d 20 27  eStmt->nSql] = '
93c0: 5c 30 27 3b 0a 20 20 20 20 20 20 70 50 72 65 53  \0';.      pPreS
93d0: 74 6d 74 2d 3e 7a 53 71 6c 20 3d 20 7a 43 6f 70  tmt->zSql = zCop
93e0: 79 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  y;.    }.#endif.
93f0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
9400: 72 65 53 74 6d 74 20 29 3b 0a 20 20 61 73 73 65  reStmt );.  asse
9410: 72 74 28 20 73 74 72 6c 65 6e 33 30 28 70 50 72  rt( strlen30(pPr
9420: 65 53 74 6d 74 2d 3e 7a 53 71 6c 29 3d 3d 70 50  eStmt->zSql)==pP
9430: 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 20 29 3b 0a  reStmt->nSql );.
9440: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 6d 65 6d    assert( 0==mem
9450: 63 6d 70 28 70 50 72 65 53 74 6d 74 2d 3e 7a 53  cmp(pPreStmt->zS
9460: 71 6c 2c 20 7a 53 71 6c 2c 20 70 50 72 65 53 74  ql, zSql, pPreSt
9470: 6d 74 2d 3e 6e 53 71 6c 29 20 29 3b 0a 0a 20 20  mt->nSql) );..  
9480: 2f 2a 20 42 69 6e 64 20 76 61 6c 75 65 73 20 74  /* Bind values t
9490: 6f 20 70 61 72 61 6d 65 74 65 72 73 20 74 68 61  o parameters tha
94a0: 74 20 62 65 67 69 6e 20 77 69 74 68 20 24 20 6f  t begin with $ o
94b0: 72 20 3a 20 2a 2f 20 20 0a 20 20 66 6f 72 28 69  r : */  .  for(i
94c0: 3d 31 3b 20 69 3c 3d 6e 56 61 72 3b 20 69 2b 2b  =1; i<=nVar; i++
94d0: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
94e0: 72 20 2a 7a 56 61 72 20 3d 20 73 71 6c 69 74 65  r *zVar = sqlite
94f0: 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
9500: 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 20 69 29 3b  _name(pStmt, i);
9510: 0a 20 20 20 20 69 66 28 20 7a 56 61 72 21 3d 30  .    if( zVar!=0
9520: 20 26 26 20 28 7a 56 61 72 5b 30 5d 3d 3d 27 24   && (zVar[0]=='$
9530: 27 20 7c 7c 20 7a 56 61 72 5b 30 5d 3d 3d 27 3a  ' || zVar[0]==':
9540: 27 20 7c 7c 20 7a 56 61 72 5b 30 5d 3d 3d 27 40  ' || zVar[0]=='@
9550: 27 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  ') ){.      Tcl_
9560: 4f 62 6a 20 2a 70 56 61 72 20 3d 20 54 63 6c 5f  Obj *pVar = Tcl_
9570: 47 65 74 56 61 72 32 45 78 28 69 6e 74 65 72 70  GetVar2Ex(interp
9580: 2c 20 26 7a 56 61 72 5b 31 5d 2c 20 30 2c 20 30  , &zVar[1], 0, 0
9590: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 56 61  );.      if( pVa
95a0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  r ){.        int
95b0: 20 6e 3b 0a 20 20 20 20 20 20 20 20 75 38 20 2a   n;.        u8 *
95c0: 64 61 74 61 3b 0a 20 20 20 20 20 20 20 20 63 6f  data;.        co
95d0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20  nst char *zType 
95e0: 3d 20 28 70 56 61 72 2d 3e 74 79 70 65 50 74 72  = (pVar->typePtr
95f0: 20 3f 20 70 56 61 72 2d 3e 74 79 70 65 50 74 72   ? pVar->typePtr
9600: 2d 3e 6e 61 6d 65 20 3a 20 22 22 29 3b 0a 20 20  ->name : "");.  
9610: 20 20 20 20 20 20 63 68 61 72 20 63 20 3d 20 7a        char c = z
9620: 54 79 70 65 5b 30 5d 3b 0a 20 20 20 20 20 20 20  Type[0];.       
9630: 20 69 66 28 20 7a 56 61 72 5b 30 5d 3d 3d 27 40   if( zVar[0]=='@
9640: 27 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  ' ||.           
9650: 28 63 3d 3d 27 62 27 20 26 26 20 73 74 72 63 6d  (c=='b' && strcm
9660: 70 28 7a 54 79 70 65 2c 22 62 79 74 65 61 72 72  p(zType,"bytearr
9670: 61 79 22 29 3d 3d 30 20 26 26 20 70 56 61 72 2d  ay")==0 && pVar-
9680: 3e 62 79 74 65 73 3d 3d 30 29 20 29 7b 0a 20 20  >bytes==0) ){.  
9690: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 61 64 20          /* Load 
96a0: 61 20 42 4c 4f 42 20 74 79 70 65 20 69 66 20 74  a BLOB type if t
96b0: 68 65 20 54 63 6c 20 76 61 72 69 61 62 6c 65 20  he Tcl variable 
96c0: 69 73 20 61 20 62 79 74 65 61 72 72 61 79 20 61  is a bytearray a
96d0: 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nd.          ** 
96e0: 69 74 20 68 61 73 20 6e 6f 20 73 74 72 69 6e 67  it has no string
96f0: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
9700: 6f 72 20 74 68 65 20 68 6f 73 74 0a 20 20 20 20  or the host.    
9710: 20 20 20 20 20 20 2a 2a 20 70 61 72 61 6d 65 74        ** paramet
9720: 65 72 20 6e 61 6d 65 20 62 65 67 69 6e 73 20 77  er name begins w
9730: 69 74 68 20 22 40 22 2e 20 2a 2f 0a 20 20 20 20  ith "@". */.    
9740: 20 20 20 20 20 20 64 61 74 61 20 3d 20 54 63 6c        data = Tcl
9750: 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f  _GetByteArrayFro
9760: 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a  mObj(pVar, &n);.
9770: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
9780: 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d  3_bind_blob(pStm
9790: 74 2c 20 69 2c 20 64 61 74 61 2c 20 6e 2c 20 53  t, i, data, n, S
97a0: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
97b0: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63           Tcl_Inc
97c0: 72 52 65 66 43 6f 75 6e 74 28 70 56 61 72 29 3b  rRefCount(pVar);
97d0: 0a 20 20 20 20 20 20 20 20 20 20 70 50 72 65 53  .          pPreS
97e0: 74 6d 74 2d 3e 61 70 50 61 72 6d 5b 69 50 61 72  tmt->apParm[iPar
97f0: 6d 2b 2b 5d 20 3d 20 70 56 61 72 3b 0a 20 20 20  m++] = pVar;.   
9800: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
9810: 3d 3d 27 62 27 20 26 26 20 73 74 72 63 6d 70 28  =='b' && strcmp(
9820: 7a 54 79 70 65 2c 22 62 6f 6f 6c 65 61 6e 22 29  zType,"boolean")
9830: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
9840: 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
9850: 62 6a 28 69 6e 74 65 72 70 2c 20 70 56 61 72 2c  bj(interp, pVar,
9860: 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20   &n);.          
9870: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
9880: 28 70 53 74 6d 74 2c 20 69 2c 20 6e 29 3b 0a 20  (pStmt, i, n);. 
9890: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
98a0: 20 63 3d 3d 27 64 27 20 26 26 20 73 74 72 63 6d   c=='d' && strcm
98b0: 70 28 7a 54 79 70 65 2c 22 64 6f 75 62 6c 65 22  p(zType,"double"
98c0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
98d0: 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20    double r;.    
98e0: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 44 6f 75        Tcl_GetDou
98f0: 62 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  bleFromObj(inter
9900: 70 2c 20 70 56 61 72 2c 20 26 72 29 3b 0a 20 20  p, pVar, &r);.  
9910: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
9920: 62 69 6e 64 5f 64 6f 75 62 6c 65 28 70 53 74 6d  bind_double(pStm
9930: 74 2c 20 69 2c 20 72 29 3b 0a 20 20 20 20 20 20  t, i, r);.      
9940: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 63 3d 3d    }else if( (c==
9950: 27 77 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54  'w' && strcmp(zT
9960: 79 70 65 2c 22 77 69 64 65 49 6e 74 22 29 3d 3d  ype,"wideInt")==
9970: 30 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  0) ||.          
9980: 20 20 20 20 28 63 3d 3d 27 69 27 20 26 26 20 73      (c=='i' && s
9990: 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 69 6e 74  trcmp(zType,"int
99a0: 22 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  ")==0) ){.      
99b0: 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20      Tcl_WideInt 
99c0: 76 3b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  v;.          Tcl
99d0: 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f  _GetWideIntFromO
99e0: 62 6a 28 69 6e 74 65 72 70 2c 20 70 56 61 72 2c  bj(interp, pVar,
99f0: 20 26 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20   &v);.          
9a00: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
9a10: 36 34 28 70 53 74 6d 74 2c 20 69 2c 20 76 29 3b  64(pStmt, i, v);
9a20: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
9a30: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 20 3d            data =
9a40: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
9a50: 2a 29 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  *)Tcl_GetStringF
9a60: 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29  romObj(pVar, &n)
9a70: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
9a80: 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53  te3_bind_text(pS
9a90: 74 6d 74 2c 20 69 2c 20 28 63 68 61 72 20 2a 29  tmt, i, (char *)
9aa0: 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f  data, n, SQLITE_
9ab0: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20  STATIC);.       
9ac0: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
9ad0: 75 6e 74 28 70 56 61 72 29 3b 0a 20 20 20 20 20  unt(pVar);.     
9ae0: 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 61       pPreStmt->a
9af0: 70 50 61 72 6d 5b 69 50 61 72 6d 2b 2b 5d 20 3d  pParm[iParm++] =
9b00: 20 70 56 61 72 3b 0a 20 20 20 20 20 20 20 20 7d   pVar;.        }
9b10: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
9b20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
9b30: 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 69  nd_null(pStmt, i
9b40: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
9b50: 0a 20 20 7d 0a 20 20 70 50 72 65 53 74 6d 74 2d  .  }.  pPreStmt-
9b60: 3e 6e 50 61 72 6d 20 3d 20 69 50 61 72 6d 3b 0a  >nParm = iParm;.
9b70: 20 20 2a 70 70 50 72 65 53 74 6d 74 20 3d 20 70    *ppPreStmt = p
9b80: 50 72 65 53 74 6d 74 3b 0a 0a 20 20 72 65 74 75  PreStmt;..  retu
9b90: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
9ba0: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 73 74  .** Release a st
9bb0: 61 74 65 6d 65 6e 74 20 72 65 66 65 72 65 6e 63  atement referenc
9bc0: 65 20 6f 62 74 61 69 6e 65 64 20 62 79 20 63 61  e obtained by ca
9bd0: 6c 6c 69 6e 67 20 64 62 50 72 65 70 61 72 65 41  lling dbPrepareA
9be0: 6e 64 42 69 6e 64 28 29 2e 0a 2a 2a 20 54 68 65  ndBind()..** The
9bf0: 72 65 20 73 68 6f 75 6c 64 20 62 65 20 65 78 61  re should be exa
9c00: 63 74 6c 79 20 6f 6e 65 20 63 61 6c 6c 20 74 6f  ctly one call to
9c10: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66   this function f
9c20: 6f 72 20 65 61 63 68 20 63 61 6c 6c 20 74 6f 0a  or each call to.
9c30: 2a 2a 20 64 62 50 72 65 70 61 72 65 41 6e 64 42  ** dbPrepareAndB
9c40: 69 6e 64 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ind()..**.** If 
9c50: 74 68 65 20 64 69 73 63 61 72 64 20 70 61 72 61  the discard para
9c60: 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72  meter is non-zer
9c70: 6f 2c 20 74 68 65 6e 20 74 68 65 20 73 74 61 74  o, then the stat
9c80: 65 6d 65 6e 74 20 69 73 20 64 65 6c 65 74 65 64  ement is deleted
9c90: 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  .** immediately.
9ca0: 20 4f 74 68 65 72 77 69 73 65 20 69 74 20 69 73   Otherwise it is
9cb0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52   added to the LR
9cc0: 55 20 6c 69 73 74 20 61 6e 64 20 6d 61 79 20 62  U list and may b
9cd0: 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 62 79  e returned.** by
9ce0: 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 63 61   a subsequent ca
9cf0: 6c 6c 20 74 6f 20 64 62 50 72 65 70 61 72 65 41  ll to dbPrepareA
9d00: 6e 64 42 69 6e 64 28 29 2e 0a 2a 2f 0a 73 74 61  ndBind()..*/.sta
9d10: 74 69 63 20 76 6f 69 64 20 64 62 52 65 6c 65 61  tic void dbRelea
9d20: 73 65 53 74 6d 74 28 0a 20 20 53 71 6c 69 74 65  seStmt(.  Sqlite
9d30: 44 62 20 2a 70 44 62 2c 20 20 20 20 20 20 20 20  Db *pDb,        
9d40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
9d50: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
9d60: 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d    SqlPreparedStm
9d70: 74 20 2a 70 50 72 65 53 74 6d 74 2c 20 20 20 20  t *pPreStmt,    
9d80: 20 20 2f 2a 20 50 72 65 70 61 72 65 64 20 73 74    /* Prepared st
9d90: 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 20 74  atement handle t
9da0: 6f 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69  o release */.  i
9db0: 6e 74 20 64 69 73 63 61 72 64 20 20 20 20 20 20  nt discard      
9dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9dd0: 2a 20 54 72 75 65 20 74 6f 20 64 65 6c 65 74 65  * True to delete
9de0: 20 28 6e 6f 74 20 63 61 63 68 65 29 20 74 68 65   (not cache) the
9df0: 20 70 50 72 65 53 74 6d 74 20 2a 2f 0a 29 7b 0a   pPreStmt */.){.
9e00: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 46    int i;..  /* F
9e10: 72 65 65 20 74 68 65 20 62 6f 75 6e 64 20 73 74  ree the bound st
9e20: 72 69 6e 67 20 61 6e 64 20 62 6c 6f 62 20 70 61  ring and blob pa
9e30: 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 66 6f  rameters */.  fo
9e40: 72 28 69 3d 30 3b 20 69 3c 70 50 72 65 53 74 6d  r(i=0; i<pPreStm
9e50: 74 2d 3e 6e 50 61 72 6d 3b 20 69 2b 2b 29 7b 0a  t->nParm; i++){.
9e60: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
9e70: 6f 75 6e 74 28 70 50 72 65 53 74 6d 74 2d 3e 61  ount(pPreStmt->a
9e80: 70 50 61 72 6d 5b 69 5d 29 3b 0a 20 20 7d 0a 20  pParm[i]);.  }. 
9e90: 20 70 50 72 65 53 74 6d 74 2d 3e 6e 50 61 72 6d   pPreStmt->nParm
9ea0: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 44 62   = 0;..  if( pDb
9eb0: 2d 3e 6d 61 78 53 74 6d 74 3c 3d 30 20 7c 7c 20  ->maxStmt<=0 || 
9ec0: 64 69 73 63 61 72 64 20 29 7b 0a 20 20 20 20 2f  discard ){.    /
9ed0: 2a 20 49 66 20 74 68 65 20 63 61 63 68 65 20 69  * If the cache i
9ee0: 73 20 74 75 72 6e 65 64 20 6f 66 66 2c 20 64 65  s turned off, de
9ef0: 61 6c 6c 6f 63 61 74 65 64 20 74 68 65 20 73 74  allocated the st
9f00: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 64  atement */.    d
9f10: 62 46 72 65 65 53 74 6d 74 28 70 50 72 65 53 74  bFreeStmt(pPreSt
9f20: 6d 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  mt);.  }else{.  
9f30: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 70 72 65    /* Add the pre
9f40: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
9f50: 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
9f60: 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 6c 69   of the cache li
9f70: 73 74 2e 20 2a 2f 0a 20 20 20 20 70 50 72 65 53  st. */.    pPreS
9f80: 74 6d 74 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62  tmt->pNext = pDb
9f90: 2d 3e 73 74 6d 74 4c 69 73 74 3b 0a 20 20 20 20  ->stmtList;.    
9fa0: 70 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 20  pPreStmt->pPrev 
9fb0: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 44 62  = 0;.    if( pDb
9fc0: 2d 3e 73 74 6d 74 4c 69 73 74 20 29 7b 0a 20 20  ->stmtList ){.  
9fd0: 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74     pDb->stmtList
9fe0: 2d 3e 70 50 72 65 76 20 3d 20 70 50 72 65 53 74  ->pPrev = pPreSt
9ff0: 6d 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44  mt;.    }.    pD
a000: 62 2d 3e 73 74 6d 74 4c 69 73 74 20 3d 20 70 50  b->stmtList = pP
a010: 72 65 53 74 6d 74 3b 0a 20 20 20 20 69 66 28 20  reStmt;.    if( 
a020: 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 3d 3d 30  pDb->stmtLast==0
a030: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
a040: 28 20 70 44 62 2d 3e 6e 53 74 6d 74 3d 3d 30 20  ( pDb->nStmt==0 
a050: 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 73 74  );.      pDb->st
a060: 6d 74 4c 61 73 74 20 3d 20 70 50 72 65 53 74 6d  mtLast = pPreStm
a070: 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
a080: 20 20 20 20 61 73 73 65 72 74 28 20 70 44 62 2d      assert( pDb-
a090: 3e 6e 53 74 6d 74 3e 30 20 29 3b 0a 20 20 20 20  >nStmt>0 );.    
a0a0: 7d 0a 20 20 20 20 70 44 62 2d 3e 6e 53 74 6d 74  }.    pDb->nStmt
a0b0: 2b 2b 3b 0a 20 20 20 0a 20 20 20 20 2f 2a 20 49  ++;.   .    /* I
a0c0: 66 20 77 65 20 68 61 76 65 20 74 6f 6f 20 6d 61  f we have too ma
a0d0: 6e 79 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  ny statement in 
a0e0: 63 61 63 68 65 2c 20 72 65 6d 6f 76 65 20 74 68  cache, remove th
a0f0: 65 20 73 75 72 70 6c 75 73 20 66 72 6f 6d 20 0a  e surplus from .
a100: 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 64 20 6f      ** the end o
a110: 66 20 74 68 65 20 63 61 63 68 65 20 6c 69 73 74  f the cache list
a120: 2e 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28  .  */.    while(
a130: 20 70 44 62 2d 3e 6e 53 74 6d 74 3e 70 44 62 2d   pDb->nStmt>pDb-
a140: 3e 6d 61 78 53 74 6d 74 20 29 7b 0a 20 20 20 20  >maxStmt ){.    
a150: 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d    SqlPreparedStm
a160: 74 20 2a 70 4c 61 73 74 20 3d 20 70 44 62 2d 3e  t *pLast = pDb->
a170: 73 74 6d 74 4c 61 73 74 3b 0a 20 20 20 20 20 20  stmtLast;.      
a180: 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20  pDb->stmtLast = 
a190: 70 4c 61 73 74 2d 3e 70 50 72 65 76 3b 0a 20 20  pLast->pPrev;.  
a1a0: 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73      pDb->stmtLas
a1b0: 74 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  t->pNext = 0;.  
a1c0: 20 20 20 20 70 44 62 2d 3e 6e 53 74 6d 74 2d 2d      pDb->nStmt--
a1d0: 3b 0a 20 20 20 20 20 20 64 62 46 72 65 65 53 74  ;.      dbFreeSt
a1e0: 6d 74 28 70 4c 61 73 74 29 3b 0a 20 20 20 20 7d  mt(pLast);.    }
a1f0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74  .  }.}../*.** St
a200: 72 75 63 74 75 72 65 20 75 73 65 64 20 77 69 74  ructure used wit
a210: 68 20 64 62 45 76 61 6c 58 58 58 28 29 20 66 75  h dbEvalXXX() fu
a220: 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20  nctions:.**.**  
a230: 20 64 62 45 76 61 6c 49 6e 69 74 28 29 0a 2a 2a   dbEvalInit().**
a240: 20 20 20 64 62 45 76 61 6c 53 74 65 70 28 29 0a     dbEvalStep().
a250: 2a 2a 20 20 20 64 62 45 76 61 6c 46 69 6e 61 6c  **   dbEvalFinal
a260: 69 7a 65 28 29 0a 2a 2a 20 20 20 64 62 45 76 61  ize().**   dbEva
a270: 6c 52 6f 77 49 6e 66 6f 28 29 0a 2a 2a 20 20 20  lRowInfo().**   
a280: 64 62 45 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75  dbEvalColumnValu
a290: 65 28 29 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  e().*/.typedef s
a2a0: 74 72 75 63 74 20 44 62 45 76 61 6c 43 6f 6e 74  truct DbEvalCont
a2b0: 65 78 74 20 44 62 45 76 61 6c 43 6f 6e 74 65 78  ext DbEvalContex
a2c0: 74 3b 0a 73 74 72 75 63 74 20 44 62 45 76 61 6c  t;.struct DbEval
a2d0: 43 6f 6e 74 65 78 74 20 7b 0a 20 20 53 71 6c 69  Context {.  Sqli
a2e0: 74 65 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20  teDb *pDb;      
a2f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
a300: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
a310: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 71  /.  Tcl_Obj *pSq
a320: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
a330: 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 68 6f      /* Object ho
a340: 6c 64 69 6e 67 20 73 74 72 69 6e 67 20 7a 53 71  lding string zSq
a350: 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  l */.  const cha
a360: 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20 20  r *zSql;        
a370: 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 61 69 6e         /* Remain
a380: 69 6e 67 20 53 51 4c 20 74 6f 20 65 78 65 63 75  ing SQL to execu
a390: 74 65 20 2a 2f 0a 20 20 53 71 6c 50 72 65 70 61  te */.  SqlPrepa
a3a0: 72 65 64 53 74 6d 74 20 2a 70 50 72 65 53 74 6d  redStmt *pPreStm
a3b0: 74 3b 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65  t;      /* Curre
a3c0: 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  nt statement */.
a3d0: 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20    int nCol;     
a3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3f0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
a400: 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20  olumns returned 
a410: 62 79 20 70 53 74 6d 74 20 2a 2f 0a 20 20 54 63  by pStmt */.  Tc
a420: 6c 5f 4f 62 6a 20 2a 70 41 72 72 61 79 3b 20 20  l_Obj *pArray;  
a430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a440: 20 4e 61 6d 65 20 6f 66 20 61 72 72 61 79 20 76   Name of array v
a450: 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 54 63 6c  ariable */.  Tcl
a460: 5f 4f 62 6a 20 2a 2a 61 70 43 6f 6c 4e 61 6d 65  _Obj **apColName
a470: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
a480: 41 72 72 61 79 20 6f 66 20 63 6f 6c 75 6d 6e 20  Array of column 
a490: 6e 61 6d 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  names */.};../*.
a4a0: 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e 79 20 63  ** Release any c
a4b0: 61 63 68 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e  ache of column n
a4c0: 61 6d 65 73 20 63 75 72 72 65 6e 74 6c 79 20 68  ames currently h
a4d0: 65 6c 64 20 61 73 20 70 61 72 74 20 6f 66 0a 2a  eld as part of.*
a4e0: 2a 20 74 68 65 20 44 62 45 76 61 6c 43 6f 6e 74  * the DbEvalCont
a4f0: 65 78 74 20 73 74 72 75 63 74 75 72 65 20 70 61  ext structure pa
a500: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
a510: 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  t argument..*/.s
a520: 74 61 74 69 63 20 76 6f 69 64 20 64 62 52 65 6c  tatic void dbRel
a530: 65 61 73 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  easeColumnNames(
a540: 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 70  DbEvalContext *p
a550: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 6f  ){.  if( p->apCo
a560: 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 69 6e 74  lName ){.    int
a570: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
a580: 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29   i<p->nCol; i++)
a590: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72  {.      Tcl_Decr
a5a0: 52 65 66 43 6f 75 6e 74 28 70 2d 3e 61 70 43 6f  RefCount(p->apCo
a5b0: 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20 20 7d  lName[i]);.    }
a5c0: 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63  .    Tcl_Free((c
a5d0: 68 61 72 20 2a 29 70 2d 3e 61 70 43 6f 6c 4e 61  har *)p->apColNa
a5e0: 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 61 70 43 6f  me);.    p->apCo
a5f0: 6c 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  lName = 0;.  }. 
a600: 20 70 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 7d 0a   p->nCol = 0;.}.
a610: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
a620: 65 20 61 20 44 62 45 76 61 6c 43 6f 6e 74 65 78  e a DbEvalContex
a630: 74 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a  t structure..**.
a640: 2a 2a 20 49 66 20 70 41 72 72 61 79 20 69 73 20  ** If pArray is 
a650: 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69  not NULL, then i
a660: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e  t contains the n
a670: 61 6d 65 20 6f 66 20 61 20 54 63 6c 20 61 72 72  ame of a Tcl arr
a680: 61 79 0a 2a 2a 20 76 61 72 69 61 62 6c 65 2e 20  ay.** variable. 
a690: 54 68 65 20 22 2a 22 20 6d 65 6d 62 65 72 20 6f  The "*" member o
a6a0: 66 20 74 68 69 73 20 61 72 72 61 79 20 69 73 20  f this array is 
a6b0: 73 65 74 20 74 6f 20 61 20 6c 69 73 74 20 63 6f  set to a list co
a6c0: 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 74 68 65 20  ntaining.** the 
a6d0: 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f 6c  names of the col
a6e0: 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79  umns returned by
a6f0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 61   the statement a
a700: 73 20 70 61 72 74 20 6f 66 20 65 61 63 68 0a 2a  s part of each.*
a710: 2a 20 63 61 6c 6c 20 74 6f 20 64 62 45 76 61 6c  * call to dbEval
a720: 53 74 65 70 28 29 2c 20 69 6e 20 6f 72 64 65 72  Step(), in order
a730: 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69   from left to ri
a740: 67 68 74 2e 20 65 2e 67 2e 20 69 66 20 74 68 65  ght. e.g. if the
a750: 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 74 68   names .** of th
a760: 65 20 72 65 74 75 72 6e 65 64 20 63 6f 6c 75 6d  e returned colum
a770: 6e 73 20 61 72 65 20 61 2c 20 62 20 61 6e 64 20  ns are a, b and 
a780: 63 2c 20 69 74 20 64 6f 65 73 20 74 68 65 20 65  c, it does the e
a790: 71 75 69 76 61 6c 65 6e 74 20 6f 66 20 74 68 65  quivalent of the
a7a0: 20 0a 2a 2a 20 74 63 6c 20 63 6f 6d 6d 61 6e 64   .** tcl command
a7b0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 65 74 20  :.**.**     set 
a7c0: 24 7b 70 41 72 72 61 79 7d 28 2a 29 20 7b 61 20  ${pArray}(*) {a 
a7d0: 62 20 63 7d 0a 2a 2f 0a 73 74 61 74 69 63 20 76  b c}.*/.static v
a7e0: 6f 69 64 20 64 62 45 76 61 6c 49 6e 69 74 28 0a  oid dbEvalInit(.
a7f0: 20 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20    DbEvalContext 
a800: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
a810: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
a820: 73 74 72 75 63 74 75 72 65 20 74 6f 20 69 6e 69  structure to ini
a830: 74 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 53 71 6c  tialize */.  Sql
a840: 69 74 65 44 62 20 2a 70 44 62 2c 20 20 20 20 20  iteDb *pDb,     
a850: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a860: 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  Database handle 
a870: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53  */.  Tcl_Obj *pS
a880: 71 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ql,             
a890: 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 63       /* Object c
a8a0: 6f 6e 74 61 69 6e 69 6e 67 20 53 51 4c 20 73 63  ontaining SQL sc
a8b0: 72 69 70 74 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ript */.  Tcl_Ob
a8c0: 6a 20 2a 70 41 72 72 61 79 20 20 20 20 20 20 20  j *pArray       
a8d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
a8e0: 65 20 6f 66 20 54 63 6c 20 61 72 72 61 79 20 74  e of Tcl array t
a8f0: 6f 20 73 65 74 20 28 2a 29 20 65 6c 65 6d 65 6e  o set (*) elemen
a900: 74 20 6f 66 20 2a 2f 0a 29 7b 0a 20 20 6d 65 6d  t of */.){.  mem
a910: 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66  set(p, 0, sizeof
a920: 28 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 29 29  (DbEvalContext))
a930: 3b 0a 20 20 70 2d 3e 70 44 62 20 3d 20 70 44 62  ;.  p->pDb = pDb
a940: 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20 3d 20 54 63  ;.  p->zSql = Tc
a950: 6c 5f 47 65 74 53 74 72 69 6e 67 28 70 53 71 6c  l_GetString(pSql
a960: 29 3b 0a 20 20 70 2d 3e 70 53 71 6c 20 3d 20 70  );.  p->pSql = p
a970: 53 71 6c 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52  Sql;.  Tcl_IncrR
a980: 65 66 43 6f 75 6e 74 28 70 53 71 6c 29 3b 0a 20  efCount(pSql);. 
a990: 20 69 66 28 20 70 41 72 72 61 79 20 29 7b 0a 20   if( pArray ){. 
a9a0: 20 20 20 70 2d 3e 70 41 72 72 61 79 20 3d 20 70     p->pArray = p
a9b0: 41 72 72 61 79 3b 0a 20 20 20 20 54 63 6c 5f 49  Array;.    Tcl_I
a9c0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 41 72 72  ncrRefCount(pArr
a9d0: 61 79 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ay);.  }.}../*.*
a9e0: 2a 20 4f 62 74 61 69 6e 20 69 6e 66 6f 72 6d 61  * Obtain informa
a9f0: 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 72  tion about the r
aa00: 6f 77 20 74 68 61 74 20 74 68 65 20 44 62 45 76  ow that the DbEv
aa10: 61 6c 43 6f 6e 74 65 78 74 20 70 61 73 73 65 64  alContext passed
aa20: 20 61 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74   as the.** first
aa30: 20 61 72 67 75 6d 65 6e 74 20 63 75 72 72 65 6e   argument curren
aa40: 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a  tly points to..*
aa50: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 62  /.static void db
aa60: 45 76 61 6c 52 6f 77 49 6e 66 6f 28 0a 20 20 44  EvalRowInfo(.  D
aa70: 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 70 2c  bEvalContext *p,
aa80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
aa90: 2a 20 45 76 61 6c 75 61 74 69 6f 6e 20 63 6f 6e  * Evaluation con
aaa0: 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  text */.  int *p
aab0: 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  nCol,           
aac0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
aad0: 3a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  : Number of colu
aae0: 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 54 63  mn names */.  Tc
aaf0: 6c 5f 4f 62 6a 20 2a 2a 2a 70 61 70 43 6f 6c 4e  l_Obj ***papColN
ab00: 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ame           /*
ab10: 20 4f 55 54 3a 20 41 72 72 61 79 20 6f 66 20 63   OUT: Array of c
ab20: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 29  olumn names */.)
ab30: 7b 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63  {.  /* Compute c
ab40: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20  olumn names */. 
ab50: 20 69 66 28 20 30 3d 3d 70 2d 3e 61 70 43 6f 6c   if( 0==p->apCol
ab60: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Name ){.    sqli
ab70: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20  te3_stmt *pStmt 
ab80: 3d 20 70 2d 3e 70 50 72 65 53 74 6d 74 2d 3e 70  = p->pPreStmt->p
ab90: 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b  Stmt;.    int i;
aba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abb0: 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
abc0: 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  tor variable */.
abd0: 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20      int nCol;   
abe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abf0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
ac00: 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20  olumns returned 
ac10: 62 79 20 70 53 74 6d 74 20 2a 2f 0a 20 20 20 20  by pStmt */.    
ac20: 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 43 6f 6c 4e  Tcl_Obj **apColN
ac30: 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  ame = 0;      /*
ac40: 20 41 72 72 61 79 20 6f 66 20 63 6f 6c 75 6d 6e   Array of column
ac50: 20 6e 61 6d 65 73 20 2a 2f 0a 0a 20 20 20 20 70   names */..    p
ac60: 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 20 3d 20  ->nCol = nCol = 
ac70: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
ac80: 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20  ount(pStmt);.   
ac90: 20 69 66 28 20 6e 43 6f 6c 3e 30 20 26 26 20 28   if( nCol>0 && (
aca0: 70 61 70 43 6f 6c 4e 61 6d 65 20 7c 7c 20 70 2d  papColName || p-
acb0: 3e 70 41 72 72 61 79 29 20 29 7b 0a 20 20 20 20  >pArray) ){.    
acc0: 20 20 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 28 54    apColName = (T
acd0: 63 6c 5f 4f 62 6a 2a 2a 29 54 63 6c 5f 41 6c 6c  cl_Obj**)Tcl_All
ace0: 6f 63 28 20 73 69 7a 65 6f 66 28 54 63 6c 5f 4f  oc( sizeof(Tcl_O
acf0: 62 6a 2a 29 2a 6e 43 6f 6c 20 29 3b 0a 20 20 20  bj*)*nCol );.   
ad00: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
ad10: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
ad20: 20 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 20 3d    apColName[i] =
ad30: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
ad40: 6a 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  j(sqlite3_column
ad50: 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69 29 2c 20  _name(pStmt,i), 
ad60: 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c  -1);.        Tcl
ad70: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 61 70  _IncrRefCount(ap
ad80: 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20  ColName[i]);.   
ad90: 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 61 70     }.      p->ap
ada0: 43 6f 6c 4e 61 6d 65 20 3d 20 61 70 43 6f 6c 4e  ColName = apColN
adb0: 61 6d 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ame;.    }..    
adc0: 2f 2a 20 49 66 20 72 65 73 75 6c 74 73 20 61 72  /* If results ar
add0: 65 20 62 65 69 6e 67 20 73 74 6f 72 65 64 20 69  e being stored i
ade0: 6e 20 61 6e 20 61 72 72 61 79 20 76 61 72 69 61  n an array varia
adf0: 62 6c 65 2c 20 74 68 65 6e 20 63 72 65 61 74 65  ble, then create
ae00: 0a 20 20 20 20 2a 2a 20 74 68 65 20 61 72 72 61  .    ** the arra
ae10: 79 28 2a 29 20 65 6e 74 72 79 20 66 6f 72 20 74  y(*) entry for t
ae20: 68 61 74 20 61 72 72 61 79 0a 20 20 20 20 2a 2f  hat array.    */
ae30: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 41 72 72  .    if( p->pArr
ae40: 61 79 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  ay ){.      Tcl_
ae50: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 20 3d  Interp *interp =
ae60: 20 70 2d 3e 70 44 62 2d 3e 69 6e 74 65 72 70 3b   p->pDb->interp;
ae70: 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  .      Tcl_Obj *
ae80: 70 43 6f 6c 4c 69 73 74 20 3d 20 54 63 6c 5f 4e  pColList = Tcl_N
ae90: 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20 20 20 54  ewObj();.      T
aea0: 63 6c 5f 4f 62 6a 20 2a 70 53 74 61 72 20 3d 20  cl_Obj *pStar = 
aeb0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
aec0: 28 22 2a 22 2c 20 2d 31 29 3b 0a 0a 20 20 20 20  ("*", -1);..    
aed0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
aee0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
aef0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
af00: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
af10: 2c 20 70 43 6f 6c 4c 69 73 74 2c 20 61 70 43 6f  , pColList, apCo
af20: 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20 20 20  lName[i]);.     
af30: 20 7d 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 63   }.      Tcl_Inc
af40: 72 52 65 66 43 6f 75 6e 74 28 70 53 74 61 72 29  rRefCount(pStar)
af50: 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 53  ;.      Tcl_ObjS
af60: 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 70  etVar2(interp, p
af70: 2d 3e 70 41 72 72 61 79 2c 20 70 53 74 61 72 2c  ->pArray, pStar,
af80: 20 70 43 6f 6c 4c 69 73 74 2c 20 30 29 3b 0a 20   pColList, 0);. 
af90: 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66       Tcl_DecrRef
afa0: 43 6f 75 6e 74 28 70 53 74 61 72 29 3b 0a 20 20  Count(pStar);.  
afb0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
afc0: 61 70 43 6f 6c 4e 61 6d 65 20 29 7b 0a 20 20 20  apColName ){.   
afd0: 20 2a 70 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 70   *papColName = p
afe0: 2d 3e 61 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 7d  ->apColName;.  }
aff0: 0a 20 20 69 66 28 20 70 6e 43 6f 6c 20 29 7b 0a  .  if( pnCol ){.
b000: 20 20 20 20 2a 70 6e 43 6f 6c 20 3d 20 70 2d 3e      *pnCol = p->
b010: 6e 43 6f 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  nCol;.  }.}../*.
b020: 2a 2a 20 52 65 74 75 72 6e 20 6f 6e 65 20 6f 66  ** Return one of
b030: 20 54 43 4c 5f 4f 4b 2c 20 54 43 4c 5f 42 52 45   TCL_OK, TCL_BRE
b040: 41 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 2e  AK or TCL_ERROR.
b050: 20 49 66 20 54 43 4c 5f 45 52 52 4f 52 20 69 73   If TCL_ERROR is
b060: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2c 20 74 68  .** returned, th
b070: 65 6e 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  en an error mess
b080: 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  age is stored in
b090: 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72   the interpreter
b0a0: 20 62 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75 72   before.** retur
b0b0: 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65  ning..**.** A re
b0c0: 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 54 43  turn value of TC
b0d0: 4c 5f 4f 4b 20 6d 65 61 6e 73 20 74 68 65 72 65  L_OK means there
b0e0: 20 69 73 20 61 20 72 6f 77 20 6f 66 20 64 61 74   is a row of dat
b0f0: 61 20 61 76 61 69 6c 61 62 6c 65 2e 20 54 68 65  a available. The
b100: 0a 2a 2a 20 64 61 74 61 20 6d 61 79 20 62 65 20  .** data may be 
b110: 61 63 63 65 73 73 65 64 20 75 73 69 6e 67 20 64  accessed using d
b120: 62 45 76 61 6c 52 6f 77 49 6e 66 6f 28 29 20 61  bEvalRowInfo() a
b130: 6e 64 20 64 62 45 76 61 6c 43 6f 6c 75 6d 6e 56  nd dbEvalColumnV
b140: 61 6c 75 65 28 29 2e 20 54 68 69 73 0a 2a 2a 20  alue(). This.** 
b150: 69 73 20 61 6e 61 6c 6f 67 6f 75 73 20 74 6f 20  is analogous to 
b160: 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49  a return of SQLI
b170: 54 45 5f 52 4f 57 20 66 72 6f 6d 20 73 71 6c 69  TE_ROW from sqli
b180: 74 65 33 5f 73 74 65 70 28 29 2e 20 49 66 20 54  te3_step(). If T
b190: 43 4c 5f 42 52 45 41 4b 0a 2a 2a 20 69 73 20 72  CL_BREAK.** is r
b1a0: 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 74 68  eturned, then th
b1b0: 65 20 53 51 4c 20 73 63 72 69 70 74 20 68 61 73  e SQL script has
b1c0: 20 66 69 6e 69 73 68 65 64 20 65 78 65 63 75 74   finished execut
b1d0: 69 6e 67 20 61 6e 64 20 74 68 65 72 65 20 61 72  ing and there ar
b1e0: 65 0a 2a 2a 20 6e 6f 20 66 75 72 74 68 65 72 20  e.** no further 
b1f0: 72 6f 77 73 20 61 76 61 69 6c 61 62 6c 65 2e 20  rows available. 
b200: 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20  This is similar 
b210: 74 6f 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a  to SQLITE_DONE..
b220: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 62  */.static int db
b230: 45 76 61 6c 53 74 65 70 28 44 62 45 76 61 6c 43  EvalStep(DbEvalC
b240: 6f 6e 74 65 78 74 20 2a 70 29 7b 0a 20 20 63 6f  ontext *p){.  co
b250: 6e 73 74 20 63 68 61 72 20 2a 7a 50 72 65 76 53  nst char *zPrevS
b260: 71 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  ql = 0;       /*
b270: 20 50 72 65 76 69 6f 75 73 20 76 61 6c 75 65 20   Previous value 
b280: 6f 66 20 70 2d 3e 7a 53 71 6c 20 2a 2f 0a 0a 20  of p->zSql */.. 
b290: 20 77 68 69 6c 65 28 20 70 2d 3e 7a 53 71 6c 5b   while( p->zSql[
b2a0: 30 5d 20 7c 7c 20 70 2d 3e 70 50 72 65 53 74 6d  0] || p->pPreStm
b2b0: 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  t ){.    int rc;
b2c0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 50 72 65  .    if( p->pPre
b2d0: 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Stmt==0 ){.     
b2e0: 20 7a 50 72 65 76 53 71 6c 20 3d 20 28 70 2d 3e   zPrevSql = (p->
b2f0: 7a 53 71 6c 3d 3d 7a 50 72 65 76 53 71 6c 20 3f  zSql==zPrevSql ?
b300: 20 30 20 3a 20 70 2d 3e 7a 53 71 6c 29 3b 0a 20   0 : p->zSql);. 
b310: 20 20 20 20 20 72 63 20 3d 20 64 62 50 72 65 70       rc = dbPrep
b320: 61 72 65 41 6e 64 42 69 6e 64 28 70 2d 3e 70 44  areAndBind(p->pD
b330: 62 2c 20 70 2d 3e 7a 53 71 6c 2c 20 26 70 2d 3e  b, p->zSql, &p->
b340: 7a 53 71 6c 2c 20 26 70 2d 3e 70 50 72 65 53 74  zSql, &p->pPreSt
b350: 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  mt);.      if( r
b360: 63 21 3d 54 43 4c 5f 4f 4b 20 29 20 72 65 74 75  c!=TCL_OK ) retu
b370: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 65 6c 73 65  rn rc;.    }else
b380: 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 73 3b  {.      int rcs;
b390: 0a 20 20 20 20 20 20 53 71 6c 69 74 65 44 62 20  .      SqliteDb 
b3a0: 2a 70 44 62 20 3d 20 70 2d 3e 70 44 62 3b 0a 20  *pDb = p->pDb;. 
b3b0: 20 20 20 20 20 53 71 6c 50 72 65 70 61 72 65 64       SqlPrepared
b3c0: 53 74 6d 74 20 2a 70 50 72 65 53 74 6d 74 20 3d  Stmt *pPreStmt =
b3d0: 20 70 2d 3e 70 50 72 65 53 74 6d 74 3b 0a 20 20   p->pPreStmt;.  
b3e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
b3f0: 20 2a 70 53 74 6d 74 20 3d 20 70 50 72 65 53 74   *pStmt = pPreSt
b400: 6d 74 2d 3e 70 53 74 6d 74 3b 0a 0a 20 20 20 20  mt->pStmt;..    
b410: 20 20 72 63 73 20 3d 20 73 71 6c 69 74 65 33 5f    rcs = sqlite3_
b420: 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20  step(pStmt);.   
b430: 20 20 20 69 66 28 20 72 63 73 3d 3d 53 51 4c 49     if( rcs==SQLI
b440: 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20  TE_ROW ){.      
b450: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
b460: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
b470: 66 28 20 70 2d 3e 70 41 72 72 61 79 20 29 7b 0a  f( p->pArray ){.
b480: 20 20 20 20 20 20 20 20 64 62 45 76 61 6c 52 6f          dbEvalRo
b490: 77 49 6e 66 6f 28 70 2c 20 30 2c 20 30 29 3b 0a  wInfo(p, 0, 0);.
b4a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
b4b0: 73 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  s = sqlite3_rese
b4c0: 74 28 70 53 74 6d 74 29 3b 0a 0a 20 20 20 20 20  t(pStmt);..     
b4d0: 20 70 44 62 2d 3e 6e 53 74 65 70 20 3d 20 73 71   pDb->nStep = sq
b4e0: 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75  lite3_stmt_statu
b4f0: 73 28 70 53 74 6d 74 2c 53 51 4c 49 54 45 5f 53  s(pStmt,SQLITE_S
b500: 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43  TMTSTATUS_FULLSC
b510: 41 4e 5f 53 54 45 50 2c 31 29 3b 0a 20 20 20 20  AN_STEP,1);.    
b520: 20 20 70 44 62 2d 3e 6e 53 6f 72 74 20 3d 20 73    pDb->nSort = s
b530: 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74  qlite3_stmt_stat
b540: 75 73 28 70 53 74 6d 74 2c 53 51 4c 49 54 45 5f  us(pStmt,SQLITE_
b550: 53 54 4d 54 53 54 41 54 55 53 5f 53 4f 52 54 2c  STMTSTATUS_SORT,
b560: 31 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 6e  1);.      pDb->n
b570: 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 5f  Index = sqlite3_
b580: 73 74 6d 74 5f 73 74 61 74 75 73 28 70 53 74 6d  stmt_status(pStm
b590: 74 2c 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  t,SQLITE_STMTSTA
b5a0: 54 55 53 5f 41 55 54 4f 49 4e 44 45 58 2c 31 29  TUS_AUTOINDEX,1)
b5b0: 3b 0a 20 20 20 20 20 20 64 62 52 65 6c 65 61 73  ;.      dbReleas
b5c0: 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 29 3b  eColumnNames(p);
b5d0: 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 65 53 74  .      p->pPreSt
b5e0: 6d 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69  mt = 0;..      i
b5f0: 66 28 20 72 63 73 21 3d 53 51 4c 49 54 45 5f 4f  f( rcs!=SQLITE_O
b600: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  K ){.        /* 
b610: 49 66 20 61 20 72 75 6e 2d 74 69 6d 65 20 65 72  If a run-time er
b620: 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 70 6f  ror occurs, repo
b630: 72 74 20 74 68 65 20 65 72 72 6f 72 20 61 6e 64  rt the error and
b640: 20 73 74 6f 70 20 72 65 61 64 69 6e 67 0a 20 20   stop reading.  
b650: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c        ** the SQL
b660: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 64 62  .  */.        db
b670: 52 65 6c 65 61 73 65 53 74 6d 74 28 70 44 62 2c  ReleaseStmt(pDb,
b680: 20 70 50 72 65 53 74 6d 74 2c 20 31 29 3b 0a 23   pPreStmt, 1);.#
b690: 69 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  if SQLITE_TEST. 
b6a0: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 44         if( p->pD
b6b0: 62 2d 3e 62 4c 65 67 61 63 79 50 72 65 70 61 72  b->bLegacyPrepar
b6c0: 65 20 26 26 20 72 63 73 3d 3d 53 51 4c 49 54 45  e && rcs==SQLITE
b6d0: 5f 53 43 48 45 4d 41 20 26 26 20 7a 50 72 65 76  _SCHEMA && zPrev
b6e0: 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Sql ){.         
b6f0: 20 2f 2a 20 49 66 20 74 68 65 20 72 75 6e 74 69   /* If the runti
b700: 6d 65 20 65 72 72 6f 72 20 77 61 73 20 61 6e 20  me error was an 
b710: 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 2c 20 61  SQLITE_SCHEMA, a
b720: 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  nd the database.
b730: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61 6e            ** han
b740: 64 6c 65 20 69 73 20 63 6f 6e 66 69 67 75 72 65  dle is configure
b750: 64 20 74 6f 20 75 73 65 20 74 68 65 20 6c 65 67  d to use the leg
b760: 61 63 79 20 73 71 6c 69 74 65 33 5f 70 72 65 70  acy sqlite3_prep
b770: 61 72 65 28 29 20 0a 20 20 20 20 20 20 20 20 20  are() .         
b780: 20 2a 2a 20 69 6e 74 65 72 66 61 63 65 2c 20 72   ** interface, r
b790: 65 74 72 79 20 70 72 65 70 61 72 65 28 29 2f 73  etry prepare()/s
b7a0: 74 65 70 28 29 20 6f 6e 20 74 68 65 20 73 61 6d  tep() on the sam
b7b0: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  e SQL statement.
b7c0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68  .          ** Th
b7d0: 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20  is only happens 
b7e0: 6f 6e 63 65 2e 20 49 66 20 74 68 65 72 65 20 69  once. If there i
b7f0: 73 20 61 20 73 65 63 6f 6e 64 20 53 51 4c 49 54  s a second SQLIT
b800: 45 5f 53 43 48 45 4d 41 0a 20 20 20 20 20 20 20  E_SCHEMA.       
b810: 20 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74 68 65     ** error, the
b820: 20 65 72 72 6f 72 20 77 69 6c 6c 20 62 65 20 72   error will be r
b830: 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
b840: 61 6c 6c 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  aller. */.      
b850: 20 20 20 20 70 2d 3e 7a 53 71 6c 20 3d 20 7a 50      p->zSql = zP
b860: 72 65 76 53 71 6c 3b 0a 20 20 20 20 20 20 20 20  revSql;.        
b870: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
b880: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
b890: 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52       Tcl_SetObjR
b8a0: 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72  esult(pDb->inter
b8b0: 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
b8c0: 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
b8d0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c  NewStringObj(sql
b8e0: 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d  ite3_errmsg(pDb-
b8f0: 3e 64 62 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20  >db), -1));.    
b900: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
b910: 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73  RROR;.      }els
b920: 65 7b 0a 20 20 20 20 20 20 20 20 64 62 52 65 6c  e{.        dbRel
b930: 65 61 73 65 53 74 6d 74 28 70 44 62 2c 20 70 50  easeStmt(pDb, pP
b940: 72 65 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  reStmt, 0);.    
b950: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
b960: 20 2f 2a 20 46 69 6e 69 73 68 65 64 20 2a 2f 0a   /* Finished */.
b970: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 42 52 45    return TCL_BRE
b980: 41 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  AK;.}../*.** Fre
b990: 65 20 61 6c 6c 20 72 65 73 6f 75 72 63 65 73 20  e all resources 
b9a0: 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 62  currently held b
b9b0: 79 20 74 68 65 20 44 62 45 76 61 6c 43 6f 6e 74  y the DbEvalCont
b9c0: 65 78 74 20 73 74 72 75 63 74 75 72 65 20 70 61  ext structure pa
b9d0: 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66  ssed.** as the f
b9e0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54  irst argument. T
b9f0: 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 65  here should be e
ba00: 78 61 63 74 6c 79 20 6f 6e 65 20 63 61 6c 6c 20  xactly one call 
ba10: 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
ba20: 0a 2a 2a 20 66 6f 72 20 65 61 63 68 20 63 61 6c  .** for each cal
ba30: 6c 20 74 6f 20 64 62 45 76 61 6c 49 6e 69 74 28  l to dbEvalInit(
ba40: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
ba50: 64 20 64 62 45 76 61 6c 46 69 6e 61 6c 69 7a 65  d dbEvalFinalize
ba60: 28 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a  (DbEvalContext *
ba70: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72  p){.  if( p->pPr
ba80: 65 53 74 6d 74 20 29 7b 0a 20 20 20 20 73 71 6c  eStmt ){.    sql
ba90: 69 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 50  ite3_reset(p->pP
baa0: 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74 29 3b 0a  reStmt->pStmt);.
bab0: 20 20 20 20 64 62 52 65 6c 65 61 73 65 53 74 6d      dbReleaseStm
bac0: 74 28 70 2d 3e 70 44 62 2c 20 70 2d 3e 70 50 72  t(p->pDb, p->pPr
bad0: 65 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 70  eStmt, 0);.    p
bae0: 2d 3e 70 50 72 65 53 74 6d 74 20 3d 20 30 3b 0a  ->pPreStmt = 0;.
baf0: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 41 72    }.  if( p->pAr
bb00: 72 61 79 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44  ray ){.    Tcl_D
bb10: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70  ecrRefCount(p->p
bb20: 41 72 72 61 79 29 3b 0a 20 20 20 20 70 2d 3e 70  Array);.    p->p
bb30: 41 72 72 61 79 20 3d 20 30 3b 0a 20 20 7d 0a 20  Array = 0;.  }. 
bb40: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
bb50: 74 28 70 2d 3e 70 53 71 6c 29 3b 0a 20 20 64 62  t(p->pSql);.  db
bb60: 52 65 6c 65 61 73 65 43 6f 6c 75 6d 6e 4e 61 6d  ReleaseColumnNam
bb70: 65 73 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  es(p);.}../*.** 
bb80: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
bb90: 20 74 6f 20 61 20 54 63 6c 5f 4f 62 6a 20 73 74   to a Tcl_Obj st
bba0: 72 75 63 74 75 72 65 20 77 69 74 68 20 72 65 66  ructure with ref
bbb0: 2d 63 6f 75 6e 74 20 30 20 74 68 61 74 20 63 6f  -count 0 that co
bbc0: 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20 76 61  ntains.** the va
bbd0: 6c 75 65 20 66 6f 72 20 74 68 65 20 69 43 6f 6c  lue for the iCol
bbe0: 27 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  'th column of th
bbf0: 65 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79 20  e row currently 
bc00: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 0a 2a 2a  pointed to by.**
bc10: 20 74 68 65 20 44 62 45 76 61 6c 43 6f 6e 74 65   the DbEvalConte
bc20: 78 74 20 73 74 72 75 63 74 75 72 65 20 70 61 73  xt structure pas
bc30: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
bc40: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
bc50: 61 74 69 63 20 54 63 6c 5f 4f 62 6a 20 2a 64 62  atic Tcl_Obj *db
bc60: 45 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65 28  EvalColumnValue(
bc70: 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 70  DbEvalContext *p
bc80: 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 73  , int iCol){.  s
bc90: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
bca0: 6d 74 20 3d 20 70 2d 3e 70 50 72 65 53 74 6d 74  mt = p->pPreStmt
bcb0: 2d 3e 70 53 74 6d 74 3b 0a 20 20 73 77 69 74 63  ->pStmt;.  switc
bcc0: 68 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  h( sqlite3_colum
bcd0: 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c 20 69 43  n_type(pStmt, iC
bce0: 6f 6c 29 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ol) ){.    case 
bcf0: 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20  SQLITE_BLOB: {. 
bd00: 20 20 20 20 20 69 6e 74 20 62 79 74 65 73 20 3d       int bytes =
bd10: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
bd20: 62 79 74 65 73 28 70 53 74 6d 74 2c 20 69 43 6f  bytes(pStmt, iCo
bd30: 6c 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  l);.      const 
bd40: 63 68 61 72 20 2a 7a 42 6c 6f 62 20 3d 20 73 71  char *zBlob = sq
bd50: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f  lite3_column_blo
bd60: 62 28 70 53 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a  b(pStmt, iCol);.
bd70: 20 20 20 20 20 20 69 66 28 20 21 7a 42 6c 6f 62        if( !zBlob
bd80: 20 29 20 62 79 74 65 73 20 3d 20 30 3b 0a 20 20   ) bytes = 0;.  
bd90: 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e      return Tcl_N
bda0: 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 28  ewByteArrayObj((
bdb0: 75 38 2a 29 7a 42 6c 6f 62 2c 20 62 79 74 65 73  u8*)zBlob, bytes
bdc0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  );.    }.    cas
bdd0: 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  e SQLITE_INTEGER
bde0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
bdf0: 5f 69 6e 74 36 34 20 76 20 3d 20 73 71 6c 69 74  _int64 v = sqlit
be00: 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28  e3_column_int64(
be10: 70 53 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20 20  pStmt, iCol);.  
be20: 20 20 20 20 69 66 28 20 76 3e 3d 2d 32 31 34 37      if( v>=-2147
be30: 34 38 33 36 34 37 20 26 26 20 76 3c 3d 32 31 34  483647 && v<=214
be40: 37 34 38 33 36 34 37 20 29 7b 0a 20 20 20 20 20  7483647 ){.     
be50: 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e 65     return Tcl_Ne
be60: 77 49 6e 74 4f 62 6a 28 28 69 6e 74 29 76 29 3b  wIntObj((int)v);
be70: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
be80: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c        return Tcl
be90: 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 76  _NewWideIntObj(v
bea0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
beb0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
bec0: 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20  _FLOAT: {.      
bed0: 72 65 74 75 72 6e 20 54 63 6c 5f 4e 65 77 44 6f  return Tcl_NewDo
bee0: 75 62 6c 65 4f 62 6a 28 73 71 6c 69 74 65 33 5f  ubleObj(sqlite3_
bef0: 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 53  column_double(pS
bf00: 74 6d 74 2c 20 69 43 6f 6c 29 29 3b 0a 20 20 20  tmt, iCol));.   
bf10: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
bf20: 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  TE_NULL: {.     
bf30: 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e 65 77 53   return Tcl_NewS
bf40: 74 72 69 6e 67 4f 62 6a 28 70 2d 3e 70 44 62 2d  tringObj(p->pDb-
bf50: 3e 7a 4e 75 6c 6c 2c 20 2d 31 29 3b 0a 20 20 20  >zNull, -1);.   
bf60: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
bf70: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
bf80: 6a 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  j((char*)sqlite3
bf90: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74  _column_text(pSt
bfa0: 6d 74 2c 20 69 43 6f 6c 29 2c 20 2d 31 29 3b 0a  mt, iCol), -1);.
bfb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 75 73 69 6e  }../*.** If usin
bfc0: 67 20 54 63 6c 20 76 65 72 73 69 6f 6e 20 38 2e  g Tcl version 8.
bfd0: 36 20 6f 72 20 67 72 65 61 74 65 72 2c 20 75 73  6 or greater, us
bfe0: 65 20 74 68 65 20 4e 52 20 66 75 6e 63 74 69 6f  e the NR functio
bff0: 6e 73 20 74 6f 20 61 76 6f 69 64 0a 2a 2a 20 72  ns to avoid.** r
c000: 65 63 75 72 73 69 76 65 20 65 76 61 6c 75 74 69  ecursive evaluti
c010: 6f 6e 20 6f 66 20 73 63 72 69 70 74 73 20 62 79  on of scripts by
c020: 20 74 68 65 20 5b 64 62 20 65 76 61 6c 5d 20 61   the [db eval] a
c030: 6e 64 20 5b 64 62 20 74 72 61 6e 73 5d 0a 2a 2a  nd [db trans].**
c040: 20 63 6f 6d 6d 61 6e 64 73 2e 20 45 76 65 6e 20   commands. Even 
c050: 69 66 20 74 68 65 20 68 65 61 64 65 72 73 20 75  if the headers u
c060: 73 65 64 20 77 68 69 6c 65 20 63 6f 6d 70 69 6c  sed while compil
c070: 69 6e 67 20 74 68 65 20 65 78 74 65 6e 73 69 6f  ing the extensio
c080: 6e 0a 2a 2a 20 61 72 65 20 38 2e 36 20 6f 72 20  n.** are 8.6 or 
c090: 6e 65 77 65 72 2c 20 74 68 65 20 63 6f 64 65 20  newer, the code 
c0a0: 73 74 69 6c 6c 20 74 65 73 74 73 20 74 68 65 20  still tests the 
c0b0: 54 63 6c 20 76 65 72 73 69 6f 6e 20 61 74 20 72  Tcl version at r
c0c0: 75 6e 74 69 6d 65 2e 0a 2a 2a 20 54 68 69 73 20  untime..** This 
c0d0: 61 6c 6c 6f 77 73 20 73 74 75 62 73 2d 65 6e 61  allows stubs-ena
c0e0: 62 6c 65 64 20 62 75 69 6c 64 73 20 74 6f 20 62  bled builds to b
c0f0: 65 20 75 73 65 64 20 77 69 74 68 20 6f 6c 64 65  e used with olde
c100: 72 20 54 63 6c 20 6c 69 62 72 61 72 69 65 73 2e  r Tcl libraries.
c110: 0a 2a 2f 0a 23 69 66 20 54 43 4c 5f 4d 41 4a 4f  .*/.#if TCL_MAJO
c120: 52 5f 56 45 52 53 49 4f 4e 3e 38 20 7c 7c 20 28  R_VERSION>8 || (
c130: 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f  TCL_MAJOR_VERSIO
c140: 4e 3d 3d 38 20 26 26 20 54 43 4c 5f 4d 49 4e 4f  N==8 && TCL_MINO
c150: 52 5f 56 45 52 53 49 4f 4e 3e 3d 36 29 0a 23 20  R_VERSION>=6).# 
c160: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 54 43  define SQLITE_TC
c170: 4c 5f 4e 52 45 20 31 0a 73 74 61 74 69 63 20 69  L_NRE 1.static i
c180: 6e 74 20 44 62 55 73 65 4e 72 65 28 76 6f 69 64  nt DbUseNre(void
c190: 29 7b 0a 20 20 69 6e 74 20 6d 61 6a 6f 72 2c 20  ){.  int major, 
c1a0: 6d 69 6e 6f 72 3b 0a 20 20 54 63 6c 5f 47 65 74  minor;.  Tcl_Get
c1b0: 56 65 72 73 69 6f 6e 28 26 6d 61 6a 6f 72 2c 20  Version(&major, 
c1c0: 26 6d 69 6e 6f 72 2c 20 30 2c 20 30 29 3b 0a 20  &minor, 0, 0);. 
c1d0: 20 72 65 74 75 72 6e 28 20 28 6d 61 6a 6f 72 3d   return( (major=
c1e0: 3d 38 20 26 26 20 6d 69 6e 6f 72 3e 3d 36 29 20  =8 && minor>=6) 
c1f0: 7c 7c 20 6d 61 6a 6f 72 3e 38 20 29 3b 0a 7d 0a  || major>8 );.}.
c200: 23 65 6c 73 65 0a 2f 2a 20 0a 2a 2a 20 43 6f 6d  #else./* .** Com
c210: 70 69 6c 69 6e 67 20 75 73 69 6e 67 20 68 65 61  piling using hea
c220: 64 65 72 73 20 65 61 72 6c 69 65 72 20 74 68 61  ders earlier tha
c230: 6e 20 38 2e 36 2e 20 49 6e 20 74 68 69 73 20 63  n 8.6. In this c
c240: 61 73 65 20 4e 52 20 63 61 6e 6e 6f 74 20 62 65  ase NR cannot be
c250: 0a 2a 2a 20 75 73 65 64 2c 20 73 6f 20 44 62 55  .** used, so DbU
c260: 73 65 4e 72 65 28 29 20 74 6f 20 61 6c 77 61 79  seNre() to alway
c270: 73 20 72 65 74 75 72 6e 20 7a 65 72 6f 2e 20 41  s return zero. A
c280: 64 64 20 23 64 65 66 69 6e 65 73 20 66 6f 72 20  dd #defines for 
c290: 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20 54 63 6c  the other.** Tcl
c2a0: 5f 4e 52 78 78 78 28 29 20 66 75 6e 63 74 69 6f  _NRxxx() functio
c2b0: 6e 73 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68  ns to prevent th
c2c0: 65 6d 20 66 72 6f 6d 20 63 61 75 73 69 6e 67 20  em from causing 
c2d0: 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 65 72 72 6f  compilation erro
c2e0: 72 73 2c 0a 2a 2a 20 65 76 65 6e 20 74 68 6f 75  rs,.** even thou
c2f0: 67 68 20 74 68 65 20 6f 6e 6c 79 20 69 6e 76 6f  gh the only invo
c300: 63 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 6d 20  cations of them 
c310: 61 72 65 20 77 69 74 68 69 6e 20 63 6f 6e 64 69  are within condi
c320: 74 69 6f 6e 61 6c 20 62 6c 6f 63 6b 73 20 0a 2a  tional blocks .*
c330: 2a 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a  * of the form:.*
c340: 2a 0a 2a 2a 20 20 20 69 66 28 20 44 62 55 73 65  *.**   if( DbUse
c350: 4e 72 65 28 29 20 29 20 7b 20 2e 2e 2e 20 7d 0a  Nre() ) { ... }.
c360: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  */.# define SQLI
c370: 54 45 5f 54 43 4c 5f 4e 52 45 20 30 0a 23 20 64  TE_TCL_NRE 0.# d
c380: 65 66 69 6e 65 20 44 62 55 73 65 4e 72 65 28 29  efine DbUseNre()
c390: 20 30 0a 23 20 64 65 66 69 6e 65 20 54 63 6c 5f   0.# define Tcl_
c3a0: 4e 52 41 64 64 43 61 6c 6c 62 61 63 6b 28 61 2c  NRAddCallback(a,
c3b0: 62 2c 63 2c 64 2c 65 2c 66 29 20 28 76 6f 69 64  b,c,d,e,f) (void
c3c0: 29 30 0a 23 20 64 65 66 69 6e 65 20 54 63 6c 5f  )0.# define Tcl_
c3d0: 4e 52 45 76 61 6c 4f 62 6a 28 61 2c 62 2c 63 29  NREvalObj(a,b,c)
c3e0: 20 30 0a 23 20 64 65 66 69 6e 65 20 54 63 6c 5f   0.# define Tcl_
c3f0: 4e 52 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28  NRCreateCommand(
c400: 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 28 76 6f  a,b,c,d,e,f) (vo
c410: 69 64 29 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  id)0.#endif../*.
c420: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
c430: 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
c440: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
c450: 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64 3a 0a 2a  f the command:.*
c460: 2a 0a 2a 2a 20 20 20 24 64 62 20 65 76 61 6c 20  *.**   $db eval 
c470: 53 51 4c 20 3f 41 52 52 41 59 4e 41 4d 45 3f 20  SQL ?ARRAYNAME? 
c480: 53 43 52 49 50 54 0a 2a 2f 0a 73 74 61 74 69 63  SCRIPT.*/.static
c490: 20 69 6e 74 20 44 62 45 76 61 6c 4e 65 78 74 43   int DbEvalNextC
c4a0: 6d 64 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  md(.  ClientData
c4b0: 20 64 61 74 61 5b 5d 2c 20 20 20 20 20 20 20 20   data[],        
c4c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 61             /* da
c4d0: 74 61 5b 30 5d 20 69 73 20 74 68 65 20 28 44 62  ta[0] is the (Db
c4e0: 45 76 61 6c 43 6f 6e 74 65 78 74 2a 29 20 2a 2f  EvalContext*) */
c4f0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
c500: 6e 74 65 72 70 2c 20 20 20 20 20 20 20 20 20 20  nterp,          
c510: 20 20 20 20 20 20 20 20 2f 2a 20 54 63 6c 20 69          /* Tcl i
c520: 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 20 20  nterpreter */.  
c530: 69 6e 74 20 72 65 73 75 6c 74 20 20 20 20 20 20  int result      
c540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c550: 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 73       /* Result s
c560: 6f 20 66 61 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e  o far */.){.  in
c570: 74 20 72 63 20 3d 20 72 65 73 75 6c 74 3b 20 20  t rc = result;  
c580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c590: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
c5a0: 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 66  e */..  /* The f
c5b0: 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20  irst element of 
c5c0: 74 68 65 20 64 61 74 61 5b 5d 20 61 72 72 61 79  the data[] array
c5d0: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
c5e0: 20 61 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74   a DbEvalContext
c5f0: 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65 20  .  ** structure 
c600: 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20  allocated using 
c610: 54 63 6c 5f 41 6c 6c 6f 63 28 29 2e 20 54 68 65  Tcl_Alloc(). The
c620: 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e 74 20   second element 
c630: 6f 66 20 64 61 74 61 5b 5d 0a 20 20 2a 2a 20 69  of data[].  ** i
c640: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
c650: 20 54 63 6c 5f 4f 62 6a 20 63 6f 6e 74 61 69 6e   Tcl_Obj contain
c660: 69 6e 67 20 74 68 65 20 73 63 72 69 70 74 20 74  ing the script t
c670: 6f 20 72 75 6e 20 66 6f 72 20 65 61 63 68 20 72  o run for each r
c680: 6f 77 0a 20 20 2a 2a 20 72 65 74 75 72 6e 65 64  ow.  ** returned
c690: 20 62 79 20 74 68 65 20 71 75 65 72 69 65 73 20   by the queries 
c6a0: 65 6e 63 61 70 73 75 6c 61 74 65 64 20 69 6e 20  encapsulated in 
c6b0: 64 61 74 61 5b 30 5d 2e 20 2a 2f 0a 20 20 44 62  data[0]. */.  Db
c6c0: 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 70 20 3d  EvalContext *p =
c6d0: 20 28 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20   (DbEvalContext 
c6e0: 2a 29 64 61 74 61 5b 30 5d 3b 0a 20 20 54 63 6c  *)data[0];.  Tcl
c6f0: 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 20 3d 20  _Obj *pScript = 
c700: 28 54 63 6c 5f 4f 62 6a 20 2a 29 64 61 74 61 5b  (Tcl_Obj *)data[
c710: 31 5d 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  1];.  Tcl_Obj *p
c720: 41 72 72 61 79 20 3d 20 70 2d 3e 70 41 72 72 61  Array = p->pArra
c730: 79 3b 0a 0a 20 20 77 68 69 6c 65 28 20 28 72 63  y;..  while( (rc
c740: 3d 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 72 63 3d 3d  ==TCL_OK || rc==
c750: 54 43 4c 5f 43 4f 4e 54 49 4e 55 45 29 20 26 26  TCL_CONTINUE) &&
c760: 20 54 43 4c 5f 4f 4b 3d 3d 28 72 63 20 3d 20 64   TCL_OK==(rc = d
c770: 62 45 76 61 6c 53 74 65 70 28 70 29 29 20 29 7b  bEvalStep(p)) ){
c780: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
c790: 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 54 63  int nCol;.    Tc
c7a0: 6c 5f 4f 62 6a 20 2a 2a 61 70 43 6f 6c 4e 61 6d  l_Obj **apColNam
c7b0: 65 3b 0a 20 20 20 20 64 62 45 76 61 6c 52 6f 77  e;.    dbEvalRow
c7c0: 49 6e 66 6f 28 70 2c 20 26 6e 43 6f 6c 2c 20 26  Info(p, &nCol, &
c7d0: 61 70 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20 20  apColName);.    
c7e0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
c7f0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c   i++){.      Tcl
c800: 5f 4f 62 6a 20 2a 70 56 61 6c 20 3d 20 64 62 45  _Obj *pVal = dbE
c810: 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65 28 70  valColumnValue(p
c820: 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , i);.      if( 
c830: 70 41 72 72 61 79 3d 3d 30 20 29 7b 0a 20 20 20  pArray==0 ){.   
c840: 20 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56       Tcl_ObjSetV
c850: 61 72 32 28 69 6e 74 65 72 70 2c 20 61 70 43 6f  ar2(interp, apCo
c860: 6c 4e 61 6d 65 5b 69 5d 2c 20 30 2c 20 70 56 61  lName[i], 0, pVa
c870: 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  l, 0);.      }el
c880: 73 65 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  se{.        Tcl_
c890: 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72  ObjSetVar2(inter
c8a0: 70 2c 20 70 41 72 72 61 79 2c 20 61 70 43 6f 6c  p, pArray, apCol
c8b0: 4e 61 6d 65 5b 69 5d 2c 20 70 56 61 6c 2c 20 30  Name[i], pVal, 0
c8c0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
c8d0: 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71  ..    /* The req
c8e0: 75 69 72 65 64 20 69 6e 74 65 72 70 72 65 74 65  uired interprete
c8f0: 72 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  r variables are 
c900: 6e 6f 77 20 70 6f 70 75 6c 61 74 65 64 20 77 69  now populated wi
c910: 74 68 20 74 68 65 20 64 61 74 61 20 0a 20 20 20  th the data .   
c920: 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 63 75 72   ** from the cur
c930: 72 65 6e 74 20 72 6f 77 2e 20 49 66 20 75 73 69  rent row. If usi
c940: 6e 67 20 4e 52 45 2c 20 73 63 68 65 64 75 6c 65  ng NRE, schedule
c950: 20 63 61 6c 6c 62 61 63 6b 73 20 74 6f 20 65 76   callbacks to ev
c960: 61 6c 75 61 74 65 0a 20 20 20 20 2a 2a 20 73 63  aluate.    ** sc
c970: 72 69 70 74 20 70 53 63 72 69 70 74 2c 20 74 68  ript pScript, th
c980: 65 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 69  en to invoke thi
c990: 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e  s function again
c9a0: 20 74 6f 20 66 65 74 63 68 20 74 68 65 20 6e 65   to fetch the ne
c9b0: 78 74 0a 20 20 20 20 2a 2a 20 72 6f 77 20 28 6f  xt.    ** row (o
c9c0: 72 20 63 6c 65 61 6e 20 75 70 20 69 66 20 74 68  r clean up if th
c9d0: 65 72 65 20 69 73 20 6e 6f 20 6e 65 78 74 20 72  ere is no next r
c9e0: 6f 77 20 6f 72 20 74 68 65 20 73 63 72 69 70 74  ow or the script
c9f0: 20 74 68 72 6f 77 73 20 61 6e 0a 20 20 20 20 2a   throws an.    *
ca00: 2a 20 65 78 63 65 70 74 69 6f 6e 29 2e 20 41 66  * exception). Af
ca10: 74 65 72 20 73 63 68 65 64 75 6c 69 6e 67 20 74  ter scheduling t
ca20: 68 65 20 63 61 6c 6c 62 61 63 6b 73 2c 20 72 65  he callbacks, re
ca30: 74 75 72 6e 20 63 6f 6e 74 72 6f 6c 20 74 6f 20  turn control to 
ca40: 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  the .    ** call
ca50: 65 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  er..    **.    *
ca60: 2a 20 49 66 20 6e 6f 74 20 75 73 69 6e 67 20 4e  * If not using N
ca70: 52 45 2c 20 65 76 61 6c 75 61 74 65 20 70 53 63  RE, evaluate pSc
ca80: 72 69 70 74 20 64 69 72 65 63 74 6c 79 20 61 6e  ript directly an
ca90: 64 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20  d continue with 
caa0: 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65 78 74 20  the.    ** next 
cab0: 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 69  iteration of thi
cac0: 73 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f  s while(...) loo
cad0: 70 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 44  p.  */.    if( D
cae0: 62 55 73 65 4e 72 65 28 29 20 29 7b 0a 20 20 20  bUseNre() ){.   
caf0: 20 20 20 54 63 6c 5f 4e 52 41 64 64 43 61 6c 6c     Tcl_NRAddCall
cb00: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 44 62 45  back(interp, DbE
cb10: 76 61 6c 4e 65 78 74 43 6d 64 2c 20 28 76 6f 69  valNextCmd, (voi
cb20: 64 2a 29 70 2c 20 28 76 6f 69 64 2a 29 70 53 63  d*)p, (void*)pSc
cb30: 72 69 70 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ript, 0, 0);.   
cb40: 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e 52     return Tcl_NR
cb50: 45 76 61 6c 4f 62 6a 28 69 6e 74 65 72 70 2c 20  EvalObj(interp, 
cb60: 70 53 63 72 69 70 74 2c 20 30 29 3b 0a 20 20 20  pScript, 0);.   
cb70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
cb80: 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78   = Tcl_EvalObjEx
cb90: 28 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74  (interp, pScript
cba0: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 0);.    }.  }.
cbb0: 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  .  Tcl_DecrRefCo
cbc0: 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 20 20  unt(pScript);.  
cbd0: 64 62 45 76 61 6c 46 69 6e 61 6c 69 7a 65 28 70  dbEvalFinalize(p
cbe0: 29 3b 0a 20 20 54 63 6c 5f 46 72 65 65 28 28 63  );.  Tcl_Free((c
cbf0: 68 61 72 20 2a 29 70 29 3b 0a 0a 20 20 69 66 28  har *)p);..  if(
cc00: 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 72   rc==TCL_OK || r
cc10: 63 3d 3d 54 43 4c 5f 42 52 45 41 4b 20 29 7b 0a  c==TCL_BREAK ){.
cc20: 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73      Tcl_ResetRes
cc30: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  ult(interp);.   
cc40: 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20   rc = TCL_OK;.  
cc50: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
cc60: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 22 73 71 6c  ../*.** The "sql
cc70: 69 74 65 22 20 63 6f 6d 6d 61 6e 64 20 62 65 6c  ite" command bel
cc80: 6f 77 20 63 72 65 61 74 65 73 20 61 20 6e 65 77  ow creates a new
cc90: 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 66 6f 72   Tcl command for
cca0: 20 65 61 63 68 0a 2a 2a 20 63 6f 6e 6e 65 63 74   each.** connect
ccb0: 69 6f 6e 20 69 74 20 6f 70 65 6e 73 20 74 6f 20  ion it opens to 
ccc0: 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  an SQLite databa
ccd0: 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  se.  This routin
cce0: 65 20 69 73 20 69 6e 76 6f 6b 65 64 0a 2a 2a 20  e is invoked.** 
ccf0: 77 68 65 6e 65 76 65 72 20 6f 6e 65 20 6f 66 20  whenever one of 
cd00: 74 68 6f 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  those connection
cd10: 2d 73 70 65 63 69 66 69 63 20 63 6f 6d 6d 61 6e  -specific comman
cd20: 64 73 20 69 73 20 65 78 65 63 75 74 65 64 0a 2a  ds is executed.*
cd30: 2a 20 69 6e 20 54 63 6c 2e 20 20 46 6f 72 20 65  * in Tcl.  For e
cd40: 78 61 6d 70 6c 65 2c 20 69 66 20 79 6f 75 20 72  xample, if you r
cd50: 75 6e 20 54 63 6c 20 63 6f 64 65 20 6c 69 6b 65  un Tcl code like
cd60: 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
cd70: 20 20 20 73 71 6c 69 74 65 33 20 64 62 31 20 20     sqlite3 db1  
cd80: 22 6d 79 5f 64 61 74 61 62 61 73 65 22 0a 2a 2a  "my_database".**
cd90: 20 20 20 20 20 20 20 64 62 31 20 63 6c 6f 73 65         db1 close
cda0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
cdb0: 20 63 6f 6d 6d 61 6e 64 20 6f 70 65 6e 73 20 61   command opens a
cdc0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74   connection to t
cdd0: 68 65 20 22 6d 79 5f 64 61 74 61 62 61 73 65 22  he "my_database"
cde0: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 61 6e 64   database.** and
cdf0: 20 63 61 6c 6c 73 20 74 68 61 74 20 63 6f 6e 6e   calls that conn
ce00: 65 63 74 69 6f 6e 20 22 64 62 31 22 2e 20 20 54  ection "db1".  T
ce10: 68 65 20 73 65 63 6f 6e 64 20 63 6f 6d 6d 61 6e  he second comman
ce20: 64 20 63 61 75 73 65 73 20 74 68 69 73 0a 2a 2a  d causes this.**
ce30: 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 62   subroutine to b
ce40: 65 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a 73 74  e invoked..*/.st
ce50: 61 74 69 63 20 69 6e 74 20 44 62 4f 62 6a 43 6d  atic int DbObjCm
ce60: 64 28 76 6f 69 64 20 2a 63 64 2c 20 54 63 6c 5f  d(void *cd, Tcl_
ce70: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
ce80: 69 6e 74 20 6f 62 6a 63 2c 54 63 6c 5f 4f 62 6a  int objc,Tcl_Obj
ce90: 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76 29 7b 0a 20   *const*objv){. 
cea0: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
ceb0: 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a   (SqliteDb*)cd;.
cec0: 20 20 69 6e 74 20 63 68 6f 69 63 65 3b 0a 20 20    int choice;.  
ced0: 69 6e 74 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b  int rc = TCL_OK;
cee0: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
cef0: 63 68 61 72 20 2a 44 42 5f 73 74 72 73 5b 5d 20  char *DB_strs[] 
cf00: 3d 20 7b 0a 20 20 20 20 22 61 75 74 68 6f 72 69  = {.    "authori
cf10: 7a 65 72 22 2c 20 20 20 20 20 20 20 20 20 22 62  zer",         "b
cf20: 61 63 6b 75 70 22 2c 20 20 20 20 20 20 20 20 20  ackup",         
cf30: 20 20 20 22 62 75 73 79 22 2c 0a 20 20 20 20 22     "busy",.    "
cf40: 63 61 63 68 65 22 2c 20 20 20 20 20 20 20 20 20  cache",         
cf50: 20 20 20 20 20 22 63 68 61 6e 67 65 73 22 2c 20       "changes", 
cf60: 20 20 20 20 20 20 20 20 20 20 22 63 6c 6f 73 65            "close
cf70: 22 2c 0a 20 20 20 20 22 63 6f 6c 6c 61 74 65 22  ",.    "collate"
cf80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6f  ,            "co
cf90: 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 22 2c  llation_needed",
cfa0: 20 20 22 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 22 2c    "commit_hook",
cfb0: 0a 20 20 20 20 22 63 6f 6d 70 6c 65 74 65 22 2c  .    "complete",
cfc0: 20 20 20 20 20 20 20 20 20 20 20 22 63 6f 70 79             "copy
cfd0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
cfe0: 22 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74  "enable_load_ext
cff0: 65 6e 73 69 6f 6e 22 2c 0a 20 20 20 20 22 65 72  ension",.    "er
d000: 72 6f 72 63 6f 64 65 22 2c 20 20 20 20 20 20 20  rorcode",       
d010: 20 20 20 22 65 76 61 6c 22 2c 20 20 20 20 20 20     "eval",      
d020: 20 20 20 20 20 20 20 20 22 65 78 69 73 74 73 22          "exists"
d030: 2c 0a 20 20 20 20 22 66 75 6e 63 74 69 6f 6e 22  ,.    "function"
d040: 2c 20 20 20 20 20 20 20 20 20 20 20 22 69 6e 63  ,           "inc
d050: 72 62 6c 6f 62 22 2c 20 20 20 20 20 20 20 20 20  rblob",         
d060: 20 22 69 6e 74 65 72 72 75 70 74 22 2c 0a 20 20   "interrupt",.  
d070: 20 20 22 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72    "last_insert_r
d080: 6f 77 69 64 22 2c 20 20 22 6e 75 6c 6c 76 61 6c  owid",  "nullval
d090: 75 65 22 2c 20 20 20 20 20 20 20 20 20 22 6f 6e  ue",         "on
d0a0: 65 63 6f 6c 75 6d 6e 22 2c 0a 20 20 20 20 22 70  ecolumn",.    "p
d0b0: 72 6f 66 69 6c 65 22 2c 20 20 20 20 20 20 20 20  rofile",        
d0c0: 20 20 20 20 22 70 72 6f 67 72 65 73 73 22 2c 20      "progress", 
d0d0: 20 20 20 20 20 20 20 20 20 22 72 65 6b 65 79 22           "rekey"
d0e0: 2c 0a 20 20 20 20 22 72 65 73 74 6f 72 65 22 2c  ,.    "restore",
d0f0: 20 20 20 20 20 20 20 20 20 20 20 20 22 72 6f 6c              "rol
d100: 6c 62 61 63 6b 5f 68 6f 6f 6b 22 2c 20 20 20 20  lback_hook",    
d110: 20 22 73 74 61 74 75 73 22 2c 0a 20 20 20 20 22   "status",.    "
d120: 74 69 6d 65 6f 75 74 22 2c 20 20 20 20 20 20 20  timeout",       
d130: 20 20 20 20 20 22 74 6f 74 61 6c 5f 63 68 61 6e       "total_chan
d140: 67 65 73 22 2c 20 20 20 20 20 22 74 72 61 63 65  ges",     "trace
d150: 22 2c 0a 20 20 20 20 22 74 72 61 6e 73 61 63 74  ",.    "transact
d160: 69 6f 6e 22 2c 20 20 20 20 20 20 20 20 22 75 6e  ion",        "un
d170: 6c 6f 63 6b 5f 6e 6f 74 69 66 79 22 2c 20 20 20  lock_notify",   
d180: 20 20 22 75 70 64 61 74 65 5f 68 6f 6f 6b 22 2c    "update_hook",
d190: 0a 20 20 20 20 22 76 65 72 73 69 6f 6e 22 2c 20  .    "version", 
d1a0: 20 20 20 20 20 20 20 20 20 20 20 22 77 61 6c 5f             "wal_
d1b0: 68 6f 6f 6b 22 2c 20 20 20 20 20 20 20 20 20 20  hook",          
d1c0: 30 0a 20 20 7d 3b 0a 20 20 65 6e 75 6d 20 44 42  0.  };.  enum DB
d1d0: 5f 65 6e 75 6d 20 7b 0a 20 20 20 20 44 42 5f 41  _enum {.    DB_A
d1e0: 55 54 48 4f 52 49 5a 45 52 2c 20 20 20 20 20 20  UTHORIZER,      
d1f0: 20 20 44 42 5f 42 41 43 4b 55 50 2c 20 20 20 20    DB_BACKUP,    
d200: 20 20 20 20 20 20 20 44 42 5f 42 55 53 59 2c 0a         DB_BUSY,.
d210: 20 20 20 20 44 42 5f 43 41 43 48 45 2c 20 20 20      DB_CACHE,   
d220: 20 20 20 20 20 20 20 20 20 20 44 42 5f 43 48 41            DB_CHA
d230: 4e 47 45 53 2c 20 20 20 20 20 20 20 20 20 20 44  NGES,          D
d240: 42 5f 43 4c 4f 53 45 2c 0a 20 20 20 20 44 42 5f  B_CLOSE,.    DB_
d250: 43 4f 4c 4c 41 54 45 2c 20 20 20 20 20 20 20 20  COLLATE,        
d260: 20 20 20 44 42 5f 43 4f 4c 4c 41 54 49 4f 4e 5f     DB_COLLATION_
d270: 4e 45 45 44 45 44 2c 20 44 42 5f 43 4f 4d 4d 49  NEEDED, DB_COMMI
d280: 54 5f 48 4f 4f 4b 2c 0a 20 20 20 20 44 42 5f 43  T_HOOK,.    DB_C
d290: 4f 4d 50 4c 45 54 45 2c 20 20 20 20 20 20 20 20  OMPLETE,        
d2a0: 20 20 44 42 5f 43 4f 50 59 2c 20 20 20 20 20 20    DB_COPY,      
d2b0: 20 20 20 20 20 20 20 44 42 5f 45 4e 41 42 4c 45         DB_ENABLE
d2c0: 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 2c  _LOAD_EXTENSION,
d2d0: 0a 20 20 20 20 44 42 5f 45 52 52 4f 52 43 4f 44  .    DB_ERRORCOD
d2e0: 45 2c 20 20 20 20 20 20 20 20 20 44 42 5f 45 56  E,         DB_EV
d2f0: 41 4c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  AL,             
d300: 44 42 5f 45 58 49 53 54 53 2c 0a 20 20 20 20 44  DB_EXISTS,.    D
d310: 42 5f 46 55 4e 43 54 49 4f 4e 2c 20 20 20 20 20  B_FUNCTION,     
d320: 20 20 20 20 20 44 42 5f 49 4e 43 52 42 4c 4f 42       DB_INCRBLOB
d330: 2c 20 20 20 20 20 20 20 20 20 44 42 5f 49 4e 54  ,         DB_INT
d340: 45 52 52 55 50 54 2c 0a 20 20 20 20 44 42 5f 4c  ERRUPT,.    DB_L
d350: 41 53 54 5f 49 4e 53 45 52 54 5f 52 4f 57 49 44  AST_INSERT_ROWID
d360: 2c 20 44 42 5f 4e 55 4c 4c 56 41 4c 55 45 2c 20  , DB_NULLVALUE, 
d370: 20 20 20 20 20 20 20 44 42 5f 4f 4e 45 43 4f 4c         DB_ONECOL
d380: 55 4d 4e 2c 0a 20 20 20 20 44 42 5f 50 52 4f 46  UMN,.    DB_PROF
d390: 49 4c 45 2c 20 20 20 20 20 20 20 20 20 20 20 44  ILE,           D
d3a0: 42 5f 50 52 4f 47 52 45 53 53 2c 20 20 20 20 20  B_PROGRESS,     
d3b0: 20 20 20 20 44 42 5f 52 45 4b 45 59 2c 0a 20 20      DB_REKEY,.  
d3c0: 20 20 44 42 5f 52 45 53 54 4f 52 45 2c 20 20 20    DB_RESTORE,   
d3d0: 20 20 20 20 20 20 20 20 44 42 5f 52 4f 4c 4c 42          DB_ROLLB
d3e0: 41 43 4b 5f 48 4f 4f 4b 2c 20 20 20 20 44 42 5f  ACK_HOOK,    DB_
d3f0: 53 54 41 54 55 53 2c 0a 20 20 20 20 44 42 5f 54  STATUS,.    DB_T
d400: 49 4d 45 4f 55 54 2c 20 20 20 20 20 20 20 20 20  IMEOUT,         
d410: 20 20 44 42 5f 54 4f 54 41 4c 5f 43 48 41 4e 47    DB_TOTAL_CHANG
d420: 45 53 2c 20 20 20 20 44 42 5f 54 52 41 43 45 2c  ES,    DB_TRACE,
d430: 0a 20 20 20 20 44 42 5f 54 52 41 4e 53 41 43 54  .    DB_TRANSACT
d440: 49 4f 4e 2c 20 20 20 20 20 20 20 44 42 5f 55 4e  ION,       DB_UN
d450: 4c 4f 43 4b 5f 4e 4f 54 49 46 59 2c 20 20 20 20  LOCK_NOTIFY,    
d460: 44 42 5f 55 50 44 41 54 45 5f 48 4f 4f 4b 2c 0a  DB_UPDATE_HOOK,.
d470: 20 20 20 20 44 42 5f 56 45 52 53 49 4f 4e 2c 20      DB_VERSION, 
d480: 20 20 20 20 20 20 20 20 20 20 44 42 5f 57 41 4c            DB_WAL
d490: 5f 48 4f 4f 4b 0a 20 20 7d 3b 0a 20 20 2f 2a 20  _HOOK.  };.  /* 
d4a0: 64 6f 6e 27 74 20 6c 65 61 76 65 20 74 72 61 69  don't leave trai
d4b0: 6c 69 6e 67 20 63 6f 6d 6d 61 73 20 6f 6e 20 44  ling commas on D
d4c0: 42 5f 65 6e 75 6d 2c 20 69 74 20 63 6f 6e 66 75  B_enum, it confu
d4d0: 73 65 73 20 74 68 65 20 41 49 58 20 78 6c 63 20  ses the AIX xlc 
d4e0: 63 6f 6d 70 69 6c 65 72 20 2a 2f 0a 0a 20 20 69  compiler */..  i
d4f0: 66 28 20 6f 62 6a 63 3c 32 20 29 7b 0a 20 20 20  f( objc<2 ){.   
d500: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
d510: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
d520: 76 2c 20 22 53 55 42 43 4f 4d 4d 41 4e 44 20 2e  v, "SUBCOMMAND .
d530: 2e 2e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ..");.    return
d540: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
d550: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 64    if( Tcl_GetInd
d560: 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  exFromObj(interp
d570: 2c 20 6f 62 6a 76 5b 31 5d 2c 20 44 42 5f 73 74  , objv[1], DB_st
d580: 72 73 2c 20 22 6f 70 74 69 6f 6e 22 2c 20 30 2c  rs, "option", 0,
d590: 20 26 63 68 6f 69 63 65 29 20 29 7b 0a 20 20 20   &choice) ){.   
d5a0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
d5b0: 52 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68  R;.  }..  switch
d5c0: 28 20 28 65 6e 75 6d 20 44 42 5f 65 6e 75 6d 29  ( (enum DB_enum)
d5d0: 63 68 6f 69 63 65 20 29 7b 0a 0a 20 20 2f 2a 20  choice ){..  /* 
d5e0: 20 20 20 24 64 62 20 61 75 74 68 6f 72 69 7a 65     $db authorize
d5f0: 72 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a  r ?CALLBACK?.  *
d600: 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  *.  ** Invoke th
d610: 65 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b  e given callback
d620: 20 74 6f 20 61 75 74 68 6f 72 69 7a 65 20 65 61   to authorize ea
d630: 63 68 20 53 51 4c 20 6f 70 65 72 61 74 69 6f 6e  ch SQL operation
d640: 20 61 73 20 69 74 20 69 73 0a 20 20 2a 2a 20 63   as it is.  ** c
d650: 6f 6d 70 69 6c 65 64 2e 20 20 35 20 61 72 67 75  ompiled.  5 argu
d660: 6d 65 6e 74 73 20 61 72 65 20 61 70 70 65 6e 64  ments are append
d670: 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61  ed to the callba
d680: 63 6b 20 62 65 66 6f 72 65 20 69 74 20 69 73 0a  ck before it is.
d690: 20 20 2a 2a 20 69 6e 76 6f 6b 65 64 3a 0a 20 20    ** invoked:.  
d6a0: 2a 2a 0a 20 20 2a 2a 20 20 20 28 31 29 20 54 68  **.  **   (1) Th
d6b0: 65 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  e authorization 
d6c0: 74 79 70 65 20 28 65 78 3a 20 53 51 4c 49 54 45  type (ex: SQLITE
d6d0: 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 2c 20 53  _CREATE_TABLE, S
d6e0: 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 2e 2e  QLITE_INSERT, ..
d6f0: 2e 29 0a 20 20 2a 2a 20 20 20 28 32 29 20 46 69  .).  **   (2) Fi
d700: 72 73 74 20 64 65 73 63 72 69 70 74 69 76 65 20  rst descriptive 
d710: 6e 61 6d 65 20 28 64 65 70 65 6e 64 73 20 6f 6e  name (depends on
d720: 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74   authorization t
d730: 79 70 65 29 0a 20 20 2a 2a 20 20 20 28 33 29 20  ype).  **   (3) 
d740: 53 65 63 6f 6e 64 20 64 65 73 63 72 69 70 74 69  Second descripti
d750: 76 65 20 6e 61 6d 65 0a 20 20 2a 2a 20 20 20 28  ve name.  **   (
d760: 34 29 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  4) Name of the d
d770: 61 74 61 62 61 73 65 20 28 65 78 3a 20 22 6d 61  atabase (ex: "ma
d780: 69 6e 22 2c 20 22 74 65 6d 70 22 29 0a 20 20 2a  in", "temp").  *
d790: 2a 20 20 20 28 35 29 20 4e 61 6d 65 20 6f 66 20  *   (5) Name of 
d7a0: 74 72 69 67 67 65 72 20 74 68 61 74 20 69 73 20  trigger that is 
d7b0: 64 6f 69 6e 67 20 74 68 65 20 61 63 63 65 73 73  doing the access
d7c0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63  .  **.  ** The c
d7d0: 61 6c 6c 62 61 63 6b 20 73 68 6f 75 6c 64 20 72  allback should r
d7e0: 65 74 75 72 6e 20 6f 6e 20 6f 66 20 74 68 65 20  eturn on of the 
d7f0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 69 6e 67  following string
d800: 73 3a 20 53 51 4c 49 54 45 5f 4f 4b 2c 0a 20 20  s: SQLITE_OK,.  
d810: 2a 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  ** SQLITE_IGNORE
d820: 2c 20 6f 72 20 53 51 4c 49 54 45 5f 44 45 4e 59  , or SQLITE_DENY
d830: 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74  .  Any other ret
d840: 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61 6e 20  urn value is an 
d850: 65 72 72 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  error..  **.  **
d860: 20 49 66 20 74 68 69 73 20 6d 65 74 68 6f 64 20   If this method 
d870: 69 73 20 69 6e 76 6f 6b 65 64 20 77 69 74 68 20  is invoked with 
d880: 6e 6f 20 61 72 67 75 6d 65 6e 74 73 2c 20 74 68  no arguments, th
d890: 65 20 63 75 72 72 65 6e 74 20 61 75 74 68 6f 72  e current author
d8a0: 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 63 61 6c  ization.  ** cal
d8b0: 6c 62 61 63 6b 20 73 74 72 69 6e 67 20 69 73 20  lback string is 
d8c0: 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2f 0a 20  returned..  */. 
d8d0: 20 63 61 73 65 20 44 42 5f 41 55 54 48 4f 52 49   case DB_AUTHORI
d8e0: 5a 45 52 3a 20 7b 0a 23 69 66 64 65 66 20 53 51  ZER: {.#ifdef SQ
d8f0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
d900: 49 5a 41 54 49 4f 4e 0a 20 20 20 20 54 63 6c 5f  IZATION.    Tcl_
d910: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
d920: 65 72 70 2c 20 22 61 75 74 68 6f 72 69 7a 61 74  erp, "authorizat
d930: 69 6f 6e 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  ion not availabl
d940: 65 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64 22  e in this build"
d950: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d960: 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 30 29         (char*)0)
d970: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
d980: 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20  _ERROR;.#else.  
d990: 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a    if( objc>3 ){.
d9a0: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
d9b0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
d9c0: 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41  , objv, "?CALLBA
d9d0: 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74  CK?");.      ret
d9e0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
d9f0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a     }else if( obj
da00: 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66  c==2 ){.      if
da10: 28 20 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a  ( pDb->zAuth ){.
da20: 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65          Tcl_Appe
da30: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
da40: 20 70 44 62 2d 3e 7a 41 75 74 68 2c 20 28 63 68   pDb->zAuth, (ch
da50: 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ar*)0);.      }.
da60: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
da70: 20 63 68 61 72 20 2a 7a 41 75 74 68 3b 0a 20 20   char *zAuth;.  
da80: 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
da90: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74     if( pDb->zAut
daa0: 68 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  h ){.        Tcl
dab0: 5f 46 72 65 65 28 70 44 62 2d 3e 7a 41 75 74 68  _Free(pDb->zAuth
dac0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
dad0: 20 7a 41 75 74 68 20 3d 20 54 63 6c 5f 47 65 74   zAuth = Tcl_Get
dae0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
daf0: 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20  jv[2], &len);.  
db00: 20 20 20 20 69 66 28 20 7a 41 75 74 68 20 26 26      if( zAuth &&
db10: 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20   len>0 ){.      
db20: 20 20 70 44 62 2d 3e 7a 41 75 74 68 20 3d 20 54    pDb->zAuth = T
db30: 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20  cl_Alloc( len + 
db40: 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  1 );.        mem
db50: 63 70 79 28 70 44 62 2d 3e 7a 41 75 74 68 2c 20  cpy(pDb->zAuth, 
db60: 7a 41 75 74 68 2c 20 6c 65 6e 2b 31 29 3b 0a 20  zAuth, len+1);. 
db70: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
db80: 20 20 20 20 70 44 62 2d 3e 7a 41 75 74 68 20 3d      pDb->zAuth =
db90: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
dba0: 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74 68    if( pDb->zAuth
dbb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 74 79 70 65   ){.        type
dbc0: 64 65 66 20 69 6e 74 20 28 2a 73 71 6c 69 74 65  def int (*sqlite
dbd0: 33 5f 61 75 74 68 5f 63 62 29 28 0a 20 20 20 20  3_auth_cb)(.    
dbe0: 20 20 20 20 20 20 20 76 6f 69 64 2a 2c 69 6e 74         void*,int
dbf0: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e  ,const char*,con
dc00: 73 74 20 63 68 61 72 2a 2c 0a 20 20 20 20 20 20  st char*,.      
dc10: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 2a       const char*
dc20: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20  ,const char*);. 
dc30: 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65         pDb->inte
dc40: 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20  rp = interp;.   
dc50: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74       sqlite3_set
dc60: 5f 61 75 74 68 6f 72 69 7a 65 72 28 70 44 62 2d  _authorizer(pDb-
dc70: 3e 64 62 2c 28 73 71 6c 69 74 65 33 5f 61 75 74  >db,(sqlite3_aut
dc80: 68 5f 63 62 29 61 75 74 68 5f 63 61 6c 6c 62 61  h_cb)auth_callba
dc90: 63 6b 2c 70 44 62 29 3b 0a 20 20 20 20 20 20 7d  ck,pDb);.      }
dca0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
dcb0: 6c 69 74 65 33 5f 73 65 74 5f 61 75 74 68 6f 72  lite3_set_author
dcc0: 69 7a 65 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c  izer(pDb->db, 0,
dcd0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
dce0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72   }.#endif.    br
dcf0: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
dd00: 20 20 24 64 62 20 62 61 63 6b 75 70 20 3f 44 41    $db backup ?DA
dd10: 54 41 42 41 53 45 3f 20 46 49 4c 45 4e 41 4d 45  TABASE? FILENAME
dd20: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 70 65 6e 20  .  **.  ** Open 
dd30: 6f 72 20 63 72 65 61 74 65 20 61 20 64 61 74 61  or create a data
dd40: 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 64 20  base file named 
dd50: 46 49 4c 45 4e 41 4d 45 2e 20 20 54 72 61 6e 73  FILENAME.  Trans
dd60: 66 65 72 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6e  fer the.  ** con
dd70: 74 65 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 64 61  tent of local da
dd80: 74 61 62 61 73 65 20 44 41 54 41 42 41 53 45 20  tabase DATABASE 
dd90: 28 64 65 66 61 75 6c 74 3a 20 22 6d 61 69 6e 22  (default: "main"
dda0: 29 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20  ) into the.  ** 
ddb0: 46 49 4c 45 4e 41 4d 45 20 64 61 74 61 62 61 73  FILENAME databas
ddc0: 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  e..  */.  case D
ddd0: 42 5f 42 41 43 4b 55 50 3a 20 7b 0a 20 20 20 20  B_BACKUP: {.    
dde0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 73  const char *zDes
ddf0: 74 46 69 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74  tFile;.    const
de00: 20 63 68 61 72 20 2a 7a 53 72 63 44 62 3b 0a 20   char *zSrcDb;. 
de10: 20 20 20 73 71 6c 69 74 65 33 20 2a 70 44 65 73     sqlite3 *pDes
de20: 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  t;.    sqlite3_b
de30: 61 63 6b 75 70 20 2a 70 42 61 63 6b 75 70 3b 0a  ackup *pBackup;.
de40: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33  .    if( objc==3
de50: 20 29 7b 0a 20 20 20 20 20 20 7a 53 72 63 44 62   ){.      zSrcDb
de60: 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 20   = "main";.     
de70: 20 7a 44 65 73 74 46 69 6c 65 20 3d 20 54 63 6c   zDestFile = Tcl
de80: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
de90: 32 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  2]);.    }else i
dea0: 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20  f( objc==4 ){.  
deb0: 20 20 20 20 7a 53 72 63 44 62 20 3d 20 54 63 6c      zSrcDb = Tcl
dec0: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
ded0: 32 5d 29 3b 0a 20 20 20 20 20 20 7a 44 65 73 74  2]);.      zDest
dee0: 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  File = Tcl_GetSt
def0: 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20  ring(objv[3]);. 
df00: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
df10: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
df20: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
df30: 2c 20 22 3f 44 41 54 41 42 41 53 45 3f 20 46 49  , "?DATABASE? FI
df40: 4c 45 4e 41 4d 45 22 29 3b 0a 20 20 20 20 20 20  LENAME");.      
df50: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
df60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
df70: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 44   sqlite3_open(zD
df80: 65 73 74 46 69 6c 65 2c 20 26 70 44 65 73 74 29  estFile, &pDest)
df90: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
dfa0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
dfb0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
dfc0: 74 28 69 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f  t(interp, "canno
dfd0: 74 20 6f 70 65 6e 20 74 61 72 67 65 74 20 64 61  t open target da
dfe0: 74 61 62 61 73 65 3a 20 22 2c 0a 20 20 20 20 20  tabase: ",.     
dff0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72        sqlite3_er
e000: 72 6d 73 67 28 70 44 65 73 74 29 2c 20 28 63 68  rmsg(pDest), (ch
e010: 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 73 71  ar*)0);.      sq
e020: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 44 65 73  lite3_close(pDes
e030: 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
e040: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
e050: 7d 0a 20 20 20 20 70 42 61 63 6b 75 70 20 3d 20  }.    pBackup = 
e060: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 69  sqlite3_backup_i
e070: 6e 69 74 28 70 44 65 73 74 2c 20 22 6d 61 69 6e  nit(pDest, "main
e080: 22 2c 20 70 44 62 2d 3e 64 62 2c 20 7a 53 72 63  ", pDb->db, zSrc
e090: 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70 42 61  Db);.    if( pBa
e0a0: 63 6b 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ckup==0 ){.     
e0b0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
e0c0: 74 28 69 6e 74 65 72 70 2c 20 22 62 61 63 6b 75  t(interp, "backu
e0d0: 70 20 66 61 69 6c 65 64 3a 20 22 2c 0a 20 20 20  p failed: ",.   
e0e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
e0f0: 65 72 72 6d 73 67 28 70 44 65 73 74 29 2c 20 28  errmsg(pDest), (
e100: 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
e110: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 44  sqlite3_close(pD
e120: 65 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  est);.      retu
e130: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
e140: 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 20    }.    while(  
e150: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 61  (rc = sqlite3_ba
e160: 63 6b 75 70 5f 73 74 65 70 28 70 42 61 63 6b 75  ckup_step(pBacku
e170: 70 2c 31 30 30 29 29 3d 3d 53 51 4c 49 54 45 5f  p,100))==SQLITE_
e180: 4f 4b 20 29 7b 7d 0a 20 20 20 20 73 71 6c 69 74  OK ){}.    sqlit
e190: 65 33 5f 62 61 63 6b 75 70 5f 66 69 6e 69 73 68  e3_backup_finish
e1a0: 28 70 42 61 63 6b 75 70 29 3b 0a 20 20 20 20 69  (pBackup);.    i
e1b0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
e1c0: 4e 45 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  NE ){.      rc =
e1d0: 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c   TCL_OK;.    }el
e1e0: 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  se{.      Tcl_Ap
e1f0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
e200: 70 2c 20 22 62 61 63 6b 75 70 20 66 61 69 6c 65  p, "backup faile
e210: 64 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d: ",.          
e220: 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
e230: 70 44 65 73 74 29 2c 20 28 63 68 61 72 2a 29 30  pDest), (char*)0
e240: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43  );.      rc = TC
e250: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
e260: 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
e270: 28 70 44 65 73 74 29 3b 0a 20 20 20 20 62 72 65  (pDest);.    bre
e280: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
e290: 20 24 64 62 20 62 75 73 79 20 3f 43 41 4c 4c 42   $db busy ?CALLB
e2a0: 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ACK?.  **.  ** I
e2b0: 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20  nvoke the given 
e2c0: 63 61 6c 6c 62 61 63 6b 20 69 66 20 61 6e 20 53  callback if an S
e2d0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 74 74  QL statement att
e2e0: 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 0a 20 20  empts to open.  
e2f0: 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 64 61 74 61  ** a locked data
e300: 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  base file..  */.
e310: 20 20 63 61 73 65 20 44 42 5f 42 55 53 59 3a 20    case DB_BUSY: 
e320: 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33  {.    if( objc>3
e330: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
e340: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
e350: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 43 41 4c  p, 2, objv, "CAL
e360: 4c 42 41 43 4b 22 29 3b 0a 20 20 20 20 20 20 72  LBACK");.      r
e370: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
e380: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
e390: 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  bjc==2 ){.      
e3a0: 69 66 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29  if( pDb->zBusy )
e3b0: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70  {.        Tcl_Ap
e3c0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
e3d0: 70 2c 20 70 44 62 2d 3e 7a 42 75 73 79 2c 20 28  p, pDb->zBusy, (
e3e0: 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
e3f0: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
e400: 20 20 20 63 68 61 72 20 2a 7a 42 75 73 79 3b 0a     char *zBusy;.
e410: 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20        int len;. 
e420: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 42       if( pDb->zB
e430: 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20 54  usy ){.        T
e440: 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 42 75  cl_Free(pDb->zBu
e450: 73 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  sy);.      }.   
e460: 20 20 20 7a 42 75 73 79 20 3d 20 54 63 6c 5f 47     zBusy = Tcl_G
e470: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
e480: 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a  objv[2], &len);.
e490: 20 20 20 20 20 20 69 66 28 20 7a 42 75 73 79 20        if( zBusy 
e4a0: 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20  && len>0 ){.    
e4b0: 20 20 20 20 70 44 62 2d 3e 7a 42 75 73 79 20 3d      pDb->zBusy =
e4c0: 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20   Tcl_Alloc( len 
e4d0: 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d  + 1 );.        m
e4e0: 65 6d 63 70 79 28 70 44 62 2d 3e 7a 42 75 73 79  emcpy(pDb->zBusy
e4f0: 2c 20 7a 42 75 73 79 2c 20 6c 65 6e 2b 31 29 3b  , zBusy, len+1);
e500: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
e510: 20 20 20 20 20 20 70 44 62 2d 3e 7a 42 75 73 79        pDb->zBusy
e520: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
e530: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 42 75      if( pDb->zBu
e540: 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  sy ){.        pD
e550: 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65  b->interp = inte
e560: 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  rp;.        sqli
e570: 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72  te3_busy_handler
e580: 28 70 44 62 2d 3e 64 62 2c 20 44 62 42 75 73 79  (pDb->db, DbBusy
e590: 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20  Handler, pDb);. 
e5a0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
e5b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79      sqlite3_busy
e5c0: 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62  _handler(pDb->db
e5d0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
e5e0: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
e5f0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 20  ;.  }..  /*     
e600: 24 64 62 20 63 61 63 68 65 20 66 6c 75 73 68 0a  $db cache flush.
e610: 20 20 2a 2a 20 20 20 20 20 24 64 62 20 63 61 63    **     $db cac
e620: 68 65 20 73 69 7a 65 20 6e 0a 20 20 2a 2a 0a 20  he size n.  **. 
e630: 20 2a 2a 20 46 6c 75 73 68 20 74 68 65 20 70 72   ** Flush the pr
e640: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
e650: 20 63 61 63 68 65 2c 20 6f 72 20 73 65 74 20 74   cache, or set t
e660: 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
e670: 72 20 6f 66 0a 20 20 2a 2a 20 63 61 63 68 65 64  r of.  ** cached
e680: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a   statements..  *
e690: 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 41 43 48  /.  case DB_CACH
e6a0: 45 3a 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 73  E: {.    char *s
e6b0: 75 62 43 6d 64 3b 0a 20 20 20 20 69 6e 74 20 6e  ubCmd;.    int n
e6c0: 3b 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3c  ;..    if( objc<
e6d0: 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =2 ){.      Tcl_
e6e0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
e6f0: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63  erp, 1, objv, "c
e700: 61 63 68 65 20 6f 70 74 69 6f 6e 20 3f 61 72 67  ache option ?arg
e710: 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ?");.      retur
e720: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
e730: 20 7d 0a 20 20 20 20 73 75 62 43 6d 64 20 3d 20   }.    subCmd = 
e740: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
e750: 6d 4f 62 6a 28 20 6f 62 6a 76 5b 32 5d 2c 20 30  mObj( objv[2], 0
e760: 20 29 3b 0a 20 20 20 20 69 66 28 20 2a 73 75 62   );.    if( *sub
e770: 43 6d 64 3d 3d 27 66 27 20 26 26 20 73 74 72 63  Cmd=='f' && strc
e780: 6d 70 28 73 75 62 43 6d 64 2c 22 66 6c 75 73 68  mp(subCmd,"flush
e790: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
e7a0: 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
e7b0: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
e7c0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
e7d0: 2c 20 6f 62 6a 76 2c 20 22 66 6c 75 73 68 22 29  , objv, "flush")
e7e0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
e7f0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
e800: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e810: 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28   flushStmtCache(
e820: 20 70 44 62 20 29 3b 0a 20 20 20 20 20 20 7d 0a   pDb );.      }.
e830: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 2a 73      }else if( *s
e840: 75 62 43 6d 64 3d 3d 27 73 27 20 26 26 20 73 74  ubCmd=='s' && st
e850: 72 63 6d 70 28 73 75 62 43 6d 64 2c 22 73 69 7a  rcmp(subCmd,"siz
e860: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
e870: 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20  if( objc!=4 ){. 
e880: 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67         Tcl_Wrong
e890: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
e8a0: 32 2c 20 6f 62 6a 76 2c 20 22 73 69 7a 65 20 6e  2, objv, "size n
e8b0: 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ");.        retu
e8c0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
e8d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e8e0: 20 20 20 69 66 28 20 54 43 4c 5f 45 52 52 4f 52     if( TCL_ERROR
e8f0: 3d 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ==Tcl_GetIntFrom
e900: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
e910: 5b 33 5d 2c 20 26 6e 29 20 29 7b 0a 20 20 20 20  [3], &n) ){.    
e920: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
e930: 52 65 73 75 6c 74 28 20 69 6e 74 65 72 70 2c 20  Result( interp, 
e940: 22 63 61 6e 6e 6f 74 20 63 6f 6e 76 65 72 74 20  "cannot convert 
e950: 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  \"", .          
e960: 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
e970: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33  ngFromObj(objv[3
e980: 5d 2c 30 29 2c 20 22 5c 22 20 74 6f 20 69 6e 74  ],0), "\" to int
e990: 65 67 65 72 22 2c 20 28 63 68 61 72 2a 29 30 29  eger", (char*)0)
e9a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
e9b0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
e9c0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e9d0: 20 20 20 20 20 20 20 69 66 28 20 6e 3c 30 20 29         if( n<0 )
e9e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6c  {.            fl
e9f0: 75 73 68 53 74 6d 74 43 61 63 68 65 28 20 70 44  ushStmtCache( pD
ea00: 62 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  b );.           
ea10: 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   n = 0;.        
ea20: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3e 4d 41    }else if( n>MA
ea30: 58 5f 50 52 45 50 41 52 45 44 5f 53 54 4d 54 53  X_PREPARED_STMTS
ea40: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
ea50: 6e 20 3d 20 4d 41 58 5f 50 52 45 50 41 52 45 44  n = MAX_PREPARED
ea60: 5f 53 54 4d 54 53 3b 0a 20 20 20 20 20 20 20 20  _STMTS;.        
ea70: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 44    }.          pD
ea80: 62 2d 3e 6d 61 78 53 74 6d 74 20 3d 20 6e 3b 0a  b->maxStmt = n;.
ea90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
eaa0: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
eab0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
eac0: 75 6c 74 28 20 69 6e 74 65 72 70 2c 20 22 62 61  ult( interp, "ba
ead0: 64 20 6f 70 74 69 6f 6e 20 5c 22 22 2c 20 0a 20  d option \"", . 
eae0: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74           Tcl_Get
eaf0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
eb00: 6a 76 5b 32 5d 2c 30 29 2c 20 22 5c 22 3a 20 6d  jv[2],0), "\": m
eb10: 75 73 74 20 62 65 20 66 6c 75 73 68 20 6f 72 20  ust be flush or 
eb20: 73 69 7a 65 22 2c 0a 20 20 20 20 20 20 20 20 20  size",.         
eb30: 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
eb40: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
eb50: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72  OR;.    }.    br
eb60: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
eb70: 20 20 20 24 64 62 20 63 68 61 6e 67 65 73 0a 20     $db changes. 
eb80: 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20   **.  ** Return 
eb90: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
eba0: 77 73 20 74 68 61 74 20 77 65 72 65 20 6d 6f 64  ws that were mod
ebb0: 69 66 69 65 64 2c 20 69 6e 73 65 72 74 65 64 2c  ified, inserted,
ebc0: 20 6f 72 20 64 65 6c 65 74 65 64 20 62 79 0a 20   or deleted by. 
ebd0: 20 2a 2a 20 74 68 65 20 6d 6f 73 74 20 72 65 63   ** the most rec
ebe0: 65 6e 74 20 49 4e 53 45 52 54 2c 20 55 50 44 41  ent INSERT, UPDA
ebf0: 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61  TE or DELETE sta
ec00: 74 65 6d 65 6e 74 2c 20 6e 6f 74 20 69 6e 63 6c  tement, not incl
ec10: 75 64 69 6e 67 20 0a 20 20 2a 2a 20 61 6e 79 20  uding .  ** any 
ec20: 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20  changes made by 
ec30: 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73  trigger programs
ec40: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
ec50: 5f 43 48 41 4e 47 45 53 3a 20 7b 0a 20 20 20 20  _CHANGES: {.    
ec60: 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74  Tcl_Obj *pResult
ec70: 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ;.    if( objc!=
ec80: 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  2 ){.      Tcl_W
ec90: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
eca0: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 22 29  rp, 2, objv, "")
ecb0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
ecc0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
ecd0: 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63      pResult = Tc
ece0: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_GetObjResult(i
ecf0: 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f  nterp);.    Tcl_
ed00: 53 65 74 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c  SetIntObj(pResul
ed10: 74 2c 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  t, sqlite3_chang
ed20: 65 73 28 70 44 62 2d 3e 64 62 29 29 3b 0a 20 20  es(pDb->db));.  
ed30: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
ed40: 2f 2a 20 20 20 20 24 64 62 20 63 6c 6f 73 65 0a  /*    $db close.
ed50: 20 20 2a 2a 0a 20 20 2a 2a 20 53 68 75 74 64 6f    **.  ** Shutdo
ed60: 77 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  wn the database.
ed70: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43    */.  case DB_C
ed80: 4c 4f 53 45 3a 20 7b 0a 20 20 20 20 54 63 6c 5f  LOSE: {.    Tcl_
ed90: 44 65 6c 65 74 65 43 6f 6d 6d 61 6e 64 28 69 6e  DeleteCommand(in
eda0: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
edb0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
edc0: 30 5d 2c 20 30 29 29 3b 0a 20 20 20 20 62 72 65  0], 0));.    bre
edd0: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
ede0: 2a 2a 20 20 20 20 20 24 64 62 20 63 6f 6c 6c 61  **     $db colla
edf0: 74 65 20 4e 41 4d 45 20 53 43 52 49 50 54 0a 20  te NAME SCRIPT. 
ee00: 20 2a 2a 0a 20 20 2a 2a 20 43 72 65 61 74 65 20   **.  ** Create 
ee10: 61 20 6e 65 77 20 53 51 4c 20 63 6f 6c 6c 61 74  a new SQL collat
ee20: 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  ion function cal
ee30: 6c 65 64 20 4e 41 4d 45 2e 20 20 57 68 65 6e 65  led NAME.  Whene
ee40: 76 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 66 75  ver.  ** that fu
ee50: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
ee60: 2c 20 69 6e 76 6f 6b 65 20 53 43 52 49 50 54 20  , invoke SCRIPT 
ee70: 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  to evaluate the 
ee80: 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  function..  */. 
ee90: 20 63 61 73 65 20 44 42 5f 43 4f 4c 4c 41 54 45   case DB_COLLATE
eea0: 3a 20 7b 0a 20 20 20 20 53 71 6c 43 6f 6c 6c 61  : {.    SqlColla
eeb0: 74 65 20 2a 70 43 6f 6c 6c 61 74 65 3b 0a 20 20  te *pCollate;.  
eec0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
eed0: 20 20 20 63 68 61 72 20 2a 7a 53 63 72 69 70 74     char *zScript
eee0: 3b 0a 20 20 20 20 69 6e 74 20 6e 53 63 72 69 70  ;.    int nScrip
eef0: 74 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  t;.    if( objc!
ef00: 3d 34 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =4 ){.      Tcl_
ef10: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
ef20: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e  erp, 2, objv, "N
ef30: 41 4d 45 20 53 43 52 49 50 54 22 29 3b 0a 20 20  AME SCRIPT");.  
ef40: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
ef50: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
ef60: 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53  zName = Tcl_GetS
ef70: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
ef80: 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20 7a 53  v[2], 0);.    zS
ef90: 63 72 69 70 74 20 3d 20 54 63 6c 5f 47 65 74 53  cript = Tcl_GetS
efa0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
efb0: 76 5b 33 5d 2c 20 26 6e 53 63 72 69 70 74 29 3b  v[3], &nScript);
efc0: 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65 20 3d 20  .    pCollate = 
efd0: 28 53 71 6c 43 6f 6c 6c 61 74 65 2a 29 54 63 6c  (SqlCollate*)Tcl
efe0: 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  _Alloc( sizeof(*
eff0: 70 43 6f 6c 6c 61 74 65 29 20 2b 20 6e 53 63 72  pCollate) + nScr
f000: 69 70 74 20 2b 20 31 20 29 3b 0a 20 20 20 20 69  ipt + 1 );.    i
f010: 66 28 20 70 43 6f 6c 6c 61 74 65 3d 3d 30 20 29  f( pCollate==0 )
f020: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
f030: 52 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65 2d  R;.    pCollate-
f040: 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  >interp = interp
f050: 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65 2d 3e  ;.    pCollate->
f060: 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e 70 43 6f  pNext = pDb->pCo
f070: 6c 6c 61 74 65 3b 0a 20 20 20 20 70 43 6f 6c 6c  llate;.    pColl
f080: 61 74 65 2d 3e 7a 53 63 72 69 70 74 20 3d 20 28  ate->zScript = (
f090: 63 68 61 72 2a 29 26 70 43 6f 6c 6c 61 74 65 5b  char*)&pCollate[
f0a0: 31 5d 3b 0a 20 20 20 20 70 44 62 2d 3e 70 43 6f  1];.    pDb->pCo
f0b0: 6c 6c 61 74 65 20 3d 20 70 43 6f 6c 6c 61 74 65  llate = pCollate
f0c0: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 43 6f  ;.    memcpy(pCo
f0d0: 6c 6c 61 74 65 2d 3e 7a 53 63 72 69 70 74 2c 20  llate->zScript, 
f0e0: 7a 53 63 72 69 70 74 2c 20 6e 53 63 72 69 70 74  zScript, nScript
f0f0: 2b 31 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  +1);.    if( sql
f100: 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
f110: 61 74 69 6f 6e 28 70 44 62 2d 3e 64 62 2c 20 7a  ation(pDb->db, z
f120: 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54 46  Name, SQLITE_UTF
f130: 38 2c 20 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  8, .        pCol
f140: 6c 61 74 65 2c 20 74 63 6c 53 71 6c 43 6f 6c 6c  late, tclSqlColl
f150: 61 74 65 29 20 29 7b 0a 20 20 20 20 20 20 54 63  ate) ){.      Tc
f160: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
f170: 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69  rp, (char *)sqli
f180: 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e  te3_errmsg(pDb->
f190: 64 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c  db), TCL_VOLATIL
f1a0: 45 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  E);.      return
f1b0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
f1c0: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
f1d0: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20  ..  /*.  **     
f1e0: 24 64 62 20 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65  $db collation_ne
f1f0: 65 64 65 64 20 53 43 52 49 50 54 0a 20 20 2a 2a  eded SCRIPT.  **
f200: 0a 20 20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  .  ** Create a n
f210: 65 77 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e  ew SQL collation
f220: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64   function called
f230: 20 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76 65 72   NAME.  Whenever
f240: 0a 20 20 2a 2a 20 74 68 61 74 20 66 75 6e 63 74  .  ** that funct
f250: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
f260: 6e 76 6f 6b 65 20 53 43 52 49 50 54 20 74 6f 20  nvoke SCRIPT to 
f270: 65 76 61 6c 75 61 74 65 20 74 68 65 20 66 75 6e  evaluate the fun
f280: 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61  ction..  */.  ca
f290: 73 65 20 44 42 5f 43 4f 4c 4c 41 54 49 4f 4e 5f  se DB_COLLATION_
f2a0: 4e 45 45 44 45 44 3a 20 7b 0a 20 20 20 20 69 66  NEEDED: {.    if
f2b0: 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
f2c0: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
f2d0: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
f2e0: 62 6a 76 2c 20 22 53 43 52 49 50 54 22 29 3b 0a  bjv, "SCRIPT");.
f2f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
f300: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
f310: 20 20 69 66 28 20 70 44 62 2d 3e 70 43 6f 6c 6c    if( pDb->pColl
f320: 61 74 65 4e 65 65 64 65 64 20 29 7b 0a 20 20 20  ateNeeded ){.   
f330: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
f340: 75 6e 74 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74  unt(pDb->pCollat
f350: 65 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 7d 0a  eNeeded);.    }.
f360: 20 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74      pDb->pCollat
f370: 65 4e 65 65 64 65 64 20 3d 20 54 63 6c 5f 44 75  eNeeded = Tcl_Du
f380: 70 6c 69 63 61 74 65 4f 62 6a 28 6f 62 6a 76 5b  plicateObj(objv[
f390: 32 5d 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63  2]);.    Tcl_Inc
f3a0: 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70  rRefCount(pDb->p
f3b0: 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a  CollateNeeded);.
f3c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c      sqlite3_coll
f3d0: 61 74 69 6f 6e 5f 6e 65 65 64 65 64 28 70 44 62  ation_needed(pDb
f3e0: 2d 3e 64 62 2c 20 70 44 62 2c 20 74 63 6c 43 6f  ->db, pDb, tclCo
f3f0: 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20  llateNeeded);.  
f400: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
f410: 2f 2a 20 20 20 20 24 64 62 20 63 6f 6d 6d 69 74  /*    $db commit
f420: 5f 68 6f 6f 6b 20 3f 43 41 4c 4c 42 41 43 4b 3f  _hook ?CALLBACK?
f430: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b  .  **.  ** Invok
f440: 65 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c  e the given call
f450: 62 61 63 6b 20 6a 75 73 74 20 62 65 66 6f 72 65  back just before
f460: 20 63 6f 6d 6d 69 74 74 69 6e 67 20 65 76 65 72   committing ever
f470: 79 20 53 51 4c 20 74 72 61 6e 73 61 63 74 69 6f  y SQL transactio
f480: 6e 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 63  n..  ** If the c
f490: 61 6c 6c 62 61 63 6b 20 74 68 72 6f 77 73 20 61  allback throws a
f4a0: 6e 20 65 78 63 65 70 74 69 6f 6e 20 6f 72 20 72  n exception or r
f4b0: 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  eturns non-zero,
f4c0: 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 74   then the.  ** t
f4d0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 62  ransaction is ab
f4e0: 6f 72 74 65 64 2e 20 20 49 66 20 43 41 4c 4c 42  orted.  If CALLB
f4f0: 41 43 4b 20 69 73 20 61 6e 20 65 6d 70 74 79 20  ACK is an empty 
f500: 73 74 72 69 6e 67 2c 20 74 68 65 20 63 61 6c 6c  string, the call
f510: 62 61 63 6b 0a 20 20 2a 2a 20 69 73 20 64 69 73  back.  ** is dis
f520: 61 62 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61  abled..  */.  ca
f530: 73 65 20 44 42 5f 43 4f 4d 4d 49 54 5f 48 4f 4f  se DB_COMMIT_HOO
f540: 4b 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a  K: {.    if( obj
f550: 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  c>3 ){.      Tcl
f560: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
f570: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
f580: 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20  ?CALLBACK?");.  
f590: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
f5a0: 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20  RROR;.    }else 
f5b0: 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20  if( objc==2 ){. 
f5c0: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 43       if( pDb->zC
f5d0: 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  ommit ){.       
f5e0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
f5f0: 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a  t(interp, pDb->z
f600: 43 6f 6d 6d 69 74 2c 20 28 63 68 61 72 2a 29 30  Commit, (char*)0
f610: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
f620: 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73  else{.      cons
f630: 74 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b  t char *zCommit;
f640: 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a  .      int len;.
f650: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
f660: 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  Commit ){.      
f670: 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e    Tcl_Free(pDb->
f680: 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20  zCommit);.      
f690: 7d 0a 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20  }.      zCommit 
f6a0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
f6b0: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
f6c0: 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  &len);.      if(
f6d0: 20 7a 43 6f 6d 6d 69 74 20 26 26 20 6c 65 6e 3e   zCommit && len>
f6e0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  0 ){.        pDb
f6f0: 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20 54 63 6c 5f  ->zCommit = Tcl_
f700: 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29  Alloc( len + 1 )
f710: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
f720: 28 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 2c 20 7a  (pDb->zCommit, z
f730: 43 6f 6d 6d 69 74 2c 20 6c 65 6e 2b 31 29 3b 0a  Commit, len+1);.
f740: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f750: 20 20 20 20 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69       pDb->zCommi
f760: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 0;.      }. 
f770: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 43       if( pDb->zC
f780: 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  ommit ){.       
f790: 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69   pDb->interp = i
f7a0: 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73  nterp;.        s
f7b0: 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f  qlite3_commit_ho
f7c0: 6f 6b 28 70 44 62 2d 3e 64 62 2c 20 44 62 43 6f  ok(pDb->db, DbCo
f7d0: 6d 6d 69 74 48 61 6e 64 6c 65 72 2c 20 70 44 62  mmitHandler, pDb
f7e0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
f7f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
f800: 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 70 44 62 2d  commit_hook(pDb-
f810: 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  >db, 0, 0);.    
f820: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72    }.    }.    br
f830: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
f840: 20 20 24 64 62 20 63 6f 6d 70 6c 65 74 65 20 53    $db complete S
f850: 51 4c 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74  QL.  **.  ** Ret
f860: 75 72 6e 20 54 52 55 45 20 69 66 20 53 51 4c 20  urn TRUE if SQL 
f870: 69 73 20 61 20 63 6f 6d 70 6c 65 74 65 20 53 51  is a complete SQ
f880: 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 52 65  L statement.  Re
f890: 74 75 72 6e 20 46 41 4c 53 45 20 69 66 0a 20 20  turn FALSE if.  
f8a0: 2a 2a 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 69  ** additional li
f8b0: 6e 65 73 20 6f 66 20 69 6e 70 75 74 20 61 72 65  nes of input are
f8c0: 20 6e 65 65 64 65 64 2e 20 20 54 68 69 73 20 69   needed.  This i
f8d0: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65  s similar to the
f8e0: 0a 20 20 2a 2a 20 62 75 69 6c 74 2d 69 6e 20 22  .  ** built-in "
f8f0: 69 6e 66 6f 20 63 6f 6d 70 6c 65 74 65 22 20 63  info complete" c
f900: 6f 6d 6d 61 6e 64 20 6f 66 20 54 63 6c 2e 0a 20  ommand of Tcl.. 
f910: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f   */.  case DB_CO
f920: 4d 50 4c 45 54 45 3a 20 7b 0a 23 69 66 6e 64 65  MPLETE: {.#ifnde
f930: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
f940: 4d 50 4c 45 54 45 0a 20 20 20 20 54 63 6c 5f 4f  MPLETE.    Tcl_O
f950: 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20  bj *pResult;.   
f960: 20 69 6e 74 20 69 73 43 6f 6d 70 6c 65 74 65 3b   int isComplete;
f970: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  .    if( objc!=3
f980: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
f990: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
f9a0: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 51 4c  p, 2, objv, "SQL
f9b0: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
f9c0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
f9d0: 7d 0a 20 20 20 20 69 73 43 6f 6d 70 6c 65 74 65  }.    isComplete
f9e0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c   = sqlite3_compl
f9f0: 65 74 65 28 20 54 63 6c 5f 47 65 74 53 74 72 69  ete( Tcl_GetStri
fa00: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
fa10: 5d 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 52 65  ], 0) );.    pRe
fa20: 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62  sult = Tcl_GetOb
fa30: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  jResult(interp);
fa40: 0a 20 20 20 20 54 63 6c 5f 53 65 74 42 6f 6f 6c  .    Tcl_SetBool
fa50: 65 61 6e 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20  eanObj(pResult, 
fa60: 69 73 43 6f 6d 70 6c 65 74 65 29 3b 0a 23 65 6e  isComplete);.#en
fa70: 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  dif.    break;. 
fa80: 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20   }..  /*    $db 
fa90: 63 6f 70 79 20 63 6f 6e 66 6c 69 63 74 2d 61 6c  copy conflict-al
faa0: 67 6f 72 69 74 68 6d 20 74 61 62 6c 65 20 66 69  gorithm table fi
fab0: 6c 65 6e 61 6d 65 20 3f 53 45 50 41 52 41 54 4f  lename ?SEPARATO
fac0: 52 3f 20 3f 4e 55 4c 4c 49 4e 44 49 43 41 54 4f  R? ?NULLINDICATO
fad0: 52 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f 70  R?.  **.  ** Cop
fae0: 79 20 64 61 74 61 20 69 6e 74 6f 20 74 61 62 6c  y data into tabl
faf0: 65 20 66 72 6f 6d 20 66 69 6c 65 6e 61 6d 65 2c  e from filename,
fb00: 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 75 73 69 6e   optionally usin
fb10: 67 20 53 45 50 41 52 41 54 4f 52 0a 20 20 2a 2a  g SEPARATOR.  **
fb20: 20 61 73 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72   as column separ
fb30: 61 74 6f 72 73 2e 20 20 49 66 20 61 20 63 6f 6c  ators.  If a col
fb40: 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 20 6e  umn contains a n
fb50: 75 6c 6c 20 73 74 72 69 6e 67 2c 20 6f 72 20 74  ull string, or t
fb60: 68 65 0a 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66  he.  ** value of
fb70: 20 4e 55 4c 4c 49 4e 44 49 43 41 54 4f 52 2c 20   NULLINDICATOR, 
fb80: 61 20 4e 55 4c 4c 20 69 73 20 69 6e 73 65 72 74  a NULL is insert
fb90: 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  ed for the colum
fba0: 6e 2e 0a 20 20 2a 2a 20 63 6f 6e 66 6c 69 63 74  n..  ** conflict
fbb0: 2d 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 6f 6e  -algorithm is on
fbc0: 65 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 20  e of the sqlite 
fbd0: 63 6f 6e 66 6c 69 63 74 20 61 6c 67 6f 72 69 74  conflict algorit
fbe0: 68 6d 73 3a 0a 20 20 2a 2a 20 20 20 20 72 6f 6c  hms:.  **    rol
fbf0: 6c 62 61 63 6b 2c 20 61 62 6f 72 74 2c 20 66 61  lback, abort, fa
fc00: 69 6c 2c 20 69 67 6e 6f 72 65 2c 20 72 65 70 6c  il, ignore, repl
fc10: 61 63 65 0a 20 20 2a 2a 20 4f 6e 20 73 75 63 63  ace.  ** On succ
fc20: 65 73 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20  ess, return the 
fc30: 6e 75 6d 62 65 72 20 6f 66 20 6c 69 6e 65 73 20  number of lines 
fc40: 70 72 6f 63 65 73 73 65 64 2c 20 6e 6f 74 20 6e  processed, not n
fc50: 65 63 65 73 73 61 72 69 6c 79 20 73 61 6d 65 0a  ecessarily same.
fc60: 20 20 2a 2a 20 61 73 20 27 64 62 20 63 68 61 6e    ** as 'db chan
fc70: 67 65 73 27 20 64 75 65 20 74 6f 20 63 6f 6e 66  ges' due to conf
fc80: 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d 20 73  lict-algorithm s
fc90: 65 6c 65 63 74 65 64 2e 0a 20 20 2a 2a 0a 20 20  elected..  **.  
fca0: 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 69 73 20  ** This code is 
fcb0: 62 61 73 69 63 61 6c 6c 79 20 61 6e 20 69 6d 70  basically an imp
fcc0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 2f 65 6e 68 61  lementation/enha
fcd0: 6e 63 65 6d 65 6e 74 20 6f 66 0a 20 20 2a 2a 20  ncement of.  ** 
fce0: 74 68 65 20 73 71 6c 69 74 65 33 20 73 68 65 6c  the sqlite3 shel
fcf0: 6c 2e 63 20 22 2e 69 6d 70 6f 72 74 22 20 63 6f  l.c ".import" co
fd00: 6d 6d 61 6e 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  mmand..  **.  **
fd10: 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 75 73   This command us
fd20: 61 67 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e  age is equivalen
fd30: 74 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 32  t to the sqlite2
fd40: 2e 78 20 43 4f 50 59 20 73 74 61 74 65 6d 65 6e  .x COPY statemen
fd50: 74 2c 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 6d  t,.  ** which im
fd60: 70 6f 72 74 73 20 66 69 6c 65 20 64 61 74 61 20  ports file data 
fd70: 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 75 73 69  into a table usi
fd80: 6e 67 20 74 68 65 20 50 6f 73 74 67 72 65 53 51  ng the PostgreSQ
fd90: 4c 20 43 4f 50 59 20 66 69 6c 65 20 66 6f 72 6d  L COPY file form
fda0: 61 74 3a 0a 20 20 2a 2a 20 20 20 24 64 62 20 63  at:.  **   $db c
fdb0: 6f 70 79 20 24 63 6f 6e 66 6c 69 74 5f 61 6c 67  opy $conflit_alg
fdc0: 6f 20 24 74 61 62 6c 65 5f 6e 61 6d 65 20 24 66  o $table_name $f
fdd0: 69 6c 65 6e 61 6d 65 20 5c 74 20 5c 5c 4e 0a 20  ilename \t \\N. 
fde0: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f   */.  case DB_CO
fdf0: 50 59 3a 20 7b 0a 20 20 20 20 63 68 61 72 20 2a  PY: {.    char *
fe00: 7a 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20  zTable;         
fe10: 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20        /* Insert 
fe20: 64 61 74 61 20 69 6e 74 6f 20 74 68 69 73 20 74  data into this t
fe30: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72  able */.    char
fe40: 20 2a 7a 46 69 6c 65 3b 20 20 20 20 20 20 20 20   *zFile;        
fe50: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
fe60: 69 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20 74  ile from which t
fe70: 6f 20 65 78 74 72 61 63 74 20 64 61 74 61 20 2a  o extract data *
fe80: 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6e  /.    char *zCon
fe90: 66 6c 69 63 74 3b 20 20 20 20 20 20 20 20 20 20  flict;          
fea0: 20 20 2f 2a 20 54 68 65 20 63 6f 6e 66 6c 69 63    /* The conflic
feb0: 74 20 61 6c 67 6f 72 69 74 68 6d 20 74 6f 20 75  t algorithm to u
fec0: 73 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  se */.    sqlite
fed0: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20  3_stmt *pStmt;  
fee0: 20 20 20 20 20 20 2f 2a 20 41 20 73 74 61 74 65        /* A state
fef0: 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ment */.    int 
ff00: 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  nCol;           
ff10: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
ff20: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
ff30: 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  the table */.   
ff40: 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20   int nByte;     
ff50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ff60: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
ff70: 69 6e 20 61 6e 20 53 51 4c 20 73 74 72 69 6e 67  in an SQL string
ff80: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a   */.    int i, j
ff90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ffa0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
ffb0: 74 65 72 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ters */.    int 
ffc0: 6e 53 65 70 3b 20 20 20 20 20 20 20 20 20 20 20  nSep;           
ffd0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
ffe0: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 53  r of bytes in zS
fff0: 65 70 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ep[] */.    int 
10000 6e 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  nNull;          
10010 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
10020 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 4e  r of bytes in zN
10030 75 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 63 68 61  ull[] */.    cha
10040 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20 20  r *zSql;        
10050 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 53           /* An S
10060 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  QL statement */.
10070 20 20 20 20 63 68 61 72 20 2a 7a 4c 69 6e 65 3b      char *zLine;
10080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10090 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c 69 6e 65  /* A single line
100a0 20 6f 66 20 69 6e 70 75 74 20 66 72 6f 6d 20 74   of input from t
100b0 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 63  he file */.    c
100c0 68 61 72 20 2a 2a 61 7a 43 6f 6c 3b 20 20 20 20  har **azCol;    
100d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4c             /* zL
100e0 69 6e 65 5b 5d 20 62 72 6f 6b 65 6e 20 75 70 20  ine[] broken up 
100f0 69 6e 74 6f 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  into columns */.
10100 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
10110 7a 43 6f 6d 6d 69 74 3b 20 20 20 20 20 20 20 20  zCommit;        
10120 2f 2a 20 48 6f 77 20 74 6f 20 63 6f 6d 6d 69 74  /* How to commit
10130 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 20 20   changes */.    
10140 46 49 4c 45 20 2a 69 6e 3b 20 20 20 20 20 20 20  FILE *in;       
10150 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
10160 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f  he input file */
10170 0a 20 20 20 20 69 6e 74 20 6c 69 6e 65 6e 6f 20  .    int lineno 
10180 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
10190 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20   /* Line number 
101a0 6f 66 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f  of input file */
101b0 0a 20 20 20 20 63 68 61 72 20 7a 4c 69 6e 65 4e  .    char zLineN
101c0 75 6d 5b 38 30 5d 3b 20 20 20 20 20 20 20 20 20  um[80];         
101d0 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20   /* Line number 
101e0 70 72 69 6e 74 20 62 75 66 66 65 72 20 2a 2f 0a  print buffer */.
101f0 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65      Tcl_Obj *pRe
10200 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20  sult;           
10210 2f 2a 20 69 6e 74 65 72 70 20 72 65 73 75 6c 74  /* interp result
10220 20 2a 2f 0a 0a 20 20 20 20 63 6f 6e 73 74 20 63   */..    const c
10230 68 61 72 20 2a 7a 53 65 70 3b 0a 20 20 20 20 63  har *zSep;.    c
10240 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 75 6c 6c  onst char *zNull
10250 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3c 35  ;.    if( objc<5
10260 20 7c 7c 20 6f 62 6a 63 3e 37 20 29 7b 0a 20 20   || objc>7 ){.  
10270 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
10280 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
10290 6f 62 6a 76 2c 20 0a 20 20 20 20 20 20 20 20 20  objv, .         
102a0 22 43 4f 4e 46 4c 49 43 54 2d 41 4c 47 4f 52 49  "CONFLICT-ALGORI
102b0 54 48 4d 20 54 41 42 4c 45 20 46 49 4c 45 4e 41  THM TABLE FILENA
102c0 4d 45 20 3f 53 45 50 41 52 41 54 4f 52 3f 20 3f  ME ?SEPARATOR? ?
102d0 4e 55 4c 4c 49 4e 44 49 43 41 54 4f 52 3f 22 29  NULLINDICATOR?")
102e0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
102f0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
10300 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 3d 36 20      if( objc>=6 
10310 29 7b 0a 20 20 20 20 20 20 7a 53 65 70 20 3d 20  ){.      zSep = 
10320 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
10330 6d 4f 62 6a 28 6f 62 6a 76 5b 35 5d 2c 20 30 29  mObj(objv[5], 0)
10340 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
10350 20 20 20 7a 53 65 70 20 3d 20 22 5c 74 22 3b 0a     zSep = "\t";.
10360 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62      }.    if( ob
10370 6a 63 3e 3d 37 20 29 7b 0a 20 20 20 20 20 20 7a  jc>=7 ){.      z
10380 4e 75 6c 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74  Null = Tcl_GetSt
10390 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
103a0 5b 36 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  [6], 0);.    }el
103b0 73 65 7b 0a 20 20 20 20 20 20 7a 4e 75 6c 6c 20  se{.      zNull 
103c0 3d 20 22 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = "";.    }.    
103d0 7a 43 6f 6e 66 6c 69 63 74 20 3d 20 54 63 6c 5f  zConflict = Tcl_
103e0 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
103f0 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20  (objv[2], 0);.  
10400 20 20 7a 54 61 62 6c 65 20 3d 20 54 63 6c 5f 47    zTable = Tcl_G
10410 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
10420 6f 62 6a 76 5b 33 5d 2c 20 30 29 3b 0a 20 20 20  objv[3], 0);.   
10430 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74   zFile = Tcl_Get
10440 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
10450 6a 76 5b 34 5d 2c 20 30 29 3b 0a 20 20 20 20 6e  jv[4], 0);.    n
10460 53 65 70 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a  Sep = strlen30(z
10470 53 65 70 29 3b 0a 20 20 20 20 6e 4e 75 6c 6c 20  Sep);.    nNull 
10480 3d 20 73 74 72 6c 65 6e 33 30 28 7a 4e 75 6c 6c  = strlen30(zNull
10490 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 65 70 3d  );.    if( nSep=
104a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =0 ){.      Tcl_
104b0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
104c0 65 72 70 2c 22 45 72 72 6f 72 3a 20 6e 6f 6e 2d  erp,"Error: non-
104d0 6e 75 6c 6c 20 73 65 70 61 72 61 74 6f 72 20 72  null separator r
104e0 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f 70 79  equired for copy
104f0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
10500 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
10510 29 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  )0);.      retur
10520 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
10530 20 7d 0a 20 20 20 20 69 66 28 73 74 72 63 6d 70   }.    if(strcmp
10540 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 72 6f 6c  (zConflict, "rol
10550 6c 62 61 63 6b 22 29 20 21 3d 20 30 20 26 26 0a  lback") != 0 &&.
10560 20 20 20 20 20 20 20 73 74 72 63 6d 70 28 7a 43         strcmp(zC
10570 6f 6e 66 6c 69 63 74 2c 20 22 61 62 6f 72 74 22  onflict, "abort"
10580 20 20 20 29 20 21 3d 20 30 20 26 26 0a 20 20 20     ) != 0 &&.   
10590 20 20 20 20 73 74 72 63 6d 70 28 7a 43 6f 6e 66      strcmp(zConf
105a0 6c 69 63 74 2c 20 22 66 61 69 6c 22 20 20 20 20  lict, "fail"    
105b0 29 20 21 3d 20 30 20 26 26 0a 20 20 20 20 20 20  ) != 0 &&.      
105c0 20 73 74 72 63 6d 70 28 7a 43 6f 6e 66 6c 69 63   strcmp(zConflic
105d0 74 2c 20 22 69 67 6e 6f 72 65 22 20 20 29 20 21  t, "ignore"  ) !
105e0 3d 20 30 20 26 26 0a 20 20 20 20 20 20 20 73 74  = 0 &&.       st
105f0 72 63 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20  rcmp(zConflict, 
10600 22 72 65 70 6c 61 63 65 22 20 29 20 21 3d 20 30  "replace" ) != 0
10610 20 29 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41   ) {.      Tcl_A
10620 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
10630 72 70 2c 20 22 45 72 72 6f 72 3a 20 5c 22 22 2c  rp, "Error: \"",
10640 20 7a 43 6f 6e 66 6c 69 63 74 2c 20 0a 20 20 20   zConflict, .   
10650 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 63 6f           "\", co
10660 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d  nflict-algorithm
10670 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 3a   must be one of:
10680 20 72 6f 6c 6c 62 61 63 6b 2c 20 22 0a 20 20 20   rollback, ".   
10690 20 20 20 20 20 20 20 20 20 22 61 62 6f 72 74 2c           "abort,
106a0 20 66 61 69 6c 2c 20 69 67 6e 6f 72 65 2c 20 6f   fail, ignore, o
106b0 72 20 72 65 70 6c 61 63 65 22 2c 20 28 63 68 61  r replace", (cha
106c0 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 65 74  r*)0);.      ret
106d0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
106e0 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d 20     }.    zSql = 
106f0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
10700 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 27  "SELECT * FROM '
10710 25 71 27 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20  %q'", zTable);. 
10720 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29     if( zSql==0 )
10730 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
10740 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
10750 20 22 45 72 72 6f 72 3a 20 6e 6f 20 73 75 63 68   "Error: no such
10760 20 74 61 62 6c 65 3a 20 22 2c 20 7a 54 61 62 6c   table: ", zTabl
10770 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  e, (char*)0);.  
10780 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
10790 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
107a0 6e 42 79 74 65 20 3d 20 73 74 72 6c 65 6e 33 30  nByte = strlen30
107b0 28 7a 53 71 6c 29 3b 0a 20 20 20 20 72 63 20 3d  (zSql);.    rc =
107c0 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
107d0 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  (pDb->db, zSql, 
107e0 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
107f0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
10800 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20  (zSql);.    if( 
10810 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  rc ){.      Tcl_
10820 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
10830 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 22 2c 20  erp, "Error: ", 
10840 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
10850 44 62 2d 3e 64 62 29 2c 20 28 63 68 61 72 2a 29  Db->db), (char*)
10860 30 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 20 3d  0);.      nCol =
10870 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
10880 20 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69       nCol = sqli
10890 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  te3_column_count
108a0 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20  (pStmt);.    }. 
108b0 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
108c0 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
108d0 69 66 28 20 6e 43 6f 6c 3d 3d 30 20 29 20 7b 0a  if( nCol==0 ) {.
108e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
108f0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
10900 20 20 7a 53 71 6c 20 3d 20 6d 61 6c 6c 6f 63 28    zSql = malloc(
10910 20 6e 42 79 74 65 20 2b 20 35 30 20 2b 20 6e 43   nByte + 50 + nC
10920 6f 6c 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20  ol*2 );.    if( 
10930 7a 53 71 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20  zSql==0 ) {.    
10940 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
10950 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f  lt(interp, "Erro
10960 72 3a 20 63 61 6e 27 74 20 6d 61 6c 6c 6f 63 28  r: can't malloc(
10970 29 22 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  )", (char*)0);. 
10980 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
10990 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
109a0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
109b0 66 28 6e 42 79 74 65 2b 35 30 2c 20 7a 53 71 6c  f(nByte+50, zSql
109c0 2c 20 22 49 4e 53 45 52 54 20 4f 52 20 25 71 20  , "INSERT OR %q 
109d0 49 4e 54 4f 20 27 25 71 27 20 56 41 4c 55 45 53  INTO '%q' VALUES
109e0 28 3f 22 2c 0a 20 20 20 20 20 20 20 20 20 7a 43  (?",.         zC
109f0 6f 6e 66 6c 69 63 74 2c 20 7a 54 61 62 6c 65 29  onflict, zTable)
10a00 3b 0a 20 20 20 20 6a 20 3d 20 73 74 72 6c 65 6e  ;.    j = strlen
10a10 33 30 28 7a 53 71 6c 29 3b 0a 20 20 20 20 66 6f  30(zSql);.    fo
10a20 72 28 69 3d 31 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=1; i<nCol; i
10a30 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c 5b  ++){.      zSql[
10a40 6a 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20  j++] = ',';.    
10a50 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 3f    zSql[j++] = '?
10a60 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71  ';.    }.    zSq
10a70 6c 5b 6a 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20  l[j++] = ')';.  
10a80 20 20 7a 53 71 6c 5b 6a 5d 20 3d 20 30 3b 0a 20    zSql[j] = 0;. 
10a90 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
10aa0 70 72 65 70 61 72 65 28 70 44 62 2d 3e 64 62 2c  prepare(pDb->db,
10ab0 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
10ac0 74 2c 20 30 29 3b 0a 20 20 20 20 66 72 65 65 28  t, 0);.    free(
10ad0 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 72  zSql);.    if( r
10ae0 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  c ){.      Tcl_A
10af0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
10b00 72 70 2c 20 22 45 72 72 6f 72 3a 20 22 2c 20 73  rp, "Error: ", s
10b10 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44  qlite3_errmsg(pD
10b20 62 2d 3e 64 62 29 2c 20 28 63 68 61 72 2a 29 30  b->db), (char*)0
10b30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10b40 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
10b50 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
10b60 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
10b70 20 20 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a      in = fopen(z
10b80 46 69 6c 65 2c 20 22 72 62 22 29 3b 0a 20 20 20  File, "rb");.   
10b90 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20   if( in==0 ){.  
10ba0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
10bb0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72  sult(interp, "Er
10bc0 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e  ror: cannot open
10bd0 20 66 69 6c 65 3a 20 22 2c 20 7a 46 69 6c 65 2c   file: ", zFile,
10be0 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71   NULL);.      sq
10bf0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
10c00 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74  Stmt);.      ret
10c10 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
10c20 20 20 20 7d 0a 20 20 20 20 61 7a 43 6f 6c 20 3d     }.    azCol =
10c30 20 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28   malloc( sizeof(
10c40 61 7a 43 6f 6c 5b 30 5d 29 2a 28 6e 43 6f 6c 2b  azCol[0])*(nCol+
10c50 31 29 20 29 3b 0a 20 20 20 20 69 66 28 20 61 7a  1) );.    if( az
10c60 43 6f 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20  Col==0 ) {.     
10c70 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
10c80 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72  t(interp, "Error
10c90 3a 20 63 61 6e 27 74 20 6d 61 6c 6c 6f 63 28 29  : can't malloc()
10ca0 22 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ", (char*)0);.  
10cb0 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a      fclose(in);.
10cc0 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
10cd0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
10ce0 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 5f    (void)sqlite3_
10cf0 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 22 42  exec(pDb->db, "B
10d00 45 47 49 4e 22 2c 20 30 2c 20 30 2c 20 30 29 3b  EGIN", 0, 0, 0);
10d10 0a 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22  .    zCommit = "
10d20 43 4f 4d 4d 49 54 22 3b 0a 20 20 20 20 77 68 69  COMMIT";.    whi
10d30 6c 65 28 20 28 7a 4c 69 6e 65 20 3d 20 6c 6f 63  le( (zLine = loc
10d40 61 6c 5f 67 65 74 6c 69 6e 65 28 30 2c 20 69 6e  al_getline(0, in
10d50 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  ))!=0 ){.      c
10d60 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 6c 69  har *z;.      li
10d70 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 61 7a  neno++;.      az
10d80 43 6f 6c 5b 30 5d 20 3d 20 7a 4c 69 6e 65 3b 0a  Col[0] = zLine;.
10d90 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 7a        for(i=0, z
10da0 3d 7a 4c 69 6e 65 3b 20 2a 7a 3b 20 7a 2b 2b 29  =zLine; *z; z++)
10db0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a 7a  {.        if( *z
10dc0 3d 3d 7a 53 65 70 5b 30 5d 20 26 26 20 73 74 72  ==zSep[0] && str
10dd0 6e 63 6d 70 28 7a 2c 20 7a 53 65 70 2c 20 6e 53  ncmp(z, zSep, nS
10de0 65 70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ep)==0 ){.      
10df0 20 20 20 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20      *z = 0;.    
10e00 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20        i++;.     
10e10 20 20 20 20 20 69 66 28 20 69 3c 6e 43 6f 6c 20       if( i<nCol 
10e20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
10e30 7a 43 6f 6c 5b 69 5d 20 3d 20 26 7a 5b 6e 53 65  zCol[i] = &z[nSe
10e40 70 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  p];.            
10e50 7a 20 2b 3d 20 6e 53 65 70 2d 31 3b 0a 20 20 20  z += nSep-1;.   
10e60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
10e70 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
10e80 20 69 66 28 20 69 2b 31 21 3d 6e 43 6f 6c 20 29   if( i+1!=nCol )
10e90 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
10ea0 7a 45 72 72 3b 0a 20 20 20 20 20 20 20 20 69 6e  zErr;.        in
10eb0 74 20 6e 45 72 72 20 3d 20 73 74 72 6c 65 6e 33  t nErr = strlen3
10ec0 30 28 7a 46 69 6c 65 29 20 2b 20 32 30 30 3b 0a  0(zFile) + 200;.
10ed0 20 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20 6d          zErr = m
10ee0 61 6c 6c 6f 63 28 6e 45 72 72 29 3b 0a 20 20 20  alloc(nErr);.   
10ef0 20 20 20 20 20 69 66 28 20 7a 45 72 72 20 29 7b       if( zErr ){
10f00 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
10f10 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 45 72 72  e3_snprintf(nErr
10f20 2c 20 7a 45 72 72 2c 0a 20 20 20 20 20 20 20 20  , zErr,.        
10f30 20 20 20 20 20 22 45 72 72 6f 72 3a 20 25 73 20       "Error: %s 
10f40 6c 69 6e 65 20 25 64 3a 20 65 78 70 65 63 74 65  line %d: expecte
10f50 64 20 25 64 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  d %d columns of 
10f60 64 61 74 61 20 62 75 74 20 66 6f 75 6e 64 20 25  data but found %
10f70 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  d",.            
10f80 20 7a 46 69 6c 65 2c 20 6c 69 6e 65 6e 6f 2c 20   zFile, lineno, 
10f90 6e 43 6f 6c 2c 20 69 2b 31 29 3b 0a 20 20 20 20  nCol, i+1);.    
10fa0 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
10fb0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
10fc0 45 72 72 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  Err, (char*)0);.
10fd0 20 20 20 20 20 20 20 20 20 20 66 72 65 65 28 7a            free(z
10fe0 45 72 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Err);.        }.
10ff0 20 20 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20          zCommit 
11000 3d 20 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20  = "ROLLBACK";.  
11010 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11020 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69     }.      for(i
11030 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
11040 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 63 68 65  {.        /* che
11050 63 6b 20 66 6f 72 20 6e 75 6c 6c 20 64 61 74 61  ck for null data
11060 2c 20 69 66 20 73 6f 2c 20 62 69 6e 64 20 61 73  , if so, bind as
11070 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20   null */.       
11080 20 69 66 28 20 28 6e 4e 75 6c 6c 3e 30 20 26 26   if( (nNull>0 &&
11090 20 73 74 72 63 6d 70 28 61 7a 43 6f 6c 5b 69 5d   strcmp(azCol[i]
110a0 2c 20 7a 4e 75 6c 6c 29 3d 3d 30 29 0a 20 20 20  , zNull)==0).   
110b0 20 20 20 20 20 20 20 7c 7c 20 73 74 72 6c 65 6e         || strlen
110c0 33 30 28 61 7a 43 6f 6c 5b 69 5d 29 3d 3d 30 20  30(azCol[i])==0 
110d0 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
110e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
110f0 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 69  nd_null(pStmt, i
11100 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  +1);.        }el
11110 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  se{.          sq
11120 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28  lite3_bind_text(
11130 70 53 74 6d 74 2c 20 69 2b 31 2c 20 61 7a 43 6f  pStmt, i+1, azCo
11140 6c 5b 69 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45  l[i], -1, SQLITE
11150 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
11160 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
11170 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70    sqlite3_step(p
11180 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 63 20  Stmt);.      rc 
11190 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
111a0 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 66 72  pStmt);.      fr
111b0 65 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20  ee(zLine);.     
111c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
111d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  OK ){.        Tc
111e0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
111f0 6e 74 65 72 70 2c 22 45 72 72 6f 72 3a 20 22 2c  nterp,"Error: ",
11200 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
11210 70 44 62 2d 3e 64 62 29 2c 20 28 63 68 61 72 2a  pDb->db), (char*
11220 29 30 29 3b 0a 20 20 20 20 20 20 20 20 7a 43 6f  )0);.        zCo
11230 6d 6d 69 74 20 3d 20 22 52 4f 4c 4c 42 41 43 4b  mmit = "ROLLBACK
11240 22 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ";.        break
11250 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11260 20 20 20 20 66 72 65 65 28 61 7a 43 6f 6c 29 3b      free(azCol);
11270 0a 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b  .    fclose(in);
11280 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
11290 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
112a0 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 5f    (void)sqlite3_
112b0 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 7a 43  exec(pDb->db, zC
112c0 6f 6d 6d 69 74 2c 20 30 2c 20 30 2c 20 30 29 3b  ommit, 0, 0, 0);
112d0 0a 0a 20 20 20 20 69 66 28 20 7a 43 6f 6d 6d 69  ..    if( zCommi
112e0 74 5b 30 5d 20 3d 3d 20 27 43 27 20 29 7b 0a 20  t[0] == 'C' ){. 
112f0 20 20 20 20 20 2f 2a 20 73 75 63 63 65 73 73 2c       /* success,
11300 20 73 65 74 20 72 65 73 75 6c 74 20 61 73 20 6e   set result as n
11310 75 6d 62 65 72 20 6f 66 20 6c 69 6e 65 73 20 70  umber of lines p
11320 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 20 20  rocessed */.    
11330 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f    pResult = Tcl_
11340 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  GetObjResult(int
11350 65 72 70 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f  erp);.      Tcl_
11360 53 65 74 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c  SetIntObj(pResul
11370 74 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20  t, lineno);.    
11380 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20    rc = TCL_OK;. 
11390 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
113a0 2f 2a 20 66 61 69 6c 75 72 65 2c 20 61 70 70 65  /* failure, appe
113b0 6e 64 20 6c 69 6e 65 6e 6f 20 77 68 65 72 65 20  nd lineno where 
113c0 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20  failed */.      
113d0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
113e0 28 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 4e 75 6d  (sizeof(zLineNum
113f0 29 2c 20 7a 4c 69 6e 65 4e 75 6d 2c 22 25 64 22  ), zLineNum,"%d"
11400 2c 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20  ,lineno);.      
11410 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
11420 28 69 6e 74 65 72 70 2c 22 2c 20 66 61 69 6c 65  (interp,", faile
11430 64 20 77 68 69 6c 65 20 70 72 6f 63 65 73 73 69  d while processi
11440 6e 67 20 6c 69 6e 65 3a 20 22 2c 7a 4c 69 6e 65  ng line: ",zLine
11450 4e 75 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Num,.           
11460 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
11470 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 63 20  r*)0);.      rc 
11480 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  = TCL_ERROR;.   
11490 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
114a0 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
114b0 24 64 62 20 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f  $db enable_load_
114c0 65 78 74 65 6e 73 69 6f 6e 20 42 4f 4f 4c 45 41  extension BOOLEA
114d0 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 75 72 6e  N.  **.  ** Turn
114e0 20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e 20 6c   the extension l
114f0 6f 61 64 69 6e 67 20 66 65 61 74 75 72 65 20 6f  oading feature o
11500 6e 20 6f 72 20 6f 66 66 2e 20 20 49 74 20 69 66  n or off.  It if
11510 20 6f 66 66 20 62 79 0a 20 20 2a 2a 20 64 65 66   off by.  ** def
11520 61 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  ault..  */.  cas
11530 65 20 44 42 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44  e DB_ENABLE_LOAD
11540 5f 45 58 54 45 4e 53 49 4f 4e 3a 20 7b 0a 23 69  _EXTENSION: {.#i
11550 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11560 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
11570 0a 20 20 20 20 69 6e 74 20 6f 6e 6f 66 66 3b 0a  .    int onoff;.
11580 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20      if( objc!=3 
11590 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
115a0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
115b0 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 42 4f 4f 4c  , 2, objv, "BOOL
115c0 45 41 4e 22 29 3b 0a 20 20 20 20 20 20 72 65 74  EAN");.      ret
115d0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
115e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 54 63 6c     }.    if( Tcl
115f0 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
11600 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
11610 32 5d 2c 20 26 6f 6e 6f 66 66 29 20 29 7b 0a 20  2], &onoff) ){. 
11620 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
11630 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
11640 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
11650 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 70  load_extension(p
11660 44 62 2d 3e 64 62 2c 20 6f 6e 6f 66 66 29 3b 0a  Db->db, onoff);.
11670 20 20 20 20 62 72 65 61 6b 3b 0a 23 65 6c 73 65      break;.#else
11680 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
11690 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 65  esult(interp, "e
116a0 78 74 65 6e 73 69 6f 6e 20 6c 6f 61 64 69 6e 67  xtension loading
116b0 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66 20 61   is turned off a
116c0 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 22 2c  t compile-time",
116d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
116e0 20 20 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b        (char*)0);
116f0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
11700 45 52 52 4f 52 3b 0a 23 65 6e 64 69 66 0a 20 20  ERROR;.#endif.  
11710 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
11720 24 64 62 20 65 72 72 6f 72 63 6f 64 65 0a 20 20  $db errorcode.  
11730 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74  **.  ** Return t
11740 68 65 20 6e 75 6d 65 72 69 63 20 65 72 72 6f 72  he numeric error
11750 20 63 6f 64 65 20 74 68 61 74 20 77 61 73 20 72   code that was r
11760 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 6d  eturned by the m
11770 6f 73 74 20 72 65 63 65 6e 74 0a 20 20 2a 2a 20  ost recent.  ** 
11780 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f  call to sqlite3_
11790 65 78 65 63 28 29 2e 0a 20 20 2a 2f 0a 20 20 63  exec()..  */.  c
117a0 61 73 65 20 44 42 5f 45 52 52 4f 52 43 4f 44 45  ase DB_ERRORCODE
117b0 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f  : {.    Tcl_SetO
117c0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
117d0 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73   Tcl_NewIntObj(s
117e0 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 70  qlite3_errcode(p
117f0 44 62 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20 62  Db->db)));.    b
11800 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
11810 20 20 2a 2a 20 20 20 20 24 64 62 20 65 78 69 73    **    $db exis
11820 74 73 20 24 73 71 6c 0a 20 20 2a 2a 20 20 20 20  ts $sql.  **    
11830 24 64 62 20 6f 6e 65 63 6f 6c 75 6d 6e 20 24 73  $db onecolumn $s
11840 71 6c 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  ql.  **.  ** The
11850 20 6f 6e 65 63 6f 6c 75 6d 6e 20 6d 65 74 68 6f   onecolumn metho
11860 64 20 69 73 20 74 68 65 20 65 71 75 69 76 61 6c  d is the equival
11870 65 6e 74 20 6f 66 3a 0a 20 20 2a 2a 20 20 20 20  ent of:.  **    
11880 20 6c 69 6e 64 65 78 20 5b 24 64 62 20 65 76 61   lindex [$db eva
11890 6c 20 24 73 71 6c 5d 20 30 0a 20 20 2a 2f 0a 20  l $sql] 0.  */. 
118a0 20 63 61 73 65 20 44 42 5f 45 58 49 53 54 53 3a   case DB_EXISTS:
118b0 20 0a 20 20 63 61 73 65 20 44 42 5f 4f 4e 45 43   .  case DB_ONEC
118c0 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 44 62 45  OLUMN: {.    DbE
118d0 76 61 6c 43 6f 6e 74 65 78 74 20 73 45 76 61 6c  valContext sEval
118e0 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ;.    if( objc!=
118f0 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
11900 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
11910 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 51  rp, 2, objv, "SQ
11920 4c 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  L");.      retur
11930 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
11940 20 7d 0a 0a 20 20 20 20 64 62 45 76 61 6c 49 6e   }..    dbEvalIn
11950 69 74 28 26 73 45 76 61 6c 2c 20 70 44 62 2c 20  it(&sEval, pDb, 
11960 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20  objv[2], 0);.   
11970 20 72 63 20 3d 20 64 62 45 76 61 6c 53 74 65 70   rc = dbEvalStep
11980 28 26 73 45 76 61 6c 29 3b 0a 20 20 20 20 69 66  (&sEval);.    if
11990 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f 4f 4e 45  ( choice==DB_ONE
119a0 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20  COLUMN ){.      
119b0 69 66 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29  if( rc==TCL_OK )
119c0 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65  {.        Tcl_Se
119d0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
119e0 70 2c 20 64 62 45 76 61 6c 43 6f 6c 75 6d 6e 56  p, dbEvalColumnV
119f0 61 6c 75 65 28 26 73 45 76 61 6c 2c 20 30 29 29  alue(&sEval, 0))
11a00 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
11a10 28 20 72 63 3d 3d 54 43 4c 5f 42 52 45 41 4b 20  ( rc==TCL_BREAK 
11a20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 52  ){.        Tcl_R
11a30 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  esetResult(inter
11a40 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
11a50 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 54 43  }else if( rc==TC
11a60 4c 5f 42 52 45 41 4b 20 7c 7c 20 72 63 3d 3d 54  L_BREAK || rc==T
11a70 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54  CL_OK ){.      T
11a80 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
11a90 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42  interp, Tcl_NewB
11aa0 6f 6f 6c 65 61 6e 4f 62 6a 28 72 63 3d 3d 54 43  ooleanObj(rc==TC
11ab0 4c 5f 4f 4b 29 29 3b 0a 20 20 20 20 7d 0a 20 20  L_OK));.    }.  
11ac0 20 20 64 62 45 76 61 6c 46 69 6e 61 6c 69 7a 65    dbEvalFinalize
11ad0 28 26 73 45 76 61 6c 29 3b 0a 0a 20 20 20 20 69  (&sEval);..    i
11ae0 66 28 20 72 63 3d 3d 54 43 4c 5f 42 52 45 41 4b  f( rc==TCL_BREAK
11af0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 54   ){.      rc = T
11b00 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  CL_OK;.    }.   
11b10 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 20 0a   break;.  }.   .
11b20 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62    /*.  **    $db
11b30 20 65 76 61 6c 20 24 73 71 6c 20 3f 61 72 72 61   eval $sql ?arra
11b40 79 3f 20 3f 7b 20 20 2e 2e 2e 63 6f 64 65 2e 2e  y? ?{  ...code..
11b50 2e 20 7d 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  . }?.  **.  ** T
11b60 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
11b70 20 69 6e 20 24 73 71 6c 20 69 73 20 65 76 61 6c   in $sql is eval
11b80 75 61 74 65 64 2e 20 20 46 6f 72 20 65 61 63 68  uated.  For each
11b90 20 72 6f 77 2c 20 74 68 65 20 76 61 6c 75 65 73   row, the values
11ba0 20 61 72 65 0a 20 20 2a 2a 20 70 6c 61 63 65 64   are.  ** placed
11bb0 20 69 6e 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20   in elements of 
11bc0 74 68 65 20 61 72 72 61 79 20 6e 61 6d 65 64 20  the array named 
11bd0 22 61 72 72 61 79 22 20 61 6e 64 20 2e 2e 2e 63  "array" and ...c
11be0 6f 64 65 2e 2e 2e 20 69 73 20 65 78 65 63 75 74  ode... is execut
11bf0 65 64 2e 0a 20 20 2a 2a 20 49 66 20 22 61 72 72  ed..  ** If "arr
11c00 61 79 22 20 61 6e 64 20 22 63 6f 64 65 22 20 61  ay" and "code" a
11c10 72 65 20 6f 6d 69 74 74 65 64 2c 20 74 68 65 6e  re omitted, then
11c20 20 6e 6f 20 63 61 6c 6c 62 61 63 6b 20 69 73 20   no callback is 
11c30 65 76 65 72 79 20 69 6e 76 6f 6b 65 64 2e 0a 20  every invoked.. 
11c40 20 2a 2a 20 49 66 20 22 61 72 72 61 79 22 20 69   ** If "array" i
11c50 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  s an empty strin
11c60 67 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  g, then the valu
11c70 65 73 20 61 72 65 20 70 6c 61 63 65 64 20 69 6e  es are placed in
11c80 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20   variables.  ** 
11c90 74 68 61 74 20 68 61 76 65 20 74 68 65 20 73 61  that have the sa
11ca0 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 66  me name as the f
11cb0 69 65 6c 64 73 20 65 78 74 72 61 63 74 65 64 20  ields extracted 
11cc0 62 79 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20  by the query..  
11cd0 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 45 56 41  */.  case DB_EVA
11ce0 4c 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a  L: {.    if( obj
11cf0 63 3c 33 20 7c 7c 20 6f 62 6a 63 3e 35 20 29 7b  c<3 || objc>5 ){
11d00 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
11d10 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
11d20 32 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 20 3f 41  2, objv, "SQL ?A
11d30 52 52 41 59 2d 4e 41 4d 45 3f 20 3f 53 43 52 49  RRAY-NAME? ?SCRI
11d40 50 54 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74  PT?");.      ret
11d50 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
11d60 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 6f 62     }..    if( ob
11d70 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 44  jc==3 ){.      D
11d80 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 73 45 76  bEvalContext sEv
11d90 61 6c 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62  al;.      Tcl_Ob
11da0 6a 20 2a 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65  j *pRet = Tcl_Ne
11db0 77 4f 62 6a 28 29 3b 0a 20 20 20 20 20 20 54 63  wObj();.      Tc
11dc0 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
11dd0 52 65 74 29 3b 0a 20 20 20 20 20 20 64 62 45 76  Ret);.      dbEv
11de0 61 6c 49 6e 69 74 28 26 73 45 76 61 6c 2c 20 70  alInit(&sEval, p
11df0 44 62 2c 20 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b  Db, objv[2], 0);
11e00 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 54 43  .      while( TC
11e10 4c 5f 4f 4b 3d 3d 28 72 63 20 3d 20 64 62 45 76  L_OK==(rc = dbEv
11e20 61 6c 53 74 65 70 28 26 73 45 76 61 6c 29 29 20  alStep(&sEval)) 
11e30 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
11e40 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43  ;.        int nC
11e50 6f 6c 3b 0a 20 20 20 20 20 20 20 20 64 62 45 76  ol;.        dbEv
11e60 61 6c 52 6f 77 49 6e 66 6f 28 26 73 45 76 61 6c  alRowInfo(&sEval
11e70 2c 20 26 6e 43 6f 6c 2c 20 30 29 3b 0a 20 20 20  , &nCol, 0);.   
11e80 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
11e90 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
11ea0 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62        Tcl_ListOb
11eb0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
11ec0 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 64 62 45  nterp, pRet, dbE
11ed0 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65 28 26  valColumnValue(&
11ee0 73 45 76 61 6c 2c 20 69 29 29 3b 0a 20 20 20 20  sEval, i));.    
11ef0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
11f00 20 20 20 20 64 62 45 76 61 6c 46 69 6e 61 6c 69      dbEvalFinali
11f10 7a 65 28 26 73 45 76 61 6c 29 3b 0a 20 20 20 20  ze(&sEval);.    
11f20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 42 52    if( rc==TCL_BR
11f30 45 41 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 54  EAK ){.        T
11f40 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
11f50 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 20  interp, pRet);. 
11f60 20 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f         rc = TCL_
11f70 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
11f80 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
11f90 6e 74 28 70 52 65 74 29 3b 0a 20 20 20 20 7d 65  nt(pRet);.    }e
11fa0 6c 73 65 7b 0a 20 20 20 20 20 20 43 6c 69 65 6e  lse{.      Clien
11fb0 74 44 61 74 61 20 63 64 5b 32 5d 3b 0a 20 20 20  tData cd[2];.   
11fc0 20 20 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74     DbEvalContext
11fd0 20 2a 70 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f   *p;.      Tcl_O
11fe0 62 6a 20 2a 70 41 72 72 61 79 20 3d 20 30 3b 0a  bj *pArray = 0;.
11ff0 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70        Tcl_Obj *p
12000 53 63 72 69 70 74 3b 0a 0a 20 20 20 20 20 20 69  Script;..      i
12010 66 28 20 6f 62 6a 63 3d 3d 35 20 26 26 20 2a 28  f( objc==5 && *(
12020 63 68 61 72 20 2a 29 54 63 6c 5f 47 65 74 53 74  char *)Tcl_GetSt
12030 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 20 29 7b  ring(objv[3]) ){
12040 0a 20 20 20 20 20 20 20 20 70 41 72 72 61 79 20  .        pArray 
12050 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20 20 20  = objv[3];.     
12060 20 7d 0a 20 20 20 20 20 20 70 53 63 72 69 70 74   }.      pScript
12070 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 3b   = objv[objc-1];
12080 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  .      Tcl_IncrR
12090 65 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29  efCount(pScript)
120a0 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 70  ;.      .      p
120b0 20 3d 20 28 44 62 45 76 61 6c 43 6f 6e 74 65 78   = (DbEvalContex
120c0 74 20 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 73 69  t *)Tcl_Alloc(si
120d0 7a 65 6f 66 28 44 62 45 76 61 6c 43 6f 6e 74 65  zeof(DbEvalConte
120e0 78 74 29 29 3b 0a 20 20 20 20 20 20 64 62 45 76  xt));.      dbEv
120f0 61 6c 49 6e 69 74 28 70 2c 20 70 44 62 2c 20 6f  alInit(p, pDb, o
12100 62 6a 76 5b 32 5d 2c 20 70 41 72 72 61 79 29 3b  bjv[2], pArray);
12110 0a 0a 20 20 20 20 20 20 63 64 5b 30 5d 20 3d 20  ..      cd[0] = 
12120 28 76 6f 69 64 20 2a 29 70 3b 0a 20 20 20 20 20  (void *)p;.     
12130 20 63 64 5b 31 5d 20 3d 20 28 76 6f 69 64 20 2a   cd[1] = (void *
12140 29 70 53 63 72 69 70 74 3b 0a 20 20 20 20 20 20  )pScript;.      
12150 72 63 20 3d 20 44 62 45 76 61 6c 4e 65 78 74 43  rc = DbEvalNextC
12160 6d 64 28 63 64 2c 20 69 6e 74 65 72 70 2c 20 54  md(cd, interp, T
12170 43 4c 5f 4f 4b 29 3b 0a 20 20 20 20 7d 0a 20 20  CL_OK);.    }.  
12180 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
12190 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20  /*.  **     $db 
121a0 66 75 6e 63 74 69 6f 6e 20 4e 41 4d 45 20 5b 2d  function NAME [-
121b0 61 72 67 63 6f 75 6e 74 20 4e 5d 20 5b 2d 64 65  argcount N] [-de
121c0 74 65 72 6d 69 6e 69 73 74 69 63 5d 20 53 43 52  terministic] SCR
121d0 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 72  IPT.  **.  ** Cr
121e0 65 61 74 65 20 61 20 6e 65 77 20 53 51 4c 20 66  eate a new SQL f
121f0 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e  unction called N
12200 41 4d 45 2e 20 20 57 68 65 6e 65 76 65 72 20 74  AME.  Whenever t
12210 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a  hat function is.
12220 20 20 2a 2a 20 63 61 6c 6c 65 64 2c 20 69 6e 76    ** called, inv
12230 6f 6b 65 20 53 43 52 49 50 54 20 74 6f 20 65 76  oke SCRIPT to ev
12240 61 6c 75 61 74 65 20 74 68 65 20 66 75 6e 63 74  aluate the funct
12250 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ion..  */.  case
12260 20 44 42 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a   DB_FUNCTION: {.
12270 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
12280 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20  SQLITE_UTF8;.   
12290 20 53 71 6c 46 75 6e 63 20 2a 70 46 75 6e 63 3b   SqlFunc *pFunc;
122a0 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53  .    Tcl_Obj *pS
122b0 63 72 69 70 74 3b 0a 20 20 20 20 63 68 61 72 20  cript;.    char 
122c0 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20  *zName;.    int 
122d0 6e 41 72 67 20 3d 20 2d 31 3b 0a 20 20 20 20 69  nArg = -1;.    i
122e0 6e 74 20 69 3b 0a 20 20 20 20 69 66 28 20 6f 62  nt i;.    if( ob
122f0 6a 63 3c 34 20 29 7b 0a 20 20 20 20 20 20 54 63  jc<4 ){.      Tc
12300 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
12310 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
12320 22 4e 41 4d 45 20 3f 53 57 49 54 43 48 45 53 3f  "NAME ?SWITCHES?
12330 20 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20   SCRIPT");.     
12340 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
12350 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  R;.    }.    for
12360 28 69 3d 33 3b 20 69 3c 28 6f 62 6a 63 2d 31 29  (i=3; i<(objc-1)
12370 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f  ; i++){.      co
12380 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 54 63  nst char *z = Tc
12390 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
123a0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  [i]);.      int 
123b0 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 29 3b  n = strlen30(z);
123c0 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 32 20 26  .      if( n>2 &
123d0 26 20 73 74 72 6e 63 6d 70 28 7a 2c 20 22 2d 61  & strncmp(z, "-a
123e0 72 67 63 6f 75 6e 74 22 2c 6e 29 3d 3d 30 20 29  rgcount",n)==0 )
123f0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3d  {.        if( i=
12400 3d 28 6f 62 6a 63 2d 32 29 20 29 7b 0a 20 20 20  =(objc-2) ){.   
12410 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
12420 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
12430 22 6f 70 74 69 6f 6e 20 72 65 71 75 69 72 65 73  "option requires
12440 20 61 6e 20 61 72 67 75 6d 65 6e 74 3a 20 22 2c   an argument: ",
12450 20 7a 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   z, 0);.        
12460 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
12470 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OR;.        }.  
12480 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65        if( Tcl_Ge
12490 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
124a0 72 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26  rp, objv[i+1], &
124b0 6e 41 72 67 29 20 29 20 72 65 74 75 72 6e 20 54  nArg) ) return T
124c0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
124d0 20 20 69 66 28 20 6e 41 72 67 3c 30 20 29 7b 0a    if( nArg<0 ){.
124e0 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70            Tcl_Ap
124f0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
12500 70 2c 20 22 6e 75 6d 62 65 72 20 6f 66 20 61 72  p, "number of ar
12510 67 75 6d 65 6e 74 73 20 6d 75 73 74 20 62 65 20  guments must be 
12520 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 22 2c 0a 20  non-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 20 28 63 68 61 72 2a            (char*
12550 29 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  )0);.          r
12560 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
12570 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12580 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 65     i++;.      }e
12590 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20 6e 3e  lse.      if( n>
125a0 32 20 26 26 20 73 74 72 6e 63 6d 70 28 7a 2c 20  2 && strncmp(z, 
125b0 22 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63 22  "-deterministic"
125c0 2c 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ,n)==0 ){.      
125d0 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54    flags |= SQLIT
125e0 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 3b  E_DETERMINISTIC;
125f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
12600 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
12610 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
12620 62 61 64 20 6f 70 74 69 6f 6e 20 5c 22 22 2c 20  bad option \"", 
12630 7a 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  z, .            
12640 22 5c 22 3a 20 6d 75 73 74 20 62 65 20 2d 61 72  "\": must be -ar
12650 67 63 6f 75 6e 74 20 6f 72 20 2d 64 65 74 65 72  gcount or -deter
12660 6d 69 6e 69 73 74 69 63 22 2c 20 30 0a 20 20 20  ministic", 0.   
12670 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
12680 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
12690 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
126a0 0a 20 20 20 20 70 53 63 72 69 70 74 20 3d 20 6f  .    pScript = o
126b0 62 6a 76 5b 6f 62 6a 63 2d 31 5d 3b 0a 20 20 20  bjv[objc-1];.   
126c0 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74   zName = Tcl_Get
126d0 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
126e0 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20 70  jv[2], 0);.    p
126f0 46 75 6e 63 20 3d 20 66 69 6e 64 53 71 6c 46 75  Func = findSqlFu
12700 6e 63 28 70 44 62 2c 20 7a 4e 61 6d 65 29 3b 0a  nc(pDb, zName);.
12710 20 20 20 20 69 66 28 20 70 46 75 6e 63 3d 3d 30      if( pFunc==0
12720 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
12730 52 4f 52 3b 0a 20 20 20 20 69 66 28 20 70 46 75  ROR;.    if( pFu
12740 6e 63 2d 3e 70 53 63 72 69 70 74 20 29 7b 0a 20  nc->pScript ){. 
12750 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66       Tcl_DecrRef
12760 43 6f 75 6e 74 28 70 46 75 6e 63 2d 3e 70 53 63  Count(pFunc->pSc
12770 72 69 70 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ript);.    }.   
12780 20 70 46 75 6e 63 2d 3e 70 53 63 72 69 70 74 20   pFunc->pScript 
12790 3d 20 70 53 63 72 69 70 74 3b 0a 20 20 20 20 54  = pScript;.    T
127a0 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
127b0 70 53 63 72 69 70 74 29 3b 0a 20 20 20 20 70 46  pScript);.    pF
127c0 75 6e 63 2d 3e 75 73 65 45 76 61 6c 4f 62 6a 76  unc->useEvalObjv
127d0 20 3d 20 73 61 66 65 54 6f 55 73 65 45 76 61 6c   = safeToUseEval
127e0 4f 62 6a 76 28 69 6e 74 65 72 70 2c 20 70 53 63  Objv(interp, pSc
127f0 72 69 70 74 29 3b 0a 20 20 20 20 72 63 20 3d 20  ript);.    rc = 
12800 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
12810 75 6e 63 74 69 6f 6e 28 70 44 62 2d 3e 64 62 2c  unction(pDb->db,
12820 20 7a 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 66 6c   zName, nArg, fl
12830 61 67 73 2c 0a 20 20 20 20 20 20 20 20 70 46 75  ags,.        pFu
12840 6e 63 2c 20 74 63 6c 53 71 6c 46 75 6e 63 2c 20  nc, tclSqlFunc, 
12850 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  0, 0);.    if( r
12860 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
12870 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45        rc = TCL_E
12880 52 52 4f 52 3b 0a 20 20 20 20 20 20 54 63 6c 5f  RROR;.      Tcl_
12890 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
128a0 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  , (char *)sqlite
128b0 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62  3_errmsg(pDb->db
128c0 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29  ), TCL_VOLATILE)
128d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  ;.    }.    brea
128e0 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
128f0 2a 20 20 20 20 20 24 64 62 20 69 6e 63 72 62 6c  *     $db incrbl
12900 6f 62 20 3f 2d 72 65 61 64 6f 6e 6c 79 3f 20 3f  ob ?-readonly? ?
12910 44 42 3f 20 54 41 42 4c 45 20 43 4f 4c 55 4d 4e  DB? TABLE COLUMN
12920 20 52 4f 57 49 44 0a 20 20 2a 2f 0a 20 20 63 61   ROWID.  */.  ca
12930 73 65 20 44 42 5f 49 4e 43 52 42 4c 4f 42 3a 20  se DB_INCRBLOB: 
12940 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
12950 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20  OMIT_INCRBLOB.  
12960 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
12970 6c 74 28 69 6e 74 65 72 70 2c 20 22 69 6e 63 72  lt(interp, "incr
12980 62 6c 6f 62 20 6e 6f 74 20 61 76 61 69 6c 61 62  blob not availab
12990 6c 65 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64  le in this build
129a0 22 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ", (char*)0);.  
129b0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
129c0 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69 6e  OR;.#else.    in
129d0 74 20 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20 30  t isReadonly = 0
129e0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
129f0 20 2a 7a 44 62 20 3d 20 22 6d 61 69 6e 22 3b 0a   *zDb = "main";.
12a00 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
12a10 7a 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73  zTable;.    cons
12a20 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 3b  t char *zColumn;
12a30 0a 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74  .    Tcl_WideInt
12a40 20 69 52 6f 77 3b 0a 0a 20 20 20 20 2f 2a 20 43   iRow;..    /* C
12a50 68 65 63 6b 20 66 6f 72 20 74 68 65 20 2d 72 65  heck for the -re
12a60 61 64 6f 6e 6c 79 20 6f 70 74 69 6f 6e 20 2a 2f  adonly option */
12a70 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20  .    if( objc>3 
12a80 26 26 20 73 74 72 63 6d 70 28 54 63 6c 5f 47 65  && strcmp(Tcl_Ge
12a90 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
12aa0 2c 20 22 2d 72 65 61 64 6f 6e 6c 79 22 29 3d 3d  , "-readonly")==
12ab0 30 20 29 7b 0a 20 20 20 20 20 20 69 73 52 65 61  0 ){.      isRea
12ac0 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 7d  donly = 1;.    }
12ad0 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ..    if( objc!=
12ae0 28 35 2b 69 73 52 65 61 64 6f 6e 6c 79 29 20 26  (5+isReadonly) &
12af0 26 20 6f 62 6a 63 21 3d 28 36 2b 69 73 52 65 61  & objc!=(6+isRea
12b00 64 6f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20  donly) ){.      
12b10 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
12b20 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
12b30 2c 20 22 3f 2d 72 65 61 64 6f 6e 6c 79 3f 20 3f  , "?-readonly? ?
12b40 44 42 3f 20 54 41 42 4c 45 20 43 4f 4c 55 4d 4e  DB? TABLE COLUMN
12b50 20 52 4f 57 49 44 22 29 3b 0a 20 20 20 20 20 20   ROWID");.      
12b60 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
12b70 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
12b80 20 6f 62 6a 63 3d 3d 28 36 2b 69 73 52 65 61 64   objc==(6+isRead
12b90 6f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 7a  only) ){.      z
12ba0 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  Db = Tcl_GetStri
12bb0 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20  ng(objv[2]);.   
12bc0 20 7d 0a 20 20 20 20 7a 54 61 62 6c 65 20 3d 20   }.    zTable = 
12bd0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
12be0 6a 76 5b 6f 62 6a 63 2d 33 5d 29 3b 0a 20 20 20  jv[objc-3]);.   
12bf0 20 7a 43 6f 6c 75 6d 6e 20 3d 20 54 63 6c 5f 47   zColumn = Tcl_G
12c00 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 6f 62  etString(objv[ob
12c10 6a 63 2d 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d  jc-2]);.    rc =
12c20 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46   Tcl_GetWideIntF
12c30 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
12c40 62 6a 76 5b 6f 62 6a 63 2d 31 5d 2c 20 26 69 52  bjv[objc-1], &iR
12c50 6f 77 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63  ow);..    if( rc
12c60 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20  ==TCL_OK ){.    
12c70 20 20 72 63 20 3d 20 63 72 65 61 74 65 49 6e 63    rc = createInc
12c80 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 28 0a 20 20  rblobChannel(.  
12c90 20 20 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20          interp, 
12ca0 70 44 62 2c 20 7a 44 62 2c 20 7a 54 61 62 6c 65  pDb, zDb, zTable
12cb0 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 28 73 71 6c 69  , zColumn, (sqli
12cc0 74 65 33 5f 69 6e 74 36 34 29 69 52 6f 77 2c 20  te3_int64)iRow, 
12cd0 69 73 52 65 61 64 6f 6e 6c 79 0a 20 20 20 20 20  isReadonly.     
12ce0 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   );.    }.#endif
12cf0 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
12d00 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24  .  /*.  **     $
12d10 64 62 20 69 6e 74 65 72 72 75 70 74 0a 20 20 2a  db interrupt.  *
12d20 2a 0a 20 20 2a 2a 20 49 6e 74 65 72 72 75 70 74  *.  ** Interrupt
12d30 20 74 68 65 20 65 78 65 63 75 74 69 6f 6e 20 6f   the execution o
12d40 66 20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74  f the inner-most
12d50 20 53 51 4c 20 69 6e 74 65 72 70 72 65 74 65 72   SQL interpreter
12d60 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 63 61 75  .  This.  ** cau
12d70 73 65 73 20 74 68 65 20 53 51 4c 20 73 74 61 74  ses the SQL stat
12d80 65 6d 65 6e 74 20 74 6f 20 72 65 74 75 72 6e 20  ement to return 
12d90 61 6e 20 65 72 72 6f 72 20 6f 66 20 53 51 4c 49  an error of SQLI
12da0 54 45 5f 49 4e 54 45 52 52 55 50 54 2e 0a 20 20  TE_INTERRUPT..  
12db0 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 49 4e 54  */.  case DB_INT
12dc0 45 52 52 55 50 54 3a 20 7b 0a 20 20 20 20 73 71  ERRUPT: {.    sq
12dd0 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28  lite3_interrupt(
12de0 70 44 62 2d 3e 64 62 29 3b 0a 20 20 20 20 62 72  pDb->db);.    br
12df0 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
12e00 20 2a 2a 20 20 20 20 20 24 64 62 20 6e 75 6c 6c   **     $db null
12e10 76 61 6c 75 65 20 3f 53 54 52 49 4e 47 3f 0a 20  value ?STRING?. 
12e20 20 2a 2a 0a 20 20 2a 2a 20 43 68 61 6e 67 65 20   **.  ** Change 
12e30 74 65 78 74 20 75 73 65 64 20 77 68 65 6e 20 61  text used when a
12e40 20 4e 55 4c 4c 20 63 6f 6d 65 73 20 62 61 63 6b   NULL comes back
12e50 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
12e60 73 65 2e 20 49 66 20 3f 53 54 52 49 4e 47 3f 0a  se. If ?STRING?.
12e70 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 72 65 73    ** is not pres
12e80 65 6e 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75  ent, then the cu
12e90 72 72 65 6e 74 20 73 74 72 69 6e 67 20 75 73 65  rrent string use
12ea0 64 20 66 6f 72 20 4e 55 4c 4c 20 69 73 20 72 65  d for NULL is re
12eb0 74 75 72 6e 65 64 2e 0a 20 20 2a 2a 20 49 66 20  turned..  ** If 
12ec0 53 54 52 49 4e 47 20 69 73 20 70 72 65 73 65 6e  STRING is presen
12ed0 74 2c 20 74 68 65 6e 20 53 54 52 49 4e 47 20 69  t, then STRING i
12ee0 73 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2a  s returned..  **
12ef0 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
12f00 4e 55 4c 4c 56 41 4c 55 45 3a 20 7b 0a 20 20 20  NULLVALUE: {.   
12f10 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 26 26 20   if( objc!=2 && 
12f20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20  objc!=3 ){.     
12f30 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
12f40 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
12f50 76 2c 20 22 4e 55 4c 4c 56 41 4c 55 45 22 29 3b  v, "NULLVALUE");
12f60 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
12f70 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
12f80 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29     if( objc==3 )
12f90 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b  {.      int len;
12fa0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 75  .      char *zNu
12fb0 6c 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  ll = Tcl_GetStri
12fc0 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
12fd0 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20  ], &len);.      
12fe0 69 66 28 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 29  if( pDb->zNull )
12ff0 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72  {.        Tcl_Fr
13000 65 65 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29 3b 0a  ee(pDb->zNull);.
13010 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
13020 28 20 7a 4e 75 6c 6c 20 26 26 20 6c 65 6e 3e 30  ( zNull && len>0
13030 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
13040 3e 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f 41 6c 6c  >zNull = Tcl_All
13050 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20  oc( len + 1 );. 
13060 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44         memcpy(pD
13070 62 2d 3e 7a 4e 75 6c 6c 2c 20 7a 4e 75 6c 6c 2c  b->zNull, zNull,
13080 20 6c 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 70   len);.        p
13090 44 62 2d 3e 7a 4e 75 6c 6c 5b 6c 65 6e 5d 20 3d  Db->zNull[len] =
130a0 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 7d 65 6c   '\0';.      }el
130b0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d  se{.        pDb-
130c0 3e 7a 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  >zNull = 0;.    
130d0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 54 63    }.    }.    Tc
130e0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
130f0 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74  nterp, Tcl_NewSt
13100 72 69 6e 67 4f 62 6a 28 70 44 62 2d 3e 7a 4e 75  ringObj(pDb->zNu
13110 6c 6c 2c 20 2d 31 29 29 3b 0a 20 20 20 20 62 72  ll, -1));.    br
13120 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
13130 20 2a 2a 20 20 20 20 20 24 64 62 20 6c 61 73 74   **     $db last
13140 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 20 0a 20  _insert_rowid . 
13150 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20   **.  ** Return 
13160 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
13170 20 69 73 20 74 68 65 20 52 4f 57 49 44 20 66 6f   is the ROWID fo
13180 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  r the most recen
13190 74 20 69 6e 73 65 72 74 2e 0a 20 20 2a 2f 0a 20  t insert..  */. 
131a0 20 63 61 73 65 20 44 42 5f 4c 41 53 54 5f 49 4e   case DB_LAST_IN
131b0 53 45 52 54 5f 52 4f 57 49 44 3a 20 7b 0a 20 20  SERT_ROWID: {.  
131c0 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75    Tcl_Obj *pResu
131d0 6c 74 3b 0a 20 20 20 20 54 63 6c 5f 57 69 64 65  lt;.    Tcl_Wide
131e0 49 6e 74 20 72 6f 77 69 64 3b 0a 20 20 20 20 69  Int rowid;.    i
131f0 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
13200 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
13210 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
13220 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 20  objv, "");.     
13230 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
13240 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 6f 77  R;.    }.    row
13250 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 6c 61 73  id = sqlite3_las
13260 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 70  t_insert_rowid(p
13270 44 62 2d 3e 64 62 29 3b 0a 20 20 20 20 70 52 65  Db->db);.    pRe
13280 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62  sult = Tcl_GetOb
13290 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  jResult(interp);
132a0 0a 20 20 20 20 54 63 6c 5f 53 65 74 57 69 64 65  .    Tcl_SetWide
132b0 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20  IntObj(pResult, 
132c0 72 6f 77 69 64 29 3b 0a 20 20 20 20 62 72 65 61  rowid);.    brea
132d0 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
132e0 2a 20 54 68 65 20 44 42 5f 4f 4e 45 43 4f 4c 55  * The DB_ONECOLU
132f0 4d 4e 20 6d 65 74 68 6f 64 20 69 73 20 69 6d 70  MN method is imp
13300 6c 65 6d 65 6e 74 65 64 20 74 6f 67 65 74 68 65  lemented togethe
13310 72 20 77 69 74 68 20 44 42 5f 45 58 49 53 54 53  r with DB_EXISTS
13320 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 20 20 20  ..  */..  /*    
13330 24 64 62 20 70 72 6f 67 72 65 73 73 20 3f 4e 20  $db progress ?N 
13340 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 20 0a  CALLBACK?.  ** .
13350 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20    ** Invoke the 
13360 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 65  given callback e
13370 76 65 72 79 20 4e 20 76 69 72 74 75 61 6c 20 6d  very N virtual m
13380 61 63 68 69 6e 65 20 6f 70 63 6f 64 65 73 20 77  achine opcodes w
13390 68 69 6c 65 20 65 78 65 63 75 74 69 6e 67 0a 20  hile executing. 
133a0 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20 20 2a   ** queries..  *
133b0 2f 0a 20 20 63 61 73 65 20 44 42 5f 50 52 4f 47  /.  case DB_PROG
133c0 52 45 53 53 3a 20 7b 0a 20 20 20 20 69 66 28 20  RESS: {.    if( 
133d0 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20  objc==2 ){.     
133e0 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72   if( pDb->zProgr
133f0 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20 54  ess ){.        T
13400 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
13410 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 50 72  interp, pDb->zPr
13420 6f 67 72 65 73 73 2c 20 28 63 68 61 72 2a 29 30  ogress, (char*)0
13430 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
13440 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 34  else if( objc==4
13450 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
13460 7a 50 72 6f 67 72 65 73 73 3b 0a 20 20 20 20 20  zProgress;.     
13470 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20   int len;.      
13480 69 6e 74 20 4e 3b 0a 20 20 20 20 20 20 69 66 28  int N;.      if(
13490 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74   TCL_OK!=Tcl_Get
134a0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
134b0 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 4e 29 20  p, objv[2], &N) 
134c0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
134d0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
134e0 20 20 20 7d 3b 0a 20 20 20 20 20 20 69 66 28 20     };.      if( 
134f0 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29  pDb->zProgress )
13500 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72  {.        Tcl_Fr
13510 65 65 28 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73  ee(pDb->zProgres
13520 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  s);.      }.    
13530 20 20 7a 50 72 6f 67 72 65 73 73 20 3d 20 54 63    zProgress = Tc
13540 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
13550 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6c 65 6e  bj(objv[3], &len
13560 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 72  );.      if( zPr
13570 6f 67 72 65 73 73 20 26 26 20 6c 65 6e 3e 30 20  ogress && len>0 
13580 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
13590 7a 50 72 6f 67 72 65 73 73 20 3d 20 54 63 6c 5f  zProgress = Tcl_
135a0 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29  Alloc( len + 1 )
135b0 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
135c0 28 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 2c  (pDb->zProgress,
135d0 20 7a 50 72 6f 67 72 65 73 73 2c 20 6c 65 6e 2b   zProgress, len+
135e0 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
135f0 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 50  .        pDb->zP
13600 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20  rogress = 0;.   
13610 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
13620 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53  ITE_OMIT_PROGRES
13630 53 5f 43 41 4c 4c 42 41 43 4b 0a 20 20 20 20 20  S_CALLBACK.     
13640 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72   if( pDb->zProgr
13650 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ess ){.        p
13660 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74  Db->interp = int
13670 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  erp;.        sql
13680 69 74 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61  ite3_progress_ha
13690 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20 4e  ndler(pDb->db, N
136a0 2c 20 44 62 50 72 6f 67 72 65 73 73 48 61 6e 64  , DbProgressHand
136b0 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20  ler, pDb);.     
136c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
136d0 73 71 6c 69 74 65 33 5f 70 72 6f 67 72 65 73 73  sqlite3_progress
136e0 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62  _handler(pDb->db
136f0 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
13700 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
13710 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f  else{.      Tcl_
13720 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
13730 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e  erp, 2, objv, "N
13740 20 43 41 4c 4c 42 41 43 4b 22 29 3b 0a 20 20 20   CALLBACK");.   
13750 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
13760 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  ROR;.    }.    b
13770 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  reak;.  }..  /* 
13780 20 20 20 24 64 62 20 70 72 6f 66 69 6c 65 20 3f     $db profile ?
13790 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20  CALLBACK?.  **. 
137a0 20 2a 2a 20 4d 61 6b 65 20 61 72 72 61 6e 67 65   ** Make arrange
137b0 6d 65 6e 74 73 20 74 6f 20 69 6e 76 6f 6b 65 20  ments to invoke 
137c0 74 68 65 20 43 41 4c 4c 42 41 43 4b 20 72 6f 75  the CALLBACK rou
137d0 74 69 6e 65 20 61 66 74 65 72 20 65 61 63 68 20  tine after each 
137e0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  SQL statement.  
137f0 2a 2a 20 74 68 61 74 20 68 61 73 20 72 75 6e 2e  ** that has run.
13800 20 20 54 68 65 20 74 65 78 74 20 6f 66 20 74 68    The text of th
13810 65 20 53 51 4c 20 61 6e 64 20 74 68 65 20 61 6d  e SQL and the am
13820 6f 75 6e 74 20 6f 66 20 65 6c 61 70 73 65 20 74  ount of elapse t
13830 69 6d 65 20 61 72 65 0a 20 20 2a 2a 20 61 70 70  ime are.  ** app
13840 65 6e 64 65 64 20 74 6f 20 43 41 4c 4c 42 41 43  ended to CALLBAC
13850 4b 20 62 65 66 6f 72 65 20 74 68 65 20 73 63 72  K before the scr
13860 69 70 74 20 69 73 20 72 75 6e 2e 0a 20 20 2a 2f  ipt is run..  */
13870 0a 20 20 63 61 73 65 20 44 42 5f 50 52 4f 46 49  .  case DB_PROFI
13880 4c 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62  LE: {.    if( ob
13890 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63  jc>3 ){.      Tc
138a0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
138b0 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
138c0 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20  "?CALLBACK?");. 
138d0 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
138e0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65  ERROR;.    }else
138f0 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a   if( objc==2 ){.
13900 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
13910 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20 20  Profile ){.     
13920 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
13930 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d  ult(interp, pDb-
13940 3e 7a 50 72 6f 66 69 6c 65 2c 20 28 63 68 61 72  >zProfile, (char
13950 2a 29 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  *)0);.      }.  
13960 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
13970 68 61 72 20 2a 7a 50 72 6f 66 69 6c 65 3b 0a 20  har *zProfile;. 
13980 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20       int len;.  
13990 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72      if( pDb->zPr
139a0 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  ofile ){.       
139b0 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
139c0 50 72 6f 66 69 6c 65 29 3b 0a 20 20 20 20 20 20  Profile);.      
139d0 7d 0a 20 20 20 20 20 20 7a 50 72 6f 66 69 6c 65  }.      zProfile
139e0 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
139f0 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
13a00 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66   &len);.      if
13a10 28 20 7a 50 72 6f 66 69 6c 65 20 26 26 20 6c 65  ( zProfile && le
13a20 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  n>0 ){.        p
13a30 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 3d 20 54  Db->zProfile = T
13a40 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20  cl_Alloc( len + 
13a50 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  1 );.        mem
13a60 63 70 79 28 70 44 62 2d 3e 7a 50 72 6f 66 69 6c  cpy(pDb->zProfil
13a70 65 2c 20 7a 50 72 6f 66 69 6c 65 2c 20 6c 65 6e  e, zProfile, len
13a80 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  +1);.      }else
13a90 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
13aa0 50 72 6f 66 69 6c 65 20 3d 20 30 3b 0a 20 20 20  Profile = 0;.   
13ab0 20 20 20 7d 0a 23 69 66 20 21 64 65 66 69 6e 65     }.#if !define
13ac0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
13ad0 41 43 45 29 20 26 26 20 21 64 65 66 69 6e 65 64  ACE) && !defined
13ae0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f  (SQLITE_OMIT_FLO
13af0 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20  ATING_POINT).   
13b00 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f     if( pDb->zPro
13b10 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  file ){.        
13b20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e  pDb->interp = in
13b30 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71  terp;.        sq
13b40 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65 28 70 44  lite3_profile(pD
13b50 62 2d 3e 64 62 2c 20 44 62 50 72 6f 66 69 6c 65  b->db, DbProfile
13b60 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20  Handler, pDb);. 
13b70 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
13b80 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 66      sqlite3_prof
13b90 69 6c 65 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20  ile(pDb->db, 0, 
13ba0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  0);.      }.#end
13bb0 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65  if.    }.    bre
13bc0 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
13bd0 2a 2a 20 20 20 20 20 24 64 62 20 72 65 6b 65 79  **     $db rekey
13be0 20 4b 45 59 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43   KEY.  **.  ** C
13bf0 68 61 6e 67 65 20 74 68 65 20 65 6e 63 72 79 70  hange the encryp
13c00 74 69 6f 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20  tion key on the 
13c10 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20 64  currently open d
13c20 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  atabase..  */.  
13c30 63 61 73 65 20 44 42 5f 52 45 4b 45 59 3a 20 7b  case DB_REKEY: {
13c40 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
13c50 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 69 6e 74  AS_CODEC.    int
13c60 20 6e 4b 65 79 3b 0a 20 20 20 20 76 6f 69 64 20   nKey;.    void 
13c70 2a 70 4b 65 79 3b 0a 23 65 6e 64 69 66 0a 20 20  *pKey;.#endif.  
13c80 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
13c90 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
13ca0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
13cb0 32 2c 20 6f 62 6a 76 2c 20 22 4b 45 59 22 29 3b  2, objv, "KEY");
13cc0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
13cd0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23  L_ERROR;.    }.#
13ce0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
13cf0 5f 43 4f 44 45 43 0a 20 20 20 20 70 4b 65 79 20  _CODEC.    pKey 
13d00 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72  = Tcl_GetByteArr
13d10 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ayFromObj(objv[2
13d20 5d 2c 20 26 6e 4b 65 79 29 3b 0a 20 20 20 20 72  ], &nKey);.    r
13d30 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 6b 65  c = sqlite3_reke
13d40 79 28 70 44 62 2d 3e 64 62 2c 20 70 4b 65 79 2c  y(pDb->db, pKey,
13d50 20 6e 4b 65 79 29 3b 0a 20 20 20 20 69 66 28 20   nKey);.    if( 
13d60 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  rc ){.      Tcl_
13d70 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
13d80 65 72 70 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  erp, sqlite3_err
13d90 73 74 72 28 72 63 29 2c 20 28 63 68 61 72 2a 29  str(rc), (char*)
13da0 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54  0);.      rc = T
13db0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
13dc0 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b  #endif.    break
13dd0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24  ;.  }..  /*    $
13de0 64 62 20 72 65 73 74 6f 72 65 20 3f 44 41 54 41  db restore ?DATA
13df0 42 41 53 45 3f 20 46 49 4c 45 4e 41 4d 45 0a 20  BASE? FILENAME. 
13e00 20 2a 2a 0a 20 20 2a 2a 20 4f 70 65 6e 20 61 20   **.  ** Open a 
13e10 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61  database file na
13e20 6d 65 64 20 46 49 4c 45 4e 41 4d 45 2e 20 20 54  med FILENAME.  T
13e30 72 61 6e 73 66 65 72 20 74 68 65 20 63 6f 6e 74  ransfer the cont
13e40 65 6e 74 20 0a 20 20 2a 2a 20 6f 66 20 46 49 4c  ent .  ** of FIL
13e50 45 4e 41 4d 45 20 69 6e 74 6f 20 74 68 65 20 6c  ENAME into the l
13e60 6f 63 61 6c 20 64 61 74 61 62 61 73 65 20 44 41  ocal database DA
13e70 54 41 42 41 53 45 20 28 64 65 66 61 75 6c 74 3a  TABASE (default:
13e80 20 22 6d 61 69 6e 22 29 2e 0a 20 20 2a 2f 0a 20   "main")..  */. 
13e90 20 63 61 73 65 20 44 42 5f 52 45 53 54 4f 52 45   case DB_RESTORE
13ea0 3a 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  : {.    const ch
13eb0 61 72 20 2a 7a 53 72 63 46 69 6c 65 3b 0a 20 20  ar *zSrcFile;.  
13ec0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
13ed0 65 73 74 44 62 3b 0a 20 20 20 20 73 71 6c 69 74  estDb;.    sqlit
13ee0 65 33 20 2a 70 53 72 63 3b 0a 20 20 20 20 73 71  e3 *pSrc;.    sq
13ef0 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42  lite3_backup *pB
13f00 61 63 6b 75 70 3b 0a 20 20 20 20 69 6e 74 20 6e  ackup;.    int n
13f10 54 69 6d 65 6f 75 74 20 3d 20 30 3b 0a 0a 20 20  Timeout = 0;..  
13f20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b    if( objc==3 ){
13f30 0a 20 20 20 20 20 20 7a 44 65 73 74 44 62 20 3d  .      zDestDb =
13f40 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 20 20 7a   "main";.      z
13f50 53 72 63 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65  SrcFile = Tcl_Ge
13f60 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
13f70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
13f80 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20  objc==4 ){.     
13f90 20 7a 44 65 73 74 44 62 20 3d 20 54 63 6c 5f 47   zDestDb = Tcl_G
13fa0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
13fb0 29 3b 0a 20 20 20 20 20 20 7a 53 72 63 46 69 6c  );.      zSrcFil
13fc0 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
13fd0 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 20 20  g(objv[3]);.    
13fe0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c  }else{.      Tcl
13ff0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
14000 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
14010 3f 44 41 54 41 42 41 53 45 3f 20 46 49 4c 45 4e  ?DATABASE? FILEN
14020 41 4d 45 22 29 3b 0a 20 20 20 20 20 20 72 65 74  AME");.      ret
14030 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
14040 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
14050 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 7a 53  lite3_open_v2(zS
14060 72 63 46 69 6c 65 2c 20 26 70 53 72 63 2c 20 53  rcFile, &pSrc, S
14070 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
14080 4e 4c 59 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  NLY, 0);.    if(
14090 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
140a0 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
140b0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
140c0 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 73 6f   "cannot open so
140d0 75 72 63 65 20 64 61 74 61 62 61 73 65 3a 20 22  urce database: "
140e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  ,.           sql
140f0 69 74 65 33 5f 65 72 72 6d 73 67 28 70 53 72 63  ite3_errmsg(pSrc
14100 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ), (char*)0);.  
14110 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
14120 65 28 70 53 72 63 29 3b 0a 20 20 20 20 20 20 72  e(pSrc);.      r
14130 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
14140 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 61 63 6b  .    }.    pBack
14150 75 70 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63  up = sqlite3_bac
14160 6b 75 70 5f 69 6e 69 74 28 70 44 62 2d 3e 64 62  kup_init(pDb->db
14170 2c 20 7a 44 65 73 74 44 62 2c 20 70 53 72 63 2c  , zDestDb, pSrc,
14180 20 22 6d 61 69 6e 22 29 3b 0a 20 20 20 20 69 66   "main");.    if
14190 28 20 70 42 61 63 6b 75 70 3d 3d 30 20 29 7b 0a  ( pBackup==0 ){.
141a0 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
141b0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
141c0 72 65 73 74 6f 72 65 20 66 61 69 6c 65 64 3a 20  restore failed: 
141d0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71  ",.           sq
141e0 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62  lite3_errmsg(pDb
141f0 2d 3e 64 62 29 2c 20 28 63 68 61 72 2a 29 30 29  ->db), (char*)0)
14200 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
14210 63 6c 6f 73 65 28 70 53 72 63 29 3b 0a 20 20 20  close(pSrc);.   
14220 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
14230 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77  ROR;.    }.    w
14240 68 69 6c 65 28 20 28 72 63 20 3d 20 73 71 6c 69  hile( (rc = sqli
14250 74 65 33 5f 62 61 63 6b 75 70 5f 73 74 65 70 28  te3_backup_step(
14260 70 42 61 63 6b 75 70 2c 31 30 30 29 29 3d 3d 53  pBackup,100))==S
14270 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20  QLITE_OK.       
14280 20 20 20 20 20 20 20 7c 7c 20 72 63 3d 3d 53 51         || rc==SQ
14290 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
142a0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
142b0 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20  E_BUSY ){.      
142c0 20 20 69 66 28 20 6e 54 69 6d 65 6f 75 74 2b 2b    if( nTimeout++
142d0 20 3e 3d 20 33 20 29 20 62 72 65 61 6b 3b 0a 20   >= 3 ) break;. 
142e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
142f0 6c 65 65 70 28 31 30 30 29 3b 0a 20 20 20 20 20  leep(100);.     
14300 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
14310 69 74 65 33 5f 62 61 63 6b 75 70 5f 66 69 6e 69  ite3_backup_fini
14320 73 68 28 70 42 61 63 6b 75 70 29 3b 0a 20 20 20  sh(pBackup);.   
14330 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
14340 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 72 63  DONE ){.      rc
14350 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d   = TCL_OK;.    }
14360 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
14370 49 54 45 5f 42 55 53 59 20 7c 7c 20 72 63 3d 3d  ITE_BUSY || rc==
14380 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 29 7b  SQLITE_LOCKED ){
14390 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
143a0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
143b0 22 72 65 73 74 6f 72 65 20 66 61 69 6c 65 64 3a  "restore failed:
143c0 20 73 6f 75 72 63 65 20 64 61 74 61 62 61 73 65   source database
143d0 20 62 75 73 79 22 2c 0a 20 20 20 20 20 20 20 20   busy",.        
143e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
143f0 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
14400 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  rc = TCL_ERROR;.
14410 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14420 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
14430 74 28 69 6e 74 65 72 70 2c 20 22 72 65 73 74 6f  t(interp, "resto
14440 72 65 20 66 61 69 6c 65 64 3a 20 22 2c 0a 20 20  re failed: ",.  
14450 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
14460 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29  _errmsg(pDb->db)
14470 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
14480 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f     rc = TCL_ERRO
14490 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  R;.    }.    sql
144a0 69 74 65 33 5f 63 6c 6f 73 65 28 70 53 72 63 29  ite3_close(pSrc)
144b0 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
144c0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20  ..  /*.  **     
144d0 24 64 62 20 73 74 61 74 75 73 20 28 73 74 65 70  $db status (step
144e0 7c 73 6f 72 74 7c 61 75 74 6f 69 6e 64 65 78 29  |sort|autoindex)
144f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 69 73 70 6c  .  **.  ** Displ
14500 61 79 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54  ay SQLITE_STMTST
14510 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54  ATUS_FULLSCAN_ST
14520 45 50 20 6f 72 20 0a 20 20 2a 2a 20 53 51 4c 49  EP or .  ** SQLI
14530 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 53 4f  TE_STMTSTATUS_SO
14540 52 54 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20  RT for the most 
14550 72 65 63 65 6e 74 20 65 76 61 6c 2e 0a 20 20 2a  recent eval..  *
14560 2f 0a 20 20 63 61 73 65 20 44 42 5f 53 54 41 54  /.  case DB_STAT
14570 55 53 3a 20 7b 0a 20 20 20 20 69 6e 74 20 76 3b  US: {.    int v;
14580 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
14590 2a 7a 4f 70 3b 0a 20 20 20 20 69 66 28 20 6f 62  *zOp;.    if( ob
145a0 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54  jc!=3 ){.      T
145b0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
145c0 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
145d0 20 22 28 73 74 65 70 7c 73 6f 72 74 7c 61 75 74   "(step|sort|aut
145e0 6f 69 6e 64 65 78 29 22 29 3b 0a 20 20 20 20 20  oindex)");.     
145f0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
14600 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4f 70  R;.    }.    zOp
14610 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
14620 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 69  (objv[2]);.    i
14630 66 28 20 73 74 72 63 6d 70 28 7a 4f 70 2c 20 22  f( strcmp(zOp, "
14640 73 74 65 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20  step")==0 ){.   
14650 20 20 20 76 20 3d 20 70 44 62 2d 3e 6e 53 74 65     v = pDb->nSte
14660 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  p;.    }else if(
14670 20 73 74 72 63 6d 70 28 7a 4f 70 2c 20 22 73 6f   strcmp(zOp, "so
14680 72 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rt")==0 ){.     
14690 20 76 20 3d 20 70 44 62 2d 3e 6e 53 6f 72 74 3b   v = pDb->nSort;
146a0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
146b0 74 72 63 6d 70 28 7a 4f 70 2c 20 22 61 75 74 6f  trcmp(zOp, "auto
146c0 69 6e 64 65 78 22 29 3d 3d 30 20 29 7b 0a 20 20  index")==0 ){.  
146d0 20 20 20 20 76 20 3d 20 70 44 62 2d 3e 6e 49 6e      v = pDb->nIn
146e0 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  dex;.    }else{.
146f0 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
14700 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 0a  Result(interp, .
14710 20 20 20 20 20 20 20 20 20 20 20 20 22 62 61 64              "bad
14720 20 61 72 67 75 6d 65 6e 74 3a 20 73 68 6f 75 6c   argument: shoul
14730 64 20 62 65 20 61 75 74 6f 69 6e 64 65 78 2c 20  d be autoindex, 
14740 73 74 65 70 2c 20 6f 72 20 73 6f 72 74 22 2c 20  step, or sort", 
14750 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68  .            (ch
14760 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 65  ar*)0);.      re
14770 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
14780 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 53 65      }.    Tcl_Se
14790 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
147a0 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
147b0 28 76 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  (v));.    break;
147c0 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a  .  }.  .  /*.  *
147d0 2a 20 20 20 20 20 24 64 62 20 74 69 6d 65 6f 75  *     $db timeou
147e0 74 20 4d 49 4c 4c 45 53 45 43 4f 4e 44 53 0a 20  t MILLESECONDS. 
147f0 20 2a 2a 0a 20 20 2a 2a 20 44 65 6c 61 79 20 66   **.  ** Delay f
14800 6f 72 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  or the number of
14810 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 70   milliseconds sp
14820 65 63 69 66 69 65 64 20 77 68 65 6e 20 61 20 66  ecified when a f
14830 69 6c 65 20 69 73 20 6c 6f 63 6b 65 64 2e 0a 20  ile is locked.. 
14840 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 54 49   */.  case DB_TI
14850 4d 45 4f 55 54 3a 20 7b 0a 20 20 20 20 69 6e 74  MEOUT: {.    int
14860 20 6d 73 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a   ms;.    if( obj
14870 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=3 ){.      Tc
14880 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
14890 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
148a0 22 4d 49 4c 4c 49 53 45 43 4f 4e 44 53 22 29 3b  "MILLISECONDS");
148b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
148c0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
148d0 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e     if( Tcl_GetIn
148e0 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
148f0 20 6f 62 6a 76 5b 32 5d 2c 20 26 6d 73 29 20 29   objv[2], &ms) )
14900 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
14910 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  R;.    sqlite3_b
14920 75 73 79 5f 74 69 6d 65 6f 75 74 28 70 44 62 2d  usy_timeout(pDb-
14930 3e 64 62 2c 20 6d 73 29 3b 0a 20 20 20 20 62 72  >db, ms);.    br
14940 65 61 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  eak;.  }.  .  /*
14950 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 74 6f  .  **     $db to
14960 74 61 6c 5f 63 68 61 6e 67 65 73 0a 20 20 2a 2a  tal_changes.  **
14970 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  .  ** Return the
14980 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
14990 74 68 61 74 20 77 65 72 65 20 6d 6f 64 69 66 69  that were modifi
149a0 65 64 2c 20 69 6e 73 65 72 74 65 64 2c 20 6f 72  ed, inserted, or
149b0 20 64 65 6c 65 74 65 64 20 0a 20 20 2a 2a 20 73   deleted .  ** s
149c0 69 6e 63 65 20 74 68 65 20 64 61 74 61 62 61 73  ince the databas
149d0 65 20 68 61 6e 64 6c 65 20 77 61 73 20 63 72 65  e handle was cre
149e0 61 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  ated..  */.  cas
149f0 65 20 44 42 5f 54 4f 54 41 4c 5f 43 48 41 4e 47  e DB_TOTAL_CHANG
14a00 45 53 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62  ES: {.    Tcl_Ob
14a10 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20 20  j *pResult;.    
14a20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
14a30 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
14a40 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
14a50 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20   objv, "");.    
14a60 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
14a70 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 52  OR;.    }.    pR
14a80 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f  esult = Tcl_GetO
14a90 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  bjResult(interp)
14aa0 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 49 6e 74  ;.    Tcl_SetInt
14ab0 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 73 71 6c  Obj(pResult, sql
14ac0 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67  ite3_total_chang
14ad0 65 73 28 70 44 62 2d 3e 64 62 29 29 3b 0a 20 20  es(pDb->db));.  
14ae0 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
14af0 2f 2a 20 20 20 20 24 64 62 20 74 72 61 63 65 20  /*    $db trace 
14b00 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a  ?CALLBACK?.  **.
14b10 20 20 2a 2a 20 4d 61 6b 65 20 61 72 72 61 6e 67    ** Make arrang
14b20 65 6d 65 6e 74 73 20 74 6f 20 69 6e 76 6f 6b 65  ements to invoke
14b30 20 74 68 65 20 43 41 4c 4c 42 41 43 4b 20 72 6f   the CALLBACK ro
14b40 75 74 69 6e 65 20 66 6f 72 20 65 61 63 68 20 53  utine for each S
14b50 51 4c 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a  QL statement.  *
14b60 2a 20 74 68 61 74 20 69 73 20 65 78 65 63 75 74  * that is execut
14b70 65 64 2e 20 20 54 68 65 20 74 65 78 74 20 6f 66  ed.  The text of
14b80 20 74 68 65 20 53 51 4c 20 69 73 20 61 70 70 65   the SQL is appe
14b90 6e 64 65 64 20 74 6f 20 43 41 4c 4c 42 41 43 4b  nded to CALLBACK
14ba0 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 69 74 20   before.  ** it 
14bb0 69 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20 2a  is executed..  *
14bc0 2f 0a 20 20 63 61 73 65 20 44 42 5f 54 52 41 43  /.  case DB_TRAC
14bd0 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a  E: {.    if( obj
14be0 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  c>3 ){.      Tcl
14bf0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
14c00 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
14c10 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20  ?CALLBACK?");.  
14c20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
14c30 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20  RROR;.    }else 
14c40 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20  if( objc==2 ){. 
14c50 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 54       if( pDb->zT
14c60 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  race ){.        
14c70 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
14c80 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 54  (interp, pDb->zT
14c90 72 61 63 65 2c 20 28 63 68 61 72 2a 29 30 29 3b  race, (char*)0);
14ca0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
14cb0 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  se{.      char *
14cc0 7a 54 72 61 63 65 3b 0a 20 20 20 20 20 20 69 6e  zTrace;.      in
14cd0 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28  t len;.      if(
14ce0 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a   pDb->zTrace ){.
14cf0 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65          Tcl_Free
14d00 28 70 44 62 2d 3e 7a 54 72 61 63 65 29 3b 0a 20  (pDb->zTrace);. 
14d10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54 72       }.      zTr
14d20 61 63 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ace = Tcl_GetStr
14d30 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
14d40 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20  2], &len);.     
14d50 20 69 66 28 20 7a 54 72 61 63 65 20 26 26 20 6c   if( zTrace && l
14d60 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  en>0 ){.        
14d70 70 44 62 2d 3e 7a 54 72 61 63 65 20 3d 20 54 63  pDb->zTrace = Tc
14d80 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31  l_Alloc( len + 1
14d90 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   );.        memc
14da0 70 79 28 70 44 62 2d 3e 7a 54 72 61 63 65 2c 20  py(pDb->zTrace, 
14db0 7a 54 72 61 63 65 2c 20 6c 65 6e 2b 31 29 3b 0a  zTrace, len+1);.
14dc0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14dd0 20 20 20 20 20 70 44 62 2d 3e 7a 54 72 61 63 65       pDb->zTrace
14de0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69   = 0;.      }.#i
14df0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
14e00 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26  E_OMIT_TRACE) &&
14e10 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
14e20 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
14e30 4f 49 4e 54 29 0a 20 20 20 20 20 20 69 66 28 20  OINT).      if( 
14e40 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20  pDb->zTrace ){. 
14e50 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65         pDb->inte
14e60 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20  rp = interp;.   
14e70 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 72 61       sqlite3_tra
14e80 63 65 28 70 44 62 2d 3e 64 62 2c 20 44 62 54 72  ce(pDb->db, DbTr
14e90 61 63 65 48 61 6e 64 6c 65 72 2c 20 70 44 62 29  aceHandler, pDb)
14ea0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
14eb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74         sqlite3_t
14ec0 72 61 63 65 28 70 44 62 2d 3e 64 62 2c 20 30 2c  race(pDb->db, 0,
14ed0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e   0);.      }.#en
14ee0 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 62 72  dif.    }.    br
14ef0 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
14f00 20 20 24 64 62 20 74 72 61 6e 73 61 63 74 69 6f    $db transactio
14f10 6e 20 5b 2d 64 65 66 65 72 72 65 64 7c 2d 69 6d  n [-deferred|-im
14f20 6d 65 64 69 61 74 65 7c 2d 65 78 63 6c 75 73 69  mediate|-exclusi
14f30 76 65 5d 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a  ve] SCRIPT.  **.
14f40 20 20 2a 2a 20 53 74 61 72 74 20 61 20 6e 65 77    ** Start a new
14f50 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 66   transaction (if
14f60 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65   we are not alre
14f70 61 64 79 20 69 6e 20 74 68 65 20 6d 69 64 73 74  ady in the midst
14f80 20 6f 66 20 61 0a 20 20 2a 2a 20 74 72 61 6e 73   of a.  ** trans
14f90 61 63 74 69 6f 6e 29 20 61 6e 64 20 65 78 65 63  action) and exec
14fa0 75 74 65 20 74 68 65 20 54 43 4c 20 73 63 72 69  ute the TCL scri
14fb0 70 74 20 53 43 52 49 50 54 2e 20 20 41 66 74 65  pt SCRIPT.  Afte
14fc0 72 20 53 43 52 49 50 54 0a 20 20 2a 2a 20 63 6f  r SCRIPT.  ** co
14fd0 6d 70 6c 65 74 65 73 2c 20 65 69 74 68 65 72 20  mpletes, either 
14fe0 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  commit the trans
14ff0 61 63 74 69 6f 6e 20 6f 72 20 72 6f 6c 6c 20 69  action or roll i
15000 74 20 62 61 63 6b 20 69 66 20 53 43 52 49 50 54  t back if SCRIPT
15010 0a 20 20 2a 2a 20 74 68 72 6f 77 73 20 61 6e 20  .  ** throws an 
15020 65 78 63 65 70 74 69 6f 6e 2e 20 20 4f 72 20 69  exception.  Or i
15030 66 20 6e 6f 20 6e 65 77 20 74 72 61 6e 73 61 74  f no new transat
15040 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64 2c  ion was started,
15050 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 20 20 2a   do nothing..  *
15060 2a 20 70 61 73 73 20 74 68 65 20 65 78 63 65 70  * pass the excep
15070 74 69 6f 6e 20 6f 6e 20 75 70 20 74 68 65 20 73  tion on up the s
15080 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  tack..  **.  ** 
15090 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 77 61 73  This command was
150a0 20 69 6e 73 70 69 72 65 64 20 62 79 20 44 61 76   inspired by Dav
150b0 65 20 54 68 6f 6d 61 73 27 73 20 74 61 6c 6b 20  e Thomas's talk 
150c0 6f 6e 20 52 75 62 79 20 61 74 20 74 68 65 0a 20  on Ruby at the. 
150d0 20 2a 2a 20 32 30 30 35 20 4f 27 52 65 69 6c 6c   ** 2005 O'Reill
150e0 79 20 4f 70 65 6e 20 53 6f 75 72 63 65 20 43 6f  y Open Source Co
150f0 6e 76 65 6e 74 69 6f 6e 20 28 4f 53 43 4f 4e 29  nvention (OSCON)
15100 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
15110 5f 54 52 41 4e 53 41 43 54 49 4f 4e 3a 20 7b 0a  _TRANSACTION: {.
15120 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63      Tcl_Obj *pSc
15130 72 69 70 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20  ript;.    const 
15140 63 68 61 72 20 2a 7a 42 65 67 69 6e 20 3d 20 22  char *zBegin = "
15150 53 41 56 45 50 4f 49 4e 54 20 5f 74 63 6c 5f 74  SAVEPOINT _tcl_t
15160 72 61 6e 73 61 63 74 69 6f 6e 22 3b 0a 20 20 20  ransaction";.   
15170 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 26 26 20   if( objc!=3 && 
15180 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 20  objc!=4 ){.     
15190 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
151a0 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
151b0 76 2c 20 22 5b 54 59 50 45 5d 20 53 43 52 49 50  v, "[TYPE] SCRIP
151c0 54 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  T");.      retur
151d0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
151e0 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 44 62 2d   }..    if( pDb-
151f0 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 30  >nTransaction==0
15200 20 26 26 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20   && objc==4 ){. 
15210 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
15220 74 20 63 68 61 72 20 2a 54 54 59 50 45 5f 73 74  t char *TTYPE_st
15230 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  rs[] = {.       
15240 20 22 64 65 66 65 72 72 65 64 22 2c 20 20 20 22   "deferred",   "
15250 65 78 63 6c 75 73 69 76 65 22 2c 20 20 22 69 6d  exclusive",  "im
15260 6d 65 64 69 61 74 65 22 2c 20 30 0a 20 20 20 20  mediate", 0.    
15270 20 20 7d 3b 0a 20 20 20 20 20 20 65 6e 75 6d 20    };.      enum 
15280 54 54 59 50 45 5f 65 6e 75 6d 20 7b 0a 20 20 20  TTYPE_enum {.   
15290 20 20 20 20 20 54 54 59 50 45 5f 44 45 46 45 52       TTYPE_DEFER
152a0 52 45 44 2c 20 54 54 59 50 45 5f 45 58 43 4c 55  RED, TTYPE_EXCLU
152b0 53 49 56 45 2c 20 54 54 59 50 45 5f 49 4d 4d 45  SIVE, TTYPE_IMME
152c0 44 49 41 54 45 0a 20 20 20 20 20 20 7d 3b 0a 20  DIATE.      };. 
152d0 20 20 20 20 20 69 6e 74 20 74 74 79 70 65 3b 0a       int ttype;.
152e0 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65        if( Tcl_Ge
152f0 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e  tIndexFromObj(in
15300 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 54  terp, objv[2], T
15310 54 59 50 45 5f 73 74 72 73 2c 20 22 74 72 61 6e  TYPE_strs, "tran
15320 73 61 63 74 69 6f 6e 20 74 79 70 65 22 2c 0a 20  saction 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 20 30 2c 20               0, 
15350 26 74 74 79 70 65 29 20 29 7b 0a 20 20 20 20 20  &ttype) ){.     
15360 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
15370 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
15380 20 20 20 73 77 69 74 63 68 28 20 28 65 6e 75 6d     switch( (enum
15390 20 54 54 59 50 45 5f 65 6e 75 6d 29 74 74 79 70   TTYPE_enum)ttyp
153a0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73  e ){.        cas
153b0 65 20 54 54 59 50 45 5f 44 45 46 45 52 52 45 44  e TTYPE_DEFERRED
153c0 3a 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f  :    /* no-op */
153d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
153e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
153f0 20 63 61 73 65 20 54 54 59 50 45 5f 45 58 43 4c   case TTYPE_EXCL
15400 55 53 49 56 45 3a 20 20 20 7a 42 65 67 69 6e 20  USIVE:   zBegin 
15410 3d 20 22 42 45 47 49 4e 20 45 58 43 4c 55 53 49  = "BEGIN EXCLUSI
15420 56 45 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  VE";  break;.   
15430 20 20 20 20 20 63 61 73 65 20 54 54 59 50 45 5f       case TTYPE_
15440 49 4d 4d 45 44 49 41 54 45 3a 20 20 20 7a 42 65  IMMEDIATE:   zBe
15450 67 69 6e 20 3d 20 22 42 45 47 49 4e 20 49 4d 4d  gin = "BEGIN IMM
15460 45 44 49 41 54 45 22 3b 20 20 62 72 65 61 6b 3b  EDIATE";  break;
15470 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
15480 20 20 20 70 53 63 72 69 70 74 20 3d 20 6f 62 6a     pScript = obj
15490 76 5b 6f 62 6a 63 2d 31 5d 3b 0a 0a 20 20 20 20  v[objc-1];..    
154a0 2f 2a 20 52 75 6e 20 74 68 65 20 53 51 4c 69 74  /* Run the SQLit
154b0 65 20 42 45 47 49 4e 20 63 6f 6d 6d 61 6e 64 20  e BEGIN command 
154c0 74 6f 20 6f 70 65 6e 20 61 20 74 72 61 6e 73 61  to open a transa
154d0 63 74 69 6f 6e 20 6f 72 20 73 61 76 65 70 6f 69  ction or savepoi
154e0 6e 74 2e 20 2a 2f 0a 20 20 20 20 70 44 62 2d 3e  nt. */.    pDb->
154f0 64 69 73 61 62 6c 65 41 75 74 68 2b 2b 3b 0a 20  disableAuth++;. 
15500 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
15510 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 7a 42  exec(pDb->db, zB
15520 65 67 69 6e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  egin, 0, 0, 0);.
15530 20 20 20 20 70 44 62 2d 3e 64 69 73 61 62 6c 65      pDb->disable
15540 41 75 74 68 2d 2d 3b 0a 20 20 20 20 69 66 28 20  Auth--;.    if( 
15550 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
15560 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
15570 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
15580 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
15590 44 62 2d 3e 64 62 29 2c 20 28 63 68 61 72 2a 29  Db->db), (char*)
155a0 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
155b0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
155c0 7d 0a 20 20 20 20 70 44 62 2d 3e 6e 54 72 61 6e  }.    pDb->nTran
155d0 73 61 63 74 69 6f 6e 2b 2b 3b 0a 0a 20 20 20 20  saction++;..    
155e0 2f 2a 20 49 66 20 75 73 69 6e 67 20 4e 52 45 2c  /* If using NRE,
155f0 20 73 63 68 65 64 75 6c 65 20 61 20 63 61 6c 6c   schedule a call
15600 62 61 63 6b 20 74 6f 20 69 6e 76 6f 6b 65 20 74  back to invoke t
15610 68 65 20 73 63 72 69 70 74 20 70 53 63 72 69 70  he script pScrip
15620 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61  t, then.    ** a
15630 20 73 65 63 6f 6e 64 20 63 61 6c 6c 62 61 63 6b   second callback
15640 20 74 6f 20 63 6f 6d 6d 69 74 20 28 6f 72 20 72   to commit (or r
15650 6f 6c 6c 62 61 63 6b 29 20 74 68 65 20 74 72 61  ollback) the tra
15660 6e 73 61 63 74 69 6f 6e 20 6f 72 20 73 61 76 65  nsaction or save
15670 70 6f 69 6e 74 0a 20 20 20 20 2a 2a 20 6f 70 65  point.    ** ope
15680 6e 65 64 20 61 62 6f 76 65 2e 20 49 66 20 6e 6f  ned above. If no
15690 74 20 75 73 69 6e 67 20 4e 52 45 2c 20 65 76 61  t using NRE, eva
156a0 6c 75 61 74 65 20 74 68 65 20 73 63 72 69 70 74  luate the script
156b0 20 64 69 72 65 63 74 6c 79 2c 20 74 68 65 6e 0a   directly, then.
156c0 20 20 20 20 2a 2a 20 63 61 6c 6c 20 66 75 6e 63      ** call func
156d0 74 69 6f 6e 20 44 62 54 72 61 6e 73 50 6f 73 74  tion DbTransPost
156e0 43 6d 64 28 29 20 74 6f 20 63 6f 6d 6d 69 74 20  Cmd() to commit 
156f0 28 6f 72 20 72 6f 6c 6c 62 61 63 6b 29 20 74 68  (or rollback) th
15700 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20  e transaction . 
15710 20 20 20 2a 2a 20 6f 72 20 73 61 76 65 70 6f 69     ** or savepoi
15720 6e 74 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  nt.  */.    if( 
15730 44 62 55 73 65 4e 72 65 28 29 20 29 7b 0a 20 20  DbUseNre() ){.  
15740 20 20 20 20 54 63 6c 5f 4e 52 41 64 64 43 61 6c      Tcl_NRAddCal
15750 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 44 62  lback(interp, Db
15760 54 72 61 6e 73 50 6f 73 74 43 6d 64 2c 20 63 64  TransPostCmd, cd
15770 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
15780 20 20 28 76 6f 69 64 29 54 63 6c 5f 4e 52 45 76    (void)Tcl_NREv
15790 61 6c 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 53  alObj(interp, pS
157a0 63 72 69 70 74 2c 20 30 29 3b 0a 20 20 20 20 7d  cript, 0);.    }
157b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
157c0 20 44 62 54 72 61 6e 73 50 6f 73 74 43 6d 64 28   DbTransPostCmd(
157d0 26 63 64 2c 20 69 6e 74 65 72 70 2c 20 54 63 6c  &cd, interp, Tcl
157e0 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72  _EvalObjEx(inter
157f0 70 2c 20 70 53 63 72 69 70 74 2c 20 30 29 29 3b  p, pScript, 0));
15800 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
15810 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
15820 20 20 20 20 24 64 62 20 75 6e 6c 6f 63 6b 5f 6e      $db unlock_n
15830 6f 74 69 66 79 20 3f 73 63 72 69 70 74 3f 0a 20  otify ?script?. 
15840 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 55 4e   */.  case DB_UN
15850 4c 4f 43 4b 5f 4e 4f 54 49 46 59 3a 20 7b 0a 23  LOCK_NOTIFY: {.#
15860 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  ifndef SQLITE_EN
15870 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49  ABLE_UNLOCK_NOTI
15880 46 59 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  FY.    Tcl_Appen
15890 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
158a0 22 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 20 6e  "unlock_notify n
158b0 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  ot available in 
158c0 74 68 69 73 20 62 75 69 6c 64 22 2c 0a 20 20 20  this build",.   
158d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158e0 20 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20    (char*)0);.   
158f0 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b   rc = TCL_ERROR;
15900 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 6f  .#else.    if( o
15910 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d  bjc!=2 && objc!=
15920 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
15930 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
15940 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 53  rp, 2, objv, "?S
15950 43 52 49 50 54 3f 22 29 3b 0a 20 20 20 20 20 20  CRIPT?");.      
15960 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  rc = TCL_ERROR;.
15970 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15980 20 76 6f 69 64 20 28 2a 78 4e 6f 74 69 66 79 29   void (*xNotify)
15990 28 76 6f 69 64 20 2a 2a 2c 20 69 6e 74 29 20 3d  (void **, int) =
159a0 20 30 3b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a   0;.      void *
159b0 70 4e 6f 74 69 66 79 41 72 67 20 3d 20 30 3b 0a  pNotifyArg = 0;.
159c0 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
159d0 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 20 29 7b  pUnlockNotify ){
159e0 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63  .        Tcl_Dec
159f0 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70  rRefCount(pDb->p
15a00 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 29 3b 0a 20  UnlockNotify);. 
15a10 20 20 20 20 20 20 20 70 44 62 2d 3e 70 55 6e 6c         pDb->pUnl
15a20 6f 63 6b 4e 6f 74 69 66 79 20 3d 20 30 3b 0a 20  ockNotify = 0;. 
15a30 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
15a40 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20  if( objc==3 ){. 
15a50 20 20 20 20 20 20 20 78 4e 6f 74 69 66 79 20 3d         xNotify =
15a60 20 44 62 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 3b   DbUnlockNotify;
15a70 0a 20 20 20 20 20 20 20 20 70 4e 6f 74 69 66 79  .        pNotify
15a80 41 72 67 20 3d 20 28 76 6f 69 64 20 2a 29 70 44  Arg = (void *)pD
15a90 62 3b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  b;.        pDb->
15aa0 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 20 3d 20  pUnlockNotify = 
15ab0 6f 62 6a 76 5b 32 5d 3b 0a 20 20 20 20 20 20 20  objv[2];.       
15ac0 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
15ad0 74 28 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f  t(pDb->pUnlockNo
15ae0 74 69 66 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20  tify);.      }. 
15af0 20 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69   .      if( sqli
15b00 74 65 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66  te3_unlock_notif
15b10 79 28 70 44 62 2d 3e 64 62 2c 20 78 4e 6f 74 69  y(pDb->db, xNoti
15b20 66 79 2c 20 70 4e 6f 74 69 66 79 41 72 67 29 20  fy, pNotifyArg) 
15b30 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41  ){.        Tcl_A
15b40 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
15b50 72 70 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  rp, sqlite3_errm
15b60 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 28 63 68  sg(pDb->db), (ch
15b70 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 20 20  ar*)0);.        
15b80 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  rc = TCL_ERROR;.
15b90 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
15ba0 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a  ndif.    break;.
15bb0 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
15bc0 20 20 24 64 62 20 77 61 6c 5f 68 6f 6f 6b 20 3f    $db wal_hook ?
15bd0 73 63 72 69 70 74 3f 0a 20 20 2a 2a 20 20 20 20  script?.  **    
15be0 24 64 62 20 75 70 64 61 74 65 5f 68 6f 6f 6b 20  $db update_hook 
15bf0 3f 73 63 72 69 70 74 3f 0a 20 20 2a 2a 20 20 20  ?script?.  **   
15c00 20 24 64 62 20 72 6f 6c 6c 62 61 63 6b 5f 68 6f   $db rollback_ho
15c10 6f 6b 20 3f 73 63 72 69 70 74 3f 0a 20 20 2a 2f  ok ?script?.  */
15c20 0a 20 20 63 61 73 65 20 44 42 5f 57 41 4c 5f 48  .  case DB_WAL_H
15c30 4f 4f 4b 3a 20 0a 20 20 63 61 73 65 20 44 42 5f  OOK: .  case DB_
15c40 55 50 44 41 54 45 5f 48 4f 4f 4b 3a 20 0a 20 20  UPDATE_HOOK: .  
15c50 63 61 73 65 20 44 42 5f 52 4f 4c 4c 42 41 43 4b  case DB_ROLLBACK
15c60 5f 48 4f 4f 4b 3a 20 7b 0a 0a 20 20 20 20 2f 2a  _HOOK: {..    /*
15c70 20 73 65 74 20 70 70 48 6f 6f 6b 20 74 6f 20 70   set ppHook to p
15c80 6f 69 6e 74 20 61 74 20 70 55 70 64 61 74 65 48  oint at pUpdateH
15c90 6f 6f 6b 20 6f 72 20 70 52 6f 6c 6c 62 61 63 6b  ook or pRollback
15ca0 48 6f 6f 6b 2c 20 64 65 70 65 6e 64 69 6e 67 20  Hook, depending 
15cb0 6f 6e 20 0a 20 20 20 20 2a 2a 20 77 68 65 74 68  on .    ** wheth
15cc0 65 72 20 5b 24 64 62 20 75 70 64 61 74 65 5f 68  er [$db update_h
15cd0 6f 6f 6b 5d 20 6f 72 20 5b 24 64 62 20 72 6f 6c  ook] or [$db rol
15ce0 6c 62 61 63 6b 5f 68 6f 6f 6b 5d 20 77 61 73 20  lback_hook] was 
15cf0 69 6e 76 6f 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a  invoked..    */.
15d00 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 70 70      Tcl_Obj **pp
15d10 48 6f 6f 6b 3b 20 0a 20 20 20 20 69 66 28 20 63  Hook; .    if( c
15d20 68 6f 69 63 65 3d 3d 44 42 5f 55 50 44 41 54 45  hoice==DB_UPDATE
15d30 5f 48 4f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  _HOOK ){.      p
15d40 70 48 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e 70 55  pHook = &pDb->pU
15d50 70 64 61 74 65 48 6f 6f 6b 3b 0a 20 20 20 20 7d  pdateHook;.    }
15d60 65 6c 73 65 20 69 66 28 20 63 68 6f 69 63 65 3d  else if( choice=
15d70 3d 44 42 5f 57 41 4c 5f 48 4f 4f 4b 20 29 7b 0a  =DB_WAL_HOOK ){.
15d80 20 20 20 20 20 20 70 70 48 6f 6f 6b 20 3d 20 26        ppHook = &
15d90 70 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 3b 0a 20  pDb->pWalHook;. 
15da0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15db0 70 70 48 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e 70  ppHook = &pDb->p
15dc0 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3b 0a 20 20  RollbackHook;.  
15dd0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a    }..    if( obj
15de0 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33 20  c!=2 && objc!=3 
15df0 29 7b 0a 20 20 20 20 20 20 20 54 63 6c 5f 57 72  ){.       Tcl_Wr
15e00 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
15e10 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 53 43  p, 2, objv, "?SC
15e20 52 49 50 54 3f 22 29 3b 0a 20 20 20 20 20 20 20  RIPT?");.       
15e30 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
15e40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
15e50 2a 70 70 48 6f 6f 6b 20 29 7b 0a 20 20 20 20 20  *ppHook ){.     
15e60 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
15e70 74 28 69 6e 74 65 72 70 2c 20 2a 70 70 48 6f 6f  t(interp, *ppHoo
15e80 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 62  k);.      if( ob
15e90 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 20  jc==3 ){.       
15ea0 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
15eb0 74 28 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20 20 20  t(*ppHook);.    
15ec0 20 20 20 20 2a 70 70 48 6f 6f 6b 20 3d 20 30 3b      *ppHook = 0;
15ed0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
15ee0 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29     if( objc==3 )
15ef0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
15f00 21 28 2a 70 70 48 6f 6f 6b 29 20 29 3b 0a 20 20  !(*ppHook) );.  
15f10 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 43      if( Tcl_GetC
15f20 68 61 72 4c 65 6e 67 74 68 28 6f 62 6a 76 5b 32  harLength(objv[2
15f30 5d 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ])>0 ){.        
15f40 2a 70 70 48 6f 6f 6b 20 3d 20 6f 62 6a 76 5b 32  *ppHook = objv[2
15f50 5d 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 49  ];.        Tcl_I
15f60 6e 63 72 52 65 66 43 6f 75 6e 74 28 2a 70 70 48  ncrRefCount(*ppH
15f70 6f 6f 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ook);.      }.  
15f80 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33    }..    sqlite3
15f90 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28 70 44 62  _update_hook(pDb
15fa0 2d 3e 64 62 2c 20 28 70 44 62 2d 3e 70 55 70 64  ->db, (pDb->pUpd
15fb0 61 74 65 48 6f 6f 6b 3f 44 62 55 70 64 61 74 65  ateHook?DbUpdate
15fc0 48 61 6e 64 6c 65 72 3a 30 29 2c 20 70 44 62 29  Handler:0), pDb)
15fd0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 6f  ;.    sqlite3_ro
15fe0 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28 70 44 62 2d  llback_hook(pDb-
15ff0 3e 64 62 2c 28 70 44 62 2d 3e 70 52 6f 6c 6c 62  >db,(pDb->pRollb
16000 61 63 6b 48 6f 6f 6b 3f 44 62 52 6f 6c 6c 62 61  ackHook?DbRollba
16010 63 6b 48 61 6e 64 6c 65 72 3a 30 29 2c 70 44 62  ckHandler:0),pDb
16020 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77  );.    sqlite3_w
16030 61 6c 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c  al_hook(pDb->db,
16040 28 70 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 3f 44  (pDb->pWalHook?D
16050 62 57 61 6c 48 61 6e 64 6c 65 72 3a 30 29 2c 70  bWalHandler:0),p
16060 44 62 29 3b 0a 0a 20 20 20 20 62 72 65 61 6b 3b  Db);..    break;
16070 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64  .  }..  /*    $d
16080 62 20 76 65 72 73 69 6f 6e 0a 20 20 2a 2a 0a 20  b version.  **. 
16090 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76   ** Return the v
160a0 65 72 73 69 6f 6e 20 73 74 72 69 6e 67 20 66 6f  ersion string fo
160b0 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65 2e  r this database.
160c0 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
160d0 56 45 52 53 49 4f 4e 3a 20 7b 0a 20 20 20 20 54  VERSION: {.    T
160e0 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
160f0 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c  erp, (char *)sql
16100 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28  ite3_libversion(
16110 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  ), TCL_STATIC);.
16120 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
16130 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 6f 66 20 74  .  } /* End of t
16140 68 65 20 53 57 49 54 43 48 20 73 74 61 74 65 6d  he SWITCH statem
16150 65 6e 74 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ent */.  return 
16160 72 63 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  rc;.}..#if SQLIT
16170 45 5f 54 43 4c 5f 4e 52 45 0a 2f 2a 0a 2a 2a 20  E_TCL_NRE./*.** 
16180 41 64 61 70 74 6f 72 20 74 68 61 74 20 70 72 6f  Adaptor that pro
16190 76 69 64 65 73 20 61 6e 20 6f 62 6a 43 6d 64 20  vides an objCmd 
161a0 69 6e 74 65 72 66 61 63 65 20 74 6f 20 74 68 65  interface to the
161b0 20 4e 52 45 2d 65 6e 61 62 6c 65 64 0a 2a 2a 20   NRE-enabled.** 
161c0 69 6e 74 65 72 66 61 63 65 20 69 6d 70 6c 65 6d  interface implem
161d0 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  entation..*/.sta
161e0 74 69 63 20 69 6e 74 20 44 62 4f 62 6a 43 6d 64  tic int DbObjCmd
161f0 41 64 61 70 74 6f 72 28 0a 20 20 76 6f 69 64 20  Adaptor(.  void 
16200 2a 63 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  *cd,.  Tcl_Inter
16210 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
16220 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
16230 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76 0a 29 7b 0a   *const*objv.){.
16240 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e 52 43    return Tcl_NRC
16250 61 6c 6c 4f 62 6a 50 72 6f 63 28 69 6e 74 65 72  allObjProc(inter
16260 70 2c 20 44 62 4f 62 6a 43 6d 64 2c 20 63 64 2c  p, DbObjCmd, cd,
16270 20 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b 0a 7d 0a   objc, objv);.}.
16280 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
16290 5f 54 43 4c 5f 4e 52 45 20 2a 2f 0a 0a 2f 2a 0a  _TCL_NRE */../*.
162a0 2a 2a 20 20 20 73 71 6c 69 74 65 33 20 44 42 4e  **   sqlite3 DBN
162b0 41 4d 45 20 46 49 4c 45 4e 41 4d 45 20 3f 2d 76  AME FILENAME ?-v
162c0 66 73 20 56 46 53 4e 41 4d 45 3f 20 3f 2d 6b 65  fs VFSNAME? ?-ke
162d0 79 20 4b 45 59 3f 20 3f 2d 72 65 61 64 6f 6e 6c  y KEY? ?-readonl
162e0 79 20 42 4f 4f 4c 45 41 4e 3f 0a 2a 2a 20 20 20  y 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 20 3f 2d 63 72 65 61 74 65          ?-create
16310 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d 6e 6f 6d 75   BOOLEAN? ?-nomu
16320 74 65 78 20 42 4f 4f 4c 45 41 4e 3f 0a 2a 2a 0a  tex BOOLEAN?.**.
16330 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 6d  ** This is the m
16340 61 69 6e 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 2e  ain Tcl command.
16350 20 20 57 68 65 6e 20 74 68 65 20 22 73 71 6c 69    When the "sqli
16360 74 65 22 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20  te" Tcl command 
16370 69 73 0a 2a 2a 20 69 6e 76 6f 6b 65 64 2c 20 74  is.** invoked, t
16380 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
16390 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 61 74   to process that
163a0 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
163b0 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
163c0 6e 74 2c 20 44 42 4e 41 4d 45 2c 20 69 73 20 61  nt, DBNAME, is a
163d0 6e 20 61 72 62 69 74 72 61 72 79 20 6e 61 6d 65  n arbitrary name
163e0 20 66 6f 72 20 61 20 6e 65 77 0a 2a 2a 20 64 61   for a new.** da
163f0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
16400 6e 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64  n.  This command
16410 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 20 63   creates a new c
16420 6f 6d 6d 61 6e 64 20 6e 61 6d 65 64 0a 2a 2a 20  ommand named.** 
16430 44 42 4e 41 4d 45 20 74 68 61 74 20 69 73 20 75  DBNAME that is u
16440 73 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74  sed to control t
16450 68 61 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20  hat connection. 
16460 20 54 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   The database.**
16470 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 64   connection is d
16480 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20  eleted when the 
16490 44 42 4e 41 4d 45 20 63 6f 6d 6d 61 6e 64 20 69  DBNAME command i
164a0 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a  s deleted..**.**
164b0 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
164c0 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d 65  ment is the name
164d0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
164e0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61   file..**.*/.sta
164f0 74 69 63 20 69 6e 74 20 44 62 4d 61 69 6e 28 76  tic int DbMain(v
16500 6f 69 64 20 2a 63 64 2c 20 54 63 6c 5f 49 6e 74  oid *cd, Tcl_Int
16510 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
16520 20 6f 62 6a 63 2c 54 63 6c 5f 4f 62 6a 20 2a 63   objc,Tcl_Obj *c
16530 6f 6e 73 74 2a 6f 62 6a 76 29 7b 0a 20 20 53 71  onst*objv){.  Sq
16540 6c 69 74 65 44 62 20 2a 70 3b 0a 20 20 63 6f 6e  liteDb *p;.  con
16550 73 74 20 63 68 61 72 20 2a 7a 41 72 67 3b 0a 20  st char *zArg;. 
16560 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 3b 0a   char *zErrMsg;.
16570 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74    int i;.  const
16580 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20   char *zFile;.  
16590 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73  const char *zVfs
165a0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 66 6c 61 67   = 0;.  int flag
165b0 73 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  s;.  Tcl_DString
165c0 20 74 72 61 6e 73 6c 61 74 65 64 46 69 6c 65 6e   translatedFilen
165d0 61 6d 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ame;.#ifdef SQLI
165e0 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 76  TE_HAS_CODEC.  v
165f0 6f 69 64 20 2a 70 4b 65 79 20 3d 20 30 3b 0a 20  oid *pKey = 0;. 
16600 20 69 6e 74 20 6e 4b 65 79 20 3d 20 30 3b 0a 23   int nKey = 0;.#
16610 65 6e 64 69 66 0a 20 20 69 6e 74 20 72 63 3b 0a  endif.  int rc;.
16620 0a 20 20 2f 2a 20 49 6e 20 6e 6f 72 6d 61 6c 20  .  /* In normal 
16630 75 73 65 2c 20 65 61 63 68 20 54 43 4c 20 69 6e  use, each TCL in
16640 74 65 72 70 72 65 74 65 72 20 72 75 6e 73 20 69  terpreter runs i
16650 6e 20 61 20 73 69 6e 67 6c 65 20 74 68 72 65 61  n a single threa
16660 64 2e 20 20 53 6f 0a 20 20 2a 2a 20 62 79 20 64  d.  So.  ** by d
16670 65 66 61 75 6c 74 2c 20 77 65 20 63 61 6e 20 74  efault, we can t
16680 75 72 6e 20 6f 66 20 6d 75 74 65 78 69 6e 67 20  urn of mutexing 
16690 6f 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  on SQLite databa
166a0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a  se connections..
166b0 20 20 2a 2a 20 48 6f 77 65 76 65 72 2c 20 66 6f    ** However, fo
166c0 72 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73  r testing purpos
166d0 65 73 20 69 74 20 69 73 20 75 73 65 66 75 6c 20  es it is useful 
166e0 74 6f 20 68 61 76 65 20 6d 75 74 65 78 65 73 20  to have mutexes 
166f0 74 75 72 6e 65 64 0a 20 20 2a 2a 20 6f 6e 2e 20  turned.  ** on. 
16700 20 53 6f 2c 20 62 79 20 64 65 66 61 75 6c 74 2c   So, by default,
16710 20 6d 75 74 65 78 65 73 20 64 65 66 61 75 6c 74   mutexes default
16720 20 6f 66 66 2e 20 20 42 75 74 20 69 66 20 63 6f   off.  But if co
16730 6d 70 69 6c 65 64 20 77 69 74 68 0a 20 20 2a 2a  mpiled with.  **
16740 20 53 51 4c 49 54 45 5f 54 43 4c 5f 44 45 46 41   SQLITE_TCL_DEFA
16750 55 4c 54 5f 46 55 4c 4c 4d 55 54 45 58 20 74 68  ULT_FULLMUTEX th
16760 65 6e 20 6d 75 74 65 78 65 73 20 64 65 66 61 75  en mutexes defau
16770 6c 74 20 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64  lt on..  */.#ifd
16780 65 66 20 53 51 4c 49 54 45 5f 54 43 4c 5f 44 45  ef SQLITE_TCL_DE
16790 46 41 55 4c 54 5f 46 55 4c 4c 4d 55 54 45 58 0a  FAULT_FULLMUTEX.
167a0 20 20 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45    flags = SQLITE
167b0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
167c0 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  | SQLITE_OPEN_CR
167d0 45 41 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  EATE | SQLITE_OP
167e0 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 3b 0a 23 65  EN_FULLMUTEX;.#e
167f0 6c 73 65 0a 20 20 66 6c 61 67 73 20 3d 20 53 51  lse.  flags = SQ
16800 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
16810 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE | SQLITE_OPE
16820 4e 5f 43 52 45 41 54 45 20 7c 20 53 51 4c 49 54  N_CREATE | SQLIT
16830 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 3b 0a  E_OPEN_NOMUTEX;.
16840 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6f 62  #endif..  if( ob
16850 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 7a 41 72  jc==2 ){.    zAr
16860 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  g = Tcl_GetStrin
16870 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d  gFromObj(objv[1]
16880 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 73 74  , 0);.    if( st
16890 72 63 6d 70 28 7a 41 72 67 2c 22 2d 76 65 72 73  rcmp(zArg,"-vers
168a0 69 6f 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ion")==0 ){.    
168b0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
168c0 6c 74 28 69 6e 74 65 72 70 2c 73 71 6c 69 74 65  lt(interp,sqlite
168d0 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28 29 2c 20  3_libversion(), 
168e0 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
168f0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
16900 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74      }.    if( st
16910 72 63 6d 70 28 7a 41 72 67 2c 22 2d 68 61 73 2d  rcmp(zArg,"-has-
16920 63 6f 64 65 63 22 29 3d 3d 30 20 29 7b 0a 23 69  codec")==0 ){.#i
16930 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
16940 43 4f 44 45 43 0a 20 20 20 20 20 20 54 63 6c 5f  CODEC.      Tcl_
16950 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
16960 65 72 70 2c 22 31 22 2c 28 63 68 61 72 2a 29 30  erp,"1",(char*)0
16970 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 54  );.#else.      T
16980 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
16990 69 6e 74 65 72 70 2c 22 30 22 2c 28 63 68 61 72  interp,"0",(char
169a0 2a 29 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  *)0);.#endif.   
169b0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
169c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  ;.    }.  }.  fo
169d0 72 28 69 3d 33 3b 20 69 2b 31 3c 6f 62 6a 63 3b  r(i=3; i+1<objc;
169e0 20 69 2b 3d 32 29 7b 0a 20 20 20 20 7a 41 72 67   i+=2){.    zArg
169f0 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
16a00 28 6f 62 6a 76 5b 69 5d 29 3b 0a 20 20 20 20 69  (objv[i]);.    i
16a10 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22  f( strcmp(zArg,"
16a20 2d 6b 65 79 22 29 3d 3d 30 20 29 7b 0a 23 69 66  -key")==0 ){.#if
16a30 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
16a40 4f 44 45 43 0a 20 20 20 20 20 20 70 4b 65 79 20  ODEC.      pKey 
16a50 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72  = Tcl_GetByteArr
16a60 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 69  ayFromObj(objv[i
16a70 2b 31 5d 2c 20 26 6e 4b 65 79 29 3b 0a 23 65 6e  +1], &nKey);.#en
16a80 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  dif.    }else if
16a90 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22  ( strcmp(zArg, "
16aa0 2d 76 66 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20  -vfs")==0 ){.   
16ab0 20 20 20 7a 56 66 73 20 3d 20 54 63 6c 5f 47 65     zVfs = Tcl_Ge
16ac0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69 2b 31  tString(objv[i+1
16ad0 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ]);.    }else if
16ae0 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22  ( strcmp(zArg, "
16af0 2d 72 65 61 64 6f 6e 6c 79 22 29 3d 3d 30 20 29  -readonly")==0 )
16b00 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 3b 0a 20  {.      int b;. 
16b10 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74       if( Tcl_Get
16b20 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
16b30 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d  nterp, objv[i+1]
16b40 2c 20 26 62 29 20 29 20 72 65 74 75 72 6e 20 54  , &b) ) return T
16b50 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
16b60 69 66 28 20 62 20 29 7b 0a 20 20 20 20 20 20 20  if( b ){.       
16b70 20 66 6c 61 67 73 20 26 3d 20 7e 28 53 51 4c 49   flags &= ~(SQLI
16b80 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
16b90 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  E|SQLITE_OPEN_CR
16ba0 45 41 54 45 29 3b 0a 20 20 20 20 20 20 20 20 66  EATE);.        f
16bb0 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
16bc0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  PEN_READONLY;.  
16bd0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16be0 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c     flags &= ~SQL
16bf0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
16c00 59 3b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  Y;.        flags
16c10 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   |= SQLITE_OPEN_
16c20 52 45 41 44 57 52 49 54 45 3b 0a 20 20 20 20 20  READWRITE;.     
16c30 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
16c40 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d   strcmp(zArg, "-
16c50 63 72 65 61 74 65 22 29 3d 3d 30 20 29 7b 0a 20  create")==0 ){. 
16c60 20 20 20 20 20 69 6e 74 20 62 3b 0a 20 20 20 20       int b;.    
16c70 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f    if( Tcl_GetBoo
16c80 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
16c90 72 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26  rp, objv[i+1], &
16ca0 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
16cb0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 69 66 28  ERROR;.      if(
16cc0 20 62 20 26 26 20 28 66 6c 61 67 73 20 26 20 53   b && (flags & S
16cd0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
16ce0 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  NLY)==0 ){.     
16cf0 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49     flags |= SQLI
16d00 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 3b 0a  TE_OPEN_CREATE;.
16d10 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
16d20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53       flags &= ~S
16d30 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
16d40 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
16d50 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
16d60 7a 41 72 67 2c 20 22 2d 6e 6f 6d 75 74 65 78 22  zArg, "-nomutex"
16d70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
16d80 74 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20 54  t b;.      if( T
16d90 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f  cl_GetBooleanFro
16da0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
16db0 76 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20 72 65  v[i+1], &b) ) re
16dc0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
16dd0 20 20 20 20 20 20 69 66 28 20 62 20 29 7b 0a 20        if( b ){. 
16de0 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20         flags |= 
16df0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55  SQLITE_OPEN_NOMU
16e00 54 45 58 3b 0a 20 20 20 20 20 20 20 20 66 6c 61  TEX;.        fla
16e10 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50  gs &= ~SQLITE_OP
16e20 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 3b 0a 20 20  EN_FULLMUTEX;.  
16e30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16e40 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c     flags &= ~SQL
16e50 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58  ITE_OPEN_NOMUTEX
16e60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
16e70 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
16e80 41 72 67 2c 20 22 2d 66 75 6c 6c 6d 75 74 65 78  Arg, "-fullmutex
16e90 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
16ea0 6e 74 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20  nt b;.      if( 
16eb0 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
16ec0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
16ed0 6a 76 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20 72  jv[i+1], &b) ) r
16ee0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
16ef0 0a 20 20 20 20 20 20 69 66 28 20 62 20 29 7b 0a  .      if( b ){.
16f00 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d          flags |=
16f10 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c   SQLITE_OPEN_FUL
16f20 4c 4d 55 54 45 58 3b 0a 20 20 20 20 20 20 20 20  LMUTEX;.        
16f30 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
16f40 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 3b 0a 20  _OPEN_NOMUTEX;. 
16f50 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
16f60 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51      flags &= ~SQ
16f70 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55  LITE_OPEN_FULLMU
16f80 54 45 58 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  TEX;.      }.   
16f90 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
16fa0 70 28 7a 41 72 67 2c 20 22 2d 75 72 69 22 29 3d  p(zArg, "-uri")=
16fb0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
16fc0 62 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c  b;.      if( Tcl
16fd0 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
16fe0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
16ff0 69 2b 31 5d 2c 20 26 62 29 20 29 20 72 65 74 75  i+1], &b) ) retu
17000 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
17010 20 20 20 20 69 66 28 20 62 20 29 7b 0a 20 20 20      if( b ){.   
17020 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51       flags |= SQ
17030 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 20  LITE_OPEN_URI;. 
17040 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
17050 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51      flags &= ~SQ
17060 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 20  LITE_OPEN_URI;. 
17070 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
17080 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
17090 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
170a0 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e   "unknown option
170b0 3a 20 22 2c 20 7a 41 72 67 2c 20 28 63 68 61 72  : ", zArg, (char
170c0 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  *)0);.      retu
170d0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
170e0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62    }.  }.  if( ob
170f0 6a 63 3c 33 20 7c 7c 20 28 6f 62 6a 63 26 31 29  jc<3 || (objc&1)
17100 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=1 ){.    Tcl_W
17110 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
17120 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 0a 20 20  rp, 1, objv, .  
17130 20 20 20 20 22 48 41 4e 44 4c 45 20 46 49 4c 45      "HANDLE FILE
17140 4e 41 4d 45 20 3f 2d 76 66 73 20 56 46 53 4e 41  NAME ?-vfs VFSNA
17150 4d 45 3f 20 3f 2d 72 65 61 64 6f 6e 6c 79 20 42  ME? ?-readonly B
17160 4f 4f 4c 45 41 4e 3f 20 3f 2d 63 72 65 61 74 65  OOLEAN? ?-create
17170 20 42 4f 4f 4c 45 41 4e 3f 22 0a 20 20 20 20 20   BOOLEAN?".     
17180 20 22 20 3f 2d 6e 6f 6d 75 74 65 78 20 42 4f 4f   " ?-nomutex BOO
17190 4c 45 41 4e 3f 20 3f 2d 66 75 6c 6c 6d 75 74 65  LEAN? ?-fullmute
171a0 78 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d 75 72 69  x BOOLEAN? ?-uri
171b0 20 42 4f 4f 4c 45 41 4e 3f 22 0a 23 69 66 64 65   BOOLEAN?".#ifde
171c0 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
171d0 45 43 0a 20 20 20 20 20 20 22 20 3f 2d 6b 65 79  EC.      " ?-key
171e0 20 43 4f 44 45 43 4b 45 59 3f 22 0a 23 65 6e 64   CODECKEY?".#end
171f0 69 66 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 65  if.    );.    re
17200 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
17210 20 20 7d 0a 20 20 7a 45 72 72 4d 73 67 20 3d 20    }.  zErrMsg = 
17220 30 3b 0a 20 20 70 20 3d 20 28 53 71 6c 69 74 65  0;.  p = (Sqlite
17230 44 62 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73  Db*)Tcl_Alloc( s
17240 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69  izeof(*p) );.  i
17250 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 54  f( p==0 ){.    T
17260 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
17270 65 72 70 2c 20 28 63 68 61 72 20 2a 29 22 6d 61  erp, (char *)"ma
17280 6c 6c 6f 63 20 66 61 69 6c 65 64 22 2c 20 54 43  lloc failed", TC
17290 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72  L_STATIC);.    r
172a0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
172b0 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 2c  .  }.  memset(p,
172c0 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b   0, sizeof(*p));
172d0 0a 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47  .  zFile = Tcl_G
172e0 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
172f0 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 7a  objv[2], 0);.  z
17300 46 69 6c 65 20 3d 20 54 63 6c 5f 54 72 61 6e 73  File = Tcl_Trans
17310 6c 61 74 65 46 69 6c 65 4e 61 6d 65 28 69 6e 74  lateFileName(int
17320 65 72 70 2c 20 7a 46 69 6c 65 2c 20 26 74 72 61  erp, zFile, &tra
17330 6e 73 6c 61 74 65 64 46 69 6c 65 6e 61 6d 65 29  nslatedFilename)
17340 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
17350 5f 6f 70 65 6e 5f 76 32 28 7a 46 69 6c 65 2c 20  _open_v2(zFile, 
17360 26 70 2d 3e 64 62 2c 20 66 6c 61 67 73 2c 20 7a  &p->db, flags, z
17370 56 66 73 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72  Vfs);.  Tcl_DStr
17380 69 6e 67 46 72 65 65 28 26 74 72 61 6e 73 6c 61  ingFree(&transla
17390 74 65 64 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  tedFilename);.  
173a0 69 66 28 20 70 2d 3e 64 62 20 29 7b 0a 20 20 20  if( p->db ){.   
173b0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
173c0 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
173d0 70 2d 3e 64 62 29 20 29 7b 0a 20 20 20 20 20 20  p->db) ){.      
173e0 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
173f0 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20  3_mprintf("%s", 
17400 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
17410 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 73 71  ->db));.      sq
17420 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64  lite3_close(p->d
17430 62 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64 62 20  b);.      p->db 
17440 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 0;.    }.  }el
17450 73 65 7b 0a 20 20 20 20 7a 45 72 72 4d 73 67 20  se{.    zErrMsg 
17460 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
17470 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f  f("%s", sqlite3_
17480 65 72 72 73 74 72 28 72 63 29 29 3b 0a 20 20 7d  errstr(rc));.  }
17490 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
174a0 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 70  AS_CODEC.  if( p
174b0 2d 3e 64 62 20 29 7b 0a 20 20 20 20 73 71 6c 69  ->db ){.    sqli
174c0 74 65 33 5f 6b 65 79 28 70 2d 3e 64 62 2c 20 70  te3_key(p->db, p
174d0 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 7d 0a  Key, nKey);.  }.
174e0 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e  #endif.  if( p->
174f0 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c  db==0 ){.    Tcl
17500 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
17510 70 2c 20 7a 45 72 72 4d 73 67 2c 20 54 43 4c 5f  p, zErrMsg, TCL_
17520 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 54  VOLATILE);.    T
17530 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70  cl_Free((char*)p
17540 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
17550 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ree(zErrMsg);.  
17560 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
17570 4f 52 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 78  OR;.  }.  p->max
17580 53 74 6d 74 20 3d 20 4e 55 4d 5f 50 52 45 50 41  Stmt = NUM_PREPA
17590 52 45 44 5f 53 54 4d 54 53 3b 0a 20 20 70 2d 3e  RED_STMTS;.  p->
175a0 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b  interp = interp;
175b0 0a 20 20 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65  .  zArg = Tcl_Ge
175c0 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
175d0 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 69 66  bjv[1], 0);.  if
175e0 28 20 44 62 55 73 65 4e 72 65 28 29 20 29 7b 0a  ( DbUseNre() ){.
175f0 20 20 20 20 54 63 6c 5f 4e 52 43 72 65 61 74 65      Tcl_NRCreate
17600 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
17610 7a 41 72 67 2c 20 44 62 4f 62 6a 43 6d 64 41 64  zArg, DbObjCmdAd
17620 61 70 74 6f 72 2c 20 44 62 4f 62 6a 43 6d 64 2c  aptor, DbObjCmd,
17630 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17640 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
17650 70 2c 20 44 62 44 65 6c 65 74 65 43 6d 64 29 3b  p, DbDeleteCmd);
17660 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63  .  }else{.    Tc
17670 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
17680 6e 64 28 69 6e 74 65 72 70 2c 20 7a 41 72 67 2c  nd(interp, zArg,
17690 20 44 62 4f 62 6a 43 6d 64 2c 20 28 63 68 61 72   DbObjCmd, (char
176a0 2a 29 70 2c 20 44 62 44 65 6c 65 74 65 43 6d 64  *)p, DbDeleteCmd
176b0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
176c0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
176d0 20 50 72 6f 76 69 64 65 20 61 20 64 75 6d 6d 79   Provide a dummy
176e0 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 20 69   Tcl_InitStubs i
176f0 66 20 77 65 20 61 72 65 20 75 73 69 6e 67 20 74  f we are using t
17700 68 69 73 20 61 73 20 61 20 73 74 61 74 69 63 0a  his as a static.
17710 2a 2a 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23  ** library..*/.#
17720 69 66 6e 64 65 66 20 55 53 45 5f 54 43 4c 5f 53  ifndef USE_TCL_S
17730 54 55 42 53 0a 23 20 75 6e 64 65 66 20 20 54 63  TUBS.# undef  Tc
17740 6c 5f 49 6e 69 74 53 74 75 62 73 0a 23 20 64 65  l_InitStubs.# de
17750 66 69 6e 65 20 54 63 6c 5f 49 6e 69 74 53 74 75  fine Tcl_InitStu
17760 62 73 28 61 2c 62 2c 63 29 20 54 43 4c 5f 56 45  bs(a,b,c) TCL_VE
17770 52 53 49 4f 4e 0a 23 65 6e 64 69 66 0a 0a 2f 2a  RSION.#endif../*
17780 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65  .** Make sure we
17790 20 68 61 76 65 20 61 20 50 41 43 4b 41 47 45 5f   have a PACKAGE_
177a0 56 45 52 53 49 4f 4e 20 6d 61 63 72 6f 20 64 65  VERSION macro de
177b0 66 69 6e 65 64 2e 20 20 54 68 69 73 20 77 69 6c  fined.  This wil
177c0 6c 20 62 65 0a 2a 2a 20 64 65 66 69 6e 65 64 20  l be.** defined 
177d0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 62 79  automatically by
177e0 20 74 68 65 20 54 45 41 20 6d 61 6b 65 66 69 6c   the TEA makefil
177f0 65 2e 20 20 42 75 74 20 6f 74 68 65 72 20 6d 61  e.  But other ma
17800 6b 65 66 69 6c 65 73 0a 2a 2a 20 64 6f 20 6e 6f  kefiles.** do no
17810 74 20 64 65 66 69 6e 65 20 69 74 2e 0a 2a 2f 0a  t define it..*/.
17820 23 69 66 6e 64 65 66 20 50 41 43 4b 41 47 45 5f  #ifndef PACKAGE_
17830 56 45 52 53 49 4f 4e 0a 23 20 64 65 66 69 6e 65  VERSION.# define
17840 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e   PACKAGE_VERSION
17850 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 0a   SQLITE_VERSION.
17860 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
17870 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f  itialize this mo
17880 64 75 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  dule..**.** This
17890 20 54 63 6c 20 6d 6f 64 75 6c 65 20 63 6f 6e 74   Tcl module cont
178a0 61 69 6e 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67  ains only a sing
178b0 6c 65 20 6e 65 77 20 54 63 6c 20 63 6f 6d 6d 61  le new Tcl comma
178c0 6e 64 20 6e 61 6d 65 64 20 22 73 71 6c 69 74 65  nd named "sqlite
178d0 22 2e 0a 2a 2a 20 28 48 65 6e 63 65 20 74 68 65  "..** (Hence the
178e0 72 65 20 69 73 20 6e 6f 20 6e 61 6d 65 73 70 61  re is no namespa
178f0 63 65 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f  ce.  There is no
17900 20 70 6f 69 6e 74 20 69 6e 20 75 73 69 6e 67 20   point in using 
17910 61 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69  a namespace.** i
17920 66 20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e 20  f the extension 
17930 6f 6e 6c 79 20 73 75 70 70 6c 69 65 73 20 6f 6e  only supplies on
17940 65 20 6e 65 77 20 6e 61 6d 65 21 29 20 20 54 68  e new name!)  Th
17950 65 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d 61  e "sqlite" comma
17960 6e 64 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f  nd is.** used to
17970 20 6f 70 65 6e 20 61 20 6e 65 77 20 53 51 4c 69   open a new SQLi
17980 74 65 20 64 61 74 61 62 61 73 65 2e 20 20 53 65  te database.  Se
17990 65 20 74 68 65 20 44 62 4d 61 69 6e 28 29 20 72  e the DbMain() r
179a0 6f 75 74 69 6e 65 20 61 62 6f 76 65 0a 2a 2a 20  outine above.** 
179b0 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
179c0 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a  nformation..**.*
179d0 2a 20 54 68 65 20 45 58 54 45 52 4e 20 6d 61 63  * The EXTERN mac
179e0 72 6f 73 20 61 72 65 20 72 65 71 75 69 72 65 64  ros are required
179f0 20 62 79 20 54 43 4c 20 69 6e 20 6f 72 64 65 72   by TCL in order
17a00 20 74 6f 20 77 6f 72 6b 20 6f 6e 20 77 69 6e 64   to work on wind
17a10 6f 77 73 2e 0a 2a 2f 0a 45 58 54 45 52 4e 20 69  ows..*/.EXTERN i
17a20 6e 74 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28  nt Sqlite3_Init(
17a30 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
17a40 72 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  rp){.  int rc = 
17a50 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 69 6e  Tcl_InitStubs(in
17a60 74 65 72 70 2c 20 22 38 2e 34 22 2c 20 30 29 20  terp, "8.4", 0) 
17a70 3f 20 54 43 4c 5f 4f 4b 20 3a 20 54 43 4c 5f 45  ? TCL_OK : TCL_E
17a80 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 3d 3d  RROR;.  if( rc==
17a90 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63  TCL_OK ){.    Tc
17aa0 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
17ab0 6e 64 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  nd(interp, "sqli
17ac0 74 65 33 22 2c 20 28 54 63 6c 5f 4f 62 6a 43 6d  te3", (Tcl_ObjCm
17ad0 64 50 72 6f 63 2a 29 44 62 4d 61 69 6e 2c 20 30  dProc*)DbMain, 0
17ae0 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  , 0);.#ifndef SQ
17af0 4c 49 54 45 5f 33 5f 53 55 46 46 49 58 5f 4f 4e  LITE_3_SUFFIX_ON
17b00 4c 59 0a 20 20 20 20 2f 2a 20 54 68 65 20 22 73  LY.    /* The "s
17b10 71 6c 69 74 65 22 20 61 6c 69 61 73 20 69 73 20  qlite" alias is 
17b20 75 6e 64 6f 63 75 6d 65 6e 74 65 64 2e 20 20 49  undocumented.  I
17b30 74 20 69 73 20 68 65 72 65 20 6f 6e 6c 79 20 74  t is here only t
17b40 6f 20 73 75 70 70 6f 72 74 0a 20 20 20 20 2a 2a  o support.    **
17b50 20 6c 65 67 61 63 79 20 73 63 72 69 70 74 73 2e   legacy scripts.
17b60 20 20 41 6c 6c 20 6e 65 77 20 73 63 72 69 70 74    All new script
17b70 73 20 73 68 6f 75 6c 64 20 75 73 65 20 6f 6e 6c  s should use onl
17b80 79 20 74 68 65 20 22 73 71 6c 69 74 65 33 22 0a  y the "sqlite3".
17b90 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20      ** command. 
17ba0 2a 2f 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74  */.    Tcl_Creat
17bb0 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
17bc0 72 70 2c 20 22 73 71 6c 69 74 65 22 2c 20 28 54  rp, "sqlite", (T
17bd0 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 2a 29 44  cl_ObjCmdProc*)D
17be0 62 4d 61 69 6e 2c 20 30 2c 20 30 29 3b 0a 23 65  bMain, 0, 0);.#e
17bf0 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20 54 63  ndif.    rc = Tc
17c00 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74  l_PkgProvide(int
17c10 65 72 70 2c 20 22 73 71 6c 69 74 65 33 22 2c 20  erp, "sqlite3", 
17c20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29  PACKAGE_VERSION)
17c30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
17c40 63 3b 0a 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20  c;.}.EXTERN int 
17c50 54 63 6c 73 71 6c 69 74 65 33 5f 49 6e 69 74 28  Tclsqlite3_Init(
17c60 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
17c70 72 70 29 7b 20 72 65 74 75 72 6e 20 53 71 6c 69  rp){ return Sqli
17c80 74 65 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  te3_Init(interp)
17c90 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 53  ; }.EXTERN int S
17ca0 71 6c 69 74 65 33 5f 55 6e 6c 6f 61 64 28 54 63  qlite3_Unload(Tc
17cb0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
17cc0 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 20 72 65  , int flags){ re
17cd0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 45  turn TCL_OK; }.E
17ce0 58 54 45 52 4e 20 69 6e 74 20 54 63 6c 73 71 6c  XTERN int Tclsql
17cf0 69 74 65 33 5f 55 6e 6c 6f 61 64 28 54 63 6c 5f  ite3_Unload(Tcl_
17d00 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
17d10 69 6e 74 20 66 6c 61 67 73 29 7b 20 72 65 74 75  int flags){ retu
17d20 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 0a 2f 2a  rn TCL_OK; }../*
17d30 20 42 65 63 61 75 73 65 20 69 74 20 61 63 63 65   Because it acce
17d40 73 73 65 73 20 74 68 65 20 66 69 6c 65 2d 73 79  sses the file-sy
17d50 73 74 65 6d 20 61 6e 64 20 75 73 65 73 20 70 65  stem and uses pe
17d60 72 73 69 73 74 65 6e 74 20 73 74 61 74 65 2c 20  rsistent state, 
17d70 53 51 4c 69 74 65 0a 2a 2a 20 69 73 20 6e 6f 74  SQLite.** is not
17d80 20 63 6f 6e 73 69 64 65 72 65 64 20 61 70 70 72   considered appr
17d90 6f 70 72 69 61 74 65 20 66 6f 72 20 73 61 66 65  opriate for safe
17da0 20 69 6e 74 65 72 70 72 65 74 65 72 73 2e 20 20   interpreters.  
17db0 48 65 6e 63 65 2c 20 77 65 20 64 65 6c 69 62 65  Hence, we delibe
17dc0 72 61 74 65 6c 79 0a 2a 2a 20 6f 6d 69 74 20 74  rately.** omit t
17dd0 68 65 20 5f 53 61 66 65 49 6e 69 74 28 29 20 69  he _SafeInit() i
17de0 6e 74 65 72 66 61 63 65 73 2e 0a 2a 2f 0a 0a 23  nterfaces..*/..#
17df0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 33 5f  ifndef SQLITE_3_
17e00 53 55 46 46 49 58 5f 4f 4e 4c 59 0a 69 6e 74 20  SUFFIX_ONLY.int 
17e10 53 71 6c 69 74 65 5f 49 6e 69 74 28 54 63 6c 5f  Sqlite_Init(Tcl_
17e20 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b  Interp *interp){
17e30 20 72 65 74 75 72 6e 20 53 71 6c 69 74 65 33 5f   return Sqlite3_
17e40 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a  Init(interp); }.
17e50 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 5f 49 6e  int Tclsqlite_In
17e60 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  it(Tcl_Interp *i
17e70 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20 53  nterp){ return S
17e80 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74 65  qlite3_Init(inte
17e90 72 70 29 3b 20 7d 0a 69 6e 74 20 53 71 6c 69 74  rp); }.int Sqlit
17ea0 65 5f 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74  e_Unload(Tcl_Int
17eb0 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
17ec0 20 66 6c 61 67 73 29 7b 20 72 65 74 75 72 6e 20   flags){ return 
17ed0 54 43 4c 5f 4f 4b 3b 20 7d 0a 69 6e 74 20 54 63  TCL_OK; }.int Tc
17ee0 6c 73 71 6c 69 74 65 5f 55 6e 6c 6f 61 64 28 54  lsqlite_Unload(T
17ef0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
17f00 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 20 72  p, int flags){ r
17f10 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a  eturn TCL_OK; }.
17f20 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 54  #endif..#ifdef T
17f30 43 4c 53 48 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  CLSH./**********
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 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68  ***.** All of th
17f90 65 20 63 6f 64 65 20 74 68 61 74 20 66 6f 6c 6c  e code that foll
17fa0 6f 77 73 20 69 73 20 75 73 65 64 20 74 6f 20 62  ows is used to b
17fb0 75 69 6c 64 20 73 74 61 6e 64 61 6c 6f 6e 65 20  uild standalone 
17fc0 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 73  TCL interpreters
17fd0 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 73 74 61  .** that are sta
17fe0 74 69 63 61 6c 6c 79 20 6c 69 6e 6b 65 64 20 77  tically linked w
17ff0 69 74 68 20 53 51 4c 69 74 65 2e 20 20 45 6e 61  ith SQLite.  Ena
18000 62 6c 65 20 74 68 65 73 65 20 62 79 20 63 6f 6d  ble these by com
18010 70 69 6c 69 6e 67 0a 2a 2a 20 77 69 74 68 20 2d  piling.** with -
18020 44 54 43 4c 53 48 3d 6e 20 77 68 65 72 65 20 6e  DTCLSH=n where n
18030 20 63 61 6e 20 62 65 20 31 20 6f 72 20 32 2e 20   can be 1 or 2. 
18040 20 41 6e 20 6e 20 6f 66 20 31 20 67 65 6e 65 72   An n of 1 gener
18050 61 74 65 73 20 61 20 73 74 61 6e 64 61 72 64 0a  ates a standard.
18060 2a 2a 20 74 63 6c 73 68 20 62 75 74 20 77 69 74  ** tclsh but wit
18070 68 20 53 51 4c 69 74 65 20 62 75 69 6c 74 20 69  h SQLite built i
18080 6e 2e 20 20 41 6e 20 6e 20 6f 66 20 32 20 67 65  n.  An n of 2 ge
18090 6e 65 72 61 74 65 73 20 74 68 65 20 53 51 4c 69  nerates the SQLi
180a0 74 65 20 73 70 61 63 65 0a 2a 2a 20 61 6e 61 6c  te space.** anal
180b0 79 73 69 73 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f  ysis program..*/
180c0 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
180d0 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65  LITE_TEST) || de
180e0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 43 4c  fined(SQLITE_TCL
180f0 4d 44 35 29 0a 2f 2a 0a 20 2a 20 54 68 69 73 20  MD5)./*. * This 
18100 63 6f 64 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  code implements 
18110 74 68 65 20 4d 44 35 20 6d 65 73 73 61 67 65 2d  the MD5 message-
18120 64 69 67 65 73 74 20 61 6c 67 6f 72 69 74 68 6d  digest algorithm
18130 2e 0a 20 2a 20 54 68 65 20 61 6c 67 6f 72 69 74  .. * The algorit
18140 68 6d 20 69 73 20 64 75 65 20 74 6f 20 52 6f 6e  hm is due to Ron
18150 20 52 69 76 65 73 74 2e 20 20 54 68 69 73 20 63   Rivest.  This c
18160 6f 64 65 20 77 61 73 0a 20 2a 20 77 72 69 74 74  ode was. * writt
18170 65 6e 20 62 79 20 43 6f 6c 69 6e 20 50 6c 75 6d  en by Colin Plum
18180 62 20 69 6e 20 31 39 39 33 2c 20 6e 6f 20 63 6f  b in 1993, no co
18190 70 79 72 69 67 68 74 20 69 73 20 63 6c 61 69 6d  pyright is claim
181a0 65 64 2e 0a 20 2a 20 54 68 69 73 20 63 6f 64 65  ed.. * This code
181b0 20 69 73 20 69 6e 20 74 68 65 20 70 75 62 6c 69   is in the publi
181c0 63 20 64 6f 6d 61 69 6e 3b 20 64 6f 20 77 69 74  c domain; do wit
181d0 68 20 69 74 20 77 68 61 74 20 79 6f 75 20 77 69  h it what you wi
181e0 73 68 2e 0a 20 2a 0a 20 2a 20 45 71 75 69 76 61  sh.. *. * Equiva
181f0 6c 65 6e 74 20 63 6f 64 65 20 69 73 20 61 76 61  lent code is ava
18200 69 6c 61 62 6c 65 20 66 72 6f 6d 20 52 53 41 20  ilable from RSA 
18210 44 61 74 61 20 53 65 63 75 72 69 74 79 2c 20 49  Data Security, I
18220 6e 63 2e 0a 20 2a 20 54 68 69 73 20 63 6f 64 65  nc.. * This code
18230 20 68 61 73 20 62 65 65 6e 20 74 65 73 74 65 64   has been tested
18240 20 61 67 61 69 6e 73 74 20 74 68 61 74 2c 20 61   against that, a
18250 6e 64 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  nd is equivalent
18260 2c 0a 20 2a 20 65 78 63 65 70 74 20 74 68 61 74  ,. * except that
18270 20 79 6f 75 20 64 6f 6e 27 74 20 6e 65 65 64 20   you don't need 
18280 74 6f 20 69 6e 63 6c 75 64 65 20 74 77 6f 20 70  to include two p
18290 61 67 65 73 20 6f 66 20 6c 65 67 61 6c 65 73 65  ages of legalese
182a0 0a 20 2a 20 77 69 74 68 20 65 76 65 72 79 20 63  . * with every c
182b0 6f 70 79 2e 0a 20 2a 0a 20 2a 20 54 6f 20 63 6f  opy.. *. * To co
182c0 6d 70 75 74 65 20 74 68 65 20 6d 65 73 73 61 67  mpute the messag
182d0 65 20 64 69 67 65 73 74 20 6f 66 20 61 20 63 68  e digest of a ch
182e0 75 6e 6b 20 6f 66 20 62 79 74 65 73 2c 20 64 65  unk of bytes, de
182f0 63 6c 61 72 65 20 61 6e 0a 20 2a 20 4d 44 35 43  clare an. * MD5C
18300 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75 72 65  ontext structure
18310 2c 20 70 61 73 73 20 69 74 20 74 6f 20 4d 44 35  , pass it to MD5
18320 49 6e 69 74 2c 20 63 61 6c 6c 20 4d 44 35 55 70  Init, call MD5Up
18330 64 61 74 65 20 61 73 0a 20 2a 20 6e 65 65 64 65  date as. * neede
18340 64 20 6f 6e 20 62 75 66 66 65 72 73 20 66 75 6c  d on buffers ful
18350 6c 20 6f 66 20 62 79 74 65 73 2c 20 61 6e 64 20  l of bytes, and 
18360 74 68 65 6e 20 63 61 6c 6c 20 4d 44 35 46 69 6e  then call MD5Fin
18370 61 6c 2c 20 77 68 69 63 68 0a 20 2a 20 77 69 6c  al, which. * wil
18380 6c 20 66 69 6c 6c 20 61 20 73 75 70 70 6c 69 65  l fill a supplie
18390 64 20 31 36 2d 62 79 74 65 20 61 72 72 61 79 20  d 16-byte array 
183a0 77 69 74 68 20 74 68 65 20 64 69 67 65 73 74 2e  with the digest.
183b0 0a 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 49 66 20 63  . */../*. * If c
183c0 6f 6d 70 69 6c 65 64 20 6f 6e 20 61 20 6d 61 63  ompiled on a mac
183d0 68 69 6e 65 20 74 68 61 74 20 64 6f 65 73 6e 27  hine that doesn'
183e0 74 20 68 61 76 65 20 61 20 33 32 2d 62 69 74 20  t have a 32-bit 
183f0 69 6e 74 65 67 65 72 2c 0a 20 2a 20 79 6f 75 20  integer,. * you 
18400 6a 75 73 74 20 73 65 74 20 22 75 69 6e 74 33 32  just set "uint32
18410 22 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72  " to the appropr
18420 69 61 74 65 20 64 61 74 61 74 79 70 65 20 66 6f  iate datatype fo
18430 72 20 61 6e 0a 20 2a 20 75 6e 73 69 67 6e 65 64  r an. * unsigned
18440 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2e   32-bit integer.
18450 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20    For example:. 
18460 2a 0a 20 2a 20 20 20 20 20 20 20 63 63 20 2d 44  *. *       cc -D
18470 75 69 6e 74 33 32 3d 27 75 6e 73 69 67 6e 65 64  uint32='unsigned
18480 20 6c 6f 6e 67 27 20 6d 64 35 2e 63 0a 20 2a 0a   long' md5.c. *.
18490 20 2a 2f 0a 23 69 66 6e 64 65 66 20 75 69 6e 74   */.#ifndef uint
184a0 33 32 0a 23 20 20 64 65 66 69 6e 65 20 75 69 6e  32.#  define uin
184b0 74 33 32 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  t32 unsigned int
184c0 0a 23 65 6e 64 69 66 0a 0a 73 74 72 75 63 74 20  .#endif..struct 
184d0 4d 44 35 43 6f 6e 74 65 78 74 20 7b 0a 20 20 69  MD5Context {.  i
184e0 6e 74 20 69 73 49 6e 69 74 3b 0a 20 20 75 69 6e  nt isInit;.  uin
184f0 74 33 32 20 62 75 66 5b 34 5d 3b 0a 20 20 75 69  t32 buf[4];.  ui
18500 6e 74 33 32 20 62 69 74 73 5b 32 5d 3b 0a 20 20  nt32 bits[2];.  
18510 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e  unsigned char in
18520 5b 36 34 5d 3b 0a 7d 3b 0a 74 79 70 65 64 65 66  [64];.};.typedef
18530 20 73 74 72 75 63 74 20 4d 44 35 43 6f 6e 74 65   struct MD5Conte
18540 78 74 20 4d 44 35 43 6f 6e 74 65 78 74 3b 0a 0a  xt MD5Context;..
18550 2f 2a 0a 20 2a 20 4e 6f 74 65 3a 20 74 68 69 73  /*. * Note: this
18560 20 63 6f 64 65 20 69 73 20 68 61 72 6d 6c 65 73   code is harmles
18570 73 20 6f 6e 20 6c 69 74 74 6c 65 2d 65 6e 64 69  s on little-endi
18580 61 6e 20 6d 61 63 68 69 6e 65 73 2e 0a 20 2a 2f  an machines.. */
18590 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 79 74  .static void byt
185a0 65 52 65 76 65 72 73 65 20 28 75 6e 73 69 67 6e  eReverse (unsign
185b0 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20 75 6e  ed char *buf, un
185c0 73 69 67 6e 65 64 20 6c 6f 6e 67 73 29 7b 0a 20  signed longs){. 
185d0 20 20 20 20 20 20 20 75 69 6e 74 33 32 20 74 3b         uint32 t;
185e0 0a 20 20 20 20 20 20 20 20 64 6f 20 7b 0a 20 20  .        do {.  
185f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 20                t 
18600 3d 20 28 75 69 6e 74 33 32 29 28 28 75 6e 73 69  = (uint32)((unsi
18610 67 6e 65 64 29 62 75 66 5b 33 5d 3c 3c 38 20 7c  gned)buf[3]<<8 |
18620 20 62 75 66 5b 32 5d 29 20 3c 3c 20 31 36 20 7c   buf[2]) << 16 |
18630 0a 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 20 28 28 75               ((u
18650 6e 73 69 67 6e 65 64 29 62 75 66 5b 31 5d 3c 3c  nsigned)buf[1]<<
18660 38 20 7c 20 62 75 66 5b 30 5d 29 3b 0a 20 20 20  8 | buf[0]);.   
18670 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 28 75               *(u
18680 69 6e 74 33 32 20 2a 29 62 75 66 20 3d 20 74 3b  int32 *)buf = t;
18690 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
186a0 20 62 75 66 20 2b 3d 20 34 3b 0a 20 20 20 20 20   buf += 4;.     
186b0 20 20 20 7d 20 77 68 69 6c 65 20 28 2d 2d 6c 6f     } while (--lo
186c0 6e 67 73 29 3b 0a 7d 0a 2f 2a 20 54 68 65 20 66  ngs);.}./* The f
186d0 6f 75 72 20 63 6f 72 65 20 66 75 6e 63 74 69 6f  our core functio
186e0 6e 73 20 2d 20 46 31 20 69 73 20 6f 70 74 69 6d  ns - F1 is optim
186f0 69 7a 65 64 20 73 6f 6d 65 77 68 61 74 20 2a 2f  ized somewhat */
18700 0a 0a 2f 2a 20 23 64 65 66 69 6e 65 20 46 31 28  ../* #define F1(
18710 78 2c 20 79 2c 20 7a 29 20 28 78 20 26 20 79 20  x, y, z) (x & y 
18720 7c 20 7e 78 20 26 20 7a 29 20 2a 2f 0a 23 64 65  | ~x & z) */.#de
18730 66 69 6e 65 20 46 31 28 78 2c 20 79 2c 20 7a 29  fine F1(x, y, z)
18740 20 28 7a 20 5e 20 28 78 20 26 20 28 79 20 5e 20   (z ^ (x & (y ^ 
18750 7a 29 29 29 0a 23 64 65 66 69 6e 65 20 46 32 28  z))).#define F2(
18760 78 2c 20 79 2c 20 7a 29 20 46 31 28 7a 2c 20 78  x, y, z) F1(z, x
18770 2c 20 79 29 0a 23 64 65 66 69 6e 65 20 46 33 28  , y).#define F3(
18780 78 2c 20 79 2c 20 7a 29 20 28 78 20 5e 20 79 20  x, y, z) (x ^ y 
18790 5e 20 7a 29 0a 23 64 65 66 69 6e 65 20 46 34 28  ^ z).#define F4(
187a0 78 2c 20 79 2c 20 7a 29 20 28 79 20 5e 20 28 78  x, y, z) (y ^ (x
187b0 20 7c 20 7e 7a 29 29 0a 0a 2f 2a 20 54 68 69 73   | ~z))../* This
187c0 20 69 73 20 74 68 65 20 63 65 6e 74 72 61 6c 20   is the central 
187d0 73 74 65 70 20 69 6e 20 74 68 65 20 4d 44 35 20  step in the MD5 
187e0 61 6c 67 6f 72 69 74 68 6d 2e 20 2a 2f 0a 23 64  algorithm. */.#d
187f0 65 66 69 6e 65 20 4d 44 35 53 54 45 50 28 66 2c  efine MD5STEP(f,
18800 20 77 2c 20 78 2c 20 79 2c 20 7a 2c 20 64 61 74   w, x, y, z, dat
18810 61 2c 20 73 29 20 5c 0a 20 20 20 20 20 20 20 20  a, s) \.        
18820 28 20 77 20 2b 3d 20 66 28 78 2c 20 79 2c 20 7a  ( w += f(x, y, z
18830 29 20 2b 20 64 61 74 61 2c 20 20 77 20 3d 20 77  ) + data,  w = w
18840 3c 3c 73 20 7c 20 77 3e 3e 28 33 32 2d 73 29 2c  <<s | w>>(32-s),
18850 20 20 77 20 2b 3d 20 78 20 29 0a 0a 2f 2a 0a 20    w += x )../*. 
18860 2a 20 54 68 65 20 63 6f 72 65 20 6f 66 20 74 68  * The core of th
18870 65 20 4d 44 35 20 61 6c 67 6f 72 69 74 68 6d 2c  e MD5 algorithm,
18880 20 74 68 69 73 20 61 6c 74 65 72 73 20 61 6e 20   this alters an 
18890 65 78 69 73 74 69 6e 67 20 4d 44 35 20 68 61 73  existing MD5 has
188a0 68 20 74 6f 0a 20 2a 20 72 65 66 6c 65 63 74 20  h to. * reflect 
188b0 74 68 65 20 61 64 64 69 74 69 6f 6e 20 6f 66 20  the addition of 
188c0 31 36 20 6c 6f 6e 67 77 6f 72 64 73 20 6f 66 20  16 longwords of 
188d0 6e 65 77 20 64 61 74 61 2e 20 20 4d 44 35 55 70  new data.  MD5Up
188e0 64 61 74 65 20 62 6c 6f 63 6b 73 0a 20 2a 20 74  date blocks. * t
188f0 68 65 20 64 61 74 61 20 61 6e 64 20 63 6f 6e 76  he data and conv
18900 65 72 74 73 20 62 79 74 65 73 20 69 6e 74 6f 20  erts bytes into 
18910 6c 6f 6e 67 77 6f 72 64 73 20 66 6f 72 20 74 68  longwords for th
18920 69 73 20 72 6f 75 74 69 6e 65 2e 0a 20 2a 2f 0a  is routine.. */.
18930 73 74 61 74 69 63 20 76 6f 69 64 20 4d 44 35 54  static void MD5T
18940 72 61 6e 73 66 6f 72 6d 28 75 69 6e 74 33 32 20  ransform(uint32 
18950 62 75 66 5b 34 5d 2c 20 63 6f 6e 73 74 20 75 69  buf[4], const ui
18960 6e 74 33 32 20 69 6e 5b 31 36 5d 29 7b 0a 20 20  nt32 in[16]){.  
18970 20 20 20 20 20 20 72 65 67 69 73 74 65 72 20 75        register u
18980 69 6e 74 33 32 20 61 2c 20 62 2c 20 63 2c 20 64  int32 a, b, c, d
18990 3b 0a 0a 20 20 20 20 20 20 20 20 61 20 3d 20 62  ;..        a = b
189a0 75 66 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 62  uf[0];.        b
189b0 20 3d 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20   = buf[1];.     
189c0 20 20 20 63 20 3d 20 62 75 66 5b 32 5d 3b 0a 20     c = buf[2];. 
189d0 20 20 20 20 20 20 20 64 20 3d 20 62 75 66 5b 33         d = buf[3
189e0 5d 3b 0a 0a 20 20 20 20 20 20 20 20 4d 44 35 53  ];..        MD5S
189f0 54 45 50 28 46 31 2c 20 61 2c 20 62 2c 20 63 2c  TEP(F1, a, b, c,
18a00 20 64 2c 20 69 6e 5b 20 30 5d 2b 30 78 64 37 36   d, in[ 0]+0xd76
18a10 61 61 34 37 38 2c 20 20 37 29 3b 0a 20 20 20 20  aa478,  7);.    
18a20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20      MD5STEP(F1, 
18a30 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20  d, a, b, c, in[ 
18a40 31 5d 2b 30 78 65 38 63 37 62 37 35 36 2c 20 31  1]+0xe8c7b756, 1
18a50 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  2);.        MD5S
18a60 54 45 50 28 46 31 2c 20 63 2c 20 64 2c 20 61 2c  TEP(F1, c, d, a,
18a70 20 62 2c 20 69 6e 5b 20 32 5d 2b 30 78 32 34 32   b, in[ 2]+0x242
18a80 30 37 30 64 62 2c 20 31 37 29 3b 0a 20 20 20 20  070db, 17);.    
18a90 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20      MD5STEP(F1, 
18aa0 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 20  b, c, d, a, in[ 
18ab0 33 5d 2b 30 78 63 31 62 64 63 65 65 65 2c 20 32  3]+0xc1bdceee, 2
18ac0 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  2);.        MD5S
18ad0 54 45 50 28 46 31 2c 20 61 2c 20 62 2c 20 63 2c  TEP(F1, a, b, c,
18ae0 20 64 2c 20 69 6e 5b 20 34 5d 2b 30 78 66 35 37   d, in[ 4]+0xf57
18af0 63 30 66 61 66 2c 20 20 37 29 3b 0a 20 20 20 20  c0faf,  7);.    
18b00 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20      MD5STEP(F1, 
18b10 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20  d, a, b, c, in[ 
18b20 35 5d 2b 30 78 34 37 38 37 63 36 32 61 2c 20 31  5]+0x4787c62a, 1
18b30 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  2);.        MD5S
18b40 54 45 50 28 46 31 2c 20 63 2c 20 64 2c 20 61 2c  TEP(F1, c, d, a,
18b50 20 62 2c 20 69 6e 5b 20 36 5d 2b 30 78 61 38 33   b, in[ 6]+0xa83
18b60 30 34 36 31 33 2c 20 31 37 29 3b 0a 20 20 20 20  04613, 17);.    
18b70 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20      MD5STEP(F1, 
18b80 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 20  b, c, d, a, in[ 
18b90 37 5d 2b 30 78 66 64 34 36 39 35 30 31 2c 20 32  7]+0xfd469501, 2
18ba0 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  2);.        MD5S
18bb0 54 45 50 28 46 31 2c 20 61 2c 20 62 2c 20 63 2c  TEP(F1, a, b, c,
18bc0 20 64 2c 20 69 6e 5b 20 38 5d 2b 30 78 36 39 38   d, in[ 8]+0x698
18bd0 30 39 38 64 38 2c 20 20 37 29 3b 0a 20 20 20 20  098d8,  7);.    
18be0 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20      MD5STEP(F1, 
18bf0 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20  d, a, b, c, in[ 
18c00 39 5d 2b 30 78 38 62 34 34 66 37 61 66 2c 20 31  9]+0x8b44f7af, 1
18c10 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  2);.        MD5S
18c20 54 45 50 28 46 31 2c 20 63 2c 20 64 2c 20 61 2c  TEP(F1, c, d, a,
18c30 20 62 2c 20 69 6e 5b 31 30 5d 2b 30 78 66 66 66   b, in[10]+0xfff
18c40 66 35 62 62 31 2c 20 31 37 29 3b 0a 20 20 20 20  f5bb1, 17);.    
18c50 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20      MD5STEP(F1, 
18c60 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 31  b, c, d, a, in[1
18c70 31 5d 2b 30 78 38 39 35 63 64 37 62 65 2c 20 32  1]+0x895cd7be, 2
18c80 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  2);.        MD5S
18c90 54 45 50 28 46 31 2c 20 61 2c 20 62 2c 20 63 2c  TEP(F1, a, b, c,
18ca0 20 64 2c 20 69 6e 5b 31 32 5d 2b 30 78 36 62 39   d, in[12]+0x6b9
18cb0 30 31 31 32 32 2c 20 20 37 29 3b 0a 20 20 20 20  01122,  7);.    
18cc0 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20      MD5STEP(F1, 
18cd0 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 31  d, a, b, c, in[1
18ce0 33 5d 2b 30 78 66 64 39 38 37 31 39 33 2c 20 31  3]+0xfd987193, 1
18cf0 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  2);.        MD5S
18d00 54 45 50 28 46 31 2c 20 63 2c 20 64 2c 20 61 2c  TEP(F1, c, d, a,
18d10 20 62 2c 20 69 6e 5b 31 34 5d 2b 30 78 61 36 37   b, in[14]+0xa67
18d20 39 34 33 38 65 2c 20 31 37 29 3b 0a 20 20 20 20  9438e, 17);.    
18d30 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20      MD5STEP(F1, 
18d40 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 31  b, c, d, a, in[1
18d50 35 5d 2b 30 78 34 39 62 34 30 38 32 31 2c 20 32  5]+0x49b40821, 2
18d60 32 29 3b 0a 0a 20 20 20 20 20 20 20 20 4d 44 35  2);..        MD5
18d70 53 54 45 50 28 46 32 2c 20 61 2c 20 62 2c 20 63  STEP(F2, a, b, c
18d80 2c 20 64 2c 20 69 6e 5b 20 31 5d 2b 30 78 66 36  , d, in[ 1]+0xf6
18d90 31 65 32 35 36 32 2c 20 20 35 29 3b 0a 20 20 20  1e2562,  5);.   
18da0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c       MD5STEP(F2,
18db0 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b   d, a, b, c, in[
18dc0 20 36 5d 2b 30 78 63 30 34 30 62 33 34 30 2c 20   6]+0xc040b340, 
18dd0 20 39 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35   9);.        MD5
18de0 53 54 45 50 28 46 32 2c 20 63 2c 20 64 2c 20 61  STEP(F2, c, d, a
18df0 2c 20 62 2c 20 69 6e 5b 31 31 5d 2b 30 78 32 36  , b, in[11]+0x26
18e00 35 65 35 61 35 31 2c 20 31 34 29 3b 0a 20 20 20  5e5a51, 14);.   
18e10 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c       MD5STEP(F2,
18e20 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b   b, c, d, a, in[
18e30 20 30 5d 2b 30 78 65 39 62 36 63 37 61 61 2c 20   0]+0xe9b6c7aa, 
18e40 32 30 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  20);.        MD5
18e50 53 54 45 50 28 46 32 2c 20 61 2c 20 62 2c 20 63  STEP(F2, a, b, c
18e60 2c 20 64 2c 20 69 6e 5b 20 35 5d 2b 30 78 64 36  , d, in[ 5]+0xd6
18e70 32 66 31 30 35 64 2c 20 20 35 29 3b 0a 20 20 20  2f105d,  5);.   
18e80 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c       MD5STEP(F2,
18e90 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b   d, a, b, c, in[
18ea0 31 30 5d 2b 30 78 30 32 34 34 31 34 35 33 2c 20  10]+0x02441453, 
18eb0 20 39 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35   9);.        MD5
18ec0 53 54 45 50 28 46 32 2c 20 63 2c 20 64 2c 20 61  STEP(F2, c, d, a
18ed0 2c 20 62 2c 20 69 6e 5b 31 35 5d 2b 30 78 64 38  , b, in[15]+0xd8
18ee0 61 31 65 36 38 31 2c 20 31 34 29 3b 0a 20 20 20  a1e681, 14);.   
18ef0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c       MD5STEP(F2,
18f00 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b   b, c, d, a, in[
18f10 20 34 5d 2b 30 78 65 37 64 33 66 62 63 38 2c 20   4]+0xe7d3fbc8, 
18f20 32 30 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  20);.        MD5
18f30 53 54 45 50 28 46 32 2c 20 61 2c 20 62 2c 20 63  STEP(F2, a, b, c
18f40 2c 20 64 2c 20 69 6e 5b 20 39 5d 2b 30 78 32 31  , d, in[ 9]+0x21
18f50 65 31 63 64 65 36 2c 20 20 35 29 3b 0a 20 20 20  e1cde6,  5);.   
18f60 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c       MD5STEP(F2,
18f70 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b   d, a, b, c, in[
18f80 31 34 5d 2b 30 78 63 33 33 37 30 37 64 36 2c 20  14]+0xc33707d6, 
18f90 20 39 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35   9);.        MD5
18fa0 53 54 45 50 28 46 32 2c 20 63 2c 20 64 2c 20 61  STEP(F2, c, d, a
18fb0 2c 20 62 2c 20 69 6e 5b 20 33 5d 2b 30 78 66 34  , b, in[ 3]+0xf4
18fc0 64 35 30 64 38 37 2c 20 31 34 29 3b 0a 20 20 20  d50d87, 14);.   
18fd0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c       MD5STEP(F2,
18fe0 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b   b, c, d, a, in[
18ff0 20 38 5d 2b 30 78 34 35 35 61 31 34 65 64 2c 20   8]+0x455a14ed, 
19000 32 30 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  20);.        MD5
19010 53 54 45 50 28 46 32 2c 20 61 2c 20 62 2c 20 63  STEP(F2, a, b, c
19020 2c 20 64 2c 20 69 6e 5b 31 33 5d 2b 30 78 61 39  , d, in[13]+0xa9
19030 65 33 65 39 30 35 2c 20 20 35 29 3b 0a 20 20 20  e3e905,  5);.   
19040 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c       MD5STEP(F2,
19050 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b   d, a, b, c, in[
19060 20 32 5d 2b 30 78 66 63 65 66 61 33 66 38 2c 20   2]+0xfcefa3f8, 
19070 20 39 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35   9);.        MD5
19080 53 54 45 50 28 46 32 2c 20 63 2c 20 64 2c 20 61  STEP(F2, c, d, a
19090 2c 20 62 2c 20 69 6e 5b 20 37 5d 2b 30 78 36 37  , b, in[ 7]+0x67
190a0 36 66 30 32 64 39 2c 20 31 34 29 3b 0a 20 20 20  6f02d9, 14);.   
190b0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c       MD5STEP(F2,
190c0 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b   b, c, d, a, in[
190d0 31 32 5d 2b 30 78 38 64 32 61 34 63 38 61 2c 20  12]+0x8d2a4c8a, 
190e0 32 30 29 3b 0a 0a 20 20 20 20 20 20 20 20 4d 44  20);..        MD
190f0 35 53 54 45 50 28 46 33 2c 20 61 2c 20 62 2c 20  5STEP(F3, a, b, 
19100 63 2c 20 64 2c 20 69 6e 5b 20 35 5d 2b 30 78 66  c, d, in[ 5]+0xf
19110 66 66 61 33 39 34 32 2c 20 20 34 29 3b 0a 20 20  ffa3942,  4);.  
19120 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33        MD5STEP(F3
19130 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e  , d, a, b, c, in
19140 5b 20 38 5d 2b 30 78 38 37 37 31 66 36 38 31 2c  [ 8]+0x8771f681,
19150 20 31 31 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   11);.        MD
19160 35 53 54 45 50 28 46 33 2c 20 63 2c 20 64 2c 20  5STEP(F3, c, d, 
19170 61 2c 20 62 2c 20 69 6e 5b 31 31 5d 2b 30 78 36  a, b, in[11]+0x6
19180 64 39 64 36 31 32 32 2c 20 31 36 29 3b 0a 20 20  d9d6122, 16);.  
19190 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33        MD5STEP(F3
191a0 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
191b0 5b 31 34 5d 2b 30 78 66 64 65 35 33 38 30 63 2c  [14]+0xfde5380c,
191c0 20 32 33 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   23);.        MD
191d0 35 53 54 45 50 28 46 33 2c 20 61 2c 20 62 2c 20  5STEP(F3, a, b, 
191e0 63 2c 20 64 2c 20 69 6e 5b 20 31 5d 2b 30 78 61  c, d, in[ 1]+0xa
191f0 34 62 65 65 61 34 34 2c 20 20 34 29 3b 0a 20 20  4beea44,  4);.  
19200 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33        MD5STEP(F3
19210 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e  , d, a, b, c, in
19220 5b 20 34 5d 2b 30 78 34 62 64 65 63 66 61 39 2c  [ 4]+0x4bdecfa9,
19230 20 31 31 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   11);.        MD
19240 35 53 54 45 50 28 46 33 2c 20 63 2c 20 64 2c 20  5STEP(F3, c, d, 
19250 61 2c 20 62 2c 20 69 6e 5b 20 37 5d 2b 30 78 66  a, b, in[ 7]+0xf
19260 36 62 62 34 62 36 30 2c 20 31 36 29 3b 0a 20 20  6bb4b60, 16);.  
19270 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33        MD5STEP(F3
19280 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
19290 5b 31 30 5d 2b 30 78 62 65 62 66 62 63 37 30 2c  [10]+0xbebfbc70,
192a0 20 32 33 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   23);.        MD
192b0 35 53 54 45 50 28 46 33 2c 20 61 2c 20 62 2c 20  5STEP(F3, a, b, 
192c0 63 2c 20 64 2c 20 69 6e 5b 31 33 5d 2b 30 78 32  c, d, in[13]+0x2
192d0 38 39 62 37 65 63 36 2c 20 20 34 29 3b 0a 20 20  89b7ec6,  4);.  
192e0 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33        MD5STEP(F3
192f0 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e  , d, a, b, c, in
19300 5b 20 30 5d 2b 30 78 65 61 61 31 32 37 66 61 2c  [ 0]+0xeaa127fa,
19310 20 31 31 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   11);.        MD
19320 35 53 54 45 50 28 46 33 2c 20 63 2c 20 64 2c 20  5STEP(F3, c, d, 
19330 61 2c 20 62 2c 20 69 6e 5b 20 33 5d 2b 30 78 64  a, b, in[ 3]+0xd
19340 34 65 66 33 30 38 35 2c 20 31 36 29 3b 0a 20 20  4ef3085, 16);.  
19350 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33        MD5STEP(F3
19360 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
19370 5b 20 36 5d 2b 30 78 30 34 38 38 31 64 30 35 2c  [ 6]+0x04881d05,
19380 20 32 33 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   23);.        MD
19390 35 53 54 45 50 28 46 33 2c 20 61 2c 20 62 2c 20  5STEP(F3, a, b, 
193a0 63 2c 20 64 2c 20 69 6e 5b 20 39 5d 2b 30 78 64  c, d, in[ 9]+0xd
193b0 39 64 34 64 30 33 39 2c 20 20 34 29 3b 0a 20 20  9d4d039,  4);.  
193c0 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33        MD5STEP(F3
193d0 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e  , d, a, b, c, in
193e0 5b 31 32 5d 2b 30 78 65 36 64 62 39 39 65 35 2c  [12]+0xe6db99e5,
193f0 20 31 31 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   11);.        MD
19400 35 53 54 45 50 28 46 33 2c 20 63 2c 20 64 2c 20  5STEP(F3, c, d, 
19410 61 2c 20 62 2c 20 69 6e 5b 31 35 5d 2b 30 78 31  a, b, in[15]+0x1
19420 66 61 32 37 63 66 38 2c 20 31 36 29 3b 0a 20 20  fa27cf8, 16);.  
19430 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33        MD5STEP(F3
19440 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
19450 5b 20 32 5d 2b 30 78 63 34 61 63 35 36 36 35 2c  [ 2]+0xc4ac5665,
19460 20 32 33 29 3b 0a 0a 20 20 20 20 20 20 20 20 4d   23);..        M
19470 44 35 53 54 45 50 28 46 34 2c 20 61 2c 20 62 2c  D5STEP(F4, a, b,
19480 20 63 2c 20 64 2c 20 69 6e 5b 20 30 5d 2b 30 78   c, d, in[ 0]+0x
19490 66 34 32 39 32 32 34 34 2c 20 20 36 29 3b 0a 20  f4292244,  6);. 
194a0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
194b0 34 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69  4, d, a, b, c, i
194c0 6e 5b 20 37 5d 2b 30 78 34 33 32 61 66 66 39 37  n[ 7]+0x432aff97
194d0 2c 20 31 30 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 10);.        M
194e0 44 35 53 54 45 50 28 46 34 2c 20 63 2c 20 64 2c  D5STEP(F4, c, d,
194f0 20 61 2c 20 62 2c 20 69 6e 5b 31 34 5d 2b 30 78   a, b, in[14]+0x
19500 61 62 39 34 32 33 61 37 2c 20 31 35 29 3b 0a 20  ab9423a7, 15);. 
19510 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
19520 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  4, b, c, d, a, i
19530 6e 5b 20 35 5d 2b 30 78 66 63 39 33 61 30 33 39  n[ 5]+0xfc93a039
19540 2c 20 32 31 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 21);.        M
19550 44 35 53 54 45 50 28 46 34 2c 20 61 2c 20 62 2c  D5STEP(F4, a, b,
19560 20 63 2c 20 64 2c 20 69 6e 5b 31 32 5d 2b 30 78   c, d, in[12]+0x
19570 36 35 35 62 35 39 63 33 2c 20 20 36 29 3b 0a 20  655b59c3,  6);. 
19580 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
19590 34 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69  4, d, a, b, c, i
195a0 6e 5b 20 33 5d 2b 30 78 38 66 30 63 63 63 39 32  n[ 3]+0x8f0ccc92
195b0 2c 20 31 30 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 10);.        M
195c0 44 35 53 54 45 50 28 46 34 2c 20 63 2c 20 64 2c  D5STEP(F4, c, d,
195d0 20 61 2c 20 62 2c 20 69 6e 5b 31 30 5d 2b 30 78   a, b, in[10]+0x
195e0 66 66 65 66 66 34 37 64 2c 20 31 35 29 3b 0a 20  ffeff47d, 15);. 
195f0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
19600 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  4, b, c, d, a, i
19610 6e 5b 20 31 5d 2b 30 78 38 35 38 34 35 64 64 31  n[ 1]+0x85845dd1
19620 2c 20 32 31 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 21);.        M
19630 44 35 53 54 45 50 28 46 34 2c 20 61 2c 20 62 2c  D5STEP(F4, a, b,
19640 20 63 2c 20 64 2c 20 69 6e 5b 20 38 5d 2b 30 78   c, d, in[ 8]+0x
19650 36 66 61 38 37 65 34 66 2c 20 20 36 29 3b 0a 20  6fa87e4f,  6);. 
19660 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
19670 34 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69  4, d, a, b, c, i
19680 6e 5b 31 35 5d 2b 30 78 66 65 32 63 65 36 65 30  n[15]+0xfe2ce6e0
19690 2c 20 31 30 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 10);.        M
196a0 44 35 53 54 45 50 28 46 34 2c 20 63 2c 20 64 2c  D5STEP(F4, c, d,
196b0 20 61 2c 20 62 2c 20 69 6e 5b 20 36 5d 2b 30 78   a, b, in[ 6]+0x
196c0 61 33 30 31 34 33 31 34 2c 20 31 35 29 3b 0a 20  a3014314, 15);. 
196d0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
196e0 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  4, b, c, d, a, i
196f0 6e 5b 31 33 5d 2b 30 78 34 65 30 38 31 31 61 31  n[13]+0x4e0811a1
19700 2c 20 32 31 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 21);.        M
19710 44 35 53 54 45 50 28 46 34 2c 20 61 2c 20 62 2c  D5STEP(F4, a, b,
19720 20 63 2c 20 64 2c 20 69 6e 5b 20 34 5d 2b 30 78   c, d, in[ 4]+0x
19730 66 37 35 33 37 65 38 32 2c 20 20 36 29 3b 0a 20  f7537e82,  6);. 
19740 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
19750 34 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69  4, d, a, b, c, i
19760 6e 5b 31 31 5d 2b 30 78 62 64 33 61 66 32 33 35  n[11]+0xbd3af235
19770 2c 20 31 30 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 10);.        M
19780 44 35 53 54 45 50 28 46 34 2c 20 63 2c 20 64 2c  D5STEP(F4, c, d,
19790 20 61 2c 20 62 2c 20 69 6e 5b 20 32 5d 2b 30 78   a, b, in[ 2]+0x
197a0 32 61 64 37 64 32 62 62 2c 20 31 35 29 3b 0a 20  2ad7d2bb, 15);. 
197b0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
197c0 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  4, b, c, d, a, i
197d0 6e 5b 20 39 5d 2b 30 78 65 62 38 36 64 33 39 31  n[ 9]+0xeb86d391
197e0 2c 20 32 31 29 3b 0a 0a 20 20 20 20 20 20 20 20  , 21);..        
197f0 62 75 66 5b 30 5d 20 2b 3d 20 61 3b 0a 20 20 20  buf[0] += a;.   
19800 20 20 20 20 20 62 75 66 5b 31 5d 20 2b 3d 20 62       buf[1] += b
19810 3b 0a 20 20 20 20 20 20 20 20 62 75 66 5b 32 5d  ;.        buf[2]
19820 20 2b 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 62   += c;.        b
19830 75 66 5b 33 5d 20 2b 3d 20 64 3b 0a 7d 0a 0a 2f  uf[3] += d;.}../
19840 2a 0a 20 2a 20 53 74 61 72 74 20 4d 44 35 20 61  *. * Start MD5 a
19850 63 63 75 6d 75 6c 61 74 69 6f 6e 2e 20 20 53 65  ccumulation.  Se
19860 74 20 62 69 74 20 63 6f 75 6e 74 20 74 6f 20 30  t bit count to 0
19870 20 61 6e 64 20 62 75 66 66 65 72 20 74 6f 20 6d   and buffer to m
19880 79 73 74 65 72 69 6f 75 73 0a 20 2a 20 69 6e 69  ysterious. * ini
19890 74 69 61 6c 69 7a 61 74 69 6f 6e 20 63 6f 6e 73  tialization cons
198a0 74 61 6e 74 73 2e 0a 20 2a 2f 0a 73 74 61 74 69  tants.. */.stati
198b0 63 20 76 6f 69 64 20 4d 44 35 49 6e 69 74 28 4d  c void MD5Init(M
198c0 44 35 43 6f 6e 74 65 78 74 20 2a 63 74 78 29 7b  D5Context *ctx){
198d0 0a 20 20 20 20 20 20 20 20 63 74 78 2d 3e 69 73  .        ctx->is
198e0 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  Init = 1;.      
198f0 20 20 63 74 78 2d 3e 62 75 66 5b 30 5d 20 3d 20    ctx->buf[0] = 
19900 30 78 36 37 34 35 32 33 30 31 3b 0a 20 20 20 20  0x67452301;.    
19910 20 20 20 20 63 74 78 2d 3e 62 75 66 5b 31 5d 20      ctx->buf[1] 
19920 3d 20 30 78 65 66 63 64 61 62 38 39 3b 0a 20 20  = 0xefcdab89;.  
19930 20 20 20 20 20 20 63 74 78 2d 3e 62 75 66 5b 32        ctx->buf[2
19940 5d 20 3d 20 30 78 39 38 62 61 64 63 66 65 3b 0a  ] = 0x98badcfe;.
19950 20 20 20 20 20 20 20 20 63 74 78 2d 3e 62 75 66          ctx->buf
19960 5b 33 5d 20 3d 20 30 78 31 30 33 32 35 34 37 36  [3] = 0x10325476
19970 3b 0a 20 20 20 20 20 20 20 20 63 74 78 2d 3e 62  ;.        ctx->b
19980 69 74 73 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  its[0] = 0;.    
19990 20 20 20 20 63 74 78 2d 3e 62 69 74 73 5b 31 5d      ctx->bits[1]
199a0 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 55   = 0;.}../*. * U
199b0 70 64 61 74 65 20 63 6f 6e 74 65 78 74 20 74 6f  pdate context to
199c0 20 72 65 66 6c 65 63 74 20 74 68 65 20 63 6f 6e   reflect the con
199d0 63 61 74 65 6e 61 74 69 6f 6e 20 6f 66 20 61 6e  catenation of an
199e0 6f 74 68 65 72 20 62 75 66 66 65 72 20 66 75 6c  other buffer ful
199f0 6c 0a 20 2a 20 6f 66 20 62 79 74 65 73 2e 0a 20  l. * of bytes.. 
19a00 2a 2f 0a 73 74 61 74 69 63 20 0a 76 6f 69 64 20  */.static .void 
19a10 4d 44 35 55 70 64 61 74 65 28 4d 44 35 43 6f 6e  MD5Update(MD5Con
19a20 74 65 78 74 20 2a 63 74 78 2c 20 63 6f 6e 73 74  text *ctx, const
19a30 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
19a40 62 75 66 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e  buf, unsigned in
19a50 74 20 6c 65 6e 29 7b 0a 20 20 20 20 20 20 20 20  t len){.        
19a60 75 69 6e 74 33 32 20 74 3b 0a 0a 20 20 20 20 20  uint32 t;..     
19a70 20 20 20 2f 2a 20 55 70 64 61 74 65 20 62 69 74     /* Update bit
19a80 63 6f 75 6e 74 20 2a 2f 0a 0a 20 20 20 20 20 20  count */..      
19a90 20 20 74 20 3d 20 63 74 78 2d 3e 62 69 74 73 5b    t = ctx->bits[
19aa0 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28  0];.        if (
19ab0 28 63 74 78 2d 3e 62 69 74 73 5b 30 5d 20 3d 20  (ctx->bits[0] = 
19ac0 74 20 2b 20 28 28 75 69 6e 74 33 32 29 6c 65 6e  t + ((uint32)len
19ad0 20 3c 3c 20 33 29 29 20 3c 20 74 29 0a 20 20 20   << 3)) < t).   
19ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 74 78               ctx
19af0 2d 3e 62 69 74 73 5b 31 5d 2b 2b 3b 20 2f 2a 20  ->bits[1]++; /* 
19b00 43 61 72 72 79 20 66 72 6f 6d 20 6c 6f 77 20 74  Carry from low t
19b10 6f 20 68 69 67 68 20 2a 2f 0a 20 20 20 20 20 20  o high */.      
19b20 20 20 63 74 78 2d 3e 62 69 74 73 5b 31 5d 20 2b    ctx->bits[1] +
19b30 3d 20 6c 65 6e 20 3e 3e 20 32 39 3b 0a 0a 20 20  = len >> 29;..  
19b40 20 20 20 20 20 20 74 20 3d 20 28 74 20 3e 3e 20        t = (t >> 
19b50 33 29 20 26 20 30 78 33 66 3b 20 20 20 20 2f 2a  3) & 0x3f;    /*
19b60 20 42 79 74 65 73 20 61 6c 72 65 61 64 79 20 69   Bytes already i
19b70 6e 20 73 68 73 49 6e 66 6f 2d 3e 64 61 74 61 20  n shsInfo->data 
19b80 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 48  */..        /* H
19b90 61 6e 64 6c 65 20 61 6e 79 20 6c 65 61 64 69 6e  andle any leadin
19ba0 67 20 6f 64 64 2d 73 69 7a 65 64 20 63 68 75 6e  g odd-sized chun
19bb0 6b 73 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 69  ks */..        i
19bc0 66 20 28 20 74 20 29 20 7b 0a 20 20 20 20 20 20  f ( t ) {.      
19bd0 20 20 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e            unsign
19be0 65 64 20 63 68 61 72 20 2a 70 20 3d 20 28 75 6e  ed char *p = (un
19bf0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 63 74  signed char *)ct
19c00 78 2d 3e 69 6e 20 2b 20 74 3b 0a 0a 20 20 20 20  x->in + t;..    
19c10 20 20 20 20 20 20 20 20 20 20 20 20 74 20 3d 20              t = 
19c20 36 34 2d 74 3b 0a 20 20 20 20 20 20 20 20 20 20  64-t;.          
19c30 20 20 20 20 20 20 69 66 20 28 6c 65 6e 20 3c 20        if (len < 
19c40 74 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t) {.           
19c50 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d               mem
19c60 63 70 79 28 70 2c 20 62 75 66 2c 20 6c 65 6e 29  cpy(p, buf, len)
19c70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
19c80 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
19c90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
19ca0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
19cb0 20 20 20 20 6d 65 6d 63 70 79 28 70 2c 20 62 75      memcpy(p, bu
19cc0 66 2c 20 74 29 3b 0a 20 20 20 20 20 20 20 20 20  f, t);.         
19cd0 20 20 20 20 20 20 20 62 79 74 65 52 65 76 65 72         byteRever
19ce0 73 65 28 63 74 78 2d 3e 69 6e 2c 20 31 36 29 3b  se(ctx->in, 16);
19cf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19d00 20 4d 44 35 54 72 61 6e 73 66 6f 72 6d 28 63 74   MD5Transform(ct
19d10 78 2d 3e 62 75 66 2c 20 28 75 69 6e 74 33 32 20  x->buf, (uint32 
19d20 2a 29 63 74 78 2d 3e 69 6e 29 3b 0a 20 20 20 20  *)ctx->in);.    
19d30 20 20 20 20 20 20 20 20 20 20 20 20 62 75 66 20              buf 
19d40 2b 3d 20 74 3b 0a 20 20 20 20 20 20 20 20 20 20  += t;.          
19d50 20 20 20 20 20 20 6c 65 6e 20 2d 3d 20 74 3b 0a        len -= t;.
19d60 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
19d70 20 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 64 61     /* Process da
19d80 74 61 20 69 6e 20 36 34 2d 62 79 74 65 20 63 68  ta in 64-byte ch
19d90 75 6e 6b 73 20 2a 2f 0a 0a 20 20 20 20 20 20 20  unks */..       
19da0 20 77 68 69 6c 65 20 28 6c 65 6e 20 3e 3d 20 36   while (len >= 6
19db0 34 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  4) {.           
19dc0 20 20 20 20 20 6d 65 6d 63 70 79 28 63 74 78 2d       memcpy(ctx-
19dd0 3e 69 6e 2c 20 62 75 66 2c 20 36 34 29 3b 0a 20  >in, buf, 64);. 
19de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
19df0 79 74 65 52 65 76 65 72 73 65 28 63 74 78 2d 3e  yteReverse(ctx->
19e00 69 6e 2c 20 31 36 29 3b 0a 20 20 20 20 20 20 20  in, 16);.       
19e10 20 20 20 20 20 20 20 20 20 4d 44 35 54 72 61 6e           MD5Tran
19e20 73 66 6f 72 6d 28 63 74 78 2d 3e 62 75 66 2c 20  sform(ctx->buf, 
19e30 28 75 69 6e 74 33 32 20 2a 29 63 74 78 2d 3e 69  (uint32 *)ctx->i
19e40 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
19e50 20 20 20 20 62 75 66 20 2b 3d 20 36 34 3b 0a 20      buf += 64;. 
19e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
19e70 65 6e 20 2d 3d 20 36 34 3b 0a 20 20 20 20 20 20  en -= 64;.      
19e80 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
19e90 48 61 6e 64 6c 65 20 61 6e 79 20 72 65 6d 61 69  Handle any remai
19ea0 6e 69 6e 67 20 62 79 74 65 73 20 6f 66 20 64 61  ning bytes of da
19eb0 74 61 2e 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ta. */..        
19ec0 6d 65 6d 63 70 79 28 63 74 78 2d 3e 69 6e 2c 20  memcpy(ctx->in, 
19ed0 62 75 66 2c 20 6c 65 6e 29 3b 0a 7d 0a 0a 2f 2a  buf, len);.}../*
19ee0 0a 20 2a 20 46 69 6e 61 6c 20 77 72 61 70 75 70  . * Final wrapup
19ef0 20 2d 20 70 61 64 20 74 6f 20 36 34 2d 62 79 74   - pad to 64-byt
19f00 65 20 62 6f 75 6e 64 61 72 79 20 77 69 74 68 20  e boundary with 
19f10 74 68 65 20 62 69 74 20 70 61 74 74 65 72 6e 20  the bit pattern 
19f20 0a 20 2a 20 31 20 30 2a 20 28 36 34 2d 62 69 74  . * 1 0* (64-bit
19f30 20 63 6f 75 6e 74 20 6f 66 20 62 69 74 73 20 70   count of bits p
19f40 72 6f 63 65 73 73 65 64 2c 20 4d 53 42 2d 66 69  rocessed, MSB-fi
19f50 72 73 74 29 0a 20 2a 2f 0a 73 74 61 74 69 63 20  rst). */.static 
19f60 76 6f 69 64 20 4d 44 35 46 69 6e 61 6c 28 75 6e  void MD5Final(un
19f70 73 69 67 6e 65 64 20 63 68 61 72 20 64 69 67 65  signed char dige
19f80 73 74 5b 31 36 5d 2c 20 4d 44 35 43 6f 6e 74 65  st[16], MD5Conte
19f90 78 74 20 2a 63 74 78 29 7b 0a 20 20 20 20 20 20  xt *ctx){.      
19fa0 20 20 75 6e 73 69 67 6e 65 64 20 63 6f 75 6e 74    unsigned count
19fb0 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e  ;.        unsign
19fc0 65 64 20 63 68 61 72 20 2a 70 3b 0a 0a 20 20 20  ed char *p;..   
19fd0 20 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20       /* Compute 
19fe0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
19ff0 6d 6f 64 20 36 34 20 2a 2f 0a 20 20 20 20 20 20  mod 64 */.      
1a000 20 20 63 6f 75 6e 74 20 3d 20 28 63 74 78 2d 3e    count = (ctx->
1a010 62 69 74 73 5b 30 5d 20 3e 3e 20 33 29 20 26 20  bits[0] >> 3) & 
1a020 30 78 33 46 3b 0a 0a 20 20 20 20 20 20 20 20 2f  0x3F;..        /
1a030 2a 20 53 65 74 20 74 68 65 20 66 69 72 73 74 20  * Set the first 
1a040 63 68 61 72 20 6f 66 20 70 61 64 64 69 6e 67 20  char of padding 
1a050 74 6f 20 30 78 38 30 2e 20 20 54 68 69 73 20 69  to 0x80.  This i
1a060 73 20 73 61 66 65 20 73 69 6e 63 65 20 74 68 65  s safe since the
1a070 72 65 20 69 73 0a 20 20 20 20 20 20 20 20 20 20  re is.          
1a080 20 61 6c 77 61 79 73 20 61 74 20 6c 65 61 73 74   always at least
1a090 20 6f 6e 65 20 62 79 74 65 20 66 72 65 65 20 2a   one byte free *
1a0a0 2f 0a 20 20 20 20 20 20 20 20 70 20 3d 20 63 74  /.        p = ct
1a0b0 78 2d 3e 69 6e 20 2b 20 63 6f 75 6e 74 3b 0a 20  x->in + count;. 
1a0c0 20 20 20 20 20 20 20 2a 70 2b 2b 20 3d 20 30 78         *p++ = 0x
1a0d0 38 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  80;..        /* 
1a0e0 42 79 74 65 73 20 6f 66 20 70 61 64 64 69 6e 67  Bytes of padding
1a0f0 20 6e 65 65 64 65 64 20 74 6f 20 6d 61 6b 65 20   needed to make 
1a100 36 34 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20  64 bytes */.    
1a110 20 20 20 20 63 6f 75 6e 74 20 3d 20 36 34 20 2d      count = 64 -
1a120 20 31 20 2d 20 63 6f 75 6e 74 3b 0a 0a 20 20 20   1 - count;..   
1a130 20 20 20 20 20 2f 2a 20 50 61 64 20 6f 75 74 20       /* Pad out 
1a140 74 6f 20 35 36 20 6d 6f 64 20 36 34 20 2a 2f 0a  to 56 mod 64 */.
1a150 20 20 20 20 20 20 20 20 69 66 20 28 63 6f 75 6e          if (coun
1a160 74 20 3c 20 38 29 20 7b 0a 20 20 20 20 20 20 20  t < 8) {.       
1a170 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20           /* Two 
1a180 6c 6f 74 73 20 6f 66 20 70 61 64 64 69 6e 67 3a  lots of padding:
1a190 20 20 50 61 64 20 74 68 65 20 66 69 72 73 74 20    Pad the first 
1a1a0 62 6c 6f 63 6b 20 74 6f 20 36 34 20 62 79 74 65  block to 64 byte
1a1b0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  s */.           
1a1c0 20 20 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30       memset(p, 0
1a1d0 2c 20 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20  , count);.      
1a1e0 20 20 20 20 20 20 20 20 20 20 62 79 74 65 52 65            byteRe
1a1f0 76 65 72 73 65 28 63 74 78 2d 3e 69 6e 2c 20 31  verse(ctx->in, 1
1a200 36 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  6);.            
1a210 20 20 20 20 4d 44 35 54 72 61 6e 73 66 6f 72 6d      MD5Transform
1a220 28 63 74 78 2d 3e 62 75 66 2c 20 28 75 69 6e 74  (ctx->buf, (uint
1a230 33 32 20 2a 29 63 74 78 2d 3e 69 6e 29 3b 0a 0a  32 *)ctx->in);..
1a240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a250 2f 2a 20 4e 6f 77 20 66 69 6c 6c 20 74 68 65 20  /* Now fill the 
1a260 6e 65 78 74 20 62 6c 6f 63 6b 20 77 69 74 68 20  next block with 
1a270 35 36 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20  56 bytes */.    
1a280 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73              mems
1a290 65 74 28 63 74 78 2d 3e 69 6e 2c 20 30 2c 20 35  et(ctx->in, 0, 5
1a2a0 36 29 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c  6);.        } el
1a2b0 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  se {.           
1a2c0 20 20 20 20 20 2f 2a 20 50 61 64 20 62 6c 6f 63       /* Pad bloc
1a2d0 6b 20 74 6f 20 35 36 20 62 79 74 65 73 20 2a 2f  k to 56 bytes */
1a2e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a2f0 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 63 6f   memset(p, 0, co
1a300 75 6e 74 2d 38 29 3b 0a 20 20 20 20 20 20 20 20  unt-8);.        
1a310 7d 0a 20 20 20 20 20 20 20 20 62 79 74 65 52 65  }.        byteRe
1a320 76 65 72 73 65 28 63 74 78 2d 3e 69 6e 2c 20 31  verse(ctx->in, 1
1a330 34 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  4);..        /* 
1a340 41 70 70 65 6e 64 20 6c 65 6e 67 74 68 20 69 6e  Append length in
1a350 20 62 69 74 73 20 61 6e 64 20 74 72 61 6e 73 66   bits and transf
1a360 6f 72 6d 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d  orm */.        m
1a370 65 6d 63 70 79 28 63 74 78 2d 3e 69 6e 20 2b 20  emcpy(ctx->in + 
1a380 31 34 2a 34 2c 20 63 74 78 2d 3e 62 69 74 73 2c  14*4, ctx->bits,
1a390 20 38 29 3b 0a 0a 20 20 20 20 20 20 20 20 4d 44   8);..        MD
1a3a0 35 54 72 61 6e 73 66 6f 72 6d 28 63 74 78 2d 3e  5Transform(ctx->
1a3b0 62 75 66 2c 20 28 75 69 6e 74 33 32 20 2a 29 63  buf, (uint32 *)c
1a3c0 74 78 2d 3e 69 6e 29 3b 0a 20 20 20 20 20 20 20  tx->in);.       
1a3d0 20 62 79 74 65 52 65 76 65 72 73 65 28 28 75 6e   byteReverse((un
1a3e0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 63 74  signed char *)ct
1a3f0 78 2d 3e 62 75 66 2c 20 34 29 3b 0a 20 20 20 20  x->buf, 4);.    
1a400 20 20 20 20 6d 65 6d 63 70 79 28 64 69 67 65 73      memcpy(diges
1a410 74 2c 20 63 74 78 2d 3e 62 75 66 2c 20 31 36 29  t, ctx->buf, 16)
1a420 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  ;.}../*.** Conve
1a430 72 74 20 61 20 31 32 38 2d 62 69 74 20 4d 44 35  rt a 128-bit MD5
1a440 20 64 69 67 65 73 74 20 69 6e 74 6f 20 61 20 33   digest into a 3
1a450 32 2d 64 69 67 69 74 20 62 61 73 65 2d 31 36 20  2-digit base-16 
1a460 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  number..*/.stati
1a470 63 20 76 6f 69 64 20 4d 44 35 44 69 67 65 73 74  c void MD5Digest
1a480 54 6f 42 61 73 65 31 36 28 75 6e 73 69 67 6e 65  ToBase16(unsigne
1a490 64 20 63 68 61 72 20 2a 64 69 67 65 73 74 2c 20  d char *digest, 
1a4a0 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73  char *zBuf){.  s
1a4b0 74 61 74 69 63 20 63 68 61 72 20 63 6f 6e 73 74  tatic char const
1a4c0 20 7a 45 6e 63 6f 64 65 5b 5d 20 3d 20 22 30 31   zEncode[] = "01
1a4d0 32 33 34 35 36 37 38 39 61 62 63 64 65 66 22 3b  23456789abcdef";
1a4e0 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20  .  int i, j;..  
1a4f0 66 6f 72 28 6a 3d 69 3d 30 3b 20 69 3c 31 36 3b  for(j=i=0; i<16;
1a500 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 61   i++){.    int a
1a510 20 3d 20 64 69 67 65 73 74 5b 69 5d 3b 0a 20 20   = digest[i];.  
1a520 20 20 7a 42 75 66 5b 6a 2b 2b 5d 20 3d 20 7a 45    zBuf[j++] = zE
1a530 6e 63 6f 64 65 5b 28 61 3e 3e 34 29 26 30 78 66  ncode[(a>>4)&0xf
1a540 5d 3b 0a 20 20 20 20 7a 42 75 66 5b 6a 2b 2b 5d  ];.    zBuf[j++]
1a550 20 3d 20 7a 45 6e 63 6f 64 65 5b 61 20 26 20 30   = zEncode[a & 0
1a560 78 66 5d 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b  xf];.  }.  zBuf[
1a570 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  j] = 0;.}.../*.*
1a580 2a 20 43 6f 6e 76 65 72 74 20 61 20 31 32 38 2d  * Convert a 128-
1a590 62 69 74 20 4d 44 35 20 64 69 67 65 73 74 20 69  bit MD5 digest i
1a5a0 6e 74 6f 20 73 65 71 75 65 6e 63 79 20 6f 66 20  nto sequency of 
1a5b0 65 69 67 68 74 20 35 2d 64 69 67 69 74 20 69 6e  eight 5-digit in
1a5c0 74 65 67 65 72 73 0a 2a 2a 20 65 61 63 68 20 72  tegers.** each r
1a5d0 65 70 72 65 73 65 6e 74 69 6e 67 20 31 36 20 62  epresenting 16 b
1a5e0 69 74 73 20 6f 66 20 74 68 65 20 64 69 67 65 73  its of the diges
1a5f0 74 20 61 6e 64 20 73 65 70 61 72 61 74 65 64 20  t and separated 
1a600 66 72 6f 6d 20 65 61 63 68 0a 2a 2a 20 6f 74 68  from each.** oth
1a610 65 72 20 62 79 20 61 20 22 2d 22 20 63 68 61 72  er by a "-" char
1a620 61 63 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  acter..*/.static
1a630 20 76 6f 69 64 20 4d 44 35 44 69 67 65 73 74 54   void MD5DigestT
1a640 6f 42 61 73 65 31 30 78 38 28 75 6e 73 69 67 6e  oBase10x8(unsign
1a650 65 64 20 63 68 61 72 20 64 69 67 65 73 74 5b 31  ed char digest[1
1a660 36 5d 2c 20 63 68 61 72 20 7a 44 69 67 65 73 74  6], char zDigest
1a670 5b 35 30 5d 29 7b 0a 20 20 69 6e 74 20 69 2c 20  [50]){.  int i, 
1a680 6a 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  j;.  unsigned in
1a690 74 20 78 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  t x;.  for(i=j=0
1a6a0 3b 20 69 3c 31 36 3b 20 69 2b 3d 32 29 7b 0a 20  ; i<16; i+=2){. 
1a6b0 20 20 20 78 20 3d 20 64 69 67 65 73 74 5b 69 5d     x = digest[i]
1a6c0 2a 32 35 36 20 2b 20 64 69 67 65 73 74 5b 69 2b  *256 + digest[i+
1a6d0 31 5d 3b 0a 20 20 20 20 69 66 28 20 69 3e 30 20  1];.    if( i>0 
1a6e0 29 20 7a 44 69 67 65 73 74 5b 6a 2b 2b 5d 20 3d  ) zDigest[j++] =
1a6f0 20 27 2d 27 3b 0a 20 20 20 20 73 71 6c 69 74 65   '-';.    sqlite
1a700 33 5f 73 6e 70 72 69 6e 74 66 28 35 30 2d 6a 2c  3_snprintf(50-j,
1a710 20 26 7a 44 69 67 65 73 74 5b 6a 5d 2c 20 22 25   &zDigest[j], "%
1a720 30 35 75 22 2c 20 78 29 3b 0a 20 20 20 20 6a 20  05u", x);.    j 
1a730 2b 3d 20 35 3b 0a 20 20 7d 0a 20 20 7a 44 69 67  += 5;.  }.  zDig
1a740 65 73 74 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f  est[j] = 0;.}../
1a750 2a 0a 2a 2a 20 41 20 54 43 4c 20 63 6f 6d 6d 61  *.** A TCL comma
1a760 6e 64 20 66 6f 72 20 6d 64 35 2e 20 20 54 68 65  nd for md5.  The
1a770 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
1a780 20 74 65 78 74 20 74 6f 20 62 65 20 68 61 73 68   text to be hash
1a790 65 64 2e 20 20 54 68 65 0a 2a 2a 20 52 65 73 75  ed.  The.** Resu
1a7a0 6c 74 20 69 73 20 74 68 65 20 68 61 73 68 20 69  lt is the hash i
1a7b0 6e 20 62 61 73 65 36 34 2e 20 20 0a 2a 2f 0a 73  n base64.  .*/.s
1a7c0 74 61 74 69 63 20 69 6e 74 20 6d 64 35 5f 63 6d  tatic int md5_cm
1a7d0 64 28 76 6f 69 64 2a 63 64 2c 20 54 63 6c 5f 49  d(void*cd, Tcl_I
1a7e0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
1a7f0 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73 74 20 63  nt argc, const c
1a800 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 4d  har **argv){.  M
1a810 44 35 43 6f 6e 74 65 78 74 20 63 74 78 3b 0a 20  D5Context ctx;. 
1a820 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64   unsigned char d
1a830 69 67 65 73 74 5b 31 36 5d 3b 0a 20 20 63 68 61  igest[16];.  cha
1a840 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 76 6f  r zBuf[50];.  vo
1a850 69 64 20 28 2a 63 6f 6e 76 65 72 74 65 72 29 28  id (*converter)(
1a860 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 2c 20  unsigned char*, 
1a870 63 68 61 72 2a 29 3b 0a 0a 20 20 69 66 28 20 61  char*);..  if( a
1a880 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  rgc!=2 ){.    Tc
1a890 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1a8a0 6e 74 65 72 70 2c 22 77 72 6f 6e 67 20 23 20 61  nterp,"wrong # a
1a8b0 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
1a8c0 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20  "", argv[0], .  
1a8d0 20 20 20 20 20 20 22 20 54 45 58 54 5c 22 22 2c        " TEXT\"",
1a8e0 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
1a8f0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1a900 3b 0a 20 20 7d 0a 20 20 4d 44 35 49 6e 69 74 28  ;.  }.  MD5Init(
1a910 26 63 74 78 29 3b 0a 20 20 4d 44 35 55 70 64 61  &ctx);.  MD5Upda
1a920 74 65 28 26 63 74 78 2c 20 28 75 6e 73 69 67 6e  te(&ctx, (unsign
1a930 65 64 20 63 68 61 72 2a 29 61 72 67 76 5b 31 5d  ed char*)argv[1]
1a940 2c 20 28 75 6e 73 69 67 6e 65 64 29 73 74 72 6c  , (unsigned)strl
1a950 65 6e 28 61 72 67 76 5b 31 5d 29 29 3b 0a 20 20  en(argv[1]));.  
1a960 4d 44 35 46 69 6e 61 6c 28 64 69 67 65 73 74 2c  MD5Final(digest,
1a970 20 26 63 74 78 29 3b 0a 20 20 63 6f 6e 76 65 72   &ctx);.  conver
1a980 74 65 72 20 3d 20 28 76 6f 69 64 28 2a 29 28 75  ter = (void(*)(u
1a990 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 2c 63 68  nsigned char*,ch
1a9a0 61 72 2a 29 29 63 64 3b 0a 20 20 63 6f 6e 76 65  ar*))cd;.  conve
1a9b0 72 74 65 72 28 64 69 67 65 73 74 2c 20 7a 42 75  rter(digest, zBu
1a9c0 66 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  f);.  Tcl_Append
1a9d0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
1a9e0 42 75 66 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  Buf, (char*)0);.
1a9f0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1aa00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 54 43 4c 20  .}../*.** A TCL 
1aa10 63 6f 6d 6d 61 6e 64 20 74 6f 20 74 61 6b 65 20  command to take 
1aa20 74 68 65 20 6d 64 35 20 68 61 73 68 20 6f 66 20  the md5 hash of 
1aa30 61 20 66 69 6c 65 2e 20 20 54 68 65 20 61 72 67  a file.  The arg
1aa40 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20  ument is the.** 
1aa50 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  name of the file
1aa60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1aa70 6d 64 35 66 69 6c 65 5f 63 6d 64 28 76 6f 69 64  md5file_cmd(void
1aa80 2a 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70 2a  *cd, Tcl_Interp*
1aa90 69 6e 74 65 72 70 2c 20 69 6e 74 20 61 72 67 63  interp, int argc
1aaa0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61  , const char **a
1aab0 72 67 76 29 7b 0a 20 20 46 49 4c 45 20 2a 69 6e  rgv){.  FILE *in
1aac0 3b 0a 20 20 4d 44 35 43 6f 6e 74 65 78 74 20 63  ;.  MD5Context c
1aad0 74 78 3b 0a 20 20 76 6f 69 64 20 28 2a 63 6f 6e  tx;.  void (*con
1aae0 76 65 72 74 65 72 29 28 75 6e 73 69 67 6e 65 64  verter)(unsigned
1aaf0 20 63 68 61 72 2a 2c 20 63 68 61 72 2a 29 3b 0a   char*, char*);.
1ab00 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1ab10 64 69 67 65 73 74 5b 31 36 5d 3b 0a 20 20 63 68  digest[16];.  ch
1ab20 61 72 20 7a 42 75 66 5b 31 30 32 34 30 5d 3b 0a  ar zBuf[10240];.
1ab30 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29  .  if( argc!=2 )
1ab40 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1ab50 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 77  Result(interp,"w
1ab60 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
1ab70 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
1ab80 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 20 22 20  [0], .        " 
1ab90 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 28 63 68  FILENAME\"", (ch
1aba0 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75  ar*)0);.    retu
1abb0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1abc0 7d 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 61  }.  in = fopen(a
1abd0 72 67 76 5b 31 5d 2c 22 72 62 22 29 3b 0a 20 20  rgv[1],"rb");.  
1abe0 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20  if( in==0 ){.   
1abf0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1ac00 74 28 69 6e 74 65 72 70 2c 22 75 6e 61 62 6c 65  t(interp,"unable
1ac10 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65 20 5c 22   to open file \"
1ac20 22 2c 20 61 72 67 76 5b 31 5d 2c 20 0a 20 20 20  ", argv[1], .   
1ac30 20 20 20 20 20 20 22 5c 22 20 66 6f 72 20 72 65        "\" for re
1ac40 61 64 69 6e 67 22 2c 20 28 63 68 61 72 2a 29 30  ading", (char*)0
1ac50 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1ac60 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 4d  L_ERROR;.  }.  M
1ac70 44 35 49 6e 69 74 28 26 63 74 78 29 3b 0a 20 20  D5Init(&ctx);.  
1ac80 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74  for(;;){.    int
1ac90 20 6e 3b 0a 20 20 20 20 6e 20 3d 20 28 69 6e 74   n;.    n = (int
1aca0 29 66 72 65 61 64 28 7a 42 75 66 2c 20 31 2c 20  )fread(zBuf, 1, 
1acb0 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 69 6e  sizeof(zBuf), in
1acc0 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c 3d 30 20  );.    if( n<=0 
1acd0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 4d 44 35  ) break;.    MD5
1ace0 55 70 64 61 74 65 28 26 63 74 78 2c 20 28 75 6e  Update(&ctx, (un
1acf0 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 42 75  signed char*)zBu
1ad00 66 2c 20 28 75 6e 73 69 67 6e 65 64 29 6e 29 3b  f, (unsigned)n);
1ad10 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 69 6e  .  }.  fclose(in
1ad20 29 3b 0a 20 20 4d 44 35 46 69 6e 61 6c 28 64 69  );.  MD5Final(di
1ad30 67 65 73 74 2c 20 26 63 74 78 29 3b 0a 20 20 63  gest, &ctx);.  c
1ad40 6f 6e 76 65 72 74 65 72 20 3d 20 28 76 6f 69 64  onverter = (void
1ad50 28 2a 29 28 75 6e 73 69 67 6e 65 64 20 63 68 61  (*)(unsigned cha
1ad60 72 2a 2c 63 68 61 72 2a 29 29 63 64 3b 0a 20 20  r*,char*))cd;.  
1ad70 63 6f 6e 76 65 72 74 65 72 28 64 69 67 65 73 74  converter(digest
1ad80 2c 20 7a 42 75 66 29 3b 0a 20 20 54 63 6c 5f 41  , zBuf);.  Tcl_A
1ad90 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1ada0 72 70 2c 20 7a 42 75 66 2c 20 28 63 68 61 72 2a  rp, zBuf, (char*
1adb0 29 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  )0);.  return TC
1adc0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  L_OK;.}../*.** R
1add0 65 67 69 73 74 65 72 20 74 68 65 20 66 6f 75 72  egister the four
1ade0 20 6e 65 77 20 54 43 4c 20 63 6f 6d 6d 61 6e 64   new TCL command
1adf0 73 20 66 6f 72 20 67 65 6e 65 72 61 74 69 6e 67  s for generating
1ae00 20 4d 44 35 20 63 68 65 63 6b 73 75 6d 73 0a 2a   MD5 checksums.*
1ae10 2a 20 77 69 74 68 20 74 68 65 20 54 43 4c 20 69  * with the TCL i
1ae20 6e 74 65 72 70 72 65 74 65 72 2e 0a 2a 2f 0a 69  nterpreter..*/.i
1ae30 6e 74 20 4d 64 35 5f 49 6e 69 74 28 54 63 6c 5f  nt Md5_Init(Tcl_
1ae40 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b  Interp *interp){
1ae50 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 43 6f 6d  .  Tcl_CreateCom
1ae60 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 6d 64  mand(interp, "md
1ae70 35 22 2c 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63  5", (Tcl_CmdProc
1ae80 2a 29 6d 64 35 5f 63 6d 64 2c 0a 20 20 20 20 20  *)md5_cmd,.     
1ae90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4d                 M
1aea0 44 35 44 69 67 65 73 74 54 6f 42 61 73 65 31 36  D5DigestToBase16
1aeb0 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61  , 0);.  Tcl_Crea
1aec0 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  teCommand(interp
1aed0 2c 20 22 6d 64 35 2d 31 30 78 38 22 2c 20 28 54  , "md5-10x8", (T
1aee0 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 6d 64 35 5f  cl_CmdProc*)md5_
1aef0 63 6d 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  cmd,.           
1af00 20 20 20 20 20 20 20 20 20 4d 44 35 44 69 67 65           MD5Dige
1af10 73 74 54 6f 42 61 73 65 31 30 78 38 2c 20 30 29  stToBase10x8, 0)
1af20 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 43 6f  ;.  Tcl_CreateCo
1af30 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 6d  mmand(interp, "m
1af40 64 35 66 69 6c 65 22 2c 20 28 54 63 6c 5f 43 6d  d5file", (Tcl_Cm
1af50 64 50 72 6f 63 2a 29 6d 64 35 66 69 6c 65 5f 63  dProc*)md5file_c
1af60 6d 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  md,.            
1af70 20 20 20 20 20 20 20 20 4d 44 35 44 69 67 65 73          MD5Diges
1af80 74 54 6f 42 61 73 65 31 36 2c 20 30 29 3b 0a 20  tToBase16, 0);. 
1af90 20 54 63 6c 5f 43 72 65 61 74 65 43 6f 6d 6d 61   Tcl_CreateComma
1afa0 6e 64 28 69 6e 74 65 72 70 2c 20 22 6d 64 35 66  nd(interp, "md5f
1afb0 69 6c 65 2d 31 30 78 38 22 2c 20 28 54 63 6c 5f  ile-10x8", (Tcl_
1afc0 43 6d 64 50 72 6f 63 2a 29 6d 64 35 66 69 6c 65  CmdProc*)md5file
1afd0 5f 63 6d 64 2c 0a 20 20 20 20 20 20 20 20 20 20  _cmd,.          
1afe0 20 20 20 20 20 20 20 20 20 20 4d 44 35 44 69 67            MD5Dig
1aff0 65 73 74 54 6f 42 61 73 65 31 30 78 38 2c 20 30  estToBase10x8, 0
1b000 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
1b010 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
1b020 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
1b030 45 53 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  EST) || defined(
1b040 53 51 4c 49 54 45 5f 54 43 4c 4d 44 35 29 20 2a  SQLITE_TCLMD5) *
1b050 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  /..#if defined(S
1b060 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a  QLITE_TEST)./*.*
1b070 2a 20 44 75 72 69 6e 67 20 74 65 73 74 69 6e 67  * During testing
1b080 2c 20 74 68 65 20 73 70 65 63 69 61 6c 20 6d 64  , the special md
1b090 35 73 75 6d 28 29 20 61 67 67 72 65 67 61 74 65  5sum() aggregate
1b0a0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 76 61   function is ava
1b0b0 69 6c 61 62 6c 65 2e 0a 2a 2a 20 69 6e 73 69 64  ilable..** insid
1b0c0 65 20 53 51 4c 69 74 65 2e 20 20 54 68 65 20 66  e SQLite.  The f
1b0d0 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
1b0e0 73 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74  s implement that
1b0f0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
1b100 61 74 69 63 20 76 6f 69 64 20 6d 64 35 73 74 65  atic void md5ste
1b110 70 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  p(sqlite3_contex
1b120 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20  t *context, int 
1b130 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
1b140 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 4d  lue **argv){.  M
1b150 44 35 43 6f 6e 74 65 78 74 20 2a 70 3b 0a 20 20  D5Context *p;.  
1b160 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 61 72 67  int i;.  if( arg
1b170 63 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  c<1 ) return;.  
1b180 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72  p = sqlite3_aggr
1b190 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f  egate_context(co
1b1a0 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70  ntext, sizeof(*p
1b1b0 29 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  ));.  if( p==0 )
1b1c0 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21   return;.  if( !
1b1d0 70 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20  p->isInit ){.   
1b1e0 20 4d 44 35 49 6e 69 74 28 70 29 3b 0a 20 20 7d   MD5Init(p);.  }
1b1f0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72  .  for(i=0; i<ar
1b200 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f  gc; i++){.    co
1b210 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74 61 20  nst char *zData 
1b220 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  = (char*)sqlite3
1b230 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
1b240 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 7a 44  [i]);.    if( zD
1b250 61 74 61 20 29 7b 0a 20 20 20 20 20 20 4d 44 35  ata ){.      MD5
1b260 55 70 64 61 74 65 28 70 2c 20 28 75 6e 73 69 67  Update(p, (unsig
1b270 6e 65 64 20 63 68 61 72 2a 29 7a 44 61 74 61 2c  ned char*)zData,
1b280 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 44 61   (int)strlen(zDa
1b290 74 61 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ta));.    }.  }.
1b2a0 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 64  }.static void md
1b2b0 35 66 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65  5finalize(sqlite
1b2c0 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
1b2d0 78 74 29 7b 0a 20 20 4d 44 35 43 6f 6e 74 65 78  xt){.  MD5Contex
1b2e0 74 20 2a 70 3b 0a 20 20 75 6e 73 69 67 6e 65 64  t *p;.  unsigned
1b2f0 20 63 68 61 72 20 64 69 67 65 73 74 5b 31 36 5d   char digest[16]
1b300 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33 33  ;.  char zBuf[33
1b310 5d 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  ];.  p = sqlite3
1b320 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65  _aggregate_conte
1b330 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65  xt(context, size
1b340 6f 66 28 2a 70 29 29 3b 0a 20 20 4d 44 35 46 69  of(*p));.  MD5Fi
1b350 6e 61 6c 28 64 69 67 65 73 74 2c 70 29 3b 0a 20  nal(digest,p);. 
1b360 20 4d 44 35 44 69 67 65 73 74 54 6f 42 61 73 65   MD5DigestToBase
1b370 31 36 28 64 69 67 65 73 74 2c 20 7a 42 75 66 29  16(digest, zBuf)
1b380 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ;.  sqlite3_resu
1b390 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
1b3a0 20 7a 42 75 66 2c 20 2d 31 2c 20 53 51 4c 49 54   zBuf, -1, SQLIT
1b3b0 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a  E_TRANSIENT);.}.
1b3c0 69 6e 74 20 4d 64 35 5f 52 65 67 69 73 74 65 72  int Md5_Register
1b3d0 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
1b3e0 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
1b3f0 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
1b400 6e 28 64 62 2c 20 22 6d 64 35 73 75 6d 22 2c 20  n(db, "md5sum", 
1b410 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  -1, SQLITE_UTF8,
1b420 20 30 2c 20 30 2c 20 0a 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 20 6d 64 35 73 74 65 70           md5step
1b450 2c 20 6d 64 35 66 69 6e 61 6c 69 7a 65 29 3b 0a  , md5finalize);.
1b460 20 20 73 71 6c 69 74 65 33 5f 6f 76 65 72 6c 6f    sqlite3_overlo
1b470 61 64 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  ad_function(db, 
1b480 22 6d 64 35 73 75 6d 22 2c 20 2d 31 29 3b 20 20  "md5sum", -1);  
1b490 2f 2a 20 54 6f 20 65 78 65 72 63 69 73 65 20 74  /* To exercise t
1b4a0 68 69 73 20 41 50 49 20 2a 2f 0a 20 20 72 65 74  his API */.  ret
1b4b0 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
1b4c0 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49   /* defined(SQLI
1b4d0 54 45 5f 54 45 53 54 29 20 2a 2f 0a 0a 0a 2f 2a  TE_TEST) */.../*
1b4e0 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61 63 72 6f  .** If the macro
1b4f0 20 54 43 4c 53 48 20 69 73 20 6f 6e 65 2c 20 74   TCLSH is one, t
1b500 68 65 6e 20 70 75 74 20 69 6e 20 63 6f 64 65 20  hen put in code 
1b510 74 68 69 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20  this for the.** 
1b520 22 6d 61 69 6e 22 20 72 6f 75 74 69 6e 65 20 74  "main" routine t
1b530 68 61 74 20 77 69 6c 6c 20 69 6e 69 74 69 61 6c  hat will initial
1b540 69 7a 65 20 54 63 6c 20 61 6e 64 20 74 61 6b 65  ize Tcl and take
1b550 20 69 6e 70 75 74 20 66 72 6f 6d 0a 2a 2a 20 73   input from.** s
1b560 74 61 6e 64 61 72 64 20 69 6e 70 75 74 2c 20 6f  tandard input, o
1b570 72 20 69 66 20 61 20 66 69 6c 65 20 69 73 20 6e  r if a file is n
1b580 61 6d 65 64 20 6f 6e 20 74 68 65 20 63 6f 6d 6d  amed on the comm
1b590 61 6e 64 20 6c 69 6e 65 0a 2a 2a 20 74 68 65 20  and line.** the 
1b5a0 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
1b5b0 72 65 61 64 73 20 61 6e 64 20 65 76 61 6c 75 61  reads and evalua
1b5c0 74 65 73 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a  tes that file..*
1b5d0 2f 0a 23 69 66 20 54 43 4c 53 48 3d 3d 31 0a 73  /.#if TCLSH==1.s
1b5e0 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
1b5f0 20 2a 74 63 6c 73 68 5f 6d 61 69 6e 5f 6c 6f 6f   *tclsh_main_loo
1b600 70 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69  p(void){.  stati
1b610 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61  c const char zMa
1b620 69 6e 6c 6f 6f 70 5b 5d 20 3d 0a 20 20 20 20 22  inloop[] =.    "
1b630 73 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e 22 0a 20  set line {}\n". 
1b640 20 20 20 22 77 68 69 6c 65 20 7b 21 5b 65 6f 66     "while {![eof
1b650 20 73 74 64 69 6e 5d 7d 20 7b 5c 6e 22 0a 20 20   stdin]} {\n".  
1b660 20 20 20 20 22 69 66 20 7b 24 6c 69 6e 65 21 3d      "if {$line!=
1b670 5c 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20 20 20 20  \"\"} {\n".     
1b680 20 20 20 22 70 75 74 73 20 2d 6e 6f 6e 65 77 6c     "puts -nonewl
1b690 69 6e 65 20 5c 22 3e 20 5c 22 5c 6e 22 0a 20 20  ine \"> \"\n".  
1b6a0 20 20 20 20 22 7d 20 65 6c 73 65 20 7b 5c 6e 22      "} else {\n"
1b6b0 0a 20 20 20 20 20 20 20 20 22 70 75 74 73 20 2d  .        "puts -
1b6c0 6e 6f 6e 65 77 6c 69 6e 65 20 5c 22 25 20 5c 22  nonewline \"% \"
1b6d0 5c 6e 22 0a 20 20 20 20 20 20 22 7d 5c 6e 22 0a  \n".      "}\n".
1b6e0 20 20 20 20 20 20 22 66 6c 75 73 68 20 73 74 64        "flush std
1b6f0 6f 75 74 5c 6e 22 0a 20 20 20 20 20 20 22 61 70  out\n".      "ap
1b700 70 65 6e 64 20 6c 69 6e 65 20 5b 67 65 74 73 20  pend line [gets 
1b710 73 74 64 69 6e 5d 5c 6e 22 0a 20 20 20 20 20 20  stdin]\n".      
1b720 22 69 66 20 7b 5b 69 6e 66 6f 20 63 6f 6d 70 6c  "if {[info compl
1b730 65 74 65 20 24 6c 69 6e 65 5d 7d 20 7b 5c 6e 22  ete $line]} {\n"
1b740 0a 20 20 20 20 20 20 20 20 22 69 66 20 7b 5b 63  .        "if {[c
1b750 61 74 63 68 20 7b 75 70 6c 65 76 65 6c 20 23 30  atch {uplevel #0
1b760 20 24 6c 69 6e 65 7d 20 72 65 73 75 6c 74 5d 7d   $line} result]}
1b770 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20   {\n".          
1b780 22 70 75 74 73 20 73 74 64 65 72 72 20 5c 22 45  "puts stderr \"E
1b790 72 72 6f 72 3a 20 24 72 65 73 75 6c 74 5c 22 5c  rror: $result\"\
1b7a0 6e 22 0a 20 20 20 20 20 20 20 20 22 7d 20 65 6c  n".        "} el
1b7b0 73 65 69 66 20 7b 24 72 65 73 75 6c 74 21 3d 5c  seif {$result!=\
1b7c0 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20  "\"} {\n".      
1b7d0 20 20 20 20 22 70 75 74 73 20 24 72 65 73 75 6c      "puts $resul
1b7e0 74 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 7d 5c  t\n".        "}\
1b7f0 6e 22 0a 20 20 20 20 20 20 20 20 22 73 65 74 20  n".        "set 
1b800 6c 69 6e 65 20 7b 7d 5c 6e 22 0a 20 20 20 20 20  line {}\n".     
1b810 20 22 7d 20 65 6c 73 65 20 7b 5c 6e 22 0a 20 20   "} else {\n".  
1b820 20 20 20 20 20 20 22 61 70 70 65 6e 64 20 6c 69        "append li
1b830 6e 65 20 5c 5c 6e 5c 6e 22 0a 20 20 20 20 20 20  ne \\n\n".      
1b840 22 7d 5c 6e 22 0a 20 20 20 20 22 7d 5c 6e 22 0a  "}\n".    "}\n".
1b850 20 20 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4d 61    ;.  return zMa
1b860 69 6e 6c 6f 6f 70 3b 0a 7d 0a 23 65 6e 64 69 66  inloop;.}.#endif
1b870 0a 23 69 66 20 54 43 4c 53 48 3d 3d 32 0a 73 74  .#if TCLSH==2.st
1b880 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
1b890 2a 74 63 6c 73 68 5f 6d 61 69 6e 5f 6c 6f 6f 70  *tclsh_main_loop
1b8a0 28 76 6f 69 64 29 3b 0a 23 65 6e 64 69 66 0a 0a  (void);.#endif..
1b8b0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
1b8c0 53 54 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  ST.static void i
1b8d0 6e 69 74 5f 61 6c 6c 28 54 63 6c 5f 49 6e 74 65  nit_all(Tcl_Inte
1b8e0 72 70 20 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e  rp *);.static in
1b8f0 74 20 69 6e 69 74 5f 61 6c 6c 5f 63 6d 64 28 0a  t init_all_cmd(.
1b900 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 64 2c    ClientData cd,
1b910 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1b920 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1b930 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1b940 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 0a 20  NST objv[].){.. 
1b950 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 73 6c 61   Tcl_Interp *sla
1b960 76 65 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  ve;.  if( objc!=
1b970 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
1b980 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
1b990 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 4c 41 56  , 1, objv, "SLAV
1b9a0 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  E");.    return 
1b9b0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
1b9c0 20 20 73 6c 61 76 65 20 3d 20 54 63 6c 5f 47 65    slave = Tcl_Ge
1b9d0 74 53 6c 61 76 65 28 69 6e 74 65 72 70 2c 20 54  tSlave(interp, T
1b9e0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1b9f0 76 5b 31 5d 29 29 3b 0a 20 20 69 66 28 20 21 73  v[1]));.  if( !s
1ba00 6c 61 76 65 20 29 7b 0a 20 20 20 20 72 65 74 75  lave ){.    retu
1ba10 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1ba20 7d 0a 0a 20 20 69 6e 69 74 5f 61 6c 6c 28 73 6c  }..  init_all(sl
1ba30 61 76 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  ave);.  return T
1ba40 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1ba50 54 63 6c 63 6d 64 3a 20 64 62 5f 75 73 65 5f 6c  Tclcmd: db_use_l
1ba60 65 67 61 63 79 5f 70 72 65 70 61 72 65 20 44 42  egacy_prepare DB
1ba70 20 42 4f 4f 4c 45 41 4e 0a 2a 2a 0a 2a 2a 20 20   BOOLEAN.**.**  
1ba80 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
1ba90 65 6e 74 20 74 6f 20 74 68 69 73 20 63 6f 6d 6d  ent to this comm
1baa0 61 6e 64 20 6d 75 73 74 20 62 65 20 61 20 64 61  and must be a da
1bab0 74 61 62 61 73 65 20 63 6f 6d 6d 61 6e 64 20 63  tabase command c
1bac0 72 65 61 74 65 64 20 62 79 0a 2a 2a 20 20 20 5b  reated by.**   [
1bad0 73 71 6c 69 74 65 33 5d 2e 20 49 66 20 74 68 65  sqlite3]. If the
1bae0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
1baf0 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
1bb00 68 65 20 68 61 6e 64 6c 65 20 69 73 20 63 6f 6e  he handle is con
1bb10 66 69 67 75 72 65 64 0a 2a 2a 20 20 20 74 6f 20  figured.**   to 
1bb20 75 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f  use the sqlite3_
1bb30 70 72 65 70 61 72 65 5f 76 32 28 29 20 66 75 6e  prepare_v2() fun
1bb40 63 74 69 6f 6e 20 74 6f 20 70 72 65 70 61 72 65  ction to prepare
1bb50 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 49 66 20   statements. If 
1bb60 69 74 0a 2a 2a 20 20 20 69 73 20 66 61 6c 73 65  it.**   is false
1bb70 2c 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  , sqlite3_prepar
1bb80 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e()..*/.static i
1bb90 6e 74 20 64 62 5f 75 73 65 5f 6c 65 67 61 63 79  nt db_use_legacy
1bba0 5f 70 72 65 70 61 72 65 5f 63 6d 64 28 0a 20 20  _prepare_cmd(.  
1bbb0 43 6c 69 65 6e 74 44 61 74 61 20 63 64 2c 0a 20  ClientData cd,. 
1bbc0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1bbd0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1bbe0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1bbf0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 54 63  T objv[].){.  Tc
1bc00 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49 6e 66  l_CmdInfo cmdInf
1bc10 6f 3b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  o;.  SqliteDb *p
1bc20 44 62 3b 0a 20 20 69 6e 74 20 62 50 72 65 70 61  Db;.  int bPrepa
1bc30 72 65 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  re;..  if( objc!
1bc40 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =3 ){.    Tcl_Wr
1bc50 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
1bc60 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20  p, 1, objv, "DB 
1bc70 42 4f 4f 4c 45 41 4e 22 29 3b 0a 20 20 20 20 72  BOOLEAN");.    r
1bc80 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1bc90 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 54 63 6c  .  }..  if( !Tcl
1bca0 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28  _GetCommandInfo(
1bcb0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
1bcc0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
1bcd0 26 63 6d 64 49 6e 66 6f 29 20 29 7b 0a 20 20 20  &cmdInfo) ){.   
1bce0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1bcf0 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 73 75  t(interp, "no su
1bd00 63 68 20 64 62 3a 20 22 2c 20 54 63 6c 5f 47 65  ch db: ", Tcl_Ge
1bd10 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
1bd20 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
1bd30 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1bd40 52 3b 0a 20 20 7d 0a 20 20 70 44 62 20 3d 20 28  R;.  }.  pDb = (
1bd50 53 71 6c 69 74 65 44 62 2a 29 63 6d 64 49 6e 66  SqliteDb*)cmdInf
1bd60 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44 61 74 61 3b  o.objClientData;
1bd70 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f  .  if( Tcl_GetBo
1bd80 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
1bd90 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 62  erp, objv[2], &b
1bda0 50 72 65 70 61 72 65 29 20 29 7b 0a 20 20 20 20  Prepare) ){.    
1bdb0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1bdc0 3b 0a 20 20 7d 0a 0a 20 20 70 44 62 2d 3e 62 4c  ;.  }..  pDb->bL
1bdd0 65 67 61 63 79 50 72 65 70 61 72 65 20 3d 20 62  egacyPrepare = b
1bde0 50 72 65 70 61 72 65 3b 0a 0a 20 20 54 63 6c 5f  Prepare;..  Tcl_
1bdf0 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65  ResetResult(inte
1be00 72 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  rp);.  return TC
1be10 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  L_OK;.}../*.** T
1be20 63 6c 63 6d 64 3a 20 64 62 5f 6c 61 73 74 5f 73  clcmd: db_last_s
1be30 74 6d 74 5f 70 74 72 20 44 42 0a 2a 2a 0a 2a 2a  tmt_ptr DB.**.**
1be40 20 20 20 49 66 20 74 68 65 20 73 74 61 74 65 6d     If the statem
1be50 65 6e 74 20 63 61 63 68 65 20 61 73 73 6f 63 69  ent cache associ
1be60 61 74 65 64 20 77 69 74 68 20 64 61 74 61 62 61  ated with databa
1be70 73 65 20 44 42 20 69 73 20 6e 6f 74 20 65 6d 70  se DB is not emp
1be80 74 79 2c 0a 2a 2a 20 20 20 72 65 74 75 72 6e 20  ty,.**   return 
1be90 74 68 65 20 74 65 78 74 20 72 65 70 72 65 73 65  the text represe
1bea0 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d  ntation of the m
1beb0 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 75 73 65  ost recently use
1bec0 64 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20  d statement.**  
1bed0 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74   handle..*/.stat
1bee0 69 63 20 69 6e 74 20 64 62 5f 6c 61 73 74 5f 73  ic int db_last_s
1bef0 74 6d 74 5f 70 74 72 28 0a 20 20 43 6c 69 65 6e  tmt_ptr(.  Clien
1bf00 74 44 61 74 61 20 63 64 2c 0a 20 20 54 63 6c 5f  tData cd,.  Tcl_
1bf10 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1bf20 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1bf30 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1bf40 76 5b 5d 0a 29 7b 0a 20 20 65 78 74 65 72 6e 20  v[].){.  extern 
1bf50 69 6e 74 20 73 71 6c 69 74 65 33 54 65 73 74 4d  int sqlite3TestM
1bf60 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 54 63  akePointerStr(Tc
1bf70 6c 5f 49 6e 74 65 72 70 2a 2c 20 63 68 61 72 2a  l_Interp*, char*
1bf80 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 54 63 6c 5f  , void*);.  Tcl_
1bf90 43 6d 64 49 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b  CmdInfo cmdInfo;
1bfa0 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
1bfb0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
1bfc0 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63   *pStmt = 0;.  c
1bfd0 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 0a  har zBuf[100];..
1bfe0 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
1bff0 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
1c000 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
1c010 20 6f 62 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20   objv, "DB");.  
1c020 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1c030 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21  OR;.  }..  if( !
1c040 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e  Tcl_GetCommandIn
1c050 66 6f 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  fo(interp, Tcl_G
1c060 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
1c070 29 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29 7b 0a  ), &cmdInfo) ){.
1c080 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1c090 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f  sult(interp, "no
1c0a0 20 73 75 63 68 20 64 62 3a 20 22 2c 20 54 63 6c   such db: ", Tcl
1c0b0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1c0c0 31 5d 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  1]), (char*)0);.
1c0d0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1c0e0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 44 62 20  RROR;.  }.  pDb 
1c0f0 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 6d 64  = (SqliteDb*)cmd
1c100 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44 61  Info.objClientDa
1c110 74 61 3b 0a 0a 20 20 69 66 28 20 70 44 62 2d 3e  ta;..  if( pDb->
1c120 73 74 6d 74 4c 69 73 74 20 29 20 70 53 74 6d 74  stmtList ) pStmt
1c130 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74   = pDb->stmtList
1c140 2d 3e 70 53 74 6d 74 3b 0a 20 20 69 66 28 20 73  ->pStmt;.  if( s
1c150 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f  qlite3TestMakePo
1c160 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c  interStr(interp,
1c170 20 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29 7b   zBuf, pStmt) ){
1c180 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1c190 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c  ERROR;.  }.  Tcl
1c1a0 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
1c1b0 70 2c 20 7a 42 75 66 2c 20 54 43 4c 5f 56 4f 4c  p, zBuf, TCL_VOL
1c1c0 41 54 49 4c 45 29 3b 0a 0a 20 20 72 65 74 75 72  ATILE);..  retur
1c1d0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  n TCL_OK;.}.#end
1c1e0 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67  if../*.** Config
1c1f0 75 72 65 20 74 68 65 20 69 6e 74 65 72 70 72 65  ure the interpre
1c200 74 65 72 20 70 61 73 73 65 64 20 61 73 20 74 68  ter passed as th
1c210 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
1c220 20 74 6f 20 68 61 76 65 20 61 63 63 65 73 73 0a   to have access.
1c230 2a 2a 20 74 6f 20 74 68 65 20 63 6f 6d 6d 61 6e  ** to the comman
1c240 64 73 20 61 6e 64 20 6c 69 6e 6b 65 64 20 76 61  ds and linked va
1c250 72 69 61 62 6c 65 73 20 74 68 61 74 20 6d 61 6b  riables that mak
1c260 65 20 75 70 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  e up:.**.**   * 
1c270 74 68 65 20 5b 73 71 6c 69 74 65 33 5d 20 65 78  the [sqlite3] ex
1c280 74 65 6e 73 69 6f 6e 20 69 74 73 65 6c 66 2c 20  tension itself, 
1c290 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 53 51  .**.**   * If SQ
1c2a0 4c 49 54 45 5f 54 43 4c 4d 44 35 20 6f 72 20 53  LITE_TCLMD5 or S
1c2b0 51 4c 49 54 45 5f 54 45 53 54 20 69 73 20 64 65  QLITE_TEST is de
1c2c0 66 69 6e 65 64 2c 20 74 68 65 20 4d 64 35 20 63  fined, the Md5 c
1c2d0 6f 6d 6d 61 6e 64 73 2c 20 61 6e 64 0a 2a 2a 0a  ommands, and.**.
1c2e0 2a 2a 20 20 20 2a 20 49 66 20 53 51 4c 49 54 45  **   * If SQLITE
1c2f0 5f 54 45 53 54 20 69 73 20 73 65 74 2c 20 74 68  _TEST is set, th
1c300 65 20 76 61 72 69 6f 75 73 20 74 65 73 74 20 69  e various test i
1c310 6e 74 65 72 66 61 63 65 73 20 75 73 65 64 20 62  nterfaces used b
1c320 79 20 74 68 65 20 54 63 6c 0a 2a 2a 20 20 20 20  y the Tcl.**    
1c330 20 74 65 73 74 20 73 75 69 74 65 2e 0a 2a 2f 0a   test suite..*/.
1c340 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 69 74  static void init
1c350 5f 61 6c 6c 28 54 63 6c 5f 49 6e 74 65 72 70 20  _all(Tcl_Interp 
1c360 2a 69 6e 74 65 72 70 29 7b 0a 20 20 53 71 6c 69  *interp){.  Sqli
1c370 74 65 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  te3_Init(interp)
1c380 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  ;..#if defined(S
1c390 51 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64  QLITE_TEST) || d
1c3a0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 43  efined(SQLITE_TC
1c3b0 4c 4d 44 35 29 0a 20 20 4d 64 35 5f 49 6e 69 74  LMD5).  Md5_Init
1c3c0 28 69 6e 74 65 72 70 29 3b 0a 23 65 6e 64 69 66  (interp);.#endif
1c3d0 0a 0a 20 20 2f 2a 20 49 6e 73 74 61 6c 6c 20 74  ..  /* Install t
1c3e0 68 65 20 5b 72 65 67 69 73 74 65 72 5f 64 62 73  he [register_dbs
1c3f0 74 61 74 5f 76 74 61 62 5d 20 63 6f 6d 6d 61 6e  tat_vtab] comman
1c400 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  d to access the 
1c410 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 20  implementation. 
1c420 20 2a 2a 20 6f 66 20 76 69 72 74 75 61 6c 20 74   ** of virtual t
1c430 61 62 6c 65 20 64 62 73 74 61 74 20 28 73 6f 75  able dbstat (sou
1c440 72 63 65 20 66 69 6c 65 20 74 65 73 74 5f 73 74  rce file test_st
1c450 61 74 2e 63 29 2e 20 54 68 69 73 20 63 6f 6d 6d  at.c). This comm
1c460 61 6e 64 20 69 73 0a 20 20 2a 2a 20 72 65 71 75  and is.  ** requ
1c470 69 72 65 64 20 66 6f 72 20 74 65 73 74 66 69 78  ired for testfix
1c480 74 75 72 65 20 61 6e 64 20 73 71 6c 69 74 65 33  ture and sqlite3
1c490 5f 61 6e 61 6c 79 7a 65 72 2c 20 62 75 74 20 6e  _analyzer, but n
1c4a0 6f 74 20 62 79 20 74 68 65 20 70 72 6f 64 75 63  ot by the produc
1c4b0 74 69 6f 6e 0a 20 20 2a 2a 20 54 63 6c 20 65 78  tion.  ** Tcl ex
1c4c0 74 65 6e 73 69 6f 6e 2e 20 20 2a 2f 0a 23 69 66  tension.  */.#if
1c4d0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1c4e0 54 45 53 54 29 20 7c 7c 20 54 43 4c 53 48 3d 3d  TEST) || TCLSH==
1c4f0 32 0a 20 20 7b 0a 20 20 20 20 65 78 74 65 72 6e  2.  {.    extern
1c500 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 53   int SqlitetestS
1c510 74 61 74 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  tat_Init(Tcl_Int
1c520 65 72 70 2a 29 3b 0a 20 20 20 20 53 71 6c 69 74  erp*);.    Sqlit
1c530 65 74 65 73 74 53 74 61 74 5f 49 6e 69 74 28 69  etestStat_Init(i
1c540 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 23 65 6e 64  nterp);.  }.#end
1c550 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
1c560 45 5f 54 45 53 54 0a 20 20 7b 0a 20 20 20 20 65  E_TEST.  {.    e
1c570 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1c580 63 6f 6e 66 69 67 5f 49 6e 69 74 28 54 63 6c 5f  config_Init(Tcl_
1c590 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
1c5a0 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1c5b0 65 73 74 31 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  est1_Init(Tcl_In
1c5c0 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
1c5d0 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1c5e0 74 32 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  t2_Init(Tcl_Inte
1c5f0 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
1c600 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 33   int Sqlitetest3
1c610 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1c620 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1c630 6e 74 20 53 71 6c 69 74 65 74 65 73 74 34 5f 49  nt Sqlitetest4_I
1c640 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
1c650 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
1c660 20 53 71 6c 69 74 65 74 65 73 74 35 5f 49 6e 69   Sqlitetest5_Ini
1c670 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
1c680 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1c690 71 6c 69 74 65 74 65 73 74 36 5f 49 6e 69 74 28  qlitetest6_Init(
1c6a0 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1c6b0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1c6c0 69 74 65 74 65 73 74 37 5f 49 6e 69 74 28 54 63  itetest7_Init(Tc
1c6d0 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1c6e0 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1c6f0 65 74 65 73 74 38 5f 49 6e 69 74 28 54 63 6c 5f  etest8_Init(Tcl_
1c700 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
1c710 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1c720 65 73 74 39 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  est9_Init(Tcl_In
1c730 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
1c740 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1c750 74 61 73 79 6e 63 5f 49 6e 69 74 28 54 63 6c 5f  tasync_Init(Tcl_
1c760 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
1c770 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1c780 65 73 74 5f 61 75 74 6f 65 78 74 5f 49 6e 69 74  est_autoext_Init
1c790 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1c7a0 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1c7b0 6c 69 74 65 74 65 73 74 5f 62 6c 6f 62 5f 49 6e  litetest_blob_In
1c7c0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1c7d0 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1c7e0 53 71 6c 69 74 65 74 65 73 74 5f 64 65 6d 6f 76  Sqlitetest_demov
1c7f0 66 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  fs_Init(Tcl_Inte
1c800 72 70 20 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  rp *);.    exter
1c810 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1c820 5f 66 75 6e 63 5f 49 6e 69 74 28 54 63 6c 5f 49  _func_Init(Tcl_I
1c830 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1c840 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1c850 73 74 5f 68 65 78 69 6f 5f 49 6e 69 74 28 54 63  st_hexio_Init(Tc
1c860 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1c870 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1c880 65 74 65 73 74 5f 69 6e 69 74 5f 49 6e 69 74 28  etest_init_Init(
1c890 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1c8a0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1c8b0 69 74 65 74 65 73 74 5f 6d 61 6c 6c 6f 63 5f 49  itetest_malloc_I
1c8c0 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
1c8d0 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
1c8e0 20 53 71 6c 69 74 65 74 65 73 74 5f 6d 75 74 65   Sqlitetest_mute
1c8f0 78 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  x_Init(Tcl_Inter
1c900 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1c910 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 73 63  int Sqlitetestsc
1c920 68 65 6d 61 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  hema_Init(Tcl_In
1c930 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
1c940 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1c950 74 73 73 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  tsse_Init(Tcl_In
1c960 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
1c970 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1c980 74 74 63 6c 76 61 72 5f 49 6e 69 74 28 54 63 6c  ttclvar_Init(Tcl
1c990 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1c9a0 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1c9b0 74 65 73 74 66 73 5f 49 6e 69 74 28 54 63 6c 5f  testfs_Init(Tcl_
1c9c0 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
1c9d0 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1c9e0 65 73 74 54 68 72 65 61 64 5f 49 6e 69 74 28 54  estThread_Init(T
1c9f0 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1ca00 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1ca10 74 65 74 65 73 74 4f 6e 65 66 69 6c 65 5f 49 6e  tetestOnefile_In
1ca20 69 74 28 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  it();.    extern
1ca30 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 4f   int SqlitetestO
1ca40 73 69 6e 73 74 5f 49 6e 69 74 28 54 63 6c 5f 49  sinst_Init(Tcl_I
1ca50 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1ca60 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1ca70 73 74 62 61 63 6b 75 70 5f 49 6e 69 74 28 54 63  stbackup_Init(Tc
1ca80 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1ca90 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1caa0 65 74 65 73 74 69 6e 74 61 72 72 61 79 5f 49 6e  etestintarray_In
1cab0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1cac0 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1cad0 53 71 6c 69 74 65 74 65 73 74 76 66 73 5f 49 6e  Sqlitetestvfs_In
1cae0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29  it(Tcl_Interp *)
1caf0 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
1cb00 20 53 71 6c 69 74 65 74 65 73 74 72 74 72 65 65   Sqlitetestrtree
1cb10 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1cb20 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1cb30 6e 74 20 53 71 6c 69 74 65 71 75 6f 74 61 5f 49  nt Sqlitequota_I
1cb40 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
1cb50 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
1cb60 20 53 71 6c 69 74 65 6d 75 6c 74 69 70 6c 65 78   Sqlitemultiplex
1cb70 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1cb80 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1cb90 6e 74 20 53 71 6c 69 74 65 53 75 70 65 72 6c 6f  nt SqliteSuperlo
1cba0 63 6b 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  ck_Init(Tcl_Inte
1cbb0 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
1cbc0 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 53   int SqlitetestS
1cbd0 79 73 63 61 6c 6c 5f 49 6e 69 74 28 54 63 6c 5f  yscall_Init(Tcl_
1cbe0 49 6e 74 65 72 70 2a 29 3b 0a 0a 23 69 66 20 64  Interp*);..#if d
1cbf0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
1cc00 41 42 4c 45 5f 46 54 53 33 29 20 7c 7c 20 64 65  ABLE_FTS3) || de
1cc10 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
1cc20 42 4c 45 5f 46 54 53 34 29 0a 20 20 20 20 65 78  BLE_FTS4).    ex
1cc30 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1cc40 65 73 74 66 74 73 33 5f 49 6e 69 74 28 54 63 6c  estfts3_Init(Tcl
1cc50 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
1cc60 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  ;.#endif..#ifdef
1cc70 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 5a   SQLITE_ENABLE_Z
1cc80 49 50 56 46 53 0a 20 20 20 20 65 78 74 65 72 6e  IPVFS.    extern
1cc90 20 69 6e 74 20 5a 69 70 76 66 73 5f 49 6e 69 74   int Zipvfs_Init
1cca0 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1ccb0 20 20 20 5a 69 70 76 66 73 5f 49 6e 69 74 28 69     Zipvfs_Init(i
1ccc0 6e 74 65 72 70 29 3b 0a 23 65 6e 64 69 66 0a 0a  nterp);.#endif..
1ccd0 20 20 20 20 53 71 6c 69 74 65 63 6f 6e 66 69 67      Sqliteconfig
1cce0 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
1ccf0 20 20 20 53 71 6c 69 74 65 74 65 73 74 31 5f 49     Sqlitetest1_I
1cd00 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1cd10 20 53 71 6c 69 74 65 74 65 73 74 32 5f 49 6e 69   Sqlitetest2_Ini
1cd20 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
1cd30 71 6c 69 74 65 74 65 73 74 33 5f 49 6e 69 74 28  qlitetest3_Init(
1cd40 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
1cd50 69 74 65 74 65 73 74 34 5f 49 6e 69 74 28 69 6e  itetest4_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 35 5f 49 6e 69 74 28 69 6e 74 65  etest5_Init(inte
1cd80 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
1cd90 65 73 74 36 5f 49 6e 69 74 28 69 6e 74 65 72 70  est6_Init(interp
1cda0 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
1cdb0 74 37 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  t7_Init(interp);
1cdc0 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 38  .    Sqlitetest8
1cdd0 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
1cde0 20 20 20 53 71 6c 69 74 65 74 65 73 74 39 5f 49     Sqlitetest9_I
1cdf0 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1ce00 20 53 71 6c 69 74 65 74 65 73 74 61 73 79 6e 63   Sqlitetestasync
1ce10 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
1ce20 20 20 20 53 71 6c 69 74 65 74 65 73 74 5f 61 75     Sqlitetest_au
1ce30 74 6f 65 78 74 5f 49 6e 69 74 28 69 6e 74 65 72  toext_Init(inter
1ce40 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
1ce50 73 74 5f 62 6c 6f 62 5f 49 6e 69 74 28 69 6e 74  st_blob_Init(int
1ce60 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1ce70 74 65 73 74 5f 64 65 6d 6f 76 66 73 5f 49 6e 69  test_demovfs_Ini
1ce80 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
1ce90 71 6c 69 74 65 74 65 73 74 5f 66 75 6e 63 5f 49  qlitetest_func_I
1cea0 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1ceb0 20 53 71 6c 69 74 65 74 65 73 74 5f 68 65 78 69   Sqlitetest_hexi
1cec0 6f 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  o_Init(interp);.
1ced0 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 5f 69      Sqlitetest_i
1cee0 6e 69 74 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  nit_Init(interp)
1cef0 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
1cf00 5f 6d 61 6c 6c 6f 63 5f 49 6e 69 74 28 69 6e 74  _malloc_Init(int
1cf10 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1cf20 74 65 73 74 5f 6d 75 74 65 78 5f 49 6e 69 74 28  test_mutex_Init(
1cf30 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
1cf40 69 74 65 74 65 73 74 73 63 68 65 6d 61 5f 49 6e  itetestschema_In
1cf50 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1cf60 53 71 6c 69 74 65 74 65 73 74 74 63 6c 76 61 72  Sqlitetesttclvar
1cf70 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
1cf80 20 20 20 53 71 6c 69 74 65 74 65 73 74 66 73 5f     Sqlitetestfs_
1cf90 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
1cfa0 20 20 53 71 6c 69 74 65 74 65 73 74 54 68 72 65    SqlitetestThre
1cfb0 61 64 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  ad_Init(interp);
1cfc0 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 4f  .    SqlitetestO
1cfd0 6e 65 66 69 6c 65 5f 49 6e 69 74 28 69 6e 74 65  nefile_Init(inte
1cfe0 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
1cff0 65 73 74 4f 73 69 6e 73 74 5f 49 6e 69 74 28 69  estOsinst_Init(i
1d000 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1d010 74 65 74 65 73 74 62 61 63 6b 75 70 5f 49 6e 69  tetestbackup_Ini
1d020 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
1d030 71 6c 69 74 65 74 65 73 74 69 6e 74 61 72 72 61  qlitetestintarra
1d040 79 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  y_Init(interp);.
1d050 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 76 66      Sqlitetestvf
1d060 73 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  s_Init(interp);.
1d070 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 72 74      Sqlitetestrt
1d080 72 65 65 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  ree_Init(interp)
1d090 3b 0a 20 20 20 20 53 71 6c 69 74 65 71 75 6f 74  ;.    Sqlitequot
1d0a0 61 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  a_Init(interp);.
1d0b0 20 20 20 20 53 71 6c 69 74 65 6d 75 6c 74 69 70      Sqlitemultip
1d0c0 6c 65 78 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  lex_Init(interp)
1d0d0 3b 0a 20 20 20 20 53 71 6c 69 74 65 53 75 70 65  ;.    SqliteSupe
1d0e0 72 6c 6f 63 6b 5f 49 6e 69 74 28 69 6e 74 65 72  rlock_Init(inter
1d0f0 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
1d100 73 74 53 79 73 63 61 6c 6c 5f 49 6e 69 74 28 69  stSyscall_Init(i
1d110 6e 74 65 72 70 29 3b 0a 0a 23 69 66 20 64 65 66  nterp);..#if def
1d120 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
1d130 4c 45 5f 46 54 53 33 29 20 7c 7c 20 64 65 66 69  LE_FTS3) || defi
1d140 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
1d150 45 5f 46 54 53 34 29 0a 20 20 20 20 53 71 6c 69  E_FTS4).    Sqli
1d160 74 65 74 65 73 74 66 74 73 33 5f 49 6e 69 74 28  tetestfts3_Init(
1d170 69 6e 74 65 72 70 29 3b 0a 23 65 6e 64 69 66 0a  interp);.#endif.
1d180 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
1d190 62 6a 43 6f 6d 6d 61 6e 64 28 0a 20 20 20 20 20  bjCommand(.     
1d1a0 20 20 20 69 6e 74 65 72 70 2c 20 22 6c 6f 61 64     interp, "load
1d1b0 5f 74 65 73 74 66 69 78 74 75 72 65 5f 65 78 74  _testfixture_ext
1d1c0 65 6e 73 69 6f 6e 73 22 2c 20 69 6e 69 74 5f 61  ensions", init_a
1d1d0 6c 6c 5f 63 6d 64 2c 20 30 2c 20 30 0a 20 20 20  ll_cmd, 0, 0.   
1d1e0 20 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61   );.    Tcl_Crea
1d1f0 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 0a 20 20  teObjCommand(.  
1d200 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20 22 64        interp, "d
1d210 62 5f 75 73 65 5f 6c 65 67 61 63 79 5f 70 72 65  b_use_legacy_pre
1d220 70 61 72 65 22 2c 20 64 62 5f 75 73 65 5f 6c 65  pare", db_use_le
1d230 67 61 63 79 5f 70 72 65 70 61 72 65 5f 63 6d 64  gacy_prepare_cmd
1d240 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20  , 0, 0.    );.  
1d250 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
1d260 6f 6d 6d 61 6e 64 28 0a 20 20 20 20 20 20 20 20  ommand(.        
1d270 69 6e 74 65 72 70 2c 20 22 64 62 5f 6c 61 73 74  interp, "db_last
1d280 5f 73 74 6d 74 5f 70 74 72 22 2c 20 64 62 5f 6c  _stmt_ptr", db_l
1d290 61 73 74 5f 73 74 6d 74 5f 70 74 72 2c 20 30 2c  ast_stmt_ptr, 0,
1d2a0 20 30 0a 20 20 20 20 29 3b 0a 0a 23 69 66 64 65   0.    );..#ifde
1d2b0 66 20 53 51 4c 49 54 45 5f 53 53 45 0a 20 20 20  f SQLITE_SSE.   
1d2c0 20 53 71 6c 69 74 65 74 65 73 74 73 73 65 5f 49   Sqlitetestsse_I
1d2d0 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 23 65 6e  nit(interp);.#en
1d2e0 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d  dif.  }.#endif.}
1d2f0 0a 0a 2f 2a 20 4e 65 65 64 65 64 20 66 6f 72 20  ../* Needed for 
1d300 74 68 65 20 73 65 74 72 6c 69 6d 69 74 28 29 20  the setrlimit() 
1d310 73 79 73 74 65 6d 20 63 61 6c 6c 20 6f 6e 20 75  system call on u
1d320 6e 69 78 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  nix */.#if defin
1d330 65 64 28 75 6e 69 78 29 0a 23 69 6e 63 6c 75 64  ed(unix).#includ
1d340 65 20 3c 73 79 73 2f 72 65 73 6f 75 72 63 65 2e  e <sys/resource.
1d350 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  h>.#endif..#defi
1d360 6e 65 20 54 43 4c 53 48 5f 4d 41 49 4e 20 6d 61  ne TCLSH_MAIN ma
1d370 69 6e 20 20 20 2f 2a 20 4e 65 65 64 65 64 20 74  in   /* Needed t
1d380 6f 20 66 61 6b 65 20 6f 75 74 20 6d 6b 74 63 6c  o fake out mktcl
1d390 61 70 70 20 2a 2f 0a 69 6e 74 20 54 43 4c 53 48  app */.int TCLSH
1d3a0 5f 4d 41 49 4e 28 69 6e 74 20 61 72 67 63 2c 20  _MAIN(int argc, 
1d3b0 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20  char **argv){.  
1d3c0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1d3d0 72 70 3b 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  rp;..#if !define
1d3e0 64 28 5f 57 49 4e 33 32 5f 57 43 45 29 0a 20 20  d(_WIN32_WCE).  
1d3f0 69 66 28 20 67 65 74 65 6e 76 28 22 42 52 45 41  if( getenv("BREA
1d400 4b 22 29 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  K") ){.    fprin
1d410 74 66 28 73 74 64 65 72 72 2c 0a 20 20 20 20 20  tf(stderr,.     
1d420 20 20 20 22 61 74 74 61 63 68 20 64 65 62 75 67     "attach debug
1d430 67 65 72 20 74 6f 20 70 72 6f 63 65 73 73 20 25  ger to process %
1d440 64 20 61 6e 64 20 70 72 65 73 73 20 61 6e 79 20  d and press any 
1d450 6b 65 79 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e  key to continue.
1d460 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 47 45 54  \n",.        GET
1d470 50 49 44 28 29 29 3b 0a 20 20 20 20 66 67 65 74  PID());.    fget
1d480 63 28 73 74 64 69 6e 29 3b 0a 20 20 7d 0a 23 65  c(stdin);.  }.#e
1d490 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 69 6e 63 65  ndif..  /* Since
1d4a0 20 74 68 65 20 70 72 69 6d 61 72 79 20 75 73 65   the primary use
1d4b0 20 63 61 73 65 20 66 6f 72 20 74 68 69 73 20 62   case for this b
1d4c0 69 6e 61 72 79 20 69 73 20 74 65 73 74 69 6e 67  inary is testing
1d4d0 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20 20 2a 2a   of SQLite,.  **
1d4e0 20 62 65 20 73 75 72 65 20 74 6f 20 67 65 6e 65   be sure to gene
1d4f0 72 61 74 65 20 63 6f 72 65 20 66 69 6c 65 73 20  rate core files 
1d500 69 66 20 77 65 20 63 72 61 73 68 20 2a 2f 0a 23  if we crash */.#
1d510 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1d520 45 5f 54 45 53 54 29 20 26 26 20 64 65 66 69 6e  E_TEST) && defin
1d530 65 64 28 75 6e 69 78 29 0a 20 20 7b 20 73 74 72  ed(unix).  { str
1d540 75 63 74 20 72 6c 69 6d 69 74 20 78 3b 0a 20 20  uct rlimit x;.  
1d550 20 20 67 65 74 72 6c 69 6d 69 74 28 52 4c 49 4d    getrlimit(RLIM
1d560 49 54 5f 43 4f 52 45 2c 20 26 78 29 3b 0a 20 20  IT_CORE, &x);.  
1d570 20 20 78 2e 72 6c 69 6d 5f 63 75 72 20 3d 20 78    x.rlim_cur = x
1d580 2e 72 6c 69 6d 5f 6d 61 78 3b 0a 20 20 20 20 73  .rlim_max;.    s
1d590 65 74 72 6c 69 6d 69 74 28 52 4c 49 4d 49 54 5f  etrlimit(RLIMIT_
1d5a0 43 4f 52 45 2c 20 26 78 29 3b 0a 20 20 7d 0a 23  CORE, &x);.  }.#
1d5b0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1d5c0 54 45 53 54 20 26 26 20 75 6e 69 78 20 2a 2f 0a  TEST && unix */.
1d5d0 0a 0a 20 20 2f 2a 20 43 61 6c 6c 20 73 71 6c 69  ..  /* Call sqli
1d5e0 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 29 20 6f  te3_shutdown() o
1d5f0 6e 63 65 20 62 65 66 6f 72 65 20 64 6f 69 6e 67  nce before doing
1d600 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 2e 20   anything else. 
1d610 54 68 69 73 20 69 73 20 74 6f 0a 20 20 2a 2a 20  This is to.  ** 
1d620 74 65 73 74 20 74 68 61 74 20 73 71 6c 69 74 65  test that sqlite
1d630 33 5f 73 68 75 74 64 6f 77 6e 28 29 20 63 61 6e  3_shutdown() can
1d640 20 62 65 20 73 61 66 65 6c 79 20 63 61 6c 6c 65   be safely calle
1d650 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 62  d by a process b
1d660 65 66 6f 72 65 0a 20 20 2a 2a 20 73 71 6c 69 74  efore.  ** sqlit
1d670 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20  e3_initialize() 
1d680 69 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  is. */.  sqlite3
1d690 5f 73 68 75 74 64 6f 77 6e 28 29 3b 0a 0a 20 20  _shutdown();..  
1d6a0 54 63 6c 5f 46 69 6e 64 45 78 65 63 75 74 61 62  Tcl_FindExecutab
1d6b0 6c 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 54  le(argv[0]);.  T
1d6c0 63 6c 5f 53 65 74 53 79 73 74 65 6d 45 6e 63 6f  cl_SetSystemEnco
1d6d0 64 69 6e 67 28 4e 55 4c 4c 2c 20 22 75 74 66 2d  ding(NULL, "utf-
1d6e0 38 22 29 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20  8");.  interp = 
1d6f0 54 63 6c 5f 43 72 65 61 74 65 49 6e 74 65 72 70  Tcl_CreateInterp
1d700 28 29 3b 0a 0a 23 69 66 20 54 43 4c 53 48 3d 3d  ();..#if TCLSH==
1d710 32 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66  2.  sqlite3_conf
1d720 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  ig(SQLITE_CONFIG
1d730 5f 53 49 4e 47 4c 45 54 48 52 45 41 44 29 3b 0a  _SINGLETHREAD);.
1d740 23 65 6e 64 69 66 0a 0a 20 20 69 6e 69 74 5f 61  #endif..  init_a
1d750 6c 6c 28 69 6e 74 65 72 70 29 3b 0a 20 20 69 66  ll(interp);.  if
1d760 28 20 61 72 67 63 3e 3d 32 20 29 7b 0a 20 20 20  ( argc>=2 ){.   
1d770 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 68 61 72   int i;.    char
1d780 20 7a 41 72 67 63 5b 33 32 5d 3b 0a 20 20 20 20   zArgc[32];.    
1d790 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1d7a0 28 73 69 7a 65 6f 66 28 7a 41 72 67 63 29 2c 20  (sizeof(zArgc), 
1d7b0 7a 41 72 67 63 2c 20 22 25 64 22 2c 20 61 72 67  zArgc, "%d", arg
1d7c0 63 2d 28 33 2d 54 43 4c 53 48 29 29 3b 0a 20 20  c-(3-TCLSH));.  
1d7d0 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74    Tcl_SetVar(int
1d7e0 65 72 70 2c 22 61 72 67 63 22 2c 20 7a 41 72 67  erp,"argc", zArg
1d7f0 63 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e  c, TCL_GLOBAL_ON
1d800 4c 59 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  LY);.    Tcl_Set
1d810 56 61 72 28 69 6e 74 65 72 70 2c 22 61 72 67 76  Var(interp,"argv
1d820 30 22 2c 61 72 67 76 5b 31 5d 2c 54 43 4c 5f 47  0",argv[1],TCL_G
1d830 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20  LOBAL_ONLY);.   
1d840 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65   Tcl_SetVar(inte
1d850 72 70 2c 22 61 72 67 76 22 2c 20 22 22 2c 20 54  rp,"argv", "", T
1d860 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b  CL_GLOBAL_ONLY);
1d870 0a 20 20 20 20 66 6f 72 28 69 3d 33 2d 54 43 4c  .    for(i=3-TCL
1d880 53 48 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29  SH; i<argc; i++)
1d890 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 56  {.      Tcl_SetV
1d8a0 61 72 28 69 6e 74 65 72 70 2c 20 22 61 72 67 76  ar(interp, "argv
1d8b0 22 2c 20 61 72 67 76 5b 69 5d 2c 0a 20 20 20 20  ", argv[i],.    
1d8c0 20 20 20 20 20 20 54 43 4c 5f 47 4c 4f 42 41 4c        TCL_GLOBAL
1d8d0 5f 4f 4e 4c 59 20 7c 20 54 43 4c 5f 4c 49 53 54  _ONLY | TCL_LIST
1d8e0 5f 45 4c 45 4d 45 4e 54 20 7c 20 54 43 4c 5f 41  _ELEMENT | TCL_A
1d8f0 50 50 45 4e 44 5f 56 41 4c 55 45 29 3b 0a 20 20  PPEND_VALUE);.  
1d900 20 20 7d 0a 20 20 20 20 69 66 28 20 54 43 4c 53    }.    if( TCLS
1d910 48 3d 3d 31 20 26 26 20 54 63 6c 5f 45 76 61 6c  H==1 && Tcl_Eval
1d920 46 69 6c 65 28 69 6e 74 65 72 70 2c 20 61 72 67  File(interp, arg
1d930 76 5b 31 5d 29 21 3d 54 43 4c 5f 4f 4b 20 29 7b  v[1])!=TCL_OK ){
1d940 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
1d950 72 20 2a 7a 49 6e 66 6f 20 3d 20 54 63 6c 5f 47  r *zInfo = Tcl_G
1d960 65 74 56 61 72 28 69 6e 74 65 72 70 2c 20 22 65  etVar(interp, "e
1d970 72 72 6f 72 49 6e 66 6f 22 2c 20 54 43 4c 5f 47  rrorInfo", TCL_G
1d980 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20  LOBAL_ONLY);.   
1d990 20 20 20 69 66 28 20 7a 49 6e 66 6f 3d 3d 30 20     if( zInfo==0 
1d9a0 29 20 7a 49 6e 66 6f 20 3d 20 54 63 6c 5f 47 65  ) zInfo = Tcl_Ge
1d9b0 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e  tStringResult(in
1d9c0 74 65 72 70 29 3b 0a 20 20 20 20 20 20 66 70 72  terp);.      fpr
1d9d0 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25 73 3a  intf(stderr,"%s:
1d9e0 20 25 73 5c 6e 22 2c 20 2a 61 72 67 76 2c 20 7a   %s\n", *argv, z
1d9f0 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 72 65 74  Info);.      ret
1da00 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
1da10 0a 20 20 69 66 28 20 54 43 4c 53 48 3d 3d 32 20  .  if( TCLSH==2 
1da20 7c 7c 20 61 72 67 63 3c 3d 31 20 29 7b 0a 20 20  || argc<=1 ){.  
1da30 20 20 54 63 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c    Tcl_GlobalEval
1da40 28 69 6e 74 65 72 70 2c 20 74 63 6c 73 68 5f 6d  (interp, tclsh_m
1da50 61 69 6e 5f 6c 6f 6f 70 28 29 29 3b 0a 20 20 7d  ain_loop());.  }
1da60 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
1da70 65 6e 64 69 66 20 2f 2a 20 54 43 4c 53 48 20 2a  endif /* TCLSH *
1da80 2f 0a                                            /.