/ Hex Artifact Content
Login

Artifact 0bbb44543175ef2033d39780a233f98bf354eff9:


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 70 72 69 6e 74 66 28 7a 42 75 66  ;.  sprintf(zBuf
4ca0: 2c 20 22 25 64 22 2c 20 69 41 72 67 29 3b 0a 20  , "%d", iArg);. 
4cb0: 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65   Tcl_SetVar(inte
4cc0: 72 70 2c 20 22 73 71 6c 69 74 65 5f 75 6e 6c 6f  rp, "sqlite_unlo
4cd0: 63 6b 5f 6e 6f 74 69 66 79 5f 61 72 67 22 2c 20  ck_notify_arg", 
4ce0: 7a 42 75 66 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c  zBuf, TCL_GLOBAL
4cf0: 5f 4f 4e 4c 59 29 3b 0a 20 20 73 70 72 69 6e 74  _ONLY);.  sprint
4d00: 66 28 7a 42 75 66 2c 20 22 25 64 22 2c 20 6e 41  f(zBuf, "%d", nA
4d10: 72 67 29 3b 0a 20 20 54 63 6c 5f 53 65 74 56 61  rg);.  Tcl_SetVa
4d20: 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
4d30: 65 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 5f  e_unlock_notify_
4d40: 61 72 67 63 6f 75 6e 74 22 2c 20 7a 42 75 66 2c  argcount", zBuf,
4d50: 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59   TCL_GLOBAL_ONLY
4d60: 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  );.}.#else.# def
4d70: 69 6e 65 20 73 65 74 54 65 73 74 55 6e 6c 6f 63  ine setTestUnloc
4d80: 6b 4e 6f 74 69 66 79 56 61 72 73 28 78 2c 79 2c  kNotifyVars(x,y,
4d90: 7a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  z).#endif..#ifde
4da0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
4db0: 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 0a 73 74  UNLOCK_NOTIFY.st
4dc0: 61 74 69 63 20 76 6f 69 64 20 44 62 55 6e 6c 6f  atic void DbUnlo
4dd0: 63 6b 4e 6f 74 69 66 79 28 76 6f 69 64 20 2a 2a  ckNotify(void **
4de0: 61 70 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 29  apArg, int nArg)
4df0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
4e00: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
4e10: 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e  +){.    const in
4e20: 74 20 66 6c 61 67 73 20 3d 20 28 54 43 4c 5f 45  t flags = (TCL_E
4e30: 56 41 4c 5f 47 4c 4f 42 41 4c 7c 54 43 4c 5f 45  VAL_GLOBAL|TCL_E
4e40: 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20 20  VAL_DIRECT);.   
4e50: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
4e60: 20 28 53 71 6c 69 74 65 44 62 20 2a 29 61 70 41   (SqliteDb *)apA
4e70: 72 67 5b 69 5d 3b 0a 20 20 20 20 73 65 74 54 65  rg[i];.    setTe
4e80: 73 74 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 56 61  stUnlockNotifyVa
4e90: 72 73 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20  rs(pDb->interp, 
4ea0: 69 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 61 73  i, nArg);.    as
4eb0: 73 65 72 74 28 20 70 44 62 2d 3e 70 55 6e 6c 6f  sert( pDb->pUnlo
4ec0: 63 6b 4e 6f 74 69 66 79 29 3b 0a 20 20 20 20 54  ckNotify);.    T
4ed0: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62  cl_EvalObjEx(pDb
4ee0: 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 70  ->interp, pDb->p
4ef0: 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 2c 20 66 6c  UnlockNotify, fl
4f00: 61 67 73 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65  ags);.    Tcl_De
4f10: 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e  crRefCount(pDb->
4f20: 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 29 3b 0a  pUnlockNotify);.
4f30: 20 20 20 20 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b      pDb->pUnlock
4f40: 4e 6f 74 69 66 79 20 3d 20 30 3b 0a 20 20 7d 0a  Notify = 0;.  }.
4f50: 7d 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63  }.#endif..static
4f60: 20 76 6f 69 64 20 44 62 55 70 64 61 74 65 48 61   void DbUpdateHa
4f70: 6e 64 6c 65 72 28 0a 20 20 76 6f 69 64 20 2a 70  ndler(.  void *p
4f80: 2c 20 0a 20 20 69 6e 74 20 6f 70 2c 0a 20 20 63  , .  int op,.  c
4f90: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20  onst char *zDb, 
4fa0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
4fb0: 54 62 6c 2c 20 0a 20 20 73 71 6c 69 74 65 5f 69  Tbl, .  sqlite_i
4fc0: 6e 74 36 34 20 72 6f 77 69 64 0a 29 7b 0a 20 20  nt64 rowid.){.  
4fd0: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20  SqliteDb *pDb = 
4fe0: 28 53 71 6c 69 74 65 44 62 20 2a 29 70 3b 0a 20  (SqliteDb *)p;. 
4ff0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a   Tcl_Obj *pCmd;.
5000: 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e  .  assert( pDb->
5010: 70 55 70 64 61 74 65 48 6f 6f 6b 20 29 3b 0a 20  pUpdateHook );. 
5020: 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 51 4c   assert( op==SQL
5030: 49 54 45 5f 49 4e 53 45 52 54 20 7c 7c 20 6f 70  ITE_INSERT || op
5040: 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20  ==SQLITE_UPDATE 
5050: 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 44 45  || op==SQLITE_DE
5060: 4c 45 54 45 20 29 3b 0a 0a 20 20 70 43 6d 64 20  LETE );..  pCmd 
5070: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
5080: 62 6a 28 70 44 62 2d 3e 70 55 70 64 61 74 65 48  bj(pDb->pUpdateH
5090: 6f 6f 6b 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72  ook);.  Tcl_Incr
50a0: 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a  RefCount(pCmd);.
50b0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
50c0: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43  endElement(0, pC
50d0: 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  md, Tcl_NewStrin
50e0: 67 4f 62 6a 28 0a 20 20 20 20 28 20 28 6f 70 3d  gObj(.    ( (op=
50f0: 3d 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 29 3f  =SQLITE_INSERT)?
5100: 22 49 4e 53 45 52 54 22 3a 28 6f 70 3d 3d 53 51  "INSERT":(op==SQ
5110: 4c 49 54 45 5f 55 50 44 41 54 45 29 3f 22 55 50  LITE_UPDATE)?"UP
5120: 44 41 54 45 22 3a 22 44 45 4c 45 54 45 22 29 2c  DATE":"DELETE"),
5130: 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73   -1));.  Tcl_Lis
5140: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
5150: 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e  t(0, pCmd, Tcl_N
5160: 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 44 62 2c  ewStringObj(zDb,
5170: 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73   -1));.  Tcl_Lis
5180: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
5190: 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e  t(0, pCmd, Tcl_N
51a0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54 62 6c  ewStringObj(zTbl
51b0: 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
51c0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
51d0: 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f  nt(0, pCmd, Tcl_
51e0: 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 72 6f  NewWideIntObj(ro
51f0: 77 69 64 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61  wid));.  Tcl_Eva
5200: 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69 6e 74 65  lObjEx(pDb->inte
5210: 72 70 2c 20 70 43 6d 64 2c 20 54 43 4c 5f 45 56  rp, pCmd, TCL_EV
5220: 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20 54 63  AL_DIRECT);.  Tc
5230: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
5240: 43 6d 64 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  Cmd);.}..static 
5250: 76 6f 69 64 20 74 63 6c 43 6f 6c 6c 61 74 65 4e  void tclCollateN
5260: 65 65 64 65 64 28 0a 20 20 76 6f 69 64 20 2a 70  eeded(.  void *p
5270: 43 74 78 2c 0a 20 20 73 71 6c 69 74 65 33 20 2a  Ctx,.  sqlite3 *
5280: 64 62 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20  db,.  int enc,. 
5290: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
52a0: 6d 65 0a 29 7b 0a 20 20 53 71 6c 69 74 65 44 62  me.){.  SqliteDb
52b0: 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44   *pDb = (SqliteD
52c0: 62 20 2a 29 70 43 74 78 3b 0a 20 20 54 63 6c 5f  b *)pCtx;.  Tcl_
52d0: 4f 62 6a 20 2a 70 53 63 72 69 70 74 20 3d 20 54  Obj *pScript = T
52e0: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28  cl_DuplicateObj(
52f0: 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65  pDb->pCollateNee
5300: 64 65 64 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72  ded);.  Tcl_Incr
5310: 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74  RefCount(pScript
5320: 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
5330: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
5340: 20 70 53 63 72 69 70 74 2c 20 54 63 6c 5f 4e 65   pScript, Tcl_Ne
5350: 77 53 74 72 69 6e 67 4f 62 6a 28 7a 4e 61 6d 65  wStringObj(zName
5360: 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 45 76  , -1));.  Tcl_Ev
5370: 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69 6e 74  alObjEx(pDb->int
5380: 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20 30 29  erp, pScript, 0)
5390: 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43  ;.  Tcl_DecrRefC
53a0: 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 7d  ount(pScript);.}
53b0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
53c0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
53d0: 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20 53 51  o evaluate an SQ
53e0: 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63  L collation func
53f0: 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64  tion implemented
5400: 0a 2a 2a 20 75 73 69 6e 67 20 54 43 4c 20 73 63  .** using TCL sc
5410: 72 69 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ript..*/.static 
5420: 69 6e 74 20 74 63 6c 53 71 6c 43 6f 6c 6c 61 74  int tclSqlCollat
5430: 65 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c  e(.  void *pCtx,
5440: 0a 20 20 69 6e 74 20 6e 41 2c 0a 20 20 63 6f 6e  .  int nA,.  con
5450: 73 74 20 76 6f 69 64 20 2a 7a 41 2c 0a 20 20 69  st void *zA,.  i
5460: 6e 74 20 6e 42 2c 0a 20 20 63 6f 6e 73 74 20 76  nt nB,.  const v
5470: 6f 69 64 20 2a 7a 42 0a 29 7b 0a 20 20 53 71 6c  oid *zB.){.  Sql
5480: 43 6f 6c 6c 61 74 65 20 2a 70 20 3d 20 28 53 71  Collate *p = (Sq
5490: 6c 43 6f 6c 6c 61 74 65 20 2a 29 70 43 74 78 3b  lCollate *)pCtx;
54a0: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64  .  Tcl_Obj *pCmd
54b0: 3b 0a 0a 20 20 70 43 6d 64 20 3d 20 54 63 6c 5f  ;..  pCmd = Tcl_
54c0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 2d 3e  NewStringObj(p->
54d0: 7a 53 63 72 69 70 74 2c 20 2d 31 29 3b 0a 20 20  zScript, -1);.  
54e0: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
54f0: 28 70 43 6d 64 29 3b 0a 20 20 54 63 6c 5f 4c 69  (pCmd);.  Tcl_Li
5500: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
5510: 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43  nt(p->interp, pC
5520: 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  md, Tcl_NewStrin
5530: 67 4f 62 6a 28 7a 41 2c 20 6e 41 29 29 3b 0a 20  gObj(zA, nA));. 
5540: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
5550: 6e 64 45 6c 65 6d 65 6e 74 28 70 2d 3e 69 6e 74  ndElement(p->int
5560: 65 72 70 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e  erp, pCmd, Tcl_N
5570: 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 42 2c 20  ewStringObj(zB, 
5580: 6e 42 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c  nB));.  Tcl_Eval
5590: 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c  ObjEx(p->interp,
55a0: 20 70 43 6d 64 2c 20 54 43 4c 5f 45 56 41 4c 5f   pCmd, TCL_EVAL_
55b0: 44 49 52 45 43 54 29 3b 0a 20 20 54 63 6c 5f 44  DIRECT);.  Tcl_D
55c0: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64  ecrRefCount(pCmd
55d0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 61 74 6f  );.  return (ato
55e0: 69 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52  i(Tcl_GetStringR
55f0: 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29  esult(p->interp)
5600: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ));.}../*.** Thi
5610: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
5620: 6c 65 64 20 74 6f 20 65 76 61 6c 75 61 74 65 20  led to evaluate 
5630: 61 6e 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20  an SQL function 
5640: 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 75  implemented.** u
5650: 73 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74 2e  sing TCL script.
5660: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5670: 74 63 6c 53 71 6c 46 75 6e 63 28 73 71 6c 69 74  tclSqlFunc(sqlit
5680: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
5690: 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73  ext, int argc, s
56a0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 61 72  qlite3_value**ar
56b0: 67 76 29 7b 0a 20 20 53 71 6c 46 75 6e 63 20 2a  gv){.  SqlFunc *
56c0: 70 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72  p = sqlite3_user
56d0: 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29 3b 0a  _data(context);.
56e0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b    Tcl_Obj *pCmd;
56f0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
5700: 72 63 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 3d  rc;..  if( argc=
5710: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  =0 ){.    /* If 
5720: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 61 72 67  there are no arg
5730: 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 66 75  uments to the fu
5740: 6e 63 74 69 6f 6e 2c 20 63 61 6c 6c 20 54 63 6c  nction, call Tcl
5750: 5f 45 76 61 6c 4f 62 6a 45 78 20 6f 6e 20 74 68  _EvalObjEx on th
5760: 65 0a 20 20 20 20 2a 2a 20 73 63 72 69 70 74 20  e.    ** script 
5770: 6f 62 6a 65 63 74 20 64 69 72 65 63 74 6c 79 2e  object directly.
5780: 20 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74 68    This allows th
5790: 65 20 54 43 4c 20 63 6f 6d 70 69 6c 65 72 20 74  e TCL compiler t
57a0: 6f 20 67 65 6e 65 72 61 74 65 0a 20 20 20 20 2a  o generate.    *
57b0: 2a 20 62 79 74 65 63 6f 64 65 20 66 6f 72 20 74  * bytecode for t
57c0: 68 65 20 63 6f 6d 6d 61 6e 64 20 6f 6e 20 74 68  he command on th
57d0: 65 20 66 69 72 73 74 20 69 6e 76 6f 63 61 74 69  e first invocati
57e0: 6f 6e 20 61 6e 64 20 74 68 75 73 20 6d 61 6b 65  on and thus make
57f0: 0a 20 20 20 20 2a 2a 20 73 75 62 73 65 71 75 65  .    ** subseque
5800: 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73 20 6d  nt invocations m
5810: 75 63 68 20 66 61 73 74 65 72 2e 20 2a 2f 0a 20  uch faster. */. 
5820: 20 20 20 70 43 6d 64 20 3d 20 70 2d 3e 70 53 63     pCmd = p->pSc
5830: 72 69 70 74 3b 0a 20 20 20 20 54 63 6c 5f 49 6e  ript;.    Tcl_In
5840: 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29  crRefCount(pCmd)
5850: 3b 0a 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 45  ;.    rc = Tcl_E
5860: 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65  valObjEx(p->inte
5870: 72 70 2c 20 70 43 6d 64 2c 20 30 29 3b 0a 20 20  rp, pCmd, 0);.  
5880: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
5890: 6e 74 28 70 43 6d 64 29 3b 0a 20 20 7d 65 6c 73  nt(pCmd);.  }els
58a0: 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  e{.    /* If the
58b0: 72 65 20 61 72 65 20 61 72 67 75 6d 65 6e 74 73  re are arguments
58c0: 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   to the function
58d0: 2c 20 6d 61 6b 65 20 61 20 73 68 61 6c 6c 6f 77  , make a shallow
58e0: 20 63 6f 70 79 20 6f 66 20 74 68 65 0a 20 20 20   copy of the.   
58f0: 20 2a 2a 20 73 63 72 69 70 74 20 6f 62 6a 65 63   ** script objec
5900: 74 2c 20 6c 61 70 70 65 6e 64 20 74 68 65 20 61  t, lappend the a
5910: 72 67 75 6d 65 6e 74 73 2c 20 74 68 65 6e 20 65  rguments, then e
5920: 76 61 6c 75 61 74 65 20 74 68 65 20 63 6f 70 79  valuate the copy
5930: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
5940: 42 79 20 22 73 68 61 6c 6c 6f 77 22 20 63 6f 70  By "shallow" cop
5950: 79 2c 20 77 65 20 6d 65 61 6e 20 6f 6e 6c 79 20  y, we mean only 
5960: 74 68 65 20 6f 75 74 65 72 20 6c 69 73 74 20 54  the outer list T
5970: 63 6c 5f 4f 62 6a 20 69 73 20 64 75 70 6c 69 63  cl_Obj is duplic
5980: 61 74 65 64 2e 0a 20 20 20 20 2a 2a 20 54 68 65  ated..    ** The
5990: 20 6e 65 77 20 54 63 6c 5f 4f 62 6a 20 63 6f 6e   new Tcl_Obj con
59a0: 74 61 69 6e 73 20 70 6f 69 6e 74 65 72 73 20 74  tains pointers t
59b0: 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6c  o the original l
59c0: 69 73 74 20 65 6c 65 6d 65 6e 74 73 2e 20 0a 20  ist elements. . 
59d0: 20 20 20 2a 2a 20 54 68 61 74 20 77 61 79 2c 20     ** That way, 
59e0: 77 68 65 6e 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  when Tcl_EvalObj
59f0: 76 28 29 20 69 73 20 72 75 6e 20 61 6e 64 20 73  v() is run and s
5a00: 68 69 6d 6d 65 72 73 20 74 68 65 20 66 69 72 73  himmers the firs
5a10: 74 20 65 6c 65 6d 65 6e 74 0a 20 20 20 20 2a 2a  t element.    **
5a20: 20 6f 66 20 74 68 65 20 6c 69 73 74 20 74 6f 20   of the list to 
5a30: 74 63 6c 43 6d 64 4e 61 6d 65 54 79 70 65 2c 20  tclCmdNameType, 
5a40: 74 68 61 74 20 61 6c 74 65 72 6e 61 74 65 20 72  that alternate r
5a50: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 77 69  epresentation wi
5a60: 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 70 72 65  ll.    ** be pre
5a70: 73 65 72 76 65 64 20 61 6e 64 20 72 65 75 73 65  served and reuse
5a80: 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 69 6e  d on the next in
5a90: 76 6f 63 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  vocation..    */
5aa0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61  .    Tcl_Obj **a
5ab0: 41 72 67 3b 0a 20 20 20 20 69 6e 74 20 6e 41 72  Arg;.    int nAr
5ac0: 67 3b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 4c  g;.    if( Tcl_L
5ad0: 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74  istObjGetElement
5ae0: 73 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 2d 3e  s(p->interp, p->
5af0: 70 53 63 72 69 70 74 2c 20 26 6e 41 72 67 2c 20  pScript, &nArg, 
5b00: 26 61 41 72 67 29 20 29 7b 0a 20 20 20 20 20 20  &aArg) ){.      
5b10: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
5b20: 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 54 63  rror(context, Tc
5b30: 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
5b40: 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c 20 2d 31  t(p->interp), -1
5b50: 29 3b 20 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ); .      return
5b60: 3b 0a 20 20 20 20 7d 20 20 20 20 20 0a 20 20 20  ;.    }     .   
5b70: 20 70 43 6d 64 20 3d 20 54 63 6c 5f 4e 65 77 4c   pCmd = Tcl_NewL
5b80: 69 73 74 4f 62 6a 28 6e 41 72 67 2c 20 61 41 72  istObj(nArg, aAr
5b90: 67 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72  g);.    Tcl_Incr
5ba0: 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a  RefCount(pCmd);.
5bb0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61      for(i=0; i<a
5bc0: 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rgc; i++){.     
5bd0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
5be0: 70 49 6e 20 3d 20 61 72 67 76 5b 69 5d 3b 0a 20  pIn = argv[i];. 
5bf0: 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56       Tcl_Obj *pV
5c00: 61 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  al;.            
5c10: 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20 70 56  .      /* Set pV
5c20: 61 6c 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  al to contain th
5c30: 65 20 69 27 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  e i'th column of
5c40: 20 74 68 69 73 20 72 6f 77 2e 20 2a 2f 0a 20 20   this row. */.  
5c50: 20 20 20 20 73 77 69 74 63 68 28 20 73 71 6c 69      switch( sqli
5c60: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70  te3_value_type(p
5c70: 49 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  In) ){.        c
5c80: 61 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a  ase SQLITE_BLOB:
5c90: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74   {.          int
5ca0: 20 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33   bytes = sqlite3
5cb0: 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70 49 6e  _value_bytes(pIn
5cc0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 56 61  );.          pVa
5cd0: 6c 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41  l = Tcl_NewByteA
5ce0: 72 72 61 79 4f 62 6a 28 73 71 6c 69 74 65 33 5f  rrayObj(sqlite3_
5cf0: 76 61 6c 75 65 5f 62 6c 6f 62 28 70 49 6e 29 2c  value_blob(pIn),
5d00: 20 62 79 74 65 73 29 3b 0a 20 20 20 20 20 20 20   bytes);.       
5d10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
5d20: 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65    }.        case
5d30: 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a   SQLITE_INTEGER:
5d40: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   {.          sql
5d50: 69 74 65 5f 69 6e 74 36 34 20 76 20 3d 20 73 71  ite_int64 v = sq
5d60: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36  lite3_value_int6
5d70: 34 28 70 49 6e 29 3b 0a 20 20 20 20 20 20 20 20  4(pIn);.        
5d80: 20 20 69 66 28 20 76 3e 3d 2d 32 31 34 37 34 38    if( v>=-214748
5d90: 33 36 34 37 20 26 26 20 76 3c 3d 32 31 34 37 34  3647 && v<=21474
5da0: 38 33 36 34 37 20 29 7b 0a 20 20 20 20 20 20 20  83647 ){.       
5db0: 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f       pVal = Tcl_
5dc0: 4e 65 77 49 6e 74 4f 62 6a 28 28 69 6e 74 29 76  NewIntObj((int)v
5dd0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
5de0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
5df0: 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 57 69  pVal = Tcl_NewWi
5e00: 64 65 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20  deIntObj(v);.   
5e10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5e20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
5e30: 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65    }.        case
5e40: 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b   SQLITE_FLOAT: {
5e50: 0a 20 20 20 20 20 20 20 20 20 20 64 6f 75 62 6c  .          doubl
5e60: 65 20 72 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  e r = sqlite3_va
5e70: 6c 75 65 5f 64 6f 75 62 6c 65 28 70 49 6e 29 3b  lue_double(pIn);
5e80: 0a 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20  .          pVal 
5e90: 3d 20 54 63 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f  = Tcl_NewDoubleO
5ea0: 62 6a 28 72 29 3b 0a 20 20 20 20 20 20 20 20 20  bj(r);.         
5eb0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
5ec0: 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53  }.        case S
5ed0: 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20  QLITE_NULL: {.  
5ee0: 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54          pVal = T
5ef0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
5f00: 70 2d 3e 70 44 62 2d 3e 7a 4e 75 6c 6c 2c 20 2d  p->pDb->zNull, -
5f10: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  1);.          br
5f20: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
5f30: 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20         default: 
5f40: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
5f50: 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f  bytes = sqlite3_
5f60: 76 61 6c 75 65 5f 62 79 74 65 73 28 70 49 6e 29  value_bytes(pIn)
5f70: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 56 61 6c  ;.          pVal
5f80: 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67   = Tcl_NewString
5f90: 4f 62 6a 28 28 63 68 61 72 20 2a 29 73 71 6c 69  Obj((char *)sqli
5fa0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70  te3_value_text(p
5fb0: 49 6e 29 2c 20 62 79 74 65 73 29 3b 0a 20 20 20  In), bytes);.   
5fc0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5fd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
5fe0: 20 20 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 4c        rc = Tcl_L
5ff0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
6000: 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70  ent(p->interp, p
6010: 43 6d 64 2c 20 70 56 61 6c 29 3b 0a 20 20 20 20  Cmd, pVal);.    
6020: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
6030: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
6040: 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20 20  ount(pCmd);.    
6050: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
6060: 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74  lt_error(context
6070: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52  , Tcl_GetStringR
6080: 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29  esult(p->interp)
6090: 2c 20 2d 31 29 3b 20 0a 20 20 20 20 20 20 20 20  , -1); .        
60a0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
60b0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 70      }.    if( !p
60c0: 2d 3e 75 73 65 45 76 61 6c 4f 62 6a 76 20 29 7b  ->useEvalObjv ){
60d0: 0a 20 20 20 20 20 20 2f 2a 20 54 63 6c 5f 45 76  .      /* Tcl_Ev
60e0: 61 6c 4f 62 6a 45 78 28 29 20 77 69 6c 6c 20 61  alObjEx() will a
60f0: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 61 6c  utomatically cal
6100: 6c 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29  l Tcl_EvalObjv()
6110: 20 69 66 20 70 43 6d 64 0a 20 20 20 20 20 20 2a   if pCmd.      *
6120: 2a 20 69 73 20 61 20 6c 69 73 74 20 77 69 74 68  * is a list with
6130: 6f 75 74 20 61 20 73 74 72 69 6e 67 20 72 65 70  out a string rep
6140: 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20 20 54 6f  resentation.  To
6150: 20 70 72 65 76 65 6e 74 20 74 68 69 73 20 66 72   prevent this fr
6160: 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 68 61 70 70  om.      ** happ
6170: 65 6e 69 6e 67 2c 20 6d 61 6b 65 20 73 75 72 65  ening, make sure
6180: 20 70 43 6d 64 20 68 61 73 20 61 20 76 61 6c 69   pCmd has a vali
6190: 64 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65  d string represe
61a0: 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ntation */.     
61b0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 70   Tcl_GetString(p
61c0: 43 6d 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Cmd);.    }.    
61d0: 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  rc = Tcl_EvalObj
61e0: 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43  Ex(p->interp, pC
61f0: 6d 64 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52  md, TCL_EVAL_DIR
6200: 45 43 54 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65  ECT);.    Tcl_De
6210: 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29  crRefCount(pCmd)
6220: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 20  ;.  }..  if( rc 
6230: 26 26 20 72 63 21 3d 54 43 4c 5f 52 45 54 55 52  && rc!=TCL_RETUR
6240: 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  N ){.    sqlite3
6250: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f  _result_error(co
6260: 6e 74 65 78 74 2c 20 54 63 6c 5f 47 65 74 53 74  ntext, Tcl_GetSt
6270: 72 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e  ringResult(p->in
6280: 74 65 72 70 29 2c 20 2d 31 29 3b 20 0a 20 20 7d  terp), -1); .  }
6290: 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 4f 62  else{.    Tcl_Ob
62a0: 6a 20 2a 70 56 61 72 20 3d 20 54 63 6c 5f 47 65  j *pVar = Tcl_Ge
62b0: 74 4f 62 6a 52 65 73 75 6c 74 28 70 2d 3e 69 6e  tObjResult(p->in
62c0: 74 65 72 70 29 3b 0a 20 20 20 20 69 6e 74 20 6e  terp);.    int n
62d0: 3b 0a 20 20 20 20 75 38 20 2a 64 61 74 61 3b 0a  ;.    u8 *data;.
62e0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
62f0: 7a 54 79 70 65 20 3d 20 28 70 56 61 72 2d 3e 74  zType = (pVar->t
6300: 79 70 65 50 74 72 20 3f 20 70 56 61 72 2d 3e 74  ypePtr ? pVar->t
6310: 79 70 65 50 74 72 2d 3e 6e 61 6d 65 20 3a 20 22  ypePtr->name : "
6320: 22 29 3b 0a 20 20 20 20 63 68 61 72 20 63 20 3d  ");.    char c =
6330: 20 7a 54 79 70 65 5b 30 5d 3b 0a 20 20 20 20 69   zType[0];.    i
6340: 66 28 20 63 3d 3d 27 62 27 20 26 26 20 73 74 72  f( c=='b' && str
6350: 63 6d 70 28 7a 54 79 70 65 2c 22 62 79 74 65 61  cmp(zType,"bytea
6360: 72 72 61 79 22 29 3d 3d 30 20 26 26 20 70 56 61  rray")==0 && pVa
6370: 72 2d 3e 62 79 74 65 73 3d 3d 30 20 29 7b 0a 20  r->bytes==0 ){. 
6380: 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 72 65 74       /* Only ret
6390: 75 72 6e 20 61 20 42 4c 4f 42 20 74 79 70 65 20  urn a BLOB type 
63a0: 69 66 20 74 68 65 20 54 63 6c 20 76 61 72 69 61  if the Tcl varia
63b0: 62 6c 65 20 69 73 20 61 20 62 79 74 65 61 72 72  ble is a bytearr
63c0: 61 79 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  ay and.      ** 
63d0: 68 61 73 20 6e 6f 20 73 74 72 69 6e 67 20 72 65  has no string re
63e0: 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20 2a 2f  presentation. */
63f0: 0a 20 20 20 20 20 20 64 61 74 61 20 3d 20 54 63  .      data = Tc
6400: 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72  l_GetByteArrayFr
6410: 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b  omObj(pVar, &n);
6420: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
6430: 65 73 75 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65  esult_blob(conte
6440: 78 74 2c 20 64 61 74 61 2c 20 6e 2c 20 53 51 4c  xt, data, n, SQL
6450: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
6460: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
6470: 3d 27 62 27 20 26 26 20 73 74 72 63 6d 70 28 7a  ='b' && strcmp(z
6480: 54 79 70 65 2c 22 62 6f 6f 6c 65 61 6e 22 29 3d  Type,"boolean")=
6490: 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =0 ){.      Tcl_
64a0: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 30 2c  GetIntFromObj(0,
64b0: 20 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20   pVar, &n);.    
64c0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
64d0: 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 6e 29  _int(context, n)
64e0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
64f0: 63 3d 3d 27 64 27 20 26 26 20 73 74 72 63 6d 70  c=='d' && strcmp
6500: 28 7a 54 79 70 65 2c 22 64 6f 75 62 6c 65 22 29  (zType,"double")
6510: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 6f 75  ==0 ){.      dou
6520: 62 6c 65 20 72 3b 0a 20 20 20 20 20 20 54 63 6c  ble r;.      Tcl
6530: 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62  _GetDoubleFromOb
6540: 6a 28 30 2c 20 70 56 61 72 2c 20 26 72 29 3b 0a  j(0, pVar, &r);.
6550: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
6560: 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74  sult_double(cont
6570: 65 78 74 2c 20 72 29 3b 0a 20 20 20 20 7d 65 6c  ext, r);.    }el
6580: 73 65 20 69 66 28 20 28 63 3d 3d 27 77 27 20 26  se if( (c=='w' &
6590: 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22  & strcmp(zType,"
65a0: 77 69 64 65 49 6e 74 22 29 3d 3d 30 29 20 7c 7c  wideInt")==0) ||
65b0: 0a 20 20 20 20 20 20 20 20 20 20 28 63 3d 3d 27  .          (c=='
65c0: 69 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79  i' && strcmp(zTy
65d0: 70 65 2c 22 69 6e 74 22 29 3d 3d 30 29 20 29 7b  pe,"int")==0) ){
65e0: 0a 20 20 20 20 20 20 54 63 6c 5f 57 69 64 65 49  .      Tcl_WideI
65f0: 6e 74 20 76 3b 0a 20 20 20 20 20 20 54 63 6c 5f  nt v;.      Tcl_
6600: 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62  GetWideIntFromOb
6610: 6a 28 30 2c 20 70 56 61 72 2c 20 26 76 29 3b 0a  j(0, pVar, &v);.
6620: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
6630: 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65  sult_int64(conte
6640: 78 74 2c 20 76 29 3b 0a 20 20 20 20 7d 65 6c 73  xt, v);.    }els
6650: 65 7b 0a 20 20 20 20 20 20 64 61 74 61 20 3d 20  e{.      data = 
6660: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
6670: 29 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72  )Tcl_GetStringFr
6680: 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b  omObj(pVar, &n);
6690: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
66a0: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
66b0: 78 74 2c 20 28 63 68 61 72 20 2a 29 64 61 74 61  xt, (char *)data
66c0: 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  , n, SQLITE_TRAN
66d0: 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d 0a 20 20  SIENT);.    }.  
66e0: 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.}..#ifndef SQL
66f0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
6700: 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 54 68 69  ZATION./*.** Thi
6710: 73 20 69 73 20 74 68 65 20 61 75 74 68 65 6e 74  s is the authent
6720: 69 63 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  ication function
6730: 2e 20 20 49 74 20 61 70 70 65 6e 64 73 20 74 68  .  It appends th
6740: 65 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e  e authentication
6750: 0a 2a 2a 20 74 79 70 65 20 63 6f 64 65 20 61 6e  .** type code an
6760: 64 20 74 68 65 20 74 77 6f 20 61 72 67 75 6d 65  d the two argume
6770: 6e 74 73 20 74 6f 20 7a 43 6d 64 5b 5d 20 74 68  nts to zCmd[] th
6780: 65 6e 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 72  en invokes the r
6790: 65 73 75 6c 74 0a 2a 2a 20 6f 6e 20 74 68 65 20  esult.** on the 
67a0: 69 6e 74 65 72 70 72 65 74 65 72 2e 20 20 54 68  interpreter.  Th
67b0: 65 20 72 65 70 6c 79 20 69 73 20 65 78 61 6d 69  e reply is exami
67c0: 6e 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ned to determine
67d0: 20 69 66 20 74 68 65 0a 2a 2a 20 61 75 74 68 65   if the.** authe
67e0: 6e 74 69 63 61 74 69 6f 6e 20 66 61 69 6c 73 20  ntication fails 
67f0: 6f 72 20 73 75 63 63 65 65 64 73 2e 0a 2a 2f 0a  or succeeds..*/.
6800: 73 74 61 74 69 63 20 69 6e 74 20 61 75 74 68 5f  static int auth_
6810: 63 61 6c 6c 62 61 63 6b 28 0a 20 20 76 6f 69 64  callback(.  void
6820: 20 2a 70 41 72 67 2c 0a 20 20 69 6e 74 20 63 6f   *pArg,.  int co
6830: 64 65 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  de,.  const char
6840: 20 2a 7a 41 72 67 31 2c 0a 20 20 63 6f 6e 73 74   *zArg1,.  const
6850: 20 63 68 61 72 20 2a 7a 41 72 67 32 2c 0a 20 20   char *zArg2,.  
6860: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
6870: 33 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  3,.  const char 
6880: 2a 7a 41 72 67 34 0a 23 69 66 64 65 66 20 53 51  *zArg4.#ifdef SQ
6890: 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e  LITE_USER_AUTHEN
68a0: 54 49 43 41 54 49 4f 4e 0a 20 20 2c 63 6f 6e 73  TICATION.  ,cons
68b0: 74 20 63 68 61 72 20 2a 7a 41 72 67 35 0a 23 65  t char *zArg5.#e
68c0: 6e 64 69 66 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  ndif.){.  const 
68d0: 63 68 61 72 20 2a 7a 43 6f 64 65 3b 0a 20 20 54  char *zCode;.  T
68e0: 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a  cl_DString str;.
68f0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73    int rc;.  cons
6900: 74 20 63 68 61 72 20 2a 7a 52 65 70 6c 79 3b 0a  t char *zReply;.
6910: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
6920: 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 70 41 72  = (SqliteDb*)pAr
6930: 67 3b 0a 20 20 69 66 28 20 70 44 62 2d 3e 64 69  g;.  if( pDb->di
6940: 73 61 62 6c 65 41 75 74 68 20 29 20 72 65 74 75  sableAuth ) retu
6950: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
6960: 20 73 77 69 74 63 68 28 20 63 6f 64 65 20 29 7b   switch( code ){
6970: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
6980: 5f 43 4f 50 59 20 20 20 20 20 20 20 20 20 20 20  _COPY           
6990: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
69a0: 54 45 5f 43 4f 50 59 22 3b 20 62 72 65 61 6b 3b  TE_COPY"; break;
69b0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
69c0: 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 20 20 20  _CREATE_INDEX   
69d0: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
69e0: 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 22  TE_CREATE_INDEX"
69f0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
6a00: 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  e SQLITE_CREATE_
6a10: 54 41 42 4c 45 20 20 20 20 20 20 3a 20 7a 43 6f  TABLE      : zCo
6a20: 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54  de="SQLITE_CREAT
6a30: 45 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b  E_TABLE"; break;
6a40: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
6a50: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44  _CREATE_TEMP_IND
6a60: 45 58 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49  EX : zCode="SQLI
6a70: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49  TE_CREATE_TEMP_I
6a80: 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20  NDEX"; break;.  
6a90: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52    case SQLITE_CR
6aa0: 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 20  EATE_TEMP_TABLE 
6ab0: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
6ac0: 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c  CREATE_TEMP_TABL
6ad0: 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  E"; break;.    c
6ae0: 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54  ase SQLITE_CREAT
6af0: 45 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 3a 20  E_TEMP_TRIGGER: 
6b00: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52  zCode="SQLITE_CR
6b10: 45 41 54 45 5f 54 45 4d 50 5f 54 52 49 47 47 45  EATE_TEMP_TRIGGE
6b20: 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  R"; break;.    c
6b30: 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54  ase SQLITE_CREAT
6b40: 45 5f 54 45 4d 50 5f 56 49 45 57 20 20 3a 20 7a  E_TEMP_VIEW  : z
6b50: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45  Code="SQLITE_CRE
6b60: 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 22 3b 20  ATE_TEMP_VIEW"; 
6b70: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
6b80: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 52  SQLITE_CREATE_TR
6b90: 49 47 47 45 52 20 20 20 20 3a 20 7a 43 6f 64 65  IGGER    : zCode
6ba0: 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  ="SQLITE_CREATE_
6bb0: 54 52 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b  TRIGGER"; break;
6bc0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
6bd0: 5f 43 52 45 41 54 45 5f 56 49 45 57 20 20 20 20  _CREATE_VIEW    
6be0: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
6bf0: 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57 22 3b  TE_CREATE_VIEW";
6c00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
6c10: 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 20 20   SQLITE_DELETE  
6c20: 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64            : zCod
6c30: 65 3d 22 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  e="SQLITE_DELETE
6c40: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
6c50: 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49  se SQLITE_DROP_I
6c60: 4e 44 45 58 20 20 20 20 20 20 20 20 3a 20 7a 43  NDEX        : zC
6c70: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50  ode="SQLITE_DROP
6c80: 5f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a  _INDEX"; break;.
6c90: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
6ca0: 44 52 4f 50 5f 54 41 42 4c 45 20 20 20 20 20 20  DROP_TABLE      
6cb0: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
6cc0: 45 5f 44 52 4f 50 5f 54 41 42 4c 45 22 3b 20 62  E_DROP_TABLE"; b
6cd0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
6ce0: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
6cf0: 49 4e 44 45 58 20 20 20 3a 20 7a 43 6f 64 65 3d  INDEX   : zCode=
6d00: 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d  "SQLITE_DROP_TEM
6d10: 50 5f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b  P_INDEX"; break;
6d20: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
6d30: 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45  _DROP_TEMP_TABLE
6d40: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
6d50: 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42  TE_DROP_TEMP_TAB
6d60: 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  LE"; break;.    
6d70: 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50  case SQLITE_DROP
6d80: 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 20 3a 20  _TEMP_TRIGGER : 
6d90: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52  zCode="SQLITE_DR
6da0: 4f 50 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 22  OP_TEMP_TRIGGER"
6db0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
6dc0: 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  e SQLITE_DROP_TE
6dd0: 4d 50 5f 56 49 45 57 20 20 20 20 3a 20 7a 43 6f  MP_VIEW    : zCo
6de0: 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f  de="SQLITE_DROP_
6df0: 54 45 4d 50 5f 56 49 45 57 22 3b 20 62 72 65 61  TEMP_VIEW"; brea
6e00: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
6e10: 54 45 5f 44 52 4f 50 5f 54 52 49 47 47 45 52 20  TE_DROP_TRIGGER 
6e20: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
6e30: 4c 49 54 45 5f 44 52 4f 50 5f 54 52 49 47 47 45  LITE_DROP_TRIGGE
6e40: 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  R"; break;.    c
6e50: 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  ase SQLITE_DROP_
6e60: 56 49 45 57 20 20 20 20 20 20 20 20 20 3a 20 7a  VIEW         : z
6e70: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f  Code="SQLITE_DRO
6e80: 50 5f 56 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a  P_VIEW"; break;.
6e90: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
6ea0: 49 4e 53 45 52 54 20 20 20 20 20 20 20 20 20 20  INSERT          
6eb0: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
6ec0: 45 5f 49 4e 53 45 52 54 22 3b 20 62 72 65 61 6b  E_INSERT"; break
6ed0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
6ee0: 45 5f 50 52 41 47 4d 41 20 20 20 20 20 20 20 20  E_PRAGMA        
6ef0: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
6f00: 49 54 45 5f 50 52 41 47 4d 41 22 3b 20 62 72 65  ITE_PRAGMA"; bre
6f10: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
6f20: 49 54 45 5f 52 45 41 44 20 20 20 20 20 20 20 20  ITE_READ        
6f30: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
6f40: 51 4c 49 54 45 5f 52 45 41 44 22 3b 20 62 72 65  QLITE_READ"; bre
6f50: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
6f60: 49 54 45 5f 53 45 4c 45 43 54 20 20 20 20 20 20  ITE_SELECT      
6f70: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
6f80: 51 4c 49 54 45 5f 53 45 4c 45 43 54 22 3b 20 62  QLITE_SELECT"; b
6f90: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
6fa0: 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f  QLITE_TRANSACTIO
6fb0: 4e 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d  N       : zCode=
6fc0: 22 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54  "SQLITE_TRANSACT
6fd0: 49 4f 4e 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ION"; break;.   
6fe0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 55 50 44   case SQLITE_UPD
6ff0: 41 54 45 20 20 20 20 20 20 20 20 20 20 20 20 3a  ATE            :
7000: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 55   zCode="SQLITE_U
7010: 50 44 41 54 45 22 3b 20 62 72 65 61 6b 3b 0a 20  PDATE"; break;. 
7020: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
7030: 54 54 41 43 48 20 20 20 20 20 20 20 20 20 20 20  TTACH           
7040: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
7050: 5f 41 54 54 41 43 48 22 3b 20 62 72 65 61 6b 3b  _ATTACH"; break;
7060: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
7070: 5f 44 45 54 41 43 48 20 20 20 20 20 20 20 20 20  _DETACH         
7080: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
7090: 54 45 5f 44 45 54 41 43 48 22 3b 20 62 72 65 61  TE_DETACH"; brea
70a0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
70b0: 54 45 5f 41 4c 54 45 52 5f 54 41 42 4c 45 20 20  TE_ALTER_TABLE  
70c0: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
70d0: 4c 49 54 45 5f 41 4c 54 45 52 5f 54 41 42 4c 45  LITE_ALTER_TABLE
70e0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
70f0: 73 65 20 53 51 4c 49 54 45 5f 52 45 49 4e 44 45  se SQLITE_REINDE
7100: 58 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43  X           : zC
7110: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 52 45 49 4e  ode="SQLITE_REIN
7120: 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  DEX"; break;.   
7130: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 4e 41   case SQLITE_ANA
7140: 4c 59 5a 45 20 20 20 20 20 20 20 20 20 20 20 3a  LYZE           :
7150: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 41   zCode="SQLITE_A
7160: 4e 41 4c 59 5a 45 22 3b 20 62 72 65 61 6b 3b 0a  NALYZE"; break;.
7170: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
7180: 43 52 45 41 54 45 5f 56 54 41 42 4c 45 20 20 20  CREATE_VTABLE   
7190: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
71a0: 45 5f 43 52 45 41 54 45 5f 56 54 41 42 4c 45 22  E_CREATE_VTABLE"
71b0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
71c0: 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54  e SQLITE_DROP_VT
71d0: 41 42 4c 45 20 20 20 20 20 20 20 3a 20 7a 43 6f  ABLE       : zCo
71e0: 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f  de="SQLITE_DROP_
71f0: 56 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a  VTABLE"; break;.
7200: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
7210: 46 55 4e 43 54 49 4f 4e 20 20 20 20 20 20 20 20  FUNCTION        
7220: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
7230: 45 5f 46 55 4e 43 54 49 4f 4e 22 3b 20 62 72 65  E_FUNCTION"; bre
7240: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
7250: 49 54 45 5f 53 41 56 45 50 4f 49 4e 54 20 20 20  ITE_SAVEPOINT   
7260: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
7270: 51 4c 49 54 45 5f 53 41 56 45 50 4f 49 4e 54 22  QLITE_SAVEPOINT"
7280: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
7290: 65 20 53 51 4c 49 54 45 5f 52 45 43 55 52 53 49  e SQLITE_RECURSI
72a0: 56 45 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f  VE         : zCo
72b0: 64 65 3d 22 53 51 4c 49 54 45 5f 52 45 43 55 52  de="SQLITE_RECUR
72c0: 53 49 56 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20  SIVE"; break;.  
72d0: 20 20 64 65 66 61 75 6c 74 20 20 20 20 20 20 20    default       
72e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72f0: 3a 20 7a 43 6f 64 65 3d 22 3f 3f 3f 3f 22 3b 20  : zCode="????"; 
7300: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 54 63 6c  break;.  }.  Tcl
7310: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74  _DStringInit(&st
7320: 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  r);.  Tcl_DStrin
7330: 67 41 70 70 65 6e 64 28 26 73 74 72 2c 20 70 44  gAppend(&str, pD
7340: 62 2d 3e 7a 41 75 74 68 2c 20 2d 31 29 3b 0a 20  b->zAuth, -1);. 
7350: 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65   Tcl_DStringAppe
7360: 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20  ndElement(&str, 
7370: 7a 43 6f 64 65 29 3b 0a 20 20 54 63 6c 5f 44 53  zCode);.  Tcl_DS
7380: 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65  tringAppendEleme
7390: 6e 74 28 26 73 74 72 2c 20 7a 41 72 67 31 20 3f  nt(&str, zArg1 ?
73a0: 20 7a 41 72 67 31 20 3a 20 22 22 29 3b 0a 20 20   zArg1 : "");.  
73b0: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
73c0: 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a  dElement(&str, z
73d0: 41 72 67 32 20 3f 20 7a 41 72 67 32 20 3a 20 22  Arg2 ? zArg2 : "
73e0: 22 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  ");.  Tcl_DStrin
73f0: 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26  gAppendElement(&
7400: 73 74 72 2c 20 7a 41 72 67 33 20 3f 20 7a 41 72  str, zArg3 ? zAr
7410: 67 33 20 3a 20 22 22 29 3b 0a 20 20 54 63 6c 5f  g3 : "");.  Tcl_
7420: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65  DStringAppendEle
7430: 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41 72 67 34  ment(&str, zArg4
7440: 20 3f 20 7a 41 72 67 34 20 3a 20 22 22 29 3b 0a   ? zArg4 : "");.
7450: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 53  #ifdef SQLITE_US
7460: 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f  ER_AUTHENTICATIO
7470: 4e 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41  N.  Tcl_DStringA
7480: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74  ppendElement(&st
7490: 72 2c 20 7a 41 72 67 35 20 3f 20 7a 41 72 67 35  r, zArg5 ? zArg5
74a0: 20 3a 20 22 22 29 3b 0a 23 65 6e 64 69 66 20 20   : "");.#endif  
74b0: 0a 20 20 72 63 20 3d 20 54 63 6c 5f 47 6c 6f 62  .  rc = Tcl_Glob
74c0: 61 6c 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65  alEval(pDb->inte
74d0: 72 70 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56  rp, Tcl_DStringV
74e0: 61 6c 75 65 28 26 73 74 72 29 29 3b 0a 20 20 54  alue(&str));.  T
74f0: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
7500: 73 74 72 29 3b 0a 20 20 7a 52 65 70 6c 79 20 3d  str);.  zReply =
7510: 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 3f 20 54 63   rc==TCL_OK ? Tc
7520: 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
7530: 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 20 3a  t(pDb->interp) :
7540: 20 22 53 51 4c 49 54 45 5f 44 45 4e 59 22 3b 0a   "SQLITE_DENY";.
7550: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 52 65    if( strcmp(zRe
7560: 70 6c 79 2c 22 53 51 4c 49 54 45 5f 4f 4b 22 29  ply,"SQLITE_OK")
7570: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
7580: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
7590: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 52  se if( strcmp(zR
75a0: 65 70 6c 79 2c 22 53 51 4c 49 54 45 5f 44 45 4e  eply,"SQLITE_DEN
75b0: 59 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  Y")==0 ){.    rc
75c0: 20 3d 20 53 51 4c 49 54 45 5f 44 45 4e 59 3b 0a   = SQLITE_DENY;.
75d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
75e0: 6d 70 28 7a 52 65 70 6c 79 2c 22 53 51 4c 49 54  mp(zReply,"SQLIT
75f0: 45 5f 49 47 4e 4f 52 45 22 29 3d 3d 30 20 29 7b  E_IGNORE")==0 ){
7600: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
7610: 5f 49 47 4e 4f 52 45 3b 0a 20 20 7d 65 6c 73 65  _IGNORE;.  }else
7620: 7b 0a 20 20 20 20 72 63 20 3d 20 39 39 39 3b 0a  {.    rc = 999;.
7630: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
7640: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
7650: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
7660: 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ZATION */../*.**
7670: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
7680: 61 64 73 20 61 20 6c 69 6e 65 20 6f 66 20 74 65  ads a line of te
7690: 78 74 20 66 72 6f 6d 20 46 49 4c 45 20 69 6e 2c  xt from FILE in,
76a0: 20 73 74 6f 72 65 73 0a 2a 2a 20 74 68 65 20 74   stores.** the t
76b0: 65 78 74 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62  ext in memory ob
76c0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
76d0: 6f 63 28 29 20 61 6e 64 20 72 65 74 75 72 6e 73  oc() and returns
76e0: 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
76f0: 20 74 68 65 20 74 65 78 74 2e 20 20 4e 55 4c 4c   the text.  NULL
7700: 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 74 20   is returned at 
7710: 65 6e 64 20 6f 66 20 66 69 6c 65 2c 20 6f 72 20  end of file, or 
7720: 69 66 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 66  if malloc().** f
7730: 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ails..**.** The 
7740: 69 6e 74 65 72 66 61 63 65 20 69 73 20 6c 69 6b  interface is lik
7750: 65 20 22 72 65 61 64 6c 69 6e 65 22 20 62 75 74  e "readline" but
7760: 20 6e 6f 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65   no command-line
7770: 20 65 64 69 74 69 6e 67 0a 2a 2a 20 69 73 20 64   editing.** is d
7780: 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 63 6f 70 69 65  one..**.** copie
7790: 64 20 66 72 6f 6d 20 73 68 65 6c 6c 2e 63 20 66  d from shell.c f
77a0: 72 6f 6d 20 27 2e 69 6d 70 6f 72 74 27 20 63 6f  rom '.import' co
77b0: 6d 6d 61 6e 64 0a 2a 2f 0a 73 74 61 74 69 63 20  mmand.*/.static 
77c0: 63 68 61 72 20 2a 6c 6f 63 61 6c 5f 67 65 74 6c  char *local_getl
77d0: 69 6e 65 28 63 68 61 72 20 2a 7a 50 72 6f 6d 70  ine(char *zPromp
77e0: 74 2c 20 46 49 4c 45 20 2a 69 6e 29 7b 0a 20 20  t, FILE *in){.  
77f0: 63 68 61 72 20 2a 7a 4c 69 6e 65 3b 0a 20 20 69  char *zLine;.  i
7800: 6e 74 20 6e 4c 69 6e 65 3b 0a 20 20 69 6e 74 20  nt nLine;.  int 
7810: 6e 3b 0a 0a 20 20 6e 4c 69 6e 65 20 3d 20 31 30  n;..  nLine = 10
7820: 30 3b 0a 20 20 7a 4c 69 6e 65 20 3d 20 6d 61 6c  0;.  zLine = mal
7830: 6c 6f 63 28 20 6e 4c 69 6e 65 20 29 3b 0a 20 20  loc( nLine );.  
7840: 69 66 28 20 7a 4c 69 6e 65 3d 3d 30 20 29 20 72  if( zLine==0 ) r
7850: 65 74 75 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 30  eturn 0;.  n = 0
7860: 3b 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  ;.  while( 1 ){.
7870: 20 20 20 20 69 66 28 20 6e 2b 31 30 30 3e 6e 4c      if( n+100>nL
7880: 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 6e 4c 69  ine ){.      nLi
7890: 6e 65 20 3d 20 6e 4c 69 6e 65 2a 32 20 2b 20 31  ne = nLine*2 + 1
78a0: 30 30 3b 0a 20 20 20 20 20 20 7a 4c 69 6e 65 20  00;.      zLine 
78b0: 3d 20 72 65 61 6c 6c 6f 63 28 7a 4c 69 6e 65 2c  = realloc(zLine,
78c0: 20 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 69   nLine);.      i
78d0: 66 28 20 7a 4c 69 6e 65 3d 3d 30 20 29 20 72 65  f( zLine==0 ) re
78e0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
78f0: 20 20 69 66 28 20 66 67 65 74 73 28 26 7a 4c 69    if( fgets(&zLi
7900: 6e 65 5b 6e 5d 2c 20 6e 4c 69 6e 65 20 2d 20 6e  ne[n], nLine - n
7910: 2c 20 69 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , in)==0 ){.    
7920: 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20    if( n==0 ){.  
7930: 20 20 20 20 20 20 66 72 65 65 28 7a 4c 69 6e 65        free(zLine
7940: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
7950: 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
7960: 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b     zLine[n] = 0;
7970: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7980: 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 7a    }.    while( z
7990: 4c 69 6e 65 5b 6e 5d 20 29 7b 20 6e 2b 2b 3b 20  Line[n] ){ n++; 
79a0: 7d 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26  }.    if( n>0 &&
79b0: 20 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 6e   zLine[n-1]=='\n
79c0: 27 20 29 7b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a  ' ){.      n--;.
79d0: 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d        zLine[n] =
79e0: 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
79f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 4c 69  .    }.  }.  zLi
7a00: 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28 20 7a 4c  ne = realloc( zL
7a10: 69 6e 65 2c 20 6e 2b 31 20 29 3b 0a 20 20 72 65  ine, n+1 );.  re
7a20: 74 75 72 6e 20 7a 4c 69 6e 65 3b 0a 7d 0a 0a 0a  turn zLine;.}...
7a30: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
7a40: 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20 74  ion is part of t
7a50: 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
7a60: 6e 20 6f 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64  n of the command
7a70: 3a 0a 2a 2a 0a 2a 2a 20 20 20 24 64 62 20 74 72  :.**.**   $db tr
7a80: 61 6e 73 61 63 74 69 6f 6e 20 5b 2d 64 65 66 65  ansaction [-defe
7a90: 72 72 65 64 7c 2d 69 6d 6d 65 64 69 61 74 65 7c  rred|-immediate|
7aa0: 2d 65 78 63 6c 75 73 69 76 65 5d 20 53 43 52 49  -exclusive] SCRI
7ab0: 50 54 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69  PT.**.** It is i
7ac0: 6e 76 6f 6b 65 64 20 61 66 74 65 72 20 65 76 61  nvoked after eva
7ad0: 6c 75 61 74 69 6e 67 20 74 68 65 20 73 63 72 69  luating the scri
7ae0: 70 74 20 53 43 52 49 50 54 20 74 6f 20 63 6f 6d  pt SCRIPT to com
7af0: 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 0a  mit or rollback.
7b00: 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ** the transacti
7b10: 6f 6e 20 6f 72 20 73 61 76 65 70 6f 69 6e 74 20  on or savepoint 
7b20: 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 5b 74  opened by the [t
7b30: 72 61 6e 73 61 63 74 69 6f 6e 5d 20 63 6f 6d 6d  ransaction] comm
7b40: 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  and..*/.static i
7b50: 6e 74 20 44 62 54 72 61 6e 73 50 6f 73 74 43 6d  nt DbTransPostCm
7b60: 64 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  d(.  ClientData 
7b70: 64 61 74 61 5b 5d 2c 20 20 20 20 20 20 20 20 20  data[],         
7b80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 61 74            /* dat
7b90: 61 5b 30 5d 20 69 73 20 74 68 65 20 53 71 6c 69  a[0] is the Sqli
7ba0: 74 65 33 44 62 2a 20 66 6f 72 20 24 64 62 20 2a  te3Db* for $db *
7bb0: 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
7bc0: 69 6e 74 65 72 70 2c 20 20 20 20 20 20 20 20 20  interp,         
7bd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 63 6c 20           /* Tcl 
7be0: 69 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 20  interpreter */. 
7bf0: 20 69 6e 74 20 72 65 73 75 6c 74 20 20 20 20 20   int result     
7c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c10: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
7c20: 6f 66 20 65 76 61 6c 75 61 74 69 6e 67 20 53 43  of evaluating SC
7c30: 52 49 50 54 20 2a 2f 0a 29 7b 0a 20 20 73 74 61  RIPT */.){.  sta
7c40: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
7c50: 63 6f 6e 73 74 20 61 7a 45 6e 64 5b 5d 20 3d 20  const azEnd[] = 
7c60: 7b 0a 20 20 20 20 22 52 45 4c 45 41 53 45 20 5f  {.    "RELEASE _
7c70: 74 63 6c 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22  tcl_transaction"
7c80: 2c 20 20 20 20 20 20 20 20 2f 2a 20 72 63 3d 3d  ,        /* rc==
7c90: 54 43 4c 5f 45 52 52 4f 52 2c 20 6e 54 72 61 6e  TCL_ERROR, nTran
7ca0: 73 61 63 74 69 6f 6e 21 3d 30 20 2a 2f 0a 20 20  saction!=0 */.  
7cb0: 20 20 22 43 4f 4d 4d 49 54 22 2c 20 20 20 20 20    "COMMIT",     
7cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7cd0: 20 20 20 20 20 2f 2a 20 72 63 21 3d 54 43 4c 5f       /* rc!=TCL_
7ce0: 45 52 52 4f 52 2c 20 6e 54 72 61 6e 73 61 63 74  ERROR, nTransact
7cf0: 69 6f 6e 3d 3d 30 20 2a 2f 0a 20 20 20 20 22 52  ion==0 */.    "R
7d00: 4f 4c 4c 42 41 43 4b 20 54 4f 20 5f 74 63 6c 5f  OLLBACK TO _tcl_
7d10: 74 72 61 6e 73 61 63 74 69 6f 6e 20 3b 20 52 45  transaction ; RE
7d20: 4c 45 41 53 45 20 5f 74 63 6c 5f 74 72 61 6e 73  LEASE _tcl_trans
7d30: 61 63 74 69 6f 6e 22 2c 0a 20 20 20 20 22 52 4f  action",.    "RO
7d40: 4c 4c 42 41 43 4b 22 20 20 20 20 20 20 20 20 20  LLBACK"         
7d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d60: 2f 2a 20 72 63 3d 3d 54 43 4c 5f 45 52 52 4f 52  /* rc==TCL_ERROR
7d70: 2c 20 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  , nTransaction==
7d80: 30 20 2a 2f 0a 20 20 7d 3b 0a 20 20 53 71 6c 69  0 */.  };.  Sqli
7d90: 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c  teDb *pDb = (Sql
7da0: 69 74 65 44 62 2a 29 64 61 74 61 5b 30 5d 3b 0a  iteDb*)data[0];.
7db0: 20 20 69 6e 74 20 72 63 20 3d 20 72 65 73 75 6c    int rc = resul
7dc0: 74 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  t;.  const char 
7dd0: 2a 7a 45 6e 64 3b 0a 0a 20 20 70 44 62 2d 3e 6e  *zEnd;..  pDb->n
7de0: 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20  Transaction--;. 
7df0: 20 7a 45 6e 64 20 3d 20 61 7a 45 6e 64 5b 28 72   zEnd = azEnd[(r
7e00: 63 3d 3d 54 43 4c 5f 45 52 52 4f 52 29 2a 32 20  c==TCL_ERROR)*2 
7e10: 2b 20 28 70 44 62 2d 3e 6e 54 72 61 6e 73 61 63  + (pDb->nTransac
7e20: 74 69 6f 6e 3d 3d 30 29 5d 3b 0a 0a 20 20 70 44  tion==0)];..  pD
7e30: 62 2d 3e 64 69 73 61 62 6c 65 41 75 74 68 2b 2b  b->disableAuth++
7e40: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  ;.  if( sqlite3_
7e50: 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 7a 45  exec(pDb->db, zE
7e60: 6e 64 2c 20 30 2c 20 30 2c 20 30 29 20 29 7b 0a  nd, 0, 0, 0) ){.
7e70: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73        /* This is
7e80: 20 61 20 74 72 69 63 6b 79 20 73 63 65 6e 61 72   a tricky scenar
7e90: 69 6f 20 74 6f 20 68 61 6e 64 6c 65 2e 20 54 68  io to handle. Th
7ea0: 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 63 61  e most likely ca
7eb0: 75 73 65 20 6f 66 20 61 6e 0a 20 20 20 20 20 20  use of an.      
7ec0: 2a 2a 20 65 72 72 6f 72 20 69 73 20 74 68 61 74  ** error is that
7ed0: 20 74 68 65 20 65 78 65 63 28 29 20 61 62 6f 76   the exec() abov
7ee0: 65 20 77 61 73 20 61 6e 20 61 74 74 65 6d 70 74  e was an attempt
7ef0: 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 0a   to commit the .
7f00: 20 20 20 20 20 20 2a 2a 20 74 6f 70 2d 6c 65 76        ** top-lev
7f10: 65 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  el transaction t
7f20: 68 61 74 20 72 65 74 75 72 6e 65 64 20 53 51 4c  hat returned SQL
7f30: 49 54 45 5f 42 55 53 59 2e 20 4f 72 2c 20 6c 65  ITE_BUSY. Or, le
7f40: 73 73 20 6c 69 6b 65 6c 79 2c 0a 20 20 20 20 20  ss likely,.     
7f50: 20 2a 2a 20 74 68 61 74 20 61 6e 20 49 4f 2d 65   ** that an IO-e
7f60: 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65  rror has occurre
7f70: 64 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73  d. In either cas
7f80: 65 2c 20 74 68 72 6f 77 20 61 20 54 63 6c 20 65  e, throw a Tcl e
7f90: 78 63 65 70 74 69 6f 6e 0a 20 20 20 20 20 20 2a  xception.      *
7fa0: 2a 20 61 6e 64 20 74 72 79 20 74 6f 20 72 6f 6c  * and try to rol
7fb0: 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
7fc0: 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a  ction..      **.
7fd0: 20 20 20 20 20 20 2a 2a 20 42 75 74 20 69 74 20        ** But it 
7fe0: 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20 74 68  could also be th
7ff0: 61 74 20 74 68 65 20 75 73 65 72 20 65 78 65 63  at the user exec
8000: 75 74 65 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  uted one or more
8010: 20 42 45 47 49 4e 2c 20 0a 20 20 20 20 20 20 2a   BEGIN, .      *
8020: 2a 20 43 4f 4d 4d 49 54 2c 20 53 41 56 45 50 4f  * COMMIT, SAVEPO
8030: 49 4e 54 2c 20 52 45 4c 45 41 53 45 20 6f 72 20  INT, RELEASE or 
8040: 52 4f 4c 4c 42 41 43 4b 20 63 6f 6d 6d 61 6e 64  ROLLBACK command
8050: 73 20 74 68 61 74 20 61 72 65 20 63 6f 6e 66 75  s that are confu
8060: 73 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68  sing.      ** th
8070: 69 73 20 6d 65 74 68 6f 64 27 73 20 6c 6f 67 69  is method's logi
8080: 63 2e 20 4e 6f 74 20 63 6c 65 61 72 20 68 6f 77  c. Not clear how
8090: 20 74 68 69 73 20 77 6f 75 6c 64 20 62 65 20 62   this would be b
80a0: 65 73 74 20 68 61 6e 64 6c 65 64 2e 0a 20 20 20  est handled..   
80b0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
80c0: 21 3d 54 43 4c 5f 45 52 52 4f 52 20 29 7b 0a 20  !=TCL_ERROR ){. 
80d0: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
80e0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71  esult(interp, sq
80f0: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62  lite3_errmsg(pDb
8100: 2d 3e 64 62 29 2c 20 28 63 68 61 72 2a 29 30 29  ->db), (char*)0)
8110: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c  ;.      rc = TCL
8120: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
8130: 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70    sqlite3_exec(p
8140: 44 62 2d 3e 64 62 2c 20 22 52 4f 4c 4c 42 41 43  Db->db, "ROLLBAC
8150: 4b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  K", 0, 0, 0);.  
8160: 7d 0a 20 20 70 44 62 2d 3e 64 69 73 61 62 6c 65  }.  pDb->disable
8170: 41 75 74 68 2d 2d 3b 0a 0a 20 20 72 65 74 75 72  Auth--;..  retur
8180: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  n rc;.}../*.** U
8190: 6e 6c 65 73 73 20 53 51 4c 49 54 45 5f 54 45 53  nless SQLITE_TES
81a0: 54 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68  T is defined, th
81b0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
81c0: 20 73 69 6d 70 6c 65 20 77 72 61 70 70 65 72 20   simple wrapper 
81d0: 61 72 6f 75 6e 64 0a 2a 2a 20 73 71 6c 69 74 65  around.** sqlite
81e0: 33 5f 70 72 65 70 61 72 65 5f 76 32 28 29 2e 20  3_prepare_v2(). 
81f0: 49 66 20 53 51 4c 49 54 45 5f 54 45 53 54 20 69  If SQLITE_TEST i
8200: 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20  s defined, then 
8210: 69 74 20 75 73 65 73 20 65 69 74 68 65 72 0a 2a  it uses either.*
8220: 2a 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  * sqlite3_prepar
8230: 65 5f 76 32 28 29 20 6f 72 20 6c 65 67 61 63 79  e_v2() or legacy
8240: 20 69 6e 74 65 72 66 61 63 65 20 73 71 6c 69 74   interface sqlit
8250: 65 33 5f 70 72 65 70 61 72 65 28 29 2c 20 64 65  e3_prepare(), de
8260: 70 65 6e 64 69 6e 67 0a 2a 2a 20 6f 6e 20 77 68  pending.** on wh
8270: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
8280: 20 5b 64 62 5f 75 73 65 5f 6c 65 67 61 63 79 5f   [db_use_legacy_
8290: 70 72 65 70 61 72 65 5d 20 63 6f 6d 6d 61 6e 64  prepare] command
82a0: 20 68 61 73 20 62 65 65 6e 20 75 73 65 64 20 74   has been used t
82b0: 6f 20 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 65 20  o .** configure 
82c0: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  the connection..
82d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 62  */.static int db
82e0: 50 72 65 70 61 72 65 28 0a 20 20 53 71 6c 69 74  Prepare(.  Sqlit
82f0: 65 44 62 20 2a 70 44 62 2c 20 20 20 20 20 20 20  eDb *pDb,       
8300: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
8310: 74 61 62 61 73 65 20 6f 62 6a 65 63 74 20 2a 2f  tabase object */
8320: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
8330: 53 71 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Sql,            
8340: 20 20 20 2f 2a 20 53 51 4c 20 74 6f 20 63 6f 6d     /* SQL to com
8350: 70 69 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  pile */.  sqlite
8360: 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c  3_stmt **ppStmt,
8370: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
8380: 3a 20 50 72 65 70 61 72 65 64 20 73 74 61 74 65  : Prepared state
8390: 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ment */.  const 
83a0: 63 68 61 72 20 2a 2a 70 7a 4f 75 74 20 20 20 20  char **pzOut    
83b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
83c0: 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 78  : Pointer to nex
83d0: 74 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  t SQL statement 
83e0: 2a 2f 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  */.){.#ifdef SQL
83f0: 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 70  ITE_TEST.  if( p
8400: 44 62 2d 3e 62 4c 65 67 61 63 79 50 72 65 70 61  Db->bLegacyPrepa
8410: 72 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  re ){.    return
8420: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
8430: 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  (pDb->db, zSql, 
8440: 2d 31 2c 20 70 70 53 74 6d 74 2c 20 70 7a 4f 75  -1, ppStmt, pzOu
8450: 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  t);.  }.#endif. 
8460: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
8470: 70 72 65 70 61 72 65 5f 76 32 28 70 44 62 2d 3e  prepare_v2(pDb->
8480: 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 70 70  db, zSql, -1, pp
8490: 53 74 6d 74 2c 20 70 7a 4f 75 74 29 3b 0a 7d 0a  Stmt, pzOut);.}.
84a0: 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74 68  ./*.** Search th
84b0: 65 20 63 61 63 68 65 20 66 6f 72 20 61 20 70 72  e cache for a pr
84c0: 65 70 61 72 65 64 2d 73 74 61 74 65 6d 65 6e 74  epared-statement
84d0: 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 6d 70   object that imp
84e0: 6c 65 6d 65 6e 74 73 20 74 68 65 0a 2a 2a 20 66  lements the.** f
84f0: 69 72 73 74 20 53 51 4c 20 73 74 61 74 65 6d 65  irst SQL stateme
8500: 6e 74 20 69 6e 20 74 68 65 20 62 75 66 66 65 72  nt in the buffer
8510: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70   pointed to by p
8520: 61 72 61 6d 65 74 65 72 20 7a 49 6e 2e 20 49 66  arameter zIn. If
8530: 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 70 72 65 70  .** no such prep
8540: 61 72 65 64 2d 73 74 61 74 65 6d 65 6e 74 20 63  ared-statement c
8550: 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 61 6c 6c  an be found, all
8560: 6f 63 61 74 65 20 61 6e 64 20 70 72 65 70 61 72  ocate and prepar
8570: 65 20 61 20 6e 65 77 0a 2a 2a 20 6f 6e 65 2e 20  e a new.** one. 
8580: 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 20  In either case, 
8590: 62 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74  bind the current
85a0: 20 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20 72   values of the r
85b0: 65 6c 65 76 61 6e 74 20 54 63 6c 0a 2a 2a 20 76  elevant Tcl.** v
85c0: 61 72 69 61 62 6c 65 73 20 74 6f 20 61 6e 79 20  ariables to any 
85d0: 24 76 61 72 2c 20 3a 76 61 72 20 6f 72 20 40 76  $var, :var or @v
85e0: 61 72 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20  ar variables in 
85f0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 42  the statement. B
8600: 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75 72 6e 69  efore.** returni
8610: 6e 67 2c 20 73 65 74 20 2a 70 70 50 72 65 53 74  ng, set *ppPreSt
8620: 6d 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  mt to point to t
8630: 68 65 20 70 72 65 70 61 72 65 64 2d 73 74 61 74  he prepared-stat
8640: 65 6d 65 6e 74 20 6f 62 6a 65 63 74 2e 0a 2a 2a  ement object..**
8650: 0a 2a 2a 20 4f 75 74 70 75 74 20 70 61 72 61 6d  .** Output param
8660: 65 74 65 72 20 2a 70 7a 4f 75 74 20 69 73 20 73  eter *pzOut is s
8670: 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  et to point to t
8680: 68 65 20 6e 65 78 74 20 53 51 4c 20 73 74 61 74  he next SQL stat
8690: 65 6d 65 6e 74 20 69 6e 0a 2a 2a 20 62 75 66 66  ement in.** buff
86a0: 65 72 20 7a 49 6e 2c 20 6f 72 20 74 6f 20 74 68  er zIn, or to th
86b0: 65 20 27 5c 30 27 20 62 79 74 65 20 61 74 20 74  e '\0' byte at t
86c0: 68 65 20 65 6e 64 20 6f 66 20 7a 49 6e 20 69 66  he end of zIn if
86d0: 20 74 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20   there is no.** 
86e0: 6e 65 78 74 20 73 74 61 74 65 6d 65 6e 74 2e 0a  next statement..
86f0: 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
8700: 66 75 6c 2c 20 54 43 4c 5f 4f 4b 20 69 73 20 72  ful, TCL_OK is r
8710: 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
8720: 73 65 2c 20 54 43 4c 5f 45 52 52 4f 52 20 69 73  se, TCL_ERROR is
8730: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64   returned.** and
8740: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
8750: 65 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 69 6e  e loaded into in
8760: 74 65 72 70 72 65 74 65 72 20 70 44 62 2d 3e 69  terpreter pDb->i
8770: 6e 74 65 72 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  nterp..*/.static
8780: 20 69 6e 74 20 64 62 50 72 65 70 61 72 65 41 6e   int dbPrepareAn
8790: 64 42 69 6e 64 28 0a 20 20 53 71 6c 69 74 65 44  dBind(.  SqliteD
87a0: 62 20 2a 70 44 62 2c 20 20 20 20 20 20 20 20 20  b *pDb,         
87b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
87c0: 62 61 73 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  base object */. 
87d0: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 49 6e   char const *zIn
87e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
87f0: 20 2f 2a 20 53 51 4c 20 74 6f 20 63 6f 6d 70 69   /* SQL to compi
8800: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e  le */.  char con
8810: 73 74 20 2a 2a 70 7a 4f 75 74 2c 20 20 20 20 20  st **pzOut,     
8820: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
8830: 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 78 74 20  Pointer to next 
8840: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  SQL statement */
8850: 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74  .  SqlPreparedSt
8860: 6d 74 20 2a 2a 70 70 50 72 65 53 74 6d 74 20 20  mt **ppPreStmt  
8870: 20 20 20 2f 2a 20 4f 55 54 3a 20 4f 62 6a 65 63     /* OUT: Objec
8880: 74 20 75 73 65 64 20 74 6f 20 63 61 63 68 65 20  t used to cache 
8890: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a  statement */.){.
88a0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
88b0: 71 6c 20 3d 20 7a 49 6e 3b 20 20 20 20 20 20 20  ql = zIn;       
88c0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
88d0: 66 69 72 73 74 20 53 51 4c 20 73 74 61 74 65 6d  first SQL statem
88e0: 65 6e 74 20 69 6e 20 7a 49 6e 20 2a 2f 0a 20 20  ent in zIn */.  
88f0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
8900: 74 6d 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  tmt = 0;        
8910: 2f 2a 20 50 72 65 70 61 72 65 64 20 73 74 61 74  /* Prepared stat
8920: 65 6d 65 6e 74 20 6f 62 6a 65 63 74 20 2a 2f 0a  ement object */.
8930: 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d    SqlPreparedStm
8940: 74 20 2a 70 50 72 65 53 74 6d 74 3b 20 20 20 20  t *pPreStmt;    
8950: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
8960: 63 61 63 68 65 64 20 73 74 61 74 65 6d 65 6e 74  cached statement
8970: 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 71 6c 3b 20   */.  int nSql; 
8980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8990: 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
89a0: 6f 66 20 7a 53 71 6c 20 69 6e 20 62 79 74 65 73  of zSql in bytes
89b0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72 20 3d   */.  int nVar =
89c0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
89d0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
89e0: 6f 66 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20  of variables in 
89f0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  statement */.  i
8a00: 6e 74 20 69 50 61 72 6d 20 3d 20 30 3b 20 20 20  nt iParm = 0;   
8a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8a20: 2a 20 4e 65 78 74 20 66 72 65 65 20 65 6e 74 72  * Next free entr
8a30: 79 20 69 6e 20 61 70 50 61 72 6d 20 2a 2f 0a 20  y in apParm */. 
8a40: 20 63 68 61 72 20 63 3b 0a 20 20 69 6e 74 20 69   char c;.  int i
8a50: 3b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ;.  Tcl_Interp *
8a60: 69 6e 74 65 72 70 20 3d 20 70 44 62 2d 3e 69 6e  interp = pDb->in
8a70: 74 65 72 70 3b 0a 0a 20 20 2a 70 70 50 72 65 53  terp;..  *ppPreS
8a80: 74 6d 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54  tmt = 0;..  /* T
8a90: 72 69 6d 20 73 70 61 63 65 73 20 66 72 6f 6d 20  rim spaces from 
8aa0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 7a 53 71  the start of zSq
8ab0: 6c 20 61 6e 64 20 63 61 6c 63 75 6c 61 74 65 20  l and calculate 
8ac0: 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 20 6c 65  the remaining le
8ad0: 6e 67 74 68 2e 20 2a 2f 0a 20 20 77 68 69 6c 65  ngth. */.  while
8ae0: 28 20 28 63 20 3d 20 7a 53 71 6c 5b 30 5d 29 3d  ( (c = zSql[0])=
8af0: 3d 27 20 27 20 7c 7c 20 63 3d 3d 27 5c 74 27 20  =' ' || c=='\t' 
8b00: 7c 7c 20 63 3d 3d 27 5c 72 27 20 7c 7c 20 63 3d  || c=='\r' || c=
8b10: 3d 27 5c 6e 27 20 29 7b 20 7a 53 71 6c 2b 2b 3b  ='\n' ){ zSql++;
8b20: 20 7d 0a 20 20 6e 53 71 6c 20 3d 20 73 74 72 6c   }.  nSql = strl
8b30: 65 6e 33 30 28 7a 53 71 6c 29 3b 0a 0a 20 20 66  en30(zSql);..  f
8b40: 6f 72 28 70 50 72 65 53 74 6d 74 20 3d 20 70 44  or(pPreStmt = pD
8b50: 62 2d 3e 73 74 6d 74 4c 69 73 74 3b 20 70 50 72  b->stmtList; pPr
8b60: 65 53 74 6d 74 3b 20 70 50 72 65 53 74 6d 74 3d  eStmt; pPreStmt=
8b70: 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 29  pPreStmt->pNext)
8b80: 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 50  {.    int n = pP
8b90: 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 3b 0a 20 20  reStmt->nSql;.  
8ba0: 20 20 69 66 28 20 6e 53 71 6c 3e 3d 6e 20 0a 20    if( nSql>=n . 
8bb0: 20 20 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70         && memcmp
8bc0: 28 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 2c  (pPreStmt->zSql,
8bd0: 20 7a 53 71 6c 2c 20 6e 29 3d 3d 30 0a 20 20 20   zSql, n)==0.   
8be0: 20 20 20 20 20 26 26 20 28 7a 53 71 6c 5b 6e 5d       && (zSql[n]
8bf0: 3d 3d 30 20 7c 7c 20 7a 53 71 6c 5b 6e 2d 31 5d  ==0 || zSql[n-1]
8c00: 3d 3d 27 3b 27 29 0a 20 20 20 20 29 7b 0a 20 20  ==';').    ){.  
8c10: 20 20 20 20 70 53 74 6d 74 20 3d 20 70 50 72 65      pStmt = pPre
8c20: 53 74 6d 74 2d 3e 70 53 74 6d 74 3b 0a 20 20 20  Stmt->pStmt;.   
8c30: 20 20 20 2a 70 7a 4f 75 74 20 3d 20 26 7a 53 71     *pzOut = &zSq
8c40: 6c 5b 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c  l[pPreStmt->nSql
8c50: 5d 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65  ];..      /* Whe
8c60: 6e 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61  n a prepared sta
8c70: 74 65 6d 65 6e 74 20 69 73 20 66 6f 75 6e 64 2c  tement is found,
8c80: 20 75 6e 6c 69 6e 6b 20 69 74 20 66 72 6f 6d 20   unlink it from 
8c90: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 63  the.      ** cac
8ca0: 68 65 20 6c 69 73 74 2e 20 20 49 74 20 77 69 6c  he list.  It wil
8cb0: 6c 20 6c 61 74 65 72 20 62 65 20 61 64 64 65 64  l later be added
8cc0: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 62 65 67   back to the beg
8cd0: 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  inning.      ** 
8ce0: 6f 66 20 74 68 65 20 63 61 63 68 65 20 6c 69 73  of the cache lis
8cf0: 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6d  t in order to im
8d00: 70 6c 65 6d 65 6e 74 20 4c 52 55 20 72 65 70 6c  plement LRU repl
8d10: 61 63 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a  acement..      *
8d20: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65  /.      if( pPre
8d30: 53 74 6d 74 2d 3e 70 50 72 65 76 20 29 7b 0a 20  Stmt->pPrev ){. 
8d40: 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d         pPreStmt-
8d50: 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
8d60: 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 3b  pPreStmt->pNext;
8d70: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
8d80: 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c        pDb->stmtL
8d90: 69 73 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e  ist = pPreStmt->
8da0: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
8db0: 20 20 20 20 20 69 66 28 20 70 50 72 65 53 74 6d       if( pPreStm
8dc0: 74 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  t->pNext ){.    
8dd0: 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e      pPreStmt->pN
8de0: 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 50 72  ext->pPrev = pPr
8df0: 65 53 74 6d 74 2d 3e 70 50 72 65 76 3b 0a 20 20  eStmt->pPrev;.  
8e00: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8e10: 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74     pDb->stmtLast
8e20: 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72   = pPreStmt->pPr
8e30: 65 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ev;.      }.    
8e40: 20 20 70 44 62 2d 3e 6e 53 74 6d 74 2d 2d 3b 0a    pDb->nStmt--;.
8e50: 20 20 20 20 20 20 6e 56 61 72 20 3d 20 73 71 6c        nVar = sql
8e60: 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65  ite3_bind_parame
8e70: 74 65 72 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29  ter_count(pStmt)
8e80: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
8e90: 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a     }.  }.  .  /*
8ea0: 20 49 66 20 6e 6f 20 70 72 65 70 61 72 65 64 20   If no prepared 
8eb0: 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 66 6f  statement was fo
8ec0: 75 6e 64 2e 20 43 6f 6d 70 69 6c 65 20 74 68 65  und. Compile the
8ed0: 20 53 51 4c 20 74 65 78 74 2e 20 41 6c 73 6f 20   SQL text. Also 
8ee0: 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 61 20  allocate.  ** a 
8ef0: 6e 65 77 20 53 71 6c 50 72 65 70 61 72 65 64 53  new SqlPreparedS
8f00: 74 6d 74 20 73 74 72 75 63 74 75 72 65 2e 20 20  tmt structure.  
8f10: 2a 2f 0a 20 20 69 66 28 20 70 50 72 65 53 74 6d  */.  if( pPreStm
8f20: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  t==0 ){.    int 
8f30: 6e 42 79 74 65 3b 0a 0a 20 20 20 20 69 66 28 20  nByte;..    if( 
8f40: 53 51 4c 49 54 45 5f 4f 4b 21 3d 64 62 50 72 65  SQLITE_OK!=dbPre
8f50: 70 61 72 65 28 70 44 62 2c 20 7a 53 71 6c 2c 20  pare(pDb, zSql, 
8f60: 26 70 53 74 6d 74 2c 20 70 7a 4f 75 74 29 20 29  &pStmt, pzOut) )
8f70: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f  {.      Tcl_SetO
8f80: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
8f90: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
8fa0: 6a 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  j(sqlite3_errmsg
8fb0: 28 70 44 62 2d 3e 64 62 29 2c 20 2d 31 29 29 3b  (pDb->db), -1));
8fc0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
8fd0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
8fe0: 20 20 20 69 66 28 20 70 53 74 6d 74 3d 3d 30 20     if( pStmt==0 
8ff0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  ){.      if( SQL
9000: 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f  ITE_OK!=sqlite3_
9010: 65 72 72 63 6f 64 65 28 70 44 62 2d 3e 64 62 29  errcode(pDb->db)
9020: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   ){.        /* A
9030: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 65 72   compile-time er
9040: 72 6f 72 20 69 6e 20 74 68 65 20 73 74 61 74 65  ror in the state
9050: 6d 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ment. */.       
9060: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
9070: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
9080: 77 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74  wStringObj(sqlit
9090: 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64  e3_errmsg(pDb->d
90a0: 62 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 20 20  b), -1));.      
90b0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
90c0: 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  OR;.      }else{
90d0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
90e0: 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 61 20  statement was a 
90f0: 6e 6f 2d 6f 70 2e 20 20 43 6f 6e 74 69 6e 75 65  no-op.  Continue
9100: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 74 61   to the next sta
9110: 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 20 20 2a  tement.        *
9120: 2a 20 69 6e 20 74 68 65 20 53 51 4c 20 73 74 72  * in the SQL str
9130: 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ing..        */.
9140: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
9150: 43 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  CL_OK;.      }. 
9160: 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74     }..    assert
9170: 28 20 70 50 72 65 53 74 6d 74 3d 3d 30 20 29 3b  ( pPreStmt==0 );
9180: 0a 20 20 20 20 6e 56 61 72 20 3d 20 73 71 6c 69  .    nVar = sqli
9190: 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  te3_bind_paramet
91a0: 65 72 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b  er_count(pStmt);
91b0: 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 73 69 7a  .    nByte = siz
91c0: 65 6f 66 28 53 71 6c 50 72 65 70 61 72 65 64 53  eof(SqlPreparedS
91d0: 74 6d 74 29 20 2b 20 6e 56 61 72 2a 73 69 7a 65  tmt) + nVar*size
91e0: 6f 66 28 54 63 6c 5f 4f 62 6a 20 2a 29 3b 0a 20  of(Tcl_Obj *);. 
91f0: 20 20 20 70 50 72 65 53 74 6d 74 20 3d 20 28 53     pPreStmt = (S
9200: 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 2a 29  qlPreparedStmt*)
9210: 54 63 6c 5f 41 6c 6c 6f 63 28 6e 42 79 74 65 29  Tcl_Alloc(nByte)
9220: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 72  ;.    memset(pPr
9230: 65 53 74 6d 74 2c 20 30 2c 20 6e 42 79 74 65 29  eStmt, 0, nByte)
9240: 3b 0a 0a 20 20 20 20 70 50 72 65 53 74 6d 74 2d  ;..    pPreStmt-
9250: 3e 70 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a  >pStmt = pStmt;.
9260: 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53      pPreStmt->nS
9270: 71 6c 20 3d 20 28 69 6e 74 29 28 2a 70 7a 4f 75  ql = (int)(*pzOu
9280: 74 20 2d 20 7a 53 71 6c 29 3b 0a 20 20 20 20 70  t - zSql);.    p
9290: 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 20 3d 20  PreStmt->zSql = 
92a0: 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 74 6d  sqlite3_sql(pStm
92b0: 74 29 3b 0a 20 20 20 20 70 50 72 65 53 74 6d 74  t);.    pPreStmt
92c0: 2d 3e 61 70 50 61 72 6d 20 3d 20 28 54 63 6c 5f  ->apParm = (Tcl_
92d0: 4f 62 6a 20 2a 2a 29 26 70 50 72 65 53 74 6d 74  Obj **)&pPreStmt
92e0: 5b 31 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  [1];.#ifdef SQLI
92f0: 54 45 5f 54 45 53 54 0a 20 20 20 20 69 66 28 20  TE_TEST.    if( 
9300: 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 3d 3d  pPreStmt->zSql==
9310: 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  0 ){.      char 
9320: 2a 7a 43 6f 70 79 20 3d 20 54 63 6c 5f 41 6c 6c  *zCopy = Tcl_All
9330: 6f 63 28 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71  oc(pPreStmt->nSq
9340: 6c 20 2b 20 31 29 3b 0a 20 20 20 20 20 20 6d 65  l + 1);.      me
9350: 6d 63 70 79 28 7a 43 6f 70 79 2c 20 7a 53 71 6c  mcpy(zCopy, zSql
9360: 2c 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c  , pPreStmt->nSql
9370: 29 3b 0a 20 20 20 20 20 20 7a 43 6f 70 79 5b 70  );.      zCopy[p
9380: 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 5d 20 3d  PreStmt->nSql] =
9390: 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 70 50 72   '\0';.      pPr
93a0: 65 53 74 6d 74 2d 3e 7a 53 71 6c 20 3d 20 7a 43  eStmt->zSql = zC
93b0: 6f 70 79 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  opy;.    }.#endi
93c0: 66 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  f.  }.  assert( 
93d0: 70 50 72 65 53 74 6d 74 20 29 3b 0a 20 20 61 73  pPreStmt );.  as
93e0: 73 65 72 74 28 20 73 74 72 6c 65 6e 33 30 28 70  sert( strlen30(p
93f0: 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 29 3d 3d  PreStmt->zSql)==
9400: 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 20 29  pPreStmt->nSql )
9410: 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 6d  ;.  assert( 0==m
9420: 65 6d 63 6d 70 28 70 50 72 65 53 74 6d 74 2d 3e  emcmp(pPreStmt->
9430: 7a 53 71 6c 2c 20 7a 53 71 6c 2c 20 70 50 72 65  zSql, zSql, pPre
9440: 53 74 6d 74 2d 3e 6e 53 71 6c 29 20 29 3b 0a 0a  Stmt->nSql) );..
9450: 20 20 2f 2a 20 42 69 6e 64 20 76 61 6c 75 65 73    /* Bind values
9460: 20 74 6f 20 70 61 72 61 6d 65 74 65 72 73 20 74   to parameters t
9470: 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 24  hat begin with $
9480: 20 6f 72 20 3a 20 2a 2f 20 20 0a 20 20 66 6f 72   or : */  .  for
9490: 28 69 3d 31 3b 20 69 3c 3d 6e 56 61 72 3b 20 69  (i=1; i<=nVar; i
94a0: 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ++){.    const c
94b0: 68 61 72 20 2a 7a 56 61 72 20 3d 20 73 71 6c 69  har *zVar = sqli
94c0: 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  te3_bind_paramet
94d0: 65 72 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 20 69  er_name(pStmt, i
94e0: 29 3b 0a 20 20 20 20 69 66 28 20 7a 56 61 72 21  );.    if( zVar!
94f0: 3d 30 20 26 26 20 28 7a 56 61 72 5b 30 5d 3d 3d  =0 && (zVar[0]==
9500: 27 24 27 20 7c 7c 20 7a 56 61 72 5b 30 5d 3d 3d  '$' || zVar[0]==
9510: 27 3a 27 20 7c 7c 20 7a 56 61 72 5b 30 5d 3d 3d  ':' || zVar[0]==
9520: 27 40 27 29 20 29 7b 0a 20 20 20 20 20 20 54 63  '@') ){.      Tc
9530: 6c 5f 4f 62 6a 20 2a 70 56 61 72 20 3d 20 54 63  l_Obj *pVar = Tc
9540: 6c 5f 47 65 74 56 61 72 32 45 78 28 69 6e 74 65  l_GetVar2Ex(inte
9550: 72 70 2c 20 26 7a 56 61 72 5b 31 5d 2c 20 30 2c  rp, &zVar[1], 0,
9560: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
9570: 56 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Var ){.        i
9580: 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20 20 75 38  nt n;.        u8
9590: 20 2a 64 61 74 61 3b 0a 20 20 20 20 20 20 20 20   *data;.        
95a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
95b0: 65 20 3d 20 28 70 56 61 72 2d 3e 74 79 70 65 50  e = (pVar->typeP
95c0: 74 72 20 3f 20 70 56 61 72 2d 3e 74 79 70 65 50  tr ? pVar->typeP
95d0: 74 72 2d 3e 6e 61 6d 65 20 3a 20 22 22 29 3b 0a  tr->name : "");.
95e0: 20 20 20 20 20 20 20 20 63 68 61 72 20 63 20 3d          char c =
95f0: 20 7a 54 79 70 65 5b 30 5d 3b 0a 20 20 20 20 20   zType[0];.     
9600: 20 20 20 69 66 28 20 7a 56 61 72 5b 30 5d 3d 3d     if( zVar[0]==
9610: 27 40 27 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  '@' ||.         
9620: 20 20 28 63 3d 3d 27 62 27 20 26 26 20 73 74 72    (c=='b' && str
9630: 63 6d 70 28 7a 54 79 70 65 2c 22 62 79 74 65 61  cmp(zType,"bytea
9640: 72 72 61 79 22 29 3d 3d 30 20 26 26 20 70 56 61  rray")==0 && pVa
9650: 72 2d 3e 62 79 74 65 73 3d 3d 30 29 20 29 7b 0a  r->bytes==0) ){.
9660: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 61            /* Loa
9670: 64 20 61 20 42 4c 4f 42 20 74 79 70 65 20 69 66  d a BLOB type if
9680: 20 74 68 65 20 54 63 6c 20 76 61 72 69 61 62 6c   the Tcl variabl
9690: 65 20 69 73 20 61 20 62 79 74 65 61 72 72 61 79  e is a bytearray
96a0: 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a   and.          *
96b0: 2a 20 69 74 20 68 61 73 20 6e 6f 20 73 74 72 69  * it has no stri
96c0: 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ng representatio
96d0: 6e 20 6f 72 20 74 68 65 20 68 6f 73 74 0a 20 20  n or the host.  
96e0: 20 20 20 20 20 20 20 20 2a 2a 20 70 61 72 61 6d          ** param
96f0: 65 74 65 72 20 6e 61 6d 65 20 62 65 67 69 6e 73  eter name begins
9700: 20 77 69 74 68 20 22 40 22 2e 20 2a 2f 0a 20 20   with "@". */.  
9710: 20 20 20 20 20 20 20 20 64 61 74 61 20 3d 20 54          data = T
9720: 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46  cl_GetByteArrayF
9730: 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29  romObj(pVar, &n)
9740: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
9750: 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53  te3_bind_blob(pS
9760: 74 6d 74 2c 20 69 2c 20 64 61 74 61 2c 20 6e 2c  tmt, i, data, n,
9770: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
9780: 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49  .          Tcl_I
9790: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 56 61 72  ncrRefCount(pVar
97a0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 72  );.          pPr
97b0: 65 53 74 6d 74 2d 3e 61 70 50 61 72 6d 5b 69 50  eStmt->apParm[iP
97c0: 61 72 6d 2b 2b 5d 20 3d 20 70 56 61 72 3b 0a 20  arm++] = pVar;. 
97d0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
97e0: 20 63 3d 3d 27 62 27 20 26 26 20 73 74 72 63 6d   c=='b' && strcm
97f0: 70 28 7a 54 79 70 65 2c 22 62 6f 6f 6c 65 61 6e  p(zType,"boolean
9800: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
9810: 20 20 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f     Tcl_GetIntFro
9820: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 56 61  mObj(interp, pVa
9830: 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20  r, &n);.        
9840: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
9850: 6e 74 28 70 53 74 6d 74 2c 20 69 2c 20 6e 29 3b  nt(pStmt, i, n);
9860: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
9870: 66 28 20 63 3d 3d 27 64 27 20 26 26 20 73 74 72  f( c=='d' && str
9880: 63 6d 70 28 7a 54 79 70 65 2c 22 64 6f 75 62 6c  cmp(zType,"doubl
9890: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
98a0: 20 20 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20      double r;.  
98b0: 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 44          Tcl_GetD
98c0: 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e 74  oubleFromObj(int
98d0: 65 72 70 2c 20 70 56 61 72 2c 20 26 72 29 3b 0a  erp, pVar, &r);.
98e0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
98f0: 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28 70 53  3_bind_double(pS
9900: 74 6d 74 2c 20 69 2c 20 72 29 3b 0a 20 20 20 20  tmt, i, r);.    
9910: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 63      }else if( (c
9920: 3d 3d 27 77 27 20 26 26 20 73 74 72 63 6d 70 28  =='w' && strcmp(
9930: 7a 54 79 70 65 2c 22 77 69 64 65 49 6e 74 22 29  zType,"wideInt")
9940: 3d 3d 30 29 20 7c 7c 0a 20 20 20 20 20 20 20 20  ==0) ||.        
9950: 20 20 20 20 20 20 28 63 3d 3d 27 69 27 20 26 26        (c=='i' &&
9960: 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 69   strcmp(zType,"i
9970: 6e 74 22 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20  nt")==0) ){.    
9980: 20 20 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e        Tcl_WideIn
9990: 74 20 76 3b 0a 20 20 20 20 20 20 20 20 20 20 54  t v;.          T
99a0: 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f  cl_GetWideIntFro
99b0: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 56 61  mObj(interp, pVa
99c0: 72 2c 20 26 76 29 3b 0a 20 20 20 20 20 20 20 20  r, &v);.        
99d0: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
99e0: 6e 74 36 34 28 70 53 74 6d 74 2c 20 69 2c 20 76  nt64(pStmt, i, v
99f0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
9a00: 7b 0a 20 20 20 20 20 20 20 20 20 20 64 61 74 61  {.          data
9a10: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
9a20: 72 20 2a 29 54 63 6c 5f 47 65 74 53 74 72 69 6e  r *)Tcl_GetStrin
9a30: 67 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26  gFromObj(pVar, &
9a40: 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  n);.          sq
9a50: 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28  lite3_bind_text(
9a60: 70 53 74 6d 74 2c 20 69 2c 20 28 63 68 61 72 20  pStmt, i, (char 
9a70: 2a 29 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54  *)data, n, SQLIT
9a80: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  E_STATIC);.     
9a90: 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66       Tcl_IncrRef
9aa0: 43 6f 75 6e 74 28 70 56 61 72 29 3b 0a 20 20 20  Count(pVar);.   
9ab0: 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d         pPreStmt-
9ac0: 3e 61 70 50 61 72 6d 5b 69 50 61 72 6d 2b 2b 5d  >apParm[iParm++]
9ad0: 20 3d 20 70 56 61 72 3b 0a 20 20 20 20 20 20 20   = pVar;.       
9ae0: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
9af0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
9b00: 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c  bind_null(pStmt,
9b10: 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   i);.      }.   
9b20: 20 7d 0a 20 20 7d 0a 20 20 70 50 72 65 53 74 6d   }.  }.  pPreStm
9b30: 74 2d 3e 6e 50 61 72 6d 20 3d 20 69 50 61 72 6d  t->nParm = iParm
9b40: 3b 0a 20 20 2a 70 70 50 72 65 53 74 6d 74 20 3d  ;.  *ppPreStmt =
9b50: 20 70 50 72 65 53 74 6d 74 3b 0a 0a 20 20 72 65   pPreStmt;..  re
9b60: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
9b70: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
9b80: 73 74 61 74 65 6d 65 6e 74 20 72 65 66 65 72 65  statement refere
9b90: 6e 63 65 20 6f 62 74 61 69 6e 65 64 20 62 79 20  nce obtained by 
9ba0: 63 61 6c 6c 69 6e 67 20 64 62 50 72 65 70 61 72  calling dbPrepar
9bb0: 65 41 6e 64 42 69 6e 64 28 29 2e 0a 2a 2a 20 54  eAndBind()..** T
9bc0: 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 65  here should be e
9bd0: 78 61 63 74 6c 79 20 6f 6e 65 20 63 61 6c 6c 20  xactly one call 
9be0: 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
9bf0: 20 66 6f 72 20 65 61 63 68 20 63 61 6c 6c 20 74   for each call t
9c00: 6f 0a 2a 2a 20 64 62 50 72 65 70 61 72 65 41 6e  o.** dbPrepareAn
9c10: 64 42 69 6e 64 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  dBind()..**.** I
9c20: 66 20 74 68 65 20 64 69 73 63 61 72 64 20 70 61  f the discard pa
9c30: 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a  rameter is non-z
9c40: 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 73 74  ero, then the st
9c50: 61 74 65 6d 65 6e 74 20 69 73 20 64 65 6c 65 74  atement is delet
9c60: 65 64 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  ed.** immediatel
9c70: 79 2e 20 4f 74 68 65 72 77 69 73 65 20 69 74 20  y. Otherwise it 
9c80: 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
9c90: 4c 52 55 20 6c 69 73 74 20 61 6e 64 20 6d 61 79  LRU list and may
9ca0: 20 62 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   be returned.** 
9cb0: 62 79 20 61 20 73 75 62 73 65 71 75 65 6e 74 20  by a subsequent 
9cc0: 63 61 6c 6c 20 74 6f 20 64 62 50 72 65 70 61 72  call to dbPrepar
9cd0: 65 41 6e 64 42 69 6e 64 28 29 2e 0a 2a 2f 0a 73  eAndBind()..*/.s
9ce0: 74 61 74 69 63 20 76 6f 69 64 20 64 62 52 65 6c  tatic void dbRel
9cf0: 65 61 73 65 53 74 6d 74 28 0a 20 20 53 71 6c 69  easeStmt(.  Sqli
9d00: 74 65 44 62 20 2a 70 44 62 2c 20 20 20 20 20 20  teDb *pDb,      
9d10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
9d20: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
9d30: 2f 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64 53  /.  SqlPreparedS
9d40: 74 6d 74 20 2a 70 50 72 65 53 74 6d 74 2c 20 20  tmt *pPreStmt,  
9d50: 20 20 20 20 2f 2a 20 50 72 65 70 61 72 65 64 20      /* Prepared 
9d60: 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65  statement handle
9d70: 20 74 6f 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20   to release */. 
9d80: 20 69 6e 74 20 64 69 73 63 61 72 64 20 20 20 20   int discard    
9d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9da0: 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 65 6c 65   /* True to dele
9db0: 74 65 20 28 6e 6f 74 20 63 61 63 68 65 29 20 74  te (not cache) t
9dc0: 68 65 20 70 50 72 65 53 74 6d 74 20 2a 2f 0a 29  he pPreStmt */.)
9dd0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a  {.  int i;..  /*
9de0: 20 46 72 65 65 20 74 68 65 20 62 6f 75 6e 64 20   Free the bound 
9df0: 73 74 72 69 6e 67 20 61 6e 64 20 62 6c 6f 62 20  string and blob 
9e00: 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20  parameters */.  
9e10: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 72 65 53  for(i=0; i<pPreS
9e20: 74 6d 74 2d 3e 6e 50 61 72 6d 3b 20 69 2b 2b 29  tmt->nParm; i++)
9e30: 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  {.    Tcl_DecrRe
9e40: 66 43 6f 75 6e 74 28 70 50 72 65 53 74 6d 74 2d  fCount(pPreStmt-
9e50: 3e 61 70 50 61 72 6d 5b 69 5d 29 3b 0a 20 20 7d  >apParm[i]);.  }
9e60: 0a 20 20 70 50 72 65 53 74 6d 74 2d 3e 6e 50 61  .  pPreStmt->nPa
9e70: 72 6d 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  rm = 0;..  if( p
9e80: 44 62 2d 3e 6d 61 78 53 74 6d 74 3c 3d 30 20 7c  Db->maxStmt<=0 |
9e90: 7c 20 64 69 73 63 61 72 64 20 29 7b 0a 20 20 20  | discard ){.   
9ea0: 20 2f 2a 20 49 66 20 74 68 65 20 63 61 63 68 65   /* If the cache
9eb0: 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66 2c 20   is turned off, 
9ec0: 64 65 61 6c 6c 6f 63 61 74 65 64 20 74 68 65 20  deallocated the 
9ed0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
9ee0: 20 64 62 46 72 65 65 53 74 6d 74 28 70 50 72 65   dbFreeStmt(pPre
9ef0: 53 74 6d 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Stmt);.  }else{.
9f00: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 70      /* Add the p
9f10: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
9f20: 74 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  t to the beginni
9f30: 6e 67 20 6f 66 20 74 68 65 20 63 61 63 68 65 20  ng of the cache 
9f40: 6c 69 73 74 2e 20 2a 2f 0a 20 20 20 20 70 50 72  list. */.    pPr
9f50: 65 53 74 6d 74 2d 3e 70 4e 65 78 74 20 3d 20 70  eStmt->pNext = p
9f60: 44 62 2d 3e 73 74 6d 74 4c 69 73 74 3b 0a 20 20  Db->stmtList;.  
9f70: 20 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72 65    pPreStmt->pPre
9f80: 76 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  v = 0;.    if( p
9f90: 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 29 7b 0a  Db->stmtList ){.
9fa0: 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69       pDb->stmtLi
9fb0: 73 74 2d 3e 70 50 72 65 76 20 3d 20 70 50 72 65  st->pPrev = pPre
9fc0: 53 74 6d 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Stmt;.    }.    
9fd0: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 3d 20  pDb->stmtList = 
9fe0: 70 50 72 65 53 74 6d 74 3b 0a 20 20 20 20 69 66  pPreStmt;.    if
9ff0: 28 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 3d  ( pDb->stmtLast=
a000: 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
a010: 72 74 28 20 70 44 62 2d 3e 6e 53 74 6d 74 3d 3d  rt( pDb->nStmt==
a020: 30 20 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e  0 );.      pDb->
a030: 73 74 6d 74 4c 61 73 74 20 3d 20 70 50 72 65 53  stmtLast = pPreS
a040: 74 6d 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  tmt;.    }else{.
a050: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44        assert( pD
a060: 62 2d 3e 6e 53 74 6d 74 3e 30 20 29 3b 0a 20 20  b->nStmt>0 );.  
a070: 20 20 7d 0a 20 20 20 20 70 44 62 2d 3e 6e 53 74    }.    pDb->nSt
a080: 6d 74 2b 2b 3b 0a 20 20 20 0a 20 20 20 20 2f 2a  mt++;.   .    /*
a090: 20 49 66 20 77 65 20 68 61 76 65 20 74 6f 6f 20   If we have too 
a0a0: 6d 61 6e 79 20 73 74 61 74 65 6d 65 6e 74 20 69  many statement i
a0b0: 6e 20 63 61 63 68 65 2c 20 72 65 6d 6f 76 65 20  n cache, remove 
a0c0: 74 68 65 20 73 75 72 70 6c 75 73 20 66 72 6f 6d  the surplus from
a0d0: 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 64   .    ** the end
a0e0: 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 6c 69   of the cache li
a0f0: 73 74 2e 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c  st.  */.    whil
a100: 65 28 20 70 44 62 2d 3e 6e 53 74 6d 74 3e 70 44  e( pDb->nStmt>pD
a110: 62 2d 3e 6d 61 78 53 74 6d 74 20 29 7b 0a 20 20  b->maxStmt ){.  
a120: 20 20 20 20 53 71 6c 50 72 65 70 61 72 65 64 53      SqlPreparedS
a130: 74 6d 74 20 2a 70 4c 61 73 74 20 3d 20 70 44 62  tmt *pLast = pDb
a140: 2d 3e 73 74 6d 74 4c 61 73 74 3b 0a 20 20 20 20  ->stmtLast;.    
a150: 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20    pDb->stmtLast 
a160: 3d 20 70 4c 61 73 74 2d 3e 70 50 72 65 76 3b 0a  = pLast->pPrev;.
a170: 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c        pDb->stmtL
a180: 61 73 74 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a  ast->pNext = 0;.
a190: 20 20 20 20 20 20 70 44 62 2d 3e 6e 53 74 6d 74        pDb->nStmt
a1a0: 2d 2d 3b 0a 20 20 20 20 20 20 64 62 46 72 65 65  --;.      dbFree
a1b0: 53 74 6d 74 28 70 4c 61 73 74 29 3b 0a 20 20 20  Stmt(pLast);.   
a1c0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
a1d0: 53 74 72 75 63 74 75 72 65 20 75 73 65 64 20 77  Structure used w
a1e0: 69 74 68 20 64 62 45 76 61 6c 58 58 58 28 29 20  ith dbEvalXXX() 
a1f0: 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a  functions:.**.**
a200: 20 20 20 64 62 45 76 61 6c 49 6e 69 74 28 29 0a     dbEvalInit().
a210: 2a 2a 20 20 20 64 62 45 76 61 6c 53 74 65 70 28  **   dbEvalStep(
a220: 29 0a 2a 2a 20 20 20 64 62 45 76 61 6c 46 69 6e  ).**   dbEvalFin
a230: 61 6c 69 7a 65 28 29 0a 2a 2a 20 20 20 64 62 45  alize().**   dbE
a240: 76 61 6c 52 6f 77 49 6e 66 6f 28 29 0a 2a 2a 20  valRowInfo().** 
a250: 20 20 64 62 45 76 61 6c 43 6f 6c 75 6d 6e 56 61    dbEvalColumnVa
a260: 6c 75 65 28 29 0a 2a 2f 0a 74 79 70 65 64 65 66  lue().*/.typedef
a270: 20 73 74 72 75 63 74 20 44 62 45 76 61 6c 43 6f   struct DbEvalCo
a280: 6e 74 65 78 74 20 44 62 45 76 61 6c 43 6f 6e 74  ntext DbEvalCont
a290: 65 78 74 3b 0a 73 74 72 75 63 74 20 44 62 45 76  ext;.struct DbEv
a2a0: 61 6c 43 6f 6e 74 65 78 74 20 7b 0a 20 20 53 71  alContext {.  Sq
a2b0: 6c 69 74 65 44 62 20 2a 70 44 62 3b 20 20 20 20  liteDb *pDb;    
a2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a2d0: 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   Database handle
a2e0: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70   */.  Tcl_Obj *p
a2f0: 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sql;            
a300: 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20        /* Object 
a310: 68 6f 6c 64 69 6e 67 20 73 74 72 69 6e 67 20 7a  holding string z
a320: 53 71 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  Sql */.  const c
a330: 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20  har *zSql;      
a340: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 61           /* Rema
a350: 69 6e 69 6e 67 20 53 51 4c 20 74 6f 20 65 78 65  ining SQL to exe
a360: 63 75 74 65 20 2a 2f 0a 20 20 53 71 6c 50 72 65  cute */.  SqlPre
a370: 70 61 72 65 64 53 74 6d 74 20 2a 70 50 72 65 53  paredStmt *pPreS
a380: 74 6d 74 3b 20 20 20 20 20 20 2f 2a 20 43 75 72  tmt;      /* Cur
a390: 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 2a  rent statement *
a3a0: 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20  /.  int nCol;   
a3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3c0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
a3d0: 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65   columns returne
a3e0: 64 20 62 79 20 70 53 74 6d 74 20 2a 2f 0a 20 20  d by pStmt */.  
a3f0: 54 63 6c 5f 4f 62 6a 20 2a 70 41 72 72 61 79 3b  Tcl_Obj *pArray;
a400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a410: 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 72 72 61 79  /* Name of array
a420: 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 54   variable */.  T
a430: 63 6c 5f 4f 62 6a 20 2a 2a 61 70 43 6f 6c 4e 61  cl_Obj **apColNa
a440: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  me;            /
a450: 2a 20 41 72 72 61 79 20 6f 66 20 63 6f 6c 75 6d  * Array of colum
a460: 6e 20 6e 61 6d 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f  n names */.};../
a470: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e 79  *.** Release any
a480: 20 63 61 63 68 65 20 6f 66 20 63 6f 6c 75 6d 6e   cache of column
a490: 20 6e 61 6d 65 73 20 63 75 72 72 65 6e 74 6c 79   names currently
a4a0: 20 68 65 6c 64 20 61 73 20 70 61 72 74 20 6f 66   held as part of
a4b0: 0a 2a 2a 20 74 68 65 20 44 62 45 76 61 6c 43 6f  .** the DbEvalCo
a4c0: 6e 74 65 78 74 20 73 74 72 75 63 74 75 72 65 20  ntext structure 
a4d0: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
a4e0: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  rst argument..*/
a4f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 62 52  .static void dbR
a500: 65 6c 65 61 73 65 43 6f 6c 75 6d 6e 4e 61 6d 65  eleaseColumnName
a510: 73 28 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20  s(DbEvalContext 
a520: 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61 70  *p){.  if( p->ap
a530: 43 6f 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 69  ColName ){.    i
a540: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
a550: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b  0; i<p->nCol; i+
a560: 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44 65  +){.      Tcl_De
a570: 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 61 70  crRefCount(p->ap
a580: 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20  ColName[i]);.   
a590: 20 7d 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28   }.    Tcl_Free(
a5a0: 28 63 68 61 72 20 2a 29 70 2d 3e 61 70 43 6f 6c  (char *)p->apCol
a5b0: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 61 70  Name);.    p->ap
a5c0: 43 6f 6c 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d  ColName = 0;.  }
a5d0: 0a 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  .  p->nCol = 0;.
a5e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
a5f0: 69 7a 65 20 61 20 44 62 45 76 61 6c 43 6f 6e 74  ize a DbEvalCont
a600: 65 78 74 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ext structure..*
a610: 2a 0a 2a 2a 20 49 66 20 70 41 72 72 61 79 20 69  *.** If pArray i
a620: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
a630: 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65   it contains the
a640: 20 6e 61 6d 65 20 6f 66 20 61 20 54 63 6c 20 61   name of a Tcl a
a650: 72 72 61 79 0a 2a 2a 20 76 61 72 69 61 62 6c 65  rray.** variable
a660: 2e 20 54 68 65 20 22 2a 22 20 6d 65 6d 62 65 72  . The "*" member
a670: 20 6f 66 20 74 68 69 73 20 61 72 72 61 79 20 69   of this array i
a680: 73 20 73 65 74 20 74 6f 20 61 20 6c 69 73 74 20  s set to a list 
a690: 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 74 68  containing.** th
a6a0: 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63  e names of the c
a6b0: 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20  olumns returned 
a6c0: 62 79 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  by the statement
a6d0: 20 61 73 20 70 61 72 74 20 6f 66 20 65 61 63 68   as part of each
a6e0: 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 64 62 45 76  .** call to dbEv
a6f0: 61 6c 53 74 65 70 28 29 2c 20 69 6e 20 6f 72 64  alStep(), in ord
a700: 65 72 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20  er from left to 
a710: 72 69 67 68 74 2e 20 65 2e 67 2e 20 69 66 20 74  right. e.g. if t
a720: 68 65 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20  he names .** of 
a730: 74 68 65 20 72 65 74 75 72 6e 65 64 20 63 6f 6c  the returned col
a740: 75 6d 6e 73 20 61 72 65 20 61 2c 20 62 20 61 6e  umns are a, b an
a750: 64 20 63 2c 20 69 74 20 64 6f 65 73 20 74 68 65  d c, it does the
a760: 20 65 71 75 69 76 61 6c 65 6e 74 20 6f 66 20 74   equivalent of t
a770: 68 65 20 0a 2a 2a 20 74 63 6c 20 63 6f 6d 6d 61  he .** tcl comma
a780: 6e 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 65  nd:.**.**     se
a790: 74 20 24 7b 70 41 72 72 61 79 7d 28 2a 29 20 7b  t ${pArray}(*) {
a7a0: 61 20 62 20 63 7d 0a 2a 2f 0a 73 74 61 74 69 63  a b c}.*/.static
a7b0: 20 76 6f 69 64 20 64 62 45 76 61 6c 49 6e 69 74   void dbEvalInit
a7c0: 28 0a 20 20 44 62 45 76 61 6c 43 6f 6e 74 65 78  (.  DbEvalContex
a7d0: 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
a7e0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
a7f0: 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 69  o structure to i
a800: 6e 69 74 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 53  nitialize */.  S
a810: 71 6c 69 74 65 44 62 20 2a 70 44 62 2c 20 20 20  qliteDb *pDb,   
a820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a830: 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * Database handl
a840: 65 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  e */.  Tcl_Obj *
a850: 70 53 71 6c 2c 20 20 20 20 20 20 20 20 20 20 20  pSql,           
a860: 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74         /* Object
a870: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 53 51 4c 20   containing SQL 
a880: 73 63 72 69 70 74 20 2a 2f 0a 20 20 54 63 6c 5f  script */.  Tcl_
a890: 4f 62 6a 20 2a 70 41 72 72 61 79 20 20 20 20 20  Obj *pArray     
a8a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
a8b0: 61 6d 65 20 6f 66 20 54 63 6c 20 61 72 72 61 79  ame of Tcl array
a8c0: 20 74 6f 20 73 65 74 20 28 2a 29 20 65 6c 65 6d   to set (*) elem
a8d0: 65 6e 74 20 6f 66 20 2a 2f 0a 29 7b 0a 20 20 6d  ent of */.){.  m
a8e0: 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65  emset(p, 0, size
a8f0: 6f 66 28 44 62 45 76 61 6c 43 6f 6e 74 65 78 74  of(DbEvalContext
a900: 29 29 3b 0a 20 20 70 2d 3e 70 44 62 20 3d 20 70  ));.  p->pDb = p
a910: 44 62 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20 3d 20  Db;.  p->zSql = 
a920: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 70 53  Tcl_GetString(pS
a930: 71 6c 29 3b 0a 20 20 70 2d 3e 70 53 71 6c 20 3d  ql);.  p->pSql =
a940: 20 70 53 71 6c 3b 0a 20 20 54 63 6c 5f 49 6e 63   pSql;.  Tcl_Inc
a950: 72 52 65 66 43 6f 75 6e 74 28 70 53 71 6c 29 3b  rRefCount(pSql);
a960: 0a 20 20 69 66 28 20 70 41 72 72 61 79 20 29 7b  .  if( pArray ){
a970: 0a 20 20 20 20 70 2d 3e 70 41 72 72 61 79 20 3d  .    p->pArray =
a980: 20 70 41 72 72 61 79 3b 0a 20 20 20 20 54 63 6c   pArray;.    Tcl
a990: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 41  _IncrRefCount(pA
a9a0: 72 72 61 79 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  rray);.  }.}../*
a9b0: 0a 2a 2a 20 4f 62 74 61 69 6e 20 69 6e 66 6f 72  .** Obtain infor
a9c0: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
a9d0: 20 72 6f 77 20 74 68 61 74 20 74 68 65 20 44 62   row that the Db
a9e0: 45 76 61 6c 43 6f 6e 74 65 78 74 20 70 61 73 73  EvalContext pass
a9f0: 65 64 20 61 73 20 74 68 65 0a 2a 2a 20 66 69 72  ed as the.** fir
aa00: 73 74 20 61 72 67 75 6d 65 6e 74 20 63 75 72 72  st argument curr
aa10: 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e  ently points to.
aa20: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
aa30: 64 62 45 76 61 6c 52 6f 77 49 6e 66 6f 28 0a 20  dbEvalRowInfo(. 
aa40: 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a   DbEvalContext *
aa50: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
aa60: 20 2f 2a 20 45 76 61 6c 75 61 74 69 6f 6e 20 63   /* Evaluation c
aa70: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
aa80: 2a 70 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20  *pnCol,         
aa90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
aaa0: 55 54 3a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f  UT: Number of co
aab0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20  lumn names */.  
aac0: 54 63 6c 5f 4f 62 6a 20 2a 2a 2a 70 61 70 43 6f  Tcl_Obj ***papCo
aad0: 6c 4e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20  lName           
aae0: 2f 2a 20 4f 55 54 3a 20 41 72 72 61 79 20 6f 66  /* OUT: Array of
aaf0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f   column names */
ab00: 0a 29 7b 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65  .){.  /* Compute
ab10: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f   column names */
ab20: 0a 20 20 69 66 28 20 30 3d 3d 70 2d 3e 61 70 43  .  if( 0==p->apC
ab30: 6f 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73 71  olName ){.    sq
ab40: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
ab50: 74 20 3d 20 70 2d 3e 70 50 72 65 53 74 6d 74 2d  t = p->pPreStmt-
ab60: 3e 70 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20  >pStmt;.    int 
ab70: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
ab80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
ab90: 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a  rator variable *
aba0: 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20  /.    int nCol; 
abb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abc0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
abd0: 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65   columns returne
abe0: 64 20 62 79 20 70 53 74 6d 74 20 2a 2f 0a 20 20  d by pStmt */.  
abf0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 43 6f    Tcl_Obj **apCo
ac00: 6c 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20  lName = 0;      
ac10: 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 6f 6c 75  /* Array of colu
ac20: 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 0a 20 20 20  mn names */..   
ac30: 20 70 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 20   p->nCol = nCol 
ac40: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
ac50: 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20  _count(pStmt);. 
ac60: 20 20 20 69 66 28 20 6e 43 6f 6c 3e 30 20 26 26     if( nCol>0 &&
ac70: 20 28 70 61 70 43 6f 6c 4e 61 6d 65 20 7c 7c 20   (papColName || 
ac80: 70 2d 3e 70 41 72 72 61 79 29 20 29 7b 0a 20 20  p->pArray) ){.  
ac90: 20 20 20 20 61 70 43 6f 6c 4e 61 6d 65 20 3d 20      apColName = 
aca0: 28 54 63 6c 5f 4f 62 6a 2a 2a 29 54 63 6c 5f 41  (Tcl_Obj**)Tcl_A
acb0: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54 63 6c  lloc( sizeof(Tcl
acc0: 5f 4f 62 6a 2a 29 2a 6e 43 6f 6c 20 29 3b 0a 20  _Obj*)*nCol );. 
acd0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
ace0: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
acf0: 20 20 20 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d      apColName[i]
ad00: 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67   = Tcl_NewString
ad10: 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75  Obj(sqlite3_colu
ad20: 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69 29  mn_name(pStmt,i)
ad30: 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 54  , -1);.        T
ad40: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
ad50: 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20  apColName[i]);. 
ad60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
ad70: 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 61 70 43 6f  apColName = apCo
ad80: 6c 4e 61 6d 65 3b 0a 20 20 20 20 7d 0a 0a 20 20  lName;.    }..  
ad90: 20 20 2f 2a 20 49 66 20 72 65 73 75 6c 74 73 20    /* If results 
ada0: 61 72 65 20 62 65 69 6e 67 20 73 74 6f 72 65 64  are being stored
adb0: 20 69 6e 20 61 6e 20 61 72 72 61 79 20 76 61 72   in an array var
adc0: 69 61 62 6c 65 2c 20 74 68 65 6e 20 63 72 65 61  iable, then crea
add0: 74 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 61 72  te.    ** the ar
ade0: 72 61 79 28 2a 29 20 65 6e 74 72 79 20 66 6f 72  ray(*) entry for
adf0: 20 74 68 61 74 20 61 72 72 61 79 0a 20 20 20 20   that array.    
ae00: 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 41  */.    if( p->pA
ae10: 72 72 61 79 20 29 7b 0a 20 20 20 20 20 20 54 63  rray ){.      Tc
ae20: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
ae30: 20 3d 20 70 2d 3e 70 44 62 2d 3e 69 6e 74 65 72   = p->pDb->inter
ae40: 70 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a  p;.      Tcl_Obj
ae50: 20 2a 70 43 6f 6c 4c 69 73 74 20 3d 20 54 63 6c   *pColList = Tcl
ae60: 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20 20  _NewObj();.     
ae70: 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 74 61 72 20   Tcl_Obj *pStar 
ae80: 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  = Tcl_NewStringO
ae90: 62 6a 28 22 2a 22 2c 20 2d 31 29 3b 0a 0a 20 20  bj("*", -1);..  
aea0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
aeb0: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
aec0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
aed0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
aee0: 72 70 2c 20 70 43 6f 6c 4c 69 73 74 2c 20 61 70  rp, pColList, ap
aef0: 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20  ColName[i]);.   
af00: 20 20 20 7d 0a 20 20 20 20 20 20 54 63 6c 5f 49     }.      Tcl_I
af10: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 53 74 61  ncrRefCount(pSta
af20: 72 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62  r);.      Tcl_Ob
af30: 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c  jSetVar2(interp,
af40: 20 70 2d 3e 70 41 72 72 61 79 2c 20 70 53 74 61   p->pArray, pSta
af50: 72 2c 20 70 43 6f 6c 4c 69 73 74 2c 20 30 29 3b  r, pColList, 0);
af60: 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52  .      Tcl_DecrR
af70: 65 66 43 6f 75 6e 74 28 70 53 74 61 72 29 3b 0a  efCount(pStar);.
af80: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
af90: 20 70 61 70 43 6f 6c 4e 61 6d 65 20 29 7b 0a 20   papColName ){. 
afa0: 20 20 20 2a 70 61 70 43 6f 6c 4e 61 6d 65 20 3d     *papColName =
afb0: 20 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65 3b 0a 20   p->apColName;. 
afc0: 20 7d 0a 20 20 69 66 28 20 70 6e 43 6f 6c 20 29   }.  if( pnCol )
afd0: 7b 0a 20 20 20 20 2a 70 6e 43 6f 6c 20 3d 20 70  {.    *pnCol = p
afe0: 2d 3e 6e 43 6f 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ->nCol;.  }.}../
aff0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6f 6e 65 20  *.** Return one 
b000: 6f 66 20 54 43 4c 5f 4f 4b 2c 20 54 43 4c 5f 42  of TCL_OK, TCL_B
b010: 52 45 41 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f  REAK or TCL_ERRO
b020: 52 2e 20 49 66 20 54 43 4c 5f 45 52 52 4f 52 20  R. If TCL_ERROR 
b030: 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2c 20  is.** returned, 
b040: 74 68 65 6e 20 61 6e 20 65 72 72 6f 72 20 6d 65  then an error me
b050: 73 73 61 67 65 20 69 73 20 73 74 6f 72 65 64 20  ssage is stored 
b060: 69 6e 20 74 68 65 20 69 6e 74 65 72 70 72 65 74  in the interpret
b070: 65 72 20 62 65 66 6f 72 65 0a 2a 2a 20 72 65 74  er before.** ret
b080: 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 20  urning..**.** A 
b090: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
b0a0: 54 43 4c 5f 4f 4b 20 6d 65 61 6e 73 20 74 68 65  TCL_OK means the
b0b0: 72 65 20 69 73 20 61 20 72 6f 77 20 6f 66 20 64  re is a row of d
b0c0: 61 74 61 20 61 76 61 69 6c 61 62 6c 65 2e 20 54  ata available. T
b0d0: 68 65 0a 2a 2a 20 64 61 74 61 20 6d 61 79 20 62  he.** data may b
b0e0: 65 20 61 63 63 65 73 73 65 64 20 75 73 69 6e 67  e accessed using
b0f0: 20 64 62 45 76 61 6c 52 6f 77 49 6e 66 6f 28 29   dbEvalRowInfo()
b100: 20 61 6e 64 20 64 62 45 76 61 6c 43 6f 6c 75 6d   and dbEvalColum
b110: 6e 56 61 6c 75 65 28 29 2e 20 54 68 69 73 0a 2a  nValue(). This.*
b120: 2a 20 69 73 20 61 6e 61 6c 6f 67 6f 75 73 20 74  * is analogous t
b130: 6f 20 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51  o a return of SQ
b140: 4c 49 54 45 5f 52 4f 57 20 66 72 6f 6d 20 73 71  LITE_ROW from sq
b150: 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20 49 66  lite3_step(). If
b160: 20 54 43 4c 5f 42 52 45 41 4b 0a 2a 2a 20 69 73   TCL_BREAK.** is
b170: 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20   returned, then 
b180: 74 68 65 20 53 51 4c 20 73 63 72 69 70 74 20 68  the SQL script h
b190: 61 73 20 66 69 6e 69 73 68 65 64 20 65 78 65 63  as finished exec
b1a0: 75 74 69 6e 67 20 61 6e 64 20 74 68 65 72 65 20  uting and there 
b1b0: 61 72 65 0a 2a 2a 20 6e 6f 20 66 75 72 74 68 65  are.** no furthe
b1c0: 72 20 72 6f 77 73 20 61 76 61 69 6c 61 62 6c 65  r rows available
b1d0: 2e 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61  . This is simila
b1e0: 72 20 74 6f 20 53 51 4c 49 54 45 5f 44 4f 4e 45  r to SQLITE_DONE
b1f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b200: 64 62 45 76 61 6c 53 74 65 70 28 44 62 45 76 61  dbEvalStep(DbEva
b210: 6c 43 6f 6e 74 65 78 74 20 2a 70 29 7b 0a 20 20  lContext *p){.  
b220: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 72 65  const char *zPre
b230: 76 53 71 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  vSql = 0;       
b240: 2f 2a 20 50 72 65 76 69 6f 75 73 20 76 61 6c 75  /* Previous valu
b250: 65 20 6f 66 20 70 2d 3e 7a 53 71 6c 20 2a 2f 0a  e of p->zSql */.
b260: 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 7a 53 71  .  while( p->zSq
b270: 6c 5b 30 5d 20 7c 7c 20 70 2d 3e 70 50 72 65 53  l[0] || p->pPreS
b280: 74 6d 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  tmt ){.    int r
b290: 63 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 50  c;.    if( p->pP
b2a0: 72 65 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20  reStmt==0 ){.   
b2b0: 20 20 20 7a 50 72 65 76 53 71 6c 20 3d 20 28 70     zPrevSql = (p
b2c0: 2d 3e 7a 53 71 6c 3d 3d 7a 50 72 65 76 53 71 6c  ->zSql==zPrevSql
b2d0: 20 3f 20 30 20 3a 20 70 2d 3e 7a 53 71 6c 29 3b   ? 0 : p->zSql);
b2e0: 0a 20 20 20 20 20 20 72 63 20 3d 20 64 62 50 72  .      rc = dbPr
b2f0: 65 70 61 72 65 41 6e 64 42 69 6e 64 28 70 2d 3e  epareAndBind(p->
b300: 70 44 62 2c 20 70 2d 3e 7a 53 71 6c 2c 20 26 70  pDb, p->zSql, &p
b310: 2d 3e 7a 53 71 6c 2c 20 26 70 2d 3e 70 50 72 65  ->zSql, &p->pPre
b320: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28  Stmt);.      if(
b330: 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 20 72 65   rc!=TCL_OK ) re
b340: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 65 6c  turn rc;.    }el
b350: 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63  se{.      int rc
b360: 73 3b 0a 20 20 20 20 20 20 53 71 6c 69 74 65 44  s;.      SqliteD
b370: 62 20 2a 70 44 62 20 3d 20 70 2d 3e 70 44 62 3b  b *pDb = p->pDb;
b380: 0a 20 20 20 20 20 20 53 71 6c 50 72 65 70 61 72  .      SqlPrepar
b390: 65 64 53 74 6d 74 20 2a 70 50 72 65 53 74 6d 74  edStmt *pPreStmt
b3a0: 20 3d 20 70 2d 3e 70 50 72 65 53 74 6d 74 3b 0a   = p->pPreStmt;.
b3b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
b3c0: 6d 74 20 2a 70 53 74 6d 74 20 3d 20 70 50 72 65  mt *pStmt = pPre
b3d0: 53 74 6d 74 2d 3e 70 53 74 6d 74 3b 0a 0a 20 20  Stmt->pStmt;..  
b3e0: 20 20 20 20 72 63 73 20 3d 20 73 71 6c 69 74 65      rcs = sqlite
b3f0: 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20  3_step(pStmt);. 
b400: 20 20 20 20 20 69 66 28 20 72 63 73 3d 3d 53 51       if( rcs==SQ
b410: 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
b420: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
b430: 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
b440: 20 69 66 28 20 70 2d 3e 70 41 72 72 61 79 20 29   if( p->pArray )
b450: 7b 0a 20 20 20 20 20 20 20 20 64 62 45 76 61 6c  {.        dbEval
b460: 52 6f 77 49 6e 66 6f 28 70 2c 20 30 2c 20 30 29  RowInfo(p, 0, 0)
b470: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b480: 72 63 73 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  rcs = sqlite3_re
b490: 73 65 74 28 70 53 74 6d 74 29 3b 0a 0a 20 20 20  set(pStmt);..   
b4a0: 20 20 20 70 44 62 2d 3e 6e 53 74 65 70 20 3d 20     pDb->nStep = 
b4b0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61  sqlite3_stmt_sta
b4c0: 74 75 73 28 70 53 74 6d 74 2c 53 51 4c 49 54 45  tus(pStmt,SQLITE
b4d0: 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c  _STMTSTATUS_FULL
b4e0: 53 43 41 4e 5f 53 54 45 50 2c 31 29 3b 0a 20 20  SCAN_STEP,1);.  
b4f0: 20 20 20 20 70 44 62 2d 3e 6e 53 6f 72 74 20 3d      pDb->nSort =
b500: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74   sqlite3_stmt_st
b510: 61 74 75 73 28 70 53 74 6d 74 2c 53 51 4c 49 54  atus(pStmt,SQLIT
b520: 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 53 4f 52  E_STMTSTATUS_SOR
b530: 54 2c 31 29 3b 0a 20 20 20 20 20 20 70 44 62 2d  T,1);.      pDb-
b540: 3e 6e 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65  >nIndex = sqlite
b550: 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70 53  3_stmt_status(pS
b560: 74 6d 74 2c 53 51 4c 49 54 45 5f 53 54 4d 54 53  tmt,SQLITE_STMTS
b570: 54 41 54 55 53 5f 41 55 54 4f 49 4e 44 45 58 2c  TATUS_AUTOINDEX,
b580: 31 29 3b 0a 20 20 20 20 20 20 64 62 52 65 6c 65  1);.      dbRele
b590: 61 73 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  aseColumnNames(p
b5a0: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 65  );.      p->pPre
b5b0: 53 74 6d 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20  Stmt = 0;..     
b5c0: 20 69 66 28 20 72 63 73 21 3d 53 51 4c 49 54 45   if( rcs!=SQLITE
b5d0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  _OK ){.        /
b5e0: 2a 20 49 66 20 61 20 72 75 6e 2d 74 69 6d 65 20  * If a run-time 
b5f0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
b600: 70 6f 72 74 20 74 68 65 20 65 72 72 6f 72 20 61  port the error a
b610: 6e 64 20 73 74 6f 70 20 72 65 61 64 69 6e 67 0a  nd stop reading.
b620: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53          ** the S
b630: 51 4c 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  QL.  */.        
b640: 64 62 52 65 6c 65 61 73 65 53 74 6d 74 28 70 44  dbReleaseStmt(pD
b650: 62 2c 20 70 50 72 65 53 74 6d 74 2c 20 31 29 3b  b, pPreStmt, 1);
b660: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 53 54  .#if SQLITE_TEST
b670: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
b680: 70 44 62 2d 3e 62 4c 65 67 61 63 79 50 72 65 70  pDb->bLegacyPrep
b690: 61 72 65 20 26 26 20 72 63 73 3d 3d 53 51 4c 49  are && rcs==SQLI
b6a0: 54 45 5f 53 43 48 45 4d 41 20 26 26 20 7a 50 72  TE_SCHEMA && zPr
b6b0: 65 76 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 20  evSql ){.       
b6c0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 75 6e     /* If the run
b6d0: 74 69 6d 65 20 65 72 72 6f 72 20 77 61 73 20 61  time error was a
b6e0: 6e 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 2c  n SQLITE_SCHEMA,
b6f0: 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
b700: 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68  e.          ** h
b710: 61 6e 64 6c 65 20 69 73 20 63 6f 6e 66 69 67 75  andle is configu
b720: 72 65 64 20 74 6f 20 75 73 65 20 74 68 65 20 6c  red to use the l
b730: 65 67 61 63 79 20 73 71 6c 69 74 65 33 5f 70 72  egacy sqlite3_pr
b740: 65 70 61 72 65 28 29 20 0a 20 20 20 20 20 20 20  epare() .       
b750: 20 20 20 2a 2a 20 69 6e 74 65 72 66 61 63 65 2c     ** interface,
b760: 20 72 65 74 72 79 20 70 72 65 70 61 72 65 28 29   retry prepare()
b770: 2f 73 74 65 70 28 29 20 6f 6e 20 74 68 65 20 73  /step() on the s
b780: 61 6d 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ame SQL statemen
b790: 74 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  t..          ** 
b7a0: 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e  This only happen
b7b0: 73 20 6f 6e 63 65 2e 20 49 66 20 74 68 65 72 65  s once. If there
b7c0: 20 69 73 20 61 20 73 65 63 6f 6e 64 20 53 51 4c   is a second SQL
b7d0: 49 54 45 5f 53 43 48 45 4d 41 0a 20 20 20 20 20  ITE_SCHEMA.     
b7e0: 20 20 20 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74       ** error, t
b7f0: 68 65 20 65 72 72 6f 72 20 77 69 6c 6c 20 62 65  he error will be
b800: 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
b810: 20 63 61 6c 6c 65 72 2e 20 2a 2f 0a 20 20 20 20   caller. */.    
b820: 20 20 20 20 20 20 70 2d 3e 7a 53 71 6c 20 3d 20        p->zSql = 
b830: 7a 50 72 65 76 53 71 6c 3b 0a 20 20 20 20 20 20  zPrevSql;.      
b840: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
b850: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
b860: 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62         Tcl_SetOb
b870: 6a 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74  jResult(pDb->int
b880: 65 72 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20  erp,.           
b890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63                Tc
b8a0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73  l_NewStringObj(s
b8b0: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44  qlite3_errmsg(pD
b8c0: 62 2d 3e 64 62 29 2c 20 2d 31 29 29 3b 0a 20 20  b->db), -1));.  
b8d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
b8e0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65  _ERROR;.      }e
b8f0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 64 62 52  lse{.        dbR
b900: 65 6c 65 61 73 65 53 74 6d 74 28 70 44 62 2c 20  eleaseStmt(pDb, 
b910: 70 50 72 65 53 74 6d 74 2c 20 30 29 3b 0a 20 20  pPreStmt, 0);.  
b920: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
b930: 0a 20 20 2f 2a 20 46 69 6e 69 73 68 65 64 20 2a  .  /* Finished *
b940: 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 42  /.  return TCL_B
b950: 52 45 41 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  REAK;.}../*.** F
b960: 72 65 65 20 61 6c 6c 20 72 65 73 6f 75 72 63 65  ree all resource
b970: 73 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64  s currently held
b980: 20 62 79 20 74 68 65 20 44 62 45 76 61 6c 43 6f   by the DbEvalCo
b990: 6e 74 65 78 74 20 73 74 72 75 63 74 75 72 65 20  ntext structure 
b9a0: 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65  passed.** as the
b9b0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
b9c0: 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65   There should be
b9d0: 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 63 61 6c   exactly one cal
b9e0: 6c 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  l to this functi
b9f0: 6f 6e 0a 2a 2a 20 66 6f 72 20 65 61 63 68 20 63  on.** for each c
ba00: 61 6c 6c 20 74 6f 20 64 62 45 76 61 6c 49 6e 69  all to dbEvalIni
ba10: 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  t()..*/.static v
ba20: 6f 69 64 20 64 62 45 76 61 6c 46 69 6e 61 6c 69  oid dbEvalFinali
ba30: 7a 65 28 44 62 45 76 61 6c 43 6f 6e 74 65 78 74  ze(DbEvalContext
ba40: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70   *p){.  if( p->p
ba50: 50 72 65 53 74 6d 74 20 29 7b 0a 20 20 20 20 73  PreStmt ){.    s
ba60: 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 2d 3e  qlite3_reset(p->
ba70: 70 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74 29  pPreStmt->pStmt)
ba80: 3b 0a 20 20 20 20 64 62 52 65 6c 65 61 73 65 53  ;.    dbReleaseS
ba90: 74 6d 74 28 70 2d 3e 70 44 62 2c 20 70 2d 3e 70  tmt(p->pDb, p->p
baa0: 50 72 65 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20  PreStmt, 0);.   
bab0: 20 70 2d 3e 70 50 72 65 53 74 6d 74 20 3d 20 30   p->pPreStmt = 0
bac0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
bad0: 41 72 72 61 79 20 29 7b 0a 20 20 20 20 54 63 6c  Array ){.    Tcl
bae0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 2d  _DecrRefCount(p-
baf0: 3e 70 41 72 72 61 79 29 3b 0a 20 20 20 20 70 2d  >pArray);.    p-
bb00: 3e 70 41 72 72 61 79 20 3d 20 30 3b 0a 20 20 7d  >pArray = 0;.  }
bb10: 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  .  Tcl_DecrRefCo
bb20: 75 6e 74 28 70 2d 3e 70 53 71 6c 29 3b 0a 20 20  unt(p->pSql);.  
bb30: 64 62 52 65 6c 65 61 73 65 43 6f 6c 75 6d 6e 4e  dbReleaseColumnN
bb40: 61 6d 65 73 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ames(p);.}../*.*
bb50: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
bb60: 65 72 20 74 6f 20 61 20 54 63 6c 5f 4f 62 6a 20  er to a Tcl_Obj 
bb70: 73 74 72 75 63 74 75 72 65 20 77 69 74 68 20 72  structure with r
bb80: 65 66 2d 63 6f 75 6e 74 20 30 20 74 68 61 74 20  ef-count 0 that 
bb90: 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20  contains.** the 
bba0: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 69 43  value for the iC
bbb0: 6f 6c 27 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20  ol'th column of 
bbc0: 74 68 65 20 72 6f 77 20 63 75 72 72 65 6e 74 6c  the row currentl
bbd0: 79 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 0a  y pointed to by.
bbe0: 2a 2a 20 74 68 65 20 44 62 45 76 61 6c 43 6f 6e  ** the DbEvalCon
bbf0: 74 65 78 74 20 73 74 72 75 63 74 75 72 65 20 70  text structure p
bc00: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
bc10: 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  st argument..*/.
bc20: 73 74 61 74 69 63 20 54 63 6c 5f 4f 62 6a 20 2a  static Tcl_Obj *
bc30: 64 62 45 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75  dbEvalColumnValu
bc40: 65 28 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20  e(DbEvalContext 
bc50: 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20  *p, int iCol){. 
bc60: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
bc70: 53 74 6d 74 20 3d 20 70 2d 3e 70 50 72 65 53 74  Stmt = p->pPreSt
bc80: 6d 74 2d 3e 70 53 74 6d 74 3b 0a 20 20 73 77 69  mt->pStmt;.  swi
bc90: 74 63 68 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c  tch( sqlite3_col
bca0: 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c 20  umn_type(pStmt, 
bcb0: 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 63 61 73  iCol) ){.    cas
bcc0: 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b  e SQLITE_BLOB: {
bcd0: 0a 20 20 20 20 20 20 69 6e 74 20 62 79 74 65 73  .      int bytes
bce0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
bcf0: 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20 69  n_bytes(pStmt, i
bd00: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73  Col);.      cons
bd10: 74 20 63 68 61 72 20 2a 7a 42 6c 6f 62 20 3d 20  t char *zBlob = 
bd20: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
bd30: 6c 6f 62 28 70 53 74 6d 74 2c 20 69 43 6f 6c 29  lob(pStmt, iCol)
bd40: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 42 6c  ;.      if( !zBl
bd50: 6f 62 20 29 20 62 79 74 65 73 20 3d 20 30 3b 0a  ob ) bytes = 0;.
bd60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c        return Tcl
bd70: 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a  _NewByteArrayObj
bd80: 28 28 75 38 2a 29 7a 42 6c 6f 62 2c 20 62 79 74  ((u8*)zBlob, byt
bd90: 65 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  es);.    }.    c
bda0: 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  ase SQLITE_INTEG
bdb0: 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ER: {.      sqli
bdc0: 74 65 5f 69 6e 74 36 34 20 76 20 3d 20 73 71 6c  te_int64 v = sql
bdd0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  ite3_column_int6
bde0: 34 28 70 53 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a  4(pStmt, iCol);.
bdf0: 20 20 20 20 20 20 69 66 28 20 76 3e 3d 2d 32 31        if( v>=-21
be00: 34 37 34 38 33 36 34 37 20 26 26 20 76 3c 3d 32  47483647 && v<=2
be10: 31 34 37 34 38 33 36 34 37 20 29 7b 0a 20 20 20  147483647 ){.   
be20: 20 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f       return Tcl_
be30: 4e 65 77 49 6e 74 4f 62 6a 28 28 69 6e 74 29 76  NewIntObj((int)v
be40: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
be50: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
be60: 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a  cl_NewWideIntObj
be70: 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (v);.      }.   
be80: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
be90: 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20  TE_FLOAT: {.    
bea0: 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e 65 77    return Tcl_New
beb0: 44 6f 75 62 6c 65 4f 62 6a 28 73 71 6c 69 74 65  DoubleObj(sqlite
bec0: 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28  3_column_double(
bed0: 70 53 74 6d 74 2c 20 69 43 6f 6c 29 29 3b 0a 20  pStmt, iCol));. 
bee0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
bef0: 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20  LITE_NULL: {.   
bf00: 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e 65     return Tcl_Ne
bf10: 77 53 74 72 69 6e 67 4f 62 6a 28 70 2d 3e 70 44  wStringObj(p->pD
bf20: 62 2d 3e 7a 4e 75 6c 6c 2c 20 2d 31 29 3b 0a 20  b->zNull, -1);. 
bf30: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
bf40: 72 6e 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  rn Tcl_NewString
bf50: 4f 62 6a 28 28 63 68 61 72 2a 29 73 71 6c 69 74  Obj((char*)sqlit
bf60: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
bf70: 53 74 6d 74 2c 20 69 43 6f 6c 29 2c 20 2d 31 29  Stmt, iCol), -1)
bf80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 75 73  ;.}../*.** If us
bf90: 69 6e 67 20 54 63 6c 20 76 65 72 73 69 6f 6e 20  ing Tcl version 
bfa0: 38 2e 36 20 6f 72 20 67 72 65 61 74 65 72 2c 20  8.6 or greater, 
bfb0: 75 73 65 20 74 68 65 20 4e 52 20 66 75 6e 63 74  use the NR funct
bfc0: 69 6f 6e 73 20 74 6f 20 61 76 6f 69 64 0a 2a 2a  ions to avoid.**
bfd0: 20 72 65 63 75 72 73 69 76 65 20 65 76 61 6c 75   recursive evalu
bfe0: 74 69 6f 6e 20 6f 66 20 73 63 72 69 70 74 73 20  tion of scripts 
bff0: 62 79 20 74 68 65 20 5b 64 62 20 65 76 61 6c 5d  by the [db eval]
c000: 20 61 6e 64 20 5b 64 62 20 74 72 61 6e 73 5d 0a   and [db trans].
c010: 2a 2a 20 63 6f 6d 6d 61 6e 64 73 2e 20 45 76 65  ** commands. Eve
c020: 6e 20 69 66 20 74 68 65 20 68 65 61 64 65 72 73  n if the headers
c030: 20 75 73 65 64 20 77 68 69 6c 65 20 63 6f 6d 70   used while comp
c040: 69 6c 69 6e 67 20 74 68 65 20 65 78 74 65 6e 73  iling the extens
c050: 69 6f 6e 0a 2a 2a 20 61 72 65 20 38 2e 36 20 6f  ion.** are 8.6 o
c060: 72 20 6e 65 77 65 72 2c 20 74 68 65 20 63 6f 64  r newer, the cod
c070: 65 20 73 74 69 6c 6c 20 74 65 73 74 73 20 74 68  e still tests th
c080: 65 20 54 63 6c 20 76 65 72 73 69 6f 6e 20 61 74  e Tcl version at
c090: 20 72 75 6e 74 69 6d 65 2e 0a 2a 2a 20 54 68 69   runtime..** Thi
c0a0: 73 20 61 6c 6c 6f 77 73 20 73 74 75 62 73 2d 65  s allows stubs-e
c0b0: 6e 61 62 6c 65 64 20 62 75 69 6c 64 73 20 74 6f  nabled builds to
c0c0: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 6f 6c   be used with ol
c0d0: 64 65 72 20 54 63 6c 20 6c 69 62 72 61 72 69 65  der Tcl librarie
c0e0: 73 2e 0a 2a 2f 0a 23 69 66 20 54 43 4c 5f 4d 41  s..*/.#if TCL_MA
c0f0: 4a 4f 52 5f 56 45 52 53 49 4f 4e 3e 38 20 7c 7c  JOR_VERSION>8 ||
c100: 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53   (TCL_MAJOR_VERS
c110: 49 4f 4e 3d 3d 38 20 26 26 20 54 43 4c 5f 4d 49  ION==8 && TCL_MI
c120: 4e 4f 52 5f 56 45 52 53 49 4f 4e 3e 3d 36 29 0a  NOR_VERSION>=6).
c130: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
c140: 54 43 4c 5f 4e 52 45 20 31 0a 73 74 61 74 69 63  TCL_NRE 1.static
c150: 20 69 6e 74 20 44 62 55 73 65 4e 72 65 28 76 6f   int DbUseNre(vo
c160: 69 64 29 7b 0a 20 20 69 6e 74 20 6d 61 6a 6f 72  id){.  int major
c170: 2c 20 6d 69 6e 6f 72 3b 0a 20 20 54 63 6c 5f 47  , minor;.  Tcl_G
c180: 65 74 56 65 72 73 69 6f 6e 28 26 6d 61 6a 6f 72  etVersion(&major
c190: 2c 20 26 6d 69 6e 6f 72 2c 20 30 2c 20 30 29 3b  , &minor, 0, 0);
c1a0: 0a 20 20 72 65 74 75 72 6e 28 20 28 6d 61 6a 6f  .  return( (majo
c1b0: 72 3d 3d 38 20 26 26 20 6d 69 6e 6f 72 3e 3d 36  r==8 && minor>=6
c1c0: 29 20 7c 7c 20 6d 61 6a 6f 72 3e 38 20 29 3b 0a  ) || major>8 );.
c1d0: 7d 0a 23 65 6c 73 65 0a 2f 2a 20 0a 2a 2a 20 43  }.#else./* .** C
c1e0: 6f 6d 70 69 6c 69 6e 67 20 75 73 69 6e 67 20 68  ompiling using h
c1f0: 65 61 64 65 72 73 20 65 61 72 6c 69 65 72 20 74  eaders earlier t
c200: 68 61 6e 20 38 2e 36 2e 20 49 6e 20 74 68 69 73  han 8.6. In this
c210: 20 63 61 73 65 20 4e 52 20 63 61 6e 6e 6f 74 20   case NR cannot 
c220: 62 65 0a 2a 2a 20 75 73 65 64 2c 20 73 6f 20 44  be.** used, so D
c230: 62 55 73 65 4e 72 65 28 29 20 74 6f 20 61 6c 77  bUseNre() to alw
c240: 61 79 73 20 72 65 74 75 72 6e 20 7a 65 72 6f 2e  ays return zero.
c250: 20 41 64 64 20 23 64 65 66 69 6e 65 73 20 66 6f   Add #defines fo
c260: 72 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20 54  r the other.** T
c270: 63 6c 5f 4e 52 78 78 78 28 29 20 66 75 6e 63 74  cl_NRxxx() funct
c280: 69 6f 6e 73 20 74 6f 20 70 72 65 76 65 6e 74 20  ions to prevent 
c290: 74 68 65 6d 20 66 72 6f 6d 20 63 61 75 73 69 6e  them from causin
c2a0: 67 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 65 72  g compilation er
c2b0: 72 6f 72 73 2c 0a 2a 2a 20 65 76 65 6e 20 74 68  rors,.** even th
c2c0: 6f 75 67 68 20 74 68 65 20 6f 6e 6c 79 20 69 6e  ough the only in
c2d0: 76 6f 63 61 74 69 6f 6e 73 20 6f 66 20 74 68 65  vocations of the
c2e0: 6d 20 61 72 65 20 77 69 74 68 69 6e 20 63 6f 6e  m are within con
c2f0: 64 69 74 69 6f 6e 61 6c 20 62 6c 6f 63 6b 73 20  ditional blocks 
c300: 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a  .** of the form:
c310: 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 44 62 55  .**.**   if( DbU
c320: 73 65 4e 72 65 28 29 20 29 20 7b 20 2e 2e 2e 20  seNre() ) { ... 
c330: 7d 0a 2a 2f 0a 23 20 64 65 66 69 6e 65 20 53 51  }.*/.# define SQ
c340: 4c 49 54 45 5f 54 43 4c 5f 4e 52 45 20 30 0a 23  LITE_TCL_NRE 0.#
c350: 20 64 65 66 69 6e 65 20 44 62 55 73 65 4e 72 65   define DbUseNre
c360: 28 29 20 30 0a 23 20 64 65 66 69 6e 65 20 54 63  () 0.# define Tc
c370: 6c 5f 4e 52 41 64 64 43 61 6c 6c 62 61 63 6b 28  l_NRAddCallback(
c380: 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 28 76 6f  a,b,c,d,e,f) (vo
c390: 69 64 29 30 0a 23 20 64 65 66 69 6e 65 20 54 63  id)0.# define Tc
c3a0: 6c 5f 4e 52 45 76 61 6c 4f 62 6a 28 61 2c 62 2c  l_NREvalObj(a,b,
c3b0: 63 29 20 30 0a 23 20 64 65 66 69 6e 65 20 54 63  c) 0.# define Tc
c3c0: 6c 5f 4e 52 43 72 65 61 74 65 43 6f 6d 6d 61 6e  l_NRCreateComman
c3d0: 64 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 28  d(a,b,c,d,e,f) (
c3e0: 76 6f 69 64 29 30 0a 23 65 6e 64 69 66 0a 0a 2f  void)0.#endif../
c3f0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
c400: 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  on is part of th
c410: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
c420: 20 6f 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64 3a   of the command:
c430: 0a 2a 2a 0a 2a 2a 20 20 20 24 64 62 20 65 76 61  .**.**   $db eva
c440: 6c 20 53 51 4c 20 3f 41 52 52 41 59 4e 41 4d 45  l SQL ?ARRAYNAME
c450: 3f 20 53 43 52 49 50 54 0a 2a 2f 0a 73 74 61 74  ? SCRIPT.*/.stat
c460: 69 63 20 69 6e 74 20 44 62 45 76 61 6c 4e 65 78  ic int DbEvalNex
c470: 74 43 6d 64 28 0a 20 20 43 6c 69 65 6e 74 44 61  tCmd(.  ClientDa
c480: 74 61 20 64 61 74 61 5b 5d 2c 20 20 20 20 20 20  ta data[],      
c490: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c4a0: 64 61 74 61 5b 30 5d 20 69 73 20 74 68 65 20 28  data[0] is the (
c4b0: 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 2a 29 20  DbEvalContext*) 
c4c0: 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
c4d0: 2a 69 6e 74 65 72 70 2c 20 20 20 20 20 20 20 20  *interp,        
c4e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 63 6c            /* Tcl
c4f0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a   interpreter */.
c500: 20 20 69 6e 74 20 72 65 73 75 6c 74 20 20 20 20    int result    
c510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c520: 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
c530: 20 73 6f 20 66 61 72 20 2a 2f 0a 29 7b 0a 20 20   so far */.){.  
c540: 69 6e 74 20 72 63 20 3d 20 72 65 73 75 6c 74 3b  int rc = result;
c550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c560: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
c570: 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65  ode */..  /* The
c580: 20 66 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 6f   first element o
c590: 66 20 74 68 65 20 64 61 74 61 5b 5d 20 61 72 72  f the data[] arr
c5a0: 61 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ay is a pointer 
c5b0: 74 6f 20 61 20 44 62 45 76 61 6c 43 6f 6e 74 65  to a DbEvalConte
c5c0: 78 74 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72  xt.  ** structur
c5d0: 65 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e  e allocated usin
c5e0: 67 20 54 63 6c 5f 41 6c 6c 6f 63 28 29 2e 20 54  g Tcl_Alloc(). T
c5f0: 68 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e  he second elemen
c600: 74 20 6f 66 20 64 61 74 61 5b 5d 0a 20 20 2a 2a  t of data[].  **
c610: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
c620: 20 61 20 54 63 6c 5f 4f 62 6a 20 63 6f 6e 74 61   a Tcl_Obj conta
c630: 69 6e 69 6e 67 20 74 68 65 20 73 63 72 69 70 74  ining the script
c640: 20 74 6f 20 72 75 6e 20 66 6f 72 20 65 61 63 68   to run for each
c650: 20 72 6f 77 0a 20 20 2a 2a 20 72 65 74 75 72 6e   row.  ** return
c660: 65 64 20 62 79 20 74 68 65 20 71 75 65 72 69 65  ed by the querie
c670: 73 20 65 6e 63 61 70 73 75 6c 61 74 65 64 20 69  s encapsulated i
c680: 6e 20 64 61 74 61 5b 30 5d 2e 20 2a 2f 0a 20 20  n data[0]. */.  
c690: 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 70  DbEvalContext *p
c6a0: 20 3d 20 28 44 62 45 76 61 6c 43 6f 6e 74 65 78   = (DbEvalContex
c6b0: 74 20 2a 29 64 61 74 61 5b 30 5d 3b 0a 20 20 54  t *)data[0];.  T
c6c0: 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 20  cl_Obj *pScript 
c6d0: 3d 20 28 54 63 6c 5f 4f 62 6a 20 2a 29 64 61 74  = (Tcl_Obj *)dat
c6e0: 61 5b 31 5d 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  a[1];.  Tcl_Obj 
c6f0: 2a 70 41 72 72 61 79 20 3d 20 70 2d 3e 70 41 72  *pArray = p->pAr
c700: 72 61 79 3b 0a 0a 20 20 77 68 69 6c 65 28 20 28  ray;..  while( (
c710: 72 63 3d 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 72 63  rc==TCL_OK || rc
c720: 3d 3d 54 43 4c 5f 43 4f 4e 54 49 4e 55 45 29 20  ==TCL_CONTINUE) 
c730: 26 26 20 54 43 4c 5f 4f 4b 3d 3d 28 72 63 20 3d  && TCL_OK==(rc =
c740: 20 64 62 45 76 61 6c 53 74 65 70 28 70 29 29 20   dbEvalStep(p)) 
c750: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
c760: 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20    int nCol;.    
c770: 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 43 6f 6c 4e  Tcl_Obj **apColN
c780: 61 6d 65 3b 0a 20 20 20 20 64 62 45 76 61 6c 52  ame;.    dbEvalR
c790: 6f 77 49 6e 66 6f 28 70 2c 20 26 6e 43 6f 6c 2c  owInfo(p, &nCol,
c7a0: 20 26 61 70 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20   &apColName);.  
c7b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
c7c0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54  l; i++){.      T
c7d0: 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c 20 3d 20 64  cl_Obj *pVal = d
c7e0: 62 45 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65  bEvalColumnValue
c7f0: 28 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66  (p, i);.      if
c800: 28 20 70 41 72 72 61 79 3d 3d 30 20 29 7b 0a 20  ( pArray==0 ){. 
c810: 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65         Tcl_ObjSe
c820: 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 61 70  tVar2(interp, ap
c830: 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20 30 2c 20 70  ColName[i], 0, p
c840: 56 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  Val, 0);.      }
c850: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 54 63  else{.        Tc
c860: 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74  l_ObjSetVar2(int
c870: 65 72 70 2c 20 70 41 72 72 61 79 2c 20 61 70 43  erp, pArray, apC
c880: 6f 6c 4e 61 6d 65 5b 69 5d 2c 20 70 56 61 6c 2c  olName[i], pVal,
c890: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
c8a0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72   }..    /* The r
c8b0: 65 71 75 69 72 65 64 20 69 6e 74 65 72 70 72 65  equired interpre
c8c0: 74 65 72 20 76 61 72 69 61 62 6c 65 73 20 61 72  ter variables ar
c8d0: 65 20 6e 6f 77 20 70 6f 70 75 6c 61 74 65 64 20  e now populated 
c8e0: 77 69 74 68 20 74 68 65 20 64 61 74 61 20 0a 20  with the data . 
c8f0: 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 63     ** from the c
c900: 75 72 72 65 6e 74 20 72 6f 77 2e 20 49 66 20 75  urrent row. If u
c910: 73 69 6e 67 20 4e 52 45 2c 20 73 63 68 65 64 75  sing NRE, schedu
c920: 6c 65 20 63 61 6c 6c 62 61 63 6b 73 20 74 6f 20  le callbacks to 
c930: 65 76 61 6c 75 61 74 65 0a 20 20 20 20 2a 2a 20  evaluate.    ** 
c940: 73 63 72 69 70 74 20 70 53 63 72 69 70 74 2c 20  script pScript, 
c950: 74 68 65 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 74  then to invoke t
c960: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61  his function aga
c970: 69 6e 20 74 6f 20 66 65 74 63 68 20 74 68 65 20  in to fetch the 
c980: 6e 65 78 74 0a 20 20 20 20 2a 2a 20 72 6f 77 20  next.    ** row 
c990: 28 6f 72 20 63 6c 65 61 6e 20 75 70 20 69 66 20  (or clean up if 
c9a0: 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 78 74  there is no next
c9b0: 20 72 6f 77 20 6f 72 20 74 68 65 20 73 63 72 69   row or the scri
c9c0: 70 74 20 74 68 72 6f 77 73 20 61 6e 0a 20 20 20  pt throws an.   
c9d0: 20 2a 2a 20 65 78 63 65 70 74 69 6f 6e 29 2e 20   ** exception). 
c9e0: 41 66 74 65 72 20 73 63 68 65 64 75 6c 69 6e 67  After scheduling
c9f0: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 73 2c 20   the callbacks, 
ca00: 72 65 74 75 72 6e 20 63 6f 6e 74 72 6f 6c 20 74  return control t
ca10: 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 61  o the .    ** ca
ca20: 6c 6c 65 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ller..    **.   
ca30: 20 2a 2a 20 49 66 20 6e 6f 74 20 75 73 69 6e 67   ** If not using
ca40: 20 4e 52 45 2c 20 65 76 61 6c 75 61 74 65 20 70   NRE, evaluate p
ca50: 53 63 72 69 70 74 20 64 69 72 65 63 74 6c 79 20  Script directly 
ca60: 61 6e 64 20 63 6f 6e 74 69 6e 75 65 20 77 69 74  and continue wit
ca70: 68 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65 78  h the.    ** nex
ca80: 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
ca90: 68 69 73 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c  his while(...) l
caa0: 6f 6f 70 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  oop.  */.    if(
cab0: 20 44 62 55 73 65 4e 72 65 28 29 20 29 7b 0a 20   DbUseNre() ){. 
cac0: 20 20 20 20 20 54 63 6c 5f 4e 52 41 64 64 43 61       Tcl_NRAddCa
cad0: 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 44  llback(interp, D
cae0: 62 45 76 61 6c 4e 65 78 74 43 6d 64 2c 20 28 76  bEvalNextCmd, (v
caf0: 6f 69 64 2a 29 70 2c 20 28 76 6f 69 64 2a 29 70  oid*)p, (void*)p
cb00: 53 63 72 69 70 74 2c 20 30 2c 20 30 29 3b 0a 20  Script, 0, 0);. 
cb10: 20 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f       return Tcl_
cb20: 4e 52 45 76 61 6c 4f 62 6a 28 69 6e 74 65 72 70  NREvalObj(interp
cb30: 2c 20 70 53 63 72 69 70 74 2c 20 30 29 3b 0a 20  , pScript, 0);. 
cb40: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
cb50: 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  rc = Tcl_EvalObj
cb60: 45 78 28 69 6e 74 65 72 70 2c 20 70 53 63 72 69  Ex(interp, pScri
cb70: 70 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  pt, 0);.    }.  
cb80: 7d 0a 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66  }..  Tcl_DecrRef
cb90: 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a  Count(pScript);.
cba0: 20 20 64 62 45 76 61 6c 46 69 6e 61 6c 69 7a 65    dbEvalFinalize
cbb0: 28 70 29 3b 0a 20 20 54 63 6c 5f 46 72 65 65 28  (p);.  Tcl_Free(
cbc0: 28 63 68 61 72 20 2a 29 70 29 3b 0a 0a 20 20 69  (char *)p);..  i
cbd0: 66 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 7c 7c  f( rc==TCL_OK ||
cbe0: 20 72 63 3d 3d 54 43 4c 5f 42 52 45 41 4b 20 29   rc==TCL_BREAK )
cbf0: 7b 0a 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52  {.    Tcl_ResetR
cc00: 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
cc10: 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a     rc = TCL_OK;.
cc20: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
cc30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 22 73  .}../*.** The "s
cc40: 71 6c 69 74 65 22 20 63 6f 6d 6d 61 6e 64 20 62  qlite" command b
cc50: 65 6c 6f 77 20 63 72 65 61 74 65 73 20 61 20 6e  elow creates a n
cc60: 65 77 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 66  ew Tcl command f
cc70: 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6e 6e 65  or each.** conne
cc80: 63 74 69 6f 6e 20 69 74 20 6f 70 65 6e 73 20 74  ction it opens t
cc90: 6f 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61  o an SQLite data
cca0: 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74  base.  This rout
ccb0: 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 0a 2a  ine is invoked.*
ccc0: 2a 20 77 68 65 6e 65 76 65 72 20 6f 6e 65 20 6f  * whenever one o
ccd0: 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65 63 74 69  f those connecti
cce0: 6f 6e 2d 73 70 65 63 69 66 69 63 20 63 6f 6d 6d  on-specific comm
ccf0: 61 6e 64 73 20 69 73 20 65 78 65 63 75 74 65 64  ands is executed
cd00: 0a 2a 2a 20 69 6e 20 54 63 6c 2e 20 20 46 6f 72  .** in Tcl.  For
cd10: 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 79 6f 75   example, if you
cd20: 20 72 75 6e 20 54 63 6c 20 63 6f 64 65 20 6c 69   run Tcl code li
cd30: 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
cd40: 20 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 31       sqlite3 db1
cd50: 20 20 22 6d 79 5f 64 61 74 61 62 61 73 65 22 0a    "my_database".
cd60: 2a 2a 20 20 20 20 20 20 20 64 62 31 20 63 6c 6f  **       db1 clo
cd70: 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  se.**.** The fir
cd80: 73 74 20 63 6f 6d 6d 61 6e 64 20 6f 70 65 6e 73  st command opens
cd90: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f   a connection to
cda0: 20 74 68 65 20 22 6d 79 5f 64 61 74 61 62 61 73   the "my_databas
cdb0: 65 22 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 61  e" database.** a
cdc0: 6e 64 20 63 61 6c 6c 73 20 74 68 61 74 20 63 6f  nd calls that co
cdd0: 6e 6e 65 63 74 69 6f 6e 20 22 64 62 31 22 2e 20  nnection "db1". 
cde0: 20 54 68 65 20 73 65 63 6f 6e 64 20 63 6f 6d 6d   The second comm
cdf0: 61 6e 64 20 63 61 75 73 65 73 20 74 68 69 73 0a  and causes this.
ce00: 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f  ** subroutine to
ce10: 20 62 65 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a   be invoked..*/.
ce20: 73 74 61 74 69 63 20 69 6e 74 20 44 62 4f 62 6a  static int DbObj
ce30: 43 6d 64 28 76 6f 69 64 20 2a 63 64 2c 20 54 63  Cmd(void *cd, Tc
ce40: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
ce50: 2c 20 69 6e 74 20 6f 62 6a 63 2c 54 63 6c 5f 4f  , int objc,Tcl_O
ce60: 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76 29 7b  bj *const*objv){
ce70: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
ce80: 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64   = (SqliteDb*)cd
ce90: 3b 0a 20 20 69 6e 74 20 63 68 6f 69 63 65 3b 0a  ;.  int choice;.
cea0: 20 20 69 6e 74 20 72 63 20 3d 20 54 43 4c 5f 4f    int rc = TCL_O
ceb0: 4b 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  K;.  static cons
cec0: 74 20 63 68 61 72 20 2a 44 42 5f 73 74 72 73 5b  t char *DB_strs[
ced0: 5d 20 3d 20 7b 0a 20 20 20 20 22 61 75 74 68 6f  ] = {.    "autho
cee0: 72 69 7a 65 72 22 2c 20 20 20 20 20 20 20 20 20  rizer",         
cef0: 22 62 61 63 6b 75 70 22 2c 20 20 20 20 20 20 20  "backup",       
cf00: 20 20 20 20 20 22 62 75 73 79 22 2c 0a 20 20 20       "busy",.   
cf10: 20 22 63 61 63 68 65 22 2c 20 20 20 20 20 20 20   "cache",       
cf20: 20 20 20 20 20 20 20 22 63 68 61 6e 67 65 73 22         "changes"
cf30: 2c 20 20 20 20 20 20 20 20 20 20 20 22 63 6c 6f  ,           "clo
cf40: 73 65 22 2c 0a 20 20 20 20 22 63 6f 6c 6c 61 74  se",.    "collat
cf50: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 22  e",            "
cf60: 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64  collation_needed
cf70: 22 2c 20 20 22 63 6f 6d 6d 69 74 5f 68 6f 6f 6b  ",  "commit_hook
cf80: 22 2c 0a 20 20 20 20 22 63 6f 6d 70 6c 65 74 65  ",.    "complete
cf90: 22 2c 20 20 20 20 20 20 20 20 20 20 20 22 63 6f  ",           "co
cfa0: 70 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  py",            
cfb0: 20 20 22 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65    "enable_load_e
cfc0: 78 74 65 6e 73 69 6f 6e 22 2c 0a 20 20 20 20 22  xtension",.    "
cfd0: 65 72 72 6f 72 63 6f 64 65 22 2c 20 20 20 20 20  errorcode",     
cfe0: 20 20 20 20 20 22 65 76 61 6c 22 2c 20 20 20 20       "eval",    
cff0: 20 20 20 20 20 20 20 20 20 20 22 65 78 69 73 74            "exist
d000: 73 22 2c 0a 20 20 20 20 22 66 75 6e 63 74 69 6f  s",.    "functio
d010: 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20 22 69  n",           "i
d020: 6e 63 72 62 6c 6f 62 22 2c 20 20 20 20 20 20 20  ncrblob",       
d030: 20 20 20 22 69 6e 74 65 72 72 75 70 74 22 2c 0a     "interrupt",.
d040: 20 20 20 20 22 6c 61 73 74 5f 69 6e 73 65 72 74      "last_insert
d050: 5f 72 6f 77 69 64 22 2c 20 20 22 6e 75 6c 6c 76  _rowid",  "nullv
d060: 61 6c 75 65 22 2c 20 20 20 20 20 20 20 20 20 22  alue",         "
d070: 6f 6e 65 63 6f 6c 75 6d 6e 22 2c 0a 20 20 20 20  onecolumn",.    
d080: 22 70 72 6f 66 69 6c 65 22 2c 20 20 20 20 20 20  "profile",      
d090: 20 20 20 20 20 20 22 70 72 6f 67 72 65 73 73 22        "progress"
d0a0: 2c 20 20 20 20 20 20 20 20 20 20 22 72 65 6b 65  ,          "reke
d0b0: 79 22 2c 0a 20 20 20 20 22 72 65 73 74 6f 72 65  y",.    "restore
d0c0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 22 72  ",            "r
d0d0: 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 22 2c 20 20  ollback_hook",  
d0e0: 20 20 20 22 73 74 61 74 75 73 22 2c 0a 20 20 20     "status",.   
d0f0: 20 22 74 69 6d 65 6f 75 74 22 2c 20 20 20 20 20   "timeout",     
d100: 20 20 20 20 20 20 20 22 74 6f 74 61 6c 5f 63 68         "total_ch
d110: 61 6e 67 65 73 22 2c 20 20 20 20 20 22 74 72 61  anges",     "tra
d120: 63 65 22 2c 0a 20 20 20 20 22 74 72 61 6e 73 61  ce",.    "transa
d130: 63 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 20 22  ction",        "
d140: 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 22 2c 20  unlock_notify", 
d150: 20 20 20 20 22 75 70 64 61 74 65 5f 68 6f 6f 6b      "update_hook
d160: 22 2c 0a 20 20 20 20 22 76 65 72 73 69 6f 6e 22  ",.    "version"
d170: 2c 20 20 20 20 20 20 20 20 20 20 20 20 22 77 61  ,            "wa
d180: 6c 5f 68 6f 6f 6b 22 2c 20 20 20 20 20 20 20 20  l_hook",        
d190: 20 20 30 0a 20 20 7d 3b 0a 20 20 65 6e 75 6d 20    0.  };.  enum 
d1a0: 44 42 5f 65 6e 75 6d 20 7b 0a 20 20 20 20 44 42  DB_enum {.    DB
d1b0: 5f 41 55 54 48 4f 52 49 5a 45 52 2c 20 20 20 20  _AUTHORIZER,    
d1c0: 20 20 20 20 44 42 5f 42 41 43 4b 55 50 2c 20 20      DB_BACKUP,  
d1d0: 20 20 20 20 20 20 20 20 20 44 42 5f 42 55 53 59           DB_BUSY
d1e0: 2c 0a 20 20 20 20 44 42 5f 43 41 43 48 45 2c 20  ,.    DB_CACHE, 
d1f0: 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 43              DB_C
d200: 48 41 4e 47 45 53 2c 20 20 20 20 20 20 20 20 20  HANGES,         
d210: 20 44 42 5f 43 4c 4f 53 45 2c 0a 20 20 20 20 44   DB_CLOSE,.    D
d220: 42 5f 43 4f 4c 4c 41 54 45 2c 20 20 20 20 20 20  B_COLLATE,      
d230: 20 20 20 20 20 44 42 5f 43 4f 4c 4c 41 54 49 4f       DB_COLLATIO
d240: 4e 5f 4e 45 45 44 45 44 2c 20 44 42 5f 43 4f 4d  N_NEEDED, DB_COM
d250: 4d 49 54 5f 48 4f 4f 4b 2c 0a 20 20 20 20 44 42  MIT_HOOK,.    DB
d260: 5f 43 4f 4d 50 4c 45 54 45 2c 20 20 20 20 20 20  _COMPLETE,      
d270: 20 20 20 20 44 42 5f 43 4f 50 59 2c 20 20 20 20      DB_COPY,    
d280: 20 20 20 20 20 20 20 20 20 44 42 5f 45 4e 41 42           DB_ENAB
d290: 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  LE_LOAD_EXTENSIO
d2a0: 4e 2c 0a 20 20 20 20 44 42 5f 45 52 52 4f 52 43  N,.    DB_ERRORC
d2b0: 4f 44 45 2c 20 20 20 20 20 20 20 20 20 44 42 5f  ODE,         DB_
d2c0: 45 56 41 4c 2c 20 20 20 20 20 20 20 20 20 20 20  EVAL,           
d2d0: 20 20 44 42 5f 45 58 49 53 54 53 2c 0a 20 20 20    DB_EXISTS,.   
d2e0: 20 44 42 5f 46 55 4e 43 54 49 4f 4e 2c 20 20 20   DB_FUNCTION,   
d2f0: 20 20 20 20 20 20 20 44 42 5f 49 4e 43 52 42 4c         DB_INCRBL
d300: 4f 42 2c 20 20 20 20 20 20 20 20 20 44 42 5f 49  OB,         DB_I
d310: 4e 54 45 52 52 55 50 54 2c 0a 20 20 20 20 44 42  NTERRUPT,.    DB
d320: 5f 4c 41 53 54 5f 49 4e 53 45 52 54 5f 52 4f 57  _LAST_INSERT_ROW
d330: 49 44 2c 20 44 42 5f 4e 55 4c 4c 56 41 4c 55 45  ID, DB_NULLVALUE
d340: 2c 20 20 20 20 20 20 20 20 44 42 5f 4f 4e 45 43  ,        DB_ONEC
d350: 4f 4c 55 4d 4e 2c 0a 20 20 20 20 44 42 5f 50 52  OLUMN,.    DB_PR
d360: 4f 46 49 4c 45 2c 20 20 20 20 20 20 20 20 20 20  OFILE,          
d370: 20 44 42 5f 50 52 4f 47 52 45 53 53 2c 20 20 20   DB_PROGRESS,   
d380: 20 20 20 20 20 20 44 42 5f 52 45 4b 45 59 2c 0a        DB_REKEY,.
d390: 20 20 20 20 44 42 5f 52 45 53 54 4f 52 45 2c 20      DB_RESTORE, 
d3a0: 20 20 20 20 20 20 20 20 20 20 44 42 5f 52 4f 4c            DB_ROL
d3b0: 4c 42 41 43 4b 5f 48 4f 4f 4b 2c 20 20 20 20 44  LBACK_HOOK,    D
d3c0: 42 5f 53 54 41 54 55 53 2c 0a 20 20 20 20 44 42  B_STATUS,.    DB
d3d0: 5f 54 49 4d 45 4f 55 54 2c 20 20 20 20 20 20 20  _TIMEOUT,       
d3e0: 20 20 20 20 44 42 5f 54 4f 54 41 4c 5f 43 48 41      DB_TOTAL_CHA
d3f0: 4e 47 45 53 2c 20 20 20 20 44 42 5f 54 52 41 43  NGES,    DB_TRAC
d400: 45 2c 0a 20 20 20 20 44 42 5f 54 52 41 4e 53 41  E,.    DB_TRANSA
d410: 43 54 49 4f 4e 2c 20 20 20 20 20 20 20 44 42 5f  CTION,       DB_
d420: 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 2c 20 20  UNLOCK_NOTIFY,  
d430: 20 20 44 42 5f 55 50 44 41 54 45 5f 48 4f 4f 4b    DB_UPDATE_HOOK
d440: 2c 0a 20 20 20 20 44 42 5f 56 45 52 53 49 4f 4e  ,.    DB_VERSION
d450: 2c 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 57  ,           DB_W
d460: 41 4c 5f 48 4f 4f 4b 0a 20 20 7d 3b 0a 20 20 2f  AL_HOOK.  };.  /
d470: 2a 20 64 6f 6e 27 74 20 6c 65 61 76 65 20 74 72  * don't leave tr
d480: 61 69 6c 69 6e 67 20 63 6f 6d 6d 61 73 20 6f 6e  ailing commas on
d490: 20 44 42 5f 65 6e 75 6d 2c 20 69 74 20 63 6f 6e   DB_enum, it con
d4a0: 66 75 73 65 73 20 74 68 65 20 41 49 58 20 78 6c  fuses the AIX xl
d4b0: 63 20 63 6f 6d 70 69 6c 65 72 20 2a 2f 0a 0a 20  c compiler */.. 
d4c0: 20 69 66 28 20 6f 62 6a 63 3c 32 20 29 7b 0a 20   if( objc<2 ){. 
d4d0: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
d4e0: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
d4f0: 62 6a 76 2c 20 22 53 55 42 43 4f 4d 4d 41 4e 44  bjv, "SUBCOMMAND
d500: 20 2e 2e 2e 22 29 3b 0a 20 20 20 20 72 65 74 75   ...");.    retu
d510: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
d520: 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  }.  if( Tcl_GetI
d530: 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  ndexFromObj(inte
d540: 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 44 42 5f  rp, objv[1], DB_
d550: 73 74 72 73 2c 20 22 6f 70 74 69 6f 6e 22 2c 20  strs, "option", 
d560: 30 2c 20 26 63 68 6f 69 63 65 29 20 29 7b 0a 20  0, &choice) ){. 
d570: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
d580: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74  ROR;.  }..  swit
d590: 63 68 28 20 28 65 6e 75 6d 20 44 42 5f 65 6e 75  ch( (enum DB_enu
d5a0: 6d 29 63 68 6f 69 63 65 20 29 7b 0a 0a 20 20 2f  m)choice ){..  /
d5b0: 2a 20 20 20 20 24 64 62 20 61 75 74 68 6f 72 69  *    $db authori
d5c0: 7a 65 72 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20  zer ?CALLBACK?. 
d5d0: 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20   **.  ** Invoke 
d5e0: 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62 61  the given callba
d5f0: 63 6b 20 74 6f 20 61 75 74 68 6f 72 69 7a 65 20  ck to authorize 
d600: 65 61 63 68 20 53 51 4c 20 6f 70 65 72 61 74 69  each SQL operati
d610: 6f 6e 20 61 73 20 69 74 20 69 73 0a 20 20 2a 2a  on as it is.  **
d620: 20 63 6f 6d 70 69 6c 65 64 2e 20 20 35 20 61 72   compiled.  5 ar
d630: 67 75 6d 65 6e 74 73 20 61 72 65 20 61 70 70 65  guments are appe
d640: 6e 64 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  nded to the call
d650: 62 61 63 6b 20 62 65 66 6f 72 65 20 69 74 20 69  back before it i
d660: 73 0a 20 20 2a 2a 20 69 6e 76 6f 6b 65 64 3a 0a  s.  ** invoked:.
d670: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 31 29 20    **.  **   (1) 
d680: 54 68 65 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  The authorizatio
d690: 6e 20 74 79 70 65 20 28 65 78 3a 20 53 51 4c 49  n type (ex: SQLI
d6a0: 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 2c  TE_CREATE_TABLE,
d6b0: 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20   SQLITE_INSERT, 
d6c0: 2e 2e 2e 29 0a 20 20 2a 2a 20 20 20 28 32 29 20  ...).  **   (2) 
d6d0: 46 69 72 73 74 20 64 65 73 63 72 69 70 74 69 76  First descriptiv
d6e0: 65 20 6e 61 6d 65 20 28 64 65 70 65 6e 64 73 20  e name (depends 
d6f0: 6f 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  on authorization
d700: 20 74 79 70 65 29 0a 20 20 2a 2a 20 20 20 28 33   type).  **   (3
d710: 29 20 53 65 63 6f 6e 64 20 64 65 73 63 72 69 70  ) Second descrip
d720: 74 69 76 65 20 6e 61 6d 65 0a 20 20 2a 2a 20 20  tive name.  **  
d730: 20 28 34 29 20 4e 61 6d 65 20 6f 66 20 74 68 65   (4) Name of the
d740: 20 64 61 74 61 62 61 73 65 20 28 65 78 3a 20 22   database (ex: "
d750: 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 29 0a 20  main", "temp"). 
d760: 20 2a 2a 20 20 20 28 35 29 20 4e 61 6d 65 20 6f   **   (5) Name o
d770: 66 20 74 72 69 67 67 65 72 20 74 68 61 74 20 69  f trigger that i
d780: 73 20 64 6f 69 6e 67 20 74 68 65 20 61 63 63 65  s doing the acce
d790: 73 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  ss.  **.  ** The
d7a0: 20 63 61 6c 6c 62 61 63 6b 20 73 68 6f 75 6c 64   callback should
d7b0: 20 72 65 74 75 72 6e 20 6f 6e 20 6f 66 20 74 68   return on of th
d7c0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 69  e following stri
d7d0: 6e 67 73 3a 20 53 51 4c 49 54 45 5f 4f 4b 2c 0a  ngs: SQLITE_OK,.
d7e0: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f    ** SQLITE_IGNO
d7f0: 52 45 2c 20 6f 72 20 53 51 4c 49 54 45 5f 44 45  RE, or SQLITE_DE
d800: 4e 59 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72  NY.  Any other r
d810: 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61  eturn value is a
d820: 6e 20 65 72 72 6f 72 2e 0a 20 20 2a 2a 0a 20 20  n error..  **.  
d830: 2a 2a 20 49 66 20 74 68 69 73 20 6d 65 74 68 6f  ** If this metho
d840: 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 77 69 74  d is invoked wit
d850: 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 2c 20  h no arguments, 
d860: 74 68 65 20 63 75 72 72 65 6e 74 20 61 75 74 68  the current auth
d870: 6f 72 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 63  orization.  ** c
d880: 61 6c 6c 62 61 63 6b 20 73 74 72 69 6e 67 20 69  allback string i
d890: 73 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2f  s returned..  */
d8a0: 0a 20 20 63 61 73 65 20 44 42 5f 41 55 54 48 4f  .  case DB_AUTHO
d8b0: 52 49 5a 45 52 3a 20 7b 0a 23 69 66 64 65 66 20  RIZER: {.#ifdef 
d8c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
d8d0: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 54 63  ORIZATION.    Tc
d8e0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
d8f0: 6e 74 65 72 70 2c 20 22 61 75 74 68 6f 72 69 7a  nterp, "authoriz
d900: 61 74 69 6f 6e 20 6e 6f 74 20 61 76 61 69 6c 61  ation not availa
d910: 62 6c 65 20 69 6e 20 74 68 69 73 20 62 75 69 6c  ble in this buil
d920: 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  d",.            
d930: 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
d940: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
d950: 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a  CL_ERROR;.#else.
d960: 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29      if( objc>3 )
d970: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
d980: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
d990: 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c   2, objv, "?CALL
d9a0: 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72  BACK?");.      r
d9b0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
d9c0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
d9d0: 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  bjc==2 ){.      
d9e0: 69 66 28 20 70 44 62 2d 3e 7a 41 75 74 68 20 29  if( pDb->zAuth )
d9f0: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70  {.        Tcl_Ap
da00: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
da10: 70 2c 20 70 44 62 2d 3e 7a 41 75 74 68 2c 20 28  p, pDb->zAuth, (
da20: 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
da30: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
da40: 20 20 20 63 68 61 72 20 2a 7a 41 75 74 68 3b 0a     char *zAuth;.
da50: 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20        int len;. 
da60: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 41       if( pDb->zA
da70: 75 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 54  uth ){.        T
da80: 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 41 75  cl_Free(pDb->zAu
da90: 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  th);.      }.   
daa0: 20 20 20 7a 41 75 74 68 20 3d 20 54 63 6c 5f 47     zAuth = Tcl_G
dab0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
dac0: 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a  objv[2], &len);.
dad0: 20 20 20 20 20 20 69 66 28 20 7a 41 75 74 68 20        if( zAuth 
dae0: 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20  && len>0 ){.    
daf0: 20 20 20 20 70 44 62 2d 3e 7a 41 75 74 68 20 3d      pDb->zAuth =
db00: 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20   Tcl_Alloc( len 
db10: 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d  + 1 );.        m
db20: 65 6d 63 70 79 28 70 44 62 2d 3e 7a 41 75 74 68  emcpy(pDb->zAuth
db30: 2c 20 7a 41 75 74 68 2c 20 6c 65 6e 2b 31 29 3b  , zAuth, len+1);
db40: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
db50: 20 20 20 20 20 20 70 44 62 2d 3e 7a 41 75 74 68        pDb->zAuth
db60: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
db70: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75      if( pDb->zAu
db80: 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 74 79  th ){.        ty
db90: 70 65 64 65 66 20 69 6e 74 20 28 2a 73 71 6c 69  pedef int (*sqli
dba0: 74 65 33 5f 61 75 74 68 5f 63 62 29 28 0a 20 20  te3_auth_cb)(.  
dbb0: 20 20 20 20 20 20 20 20 20 76 6f 69 64 2a 2c 69           void*,i
dbc0: 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63  nt,const char*,c
dbd0: 6f 6e 73 74 20 63 68 61 72 2a 2c 0a 20 20 20 20  onst char*,.    
dbe0: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
dbf0: 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b  r*,const char*);
dc00: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e  .        pDb->in
dc10: 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20  terp = interp;. 
dc20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
dc30: 65 74 5f 61 75 74 68 6f 72 69 7a 65 72 28 70 44  et_authorizer(pD
dc40: 62 2d 3e 64 62 2c 28 73 71 6c 69 74 65 33 5f 61  b->db,(sqlite3_a
dc50: 75 74 68 5f 63 62 29 61 75 74 68 5f 63 61 6c 6c  uth_cb)auth_call
dc60: 62 61 63 6b 2c 70 44 62 29 3b 0a 20 20 20 20 20  back,pDb);.     
dc70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
dc80: 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75 74 68  sqlite3_set_auth
dc90: 6f 72 69 7a 65 72 28 70 44 62 2d 3e 64 62 2c 20  orizer(pDb->db, 
dca0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  0, 0);.      }. 
dcb0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
dcc0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
dcd0: 20 20 20 20 24 64 62 20 62 61 63 6b 75 70 20 3f      $db backup ?
dce0: 44 41 54 41 42 41 53 45 3f 20 46 49 4c 45 4e 41  DATABASE? FILENA
dcf0: 4d 45 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 70 65  ME.  **.  ** Ope
dd00: 6e 20 6f 72 20 63 72 65 61 74 65 20 61 20 64 61  n or create a da
dd10: 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65  tabase file name
dd20: 64 20 46 49 4c 45 4e 41 4d 45 2e 20 20 54 72 61  d FILENAME.  Tra
dd30: 6e 73 66 65 72 20 74 68 65 0a 20 20 2a 2a 20 63  nsfer the.  ** c
dd40: 6f 6e 74 65 6e 74 20 6f 66 20 6c 6f 63 61 6c 20  ontent of local 
dd50: 64 61 74 61 62 61 73 65 20 44 41 54 41 42 41 53  database DATABAS
dd60: 45 20 28 64 65 66 61 75 6c 74 3a 20 22 6d 61 69  E (default: "mai
dd70: 6e 22 29 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a  n") into the.  *
dd80: 2a 20 46 49 4c 45 4e 41 4d 45 20 64 61 74 61 62  * FILENAME datab
dd90: 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ase..  */.  case
dda0: 20 44 42 5f 42 41 43 4b 55 50 3a 20 7b 0a 20 20   DB_BACKUP: {.  
ddb0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
ddc0: 65 73 74 46 69 6c 65 3b 0a 20 20 20 20 63 6f 6e  estFile;.    con
ddd0: 73 74 20 63 68 61 72 20 2a 7a 53 72 63 44 62 3b  st char *zSrcDb;
dde0: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 70 44  .    sqlite3 *pD
ddf0: 65 73 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  est;.    sqlite3
de00: 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b 75 70  _backup *pBackup
de10: 3b 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d  ;..    if( objc=
de20: 3d 33 20 29 7b 0a 20 20 20 20 20 20 7a 53 72 63  =3 ){.      zSrc
de30: 44 62 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20  Db = "main";.   
de40: 20 20 20 7a 44 65 73 74 46 69 6c 65 20 3d 20 54     zDestFile = T
de50: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
de60: 76 5b 32 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  v[2]);.    }else
de70: 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a   if( objc==4 ){.
de80: 20 20 20 20 20 20 7a 53 72 63 44 62 20 3d 20 54        zSrcDb = T
de90: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
dea0: 76 5b 32 5d 29 3b 0a 20 20 20 20 20 20 7a 44 65  v[2]);.      zDe
deb0: 73 74 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74  stFile = Tcl_Get
dec0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b  String(objv[3]);
ded0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
dee0: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
def0: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
df00: 6a 76 2c 20 22 3f 44 41 54 41 42 41 53 45 3f 20  jv, "?DATABASE? 
df10: 46 49 4c 45 4e 41 4d 45 22 29 3b 0a 20 20 20 20  FILENAME");.    
df20: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
df30: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  OR;.    }.    rc
df40: 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28   = sqlite3_open(
df50: 7a 44 65 73 74 46 69 6c 65 2c 20 26 70 44 65 73  zDestFile, &pDes
df60: 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  t);.    if( rc!=
df70: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
df80: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
df90: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 61 6e  ult(interp, "can
dfa0: 6e 6f 74 20 6f 70 65 6e 20 74 61 72 67 65 74 20  not open target 
dfb0: 64 61 74 61 62 61 73 65 3a 20 22 2c 0a 20 20 20  database: ",.   
dfc0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
dfd0: 65 72 72 6d 73 67 28 70 44 65 73 74 29 2c 20 28  errmsg(pDest), (
dfe0: 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
dff0: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 44  sqlite3_close(pD
e000: 65 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  est);.      retu
e010: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
e020: 20 20 7d 0a 20 20 20 20 70 42 61 63 6b 75 70 20    }.    pBackup 
e030: 3d 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70  = sqlite3_backup
e040: 5f 69 6e 69 74 28 70 44 65 73 74 2c 20 22 6d 61  _init(pDest, "ma
e050: 69 6e 22 2c 20 70 44 62 2d 3e 64 62 2c 20 7a 53  in", pDb->db, zS
e060: 72 63 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70  rcDb);.    if( p
e070: 42 61 63 6b 75 70 3d 3d 30 20 29 7b 0a 20 20 20  Backup==0 ){.   
e080: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
e090: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 63  ult(interp, "bac
e0a0: 6b 75 70 20 66 61 69 6c 65 64 3a 20 22 2c 0a 20  kup failed: ",. 
e0b0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
e0c0: 33 5f 65 72 72 6d 73 67 28 70 44 65 73 74 29 2c  3_errmsg(pDest),
e0d0: 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
e0e0: 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28    sqlite3_close(
e0f0: 70 44 65 73 74 29 3b 0a 20 20 20 20 20 20 72 65  pDest);.      re
e100: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
e110: 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28      }.    while(
e120: 20 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f    (rc = sqlite3_
e130: 62 61 63 6b 75 70 5f 73 74 65 70 28 70 42 61 63  backup_step(pBac
e140: 6b 75 70 2c 31 30 30 29 29 3d 3d 53 51 4c 49 54  kup,100))==SQLIT
e150: 45 5f 4f 4b 20 29 7b 7d 0a 20 20 20 20 73 71 6c  E_OK ){}.    sql
e160: 69 74 65 33 5f 62 61 63 6b 75 70 5f 66 69 6e 69  ite3_backup_fini
e170: 73 68 28 70 42 61 63 6b 75 70 29 3b 0a 20 20 20  sh(pBackup);.   
e180: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
e190: 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 72 63  DONE ){.      rc
e1a0: 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d   = TCL_OK;.    }
e1b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f  else{.      Tcl_
e1c0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
e1d0: 65 72 70 2c 20 22 62 61 63 6b 75 70 20 66 61 69  erp, "backup fai
e1e0: 6c 65 64 3a 20 22 2c 0a 20 20 20 20 20 20 20 20  led: ",.        
e1f0: 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73     sqlite3_errms
e200: 67 28 70 44 65 73 74 29 2c 20 28 63 68 61 72 2a  g(pDest), (char*
e210: 29 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  )0);.      rc = 
e220: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
e230: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f  .    sqlite3_clo
e240: 73 65 28 70 44 65 73 74 29 3b 0a 20 20 20 20 62  se(pDest);.    b
e250: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  reak;.  }..  /* 
e260: 20 20 20 24 64 62 20 62 75 73 79 20 3f 43 41 4c     $db busy ?CAL
e270: 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a  LBACK?.  **.  **
e280: 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65   Invoke the give
e290: 6e 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 61 6e  n callback if an
e2a0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61   SQL statement a
e2b0: 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 0a  ttempts to open.
e2c0: 20 20 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 64 61    ** a locked da
e2d0: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a  tabase file..  *
e2e0: 2f 0a 20 20 63 61 73 65 20 44 42 5f 42 55 53 59  /.  case DB_BUSY
e2f0: 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  : {.    if( objc
e300: 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  >3 ){.      Tcl_
e310: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
e320: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 43  erp, 2, objv, "C
e330: 41 4c 4c 42 41 43 4b 22 29 3b 0a 20 20 20 20 20  ALLBACK");.     
e340: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
e350: 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  R;.    }else if(
e360: 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20   objc==2 ){.    
e370: 20 20 69 66 28 20 70 44 62 2d 3e 7a 42 75 73 79    if( pDb->zBusy
e380: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
e390: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
e3a0: 65 72 70 2c 20 70 44 62 2d 3e 7a 42 75 73 79 2c  erp, pDb->zBusy,
e3b0: 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
e3c0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
e3d0: 20 20 20 20 20 63 68 61 72 20 2a 7a 42 75 73 79       char *zBusy
e3e0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b  ;.      int len;
e3f0: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
e400: 7a 42 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20  zBusy ){.       
e410: 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
e420: 42 75 73 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Busy);.      }. 
e430: 20 20 20 20 20 7a 42 75 73 79 20 3d 20 54 63 6c       zBusy = Tcl
e440: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
e450: 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29  j(objv[2], &len)
e460: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 42 75 73  ;.      if( zBus
e470: 79 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20  y && len>0 ){.  
e480: 20 20 20 20 20 20 70 44 62 2d 3e 7a 42 75 73 79        pDb->zBusy
e490: 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65   = Tcl_Alloc( le
e4a0: 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20  n + 1 );.       
e4b0: 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 42 75   memcpy(pDb->zBu
e4c0: 73 79 2c 20 7a 42 75 73 79 2c 20 6c 65 6e 2b 31  sy, zBusy, len+1
e4d0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
e4e0: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 42 75          pDb->zBu
e4f0: 73 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  sy = 0;.      }.
e500: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
e510: 42 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Busy ){.        
e520: 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e  pDb->interp = in
e530: 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71  terp;.        sq
e540: 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c  lite3_busy_handl
e550: 65 72 28 70 44 62 2d 3e 64 62 2c 20 44 62 42 75  er(pDb->db, DbBu
e560: 73 79 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b  syHandler, pDb);
e570: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
e580: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75        sqlite3_bu
e590: 73 79 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e  sy_handler(pDb->
e5a0: 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  db, 0, 0);.     
e5b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65   }.    }.    bre
e5c0: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
e5d0: 20 20 24 64 62 20 63 61 63 68 65 20 66 6c 75 73    $db cache flus
e5e0: 68 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 63  h.  **     $db c
e5f0: 61 63 68 65 20 73 69 7a 65 20 6e 0a 20 20 2a 2a  ache size n.  **
e600: 0a 20 20 2a 2a 20 46 6c 75 73 68 20 74 68 65 20  .  ** Flush the 
e610: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
e620: 6e 74 20 63 61 63 68 65 2c 20 6f 72 20 73 65 74  nt cache, or set
e630: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
e640: 62 65 72 20 6f 66 0a 20 20 2a 2a 20 63 61 63 68  ber of.  ** cach
e650: 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20  ed statements.. 
e660: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 41   */.  case DB_CA
e670: 43 48 45 3a 20 7b 0a 20 20 20 20 63 68 61 72 20  CHE: {.    char 
e680: 2a 73 75 62 43 6d 64 3b 0a 20 20 20 20 69 6e 74  *subCmd;.    int
e690: 20 6e 3b 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a   n;..    if( obj
e6a0: 63 3c 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63  c<=2 ){.      Tc
e6b0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
e6c0: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
e6d0: 22 63 61 63 68 65 20 6f 70 74 69 6f 6e 20 3f 61  "cache option ?a
e6e0: 72 67 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74  rg?");.      ret
e6f0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
e700: 20 20 20 7d 0a 20 20 20 20 73 75 62 43 6d 64 20     }.    subCmd 
e710: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
e720: 72 6f 6d 4f 62 6a 28 20 6f 62 6a 76 5b 32 5d 2c  romObj( objv[2],
e730: 20 30 20 29 3b 0a 20 20 20 20 69 66 28 20 2a 73   0 );.    if( *s
e740: 75 62 43 6d 64 3d 3d 27 66 27 20 26 26 20 73 74  ubCmd=='f' && st
e750: 72 63 6d 70 28 73 75 62 43 6d 64 2c 22 66 6c 75  rcmp(subCmd,"flu
e760: 73 68 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  sh")==0 ){.     
e770: 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
e780: 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e          Tcl_Wron
e790: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
e7a0: 20 32 2c 20 6f 62 6a 76 2c 20 22 66 6c 75 73 68   2, objv, "flush
e7b0: 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ");.        retu
e7c0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
e7d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e7e0: 20 20 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68     flushStmtCach
e7f0: 65 28 20 70 44 62 20 29 3b 0a 20 20 20 20 20 20  e( pDb );.      
e800: 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
e810: 2a 73 75 62 43 6d 64 3d 3d 27 73 27 20 26 26 20  *subCmd=='s' && 
e820: 73 74 72 63 6d 70 28 73 75 62 43 6d 64 2c 22 73  strcmp(subCmd,"s
e830: 69 7a 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ize")==0 ){.    
e840: 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b    if( objc!=4 ){
e850: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  .        Tcl_Wro
e860: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
e870: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 73 69 7a 65  , 2, objv, "size
e880: 20 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65   n");.        re
e890: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
e8a0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e8b0: 20 20 20 20 20 69 66 28 20 54 43 4c 5f 45 52 52       if( TCL_ERR
e8c0: 4f 52 3d 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72  OR==Tcl_GetIntFr
e8d0: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
e8e0: 6a 76 5b 33 5d 2c 20 26 6e 29 20 29 7b 0a 20 20  jv[3], &n) ){.  
e8f0: 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65          Tcl_Appe
e900: 6e 64 52 65 73 75 6c 74 28 20 69 6e 74 65 72 70  ndResult( interp
e910: 2c 20 22 63 61 6e 6e 6f 74 20 63 6f 6e 76 65 72  , "cannot conver
e920: 74 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 20  t \"", .        
e930: 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
e940: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
e950: 5b 33 5d 2c 30 29 2c 20 22 5c 22 20 74 6f 20 69  [3],0), "\" to i
e960: 6e 74 65 67 65 72 22 2c 20 28 63 68 61 72 2a 29  nteger", (char*)
e970: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  0);.          re
e980: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
e990: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
e9a0: 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 3c 30           if( n<0
e9b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
e9c0: 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28 20  flushStmtCache( 
e9d0: 70 44 62 20 29 3b 0a 20 20 20 20 20 20 20 20 20  pDb );.         
e9e0: 20 20 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20     n = 0;.      
e9f0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3e      }else if( n>
ea00: 4d 41 58 5f 50 52 45 50 41 52 45 44 5f 53 54 4d  MAX_PREPARED_STM
ea10: 54 53 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  TS ){.          
ea20: 20 20 6e 20 3d 20 4d 41 58 5f 50 52 45 50 41 52    n = MAX_PREPAR
ea30: 45 44 5f 53 54 4d 54 53 3b 0a 20 20 20 20 20 20  ED_STMTS;.      
ea40: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
ea50: 70 44 62 2d 3e 6d 61 78 53 74 6d 74 20 3d 20 6e  pDb->maxStmt = n
ea60: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
ea70: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
ea80: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
ea90: 65 73 75 6c 74 28 20 69 6e 74 65 72 70 2c 20 22  esult( interp, "
eaa0: 62 61 64 20 6f 70 74 69 6f 6e 20 5c 22 22 2c 20  bad option \"", 
eab0: 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47  .          Tcl_G
eac0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
ead0: 6f 62 6a 76 5b 32 5d 2c 30 29 2c 20 22 5c 22 3a  objv[2],0), "\":
eae0: 20 6d 75 73 74 20 62 65 20 66 6c 75 73 68 20 6f   must be flush o
eaf0: 72 20 73 69 7a 65 22 2c 0a 20 20 20 20 20 20 20  r size",.       
eb00: 20 20 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20     (char*)0);.  
eb10: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
eb20: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
eb30: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
eb40: 20 20 20 20 20 24 64 62 20 63 68 61 6e 67 65 73       $db changes
eb50: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72  .  **.  ** Retur
eb60: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
eb70: 72 6f 77 73 20 74 68 61 74 20 77 65 72 65 20 6d  rows that were m
eb80: 6f 64 69 66 69 65 64 2c 20 69 6e 73 65 72 74 65  odified, inserte
eb90: 64 2c 20 6f 72 20 64 65 6c 65 74 65 64 20 62 79  d, or deleted by
eba0: 0a 20 20 2a 2a 20 74 68 65 20 6d 6f 73 74 20 72  .  ** the most r
ebb0: 65 63 65 6e 74 20 49 4e 53 45 52 54 2c 20 55 50  ecent INSERT, UP
ebc0: 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73  DATE or DELETE s
ebd0: 74 61 74 65 6d 65 6e 74 2c 20 6e 6f 74 20 69 6e  tatement, not in
ebe0: 63 6c 75 64 69 6e 67 20 0a 20 20 2a 2a 20 61 6e  cluding .  ** an
ebf0: 79 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62  y changes made b
ec00: 79 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61  y trigger progra
ec10: 6d 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ms..  */.  case 
ec20: 44 42 5f 43 48 41 4e 47 45 53 3a 20 7b 0a 20 20  DB_CHANGES: {.  
ec30: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75    Tcl_Obj *pResu
ec40: 6c 74 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  lt;.    if( objc
ec50: 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=2 ){.      Tcl
ec60: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
ec70: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
ec80: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
ec90: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
eca0: 7d 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20  }.    pResult = 
ecb0: 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_GetObjResult
ecc0: 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63  (interp);.    Tc
ecd0: 6c 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52 65 73  l_SetIntObj(pRes
ece0: 75 6c 74 2c 20 73 71 6c 69 74 65 33 5f 63 68 61  ult, sqlite3_cha
ecf0: 6e 67 65 73 28 70 44 62 2d 3e 64 62 29 29 3b 0a  nges(pDb->db));.
ed00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
ed10: 20 20 2f 2a 20 20 20 20 24 64 62 20 63 6c 6f 73    /*    $db clos
ed20: 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 68 75 74  e.  **.  ** Shut
ed30: 64 6f 77 6e 20 74 68 65 20 64 61 74 61 62 61 73  down the databas
ed40: 65 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  e.  */.  case DB
ed50: 5f 43 4c 4f 53 45 3a 20 7b 0a 20 20 20 20 54 63  _CLOSE: {.    Tc
ed60: 6c 5f 44 65 6c 65 74 65 43 6f 6d 6d 61 6e 64 28  l_DeleteCommand(
ed70: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
ed80: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
ed90: 76 5b 30 5d 2c 20 30 29 29 3b 0a 20 20 20 20 62  v[0], 0));.    b
eda0: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
edb0: 20 20 2a 2a 20 20 20 20 20 24 64 62 20 63 6f 6c    **     $db col
edc0: 6c 61 74 65 20 4e 41 4d 45 20 53 43 52 49 50 54  late NAME SCRIPT
edd0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 72 65 61 74  .  **.  ** Creat
ede0: 65 20 61 20 6e 65 77 20 53 51 4c 20 63 6f 6c 6c  e a new SQL coll
edf0: 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 63  ation function c
ee00: 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 57 68 65  alled NAME.  Whe
ee10: 6e 65 76 65 72 0a 20 20 2a 2a 20 74 68 61 74 20  never.  ** that 
ee20: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
ee30: 65 64 2c 20 69 6e 76 6f 6b 65 20 53 43 52 49 50  ed, invoke SCRIP
ee40: 54 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68  T to evaluate th
ee50: 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f  e function..  */
ee60: 0a 20 20 63 61 73 65 20 44 42 5f 43 4f 4c 4c 41  .  case DB_COLLA
ee70: 54 45 3a 20 7b 0a 20 20 20 20 53 71 6c 43 6f 6c  TE: {.    SqlCol
ee80: 6c 61 74 65 20 2a 70 43 6f 6c 6c 61 74 65 3b 0a  late *pCollate;.
ee90: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b      char *zName;
eea0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 63 72 69  .    char *zScri
eeb0: 70 74 3b 0a 20 20 20 20 69 6e 74 20 6e 53 63 72  pt;.    int nScr
eec0: 69 70 74 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a  ipt;.    if( obj
eed0: 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=4 ){.      Tc
eee0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
eef0: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
ef00: 22 4e 41 4d 45 20 53 43 52 49 50 54 22 29 3b 0a  "NAME SCRIPT");.
ef10: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
ef20: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
ef30: 20 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65    zName = Tcl_Ge
ef40: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
ef50: 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20  bjv[2], 0);.    
ef60: 7a 53 63 72 69 70 74 20 3d 20 54 63 6c 5f 47 65  zScript = Tcl_Ge
ef70: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
ef80: 62 6a 76 5b 33 5d 2c 20 26 6e 53 63 72 69 70 74  bjv[3], &nScript
ef90: 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65 20  );.    pCollate 
efa0: 3d 20 28 53 71 6c 43 6f 6c 6c 61 74 65 2a 29 54  = (SqlCollate*)T
efb0: 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  cl_Alloc( sizeof
efc0: 28 2a 70 43 6f 6c 6c 61 74 65 29 20 2b 20 6e 53  (*pCollate) + nS
efd0: 63 72 69 70 74 20 2b 20 31 20 29 3b 0a 20 20 20  cript + 1 );.   
efe0: 20 69 66 28 20 70 43 6f 6c 6c 61 74 65 3d 3d 30   if( pCollate==0
eff0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
f000: 52 4f 52 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74  ROR;.    pCollat
f010: 65 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65  e->interp = inte
f020: 72 70 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65  rp;.    pCollate
f030: 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e 70  ->pNext = pDb->p
f040: 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 70 43 6f  Collate;.    pCo
f050: 6c 6c 61 74 65 2d 3e 7a 53 63 72 69 70 74 20 3d  llate->zScript =
f060: 20 28 63 68 61 72 2a 29 26 70 43 6f 6c 6c 61 74   (char*)&pCollat
f070: 65 5b 31 5d 3b 0a 20 20 20 20 70 44 62 2d 3e 70  e[1];.    pDb->p
f080: 43 6f 6c 6c 61 74 65 20 3d 20 70 43 6f 6c 6c 61  Collate = pColla
f090: 74 65 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  te;.    memcpy(p
f0a0: 43 6f 6c 6c 61 74 65 2d 3e 7a 53 63 72 69 70 74  Collate->zScript
f0b0: 2c 20 7a 53 63 72 69 70 74 2c 20 6e 53 63 72 69  , zScript, nScri
f0c0: 70 74 2b 31 29 3b 0a 20 20 20 20 69 66 28 20 73  pt+1);.    if( s
f0d0: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
f0e0: 6c 6c 61 74 69 6f 6e 28 70 44 62 2d 3e 64 62 2c  llation(pDb->db,
f0f0: 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55   zName, SQLITE_U
f100: 54 46 38 2c 20 0a 20 20 20 20 20 20 20 20 70 43  TF8, .        pC
f110: 6f 6c 6c 61 74 65 2c 20 74 63 6c 53 71 6c 43 6f  ollate, tclSqlCo
f120: 6c 6c 61 74 65 29 20 29 7b 0a 20 20 20 20 20 20  llate) ){.      
f130: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
f140: 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71  terp, (char *)sq
f150: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62  lite3_errmsg(pDb
f160: 2d 3e 64 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54  ->db), TCL_VOLAT
f170: 49 4c 45 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ILE);.      retu
f180: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
f190: 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
f1a0: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
f1b0: 20 20 24 64 62 20 63 6f 6c 6c 61 74 69 6f 6e 5f    $db collation_
f1c0: 6e 65 65 64 65 64 20 53 43 52 49 50 54 0a 20 20  needed SCRIPT.  
f1d0: 2a 2a 0a 20 20 2a 2a 20 43 72 65 61 74 65 20 61  **.  ** Create a
f1e0: 20 6e 65 77 20 53 51 4c 20 63 6f 6c 6c 61 74 69   new SQL collati
f1f0: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  on function call
f200: 65 64 20 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76  ed NAME.  Whenev
f210: 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 66 75 6e  er.  ** that fun
f220: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
f230: 20 69 6e 76 6f 6b 65 20 53 43 52 49 50 54 20 74   invoke SCRIPT t
f240: 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 66  o evaluate the f
f250: 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  unction..  */.  
f260: 63 61 73 65 20 44 42 5f 43 4f 4c 4c 41 54 49 4f  case DB_COLLATIO
f270: 4e 5f 4e 45 45 44 45 44 3a 20 7b 0a 20 20 20 20  N_NEEDED: {.    
f280: 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
f290: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
f2a0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
f2b0: 20 6f 62 6a 76 2c 20 22 53 43 52 49 50 54 22 29   objv, "SCRIPT")
f2c0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
f2d0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
f2e0: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 43 6f      if( pDb->pCo
f2f0: 6c 6c 61 74 65 4e 65 65 64 65 64 20 29 7b 0a 20  llateNeeded ){. 
f300: 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66       Tcl_DecrRef
f310: 43 6f 75 6e 74 28 70 44 62 2d 3e 70 43 6f 6c 6c  Count(pDb->pColl
f320: 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 20 20  ateNeeded);.    
f330: 7d 0a 20 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c  }.    pDb->pColl
f340: 61 74 65 4e 65 65 64 65 64 20 3d 20 54 63 6c 5f  ateNeeded = Tcl_
f350: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 6f 62 6a  DuplicateObj(obj
f360: 76 5b 32 5d 29 3b 0a 20 20 20 20 54 63 6c 5f 49  v[2]);.    Tcl_I
f370: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d  ncrRefCount(pDb-
f380: 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29  >pCollateNeeded)
f390: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f  ;.    sqlite3_co
f3a0: 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 28 70  llation_needed(p
f3b0: 44 62 2d 3e 64 62 2c 20 70 44 62 2c 20 74 63 6c  Db->db, pDb, tcl
f3c0: 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a  CollateNeeded);.
f3d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
f3e0: 20 20 2f 2a 20 20 20 20 24 64 62 20 63 6f 6d 6d    /*    $db comm
f3f0: 69 74 5f 68 6f 6f 6b 20 3f 43 41 4c 4c 42 41 43  it_hook ?CALLBAC
f400: 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76  K?.  **.  ** Inv
f410: 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63 61  oke the given ca
f420: 6c 6c 62 61 63 6b 20 6a 75 73 74 20 62 65 66 6f  llback just befo
f430: 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 65 76  re committing ev
f440: 65 72 79 20 53 51 4c 20 74 72 61 6e 73 61 63 74  ery SQL transact
f450: 69 6f 6e 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65  ion..  ** If the
f460: 20 63 61 6c 6c 62 61 63 6b 20 74 68 72 6f 77 73   callback throws
f470: 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 6f 72   an exception or
f480: 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72   returns non-zer
f490: 6f 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a  o, then the.  **
f4a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
f4b0: 61 62 6f 72 74 65 64 2e 20 20 49 66 20 43 41 4c  aborted.  If CAL
f4c0: 4c 42 41 43 4b 20 69 73 20 61 6e 20 65 6d 70 74  LBACK is an empt
f4d0: 79 20 73 74 72 69 6e 67 2c 20 74 68 65 20 63 61  y string, the ca
f4e0: 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 69 73 20 64  llback.  ** is d
f4f0: 69 73 61 62 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20  isabled..  */.  
f500: 63 61 73 65 20 44 42 5f 43 4f 4d 4d 49 54 5f 48  case DB_COMMIT_H
f510: 4f 4f 4b 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f  OOK: {.    if( o
f520: 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54  bjc>3 ){.      T
f530: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
f540: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
f550: 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a   "?CALLBACK?");.
f560: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
f570: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73  _ERROR;.    }els
f580: 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b  e if( objc==2 ){
f590: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
f5a0: 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20  zCommit ){.     
f5b0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
f5c0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d  ult(interp, pDb-
f5d0: 3e 7a 43 6f 6d 6d 69 74 2c 20 28 63 68 61 72 2a  >zCommit, (char*
f5e0: 29 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  )0);.      }.   
f5f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f   }else{.      co
f600: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69  nst char *zCommi
f610: 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  t;.      int len
f620: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  ;.      if( pDb-
f630: 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20  >zCommit ){.    
f640: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
f650: 2d 3e 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20  ->zCommit);.    
f660: 20 20 7d 0a 20 20 20 20 20 20 7a 43 6f 6d 6d 69    }.      zCommi
f670: 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  t = Tcl_GetStrin
f680: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
f690: 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69  , &len);.      i
f6a0: 66 28 20 7a 43 6f 6d 6d 69 74 20 26 26 20 6c 65  f( zCommit && le
f6b0: 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  n>0 ){.        p
f6c0: 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20 54 63  Db->zCommit = Tc
f6d0: 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31  l_Alloc( len + 1
f6e0: 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   );.        memc
f6f0: 70 79 28 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 2c  py(pDb->zCommit,
f700: 20 7a 43 6f 6d 6d 69 74 2c 20 6c 65 6e 2b 31 29   zCommit, len+1)
f710: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
f720: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 43 6f 6d         pDb->zCom
f730: 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  mit = 0;.      }
f740: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
f750: 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20  zCommit ){.     
f760: 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d     pDb->interp =
f770: 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20   interp;.       
f780: 20 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f   sqlite3_commit_
f790: 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 20 44 62  hook(pDb->db, Db
f7a0: 43 6f 6d 6d 69 74 48 61 6e 64 6c 65 72 2c 20 70  CommitHandler, p
f7b0: 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Db);.      }else
f7c0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
f7d0: 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 70 44  3_commit_hook(pD
f7e0: 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  b->db, 0, 0);.  
f7f0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
f800: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
f810: 20 20 20 20 24 64 62 20 63 6f 6d 70 6c 65 74 65      $db complete
f820: 20 53 51 4c 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52   SQL.  **.  ** R
f830: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 53 51  eturn TRUE if SQ
f840: 4c 20 69 73 20 61 20 63 6f 6d 70 6c 65 74 65 20  L is a complete 
f850: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  SQL statement.  
f860: 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 0a  Return FALSE if.
f870: 20 20 2a 2a 20 61 64 64 69 74 69 6f 6e 61 6c 20    ** additional 
f880: 6c 69 6e 65 73 20 6f 66 20 69 6e 70 75 74 20 61  lines of input a
f890: 72 65 20 6e 65 65 64 65 64 2e 20 20 54 68 69 73  re needed.  This
f8a0: 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74   is similar to t
f8b0: 68 65 0a 20 20 2a 2a 20 62 75 69 6c 74 2d 69 6e  he.  ** built-in
f8c0: 20 22 69 6e 66 6f 20 63 6f 6d 70 6c 65 74 65 22   "info complete"
f8d0: 20 63 6f 6d 6d 61 6e 64 20 6f 66 20 54 63 6c 2e   command of Tcl.
f8e0: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
f8f0: 43 4f 4d 50 4c 45 54 45 3a 20 7b 0a 23 69 66 6e  COMPLETE: {.#ifn
f900: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f910: 43 4f 4d 50 4c 45 54 45 0a 20 20 20 20 54 63 6c  COMPLETE.    Tcl
f920: 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20  _Obj *pResult;. 
f930: 20 20 20 69 6e 74 20 69 73 43 6f 6d 70 6c 65 74     int isComplet
f940: 65 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  e;.    if( objc!
f950: 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =3 ){.      Tcl_
f960: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
f970: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53  erp, 2, objv, "S
f980: 51 4c 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  QL");.      retu
f990: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
f9a0: 20 20 7d 0a 20 20 20 20 69 73 43 6f 6d 70 6c 65    }.    isComple
f9b0: 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6d  te = sqlite3_com
f9c0: 70 6c 65 74 65 28 20 54 63 6c 5f 47 65 74 53 74  plete( Tcl_GetSt
f9d0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
f9e0: 5b 32 5d 2c 20 30 29 20 29 3b 0a 20 20 20 20 70  [2], 0) );.    p
f9f0: 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74  Result = Tcl_Get
fa00: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
fa10: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 42 6f  );.    Tcl_SetBo
fa20: 6f 6c 65 61 6e 4f 62 6a 28 70 52 65 73 75 6c 74  oleanObj(pResult
fa30: 2c 20 69 73 43 6f 6d 70 6c 65 74 65 29 3b 0a 23  , isComplete);.#
fa40: 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b  endif.    break;
fa50: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64  .  }..  /*    $d
fa60: 62 20 63 6f 70 79 20 63 6f 6e 66 6c 69 63 74 2d  b copy conflict-
fa70: 61 6c 67 6f 72 69 74 68 6d 20 74 61 62 6c 65 20  algorithm table 
fa80: 66 69 6c 65 6e 61 6d 65 20 3f 53 45 50 41 52 41  filename ?SEPARA
fa90: 54 4f 52 3f 20 3f 4e 55 4c 4c 49 4e 44 49 43 41  TOR? ?NULLINDICA
faa0: 54 4f 52 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43  TOR?.  **.  ** C
fab0: 6f 70 79 20 64 61 74 61 20 69 6e 74 6f 20 74 61  opy data into ta
fac0: 62 6c 65 20 66 72 6f 6d 20 66 69 6c 65 6e 61 6d  ble from filenam
fad0: 65 2c 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 75 73  e, optionally us
fae0: 69 6e 67 20 53 45 50 41 52 41 54 4f 52 0a 20 20  ing SEPARATOR.  
faf0: 2a 2a 20 61 73 20 63 6f 6c 75 6d 6e 20 73 65 70  ** as column sep
fb00: 61 72 61 74 6f 72 73 2e 20 20 49 66 20 61 20 63  arators.  If a c
fb10: 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61  olumn contains a
fb20: 20 6e 75 6c 6c 20 73 74 72 69 6e 67 2c 20 6f 72   null string, or
fb30: 20 74 68 65 0a 20 20 2a 2a 20 76 61 6c 75 65 20   the.  ** value 
fb40: 6f 66 20 4e 55 4c 4c 49 4e 44 49 43 41 54 4f 52  of NULLINDICATOR
fb50: 2c 20 61 20 4e 55 4c 4c 20 69 73 20 69 6e 73 65  , a NULL is inse
fb60: 72 74 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6c  rted for the col
fb70: 75 6d 6e 2e 0a 20 20 2a 2a 20 63 6f 6e 66 6c 69  umn..  ** confli
fb80: 63 74 2d 61 6c 67 6f 72 69 74 68 6d 20 69 73 20  ct-algorithm is 
fb90: 6f 6e 65 20 6f 66 20 74 68 65 20 73 71 6c 69 74  one of the sqlit
fba0: 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c 67 6f 72  e conflict algor
fbb0: 69 74 68 6d 73 3a 0a 20 20 2a 2a 20 20 20 20 72  ithms:.  **    r
fbc0: 6f 6c 6c 62 61 63 6b 2c 20 61 62 6f 72 74 2c 20  ollback, abort, 
fbd0: 66 61 69 6c 2c 20 69 67 6e 6f 72 65 2c 20 72 65  fail, ignore, re
fbe0: 70 6c 61 63 65 0a 20 20 2a 2a 20 4f 6e 20 73 75  place.  ** On su
fbf0: 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20 74 68  ccess, return th
fc00: 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 69 6e 65  e number of line
fc10: 73 20 70 72 6f 63 65 73 73 65 64 2c 20 6e 6f 74  s processed, not
fc20: 20 6e 65 63 65 73 73 61 72 69 6c 79 20 73 61 6d   necessarily sam
fc30: 65 0a 20 20 2a 2a 20 61 73 20 27 64 62 20 63 68  e.  ** as 'db ch
fc40: 61 6e 67 65 73 27 20 64 75 65 20 74 6f 20 63 6f  anges' due to co
fc50: 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d  nflict-algorithm
fc60: 20 73 65 6c 65 63 74 65 64 2e 0a 20 20 2a 2a 0a   selected..  **.
fc70: 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 69    ** This code i
fc80: 73 20 62 61 73 69 63 61 6c 6c 79 20 61 6e 20 69  s basically an i
fc90: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2f 65 6e  mplementation/en
fca0: 68 61 6e 63 65 6d 65 6e 74 20 6f 66 0a 20 20 2a  hancement of.  *
fcb0: 2a 20 74 68 65 20 73 71 6c 69 74 65 33 20 73 68  * the sqlite3 sh
fcc0: 65 6c 6c 2e 63 20 22 2e 69 6d 70 6f 72 74 22 20  ell.c ".import" 
fcd0: 63 6f 6d 6d 61 6e 64 2e 0a 20 20 2a 2a 0a 20 20  command..  **.  
fce0: 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ** This command 
fcf0: 75 73 61 67 65 20 69 73 20 65 71 75 69 76 61 6c  usage is equival
fd00: 65 6e 74 20 74 6f 20 74 68 65 20 73 71 6c 69 74  ent to the sqlit
fd10: 65 32 2e 78 20 43 4f 50 59 20 73 74 61 74 65 6d  e2.x COPY statem
fd20: 65 6e 74 2c 0a 20 20 2a 2a 20 77 68 69 63 68 20  ent,.  ** which 
fd30: 69 6d 70 6f 72 74 73 20 66 69 6c 65 20 64 61 74  imports file dat
fd40: 61 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 75  a into a table u
fd50: 73 69 6e 67 20 74 68 65 20 50 6f 73 74 67 72 65  sing the Postgre
fd60: 53 51 4c 20 43 4f 50 59 20 66 69 6c 65 20 66 6f  SQL COPY file fo
fd70: 72 6d 61 74 3a 0a 20 20 2a 2a 20 20 20 24 64 62  rmat:.  **   $db
fd80: 20 63 6f 70 79 20 24 63 6f 6e 66 6c 69 74 5f 61   copy $conflit_a
fd90: 6c 67 6f 20 24 74 61 62 6c 65 5f 6e 61 6d 65 20  lgo $table_name 
fda0: 24 66 69 6c 65 6e 61 6d 65 20 5c 74 20 5c 5c 4e  $filename \t \\N
fdb0: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
fdc0: 43 4f 50 59 3a 20 7b 0a 20 20 20 20 63 68 61 72  COPY: {.    char
fdd0: 20 2a 7a 54 61 62 6c 65 3b 20 20 20 20 20 20 20   *zTable;       
fde0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72          /* Inser
fdf0: 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68 69 73  t data into this
fe00: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 63 68   table */.    ch
fe10: 61 72 20 2a 7a 46 69 6c 65 3b 20 20 20 20 20 20  ar *zFile;      
fe20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
fe30: 20 66 69 6c 65 20 66 72 6f 6d 20 77 68 69 63 68   file from which
fe40: 20 74 6f 20 65 78 74 72 61 63 74 20 64 61 74 61   to extract data
fe50: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 43   */.    char *zC
fe60: 6f 6e 66 6c 69 63 74 3b 20 20 20 20 20 20 20 20  onflict;        
fe70: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 66 6c      /* The confl
fe80: 69 63 74 20 61 6c 67 6f 72 69 74 68 6d 20 74 6f  ict algorithm to
fe90: 20 75 73 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69   use */.    sqli
fea0: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
feb0: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 74 61          /* A sta
fec0: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e  tement */.    in
fed0: 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t nCol;         
fee0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
fef0: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
ff00: 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  n the table */. 
ff10: 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20     int nByte;   
ff20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ff30: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
ff40: 73 20 69 6e 20 61 6e 20 53 51 4c 20 73 74 72 69  s in an SQL stri
ff50: 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c  ng */.    int i,
ff60: 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
ff70: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
ff80: 75 6e 74 65 72 73 20 2a 2f 0a 20 20 20 20 69 6e  unters */.    in
ff90: 74 20 6e 53 65 70 3b 20 20 20 20 20 20 20 20 20  t nSep;         
ffa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
ffb0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
ffc0: 7a 53 65 70 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e  zSep[] */.    in
ffd0: 74 20 6e 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20  t nNull;        
ffe0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
fff0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
10000 7a 4e 75 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 63  zNull[] */.    c
10010 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20  har *zSql;      
10020 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
10030 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a   SQL statement *
10040 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4c 69 6e  /.    char *zLin
10050 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
10060 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c 69    /* A single li
10070 6e 65 20 6f 66 20 69 6e 70 75 74 20 66 72 6f 6d  ne of input from
10080 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20   the file */.   
10090 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 3b 20 20   char **azCol;  
100a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
100b0 7a 4c 69 6e 65 5b 5d 20 62 72 6f 6b 65 6e 20 75  zLine[] broken u
100c0 70 20 69 6e 74 6f 20 63 6f 6c 75 6d 6e 73 20 2a  p into columns *
100d0 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  /.    const char
100e0 20 2a 7a 43 6f 6d 6d 69 74 3b 20 20 20 20 20 20   *zCommit;      
100f0 20 20 2f 2a 20 48 6f 77 20 74 6f 20 63 6f 6d 6d    /* How to comm
10100 69 74 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20  it changes */.  
10110 20 20 46 49 4c 45 20 2a 69 6e 3b 20 20 20 20 20    FILE *in;     
10120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10130 20 54 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20   The input file 
10140 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 69 6e 65 6e  */.    int linen
10150 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  o = 0;          
10160 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65     /* Line numbe
10170 72 20 6f 66 20 69 6e 70 75 74 20 66 69 6c 65 20  r of input file 
10180 2a 2f 0a 20 20 20 20 63 68 61 72 20 7a 4c 69 6e  */.    char zLin
10190 65 4e 75 6d 5b 38 30 5d 3b 20 20 20 20 20 20 20  eNum[80];       
101a0 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65     /* Line numbe
101b0 72 20 70 72 69 6e 74 20 62 75 66 66 65 72 20 2a  r print buffer *
101c0 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  /.    Tcl_Obj *p
101d0 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20  Result;         
101e0 20 20 2f 2a 20 69 6e 74 65 72 70 20 72 65 73 75    /* interp resu
101f0 6c 74 20 2a 2f 0a 0a 20 20 20 20 63 6f 6e 73 74  lt */..    const
10200 20 63 68 61 72 20 2a 7a 53 65 70 3b 0a 20 20 20   char *zSep;.   
10210 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 75   const char *zNu
10220 6c 6c 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  ll;.    if( objc
10230 3c 35 20 7c 7c 20 6f 62 6a 63 3e 37 20 29 7b 0a  <5 || objc>7 ){.
10240 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
10250 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
10260 2c 20 6f 62 6a 76 2c 20 0a 20 20 20 20 20 20 20  , objv, .       
10270 20 20 22 43 4f 4e 46 4c 49 43 54 2d 41 4c 47 4f    "CONFLICT-ALGO
10280 52 49 54 48 4d 20 54 41 42 4c 45 20 46 49 4c 45  RITHM TABLE FILE
10290 4e 41 4d 45 20 3f 53 45 50 41 52 41 54 4f 52 3f  NAME ?SEPARATOR?
102a0 20 3f 4e 55 4c 4c 49 4e 44 49 43 41 54 4f 52 3f   ?NULLINDICATOR?
102b0 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
102c0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
102d0 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 3d  }.    if( objc>=
102e0 36 20 29 7b 0a 20 20 20 20 20 20 7a 53 65 70 20  6 ){.      zSep 
102f0 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
10300 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 35 5d 2c 20  romObj(objv[5], 
10310 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
10320 20 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 74 22       zSep = "\t"
10330 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
10340 6f 62 6a 63 3e 3d 37 20 29 7b 0a 20 20 20 20 20  objc>=7 ){.     
10350 20 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f 47 65 74   zNull = Tcl_Get
10360 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
10370 6a 76 5b 36 5d 2c 20 30 29 3b 0a 20 20 20 20 7d  jv[6], 0);.    }
10380 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4e 75 6c  else{.      zNul
10390 6c 20 3d 20 22 22 3b 0a 20 20 20 20 7d 0a 20 20  l = "";.    }.  
103a0 20 20 7a 43 6f 6e 66 6c 69 63 74 20 3d 20 54 63    zConflict = Tc
103b0 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
103c0 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a  bj(objv[2], 0);.
103d0 20 20 20 20 7a 54 61 62 6c 65 20 3d 20 54 63 6c      zTable = Tcl
103e0 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
103f0 6a 28 6f 62 6a 76 5b 33 5d 2c 20 30 29 3b 0a 20  j(objv[3], 0);. 
10400 20 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47     zFile = 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 34 5d 2c 20 30 29 3b 0a 20 20 20  objv[4], 0);.   
10430 20 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e 33 30   nSep = strlen30
10440 28 7a 53 65 70 29 3b 0a 20 20 20 20 6e 4e 75 6c  (zSep);.    nNul
10450 6c 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 4e 75  l = strlen30(zNu
10460 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 65  ll);.    if( nSe
10470 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63  p==0 ){.      Tc
10480 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
10490 6e 74 65 72 70 2c 22 45 72 72 6f 72 3a 20 6e 6f  nterp,"Error: no
104a0 6e 2d 6e 75 6c 6c 20 73 65 70 61 72 61 74 6f 72  n-null separator
104b0 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f   required for co
104c0 70 79 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  py",.           
104d0 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
104e0 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 65 74  r*)0);.      ret
104f0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
10500 20 20 20 7d 0a 20 20 20 20 69 66 28 73 74 72 63     }.    if(strc
10510 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 72  mp(zConflict, "r
10520 6f 6c 6c 62 61 63 6b 22 29 20 21 3d 20 30 20 26  ollback") != 0 &
10530 26 0a 20 20 20 20 20 20 20 73 74 72 63 6d 70 28  &.       strcmp(
10540 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 61 62 6f 72  zConflict, "abor
10550 74 22 20 20 20 29 20 21 3d 20 30 20 26 26 0a 20  t"   ) != 0 &&. 
10560 20 20 20 20 20 20 73 74 72 63 6d 70 28 7a 43 6f        strcmp(zCo
10570 6e 66 6c 69 63 74 2c 20 22 66 61 69 6c 22 20 20  nflict, "fail"  
10580 20 20 29 20 21 3d 20 30 20 26 26 0a 20 20 20 20    ) != 0 &&.    
10590 20 20 20 73 74 72 63 6d 70 28 7a 43 6f 6e 66 6c     strcmp(zConfl
105a0 69 63 74 2c 20 22 69 67 6e 6f 72 65 22 20 20 29  ict, "ignore"  )
105b0 20 21 3d 20 30 20 26 26 0a 20 20 20 20 20 20 20   != 0 &&.       
105c0 73 74 72 63 6d 70 28 7a 43 6f 6e 66 6c 69 63 74  strcmp(zConflict
105d0 2c 20 22 72 65 70 6c 61 63 65 22 20 29 20 21 3d  , "replace" ) !=
105e0 20 30 20 29 20 7b 0a 20 20 20 20 20 20 54 63 6c   0 ) {.      Tcl
105f0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
10600 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 5c 22  terp, "Error: \"
10610 22 2c 20 7a 43 6f 6e 66 6c 69 63 74 2c 20 0a 20  ", zConflict, . 
10620 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20             "\", 
10630 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74  conflict-algorit
10640 68 6d 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f  hm must be one o
10650 66 3a 20 72 6f 6c 6c 62 61 63 6b 2c 20 22 0a 20  f: rollback, ". 
10660 20 20 20 20 20 20 20 20 20 20 20 22 61 62 6f 72             "abor
10670 74 2c 20 66 61 69 6c 2c 20 69 67 6e 6f 72 65 2c  t, fail, ignore,
10680 20 6f 72 20 72 65 70 6c 61 63 65 22 2c 20 28 63   or replace", (c
10690 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72  har*)0);.      r
106a0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
106b0 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20  .    }.    zSql 
106c0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
106d0 66 28 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  f("SELECT * FROM
106e0 20 27 25 71 27 22 2c 20 7a 54 61 62 6c 65 29 3b   '%q'", zTable);
106f0 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  .    if( zSql==0
10700 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
10710 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
10720 70 2c 20 22 45 72 72 6f 72 3a 20 6e 6f 20 73 75  p, "Error: no su
10730 63 68 20 74 61 62 6c 65 3a 20 22 2c 20 7a 54 61  ch table: ", zTa
10740 62 6c 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  ble, (char*)0);.
10750 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
10760 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
10770 20 20 6e 42 79 74 65 20 3d 20 73 74 72 6c 65 6e    nByte = strlen
10780 33 30 28 7a 53 71 6c 29 3b 0a 20 20 20 20 72 63  30(zSql);.    rc
10790 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
107a0 72 65 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c  re(pDb->db, zSql
107b0 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29  , -1, &pStmt, 0)
107c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
107d0 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66  ee(zSql);.    if
107e0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63  ( rc ){.      Tc
107f0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
10800 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 22  nterp, "Error: "
10810 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
10820 28 70 44 62 2d 3e 64 62 29 2c 20 28 63 68 61 72  (pDb->db), (char
10830 2a 29 30 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6c  *)0);.      nCol
10840 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
10850 0a 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71  .      nCol = sq
10860 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
10870 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d  nt(pStmt);.    }
10880 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
10890 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
108a0 20 20 69 66 28 20 6e 43 6f 6c 3d 3d 30 20 29 20    if( nCol==0 ) 
108b0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  {.      return T
108c0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
108d0 20 20 20 20 7a 53 71 6c 20 3d 20 6d 61 6c 6c 6f      zSql = mallo
108e0 63 28 20 6e 42 79 74 65 20 2b 20 35 30 20 2b 20  c( nByte + 50 + 
108f0 6e 43 6f 6c 2a 32 20 29 3b 0a 20 20 20 20 69 66  nCol*2 );.    if
10900 28 20 7a 53 71 6c 3d 3d 30 20 29 20 7b 0a 20 20  ( zSql==0 ) {.  
10910 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
10920 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72  sult(interp, "Er
10930 72 6f 72 3a 20 63 61 6e 27 74 20 6d 61 6c 6c 6f  ror: can't mallo
10940 63 28 29 22 2c 20 28 63 68 61 72 2a 29 30 29 3b  c()", (char*)0);
10950 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
10960 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
10970 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
10980 6e 74 66 28 6e 42 79 74 65 2b 35 30 2c 20 7a 53  ntf(nByte+50, zS
10990 71 6c 2c 20 22 49 4e 53 45 52 54 20 4f 52 20 25  ql, "INSERT OR %
109a0 71 20 49 4e 54 4f 20 27 25 71 27 20 56 41 4c 55  q INTO '%q' VALU
109b0 45 53 28 3f 22 2c 0a 20 20 20 20 20 20 20 20 20  ES(?",.         
109c0 7a 43 6f 6e 66 6c 69 63 74 2c 20 7a 54 61 62 6c  zConflict, zTabl
109d0 65 29 3b 0a 20 20 20 20 6a 20 3d 20 73 74 72 6c  e);.    j = strl
109e0 65 6e 33 30 28 7a 53 71 6c 29 3b 0a 20 20 20 20  en30(zSql);.    
109f0 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 43 6f 6c 3b  for(i=1; i<nCol;
10a00 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 53 71   i++){.      zSq
10a10 6c 5b 6a 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20  l[j++] = ',';.  
10a20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20      zSql[j++] = 
10a30 27 3f 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  '?';.    }.    z
10a40 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 29 27 3b 0a  Sql[j++] = ')';.
10a50 20 20 20 20 7a 53 71 6c 5b 6a 5d 20 3d 20 30 3b      zSql[j] = 0;
10a60 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
10a70 33 5f 70 72 65 70 61 72 65 28 70 44 62 2d 3e 64  3_prepare(pDb->d
10a80 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53  b, zSql, -1, &pS
10a90 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 66 72 65  tmt, 0);.    fre
10aa0 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28  e(zSql);.    if(
10ab0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c   rc ){.      Tcl
10ac0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
10ad0 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 22 2c  terp, "Error: ",
10ae0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
10af0 70 44 62 2d 3e 64 62 29 2c 20 28 63 68 61 72 2a  pDb->db), (char*
10b00 29 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  )0);.      sqlit
10b10 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
10b20 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
10b30 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
10b40 7d 0a 20 20 20 20 69 6e 20 3d 20 66 6f 70 65 6e  }.    in = fopen
10b50 28 7a 46 69 6c 65 2c 20 22 72 62 22 29 3b 0a 20  (zFile, "rb");. 
10b60 20 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a     if( in==0 ){.
10b70 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
10b80 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
10b90 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70  Error: cannot op
10ba0 65 6e 20 66 69 6c 65 3a 20 22 2c 20 7a 46 69 6c  en file: ", zFil
10bb0 65 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  e, NULL);.      
10bc0 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
10bd0 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72  (pStmt);.      r
10be0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
10bf0 0a 20 20 20 20 7d 0a 20 20 20 20 61 7a 43 6f 6c  .    }.    azCol
10c00 20 3d 20 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f   = malloc( sizeo
10c10 66 28 61 7a 43 6f 6c 5b 30 5d 29 2a 28 6e 43 6f  f(azCol[0])*(nCo
10c20 6c 2b 31 29 20 29 3b 0a 20 20 20 20 69 66 28 20  l+1) );.    if( 
10c30 61 7a 43 6f 6c 3d 3d 30 20 29 20 7b 0a 20 20 20  azCol==0 ) {.   
10c40 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
10c50 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72  ult(interp, "Err
10c60 6f 72 3a 20 63 61 6e 27 74 20 6d 61 6c 6c 6f 63  or: can't malloc
10c70 28 29 22 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  ()", (char*)0);.
10c80 20 20 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29        fclose(in)
10c90 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
10ca0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
10cb0 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65      (void)sqlite
10cc0 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20  3_exec(pDb->db, 
10cd0 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 2c 20 30  "BEGIN", 0, 0, 0
10ce0 29 3b 0a 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d  );.    zCommit =
10cf0 20 22 43 4f 4d 4d 49 54 22 3b 0a 20 20 20 20 77   "COMMIT";.    w
10d00 68 69 6c 65 28 20 28 7a 4c 69 6e 65 20 3d 20 6c  hile( (zLine = l
10d10 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28 30 2c 20  ocal_getline(0, 
10d20 69 6e 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  in))!=0 ){.     
10d30 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20   char *z;.      
10d40 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20  lineno++;.      
10d50 61 7a 43 6f 6c 5b 30 5d 20 3d 20 7a 4c 69 6e 65  azCol[0] = zLine
10d60 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c  ;.      for(i=0,
10d70 20 7a 3d 7a 4c 69 6e 65 3b 20 2a 7a 3b 20 7a 2b   z=zLine; *z; z+
10d80 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
10d90 2a 7a 3d 3d 7a 53 65 70 5b 30 5d 20 26 26 20 73  *z==zSep[0] && s
10da0 74 72 6e 63 6d 70 28 7a 2c 20 7a 53 65 70 2c 20  trncmp(z, zSep, 
10db0 6e 53 65 70 29 3d 3d 30 20 29 7b 0a 20 20 20 20  nSep)==0 ){.    
10dc0 20 20 20 20 20 20 2a 7a 20 3d 20 30 3b 0a 20 20        *z = 0;.  
10dd0 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20          i++;.   
10de0 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e 43 6f         if( i<nCo
10df0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  l ){.           
10e00 20 61 7a 43 6f 6c 5b 69 5d 20 3d 20 26 7a 5b 6e   azCol[i] = &z[n
10e10 53 65 70 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  Sep];.          
10e20 20 20 7a 20 2b 3d 20 6e 53 65 70 2d 31 3b 0a 20    z += nSep-1;. 
10e30 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
10e40 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
10e50 20 20 20 69 66 28 20 69 2b 31 21 3d 6e 43 6f 6c     if( i+1!=nCol
10e60 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
10e70 20 2a 7a 45 72 72 3b 0a 20 20 20 20 20 20 20 20   *zErr;.        
10e80 69 6e 74 20 6e 45 72 72 20 3d 20 73 74 72 6c 65  int nErr = strle
10e90 6e 33 30 28 7a 46 69 6c 65 29 20 2b 20 32 30 30  n30(zFile) + 200
10ea0 3b 0a 20 20 20 20 20 20 20 20 7a 45 72 72 20 3d  ;.        zErr =
10eb0 20 6d 61 6c 6c 6f 63 28 6e 45 72 72 29 3b 0a 20   malloc(nErr);. 
10ec0 20 20 20 20 20 20 20 69 66 28 20 7a 45 72 72 20         if( zErr 
10ed0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
10ee0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 45  ite3_snprintf(nE
10ef0 72 72 2c 20 7a 45 72 72 2c 0a 20 20 20 20 20 20  rr, zErr,.      
10f00 20 20 20 20 20 20 20 22 45 72 72 6f 72 3a 20 25         "Error: %
10f10 73 20 6c 69 6e 65 20 25 64 3a 20 65 78 70 65 63  s line %d: expec
10f20 74 65 64 20 25 64 20 63 6f 6c 75 6d 6e 73 20 6f  ted %d columns o
10f30 66 20 64 61 74 61 20 62 75 74 20 66 6f 75 6e 64  f data but found
10f40 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %d",.          
10f50 20 20 20 7a 46 69 6c 65 2c 20 6c 69 6e 65 6e 6f     zFile, lineno
10f60 2c 20 6e 43 6f 6c 2c 20 69 2b 31 29 3b 0a 20 20  , nCol, i+1);.  
10f70 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65          Tcl_Appe
10f80 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
10f90 20 7a 45 72 72 2c 20 28 63 68 61 72 2a 29 30 29   zErr, (char*)0)
10fa0 3b 0a 20 20 20 20 20 20 20 20 20 20 66 72 65 65  ;.          free
10fb0 28 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 20 20  (zErr);.        
10fc0 7d 0a 20 20 20 20 20 20 20 20 7a 43 6f 6d 6d 69  }.        zCommi
10fd0 74 20 3d 20 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a  t = "ROLLBACK";.
10fe0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
10ff0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
11000 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
11010 2b 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 63  +){.        /* c
11020 68 65 63 6b 20 66 6f 72 20 6e 75 6c 6c 20 64 61  heck for null da
11030 74 61 2c 20 69 66 20 73 6f 2c 20 62 69 6e 64 20  ta, if so, bind 
11040 61 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20 20  as null */.     
11050 20 20 20 69 66 28 20 28 6e 4e 75 6c 6c 3e 30 20     if( (nNull>0 
11060 26 26 20 73 74 72 63 6d 70 28 61 7a 43 6f 6c 5b  && strcmp(azCol[
11070 69 5d 2c 20 7a 4e 75 6c 6c 29 3d 3d 30 29 0a 20  i], zNull)==0). 
11080 20 20 20 20 20 20 20 20 20 7c 7c 20 73 74 72 6c           || strl
11090 65 6e 33 30 28 61 7a 43 6f 6c 5b 69 5d 29 3d 3d  en30(azCol[i])==
110a0 30 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  0 .        ){.  
110b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
110c0 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c  bind_null(pStmt,
110d0 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 7d   i+1);.        }
110e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
110f0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
11100 74 28 70 53 74 6d 74 2c 20 69 2b 31 2c 20 61 7a  t(pStmt, i+1, az
11110 43 6f 6c 5b 69 5d 2c 20 2d 31 2c 20 53 51 4c 49  Col[i], -1, SQLI
11120 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
11130 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
11140 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70      sqlite3_step
11150 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72  (pStmt);.      r
11160 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
11170 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  t(pStmt);.      
11180 66 72 65 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20  free(zLine);.   
11190 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
111a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
111b0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
111c0 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 3a 20  (interp,"Error: 
111d0 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
111e0 67 28 70 44 62 2d 3e 64 62 29 2c 20 28 63 68 61  g(pDb->db), (cha
111f0 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 20 20 7a  r*)0);.        z
11200 43 6f 6d 6d 69 74 20 3d 20 22 52 4f 4c 4c 42 41  Commit = "ROLLBA
11210 43 4b 22 3b 0a 20 20 20 20 20 20 20 20 62 72 65  CK";.        bre
11220 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
11230 7d 0a 20 20 20 20 66 72 65 65 28 61 7a 43 6f 6c  }.    free(azCol
11240 29 3b 0a 20 20 20 20 66 63 6c 6f 73 65 28 69 6e  );.    fclose(in
11250 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
11260 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
11270 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65      (void)sqlite
11280 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20  3_exec(pDb->db, 
11290 7a 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 2c 20 30  zCommit, 0, 0, 0
112a0 29 3b 0a 0a 20 20 20 20 69 66 28 20 7a 43 6f 6d  );..    if( zCom
112b0 6d 69 74 5b 30 5d 20 3d 3d 20 27 43 27 20 29 7b  mit[0] == 'C' ){
112c0 0a 20 20 20 20 20 20 2f 2a 20 73 75 63 63 65 73  .      /* succes
112d0 73 2c 20 73 65 74 20 72 65 73 75 6c 74 20 61 73  s, set result as
112e0 20 6e 75 6d 62 65 72 20 6f 66 20 6c 69 6e 65 73   number of lines
112f0 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20   processed */.  
11300 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63      pResult = Tc
11310 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_GetObjResult(i
11320 6e 74 65 72 70 29 3b 0a 20 20 20 20 20 20 54 63  nterp);.      Tc
11330 6c 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52 65 73  l_SetIntObj(pRes
11340 75 6c 74 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20  ult, lineno);.  
11350 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b      rc = TCL_OK;
11360 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
11370 20 20 2f 2a 20 66 61 69 6c 75 72 65 2c 20 61 70    /* failure, ap
11380 70 65 6e 64 20 6c 69 6e 65 6e 6f 20 77 68 65 72  pend lineno wher
11390 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20  e failed */.    
113a0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
113b0 74 66 28 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 4e  tf(sizeof(zLineN
113c0 75 6d 29 2c 20 7a 4c 69 6e 65 4e 75 6d 2c 22 25  um), zLineNum,"%
113d0 64 22 2c 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20  d",lineno);.    
113e0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
113f0 6c 74 28 69 6e 74 65 72 70 2c 22 2c 20 66 61 69  lt(interp,", fai
11400 6c 65 64 20 77 68 69 6c 65 20 70 72 6f 63 65 73  led while proces
11410 73 69 6e 67 20 6c 69 6e 65 3a 20 22 2c 7a 4c 69  sing line: ",zLi
11420 6e 65 4e 75 6d 2c 0a 20 20 20 20 20 20 20 20 20  neNum,.         
11430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
11440 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72  har*)0);.      r
11450 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  c = TCL_ERROR;. 
11460 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
11470 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
11480 20 20 24 64 62 20 65 6e 61 62 6c 65 5f 6c 6f 61    $db enable_loa
11490 64 5f 65 78 74 65 6e 73 69 6f 6e 20 42 4f 4f 4c  d_extension BOOL
114a0 45 41 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 75  EAN.  **.  ** Tu
114b0 72 6e 20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e  rn the extension
114c0 20 6c 6f 61 64 69 6e 67 20 66 65 61 74 75 72 65   loading feature
114d0 20 6f 6e 20 6f 72 20 6f 66 66 2e 20 20 49 74 20   on or off.  It 
114e0 69 66 20 6f 66 66 20 62 79 0a 20 20 2a 2a 20 64  if off by.  ** d
114f0 65 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 63  efault..  */.  c
11500 61 73 65 20 44 42 5f 45 4e 41 42 4c 45 5f 4c 4f  ase DB_ENABLE_LO
11510 41 44 5f 45 58 54 45 4e 53 49 4f 4e 3a 20 7b 0a  AD_EXTENSION: {.
11520 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11530 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
11540 4f 4e 0a 20 20 20 20 69 6e 74 20 6f 6e 6f 66 66  ON.    int onoff
11550 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ;.    if( objc!=
11560 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
11570 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
11580 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 42 4f  rp, 2, objv, "BO
11590 4f 4c 45 41 4e 22 29 3b 0a 20 20 20 20 20 20 72  OLEAN");.      r
115a0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
115b0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 54  .    }.    if( T
115c0 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f  cl_GetBooleanFro
115d0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
115e0 76 5b 32 5d 2c 20 26 6f 6e 6f 66 66 29 20 29 7b  v[2], &onoff) ){
115f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
11600 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
11610 20 20 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c     sqlite3_enabl
11620 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e  e_load_extension
11630 28 70 44 62 2d 3e 64 62 2c 20 6f 6e 6f 66 66 29  (pDb->db, onoff)
11640 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 23 65 6c  ;.    break;.#el
11650 73 65 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  se.    Tcl_Appen
11660 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
11670 22 65 78 74 65 6e 73 69 6f 6e 20 6c 6f 61 64 69  "extension loadi
11680 6e 67 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66  ng is turned off
11690 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
116a0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
116b0 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 30          (char*)0
116c0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
116d0 4c 5f 45 52 52 4f 52 3b 0a 23 65 6e 64 69 66 0a  L_ERROR;.#endif.
116e0 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
116f0 20 20 24 64 62 20 65 72 72 6f 72 63 6f 64 65 0a    $db errorcode.
11700 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e    **.  ** Return
11710 20 74 68 65 20 6e 75 6d 65 72 69 63 20 65 72 72   the numeric err
11720 6f 72 20 63 6f 64 65 20 74 68 61 74 20 77 61 73  or code that was
11730 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
11740 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 20 20 2a   most recent.  *
11750 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  * call to sqlite
11760 33 5f 65 78 65 63 28 29 2e 0a 20 20 2a 2f 0a 20  3_exec()..  */. 
11770 20 63 61 73 65 20 44 42 5f 45 52 52 4f 52 43 4f   case DB_ERRORCO
11780 44 45 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 53 65  DE: {.    Tcl_Se
11790 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
117a0 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
117b0 28 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65  (sqlite3_errcode
117c0 28 70 44 62 2d 3e 64 62 29 29 29 3b 0a 20 20 20  (pDb->db)));.   
117d0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
117e0 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 65 78  *.  **    $db ex
117f0 69 73 74 73 20 24 73 71 6c 0a 20 20 2a 2a 20 20  ists $sql.  **  
11800 20 20 24 64 62 20 6f 6e 65 63 6f 6c 75 6d 6e 20    $db onecolumn 
11810 24 73 71 6c 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  $sql.  **.  ** T
11820 68 65 20 6f 6e 65 63 6f 6c 75 6d 6e 20 6d 65 74  he onecolumn met
11830 68 6f 64 20 69 73 20 74 68 65 20 65 71 75 69 76  hod is the equiv
11840 61 6c 65 6e 74 20 6f 66 3a 0a 20 20 2a 2a 20 20  alent of:.  **  
11850 20 20 20 6c 69 6e 64 65 78 20 5b 24 64 62 20 65     lindex [$db e
11860 76 61 6c 20 24 73 71 6c 5d 20 30 0a 20 20 2a 2f  val $sql] 0.  */
11870 0a 20 20 63 61 73 65 20 44 42 5f 45 58 49 53 54  .  case DB_EXIST
11880 53 3a 20 0a 20 20 63 61 73 65 20 44 42 5f 4f 4e  S: .  case DB_ON
11890 45 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 44  ECOLUMN: {.    D
118a0 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 73 45 76  bEvalContext sEv
118b0 61 6c 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  al;.    if( objc
118c0 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=3 ){.      Tcl
118d0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
118e0 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
118f0 53 51 4c 22 29 3b 0a 20 20 20 20 20 20 72 65 74  SQL");.      ret
11900 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
11910 20 20 20 7d 0a 0a 20 20 20 20 64 62 45 76 61 6c     }..    dbEval
11920 49 6e 69 74 28 26 73 45 76 61 6c 2c 20 70 44 62  Init(&sEval, pDb
11930 2c 20 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20  , objv[2], 0);. 
11940 20 20 20 72 63 20 3d 20 64 62 45 76 61 6c 53 74     rc = dbEvalSt
11950 65 70 28 26 73 45 76 61 6c 29 3b 0a 20 20 20 20  ep(&sEval);.    
11960 69 66 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f 4f  if( choice==DB_O
11970 4e 45 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  NECOLUMN ){.    
11980 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b    if( rc==TCL_OK
11990 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
119a0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
119b0 65 72 70 2c 20 64 62 45 76 61 6c 43 6f 6c 75 6d  erp, dbEvalColum
119c0 6e 56 61 6c 75 65 28 26 73 45 76 61 6c 2c 20 30  nValue(&sEval, 0
119d0 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ));.      }else 
119e0 69 66 28 20 72 63 3d 3d 54 43 4c 5f 42 52 45 41  if( rc==TCL_BREA
119f0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  K ){.        Tcl
11a00 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74  _ResetResult(int
11a10 65 72 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  erp);.      }.  
11a20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d    }else if( rc==
11a30 54 43 4c 5f 42 52 45 41 4b 20 7c 7c 20 72 63 3d  TCL_BREAK || rc=
11a40 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  =TCL_OK ){.     
11a50 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
11a60 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
11a70 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 72 63 3d 3d  wBooleanObj(rc==
11a80 54 43 4c 5f 4f 4b 29 29 3b 0a 20 20 20 20 7d 0a  TCL_OK));.    }.
11a90 20 20 20 20 64 62 45 76 61 6c 46 69 6e 61 6c 69      dbEvalFinali
11aa0 7a 65 28 26 73 45 76 61 6c 29 3b 0a 0a 20 20 20  ze(&sEval);..   
11ab0 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 42 52 45   if( rc==TCL_BRE
11ac0 41 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  AK ){.      rc =
11ad0 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20   TCL_OK;.    }. 
11ae0 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20     break;.  }.  
11af0 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24   .  /*.  **    $
11b00 64 62 20 65 76 61 6c 20 24 73 71 6c 20 3f 61 72  db eval $sql ?ar
11b10 72 61 79 3f 20 3f 7b 20 20 2e 2e 2e 63 6f 64 65  ray? ?{  ...code
11b20 2e 2e 2e 20 7d 3f 0a 20 20 2a 2a 0a 20 20 2a 2a  ... }?.  **.  **
11b30 20 54 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   The SQL stateme
11b40 6e 74 20 69 6e 20 24 73 71 6c 20 69 73 20 65 76  nt in $sql is ev
11b50 61 6c 75 61 74 65 64 2e 20 20 46 6f 72 20 65 61  aluated.  For ea
11b60 63 68 20 72 6f 77 2c 20 74 68 65 20 76 61 6c 75  ch row, the valu
11b70 65 73 20 61 72 65 0a 20 20 2a 2a 20 70 6c 61 63  es are.  ** plac
11b80 65 64 20 69 6e 20 65 6c 65 6d 65 6e 74 73 20 6f  ed in elements o
11b90 66 20 74 68 65 20 61 72 72 61 79 20 6e 61 6d 65  f the array name
11ba0 64 20 22 61 72 72 61 79 22 20 61 6e 64 20 2e 2e  d "array" and ..
11bb0 2e 63 6f 64 65 2e 2e 2e 20 69 73 20 65 78 65 63  .code... is exec
11bc0 75 74 65 64 2e 0a 20 20 2a 2a 20 49 66 20 22 61  uted..  ** If "a
11bd0 72 72 61 79 22 20 61 6e 64 20 22 63 6f 64 65 22  rray" and "code"
11be0 20 61 72 65 20 6f 6d 69 74 74 65 64 2c 20 74 68   are omitted, th
11bf0 65 6e 20 6e 6f 20 63 61 6c 6c 62 61 63 6b 20 69  en no callback i
11c00 73 20 65 76 65 72 79 20 69 6e 76 6f 6b 65 64 2e  s every invoked.
11c10 0a 20 20 2a 2a 20 49 66 20 22 61 72 72 61 79 22  .  ** If "array"
11c20 20 69 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72   is an empty str
11c30 69 6e 67 2c 20 74 68 65 6e 20 74 68 65 20 76 61  ing, then the va
11c40 6c 75 65 73 20 61 72 65 20 70 6c 61 63 65 64 20  lues are placed 
11c50 69 6e 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a  in variables.  *
11c60 2a 20 74 68 61 74 20 68 61 76 65 20 74 68 65 20  * that have the 
11c70 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65  same name as the
11c80 20 66 69 65 6c 64 73 20 65 78 74 72 61 63 74 65   fields extracte
11c90 64 20 62 79 20 74 68 65 20 71 75 65 72 79 2e 0a  d by the query..
11ca0 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 45    */.  case DB_E
11cb0 56 41 4c 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f  VAL: {.    if( o
11cc0 62 6a 63 3c 33 20 7c 7c 20 6f 62 6a 63 3e 35 20  bjc<3 || objc>5 
11cd0 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
11ce0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
11cf0 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 20  , 2, objv, "SQL 
11d00 3f 41 52 52 41 59 2d 4e 41 4d 45 3f 20 3f 53 43  ?ARRAY-NAME? ?SC
11d10 52 49 50 54 3f 22 29 3b 0a 20 20 20 20 20 20 72  RIPT?");.      r
11d20 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
11d30 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
11d40 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20  objc==3 ){.     
11d50 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 73   DbEvalContext s
11d60 45 76 61 6c 3b 0a 20 20 20 20 20 20 54 63 6c 5f  Eval;.      Tcl_
11d70 4f 62 6a 20 2a 70 52 65 74 20 3d 20 54 63 6c 5f  Obj *pRet = Tcl_
11d80 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20 20 20  NewObj();.      
11d90 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
11da0 28 70 52 65 74 29 3b 0a 20 20 20 20 20 20 64 62  (pRet);.      db
11db0 45 76 61 6c 49 6e 69 74 28 26 73 45 76 61 6c 2c  EvalInit(&sEval,
11dc0 20 70 44 62 2c 20 6f 62 6a 76 5b 32 5d 2c 20 30   pDb, objv[2], 0
11dd0 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  );.      while( 
11de0 54 43 4c 5f 4f 4b 3d 3d 28 72 63 20 3d 20 64 62  TCL_OK==(rc = db
11df0 45 76 61 6c 53 74 65 70 28 26 73 45 76 61 6c 29  EvalStep(&sEval)
11e00 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ) ){.        int
11e10 20 69 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   i;.        int 
11e20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 64 62  nCol;.        db
11e30 45 76 61 6c 52 6f 77 49 6e 66 6f 28 26 73 45 76  EvalRowInfo(&sEv
11e40 61 6c 2c 20 26 6e 43 6f 6c 2c 20 30 29 3b 0a 20  al, &nCol, 0);. 
11e50 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
11e60 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
11e70 20 20 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74          Tcl_List
11e80 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
11e90 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 64  (interp, pRet, d
11ea0 62 45 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65  bEvalColumnValue
11eb0 28 26 73 45 76 61 6c 2c 20 69 29 29 3b 0a 20 20  (&sEval, i));.  
11ec0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
11ed0 20 20 20 20 20 20 64 62 45 76 61 6c 46 69 6e 61        dbEvalFina
11ee0 6c 69 7a 65 28 26 73 45 76 61 6c 29 3b 0a 20 20  lize(&sEval);.  
11ef0 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f      if( rc==TCL_
11f00 42 52 45 41 4b 20 29 7b 0a 20 20 20 20 20 20 20  BREAK ){.       
11f10 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
11f20 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b  t(interp, pRet);
11f30 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 54 43  .        rc = TC
11f40 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  L_OK;.      }.  
11f50 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
11f60 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20 20 20 20  ount(pRet);.    
11f70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 43 6c 69  }else{.      Cli
11f80 65 6e 74 44 61 74 61 20 63 64 5b 32 5d 3b 0a 20  entData cd[2];. 
11f90 20 20 20 20 20 44 62 45 76 61 6c 43 6f 6e 74 65       DbEvalConte
11fa0 78 74 20 2a 70 3b 0a 20 20 20 20 20 20 54 63 6c  xt *p;.      Tcl
11fb0 5f 4f 62 6a 20 2a 70 41 72 72 61 79 20 3d 20 30  _Obj *pArray = 0
11fc0 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20  ;.      Tcl_Obj 
11fd0 2a 70 53 63 72 69 70 74 3b 0a 0a 20 20 20 20 20  *pScript;..     
11fe0 20 69 66 28 20 6f 62 6a 63 3d 3d 35 20 26 26 20   if( objc==5 && 
11ff0 2a 28 63 68 61 72 20 2a 29 54 63 6c 5f 47 65 74  *(char *)Tcl_Get
12000 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 20  String(objv[3]) 
12010 29 7b 0a 20 20 20 20 20 20 20 20 70 41 72 72 61  ){.        pArra
12020 79 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20  y = objv[3];.   
12030 20 20 20 7d 0a 20 20 20 20 20 20 70 53 63 72 69     }.      pScri
12040 70 74 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31  pt = objv[objc-1
12050 5d 3b 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 63  ];.      Tcl_Inc
12060 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69 70  rRefCount(pScrip
12070 74 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20  t);.      .     
12080 20 70 20 3d 20 28 44 62 45 76 61 6c 43 6f 6e 74   p = (DbEvalCont
12090 65 78 74 20 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28  ext *)Tcl_Alloc(
120a0 73 69 7a 65 6f 66 28 44 62 45 76 61 6c 43 6f 6e  sizeof(DbEvalCon
120b0 74 65 78 74 29 29 3b 0a 20 20 20 20 20 20 64 62  text));.      db
120c0 45 76 61 6c 49 6e 69 74 28 70 2c 20 70 44 62 2c  EvalInit(p, pDb,
120d0 20 6f 62 6a 76 5b 32 5d 2c 20 70 41 72 72 61 79   objv[2], pArray
120e0 29 3b 0a 0a 20 20 20 20 20 20 63 64 5b 30 5d 20  );..      cd[0] 
120f0 3d 20 28 76 6f 69 64 20 2a 29 70 3b 0a 20 20 20  = (void *)p;.   
12100 20 20 20 63 64 5b 31 5d 20 3d 20 28 76 6f 69 64     cd[1] = (void
12110 20 2a 29 70 53 63 72 69 70 74 3b 0a 20 20 20 20   *)pScript;.    
12120 20 20 72 63 20 3d 20 44 62 45 76 61 6c 4e 65 78    rc = DbEvalNex
12130 74 43 6d 64 28 63 64 2c 20 69 6e 74 65 72 70 2c  tCmd(cd, interp,
12140 20 54 43 4c 5f 4f 4b 29 3b 0a 20 20 20 20 7d 0a   TCL_OK);.    }.
12150 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
12160 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64    /*.  **     $d
12170 62 20 66 75 6e 63 74 69 6f 6e 20 4e 41 4d 45 20  b function NAME 
12180 5b 2d 61 72 67 63 6f 75 6e 74 20 4e 5d 20 53 43  [-argcount N] SC
12190 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43  RIPT.  **.  ** C
121a0 72 65 61 74 65 20 61 20 6e 65 77 20 53 51 4c 20  reate a new SQL 
121b0 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20  function called 
121c0 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76 65 72 20  NAME.  Whenever 
121d0 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 69 73  that function is
121e0 0a 20 20 2a 2a 20 63 61 6c 6c 65 64 2c 20 69 6e  .  ** called, in
121f0 76 6f 6b 65 20 53 43 52 49 50 54 20 74 6f 20 65  voke SCRIPT to e
12200 76 61 6c 75 61 74 65 20 74 68 65 20 66 75 6e 63  valuate the func
12210 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  tion..  */.  cas
12220 65 20 44 42 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b  e DB_FUNCTION: {
12230 0a 20 20 20 20 53 71 6c 46 75 6e 63 20 2a 70 46  .    SqlFunc *pF
12240 75 6e 63 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  unc;.    Tcl_Obj
12250 20 2a 70 53 63 72 69 70 74 3b 0a 20 20 20 20 63   *pScript;.    c
12260 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20  har *zName;.    
12270 69 6e 74 20 6e 41 72 67 20 3d 20 2d 31 3b 0a 20  int nArg = -1;. 
12280 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 36 20 29     if( objc==6 )
12290 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
122a0 61 72 20 2a 7a 20 3d 20 54 63 6c 5f 47 65 74 53  ar *z = Tcl_GetS
122b0 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a  tring(objv[3]);.
122c0 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74        int n = st
122d0 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 20  rlen30(z);.     
122e0 20 69 66 28 20 6e 3e 32 20 26 26 20 73 74 72 6e   if( n>2 && strn
122f0 63 6d 70 28 7a 2c 20 22 2d 61 72 67 63 6f 75 6e  cmp(z, "-argcoun
12300 74 22 2c 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  t",n)==0 ){.    
12310 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49      if( Tcl_GetI
12320 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
12330 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 6e 41 72 67  , objv[4], &nArg
12340 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
12350 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 69 66  RROR;.        if
12360 28 20 6e 41 72 67 3c 30 20 29 7b 0a 20 20 20 20  ( nArg<0 ){.    
12370 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
12380 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
12390 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  number of argume
123a0 6e 74 73 20 6d 75 73 74 20 62 65 20 6e 6f 6e 2d  nts must be non-
123b0 6e 65 67 61 74 69 76 65 22 2c 0a 20 20 20 20 20  negative",.     
123c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
123d0 20 20 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b        (char*)0);
123e0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
123f0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
12400 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
12410 20 20 20 20 20 70 53 63 72 69 70 74 20 3d 20 6f       pScript = o
12420 62 6a 76 5b 35 5d 3b 0a 20 20 20 20 7d 65 6c 73  bjv[5];.    }els
12430 65 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b  e if( objc!=4 ){
12440 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
12450 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
12460 32 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 20 5b  2, objv, "NAME [
12470 2d 61 72 67 63 6f 75 6e 74 20 4e 5d 20 53 43 52  -argcount N] SCR
12480 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65 74  IPT");.      ret
12490 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
124a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
124b0 70 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 33  pScript = objv[3
124c0 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61  ];.    }.    zNa
124d0 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  me = Tcl_GetStri
124e0 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
124f0 5d 2c 20 30 29 3b 0a 20 20 20 20 70 46 75 6e 63  ], 0);.    pFunc
12500 20 3d 20 66 69 6e 64 53 71 6c 46 75 6e 63 28 70   = findSqlFunc(p
12510 44 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  Db, zName);.    
12520 69 66 28 20 70 46 75 6e 63 3d 3d 30 20 29 20 72  if( pFunc==0 ) r
12530 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
12540 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e  .    if( pFunc->
12550 70 53 63 72 69 70 74 20 29 7b 0a 20 20 20 20 20  pScript ){.     
12560 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
12570 74 28 70 46 75 6e 63 2d 3e 70 53 63 72 69 70 74  t(pFunc->pScript
12580 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 75  );.    }.    pFu
12590 6e 63 2d 3e 70 53 63 72 69 70 74 20 3d 20 70 53  nc->pScript = pS
125a0 63 72 69 70 74 3b 0a 20 20 20 20 54 63 6c 5f 49  cript;.    Tcl_I
125b0 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72  ncrRefCount(pScr
125c0 69 70 74 29 3b 0a 20 20 20 20 70 46 75 6e 63 2d  ipt);.    pFunc-
125d0 3e 75 73 65 45 76 61 6c 4f 62 6a 76 20 3d 20 73  >useEvalObjv = s
125e0 61 66 65 54 6f 55 73 65 45 76 61 6c 4f 62 6a 76  afeToUseEvalObjv
125f0 28 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74  (interp, pScript
12600 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
12610 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
12620 69 6f 6e 28 70 44 62 2d 3e 64 62 2c 20 7a 4e 61  ion(pDb->db, zNa
12630 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45  me, nArg, SQLITE
12640 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 20 20 70  _UTF8,.        p
12650 46 75 6e 63 2c 20 74 63 6c 53 71 6c 46 75 6e 63  Func, tclSqlFunc
12660 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
12670 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
12680 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c  {.      rc = TCL
12690 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 54 63  _ERROR;.      Tc
126a0 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
126b0 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69  rp, (char *)sqli
126c0 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e  te3_errmsg(pDb->
126d0 64 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c  db), TCL_VOLATIL
126e0 45 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72  E);.    }.    br
126f0 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
12700 20 2a 2a 20 20 20 20 20 24 64 62 20 69 6e 63 72   **     $db incr
12710 62 6c 6f 62 20 3f 2d 72 65 61 64 6f 6e 6c 79 3f  blob ?-readonly?
12720 20 3f 44 42 3f 20 54 41 42 4c 45 20 43 4f 4c 55   ?DB? TABLE COLU
12730 4d 4e 20 52 4f 57 49 44 0a 20 20 2a 2f 0a 20 20  MN ROWID.  */.  
12740 63 61 73 65 20 44 42 5f 49 4e 43 52 42 4c 4f 42  case DB_INCRBLOB
12750 3a 20 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  : {.#ifdef SQLIT
12760 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
12770 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
12780 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 69 6e  sult(interp, "in
12790 63 72 62 6c 6f 62 20 6e 6f 74 20 61 76 61 69 6c  crblob not avail
127a0 61 62 6c 65 20 69 6e 20 74 68 69 73 20 62 75 69  able in this bui
127b0 6c 64 22 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  ld", (char*)0);.
127c0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
127d0 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 20 20  RROR;.#else.    
127e0 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20 3d  int isReadonly =
127f0 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   0;.    const ch
12800 61 72 20 2a 7a 44 62 20 3d 20 22 6d 61 69 6e 22  ar *zDb = "main"
12810 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
12820 20 2a 7a 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f   *zTable;.    co
12830 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d  nst char *zColum
12840 6e 3b 0a 20 20 20 20 54 63 6c 5f 57 69 64 65 49  n;.    Tcl_WideI
12850 6e 74 20 69 52 6f 77 3b 0a 0a 20 20 20 20 2f 2a  nt iRow;..    /*
12860 20 43 68 65 63 6b 20 66 6f 72 20 74 68 65 20 2d   Check for the -
12870 72 65 61 64 6f 6e 6c 79 20 6f 70 74 69 6f 6e 20  readonly option 
12880 2a 2f 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e  */.    if( objc>
12890 33 20 26 26 20 73 74 72 63 6d 70 28 54 63 6c 5f  3 && strcmp(Tcl_
128a0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
128b0 5d 29 2c 20 22 2d 72 65 61 64 6f 6e 6c 79 22 29  ]), "-readonly")
128c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 73 52  ==0 ){.      isR
128d0 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20  eadonly = 1;.   
128e0 20 7d 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63   }..    if( objc
128f0 21 3d 28 35 2b 69 73 52 65 61 64 6f 6e 6c 79 29  !=(5+isReadonly)
12900 20 26 26 20 6f 62 6a 63 21 3d 28 36 2b 69 73 52   && objc!=(6+isR
12910 65 61 64 6f 6e 6c 79 29 20 29 7b 0a 20 20 20 20  eadonly) ){.    
12920 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
12930 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
12940 6a 76 2c 20 22 3f 2d 72 65 61 64 6f 6e 6c 79 3f  jv, "?-readonly?
12950 20 3f 44 42 3f 20 54 41 42 4c 45 20 43 4f 4c 55   ?DB? TABLE COLU
12960 4d 4e 20 52 4f 57 49 44 22 29 3b 0a 20 20 20 20  MN ROWID");.    
12970 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
12980 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  OR;.    }..    i
12990 66 28 20 6f 62 6a 63 3d 3d 28 36 2b 69 73 52 65  f( objc==(6+isRe
129a0 61 64 6f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20  adonly) ){.     
129b0 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74   zDb = Tcl_GetSt
129c0 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
129d0 20 20 20 7d 0a 20 20 20 20 7a 54 61 62 6c 65 20     }.    zTable 
129e0 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
129f0 6f 62 6a 76 5b 6f 62 6a 63 2d 33 5d 29 3b 0a 20  objv[objc-3]);. 
12a00 20 20 20 7a 43 6f 6c 75 6d 6e 20 3d 20 54 63 6c     zColumn = Tcl
12a10 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
12a20 6f 62 6a 63 2d 32 5d 29 3b 0a 20 20 20 20 72 63  objc-2]);.    rc
12a30 20 3d 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e   = Tcl_GetWideIn
12a40 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
12a50 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 2c 20 26   objv[objc-1], &
12a60 69 52 6f 77 29 3b 0a 0a 20 20 20 20 69 66 28 20  iRow);..    if( 
12a70 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20  rc==TCL_OK ){.  
12a80 20 20 20 20 72 63 20 3d 20 63 72 65 61 74 65 49      rc = createI
12a90 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 28 0a  ncrblobChannel(.
12aa0 20 20 20 20 20 20 20 20 20 20 69 6e 74 65 72 70            interp
12ab0 2c 20 70 44 62 2c 20 7a 44 62 2c 20 7a 54 61 62  , pDb, zDb, zTab
12ac0 6c 65 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 28 73 71  le, zColumn, (sq
12ad0 6c 69 74 65 33 5f 69 6e 74 36 34 29 69 52 6f 77  lite3_int64)iRow
12ae0 2c 20 69 73 52 65 61 64 6f 6e 6c 79 0a 20 20 20  , isReadonly.   
12af0 20 20 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64     );.    }.#end
12b00 69 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  if.    break;.  
12b10 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
12b20 20 24 64 62 20 69 6e 74 65 72 72 75 70 74 0a 20   $db interrupt. 
12b30 20 2a 2a 0a 20 20 2a 2a 20 49 6e 74 65 72 72 75   **.  ** Interru
12b40 70 74 20 74 68 65 20 65 78 65 63 75 74 69 6f 6e  pt the execution
12b50 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f   of the inner-mo
12b60 73 74 20 53 51 4c 20 69 6e 74 65 72 70 72 65 74  st SQL interpret
12b70 65 72 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 63  er.  This.  ** c
12b80 61 75 73 65 73 20 74 68 65 20 53 51 4c 20 73 74  auses the SQL st
12b90 61 74 65 6d 65 6e 74 20 74 6f 20 72 65 74 75 72  atement to retur
12ba0 6e 20 61 6e 20 65 72 72 6f 72 20 6f 66 20 53 51  n an error of SQ
12bb0 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 2e 0a  LITE_INTERRUPT..
12bc0 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 49    */.  case DB_I
12bd0 4e 54 45 52 52 55 50 54 3a 20 7b 0a 20 20 20 20  NTERRUPT: {.    
12be0 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70  sqlite3_interrup
12bf0 74 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20 20 20  t(pDb->db);.    
12c00 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
12c10 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 6e 75  .  **     $db nu
12c20 6c 6c 76 61 6c 75 65 20 3f 53 54 52 49 4e 47 3f  llvalue ?STRING?
12c30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 68 61 6e 67  .  **.  ** Chang
12c40 65 20 74 65 78 74 20 75 73 65 64 20 77 68 65 6e  e text used when
12c50 20 61 20 4e 55 4c 4c 20 63 6f 6d 65 73 20 62 61   a NULL comes ba
12c60 63 6b 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ck from the data
12c70 62 61 73 65 2e 20 49 66 20 3f 53 54 52 49 4e 47  base. If ?STRING
12c80 3f 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 72  ?.  ** is not pr
12c90 65 73 65 6e 74 2c 20 74 68 65 6e 20 74 68 65 20  esent, then the 
12ca0 63 75 72 72 65 6e 74 20 73 74 72 69 6e 67 20 75  current string u
12cb0 73 65 64 20 66 6f 72 20 4e 55 4c 4c 20 69 73 20  sed for NULL is 
12cc0 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2a 20 49  returned..  ** I
12cd0 66 20 53 54 52 49 4e 47 20 69 73 20 70 72 65 73  f STRING is pres
12ce0 65 6e 74 2c 20 74 68 65 6e 20 53 54 52 49 4e 47  ent, then STRING
12cf0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 20 20   is returned..  
12d00 2a 2a 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  **.  */.  case D
12d10 42 5f 4e 55 4c 4c 56 41 4c 55 45 3a 20 7b 0a 20  B_NULLVALUE: {. 
12d20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 26     if( objc!=2 &
12d30 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  & objc!=3 ){.   
12d40 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
12d50 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
12d60 62 6a 76 2c 20 22 4e 55 4c 4c 56 41 4c 55 45 22  bjv, "NULLVALUE"
12d70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
12d80 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
12d90 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33  .    if( objc==3
12da0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65   ){.      int le
12db0 6e 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  n;.      char *z
12dc0 4e 75 6c 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74  Null = Tcl_GetSt
12dd0 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
12de0 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20  [2], &len);.    
12df0 20 20 69 66 28 20 70 44 62 2d 3e 7a 4e 75 6c 6c    if( pDb->zNull
12e00 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
12e10 46 72 65 65 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29  Free(pDb->zNull)
12e20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12e30 69 66 28 20 7a 4e 75 6c 6c 20 26 26 20 6c 65 6e  if( zNull && len
12e40 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  >0 ){.        pD
12e50 62 2d 3e 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f 41  b->zNull = Tcl_A
12e60 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b  lloc( len + 1 );
12e70 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
12e80 70 44 62 2d 3e 7a 4e 75 6c 6c 2c 20 7a 4e 75 6c  pDb->zNull, zNul
12e90 6c 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 20 20 20  l, len);.       
12ea0 20 70 44 62 2d 3e 7a 4e 75 6c 6c 5b 6c 65 6e 5d   pDb->zNull[len]
12eb0 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 7d   = '\0';.      }
12ec0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44  else{.        pD
12ed0 62 2d 3e 7a 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20  b->zNull = 0;.  
12ee0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
12ef0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
12f00 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
12f10 53 74 72 69 6e 67 4f 62 6a 28 70 44 62 2d 3e 7a  StringObj(pDb->z
12f20 4e 75 6c 6c 2c 20 2d 31 29 29 3b 0a 20 20 20 20  Null, -1));.    
12f30 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
12f40 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 6c 61  .  **     $db la
12f50 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 20  st_insert_rowid 
12f60 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72  .  **.  ** Retur
12f70 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  n an integer whi
12f80 63 68 20 69 73 20 74 68 65 20 52 4f 57 49 44 20  ch is the ROWID 
12f90 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63  for the most rec
12fa0 65 6e 74 20 69 6e 73 65 72 74 2e 0a 20 20 2a 2f  ent insert..  */
12fb0 0a 20 20 63 61 73 65 20 44 42 5f 4c 41 53 54 5f  .  case DB_LAST_
12fc0 49 4e 53 45 52 54 5f 52 4f 57 49 44 3a 20 7b 0a  INSERT_ROWID: {.
12fd0 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65      Tcl_Obj *pRe
12fe0 73 75 6c 74 3b 0a 20 20 20 20 54 63 6c 5f 57 69  sult;.    Tcl_Wi
12ff0 64 65 49 6e 74 20 72 6f 77 69 64 3b 0a 20 20 20  deInt rowid;.   
13000 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
13010 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
13020 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
13030 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20  , objv, "");.   
13040 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
13050 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ROR;.    }.    r
13060 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 6c  owid = sqlite3_l
13070 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
13080 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20 20 20 70  (pDb->db);.    p
13090 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74  Result = Tcl_Get
130a0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
130b0 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 57 69  );.    Tcl_SetWi
130c0 64 65 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74  deIntObj(pResult
130d0 2c 20 72 6f 77 69 64 29 3b 0a 20 20 20 20 62 72  , rowid);.    br
130e0 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
130f0 20 2a 2a 20 54 68 65 20 44 42 5f 4f 4e 45 43 4f   ** The DB_ONECO
13100 4c 55 4d 4e 20 6d 65 74 68 6f 64 20 69 73 20 69  LUMN method is i
13110 6d 70 6c 65 6d 65 6e 74 65 64 20 74 6f 67 65 74  mplemented toget
13120 68 65 72 20 77 69 74 68 20 44 42 5f 45 58 49 53  her with DB_EXIS
13130 54 53 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 20  TS..  */..  /*  
13140 20 20 24 64 62 20 70 72 6f 67 72 65 73 73 20 3f    $db progress ?
13150 4e 20 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a  N CALLBACK?.  **
13160 20 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68   .  ** Invoke th
13170 65 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b  e given callback
13180 20 65 76 65 72 79 20 4e 20 76 69 72 74 75 61 6c   every N virtual
13190 20 6d 61 63 68 69 6e 65 20 6f 70 63 6f 64 65 73   machine opcodes
131a0 20 77 68 69 6c 65 20 65 78 65 63 75 74 69 6e 67   while executing
131b0 0a 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20  .  ** queries.. 
131c0 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 50 52   */.  case DB_PR
131d0 4f 47 52 45 53 53 3a 20 7b 0a 20 20 20 20 69 66  OGRESS: {.    if
131e0 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20  ( objc==2 ){.   
131f0 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f     if( pDb->zPro
13200 67 72 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20  gress ){.       
13210 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
13220 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a  t(interp, pDb->z
13230 50 72 6f 67 72 65 73 73 2c 20 28 63 68 61 72 2a  Progress, (char*
13240 29 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  )0);.      }.   
13250 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d   }else if( objc=
13260 3d 34 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  =4 ){.      char
13270 20 2a 7a 50 72 6f 67 72 65 73 73 3b 0a 20 20 20   *zProgress;.   
13280 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
13290 20 20 69 6e 74 20 4e 3b 0a 20 20 20 20 20 20 69    int N;.      i
132a0 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47  f( TCL_OK!=Tcl_G
132b0 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
132c0 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 4e  erp, objv[2], &N
132d0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
132e0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
132f0 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 69 66       };.      if
13300 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73  ( pDb->zProgress
13310 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
13320 46 72 65 65 28 70 44 62 2d 3e 7a 50 72 6f 67 72  Free(pDb->zProgr
13330 65 73 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ess);.      }.  
13340 20 20 20 20 7a 50 72 6f 67 72 65 73 73 20 3d 20      zProgress = 
13350 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
13360 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6c  mObj(objv[3], &l
13370 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  en);.      if( z
13380 50 72 6f 67 72 65 73 73 20 26 26 20 6c 65 6e 3e  Progress && len>
13390 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  0 ){.        pDb
133a0 2d 3e 7a 50 72 6f 67 72 65 73 73 20 3d 20 54 63  ->zProgress = Tc
133b0 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31  l_Alloc( len + 1
133c0 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   );.        memc
133d0 70 79 28 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73  py(pDb->zProgres
133e0 73 2c 20 7a 50 72 6f 67 72 65 73 73 2c 20 6c 65  s, zProgress, le
133f0 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  n+1);.      }els
13400 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  e{.        pDb->
13410 7a 50 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20  zProgress = 0;. 
13420 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53       }.#ifndef S
13430 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52  QLITE_OMIT_PROGR
13440 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 20 20 20  ESS_CALLBACK.   
13450 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f     if( pDb->zPro
13460 67 72 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20  gress ){.       
13470 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69   pDb->interp = i
13480 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73  nterp;.        s
13490 71 6c 69 74 65 33 5f 70 72 6f 67 72 65 73 73 5f  qlite3_progress_
134a0 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c  handler(pDb->db,
134b0 20 4e 2c 20 44 62 50 72 6f 67 72 65 73 73 48 61   N, DbProgressHa
134c0 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20  ndler, pDb);.   
134d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
134e0 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 67 72 65    sqlite3_progre
134f0 73 73 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e  ss_handler(pDb->
13500 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  db, 0, 0, 0);.  
13510 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
13520 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63   }else{.      Tc
13530 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
13540 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
13550 22 4e 20 43 41 4c 4c 42 41 43 4b 22 29 3b 0a 20  "N CALLBACK");. 
13560 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
13570 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
13580 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
13590 2a 20 20 20 20 24 64 62 20 70 72 6f 66 69 6c 65  *    $db profile
135a0 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a   ?CALLBACK?.  **
135b0 0a 20 20 2a 2a 20 4d 61 6b 65 20 61 72 72 61 6e  .  ** Make arran
135c0 67 65 6d 65 6e 74 73 20 74 6f 20 69 6e 76 6f 6b  gements to invok
135d0 65 20 74 68 65 20 43 41 4c 4c 42 41 43 4b 20 72  e the CALLBACK r
135e0 6f 75 74 69 6e 65 20 61 66 74 65 72 20 65 61 63  outine after eac
135f0 68 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 0a  h SQL statement.
13600 20 20 2a 2a 20 74 68 61 74 20 68 61 73 20 72 75    ** that has ru
13610 6e 2e 20 20 54 68 65 20 74 65 78 74 20 6f 66 20  n.  The text of 
13620 74 68 65 20 53 51 4c 20 61 6e 64 20 74 68 65 20  the SQL and the 
13630 61 6d 6f 75 6e 74 20 6f 66 20 65 6c 61 70 73 65  amount of elapse
13640 20 74 69 6d 65 20 61 72 65 0a 20 20 2a 2a 20 61   time are.  ** a
13650 70 70 65 6e 64 65 64 20 74 6f 20 43 41 4c 4c 42  ppended to CALLB
13660 41 43 4b 20 62 65 66 6f 72 65 20 74 68 65 20 73  ACK before the s
13670 63 72 69 70 74 20 69 73 20 72 75 6e 2e 0a 20 20  cript is run..  
13680 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 50 52 4f  */.  case DB_PRO
13690 46 49 4c 45 3a 20 7b 0a 20 20 20 20 69 66 28 20  FILE: {.    if( 
136a0 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20  objc>3 ){.      
136b0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
136c0 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
136d0 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b  , "?CALLBACK?");
136e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
136f0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c  L_ERROR;.    }el
13700 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29  se if( objc==2 )
13710 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  {.      if( pDb-
13720 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20  >zProfile ){.   
13730 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
13740 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44  esult(interp, pD
13750 62 2d 3e 7a 50 72 6f 66 69 6c 65 2c 20 28 63 68  b->zProfile, (ch
13760 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ar*)0);.      }.
13770 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13780 20 63 68 61 72 20 2a 7a 50 72 6f 66 69 6c 65 3b   char *zProfile;
13790 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a  .      int len;.
137a0 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
137b0 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20 20  Profile ){.     
137c0 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d     Tcl_Free(pDb-
137d0 3e 7a 50 72 6f 66 69 6c 65 29 3b 0a 20 20 20 20  >zProfile);.    
137e0 20 20 7d 0a 20 20 20 20 20 20 7a 50 72 6f 66 69    }.      zProfi
137f0 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  le = Tcl_GetStri
13800 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
13810 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20  ], &len);.      
13820 69 66 28 20 7a 50 72 6f 66 69 6c 65 20 26 26 20  if( zProfile && 
13830 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  len>0 ){.       
13840 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 3d   pDb->zProfile =
13850 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20   Tcl_Alloc( len 
13860 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d  + 1 );.        m
13870 65 6d 63 70 79 28 70 44 62 2d 3e 7a 50 72 6f 66  emcpy(pDb->zProf
13880 69 6c 65 2c 20 7a 50 72 6f 66 69 6c 65 2c 20 6c  ile, zProfile, l
13890 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c  en+1);.      }el
138a0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d  se{.        pDb-
138b0 3e 7a 50 72 6f 66 69 6c 65 20 3d 20 30 3b 0a 20  >zProfile = 0;. 
138c0 20 20 20 20 20 7d 0a 23 69 66 20 21 64 65 66 69       }.#if !defi
138d0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
138e0 54 52 41 43 45 29 20 26 26 20 21 64 65 66 69 6e  TRACE) && !defin
138f0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ed(SQLITE_OMIT_F
13900 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20  LOATING_POINT). 
13910 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50       if( pDb->zP
13920 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  rofile ){.      
13930 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20    pDb->interp = 
13940 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20  interp;.        
13950 73 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65 28  sqlite3_profile(
13960 70 44 62 2d 3e 64 62 2c 20 44 62 50 72 6f 66 69  pDb->db, DbProfi
13970 6c 65 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b  leHandler, pDb);
13980 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
13990 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72        sqlite3_pr
139a0 6f 66 69 6c 65 28 70 44 62 2d 3e 64 62 2c 20 30  ofile(pDb->db, 0
139b0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  , 0);.      }.#e
139c0 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 62  ndif.    }.    b
139d0 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
139e0 20 20 2a 2a 20 20 20 20 20 24 64 62 20 72 65 6b    **     $db rek
139f0 65 79 20 4b 45 59 0a 20 20 2a 2a 0a 20 20 2a 2a  ey KEY.  **.  **
13a00 20 43 68 61 6e 67 65 20 74 68 65 20 65 6e 63 72   Change the encr
13a10 79 70 74 69 6f 6e 20 6b 65 79 20 6f 6e 20 74 68  yption key on th
13a20 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e  e currently open
13a30 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a   database..  */.
13a40 20 20 63 61 73 65 20 44 42 5f 52 45 4b 45 59 3a    case DB_REKEY:
13a50 20 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   {.#ifdef SQLITE
13a60 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 69  _HAS_CODEC.    i
13a70 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20 76 6f 69  nt nKey;.    voi
13a80 64 20 2a 70 4b 65 79 3b 0a 23 65 6e 64 69 66 0a  d *pKey;.#endif.
13a90 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20      if( objc!=3 
13aa0 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
13ab0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
13ac0 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4b 45 59 22  , 2, objv, "KEY"
13ad0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
13ae0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
13af0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
13b00 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 70 4b 65  AS_CODEC.    pKe
13b10 79 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41  y = Tcl_GetByteA
13b20 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  rrayFromObj(objv
13b30 5b 32 5d 2c 20 26 6e 4b 65 79 29 3b 0a 20 20 20  [2], &nKey);.   
13b40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65   rc = sqlite3_re
13b50 6b 65 79 28 70 44 62 2d 3e 64 62 2c 20 70 4b 65  key(pDb->db, pKe
13b60 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 20 20 69 66  y, nKey);.    if
13b70 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63  ( rc ){.      Tc
13b80 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
13b90 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 5f 65  nterp, sqlite3_e
13ba0 72 72 73 74 72 28 72 63 29 2c 20 28 63 68 61 72  rrstr(rc), (char
13bb0 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  *)0);.      rc =
13bc0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
13bd0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65  }.#endif.    bre
13be0 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
13bf0 20 24 64 62 20 72 65 73 74 6f 72 65 20 3f 44 41   $db restore ?DA
13c00 54 41 42 41 53 45 3f 20 46 49 4c 45 4e 41 4d 45  TABASE? FILENAME
13c10 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 70 65 6e 20  .  **.  ** Open 
13c20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
13c30 6e 61 6d 65 64 20 46 49 4c 45 4e 41 4d 45 2e 20  named FILENAME. 
13c40 20 54 72 61 6e 73 66 65 72 20 74 68 65 20 63 6f   Transfer the co
13c50 6e 74 65 6e 74 20 0a 20 20 2a 2a 20 6f 66 20 46  ntent .  ** of F
13c60 49 4c 45 4e 41 4d 45 20 69 6e 74 6f 20 74 68 65  ILENAME into the
13c70 20 6c 6f 63 61 6c 20 64 61 74 61 62 61 73 65 20   local database 
13c80 44 41 54 41 42 41 53 45 20 28 64 65 66 61 75 6c  DATABASE (defaul
13c90 74 3a 20 22 6d 61 69 6e 22 29 2e 0a 20 20 2a 2f  t: "main")..  */
13ca0 0a 20 20 63 61 73 65 20 44 42 5f 52 45 53 54 4f  .  case DB_RESTO
13cb0 52 45 3a 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  RE: {.    const 
13cc0 63 68 61 72 20 2a 7a 53 72 63 46 69 6c 65 3b 0a  char *zSrcFile;.
13cd0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
13ce0 7a 44 65 73 74 44 62 3b 0a 20 20 20 20 73 71 6c  zDestDb;.    sql
13cf0 69 74 65 33 20 2a 70 53 72 63 3b 0a 20 20 20 20  ite3 *pSrc;.    
13d00 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a  sqlite3_backup *
13d10 70 42 61 63 6b 75 70 3b 0a 20 20 20 20 69 6e 74  pBackup;.    int
13d20 20 6e 54 69 6d 65 6f 75 74 20 3d 20 30 3b 0a 0a   nTimeout = 0;..
13d30 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20      if( objc==3 
13d40 29 7b 0a 20 20 20 20 20 20 7a 44 65 73 74 44 62  ){.      zDestDb
13d50 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 20   = "main";.     
13d60 20 7a 53 72 63 46 69 6c 65 20 3d 20 54 63 6c 5f   zSrcFile = Tcl_
13d70 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
13d80 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ]);.    }else if
13d90 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20  ( objc==4 ){.   
13da0 20 20 20 7a 44 65 73 74 44 62 20 3d 20 54 63 6c     zDestDb = Tcl
13db0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
13dc0 32 5d 29 3b 0a 20 20 20 20 20 20 7a 53 72 63 46  2]);.      zSrcF
13dd0 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ile = Tcl_GetStr
13de0 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20  ing(objv[3]);.  
13df0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54    }else{.      T
13e00 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
13e10 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
13e20 20 22 3f 44 41 54 41 42 41 53 45 3f 20 46 49 4c   "?DATABASE? FIL
13e30 45 4e 41 4d 45 22 29 3b 0a 20 20 20 20 20 20 72  ENAME");.      r
13e40 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
13e50 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
13e60 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28  sqlite3_open_v2(
13e70 7a 53 72 63 46 69 6c 65 2c 20 26 70 53 72 63 2c  zSrcFile, &pSrc,
13e80 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
13e90 44 4f 4e 4c 59 2c 20 30 29 3b 0a 20 20 20 20 69  DONLY, 0);.    i
13ea0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
13eb0 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
13ec0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
13ed0 70 2c 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20  p, "cannot open 
13ee0 73 6f 75 72 63 65 20 64 61 74 61 62 61 73 65 3a  source database:
13ef0 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73   ",.           s
13f00 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 53  qlite3_errmsg(pS
13f10 72 63 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  rc), (char*)0);.
13f20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c        sqlite3_cl
13f30 6f 73 65 28 70 53 72 63 29 3b 0a 20 20 20 20 20  ose(pSrc);.     
13f40 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
13f50 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 61  R;.    }.    pBa
13f60 63 6b 75 70 20 3d 20 73 71 6c 69 74 65 33 5f 62  ckup = sqlite3_b
13f70 61 63 6b 75 70 5f 69 6e 69 74 28 70 44 62 2d 3e  ackup_init(pDb->
13f80 64 62 2c 20 7a 44 65 73 74 44 62 2c 20 70 53 72  db, zDestDb, pSr
13f90 63 2c 20 22 6d 61 69 6e 22 29 3b 0a 20 20 20 20  c, "main");.    
13fa0 69 66 28 20 70 42 61 63 6b 75 70 3d 3d 30 20 29  if( pBackup==0 )
13fb0 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
13fc0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
13fd0 20 22 72 65 73 74 6f 72 65 20 66 61 69 6c 65 64   "restore failed
13fe0 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  : ",.           
13ff0 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
14000 44 62 2d 3e 64 62 29 2c 20 28 63 68 61 72 2a 29  Db->db), (char*)
14010 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
14020 33 5f 63 6c 6f 73 65 28 70 53 72 63 29 3b 0a 20  3_close(pSrc);. 
14030 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
14040 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
14050 20 77 68 69 6c 65 28 20 28 72 63 20 3d 20 73 71   while( (rc = sq
14060 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 73 74 65  lite3_backup_ste
14070 70 28 70 42 61 63 6b 75 70 2c 31 30 30 29 29 3d  p(pBackup,100))=
14080 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20  =SQLITE_OK.     
14090 20 20 20 20 20 20 20 20 20 7c 7c 20 72 63 3d 3d           || rc==
140a0 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20  SQLITE_BUSY ){. 
140b0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
140c0 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20  ITE_BUSY ){.    
140d0 20 20 20 20 69 66 28 20 6e 54 69 6d 65 6f 75 74      if( nTimeout
140e0 2b 2b 20 3e 3d 20 33 20 29 20 62 72 65 61 6b 3b  ++ >= 3 ) break;
140f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14100 5f 73 6c 65 65 70 28 31 30 30 29 3b 0a 20 20 20  _sleep(100);.   
14110 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
14120 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 66 69  qlite3_backup_fi
14130 6e 69 73 68 28 70 42 61 63 6b 75 70 29 3b 0a 20  nish(pBackup);. 
14140 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
14150 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
14160 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20  rc = TCL_OK;.   
14170 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53   }else if( rc==S
14180 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20 72 63  QLITE_BUSY || rc
14190 3d 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20  ==SQLITE_LOCKED 
141a0 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
141b0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
141c0 2c 20 22 72 65 73 74 6f 72 65 20 66 61 69 6c 65  , "restore faile
141d0 64 3a 20 73 6f 75 72 63 65 20 64 61 74 61 62 61  d: source databa
141e0 73 65 20 62 75 73 79 22 2c 0a 20 20 20 20 20 20  se busy",.      
141f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14200 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
14210 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52    rc = TCL_ERROR
14220 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
14230 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
14240 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 72 65 73  ult(interp, "res
14250 74 6f 72 65 20 66 61 69 6c 65 64 3a 20 22 2c 0a  tore failed: ",.
14260 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
14270 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64  e3_errmsg(pDb->d
14280 62 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  b), (char*)0);. 
14290 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52       rc = TCL_ER
142a0 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ROR;.    }.    s
142b0 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 53 72  qlite3_close(pSr
142c0 63 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  c);.    break;. 
142d0 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
142e0 20 20 24 64 62 20 73 74 61 74 75 73 20 28 73 74    $db status (st
142f0 65 70 7c 73 6f 72 74 7c 61 75 74 6f 69 6e 64 65  ep|sort|autoinde
14300 78 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 69 73  x).  **.  ** Dis
14310 70 6c 61 79 20 53 51 4c 49 54 45 5f 53 54 4d 54  play SQLITE_STMT
14320 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f  STATUS_FULLSCAN_
14330 53 54 45 50 20 6f 72 20 0a 20 20 2a 2a 20 53 51  STEP or .  ** SQ
14340 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
14350 53 4f 52 54 20 66 6f 72 20 74 68 65 20 6d 6f 73  SORT for the mos
14360 74 20 72 65 63 65 6e 74 20 65 76 61 6c 2e 0a 20  t recent eval.. 
14370 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 53 54   */.  case DB_ST
14380 41 54 55 53 3a 20 7b 0a 20 20 20 20 69 6e 74 20  ATUS: {.    int 
14390 76 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  v;.    const cha
143a0 72 20 2a 7a 4f 70 3b 0a 20 20 20 20 69 66 28 20  r *zOp;.    if( 
143b0 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20  objc!=3 ){.     
143c0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
143d0 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
143e0 76 2c 20 22 28 73 74 65 70 7c 73 6f 72 74 7c 61  v, "(step|sort|a
143f0 75 74 6f 69 6e 64 65 78 29 22 29 3b 0a 20 20 20  utoindex)");.   
14400 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
14410 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  ROR;.    }.    z
14420 4f 70 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  Op = Tcl_GetStri
14430 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20  ng(objv[2]);.   
14440 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4f 70 2c   if( strcmp(zOp,
14450 20 22 73 74 65 70 22 29 3d 3d 30 20 29 7b 0a 20   "step")==0 ){. 
14460 20 20 20 20 20 76 20 3d 20 70 44 62 2d 3e 6e 53       v = pDb->nS
14470 74 65 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  tep;.    }else i
14480 66 28 20 73 74 72 63 6d 70 28 7a 4f 70 2c 20 22  f( strcmp(zOp, "
14490 73 6f 72 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  sort")==0 ){.   
144a0 20 20 20 76 20 3d 20 70 44 62 2d 3e 6e 53 6f 72     v = pDb->nSor
144b0 74 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  t;.    }else if(
144c0 20 73 74 72 63 6d 70 28 7a 4f 70 2c 20 22 61 75   strcmp(zOp, "au
144d0 74 6f 69 6e 64 65 78 22 29 3d 3d 30 20 29 7b 0a  toindex")==0 ){.
144e0 20 20 20 20 20 20 76 20 3d 20 70 44 62 2d 3e 6e        v = pDb->n
144f0 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65  Index;.    }else
14500 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
14510 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
14520 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 62   .            "b
14530 61 64 20 61 72 67 75 6d 65 6e 74 3a 20 73 68 6f  ad argument: sho
14540 75 6c 64 20 62 65 20 61 75 74 6f 69 6e 64 65 78  uld be autoindex
14550 2c 20 73 74 65 70 2c 20 6f 72 20 73 6f 72 74 22  , step, or sort"
14560 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  , .            (
14570 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
14580 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
14590 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f  ;.    }.    Tcl_
145a0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
145b0 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
145c0 62 6a 28 76 29 29 3b 0a 20 20 20 20 62 72 65 61  bj(v));.    brea
145d0 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 0a 20  k;.  }.  .  /*. 
145e0 20 2a 2a 20 20 20 20 20 24 64 62 20 74 69 6d 65   **     $db time
145f0 6f 75 74 20 4d 49 4c 4c 45 53 45 43 4f 4e 44 53  out MILLESECONDS
14600 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 65 6c 61 79  .  **.  ** Delay
14610 20 66 6f 72 20 74 68 65 20 6e 75 6d 62 65 72 20   for the number 
14620 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20  of milliseconds 
14630 73 70 65 63 69 66 69 65 64 20 77 68 65 6e 20 61  specified when a
14640 20 66 69 6c 65 20 69 73 20 6c 6f 63 6b 65 64 2e   file is locked.
14650 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
14660 54 49 4d 45 4f 55 54 3a 20 7b 0a 20 20 20 20 69  TIMEOUT: {.    i
14670 6e 74 20 6d 73 3b 0a 20 20 20 20 69 66 28 20 6f  nt ms;.    if( o
14680 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc!=3 ){.      
14690 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
146a0 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
146b0 2c 20 22 4d 49 4c 4c 49 53 45 43 4f 4e 44 53 22  , "MILLISECONDS"
146c0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
146d0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
146e0 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74  .    if( Tcl_Get
146f0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
14700 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6d 73 29  p, objv[2], &ms)
14710 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
14720 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ROR;.    sqlite3
14730 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 70 44  _busy_timeout(pD
14740 62 2d 3e 64 62 2c 20 6d 73 29 3b 0a 20 20 20 20  b->db, ms);.    
14750 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20  break;.  }.  .  
14760 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20  /*.  **     $db 
14770 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 0a 20 20  total_changes.  
14780 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74  **.  ** Return t
14790 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
147a0 73 20 74 68 61 74 20 77 65 72 65 20 6d 6f 64 69  s that were modi
147b0 66 69 65 64 2c 20 69 6e 73 65 72 74 65 64 2c 20  fied, inserted, 
147c0 6f 72 20 64 65 6c 65 74 65 64 20 0a 20 20 2a 2a  or deleted .  **
147d0 20 73 69 6e 63 65 20 74 68 65 20 64 61 74 61 62   since the datab
147e0 61 73 65 20 68 61 6e 64 6c 65 20 77 61 73 20 63  ase handle was c
147f0 72 65 61 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 63  reated..  */.  c
14800 61 73 65 20 44 42 5f 54 4f 54 41 4c 5f 43 48 41  ase DB_TOTAL_CHA
14810 4e 47 45 53 3a 20 7b 0a 20 20 20 20 54 63 6c 5f  NGES: {.    Tcl_
14820 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20  Obj *pResult;.  
14830 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
14840 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
14850 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
14860 32 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20  2, objv, "");.  
14870 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
14880 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
14890 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65  pResult = Tcl_Ge
148a0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
148b0 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 49  p);.    Tcl_SetI
148c0 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 73  ntObj(pResult, s
148d0 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61  qlite3_total_cha
148e0 6e 67 65 73 28 70 44 62 2d 3e 64 62 29 29 3b 0a  nges(pDb->db));.
148f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
14900 20 20 2f 2a 20 20 20 20 24 64 62 20 74 72 61 63    /*    $db trac
14910 65 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a  e ?CALLBACK?.  *
14920 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20 61 72 72 61  *.  ** Make arra
14930 6e 67 65 6d 65 6e 74 73 20 74 6f 20 69 6e 76 6f  ngements to invo
14940 6b 65 20 74 68 65 20 43 41 4c 4c 42 41 43 4b 20  ke the CALLBACK 
14950 72 6f 75 74 69 6e 65 20 66 6f 72 20 65 61 63 68  routine for each
14960 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 0a 20   SQL statement. 
14970 20 2a 2a 20 74 68 61 74 20 69 73 20 65 78 65 63   ** that is exec
14980 75 74 65 64 2e 20 20 54 68 65 20 74 65 78 74 20  uted.  The text 
14990 6f 66 20 74 68 65 20 53 51 4c 20 69 73 20 61 70  of the SQL is ap
149a0 70 65 6e 64 65 64 20 74 6f 20 43 41 4c 4c 42 41  pended to CALLBA
149b0 43 4b 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 69  CK before.  ** i
149c0 74 20 69 73 20 65 78 65 63 75 74 65 64 2e 0a 20  t is executed.. 
149d0 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 54 52   */.  case DB_TR
149e0 41 43 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f  ACE: {.    if( o
149f0 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54  bjc>3 ){.      T
14a00 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
14a10 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
14a20 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a   "?CALLBACK?");.
14a30 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
14a40 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73  _ERROR;.    }els
14a50 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b  e if( objc==2 ){
14a60 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
14a70 7a 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20  zTrace ){.      
14a80 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
14a90 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e  lt(interp, pDb->
14aa0 7a 54 72 61 63 65 2c 20 28 63 68 61 72 2a 29 30  zTrace, (char*)0
14ab0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
14ac0 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72  else{.      char
14ad0 20 2a 7a 54 72 61 63 65 3b 0a 20 20 20 20 20 20   *zTrace;.      
14ae0 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69  int len;.      i
14af0 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29  f( pDb->zTrace )
14b00 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72  {.        Tcl_Fr
14b10 65 65 28 70 44 62 2d 3e 7a 54 72 61 63 65 29 3b  ee(pDb->zTrace);
14b20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
14b30 54 72 61 63 65 20 3d 20 54 63 6c 5f 47 65 74 53  Trace = Tcl_GetS
14b40 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
14b50 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20  v[2], &len);.   
14b60 20 20 20 69 66 28 20 7a 54 72 61 63 65 20 26 26     if( zTrace &&
14b70 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20   len>0 ){.      
14b80 20 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 3d 20    pDb->zTrace = 
14b90 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b  Tcl_Alloc( len +
14ba0 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65   1 );.        me
14bb0 6d 63 70 79 28 70 44 62 2d 3e 7a 54 72 61 63 65  mcpy(pDb->zTrace
14bc0 2c 20 7a 54 72 61 63 65 2c 20 6c 65 6e 2b 31 29  , zTrace, len+1)
14bd0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
14be0 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 54 72 61         pDb->zTra
14bf0 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ce = 0;.      }.
14c00 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
14c10 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20  ITE_OMIT_TRACE) 
14c20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
14c30 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
14c40 5f 50 4f 49 4e 54 29 0a 20 20 20 20 20 20 69 66  _POINT).      if
14c50 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b  ( pDb->zTrace ){
14c60 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e  .        pDb->in
14c70 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20  terp = interp;. 
14c80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74         sqlite3_t
14c90 72 61 63 65 28 70 44 62 2d 3e 64 62 2c 20 44 62  race(pDb->db, Db
14ca0 54 72 61 63 65 48 61 6e 64 6c 65 72 2c 20 70 44  TraceHandler, pD
14cb0 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  b);.      }else{
14cc0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14cd0 5f 74 72 61 63 65 28 70 44 62 2d 3e 64 62 2c 20  _trace(pDb->db, 
14ce0 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23  0, 0);.      }.#
14cf0 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
14d00 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
14d10 20 20 20 20 24 64 62 20 74 72 61 6e 73 61 63 74      $db transact
14d20 69 6f 6e 20 5b 2d 64 65 66 65 72 72 65 64 7c 2d  ion [-deferred|-
14d30 69 6d 6d 65 64 69 61 74 65 7c 2d 65 78 63 6c 75  immediate|-exclu
14d40 73 69 76 65 5d 20 53 43 52 49 50 54 0a 20 20 2a  sive] SCRIPT.  *
14d50 2a 0a 20 20 2a 2a 20 53 74 61 72 74 20 61 20 6e  *.  ** Start a n
14d60 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28  ew transaction (
14d70 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c  if we are not al
14d80 72 65 61 64 79 20 69 6e 20 74 68 65 20 6d 69 64  ready in the mid
14d90 73 74 20 6f 66 20 61 0a 20 20 2a 2a 20 74 72 61  st of a.  ** tra
14da0 6e 73 61 63 74 69 6f 6e 29 20 61 6e 64 20 65 78  nsaction) and ex
14db0 65 63 75 74 65 20 74 68 65 20 54 43 4c 20 73 63  ecute the TCL sc
14dc0 72 69 70 74 20 53 43 52 49 50 54 2e 20 20 41 66  ript SCRIPT.  Af
14dd0 74 65 72 20 53 43 52 49 50 54 0a 20 20 2a 2a 20  ter SCRIPT.  ** 
14de0 63 6f 6d 70 6c 65 74 65 73 2c 20 65 69 74 68 65  completes, eithe
14df0 72 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61  r commit the tra
14e00 6e 73 61 63 74 69 6f 6e 20 6f 72 20 72 6f 6c 6c  nsaction or roll
14e10 20 69 74 20 62 61 63 6b 20 69 66 20 53 43 52 49   it back if SCRI
14e20 50 54 0a 20 20 2a 2a 20 74 68 72 6f 77 73 20 61  PT.  ** throws a
14e30 6e 20 65 78 63 65 70 74 69 6f 6e 2e 20 20 4f 72  n exception.  Or
14e40 20 69 66 20 6e 6f 20 6e 65 77 20 74 72 61 6e 73   if no new trans
14e50 61 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65  ation was starte
14e60 64 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 20  d, do nothing.. 
14e70 20 2a 2a 20 70 61 73 73 20 74 68 65 20 65 78 63   ** pass the exc
14e80 65 70 74 69 6f 6e 20 6f 6e 20 75 70 20 74 68 65  eption on up the
14e90 20 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a   stack..  **.  *
14ea0 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 77  * This command w
14eb0 61 73 20 69 6e 73 70 69 72 65 64 20 62 79 20 44  as inspired by D
14ec0 61 76 65 20 54 68 6f 6d 61 73 27 73 20 74 61 6c  ave Thomas's tal
14ed0 6b 20 6f 6e 20 52 75 62 79 20 61 74 20 74 68 65  k on Ruby at the
14ee0 0a 20 20 2a 2a 20 32 30 30 35 20 4f 27 52 65 69  .  ** 2005 O'Rei
14ef0 6c 6c 79 20 4f 70 65 6e 20 53 6f 75 72 63 65 20  lly Open Source 
14f00 43 6f 6e 76 65 6e 74 69 6f 6e 20 28 4f 53 43 4f  Convention (OSCO
14f10 4e 29 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  N)..  */.  case 
14f20 44 42 5f 54 52 41 4e 53 41 43 54 49 4f 4e 3a 20  DB_TRANSACTION: 
14f30 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  {.    Tcl_Obj *p
14f40 53 63 72 69 70 74 3b 0a 20 20 20 20 63 6f 6e 73  Script;.    cons
14f50 74 20 63 68 61 72 20 2a 7a 42 65 67 69 6e 20 3d  t char *zBegin =
14f60 20 22 53 41 56 45 50 4f 49 4e 54 20 5f 74 63 6c   "SAVEPOINT _tcl
14f70 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22 3b 0a 20  _transaction";. 
14f80 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 26     if( objc!=3 &
14f90 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  & objc!=4 ){.   
14fa0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
14fb0 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
14fc0 62 6a 76 2c 20 22 5b 54 59 50 45 5d 20 53 43 52  bjv, "[TYPE] SCR
14fd0 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65 74  IPT");.      ret
14fe0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
14ff0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 44     }..    if( pD
15000 62 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  b->nTransaction=
15010 3d 30 20 26 26 20 6f 62 6a 63 3d 3d 34 20 29 7b  =0 && objc==4 ){
15020 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
15030 6e 73 74 20 63 68 61 72 20 2a 54 54 59 50 45 5f  nst char *TTYPE_
15040 73 74 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  strs[] = {.     
15050 20 20 20 22 64 65 66 65 72 72 65 64 22 2c 20 20     "deferred",  
15060 20 22 65 78 63 6c 75 73 69 76 65 22 2c 20 20 22   "exclusive",  "
15070 69 6d 6d 65 64 69 61 74 65 22 2c 20 30 0a 20 20  immediate", 0.  
15080 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 65 6e 75      };.      enu
15090 6d 20 54 54 59 50 45 5f 65 6e 75 6d 20 7b 0a 20  m TTYPE_enum {. 
150a0 20 20 20 20 20 20 20 54 54 59 50 45 5f 44 45 46         TTYPE_DEF
150b0 45 52 52 45 44 2c 20 54 54 59 50 45 5f 45 58 43  ERRED, TTYPE_EXC
150c0 4c 55 53 49 56 45 2c 20 54 54 59 50 45 5f 49 4d  LUSIVE, TTYPE_IM
150d0 4d 45 44 49 41 54 45 0a 20 20 20 20 20 20 7d 3b  MEDIATE.      };
150e0 0a 20 20 20 20 20 20 69 6e 74 20 74 74 79 70 65  .      int ttype
150f0 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f  ;.      if( Tcl_
15100 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28  GetIndexFromObj(
15110 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
15120 20 54 54 59 50 45 5f 73 74 72 73 2c 20 22 74 72   TTYPE_strs, "tr
15130 61 6e 73 61 63 74 69 6f 6e 20 74 79 70 65 22 2c  ansaction type",
15140 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
15160 2c 20 26 74 74 79 70 65 29 20 29 7b 0a 20 20 20  , &ttype) ){.   
15170 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
15180 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
15190 20 20 20 20 20 73 77 69 74 63 68 28 20 28 65 6e       switch( (en
151a0 75 6d 20 54 54 59 50 45 5f 65 6e 75 6d 29 74 74  um TTYPE_enum)tt
151b0 79 70 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ype ){.        c
151c0 61 73 65 20 54 54 59 50 45 5f 44 45 46 45 52 52  ase TTYPE_DEFERR
151d0 45 44 3a 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20  ED:    /* no-op 
151e0 2a 2f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  */;             
151f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
15200 20 20 20 63 61 73 65 20 54 54 59 50 45 5f 45 58     case TTYPE_EX
15210 43 4c 55 53 49 56 45 3a 20 20 20 7a 42 65 67 69  CLUSIVE:   zBegi
15220 6e 20 3d 20 22 42 45 47 49 4e 20 45 58 43 4c 55  n = "BEGIN EXCLU
15230 53 49 56 45 22 3b 20 20 62 72 65 61 6b 3b 0a 20  SIVE";  break;. 
15240 20 20 20 20 20 20 20 63 61 73 65 20 54 54 59 50         case TTYP
15250 45 5f 49 4d 4d 45 44 49 41 54 45 3a 20 20 20 7a  E_IMMEDIATE:   z
15260 42 65 67 69 6e 20 3d 20 22 42 45 47 49 4e 20 49  Begin = "BEGIN I
15270 4d 4d 45 44 49 41 54 45 22 3b 20 20 62 72 65 61  MMEDIATE";  brea
15280 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
15290 0a 20 20 20 20 70 53 63 72 69 70 74 20 3d 20 6f  .    pScript = o
152a0 62 6a 76 5b 6f 62 6a 63 2d 31 5d 3b 0a 0a 20 20  bjv[objc-1];..  
152b0 20 20 2f 2a 20 52 75 6e 20 74 68 65 20 53 51 4c    /* Run the SQL
152c0 69 74 65 20 42 45 47 49 4e 20 63 6f 6d 6d 61 6e  ite BEGIN comman
152d0 64 20 74 6f 20 6f 70 65 6e 20 61 20 74 72 61 6e  d to open a tran
152e0 73 61 63 74 69 6f 6e 20 6f 72 20 73 61 76 65 70  saction or savep
152f0 6f 69 6e 74 2e 20 2a 2f 0a 20 20 20 20 70 44 62  oint. */.    pDb
15300 2d 3e 64 69 73 61 62 6c 65 41 75 74 68 2b 2b 3b  ->disableAuth++;
15310 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
15320 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20  3_exec(pDb->db, 
15330 7a 42 65 67 69 6e 2c 20 30 2c 20 30 2c 20 30 29  zBegin, 0, 0, 0)
15340 3b 0a 20 20 20 20 70 44 62 2d 3e 64 69 73 61 62  ;.    pDb->disab
15350 6c 65 41 75 74 68 2d 2d 3b 0a 20 20 20 20 69 66  leAuth--;.    if
15360 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15370 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
15380 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
15390 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
153a0 28 70 44 62 2d 3e 64 62 29 2c 20 28 63 68 61 72  (pDb->db), (char
153b0 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  *)0);.      retu
153c0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
153d0 20 20 7d 0a 20 20 20 20 70 44 62 2d 3e 6e 54 72    }.    pDb->nTr
153e0 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 0a 20 20  ansaction++;..  
153f0 20 20 2f 2a 20 49 66 20 75 73 69 6e 67 20 4e 52    /* If using NR
15400 45 2c 20 73 63 68 65 64 75 6c 65 20 61 20 63 61  E, schedule a ca
15410 6c 6c 62 61 63 6b 20 74 6f 20 69 6e 76 6f 6b 65  llback to invoke
15420 20 74 68 65 20 73 63 72 69 70 74 20 70 53 63 72   the script pScr
15430 69 70 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  ipt, then.    **
15440 20 61 20 73 65 63 6f 6e 64 20 63 61 6c 6c 62 61   a second callba
15450 63 6b 20 74 6f 20 63 6f 6d 6d 69 74 20 28 6f 72  ck to commit (or
15460 20 72 6f 6c 6c 62 61 63 6b 29 20 74 68 65 20 74   rollback) the t
15470 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 73 61  ransaction or sa
15480 76 65 70 6f 69 6e 74 0a 20 20 20 20 2a 2a 20 6f  vepoint.    ** o
15490 70 65 6e 65 64 20 61 62 6f 76 65 2e 20 49 66 20  pened above. If 
154a0 6e 6f 74 20 75 73 69 6e 67 20 4e 52 45 2c 20 65  not using NRE, e
154b0 76 61 6c 75 61 74 65 20 74 68 65 20 73 63 72 69  valuate the scri
154c0 70 74 20 64 69 72 65 63 74 6c 79 2c 20 74 68 65  pt directly, the
154d0 6e 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 66 75  n.    ** call fu
154e0 6e 63 74 69 6f 6e 20 44 62 54 72 61 6e 73 50 6f  nction DbTransPo
154f0 73 74 43 6d 64 28 29 20 74 6f 20 63 6f 6d 6d 69  stCmd() to commi
15500 74 20 28 6f 72 20 72 6f 6c 6c 62 61 63 6b 29 20  t (or rollback) 
15510 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
15520 0a 20 20 20 20 2a 2a 20 6f 72 20 73 61 76 65 70  .    ** or savep
15530 6f 69 6e 74 2e 20 20 2a 2f 0a 20 20 20 20 69 66  oint.  */.    if
15540 28 20 44 62 55 73 65 4e 72 65 28 29 20 29 7b 0a  ( DbUseNre() ){.
15550 20 20 20 20 20 20 54 63 6c 5f 4e 52 41 64 64 43        Tcl_NRAddC
15560 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20  allback(interp, 
15570 44 62 54 72 61 6e 73 50 6f 73 74 43 6d 64 2c 20  DbTransPostCmd, 
15580 63 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  cd, 0, 0, 0);.  
15590 20 20 20 20 28 76 6f 69 64 29 54 63 6c 5f 4e 52      (void)Tcl_NR
155a0 45 76 61 6c 4f 62 6a 28 69 6e 74 65 72 70 2c 20  EvalObj(interp, 
155b0 70 53 63 72 69 70 74 2c 20 30 29 3b 0a 20 20 20  pScript, 0);.   
155c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
155d0 20 3d 20 44 62 54 72 61 6e 73 50 6f 73 74 43 6d   = DbTransPostCm
155e0 64 28 26 63 64 2c 20 69 6e 74 65 72 70 2c 20 54  d(&cd, interp, T
155f0 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74  cl_EvalObjEx(int
15600 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20 30 29  erp, pScript, 0)
15610 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65  );.    }.    bre
15620 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
15630 2a 2a 20 20 20 20 24 64 62 20 75 6e 6c 6f 63 6b  **    $db unlock
15640 5f 6e 6f 74 69 66 79 20 3f 73 63 72 69 70 74 3f  _notify ?script?
15650 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
15660 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 3a 20 7b  UNLOCK_NOTIFY: {
15670 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
15680 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f  ENABLE_UNLOCK_NO
15690 54 49 46 59 0a 20 20 20 20 54 63 6c 5f 41 70 70  TIFY.    Tcl_App
156a0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
156b0 2c 20 22 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79  , "unlock_notify
156c0 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 69   not available i
156d0 6e 20 74 68 69 73 20 62 75 69 6c 64 22 2c 0a 20  n this build",. 
156e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
156f0 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b 0a 20      (char*)0);. 
15700 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f     rc = TCL_ERRO
15710 52 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28  R;.#else.    if(
15720 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63   objc!=2 && objc
15730 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=3 ){.      Tcl
15740 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
15750 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
15760 3f 53 43 52 49 50 54 3f 22 29 3b 0a 20 20 20 20  ?SCRIPT?");.    
15770 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52    rc = TCL_ERROR
15780 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
15790 20 20 20 76 6f 69 64 20 28 2a 78 4e 6f 74 69 66     void (*xNotif
157a0 79 29 28 76 6f 69 64 20 2a 2a 2c 20 69 6e 74 29  y)(void **, int)
157b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 76 6f 69 64   = 0;.      void
157c0 20 2a 70 4e 6f 74 69 66 79 41 72 67 20 3d 20 30   *pNotifyArg = 0
157d0 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  ;..      if( pDb
157e0 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 20  ->pUnlockNotify 
157f0 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 44  ){.        Tcl_D
15800 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d  ecrRefCount(pDb-
15810 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 29 3b  >pUnlockNotify);
15820 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 70 55  .        pDb->pU
15830 6e 6c 6f 63 6b 4e 6f 74 69 66 79 20 3d 20 30 3b  nlockNotify = 0;
15840 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  .      }.  .    
15850 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b    if( objc==3 ){
15860 0a 20 20 20 20 20 20 20 20 78 4e 6f 74 69 66 79  .        xNotify
15870 20 3d 20 44 62 55 6e 6c 6f 63 6b 4e 6f 74 69 66   = DbUnlockNotif
15880 79 3b 0a 20 20 20 20 20 20 20 20 70 4e 6f 74 69  y;.        pNoti
15890 66 79 41 72 67 20 3d 20 28 76 6f 69 64 20 2a 29  fyArg = (void *)
158a0 70 44 62 3b 0a 20 20 20 20 20 20 20 20 70 44 62  pDb;.        pDb
158b0 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 20  ->pUnlockNotify 
158c0 3d 20 6f 62 6a 76 5b 32 5d 3b 0a 20 20 20 20 20  = objv[2];.     
158d0 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
158e0 75 6e 74 28 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b  unt(pDb->pUnlock
158f0 4e 6f 74 69 66 79 29 3b 0a 20 20 20 20 20 20 7d  Notify);.      }
15900 0a 20 20 0a 20 20 20 20 20 20 69 66 28 20 73 71  .  .      if( sq
15910 6c 69 74 65 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74  lite3_unlock_not
15920 69 66 79 28 70 44 62 2d 3e 64 62 2c 20 78 4e 6f  ify(pDb->db, xNo
15930 74 69 66 79 2c 20 70 4e 6f 74 69 66 79 41 72 67  tify, pNotifyArg
15940 29 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  ) ){.        Tcl
15950 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
15960 74 65 72 70 2c 20 73 71 6c 69 74 65 33 5f 65 72  terp, sqlite3_er
15970 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 28  rmsg(pDb->db), (
15980 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
15990 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52    rc = TCL_ERROR
159a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
159b0 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b  #endif.    break
159c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
159d0 20 20 20 20 24 64 62 20 77 61 6c 5f 68 6f 6f 6b      $db wal_hook
159e0 20 3f 73 63 72 69 70 74 3f 0a 20 20 2a 2a 20 20   ?script?.  **  
159f0 20 20 24 64 62 20 75 70 64 61 74 65 5f 68 6f 6f    $db update_hoo
15a00 6b 20 3f 73 63 72 69 70 74 3f 0a 20 20 2a 2a 20  k ?script?.  ** 
15a10 20 20 20 24 64 62 20 72 6f 6c 6c 62 61 63 6b 5f     $db rollback_
15a20 68 6f 6f 6b 20 3f 73 63 72 69 70 74 3f 0a 20 20  hook ?script?.  
15a30 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 57 41 4c  */.  case DB_WAL
15a40 5f 48 4f 4f 4b 3a 20 0a 20 20 63 61 73 65 20 44  _HOOK: .  case D
15a50 42 5f 55 50 44 41 54 45 5f 48 4f 4f 4b 3a 20 0a  B_UPDATE_HOOK: .
15a60 20 20 63 61 73 65 20 44 42 5f 52 4f 4c 4c 42 41    case DB_ROLLBA
15a70 43 4b 5f 48 4f 4f 4b 3a 20 7b 0a 0a 20 20 20 20  CK_HOOK: {..    
15a80 2f 2a 20 73 65 74 20 70 70 48 6f 6f 6b 20 74 6f  /* set ppHook to
15a90 20 70 6f 69 6e 74 20 61 74 20 70 55 70 64 61 74   point at pUpdat
15aa0 65 48 6f 6f 6b 20 6f 72 20 70 52 6f 6c 6c 62 61  eHook or pRollba
15ab0 63 6b 48 6f 6f 6b 2c 20 64 65 70 65 6e 64 69 6e  ckHook, dependin
15ac0 67 20 6f 6e 20 0a 20 20 20 20 2a 2a 20 77 68 65  g on .    ** whe
15ad0 74 68 65 72 20 5b 24 64 62 20 75 70 64 61 74 65  ther [$db update
15ae0 5f 68 6f 6f 6b 5d 20 6f 72 20 5b 24 64 62 20 72  _hook] or [$db r
15af0 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 5d 20 77 61  ollback_hook] wa
15b00 73 20 69 6e 76 6f 6b 65 64 2e 0a 20 20 20 20 2a  s invoked..    *
15b10 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a  /.    Tcl_Obj **
15b20 70 70 48 6f 6f 6b 3b 20 0a 20 20 20 20 69 66 28  ppHook; .    if(
15b30 20 63 68 6f 69 63 65 3d 3d 44 42 5f 55 50 44 41   choice==DB_UPDA
15b40 54 45 5f 48 4f 4f 4b 20 29 7b 0a 20 20 20 20 20  TE_HOOK ){.     
15b50 20 70 70 48 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e   ppHook = &pDb->
15b60 70 55 70 64 61 74 65 48 6f 6f 6b 3b 0a 20 20 20  pUpdateHook;.   
15b70 20 7d 65 6c 73 65 20 69 66 28 20 63 68 6f 69 63   }else if( choic
15b80 65 3d 3d 44 42 5f 57 41 4c 5f 48 4f 4f 4b 20 29  e==DB_WAL_HOOK )
15b90 7b 0a 20 20 20 20 20 20 70 70 48 6f 6f 6b 20 3d  {.      ppHook =
15ba0 20 26 70 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 3b   &pDb->pWalHook;
15bb0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
15bc0 20 20 70 70 48 6f 6f 6b 20 3d 20 26 70 44 62 2d    ppHook = &pDb-
15bd0 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3b 0a  >pRollbackHook;.
15be0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 6f      }..    if( o
15bf0 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d  bjc!=2 && objc!=
15c00 33 20 29 7b 0a 20 20 20 20 20 20 20 54 63 6c 5f  3 ){.       Tcl_
15c10 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
15c20 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f  erp, 2, objv, "?
15c30 53 43 52 49 50 54 3f 22 29 3b 0a 20 20 20 20 20  SCRIPT?");.     
15c40 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
15c50 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OR;.    }.    if
15c60 28 20 2a 70 70 48 6f 6f 6b 20 29 7b 0a 20 20 20  ( *ppHook ){.   
15c70 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
15c80 75 6c 74 28 69 6e 74 65 72 70 2c 20 2a 70 70 48  ult(interp, *ppH
15c90 6f 6f 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ook);.      if( 
15ca0 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20  objc==3 ){.     
15cb0 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
15cc0 75 6e 74 28 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20  unt(*ppHook);.  
15cd0 20 20 20 20 20 20 2a 70 70 48 6f 6f 6b 20 3d 20        *ppHook = 
15ce0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
15cf0 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33  .    if( objc==3
15d00 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
15d10 28 20 21 28 2a 70 70 48 6f 6f 6b 29 20 29 3b 0a  ( !(*ppHook) );.
15d20 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65        if( Tcl_Ge
15d30 74 43 68 61 72 4c 65 6e 67 74 68 28 6f 62 6a 76  tCharLength(objv
15d40 5b 32 5d 29 3e 30 20 29 7b 0a 20 20 20 20 20 20  [2])>0 ){.      
15d50 20 20 2a 70 70 48 6f 6f 6b 20 3d 20 6f 62 6a 76    *ppHook = objv
15d60 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20 54 63 6c  [2];.        Tcl
15d70 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 2a 70  _IncrRefCount(*p
15d80 70 48 6f 6f 6b 29 3b 0a 20 20 20 20 20 20 7d 0a  pHook);.      }.
15d90 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74      }..    sqlit
15da0 65 33 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28 70  e3_update_hook(p
15db0 44 62 2d 3e 64 62 2c 20 28 70 44 62 2d 3e 70 55  Db->db, (pDb->pU
15dc0 70 64 61 74 65 48 6f 6f 6b 3f 44 62 55 70 64 61  pdateHook?DbUpda
15dd0 74 65 48 61 6e 64 6c 65 72 3a 30 29 2c 20 70 44  teHandler:0), pD
15de0 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  b);.    sqlite3_
15df0 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28 70 44  rollback_hook(pD
15e00 62 2d 3e 64 62 2c 28 70 44 62 2d 3e 70 52 6f 6c  b->db,(pDb->pRol
15e10 6c 62 61 63 6b 48 6f 6f 6b 3f 44 62 52 6f 6c 6c  lbackHook?DbRoll
15e20 62 61 63 6b 48 61 6e 64 6c 65 72 3a 30 29 2c 70  backHandler:0),p
15e30 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
15e40 5f 77 61 6c 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64  _wal_hook(pDb->d
15e50 62 2c 28 70 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b  b,(pDb->pWalHook
15e60 3f 44 62 57 61 6c 48 61 6e 64 6c 65 72 3a 30 29  ?DbWalHandler:0)
15e70 2c 70 44 62 29 3b 0a 0a 20 20 20 20 62 72 65 61  ,pDb);..    brea
15e80 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20  k;.  }..  /*    
15e90 24 64 62 20 76 65 72 73 69 6f 6e 0a 20 20 2a 2a  $db version.  **
15ea0 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  .  ** Return the
15eb0 20 76 65 72 73 69 6f 6e 20 73 74 72 69 6e 67 20   version string 
15ec0 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73  for this databas
15ed0 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  e..  */.  case D
15ee0 42 5f 56 45 52 53 49 4f 4e 3a 20 7b 0a 20 20 20  B_VERSION: {.   
15ef0 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
15f00 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73  nterp, (char *)s
15f10 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f  qlite3_libversio
15f20 6e 28 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  n(), TCL_STATIC)
15f30 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
15f40 0a 0a 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 6f 66  ...  } /* End of
15f50 20 74 68 65 20 53 57 49 54 43 48 20 73 74 61 74   the SWITCH stat
15f60 65 6d 65 6e 74 20 2a 2f 0a 20 20 72 65 74 75 72  ement */.  retur
15f70 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c  n rc;.}..#if SQL
15f80 49 54 45 5f 54 43 4c 5f 4e 52 45 0a 2f 2a 0a 2a  ITE_TCL_NRE./*.*
15f90 2a 20 41 64 61 70 74 6f 72 20 74 68 61 74 20 70  * Adaptor that p
15fa0 72 6f 76 69 64 65 73 20 61 6e 20 6f 62 6a 43 6d  rovides an objCm
15fb0 64 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20 74  d interface to t
15fc0 68 65 20 4e 52 45 2d 65 6e 61 62 6c 65 64 0a 2a  he NRE-enabled.*
15fd0 2a 20 69 6e 74 65 72 66 61 63 65 20 69 6d 70 6c  * interface impl
15fe0 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73  ementation..*/.s
15ff0 74 61 74 69 63 20 69 6e 74 20 44 62 4f 62 6a 43  tatic int DbObjC
16000 6d 64 41 64 61 70 74 6f 72 28 0a 20 20 76 6f 69  mdAdaptor(.  voi
16010 64 20 2a 63 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  d *cd,.  Tcl_Int
16020 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
16030 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
16040 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76 0a 29  bj *const*objv.)
16050 7b 0a 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e  {.  return Tcl_N
16060 52 43 61 6c 6c 4f 62 6a 50 72 6f 63 28 69 6e 74  RCallObjProc(int
16070 65 72 70 2c 20 44 62 4f 62 6a 43 6d 64 2c 20 63  erp, DbObjCmd, c
16080 64 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b 0a  d, objc, objv);.
16090 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
160a0 54 45 5f 54 43 4c 5f 4e 52 45 20 2a 2f 0a 0a 2f  TE_TCL_NRE */../
160b0 2a 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 20 44  *.**   sqlite3 D
160c0 42 4e 41 4d 45 20 46 49 4c 45 4e 41 4d 45 20 3f  BNAME FILENAME ?
160d0 2d 76 66 73 20 56 46 53 4e 41 4d 45 3f 20 3f 2d  -vfs VFSNAME? ?-
160e0 6b 65 79 20 4b 45 59 3f 20 3f 2d 72 65 61 64 6f  key KEY? ?-reado
160f0 6e 6c 79 20 42 4f 4f 4c 45 41 4e 3f 0a 2a 2a 20  nly BOOLEAN?.** 
16100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16110 20 20 20 20 20 20 20 20 20 20 3f 2d 63 72 65 61            ?-crea
16120 74 65 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d 6e 6f  te BOOLEAN? ?-no
16130 6d 75 74 65 78 20 42 4f 4f 4c 45 41 4e 3f 0a 2a  mutex BOOLEAN?.*
16140 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65  *.** This is the
16150 20 6d 61 69 6e 20 54 63 6c 20 63 6f 6d 6d 61 6e   main Tcl comman
16160 64 2e 20 20 57 68 65 6e 20 74 68 65 20 22 73 71  d.  When the "sq
16170 6c 69 74 65 22 20 54 63 6c 20 63 6f 6d 6d 61 6e  lite" Tcl comman
16180 64 20 69 73 0a 2a 2a 20 69 6e 76 6f 6b 65 64 2c  d is.** invoked,
16190 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75   this routine ru
161a0 6e 73 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68  ns to process th
161b0 61 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a  at command..**.*
161c0 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  * The first argu
161d0 6d 65 6e 74 2c 20 44 42 4e 41 4d 45 2c 20 69 73  ment, DBNAME, is
161e0 20 61 6e 20 61 72 62 69 74 72 61 72 79 20 6e 61   an arbitrary na
161f0 6d 65 20 66 6f 72 20 61 20 6e 65 77 0a 2a 2a 20  me for a new.** 
16200 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
16210 69 6f 6e 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61  ion.  This comma
16220 6e 64 20 63 72 65 61 74 65 73 20 61 20 6e 65 77  nd creates a new
16230 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 64 0a 2a   command named.*
16240 2a 20 44 42 4e 41 4d 45 20 74 68 61 74 20 69 73  * DBNAME that is
16250 20 75 73 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c   used to control
16260 20 74 68 61 74 20 63 6f 6e 6e 65 63 74 69 6f 6e   that connection
16270 2e 20 20 54 68 65 20 64 61 74 61 62 61 73 65 0a  .  The database.
16280 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  ** connection is
16290 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68   deleted when th
162a0 65 20 44 42 4e 41 4d 45 20 63 6f 6d 6d 61 6e 64  e DBNAME command
162b0 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a   is deleted..**.
162c0 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  ** The second ar
162d0 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 61  gument is the na
162e0 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
162f0 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2f 0a 73  se file..**.*/.s
16300 74 61 74 69 63 20 69 6e 74 20 44 62 4d 61 69 6e  tatic int DbMain
16310 28 76 6f 69 64 20 2a 63 64 2c 20 54 63 6c 5f 49  (void *cd, Tcl_I
16320 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
16330 6e 74 20 6f 62 6a 63 2c 54 63 6c 5f 4f 62 6a 20  nt objc,Tcl_Obj 
16340 2a 63 6f 6e 73 74 2a 6f 62 6a 76 29 7b 0a 20 20  *const*objv){.  
16350 53 71 6c 69 74 65 44 62 20 2a 70 3b 0a 20 20 63  SqliteDb *p;.  c
16360 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 3b  onst char *zArg;
16370 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67  .  char *zErrMsg
16380 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e  ;.  int i;.  con
16390 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a  st char *zFile;.
163a0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56    const char *zV
163b0 66 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 66 6c  fs = 0;.  int fl
163c0 61 67 73 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  ags;.  Tcl_DStri
163d0 6e 67 20 74 72 61 6e 73 6c 61 74 65 64 46 69 6c  ng translatedFil
163e0 65 6e 61 6d 65 3b 0a 23 69 66 64 65 66 20 53 51  ename;.#ifdef SQ
163f0 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
16400 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d 20 30 3b   void *pKey = 0;
16410 0a 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20 30 3b  .  int nKey = 0;
16420 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74 20 72 63  .#endif.  int rc
16430 3b 0a 0a 20 20 2f 2a 20 49 6e 20 6e 6f 72 6d 61  ;..  /* In norma
16440 6c 20 75 73 65 2c 20 65 61 63 68 20 54 43 4c 20  l use, each TCL 
16450 69 6e 74 65 72 70 72 65 74 65 72 20 72 75 6e 73  interpreter runs
16460 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 74 68 72   in a single thr
16470 65 61 64 2e 20 20 53 6f 0a 20 20 2a 2a 20 62 79  ead.  So.  ** by
16480 20 64 65 66 61 75 6c 74 2c 20 77 65 20 63 61 6e   default, we can
16490 20 74 75 72 6e 20 6f 66 20 6d 75 74 65 78 69 6e   turn of mutexin
164a0 67 20 6f 6e 20 53 51 4c 69 74 65 20 64 61 74 61  g on SQLite data
164b0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
164c0 2e 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 2c 20  ..  ** However, 
164d0 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72 70  for testing purp
164e0 6f 73 65 73 20 69 74 20 69 73 20 75 73 65 66 75  oses it is usefu
164f0 6c 20 74 6f 20 68 61 76 65 20 6d 75 74 65 78 65  l to have mutexe
16500 73 20 74 75 72 6e 65 64 0a 20 20 2a 2a 20 6f 6e  s turned.  ** on
16510 2e 20 20 53 6f 2c 20 62 79 20 64 65 66 61 75 6c  .  So, by defaul
16520 74 2c 20 6d 75 74 65 78 65 73 20 64 65 66 61 75  t, mutexes defau
16530 6c 74 20 6f 66 66 2e 20 20 42 75 74 20 69 66 20  lt off.  But if 
16540 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 0a 20 20  compiled with.  
16550 2a 2a 20 53 51 4c 49 54 45 5f 54 43 4c 5f 44 45  ** SQLITE_TCL_DE
16560 46 41 55 4c 54 5f 46 55 4c 4c 4d 55 54 45 58 20  FAULT_FULLMUTEX 
16570 74 68 65 6e 20 6d 75 74 65 78 65 73 20 64 65 66  then mutexes def
16580 61 75 6c 74 20 6f 6e 2e 0a 20 20 2a 2f 0a 23 69  ault on..  */.#i
16590 66 64 65 66 20 53 51 4c 49 54 45 5f 54 43 4c 5f  fdef SQLITE_TCL_
165a0 44 45 46 41 55 4c 54 5f 46 55 4c 4c 4d 55 54 45  DEFAULT_FULLMUTE
165b0 58 0a 20 20 66 6c 61 67 73 20 3d 20 53 51 4c 49  X.  flags = SQLI
165c0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
165d0 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
165e0 43 52 45 41 54 45 20 7c 20 53 51 4c 49 54 45 5f  CREATE | SQLITE_
165f0 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 3b 0a  OPEN_FULLMUTEX;.
16600 23 65 6c 73 65 0a 20 20 66 6c 61 67 73 20 3d 20  #else.  flags = 
16610 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
16620 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  WRITE | SQLITE_O
16630 50 45 4e 5f 43 52 45 41 54 45 20 7c 20 53 51 4c  PEN_CREATE | SQL
16640 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58  ITE_OPEN_NOMUTEX
16650 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  ;.#endif..  if( 
16660 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 7a  objc==2 ){.    z
16670 41 72 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  Arg = Tcl_GetStr
16680 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
16690 31 5d 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  1], 0);.    if( 
166a0 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 76 65  strcmp(zArg,"-ve
166b0 72 73 69 6f 6e 22 29 3d 3d 30 20 29 7b 0a 20 20  rsion")==0 ){.  
166c0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
166d0 73 75 6c 74 28 69 6e 74 65 72 70 2c 73 71 6c 69  sult(interp,sqli
166e0 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28 29  te3_libversion()
166f0 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
16700 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
16710 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
16720 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 68 61  strcmp(zArg,"-ha
16730 73 2d 63 6f 64 65 63 22 29 3d 3d 30 20 29 7b 0a  s-codec")==0 ){.
16740 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
16750 53 5f 43 4f 44 45 43 0a 20 20 20 20 20 20 54 63  S_CODEC.      Tc
16760 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
16770 6e 74 65 72 70 2c 22 31 22 2c 28 63 68 61 72 2a  nterp,"1",(char*
16780 29 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  )0);.#else.     
16790 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
167a0 74 28 69 6e 74 65 72 70 2c 22 30 22 2c 28 63 68  t(interp,"0",(ch
167b0 61 72 2a 29 30 29 3b 0a 23 65 6e 64 69 66 0a 20  ar*)0);.#endif. 
167c0 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
167d0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
167e0 66 6f 72 28 69 3d 33 3b 20 69 2b 31 3c 6f 62 6a  for(i=3; i+1<obj
167f0 63 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20 7a 41  c; i+=2){.    zA
16800 72 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  rg = Tcl_GetStri
16810 6e 67 28 6f 62 6a 76 5b 69 5d 29 3b 0a 20 20 20  ng(objv[i]);.   
16820 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67   if( strcmp(zArg
16830 2c 22 2d 6b 65 79 22 29 3d 3d 30 20 29 7b 0a 23  ,"-key")==0 ){.#
16840 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
16850 5f 43 4f 44 45 43 0a 20 20 20 20 20 20 70 4b 65  _CODEC.      pKe
16860 79 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41  y = Tcl_GetByteA
16870 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  rrayFromObj(objv
16880 5b 69 2b 31 5d 2c 20 26 6e 4b 65 79 29 3b 0a 23  [i+1], &nKey);.#
16890 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 20  endif.    }else 
168a0 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c  if( strcmp(zArg,
168b0 20 22 2d 76 66 73 22 29 3d 3d 30 20 29 7b 0a 20   "-vfs")==0 ){. 
168c0 20 20 20 20 20 7a 56 66 73 20 3d 20 54 63 6c 5f       zVfs = Tcl_
168d0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69  GetString(objv[i
168e0 2b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  +1]);.    }else 
168f0 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c  if( strcmp(zArg,
16900 20 22 2d 72 65 61 64 6f 6e 6c 79 22 29 3d 3d 30   "-readonly")==0
16910 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 3b   ){.      int b;
16920 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47  .      if( Tcl_G
16930 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
16940 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 2b  (interp, objv[i+
16950 31 5d 2c 20 26 62 29 20 29 20 72 65 74 75 72 6e  1], &b) ) return
16960 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
16970 20 20 69 66 28 20 62 20 29 7b 0a 20 20 20 20 20    if( b ){.     
16980 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 28 53 51     flags &= ~(SQ
16990 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
169a0 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
169b0 43 52 45 41 54 45 29 3b 0a 20 20 20 20 20 20 20  CREATE);.       
169c0 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45   flags |= SQLITE
169d0 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a  _OPEN_READONLY;.
169e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
169f0 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53       flags &= ~S
16a00 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
16a10 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 66 6c 61  NLY;.        fla
16a20 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45  gs |= SQLITE_OPE
16a30 4e 5f 52 45 41 44 57 52 49 54 45 3b 0a 20 20 20  N_READWRITE;.   
16a40 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
16a50 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20  f( strcmp(zArg, 
16a60 22 2d 63 72 65 61 74 65 22 29 3d 3d 30 20 29 7b  "-create")==0 ){
16a70 0a 20 20 20 20 20 20 69 6e 74 20 62 3b 0a 20 20  .      int b;.  
16a80 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42      if( Tcl_GetB
16a90 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
16aa0 74 65 72 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c  terp, objv[i+1],
16ab0 20 26 62 29 20 29 20 72 65 74 75 72 6e 20 54 43   &b) ) return TC
16ac0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 69  L_ERROR;.      i
16ad0 66 28 20 62 20 26 26 20 28 66 6c 61 67 73 20 26  f( b && (flags &
16ae0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
16af0 44 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20  DONLY)==0 ){.   
16b00 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51       flags |= SQ
16b10 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
16b20 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
16b30 20 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20         flags &= 
16b40 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  ~SQLITE_OPEN_CRE
16b50 41 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ATE;.      }.   
16b60 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
16b70 70 28 7a 41 72 67 2c 20 22 2d 6e 6f 6d 75 74 65  p(zArg, "-nomute
16b80 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  x")==0 ){.      
16b90 69 6e 74 20 62 3b 0a 20 20 20 20 20 20 69 66 28  int b;.      if(
16ba0 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46   Tcl_GetBooleanF
16bb0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
16bc0 62 6a 76 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20  bjv[i+1], &b) ) 
16bd0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
16be0 3b 0a 20 20 20 20 20 20 69 66 28 20 62 20 29 7b  ;.      if( b ){
16bf0 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c  .        flags |
16c00 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f  = SQLITE_OPEN_NO
16c10 4d 55 54 45 58 3b 0a 20 20 20 20 20 20 20 20 66  MUTEX;.        f
16c20 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
16c30 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 3b 0a  OPEN_FULLMUTEX;.
16c40 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
16c50 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53       flags &= ~S
16c60 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54  QLITE_OPEN_NOMUT
16c70 45 58 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EX;.      }.    
16c80 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
16c90 28 7a 41 72 67 2c 20 22 2d 66 75 6c 6c 6d 75 74  (zArg, "-fullmut
16ca0 65 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ex")==0 ){.     
16cb0 20 69 6e 74 20 62 3b 0a 20 20 20 20 20 20 69 66   int b;.      if
16cc0 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e  ( Tcl_GetBoolean
16cd0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
16ce0 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 62 29 20 29  objv[i+1], &b) )
16cf0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
16d00 52 3b 0a 20 20 20 20 20 20 69 66 28 20 62 20 29  R;.      if( b )
16d10 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  {.        flags 
16d20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46  |= SQLITE_OPEN_F
16d30 55 4c 4c 4d 55 54 45 58 3b 0a 20 20 20 20 20 20  ULLMUTEX;.      
16d40 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49    flags &= ~SQLI
16d50 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 3b  TE_OPEN_NOMUTEX;
16d60 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
16d70 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e        flags &= ~
16d80 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c  SQLITE_OPEN_FULL
16d90 4d 55 54 45 58 3b 0a 20 20 20 20 20 20 7d 0a 20  MUTEX;.      }. 
16da0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
16db0 63 6d 70 28 7a 41 72 67 2c 20 22 2d 75 72 69 22  cmp(zArg, "-uri"
16dc0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
16dd0 74 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20 54  t b;.      if( T
16de0 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f  cl_GetBooleanFro
16df0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
16e00 76 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20 72 65  v[i+1], &b) ) re
16e10 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
16e20 20 20 20 20 20 20 69 66 28 20 62 20 29 7b 0a 20        if( b ){. 
16e30 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20         flags |= 
16e40 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b  SQLITE_OPEN_URI;
16e50 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
16e60 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e        flags &= ~
16e70 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b  SQLITE_OPEN_URI;
16e80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
16e90 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  se{.      Tcl_Ap
16ea0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
16eb0 70 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69  p, "unknown opti
16ec0 6f 6e 3a 20 22 2c 20 7a 41 72 67 2c 20 28 63 68  on: ", zArg, (ch
16ed0 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 65  ar*)0);.      re
16ee0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
16ef0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
16f00 6f 62 6a 63 3c 33 20 7c 7c 20 28 6f 62 6a 63 26  objc<3 || (objc&
16f10 31 29 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c  1)!=1 ){.    Tcl
16f20 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
16f30 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 0a  terp, 1, objv, .
16f40 20 20 20 20 20 20 22 48 41 4e 44 4c 45 20 46 49        "HANDLE FI
16f50 4c 45 4e 41 4d 45 20 3f 2d 76 66 73 20 56 46 53  LENAME ?-vfs VFS
16f60 4e 41 4d 45 3f 20 3f 2d 72 65 61 64 6f 6e 6c 79  NAME? ?-readonly
16f70 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d 63 72 65 61   BOOLEAN? ?-crea
16f80 74 65 20 42 4f 4f 4c 45 41 4e 3f 22 0a 20 20 20  te BOOLEAN?".   
16f90 20 20 20 22 20 3f 2d 6e 6f 6d 75 74 65 78 20 42     " ?-nomutex B
16fa0 4f 4f 4c 45 41 4e 3f 20 3f 2d 66 75 6c 6c 6d 75  OOLEAN? ?-fullmu
16fb0 74 65 78 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d 75  tex BOOLEAN? ?-u
16fc0 72 69 20 42 4f 4f 4c 45 41 4e 3f 22 0a 23 69 66  ri BOOLEAN?".#if
16fd0 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
16fe0 4f 44 45 43 0a 20 20 20 20 20 20 22 20 3f 2d 6b  ODEC.      " ?-k
16ff0 65 79 20 43 4f 44 45 43 4b 45 59 3f 22 0a 23 65  ey CODECKEY?".#e
17000 6e 64 69 66 0a 20 20 20 20 29 3b 0a 20 20 20 20  ndif.    );.    
17010 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
17020 3b 0a 20 20 7d 0a 20 20 7a 45 72 72 4d 73 67 20  ;.  }.  zErrMsg 
17030 3d 20 30 3b 0a 20 20 70 20 3d 20 28 53 71 6c 69  = 0;.  p = (Sqli
17040 74 65 44 62 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28  teDb*)Tcl_Alloc(
17050 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20   sizeof(*p) );. 
17060 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20   if( p==0 ){.   
17070 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
17080 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 22  nterp, (char *)"
17090 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 22 2c 20  malloc failed", 
170a0 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  TCL_STATIC);.   
170b0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
170c0 52 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  R;.  }.  memset(
170d0 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29  p, 0, sizeof(*p)
170e0 29 3b 0a 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c  );.  zFile = Tcl
170f0 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
17100 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20  j(objv[2], 0);. 
17110 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 54 72 61   zFile = Tcl_Tra
17120 6e 73 6c 61 74 65 46 69 6c 65 4e 61 6d 65 28 69  nslateFileName(i
17130 6e 74 65 72 70 2c 20 7a 46 69 6c 65 2c 20 26 74  nterp, zFile, &t
17140 72 61 6e 73 6c 61 74 65 64 46 69 6c 65 6e 61 6d  ranslatedFilenam
17150 65 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  e);.  rc = sqlit
17160 65 33 5f 6f 70 65 6e 5f 76 32 28 7a 46 69 6c 65  e3_open_v2(zFile
17170 2c 20 26 70 2d 3e 64 62 2c 20 66 6c 61 67 73 2c  , &p->db, flags,
17180 20 7a 56 66 73 29 3b 0a 20 20 54 63 6c 5f 44 53   zVfs);.  Tcl_DS
17190 74 72 69 6e 67 46 72 65 65 28 26 74 72 61 6e 73  tringFree(&trans
171a0 6c 61 74 65 64 46 69 6c 65 6e 61 6d 65 29 3b 0a  latedFilename);.
171b0 20 20 69 66 28 20 70 2d 3e 64 62 20 29 7b 0a 20    if( p->db ){. 
171c0 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
171d0 21 3d 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  !=sqlite3_errcod
171e0 65 28 70 2d 3e 64 62 29 20 29 7b 0a 20 20 20 20  e(p->db) ){.    
171f0 20 20 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69    zErrMsg = sqli
17200 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
17210 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
17220 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20  (p->db));.      
17230 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d  sqlite3_close(p-
17240 3e 64 62 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64  >db);.      p->d
17250 62 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  b = 0;.    }.  }
17260 65 6c 73 65 7b 0a 20 20 20 20 7a 45 72 72 4d 73  else{.    zErrMs
17270 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
17280 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65  ntf("%s", sqlite
17290 33 5f 65 72 72 73 74 72 28 72 63 29 29 3b 0a 20  3_errstr(rc));. 
172a0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
172b0 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28  _HAS_CODEC.  if(
172c0 20 70 2d 3e 64 62 20 29 7b 0a 20 20 20 20 73 71   p->db ){.    sq
172d0 6c 69 74 65 33 5f 6b 65 79 28 70 2d 3e 64 62 2c  lite3_key(p->db,
172e0 20 70 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20   pKey, nKey);.  
172f0 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  }.#endif.  if( p
17300 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20 54  ->db==0 ){.    T
17310 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
17320 65 72 70 2c 20 7a 45 72 72 4d 73 67 2c 20 54 43  erp, zErrMsg, TC
17330 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20  L_VOLATILE);.   
17340 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a   Tcl_Free((char*
17350 29 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  )p);.    sqlite3
17360 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a  _free(zErrMsg);.
17370 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
17380 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d  RROR;.  }.  p->m
17390 61 78 53 74 6d 74 20 3d 20 4e 55 4d 5f 50 52 45  axStmt = NUM_PRE
173a0 50 41 52 45 44 5f 53 54 4d 54 53 3b 0a 20 20 70  PARED_STMTS;.  p
173b0 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72  ->interp = inter
173c0 70 3b 0a 20 20 7a 41 72 67 20 3d 20 54 63 6c 5f  p;.  zArg = Tcl_
173d0 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
173e0 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20  (objv[1], 0);.  
173f0 69 66 28 20 44 62 55 73 65 4e 72 65 28 29 20 29  if( DbUseNre() )
17400 7b 0a 20 20 20 20 54 63 6c 5f 4e 52 43 72 65 61  {.    Tcl_NRCrea
17410 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  teCommand(interp
17420 2c 20 7a 41 72 67 2c 20 44 62 4f 62 6a 43 6d 64  , zArg, DbObjCmd
17430 41 64 61 70 74 6f 72 2c 20 44 62 4f 62 6a 43 6d  Adaptor, DbObjCm
17440 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
17450 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
17460 2a 29 70 2c 20 44 62 44 65 6c 65 74 65 43 6d 64  *)p, DbDeleteCmd
17470 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
17480 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
17490 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 7a 41 72  mand(interp, zAr
174a0 67 2c 20 44 62 4f 62 6a 43 6d 64 2c 20 28 63 68  g, DbObjCmd, (ch
174b0 61 72 2a 29 70 2c 20 44 62 44 65 6c 65 74 65 43  ar*)p, DbDeleteC
174c0 6d 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  md);.  }.  retur
174d0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
174e0 2a 2a 20 50 72 6f 76 69 64 65 20 61 20 64 75 6d  ** Provide a dum
174f0 6d 79 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73  my Tcl_InitStubs
17500 20 69 66 20 77 65 20 61 72 65 20 75 73 69 6e 67   if we are using
17510 20 74 68 69 73 20 61 73 20 61 20 73 74 61 74 69   this as a stati
17520 63 0a 2a 2a 20 6c 69 62 72 61 72 79 2e 0a 2a 2f  c.** library..*/
17530 0a 23 69 66 6e 64 65 66 20 55 53 45 5f 54 43 4c  .#ifndef USE_TCL
17540 5f 53 54 55 42 53 0a 23 20 75 6e 64 65 66 20 20  _STUBS.# undef  
17550 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 0a 23 20  Tcl_InitStubs.# 
17560 64 65 66 69 6e 65 20 54 63 6c 5f 49 6e 69 74 53  define Tcl_InitS
17570 74 75 62 73 28 61 2c 62 2c 63 29 20 54 43 4c 5f  tubs(a,b,c) TCL_
17580 56 45 52 53 49 4f 4e 0a 23 65 6e 64 69 66 0a 0a  VERSION.#endif..
17590 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
175a0 77 65 20 68 61 76 65 20 61 20 50 41 43 4b 41 47  we have a PACKAG
175b0 45 5f 56 45 52 53 49 4f 4e 20 6d 61 63 72 6f 20  E_VERSION macro 
175c0 64 65 66 69 6e 65 64 2e 20 20 54 68 69 73 20 77  defined.  This w
175d0 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 66 69 6e 65  ill be.** define
175e0 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
175f0 62 79 20 74 68 65 20 54 45 41 20 6d 61 6b 65 66  by the TEA makef
17600 69 6c 65 2e 20 20 42 75 74 20 6f 74 68 65 72 20  ile.  But other 
17610 6d 61 6b 65 66 69 6c 65 73 0a 2a 2a 20 64 6f 20  makefiles.** do 
17620 6e 6f 74 20 64 65 66 69 6e 65 20 69 74 2e 0a 2a  not define it..*
17630 2f 0a 23 69 66 6e 64 65 66 20 50 41 43 4b 41 47  /.#ifndef PACKAG
17640 45 5f 56 45 52 53 49 4f 4e 0a 23 20 64 65 66 69  E_VERSION.# defi
17650 6e 65 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49  ne PACKAGE_VERSI
17660 4f 4e 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f  ON SQLITE_VERSIO
17670 4e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  N.#endif../*.** 
17680 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20  Initialize this 
17690 6d 6f 64 75 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  module..**.** Th
176a0 69 73 20 54 63 6c 20 6d 6f 64 75 6c 65 20 63 6f  is Tcl module co
176b0 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 61 20 73 69  ntains only a si
176c0 6e 67 6c 65 20 6e 65 77 20 54 63 6c 20 63 6f 6d  ngle new Tcl com
176d0 6d 61 6e 64 20 6e 61 6d 65 64 20 22 73 71 6c 69  mand named "sqli
176e0 74 65 22 2e 0a 2a 2a 20 28 48 65 6e 63 65 20 74  te"..** (Hence t
176f0 68 65 72 65 20 69 73 20 6e 6f 20 6e 61 6d 65 73  here is no names
17700 70 61 63 65 2e 20 20 54 68 65 72 65 20 69 73 20  pace.  There is 
17710 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 75 73 69 6e  no point in usin
17720 67 20 61 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a  g a namespace.**
17730 20 69 66 20 74 68 65 20 65 78 74 65 6e 73 69 6f   if the extensio
17740 6e 20 6f 6e 6c 79 20 73 75 70 70 6c 69 65 73 20  n only supplies 
17750 6f 6e 65 20 6e 65 77 20 6e 61 6d 65 21 29 20 20  one new name!)  
17760 54 68 65 20 22 73 71 6c 69 74 65 22 20 63 6f 6d  The "sqlite" com
17770 6d 61 6e 64 20 69 73 0a 2a 2a 20 75 73 65 64 20  mand is.** used 
17780 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 53 51  to open a new SQ
17790 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e 20 20  Lite database.  
177a0 53 65 65 20 74 68 65 20 44 62 4d 61 69 6e 28 29  See the DbMain()
177b0 20 72 6f 75 74 69 6e 65 20 61 62 6f 76 65 0a 2a   routine above.*
177c0 2a 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  * for additional
177d0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a   information..**
177e0 0a 2a 2a 20 54 68 65 20 45 58 54 45 52 4e 20 6d  .** The EXTERN m
177f0 61 63 72 6f 73 20 61 72 65 20 72 65 71 75 69 72  acros are requir
17800 65 64 20 62 79 20 54 43 4c 20 69 6e 20 6f 72 64  ed by TCL in ord
17810 65 72 20 74 6f 20 77 6f 72 6b 20 6f 6e 20 77 69  er to work on wi
17820 6e 64 6f 77 73 2e 0a 2a 2f 0a 45 58 54 45 52 4e  ndows..*/.EXTERN
17830 20 69 6e 74 20 53 71 6c 69 74 65 33 5f 49 6e 69   int Sqlite3_Ini
17840 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  t(Tcl_Interp *in
17850 74 65 72 70 29 7b 0a 20 20 69 6e 74 20 72 63 20  terp){.  int rc 
17860 3d 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28  = Tcl_InitStubs(
17870 69 6e 74 65 72 70 2c 20 22 38 2e 34 22 2c 20 30  interp, "8.4", 0
17880 29 20 3f 20 54 43 4c 5f 4f 4b 20 3a 20 54 43 4c  ) ? TCL_OK : TCL
17890 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63  _ERROR;.  if( rc
178a0 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20  ==TCL_OK ){.    
178b0 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
178c0 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 73 71  mand(interp, "sq
178d0 6c 69 74 65 33 22 2c 20 28 54 63 6c 5f 4f 62 6a  lite3", (Tcl_Obj
178e0 43 6d 64 50 72 6f 63 2a 29 44 62 4d 61 69 6e 2c  CmdProc*)DbMain,
178f0 20 30 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20   0, 0);.#ifndef 
17900 53 51 4c 49 54 45 5f 33 5f 53 55 46 46 49 58 5f  SQLITE_3_SUFFIX_
17910 4f 4e 4c 59 0a 20 20 20 20 2f 2a 20 54 68 65 20  ONLY.    /* The 
17920 22 73 71 6c 69 74 65 22 20 61 6c 69 61 73 20 69  "sqlite" alias i
17930 73 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64 2e 20  s undocumented. 
17940 20 49 74 20 69 73 20 68 65 72 65 20 6f 6e 6c 79   It is here only
17950 20 74 6f 20 73 75 70 70 6f 72 74 0a 20 20 20 20   to support.    
17960 2a 2a 20 6c 65 67 61 63 79 20 73 63 72 69 70 74  ** legacy script
17970 73 2e 20 20 41 6c 6c 20 6e 65 77 20 73 63 72 69  s.  All new scri
17980 70 74 73 20 73 68 6f 75 6c 64 20 75 73 65 20 6f  pts should use o
17990 6e 6c 79 20 74 68 65 20 22 73 71 6c 69 74 65 33  nly the "sqlite3
179a0 22 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64  ".    ** command
179b0 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 43 72 65  . */.    Tcl_Cre
179c0 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
179d0 74 65 72 70 2c 20 22 73 71 6c 69 74 65 22 2c 20  terp, "sqlite", 
179e0 28 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 2a  (Tcl_ObjCmdProc*
179f0 29 44 62 4d 61 69 6e 2c 20 30 2c 20 30 29 3b 0a  )DbMain, 0, 0);.
17a00 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20  #endif.    rc = 
17a10 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69  Tcl_PkgProvide(i
17a20 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33 22  nterp, "sqlite3"
17a30 2c 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f  , PACKAGE_VERSIO
17a40 4e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  N);.  }.  return
17a50 20 72 63 3b 0a 7d 0a 45 58 54 45 52 4e 20 69 6e   rc;.}.EXTERN in
17a60 74 20 54 63 6c 73 71 6c 69 74 65 33 5f 49 6e 69  t Tclsqlite3_Ini
17a70 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  t(Tcl_Interp *in
17a80 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20 53 71  terp){ return Sq
17a90 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74 65 72  lite3_Init(inter
17aa0 70 29 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74  p); }.EXTERN int
17ab0 20 53 71 6c 69 74 65 33 5f 55 6e 6c 6f 61 64 28   Sqlite3_Unload(
17ac0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
17ad0 72 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 20  rp, int flags){ 
17ae0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d  return TCL_OK; }
17af0 0a 45 58 54 45 52 4e 20 69 6e 74 20 54 63 6c 73  .EXTERN int Tcls
17b00 71 6c 69 74 65 33 5f 55 6e 6c 6f 61 64 28 54 63  qlite3_Unload(Tc
17b10 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
17b20 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 20 72 65  , int flags){ re
17b30 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 0a  turn TCL_OK; }..
17b40 2f 2a 20 42 65 63 61 75 73 65 20 69 74 20 61 63  /* Because it ac
17b50 63 65 73 73 65 73 20 74 68 65 20 66 69 6c 65 2d  cesses the file-
17b60 73 79 73 74 65 6d 20 61 6e 64 20 75 73 65 73 20  system and uses 
17b70 70 65 72 73 69 73 74 65 6e 74 20 73 74 61 74 65  persistent state
17b80 2c 20 53 51 4c 69 74 65 0a 2a 2a 20 69 73 20 6e  , SQLite.** is n
17b90 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 20 61 70  ot considered ap
17ba0 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 73 61  propriate for sa
17bb0 66 65 20 69 6e 74 65 72 70 72 65 74 65 72 73 2e  fe interpreters.
17bc0 20 20 48 65 6e 63 65 2c 20 77 65 20 64 65 6c 69    Hence, we deli
17bd0 62 65 72 61 74 65 6c 79 0a 2a 2a 20 6f 6d 69 74  berately.** omit
17be0 20 74 68 65 20 5f 53 61 66 65 49 6e 69 74 28 29   the _SafeInit()
17bf0 20 69 6e 74 65 72 66 61 63 65 73 2e 0a 2a 2f 0a   interfaces..*/.
17c00 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17c10 33 5f 53 55 46 46 49 58 5f 4f 4e 4c 59 0a 69 6e  3_SUFFIX_ONLY.in
17c20 74 20 53 71 6c 69 74 65 5f 49 6e 69 74 28 54 63  t Sqlite_Init(Tc
17c30 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
17c40 29 7b 20 72 65 74 75 72 6e 20 53 71 6c 69 74 65  ){ return Sqlite
17c50 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 20  3_Init(interp); 
17c60 7d 0a 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 5f  }.int Tclsqlite_
17c70 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
17c80 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e  *interp){ return
17c90 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e   Sqlite3_Init(in
17ca0 74 65 72 70 29 3b 20 7d 0a 69 6e 74 20 53 71 6c  terp); }.int Sql
17cb0 69 74 65 5f 55 6e 6c 6f 61 64 28 54 63 6c 5f 49  ite_Unload(Tcl_I
17cc0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
17cd0 6e 74 20 66 6c 61 67 73 29 7b 20 72 65 74 75 72  nt flags){ retur
17ce0 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 69 6e 74 20  n TCL_OK; }.int 
17cf0 54 63 6c 73 71 6c 69 74 65 5f 55 6e 6c 6f 61 64  Tclsqlite_Unload
17d00 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
17d10 65 72 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  erp, int flags){
17d20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20   return TCL_OK; 
17d30 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
17d40 20 54 43 4c 53 48 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a   TCLSH./********
17d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17d80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17d90 2a 2a 2a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20  *****.** All of 
17da0 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 66 6f  the code that fo
17db0 6c 6c 6f 77 73 20 69 73 20 75 73 65 64 20 74 6f  llows is used to
17dc0 20 62 75 69 6c 64 20 73 74 61 6e 64 61 6c 6f 6e   build standalon
17dd0 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
17de0 72 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 73  rs.** that are s
17df0 74 61 74 69 63 61 6c 6c 79 20 6c 69 6e 6b 65 64  tatically linked
17e00 20 77 69 74 68 20 53 51 4c 69 74 65 2e 20 20 45   with SQLite.  E
17e10 6e 61 62 6c 65 20 74 68 65 73 65 20 62 79 20 63  nable these by c
17e20 6f 6d 70 69 6c 69 6e 67 0a 2a 2a 20 77 69 74 68  ompiling.** with
17e30 20 2d 44 54 43 4c 53 48 3d 6e 20 77 68 65 72 65   -DTCLSH=n where
17e40 20 6e 20 63 61 6e 20 62 65 20 31 20 6f 72 20 32   n can be 1 or 2
17e50 2e 20 20 41 6e 20 6e 20 6f 66 20 31 20 67 65 6e  .  An n of 1 gen
17e60 65 72 61 74 65 73 20 61 20 73 74 61 6e 64 61 72  erates a standar
17e70 64 0a 2a 2a 20 74 63 6c 73 68 20 62 75 74 20 77  d.** tclsh but w
17e80 69 74 68 20 53 51 4c 69 74 65 20 62 75 69 6c 74  ith SQLite built
17e90 20 69 6e 2e 20 20 41 6e 20 6e 20 6f 66 20 32 20   in.  An n of 2 
17ea0 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 53 51  generates the SQ
17eb0 4c 69 74 65 20 73 70 61 63 65 0a 2a 2a 20 61 6e  Lite space.** an
17ec0 61 6c 79 73 69 73 20 70 72 6f 67 72 61 6d 2e 0a  alysis program..
17ed0 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  */..#if defined(
17ee0 53 51 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c 20  SQLITE_TEST) || 
17ef0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
17f00 43 4c 4d 44 35 29 0a 2f 2a 0a 20 2a 20 54 68 69  CLMD5)./*. * Thi
17f10 73 20 63 6f 64 65 20 69 6d 70 6c 65 6d 65 6e 74  s code implement
17f20 73 20 74 68 65 20 4d 44 35 20 6d 65 73 73 61 67  s the MD5 messag
17f30 65 2d 64 69 67 65 73 74 20 61 6c 67 6f 72 69 74  e-digest algorit
17f40 68 6d 2e 0a 20 2a 20 54 68 65 20 61 6c 67 6f 72  hm.. * The algor
17f50 69 74 68 6d 20 69 73 20 64 75 65 20 74 6f 20 52  ithm is due to R
17f60 6f 6e 20 52 69 76 65 73 74 2e 20 20 54 68 69 73  on Rivest.  This
17f70 20 63 6f 64 65 20 77 61 73 0a 20 2a 20 77 72 69   code was. * wri
17f80 74 74 65 6e 20 62 79 20 43 6f 6c 69 6e 20 50 6c  tten by Colin Pl
17f90 75 6d 62 20 69 6e 20 31 39 39 33 2c 20 6e 6f 20  umb in 1993, no 
17fa0 63 6f 70 79 72 69 67 68 74 20 69 73 20 63 6c 61  copyright is cla
17fb0 69 6d 65 64 2e 0a 20 2a 20 54 68 69 73 20 63 6f  imed.. * This co
17fc0 64 65 20 69 73 20 69 6e 20 74 68 65 20 70 75 62  de is in the pub
17fd0 6c 69 63 20 64 6f 6d 61 69 6e 3b 20 64 6f 20 77  lic domain; do w
17fe0 69 74 68 20 69 74 20 77 68 61 74 20 79 6f 75 20  ith it what you 
17ff0 77 69 73 68 2e 0a 20 2a 0a 20 2a 20 45 71 75 69  wish.. *. * Equi
18000 76 61 6c 65 6e 74 20 63 6f 64 65 20 69 73 20 61  valent code is a
18010 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20 52 53  vailable from RS
18020 41 20 44 61 74 61 20 53 65 63 75 72 69 74 79 2c  A Data Security,
18030 20 49 6e 63 2e 0a 20 2a 20 54 68 69 73 20 63 6f   Inc.. * This co
18040 64 65 20 68 61 73 20 62 65 65 6e 20 74 65 73 74  de has been test
18050 65 64 20 61 67 61 69 6e 73 74 20 74 68 61 74 2c  ed against that,
18060 20 61 6e 64 20 69 73 20 65 71 75 69 76 61 6c 65   and is equivale
18070 6e 74 2c 0a 20 2a 20 65 78 63 65 70 74 20 74 68  nt,. * except th
18080 61 74 20 79 6f 75 20 64 6f 6e 27 74 20 6e 65 65  at you don't nee
18090 64 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 77 6f  d to include two
180a0 20 70 61 67 65 73 20 6f 66 20 6c 65 67 61 6c 65   pages of legale
180b0 73 65 0a 20 2a 20 77 69 74 68 20 65 76 65 72 79  se. * with every
180c0 20 63 6f 70 79 2e 0a 20 2a 0a 20 2a 20 54 6f 20   copy.. *. * To 
180d0 63 6f 6d 70 75 74 65 20 74 68 65 20 6d 65 73 73  compute the mess
180e0 61 67 65 20 64 69 67 65 73 74 20 6f 66 20 61 20  age digest of a 
180f0 63 68 75 6e 6b 20 6f 66 20 62 79 74 65 73 2c 20  chunk of bytes, 
18100 64 65 63 6c 61 72 65 20 61 6e 0a 20 2a 20 4d 44  declare an. * MD
18110 35 43 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75  5Context structu
18120 72 65 2c 20 70 61 73 73 20 69 74 20 74 6f 20 4d  re, pass it to M
18130 44 35 49 6e 69 74 2c 20 63 61 6c 6c 20 4d 44 35  D5Init, call MD5
18140 55 70 64 61 74 65 20 61 73 0a 20 2a 20 6e 65 65  Update as. * nee
18150 64 65 64 20 6f 6e 20 62 75 66 66 65 72 73 20 66  ded on buffers f
18160 75 6c 6c 20 6f 66 20 62 79 74 65 73 2c 20 61 6e  ull of bytes, an
18170 64 20 74 68 65 6e 20 63 61 6c 6c 20 4d 44 35 46  d then call MD5F
18180 69 6e 61 6c 2c 20 77 68 69 63 68 0a 20 2a 20 77  inal, which. * w
18190 69 6c 6c 20 66 69 6c 6c 20 61 20 73 75 70 70 6c  ill fill a suppl
181a0 69 65 64 20 31 36 2d 62 79 74 65 20 61 72 72 61  ied 16-byte arra
181b0 79 20 77 69 74 68 20 74 68 65 20 64 69 67 65 73  y with the diges
181c0 74 2e 0a 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 49 66  t.. */../*. * If
181d0 20 63 6f 6d 70 69 6c 65 64 20 6f 6e 20 61 20 6d   compiled on a m
181e0 61 63 68 69 6e 65 20 74 68 61 74 20 64 6f 65 73  achine that does
181f0 6e 27 74 20 68 61 76 65 20 61 20 33 32 2d 62 69  n't have a 32-bi
18200 74 20 69 6e 74 65 67 65 72 2c 0a 20 2a 20 79 6f  t integer,. * yo
18210 75 20 6a 75 73 74 20 73 65 74 20 22 75 69 6e 74  u just set "uint
18220 33 32 22 20 74 6f 20 74 68 65 20 61 70 70 72 6f  32" to the appro
18230 70 72 69 61 74 65 20 64 61 74 61 74 79 70 65 20  priate datatype 
18240 66 6f 72 20 61 6e 0a 20 2a 20 75 6e 73 69 67 6e  for an. * unsign
18250 65 64 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65  ed 32-bit intege
18260 72 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a  r.  For example:
18270 0a 20 2a 0a 20 2a 20 20 20 20 20 20 20 63 63 20  . *. *       cc 
18280 2d 44 75 69 6e 74 33 32 3d 27 75 6e 73 69 67 6e  -Duint32='unsign
18290 65 64 20 6c 6f 6e 67 27 20 6d 64 35 2e 63 0a 20  ed long' md5.c. 
182a0 2a 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 75 69  *. */.#ifndef ui
182b0 6e 74 33 32 0a 23 20 20 64 65 66 69 6e 65 20 75  nt32.#  define u
182c0 69 6e 74 33 32 20 75 6e 73 69 67 6e 65 64 20 69  int32 unsigned i
182d0 6e 74 0a 23 65 6e 64 69 66 0a 0a 73 74 72 75 63  nt.#endif..struc
182e0 74 20 4d 44 35 43 6f 6e 74 65 78 74 20 7b 0a 20  t MD5Context {. 
182f0 20 69 6e 74 20 69 73 49 6e 69 74 3b 0a 20 20 75   int isInit;.  u
18300 69 6e 74 33 32 20 62 75 66 5b 34 5d 3b 0a 20 20  int32 buf[4];.  
18310 75 69 6e 74 33 32 20 62 69 74 73 5b 32 5d 3b 0a  uint32 bits[2];.
18320 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
18330 69 6e 5b 36 34 5d 3b 0a 7d 3b 0a 74 79 70 65 64  in[64];.};.typed
18340 65 66 20 73 74 72 75 63 74 20 4d 44 35 43 6f 6e  ef struct MD5Con
18350 74 65 78 74 20 4d 44 35 43 6f 6e 74 65 78 74 3b  text MD5Context;
18360 0a 0a 2f 2a 0a 20 2a 20 4e 6f 74 65 3a 20 74 68  ../*. * Note: th
18370 69 73 20 63 6f 64 65 20 69 73 20 68 61 72 6d 6c  is code is harml
18380 65 73 73 20 6f 6e 20 6c 69 74 74 6c 65 2d 65 6e  ess on little-en
18390 64 69 61 6e 20 6d 61 63 68 69 6e 65 73 2e 0a 20  dian machines.. 
183a0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
183b0 79 74 65 52 65 76 65 72 73 65 20 28 75 6e 73 69  yteReverse (unsi
183c0 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20  gned char *buf, 
183d0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 73 29 7b  unsigned longs){
183e0 0a 20 20 20 20 20 20 20 20 75 69 6e 74 33 32 20  .        uint32 
183f0 74 3b 0a 20 20 20 20 20 20 20 20 64 6f 20 7b 0a  t;.        do {.
18400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18410 74 20 3d 20 28 75 69 6e 74 33 32 29 28 28 75 6e  t = (uint32)((un
18420 73 69 67 6e 65 64 29 62 75 66 5b 33 5d 3c 3c 38  signed)buf[3]<<8
18430 20 7c 20 62 75 66 5b 32 5d 29 20 3c 3c 20 31 36   | buf[2]) << 16
18440 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
18450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
18460 28 75 6e 73 69 67 6e 65 64 29 62 75 66 5b 31 5d  (unsigned)buf[1]
18470 3c 3c 38 20 7c 20 62 75 66 5b 30 5d 29 3b 0a 20  <<8 | buf[0]);. 
18480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
18490 28 75 69 6e 74 33 32 20 2a 29 62 75 66 20 3d 20  (uint32 *)buf = 
184a0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t;.             
184b0 20 20 20 62 75 66 20 2b 3d 20 34 3b 0a 20 20 20     buf += 4;.   
184c0 20 20 20 20 20 7d 20 77 68 69 6c 65 20 28 2d 2d       } while (--
184d0 6c 6f 6e 67 73 29 3b 0a 7d 0a 2f 2a 20 54 68 65  longs);.}./* The
184e0 20 66 6f 75 72 20 63 6f 72 65 20 66 75 6e 63 74   four core funct
184f0 69 6f 6e 73 20 2d 20 46 31 20 69 73 20 6f 70 74  ions - F1 is opt
18500 69 6d 69 7a 65 64 20 73 6f 6d 65 77 68 61 74 20  imized somewhat 
18510 2a 2f 0a 0a 2f 2a 20 23 64 65 66 69 6e 65 20 46  */../* #define F
18520 31 28 78 2c 20 79 2c 20 7a 29 20 28 78 20 26 20  1(x, y, z) (x & 
18530 79 20 7c 20 7e 78 20 26 20 7a 29 20 2a 2f 0a 23  y | ~x & z) */.#
18540 64 65 66 69 6e 65 20 46 31 28 78 2c 20 79 2c 20  define F1(x, y, 
18550 7a 29 20 28 7a 20 5e 20 28 78 20 26 20 28 79 20  z) (z ^ (x & (y 
18560 5e 20 7a 29 29 29 0a 23 64 65 66 69 6e 65 20 46  ^ z))).#define F
18570 32 28 78 2c 20 79 2c 20 7a 29 20 46 31 28 7a 2c  2(x, y, z) F1(z,
18580 20 78 2c 20 79 29 0a 23 64 65 66 69 6e 65 20 46   x, y).#define F
18590 33 28 78 2c 20 79 2c 20 7a 29 20 28 78 20 5e 20  3(x, y, z) (x ^ 
185a0 79 20 5e 20 7a 29 0a 23 64 65 66 69 6e 65 20 46  y ^ z).#define F
185b0 34 28 78 2c 20 79 2c 20 7a 29 20 28 79 20 5e 20  4(x, y, z) (y ^ 
185c0 28 78 20 7c 20 7e 7a 29 29 0a 0a 2f 2a 20 54 68  (x | ~z))../* Th
185d0 69 73 20 69 73 20 74 68 65 20 63 65 6e 74 72 61  is is the centra
185e0 6c 20 73 74 65 70 20 69 6e 20 74 68 65 20 4d 44  l step in the MD
185f0 35 20 61 6c 67 6f 72 69 74 68 6d 2e 20 2a 2f 0a  5 algorithm. */.
18600 23 64 65 66 69 6e 65 20 4d 44 35 53 54 45 50 28  #define MD5STEP(
18610 66 2c 20 77 2c 20 78 2c 20 79 2c 20 7a 2c 20 64  f, w, x, y, z, d
18620 61 74 61 2c 20 73 29 20 5c 0a 20 20 20 20 20 20  ata, s) \.      
18630 20 20 28 20 77 20 2b 3d 20 66 28 78 2c 20 79 2c    ( w += f(x, y,
18640 20 7a 29 20 2b 20 64 61 74 61 2c 20 20 77 20 3d   z) + data,  w =
18650 20 77 3c 3c 73 20 7c 20 77 3e 3e 28 33 32 2d 73   w<<s | w>>(32-s
18660 29 2c 20 20 77 20 2b 3d 20 78 20 29 0a 0a 2f 2a  ),  w += x )../*
18670 0a 20 2a 20 54 68 65 20 63 6f 72 65 20 6f 66 20  . * The core of 
18680 74 68 65 20 4d 44 35 20 61 6c 67 6f 72 69 74 68  the MD5 algorith
18690 6d 2c 20 74 68 69 73 20 61 6c 74 65 72 73 20 61  m, this alters a
186a0 6e 20 65 78 69 73 74 69 6e 67 20 4d 44 35 20 68  n existing MD5 h
186b0 61 73 68 20 74 6f 0a 20 2a 20 72 65 66 6c 65 63  ash to. * reflec
186c0 74 20 74 68 65 20 61 64 64 69 74 69 6f 6e 20 6f  t the addition o
186d0 66 20 31 36 20 6c 6f 6e 67 77 6f 72 64 73 20 6f  f 16 longwords o
186e0 66 20 6e 65 77 20 64 61 74 61 2e 20 20 4d 44 35  f new data.  MD5
186f0 55 70 64 61 74 65 20 62 6c 6f 63 6b 73 0a 20 2a  Update blocks. *
18700 20 74 68 65 20 64 61 74 61 20 61 6e 64 20 63 6f   the data and co
18710 6e 76 65 72 74 73 20 62 79 74 65 73 20 69 6e 74  nverts bytes int
18720 6f 20 6c 6f 6e 67 77 6f 72 64 73 20 66 6f 72 20  o longwords for 
18730 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 20 2a  this routine.. *
18740 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 4d 44  /.static void MD
18750 35 54 72 61 6e 73 66 6f 72 6d 28 75 69 6e 74 33  5Transform(uint3
18760 32 20 62 75 66 5b 34 5d 2c 20 63 6f 6e 73 74 20  2 buf[4], const 
18770 75 69 6e 74 33 32 20 69 6e 5b 31 36 5d 29 7b 0a  uint32 in[16]){.
18780 20 20 20 20 20 20 20 20 72 65 67 69 73 74 65 72          register
18790 20 75 69 6e 74 33 32 20 61 2c 20 62 2c 20 63 2c   uint32 a, b, c,
187a0 20 64 3b 0a 0a 20 20 20 20 20 20 20 20 61 20 3d   d;..        a =
187b0 20 62 75 66 5b 30 5d 3b 0a 20 20 20 20 20 20 20   buf[0];.       
187c0 20 62 20 3d 20 62 75 66 5b 31 5d 3b 0a 20 20 20   b = buf[1];.   
187d0 20 20 20 20 20 63 20 3d 20 62 75 66 5b 32 5d 3b       c = buf[2];
187e0 0a 20 20 20 20 20 20 20 20 64 20 3d 20 62 75 66  .        d = buf
187f0 5b 33 5d 3b 0a 0a 20 20 20 20 20 20 20 20 4d 44  [3];..        MD
18800 35 53 54 45 50 28 46 31 2c 20 61 2c 20 62 2c 20  5STEP(F1, a, b, 
18810 63 2c 20 64 2c 20 69 6e 5b 20 30 5d 2b 30 78 64  c, d, in[ 0]+0xd
18820 37 36 61 61 34 37 38 2c 20 20 37 29 3b 0a 20 20  76aa478,  7);.  
18830 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31        MD5STEP(F1
18840 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e  , d, a, b, c, in
18850 5b 20 31 5d 2b 30 78 65 38 63 37 62 37 35 36 2c  [ 1]+0xe8c7b756,
18860 20 31 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   12);.        MD
18870 35 53 54 45 50 28 46 31 2c 20 63 2c 20 64 2c 20  5STEP(F1, c, d, 
18880 61 2c 20 62 2c 20 69 6e 5b 20 32 5d 2b 30 78 32  a, b, in[ 2]+0x2
18890 34 32 30 37 30 64 62 2c 20 31 37 29 3b 0a 20 20  42070db, 17);.  
188a0 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31        MD5STEP(F1
188b0 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
188c0 5b 20 33 5d 2b 30 78 63 31 62 64 63 65 65 65 2c  [ 3]+0xc1bdceee,
188d0 20 32 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   22);.        MD
188e0 35 53 54 45 50 28 46 31 2c 20 61 2c 20 62 2c 20  5STEP(F1, a, b, 
188f0 63 2c 20 64 2c 20 69 6e 5b 20 34 5d 2b 30 78 66  c, d, in[ 4]+0xf
18900 35 37 63 30 66 61 66 2c 20 20 37 29 3b 0a 20 20  57c0faf,  7);.  
18910 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31        MD5STEP(F1
18920 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e  , d, a, b, c, in
18930 5b 20 35 5d 2b 30 78 34 37 38 37 63 36 32 61 2c  [ 5]+0x4787c62a,
18940 20 31 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   12);.        MD
18950 35 53 54 45 50 28 46 31 2c 20 63 2c 20 64 2c 20  5STEP(F1, c, d, 
18960 61 2c 20 62 2c 20 69 6e 5b 20 36 5d 2b 30 78 61  a, b, in[ 6]+0xa
18970 38 33 30 34 36 31 33 2c 20 31 37 29 3b 0a 20 20  8304613, 17);.  
18980 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31        MD5STEP(F1
18990 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
189a0 5b 20 37 5d 2b 30 78 66 64 34 36 39 35 30 31 2c  [ 7]+0xfd469501,
189b0 20 32 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   22);.        MD
189c0 35 53 54 45 50 28 46 31 2c 20 61 2c 20 62 2c 20  5STEP(F1, a, b, 
189d0 63 2c 20 64 2c 20 69 6e 5b 20 38 5d 2b 30 78 36  c, d, in[ 8]+0x6
189e0 39 38 30 39 38 64 38 2c 20 20 37 29 3b 0a 20 20  98098d8,  7);.  
189f0 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31        MD5STEP(F1
18a00 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e  , d, a, b, c, in
18a10 5b 20 39 5d 2b 30 78 38 62 34 34 66 37 61 66 2c  [ 9]+0x8b44f7af,
18a20 20 31 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   12);.        MD
18a30 35 53 54 45 50 28 46 31 2c 20 63 2c 20 64 2c 20  5STEP(F1, c, d, 
18a40 61 2c 20 62 2c 20 69 6e 5b 31 30 5d 2b 30 78 66  a, b, in[10]+0xf
18a50 66 66 66 35 62 62 31 2c 20 31 37 29 3b 0a 20 20  fff5bb1, 17);.  
18a60 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31        MD5STEP(F1
18a70 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
18a80 5b 31 31 5d 2b 30 78 38 39 35 63 64 37 62 65 2c  [11]+0x895cd7be,
18a90 20 32 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   22);.        MD
18aa0 35 53 54 45 50 28 46 31 2c 20 61 2c 20 62 2c 20  5STEP(F1, a, b, 
18ab0 63 2c 20 64 2c 20 69 6e 5b 31 32 5d 2b 30 78 36  c, d, in[12]+0x6
18ac0 62 39 30 31 31 32 32 2c 20 20 37 29 3b 0a 20 20  b901122,  7);.  
18ad0 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31        MD5STEP(F1
18ae0 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e  , d, a, b, c, in
18af0 5b 31 33 5d 2b 30 78 66 64 39 38 37 31 39 33 2c  [13]+0xfd987193,
18b00 20 31 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   12);.        MD
18b10 35 53 54 45 50 28 46 31 2c 20 63 2c 20 64 2c 20  5STEP(F1, c, d, 
18b20 61 2c 20 62 2c 20 69 6e 5b 31 34 5d 2b 30 78 61  a, b, in[14]+0xa
18b30 36 37 39 34 33 38 65 2c 20 31 37 29 3b 0a 20 20  679438e, 17);.  
18b40 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31        MD5STEP(F1
18b50 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
18b60 5b 31 35 5d 2b 30 78 34 39 62 34 30 38 32 31 2c  [15]+0x49b40821,
18b70 20 32 32 29 3b 0a 0a 20 20 20 20 20 20 20 20 4d   22);..        M
18b80 44 35 53 54 45 50 28 46 32 2c 20 61 2c 20 62 2c  D5STEP(F2, a, b,
18b90 20 63 2c 20 64 2c 20 69 6e 5b 20 31 5d 2b 30 78   c, d, in[ 1]+0x
18ba0 66 36 31 65 32 35 36 32 2c 20 20 35 29 3b 0a 20  f61e2562,  5);. 
18bb0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
18bc0 32 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69  2, d, a, b, c, i
18bd0 6e 5b 20 36 5d 2b 30 78 63 30 34 30 62 33 34 30  n[ 6]+0xc040b340
18be0 2c 20 20 39 29 3b 0a 20 20 20 20 20 20 20 20 4d  ,  9);.        M
18bf0 44 35 53 54 45 50 28 46 32 2c 20 63 2c 20 64 2c  D5STEP(F2, c, d,
18c00 20 61 2c 20 62 2c 20 69 6e 5b 31 31 5d 2b 30 78   a, b, in[11]+0x
18c10 32 36 35 65 35 61 35 31 2c 20 31 34 29 3b 0a 20  265e5a51, 14);. 
18c20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
18c30 32 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  2, b, c, d, a, i
18c40 6e 5b 20 30 5d 2b 30 78 65 39 62 36 63 37 61 61  n[ 0]+0xe9b6c7aa
18c50 2c 20 32 30 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 20);.        M
18c60 44 35 53 54 45 50 28 46 32 2c 20 61 2c 20 62 2c  D5STEP(F2, a, b,
18c70 20 63 2c 20 64 2c 20 69 6e 5b 20 35 5d 2b 30 78   c, d, in[ 5]+0x
18c80 64 36 32 66 31 30 35 64 2c 20 20 35 29 3b 0a 20  d62f105d,  5);. 
18c90 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
18ca0 32 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69  2, d, a, b, c, i
18cb0 6e 5b 31 30 5d 2b 30 78 30 32 34 34 31 34 35 33  n[10]+0x02441453
18cc0 2c 20 20 39 29 3b 0a 20 20 20 20 20 20 20 20 4d  ,  9);.        M
18cd0 44 35 53 54 45 50 28 46 32 2c 20 63 2c 20 64 2c  D5STEP(F2, c, d,
18ce0 20 61 2c 20 62 2c 20 69 6e 5b 31 35 5d 2b 30 78   a, b, in[15]+0x
18cf0 64 38 61 31 65 36 38 31 2c 20 31 34 29 3b 0a 20  d8a1e681, 14);. 
18d00 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
18d10 32 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  2, b, c, d, a, i
18d20 6e 5b 20 34 5d 2b 30 78 65 37 64 33 66 62 63 38  n[ 4]+0xe7d3fbc8
18d30 2c 20 32 30 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 20);.        M
18d40 44 35 53 54 45 50 28 46 32 2c 20 61 2c 20 62 2c  D5STEP(F2, a, b,
18d50 20 63 2c 20 64 2c 20 69 6e 5b 20 39 5d 2b 30 78   c, d, in[ 9]+0x
18d60 32 31 65 31 63 64 65 36 2c 20 20 35 29 3b 0a 20  21e1cde6,  5);. 
18d70 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
18d80 32 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69  2, d, a, b, c, i
18d90 6e 5b 31 34 5d 2b 30 78 63 33 33 37 30 37 64 36  n[14]+0xc33707d6
18da0 2c 20 20 39 29 3b 0a 20 20 20 20 20 20 20 20 4d  ,  9);.        M
18db0 44 35 53 54 45 50 28 46 32 2c 20 63 2c 20 64 2c  D5STEP(F2, c, d,
18dc0 20 61 2c 20 62 2c 20 69 6e 5b 20 33 5d 2b 30 78   a, b, in[ 3]+0x
18dd0 66 34 64 35 30 64 38 37 2c 20 31 34 29 3b 0a 20  f4d50d87, 14);. 
18de0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
18df0 32 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  2, b, c, d, a, i
18e00 6e 5b 20 38 5d 2b 30 78 34 35 35 61 31 34 65 64  n[ 8]+0x455a14ed
18e10 2c 20 32 30 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 20);.        M
18e20 44 35 53 54 45 50 28 46 32 2c 20 61 2c 20 62 2c  D5STEP(F2, a, b,
18e30 20 63 2c 20 64 2c 20 69 6e 5b 31 33 5d 2b 30 78   c, d, in[13]+0x
18e40 61 39 65 33 65 39 30 35 2c 20 20 35 29 3b 0a 20  a9e3e905,  5);. 
18e50 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
18e60 32 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69  2, d, a, b, c, i
18e70 6e 5b 20 32 5d 2b 30 78 66 63 65 66 61 33 66 38  n[ 2]+0xfcefa3f8
18e80 2c 20 20 39 29 3b 0a 20 20 20 20 20 20 20 20 4d  ,  9);.        M
18e90 44 35 53 54 45 50 28 46 32 2c 20 63 2c 20 64 2c  D5STEP(F2, c, d,
18ea0 20 61 2c 20 62 2c 20 69 6e 5b 20 37 5d 2b 30 78   a, b, in[ 7]+0x
18eb0 36 37 36 66 30 32 64 39 2c 20 31 34 29 3b 0a 20  676f02d9, 14);. 
18ec0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
18ed0 32 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  2, b, c, d, a, i
18ee0 6e 5b 31 32 5d 2b 30 78 38 64 32 61 34 63 38 61  n[12]+0x8d2a4c8a
18ef0 2c 20 32 30 29 3b 0a 0a 20 20 20 20 20 20 20 20  , 20);..        
18f00 4d 44 35 53 54 45 50 28 46 33 2c 20 61 2c 20 62  MD5STEP(F3, a, b
18f10 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 35 5d 2b 30  , c, d, in[ 5]+0
18f20 78 66 66 66 61 33 39 34 32 2c 20 20 34 29 3b 0a  xfffa3942,  4);.
18f30 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
18f40 46 33 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20  F3, d, a, b, c, 
18f50 69 6e 5b 20 38 5d 2b 30 78 38 37 37 31 66 36 38  in[ 8]+0x8771f68
18f60 31 2c 20 31 31 29 3b 0a 20 20 20 20 20 20 20 20  1, 11);.        
18f70 4d 44 35 53 54 45 50 28 46 33 2c 20 63 2c 20 64  MD5STEP(F3, c, d
18f80 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 31 5d 2b 30  , a, b, in[11]+0
18f90 78 36 64 39 64 36 31 32 32 2c 20 31 36 29 3b 0a  x6d9d6122, 16);.
18fa0 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
18fb0 46 33 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20  F3, b, c, d, a, 
18fc0 69 6e 5b 31 34 5d 2b 30 78 66 64 65 35 33 38 30  in[14]+0xfde5380
18fd0 63 2c 20 32 33 29 3b 0a 20 20 20 20 20 20 20 20  c, 23);.        
18fe0 4d 44 35 53 54 45 50 28 46 33 2c 20 61 2c 20 62  MD5STEP(F3, a, b
18ff0 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 31 5d 2b 30  , c, d, in[ 1]+0
19000 78 61 34 62 65 65 61 34 34 2c 20 20 34 29 3b 0a  xa4beea44,  4);.
19010 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
19020 46 33 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20  F3, d, a, b, c, 
19030 69 6e 5b 20 34 5d 2b 30 78 34 62 64 65 63 66 61  in[ 4]+0x4bdecfa
19040 39 2c 20 31 31 29 3b 0a 20 20 20 20 20 20 20 20  9, 11);.        
19050 4d 44 35 53 54 45 50 28 46 33 2c 20 63 2c 20 64  MD5STEP(F3, c, d
19060 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 37 5d 2b 30  , a, b, in[ 7]+0
19070 78 66 36 62 62 34 62 36 30 2c 20 31 36 29 3b 0a  xf6bb4b60, 16);.
19080 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
19090 46 33 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20  F3, b, c, d, a, 
190a0 69 6e 5b 31 30 5d 2b 30 78 62 65 62 66 62 63 37  in[10]+0xbebfbc7
190b0 30 2c 20 32 33 29 3b 0a 20 20 20 20 20 20 20 20  0, 23);.        
190c0 4d 44 35 53 54 45 50 28 46 33 2c 20 61 2c 20 62  MD5STEP(F3, a, b
190d0 2c 20 63 2c 20 64 2c 20 69 6e 5b 31 33 5d 2b 30  , c, d, in[13]+0
190e0 78 32 38 39 62 37 65 63 36 2c 20 20 34 29 3b 0a  x289b7ec6,  4);.
190f0 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
19100 46 33 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20  F3, d, a, b, c, 
19110 69 6e 5b 20 30 5d 2b 30 78 65 61 61 31 32 37 66  in[ 0]+0xeaa127f
19120 61 2c 20 31 31 29 3b 0a 20 20 20 20 20 20 20 20  a, 11);.        
19130 4d 44 35 53 54 45 50 28 46 33 2c 20 63 2c 20 64  MD5STEP(F3, c, d
19140 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 33 5d 2b 30  , a, b, in[ 3]+0
19150 78 64 34 65 66 33 30 38 35 2c 20 31 36 29 3b 0a  xd4ef3085, 16);.
19160 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
19170 46 33 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20  F3, b, c, d, a, 
19180 69 6e 5b 20 36 5d 2b 30 78 30 34 38 38 31 64 30  in[ 6]+0x04881d0
19190 35 2c 20 32 33 29 3b 0a 20 20 20 20 20 20 20 20  5, 23);.        
191a0 4d 44 35 53 54 45 50 28 46 33 2c 20 61 2c 20 62  MD5STEP(F3, a, b
191b0 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 39 5d 2b 30  , c, d, in[ 9]+0
191c0 78 64 39 64 34 64 30 33 39 2c 20 20 34 29 3b 0a  xd9d4d039,  4);.
191d0 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
191e0 46 33 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20  F3, d, a, b, c, 
191f0 69 6e 5b 31 32 5d 2b 30 78 65 36 64 62 39 39 65  in[12]+0xe6db99e
19200 35 2c 20 31 31 29 3b 0a 20 20 20 20 20 20 20 20  5, 11);.        
19210 4d 44 35 53 54 45 50 28 46 33 2c 20 63 2c 20 64  MD5STEP(F3, c, d
19220 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 35 5d 2b 30  , a, b, in[15]+0
19230 78 31 66 61 32 37 63 66 38 2c 20 31 36 29 3b 0a  x1fa27cf8, 16);.
19240 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
19250 46 33 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20  F3, b, c, d, a, 
19260 69 6e 5b 20 32 5d 2b 30 78 63 34 61 63 35 36 36  in[ 2]+0xc4ac566
19270 35 2c 20 32 33 29 3b 0a 0a 20 20 20 20 20 20 20  5, 23);..       
19280 20 4d 44 35 53 54 45 50 28 46 34 2c 20 61 2c 20   MD5STEP(F4, a, 
19290 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 30 5d 2b  b, c, d, in[ 0]+
192a0 30 78 66 34 32 39 32 32 34 34 2c 20 20 36 29 3b  0xf4292244,  6);
192b0 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
192c0 28 46 34 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c  (F4, d, a, b, c,
192d0 20 69 6e 5b 20 37 5d 2b 30 78 34 33 32 61 66 66   in[ 7]+0x432aff
192e0 39 37 2c 20 31 30 29 3b 0a 20 20 20 20 20 20 20  97, 10);.       
192f0 20 4d 44 35 53 54 45 50 28 46 34 2c 20 63 2c 20   MD5STEP(F4, c, 
19300 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 34 5d 2b  d, a, b, in[14]+
19310 30 78 61 62 39 34 32 33 61 37 2c 20 31 35 29 3b  0xab9423a7, 15);
19320 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
19330 28 46 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c  (F4, b, c, d, a,
19340 20 69 6e 5b 20 35 5d 2b 30 78 66 63 39 33 61 30   in[ 5]+0xfc93a0
19350 33 39 2c 20 32 31 29 3b 0a 20 20 20 20 20 20 20  39, 21);.       
19360 20 4d 44 35 53 54 45 50 28 46 34 2c 20 61 2c 20   MD5STEP(F4, a, 
19370 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 31 32 5d 2b  b, c, d, in[12]+
19380 30 78 36 35 35 62 35 39 63 33 2c 20 20 36 29 3b  0x655b59c3,  6);
19390 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
193a0 28 46 34 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c  (F4, d, a, b, c,
193b0 20 69 6e 5b 20 33 5d 2b 30 78 38 66 30 63 63 63   in[ 3]+0x8f0ccc
193c0 39 32 2c 20 31 30 29 3b 0a 20 20 20 20 20 20 20  92, 10);.       
193d0 20 4d 44 35 53 54 45 50 28 46 34 2c 20 63 2c 20   MD5STEP(F4, c, 
193e0 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 30 5d 2b  d, a, b, in[10]+
193f0 30 78 66 66 65 66 66 34 37 64 2c 20 31 35 29 3b  0xffeff47d, 15);
19400 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
19410 28 46 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c  (F4, b, c, d, a,
19420 20 69 6e 5b 20 31 5d 2b 30 78 38 35 38 34 35 64   in[ 1]+0x85845d
19430 64 31 2c 20 32 31 29 3b 0a 20 20 20 20 20 20 20  d1, 21);.       
19440 20 4d 44 35 53 54 45 50 28 46 34 2c 20 61 2c 20   MD5STEP(F4, a, 
19450 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 38 5d 2b  b, c, d, in[ 8]+
19460 30 78 36 66 61 38 37 65 34 66 2c 20 20 36 29 3b  0x6fa87e4f,  6);
19470 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
19480 28 46 34 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c  (F4, d, a, b, c,
19490 20 69 6e 5b 31 35 5d 2b 30 78 66 65 32 63 65 36   in[15]+0xfe2ce6
194a0 65 30 2c 20 31 30 29 3b 0a 20 20 20 20 20 20 20  e0, 10);.       
194b0 20 4d 44 35 53 54 45 50 28 46 34 2c 20 63 2c 20   MD5STEP(F4, c, 
194c0 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 36 5d 2b  d, a, b, in[ 6]+
194d0 30 78 61 33 30 31 34 33 31 34 2c 20 31 35 29 3b  0xa3014314, 15);
194e0 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
194f0 28 46 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c  (F4, b, c, d, a,
19500 20 69 6e 5b 31 33 5d 2b 30 78 34 65 30 38 31 31   in[13]+0x4e0811
19510 61 31 2c 20 32 31 29 3b 0a 20 20 20 20 20 20 20  a1, 21);.       
19520 20 4d 44 35 53 54 45 50 28 46 34 2c 20 61 2c 20   MD5STEP(F4, a, 
19530 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 34 5d 2b  b, c, d, in[ 4]+
19540 30 78 66 37 35 33 37 65 38 32 2c 20 20 36 29 3b  0xf7537e82,  6);
19550 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
19560 28 46 34 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c  (F4, d, a, b, c,
19570 20 69 6e 5b 31 31 5d 2b 30 78 62 64 33 61 66 32   in[11]+0xbd3af2
19580 33 35 2c 20 31 30 29 3b 0a 20 20 20 20 20 20 20  35, 10);.       
19590 20 4d 44 35 53 54 45 50 28 46 34 2c 20 63 2c 20   MD5STEP(F4, c, 
195a0 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 32 5d 2b  d, a, b, in[ 2]+
195b0 30 78 32 61 64 37 64 32 62 62 2c 20 31 35 29 3b  0x2ad7d2bb, 15);
195c0 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
195d0 28 46 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c  (F4, b, c, d, a,
195e0 20 69 6e 5b 20 39 5d 2b 30 78 65 62 38 36 64 33   in[ 9]+0xeb86d3
195f0 39 31 2c 20 32 31 29 3b 0a 0a 20 20 20 20 20 20  91, 21);..      
19600 20 20 62 75 66 5b 30 5d 20 2b 3d 20 61 3b 0a 20    buf[0] += a;. 
19610 20 20 20 20 20 20 20 62 75 66 5b 31 5d 20 2b 3d         buf[1] +=
19620 20 62 3b 0a 20 20 20 20 20 20 20 20 62 75 66 5b   b;.        buf[
19630 32 5d 20 2b 3d 20 63 3b 0a 20 20 20 20 20 20 20  2] += c;.       
19640 20 62 75 66 5b 33 5d 20 2b 3d 20 64 3b 0a 7d 0a   buf[3] += d;.}.
19650 0a 2f 2a 0a 20 2a 20 53 74 61 72 74 20 4d 44 35  ./*. * Start MD5
19660 20 61 63 63 75 6d 75 6c 61 74 69 6f 6e 2e 20 20   accumulation.  
19670 53 65 74 20 62 69 74 20 63 6f 75 6e 74 20 74 6f  Set bit count to
19680 20 30 20 61 6e 64 20 62 75 66 66 65 72 20 74 6f   0 and buffer to
19690 20 6d 79 73 74 65 72 69 6f 75 73 0a 20 2a 20 69   mysterious. * i
196a0 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 63 6f  nitialization co
196b0 6e 73 74 61 6e 74 73 2e 0a 20 2a 2f 0a 73 74 61  nstants.. */.sta
196c0 74 69 63 20 76 6f 69 64 20 4d 44 35 49 6e 69 74  tic void MD5Init
196d0 28 4d 44 35 43 6f 6e 74 65 78 74 20 2a 63 74 78  (MD5Context *ctx
196e0 29 7b 0a 20 20 20 20 20 20 20 20 63 74 78 2d 3e  ){.        ctx->
196f0 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20  isInit = 1;.    
19700 20 20 20 20 63 74 78 2d 3e 62 75 66 5b 30 5d 20      ctx->buf[0] 
19710 3d 20 30 78 36 37 34 35 32 33 30 31 3b 0a 20 20  = 0x67452301;.  
19720 20 20 20 20 20 20 63 74 78 2d 3e 62 75 66 5b 31        ctx->buf[1
19730 5d 20 3d 20 30 78 65 66 63 64 61 62 38 39 3b 0a  ] = 0xefcdab89;.
19740 20 20 20 20 20 20 20 20 63 74 78 2d 3e 62 75 66          ctx->buf
19750 5b 32 5d 20 3d 20 30 78 39 38 62 61 64 63 66 65  [2] = 0x98badcfe
19760 3b 0a 20 20 20 20 20 20 20 20 63 74 78 2d 3e 62  ;.        ctx->b
19770 75 66 5b 33 5d 20 3d 20 30 78 31 30 33 32 35 34  uf[3] = 0x103254
19780 37 36 3b 0a 20 20 20 20 20 20 20 20 63 74 78 2d  76;.        ctx-
19790 3e 62 69 74 73 5b 30 5d 20 3d 20 30 3b 0a 20 20  >bits[0] = 0;.  
197a0 20 20 20 20 20 20 63 74 78 2d 3e 62 69 74 73 5b        ctx->bits[
197b0 31 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  1] = 0;.}../*. *
197c0 20 55 70 64 61 74 65 20 63 6f 6e 74 65 78 74 20   Update context 
197d0 74 6f 20 72 65 66 6c 65 63 74 20 74 68 65 20 63  to reflect the c
197e0 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 20 6f 66 20  oncatenation of 
197f0 61 6e 6f 74 68 65 72 20 62 75 66 66 65 72 20 66  another buffer f
19800 75 6c 6c 0a 20 2a 20 6f 66 20 62 79 74 65 73 2e  ull. * of bytes.
19810 0a 20 2a 2f 0a 73 74 61 74 69 63 20 0a 76 6f 69  . */.static .voi
19820 64 20 4d 44 35 55 70 64 61 74 65 28 4d 44 35 43  d MD5Update(MD5C
19830 6f 6e 74 65 78 74 20 2a 63 74 78 2c 20 63 6f 6e  ontext *ctx, con
19840 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
19850 20 2a 62 75 66 2c 20 75 6e 73 69 67 6e 65 64 20   *buf, unsigned 
19860 69 6e 74 20 6c 65 6e 29 7b 0a 20 20 20 20 20 20  int len){.      
19870 20 20 75 69 6e 74 33 32 20 74 3b 0a 0a 20 20 20    uint32 t;..   
19880 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 62       /* Update b
19890 69 74 63 6f 75 6e 74 20 2a 2f 0a 0a 20 20 20 20  itcount */..    
198a0 20 20 20 20 74 20 3d 20 63 74 78 2d 3e 62 69 74      t = ctx->bit
198b0 73 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  s[0];.        if
198c0 20 28 28 63 74 78 2d 3e 62 69 74 73 5b 30 5d 20   ((ctx->bits[0] 
198d0 3d 20 74 20 2b 20 28 28 75 69 6e 74 33 32 29 6c  = t + ((uint32)l
198e0 65 6e 20 3c 3c 20 33 29 29 20 3c 20 74 29 0a 20  en << 3)) < t). 
198f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
19900 74 78 2d 3e 62 69 74 73 5b 31 5d 2b 2b 3b 20 2f  tx->bits[1]++; /
19910 2a 20 43 61 72 72 79 20 66 72 6f 6d 20 6c 6f 77  * Carry from low
19920 20 74 6f 20 68 69 67 68 20 2a 2f 0a 20 20 20 20   to high */.    
19930 20 20 20 20 63 74 78 2d 3e 62 69 74 73 5b 31 5d      ctx->bits[1]
19940 20 2b 3d 20 6c 65 6e 20 3e 3e 20 32 39 3b 0a 0a   += len >> 29;..
19950 20 20 20 20 20 20 20 20 74 20 3d 20 28 74 20 3e          t = (t >
19960 3e 20 33 29 20 26 20 30 78 33 66 3b 20 20 20 20  > 3) & 0x3f;    
19970 2f 2a 20 42 79 74 65 73 20 61 6c 72 65 61 64 79  /* Bytes already
19980 20 69 6e 20 73 68 73 49 6e 66 6f 2d 3e 64 61 74   in shsInfo->dat
19990 61 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a  a */..        /*
199a0 20 48 61 6e 64 6c 65 20 61 6e 79 20 6c 65 61 64   Handle any lead
199b0 69 6e 67 20 6f 64 64 2d 73 69 7a 65 64 20 63 68  ing odd-sized ch
199c0 75 6e 6b 73 20 2a 2f 0a 0a 20 20 20 20 20 20 20  unks */..       
199d0 20 69 66 20 28 20 74 20 29 20 7b 0a 20 20 20 20   if ( t ) {.    
199e0 20 20 20 20 20 20 20 20 20 20 20 20 75 6e 73 69              unsi
199f0 67 6e 65 64 20 63 68 61 72 20 2a 70 20 3d 20 28  gned char *p = (
19a00 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
19a10 63 74 78 2d 3e 69 6e 20 2b 20 74 3b 0a 0a 20 20  ctx->in + t;..  
19a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 20                t 
19a30 3d 20 36 34 2d 74 3b 0a 20 20 20 20 20 20 20 20  = 64-t;.        
19a40 20 20 20 20 20 20 20 20 69 66 20 28 6c 65 6e 20          if (len 
19a50 3c 20 74 29 20 7b 0a 20 20 20 20 20 20 20 20 20  < t) {.         
19a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
19a70 65 6d 63 70 79 28 70 2c 20 62 75 66 2c 20 6c 65  emcpy(p, buf, le
19a80 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
19a90 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
19aa0 72 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  rn;.            
19ab0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
19ac0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 2c 20        memcpy(p, 
19ad0 62 75 66 2c 20 74 29 3b 0a 20 20 20 20 20 20 20  buf, t);.       
19ae0 20 20 20 20 20 20 20 20 20 62 79 74 65 52 65 76           byteRev
19af0 65 72 73 65 28 63 74 78 2d 3e 69 6e 2c 20 31 36  erse(ctx->in, 16
19b00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
19b10 20 20 20 4d 44 35 54 72 61 6e 73 66 6f 72 6d 28     MD5Transform(
19b20 63 74 78 2d 3e 62 75 66 2c 20 28 75 69 6e 74 33  ctx->buf, (uint3
19b30 32 20 2a 29 63 74 78 2d 3e 69 6e 29 3b 0a 20 20  2 *)ctx->in);.  
19b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 75                bu
19b50 66 20 2b 3d 20 74 3b 0a 20 20 20 20 20 20 20 20  f += t;.        
19b60 20 20 20 20 20 20 20 20 6c 65 6e 20 2d 3d 20 74          len -= t
19b70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
19b80 20 20 20 20 20 2f 2a 20 50 72 6f 63 65 73 73 20       /* Process 
19b90 64 61 74 61 20 69 6e 20 36 34 2d 62 79 74 65 20  data in 64-byte 
19ba0 63 68 75 6e 6b 73 20 2a 2f 0a 0a 20 20 20 20 20  chunks */..     
19bb0 20 20 20 77 68 69 6c 65 20 28 6c 65 6e 20 3e 3d     while (len >=
19bc0 20 36 34 29 20 7b 0a 20 20 20 20 20 20 20 20 20   64) {.         
19bd0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 63 74         memcpy(ct
19be0 78 2d 3e 69 6e 2c 20 62 75 66 2c 20 36 34 29 3b  x->in, buf, 64);
19bf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19c00 20 62 79 74 65 52 65 76 65 72 73 65 28 63 74 78   byteReverse(ctx
19c10 2d 3e 69 6e 2c 20 31 36 29 3b 0a 20 20 20 20 20  ->in, 16);.     
19c20 20 20 20 20 20 20 20 20 20 20 20 4d 44 35 54 72             MD5Tr
19c30 61 6e 73 66 6f 72 6d 28 63 74 78 2d 3e 62 75 66  ansform(ctx->buf
19c40 2c 20 28 75 69 6e 74 33 32 20 2a 29 63 74 78 2d  , (uint32 *)ctx-
19c50 3e 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  >in);.          
19c60 20 20 20 20 20 20 62 75 66 20 2b 3d 20 36 34 3b        buf += 64;
19c70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19c80 20 6c 65 6e 20 2d 3d 20 36 34 3b 0a 20 20 20 20   len -= 64;.    
19c90 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
19ca0 2a 20 48 61 6e 64 6c 65 20 61 6e 79 20 72 65 6d  * Handle any rem
19cb0 61 69 6e 69 6e 67 20 62 79 74 65 73 20 6f 66 20  aining bytes of 
19cc0 64 61 74 61 2e 20 2a 2f 0a 0a 20 20 20 20 20 20  data. */..      
19cd0 20 20 6d 65 6d 63 70 79 28 63 74 78 2d 3e 69 6e    memcpy(ctx->in
19ce0 2c 20 62 75 66 2c 20 6c 65 6e 29 3b 0a 7d 0a 0a  , buf, len);.}..
19cf0 2f 2a 0a 20 2a 20 46 69 6e 61 6c 20 77 72 61 70  /*. * Final wrap
19d00 75 70 20 2d 20 70 61 64 20 74 6f 20 36 34 2d 62  up - pad to 64-b
19d10 79 74 65 20 62 6f 75 6e 64 61 72 79 20 77 69 74  yte boundary wit
19d20 68 20 74 68 65 20 62 69 74 20 70 61 74 74 65 72  h the bit patter
19d30 6e 20 0a 20 2a 20 31 20 30 2a 20 28 36 34 2d 62  n . * 1 0* (64-b
19d40 69 74 20 63 6f 75 6e 74 20 6f 66 20 62 69 74 73  it count of bits
19d50 20 70 72 6f 63 65 73 73 65 64 2c 20 4d 53 42 2d   processed, MSB-
19d60 66 69 72 73 74 29 0a 20 2a 2f 0a 73 74 61 74 69  first). */.stati
19d70 63 20 76 6f 69 64 20 4d 44 35 46 69 6e 61 6c 28  c void MD5Final(
19d80 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64 69  unsigned char di
19d90 67 65 73 74 5b 31 36 5d 2c 20 4d 44 35 43 6f 6e  gest[16], MD5Con
19da0 74 65 78 74 20 2a 63 74 78 29 7b 0a 20 20 20 20  text *ctx){.    
19db0 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 6f 75      unsigned cou
19dc0 6e 74 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69  nt;.        unsi
19dd0 67 6e 65 64 20 63 68 61 72 20 2a 70 3b 0a 0a 20  gned char *p;.. 
19de0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74         /* Comput
19df0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
19e00 73 20 6d 6f 64 20 36 34 20 2a 2f 0a 20 20 20 20  s mod 64 */.    
19e10 20 20 20 20 63 6f 75 6e 74 20 3d 20 28 63 74 78      count = (ctx
19e20 2d 3e 62 69 74 73 5b 30 5d 20 3e 3e 20 33 29 20  ->bits[0] >> 3) 
19e30 26 20 30 78 33 46 3b 0a 0a 20 20 20 20 20 20 20  & 0x3F;..       
19e40 20 2f 2a 20 53 65 74 20 74 68 65 20 66 69 72 73   /* Set the firs
19e50 74 20 63 68 61 72 20 6f 66 20 70 61 64 64 69 6e  t char of paddin
19e60 67 20 74 6f 20 30 78 38 30 2e 20 20 54 68 69 73  g to 0x80.  This
19e70 20 69 73 20 73 61 66 65 20 73 69 6e 63 65 20 74   is safe since t
19e80 68 65 72 65 20 69 73 0a 20 20 20 20 20 20 20 20  here is.        
19e90 20 20 20 61 6c 77 61 79 73 20 61 74 20 6c 65 61     always at lea
19ea0 73 74 20 6f 6e 65 20 62 79 74 65 20 66 72 65 65  st one byte free
19eb0 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 20 3d 20   */.        p = 
19ec0 63 74 78 2d 3e 69 6e 20 2b 20 63 6f 75 6e 74 3b  ctx->in + count;
19ed0 0a 20 20 20 20 20 20 20 20 2a 70 2b 2b 20 3d 20  .        *p++ = 
19ee0 30 78 38 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f  0x80;..        /
19ef0 2a 20 42 79 74 65 73 20 6f 66 20 70 61 64 64 69  * Bytes of paddi
19f00 6e 67 20 6e 65 65 64 65 64 20 74 6f 20 6d 61 6b  ng needed to mak
19f10 65 20 36 34 20 62 79 74 65 73 20 2a 2f 0a 20 20  e 64 bytes */.  
19f20 20 20 20 20 20 20 63 6f 75 6e 74 20 3d 20 36 34        count = 64
19f30 20 2d 20 31 20 2d 20 63 6f 75 6e 74 3b 0a 0a 20   - 1 - count;.. 
19f40 20 20 20 20 20 20 20 2f 2a 20 50 61 64 20 6f 75         /* Pad ou
19f50 74 20 74 6f 20 35 36 20 6d 6f 64 20 36 34 20 2a  t to 56 mod 64 *
19f60 2f 0a 20 20 20 20 20 20 20 20 69 66 20 28 63 6f  /.        if (co
19f70 75 6e 74 20 3c 20 38 29 20 7b 0a 20 20 20 20 20  unt < 8) {.     
19f80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77             /* Tw
19f90 6f 20 6c 6f 74 73 20 6f 66 20 70 61 64 64 69 6e  o lots of paddin
19fa0 67 3a 20 20 50 61 64 20 74 68 65 20 66 69 72 73  g:  Pad the firs
19fb0 74 20 62 6c 6f 63 6b 20 74 6f 20 36 34 20 62 79  t block to 64 by
19fc0 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  tes */.         
19fd0 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 2c         memset(p,
19fe0 20 30 2c 20 63 6f 75 6e 74 29 3b 0a 20 20 20 20   0, count);.    
19ff0 20 20 20 20 20 20 20 20 20 20 20 20 62 79 74 65              byte
1a000 52 65 76 65 72 73 65 28 63 74 78 2d 3e 69 6e 2c  Reverse(ctx->in,
1a010 20 31 36 29 3b 0a 20 20 20 20 20 20 20 20 20 20   16);.          
1a020 20 20 20 20 20 20 4d 44 35 54 72 61 6e 73 66 6f        MD5Transfo
1a030 72 6d 28 63 74 78 2d 3e 62 75 66 2c 20 28 75 69  rm(ctx->buf, (ui
1a040 6e 74 33 32 20 2a 29 63 74 78 2d 3e 69 6e 29 3b  nt32 *)ctx->in);
1a050 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1a060 20 20 2f 2a 20 4e 6f 77 20 66 69 6c 6c 20 74 68    /* Now fill th
1a070 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 77 69 74  e next block wit
1a080 68 20 35 36 20 62 79 74 65 73 20 2a 2f 0a 20 20  h 56 bytes */.  
1a090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65                me
1a0a0 6d 73 65 74 28 63 74 78 2d 3e 69 6e 2c 20 30 2c  mset(ctx->in, 0,
1a0b0 20 35 36 29 3b 0a 20 20 20 20 20 20 20 20 7d 20   56);.        } 
1a0c0 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20  else {.         
1a0d0 20 20 20 20 20 20 20 2f 2a 20 50 61 64 20 62 6c         /* Pad bl
1a0e0 6f 63 6b 20 74 6f 20 35 36 20 62 79 74 65 73 20  ock to 56 bytes 
1a0f0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
1a100 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20     memset(p, 0, 
1a110 63 6f 75 6e 74 2d 38 29 3b 0a 20 20 20 20 20 20  count-8);.      
1a120 20 20 7d 0a 20 20 20 20 20 20 20 20 62 79 74 65    }.        byte
1a130 52 65 76 65 72 73 65 28 63 74 78 2d 3e 69 6e 2c  Reverse(ctx->in,
1a140 20 31 34 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f   14);..        /
1a150 2a 20 41 70 70 65 6e 64 20 6c 65 6e 67 74 68 20  * Append length 
1a160 69 6e 20 62 69 74 73 20 61 6e 64 20 74 72 61 6e  in bits and tran
1a170 73 66 6f 72 6d 20 2a 2f 0a 20 20 20 20 20 20 20  sform */.       
1a180 20 6d 65 6d 63 70 79 28 63 74 78 2d 3e 69 6e 20   memcpy(ctx->in 
1a190 2b 20 31 34 2a 34 2c 20 63 74 78 2d 3e 62 69 74  + 14*4, ctx->bit
1a1a0 73 2c 20 38 29 3b 0a 0a 20 20 20 20 20 20 20 20  s, 8);..        
1a1b0 4d 44 35 54 72 61 6e 73 66 6f 72 6d 28 63 74 78  MD5Transform(ctx
1a1c0 2d 3e 62 75 66 2c 20 28 75 69 6e 74 33 32 20 2a  ->buf, (uint32 *
1a1d0 29 63 74 78 2d 3e 69 6e 29 3b 0a 20 20 20 20 20  )ctx->in);.     
1a1e0 20 20 20 62 79 74 65 52 65 76 65 72 73 65 28 28     byteReverse((
1a1f0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
1a200 63 74 78 2d 3e 62 75 66 2c 20 34 29 3b 0a 20 20  ctx->buf, 4);.  
1a210 20 20 20 20 20 20 6d 65 6d 63 70 79 28 64 69 67        memcpy(dig
1a220 65 73 74 2c 20 63 74 78 2d 3e 62 75 66 2c 20 31  est, ctx->buf, 1
1a230 36 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  6);.}../*.** Con
1a240 76 65 72 74 20 61 20 31 32 38 2d 62 69 74 20 4d  vert a 128-bit M
1a250 44 35 20 64 69 67 65 73 74 20 69 6e 74 6f 20 61  D5 digest into a
1a260 20 33 32 2d 64 69 67 69 74 20 62 61 73 65 2d 31   32-digit base-1
1a270 36 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61  6 number..*/.sta
1a280 74 69 63 20 76 6f 69 64 20 4d 44 35 44 69 67 65  tic void MD5Dige
1a290 73 74 54 6f 42 61 73 65 31 36 28 75 6e 73 69 67  stToBase16(unsig
1a2a0 6e 65 64 20 63 68 61 72 20 2a 64 69 67 65 73 74  ned char *digest
1a2b0 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20  , char *zBuf){. 
1a2c0 20 73 74 61 74 69 63 20 63 68 61 72 20 63 6f 6e   static char con
1a2d0 73 74 20 7a 45 6e 63 6f 64 65 5b 5d 20 3d 20 22  st zEncode[] = "
1a2e0 30 31 32 33 34 35 36 37 38 39 61 62 63 64 65 66  0123456789abcdef
1a2f0 22 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a  ";.  int i, j;..
1a300 20 20 66 6f 72 28 6a 3d 69 3d 30 3b 20 69 3c 31    for(j=i=0; i<1
1a310 36 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  6; i++){.    int
1a320 20 61 20 3d 20 64 69 67 65 73 74 5b 69 5d 3b 0a   a = digest[i];.
1a330 20 20 20 20 7a 42 75 66 5b 6a 2b 2b 5d 20 3d 20      zBuf[j++] = 
1a340 7a 45 6e 63 6f 64 65 5b 28 61 3e 3e 34 29 26 30  zEncode[(a>>4)&0
1a350 78 66 5d 3b 0a 20 20 20 20 7a 42 75 66 5b 6a 2b  xf];.    zBuf[j+
1a360 2b 5d 20 3d 20 7a 45 6e 63 6f 64 65 5b 61 20 26  +] = zEncode[a &
1a370 20 30 78 66 5d 3b 0a 20 20 7d 0a 20 20 7a 42 75   0xf];.  }.  zBu
1a380 66 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a  f[j] = 0;.}.../*
1a390 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 31 32  .** Convert a 12
1a3a0 38 2d 62 69 74 20 4d 44 35 20 64 69 67 65 73 74  8-bit MD5 digest
1a3b0 20 69 6e 74 6f 20 73 65 71 75 65 6e 63 79 20 6f   into sequency o
1a3c0 66 20 65 69 67 68 74 20 35 2d 64 69 67 69 74 20  f eight 5-digit 
1a3d0 69 6e 74 65 67 65 72 73 0a 2a 2a 20 65 61 63 68  integers.** each
1a3e0 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 31 36   representing 16
1a3f0 20 62 69 74 73 20 6f 66 20 74 68 65 20 64 69 67   bits of the dig
1a400 65 73 74 20 61 6e 64 20 73 65 70 61 72 61 74 65  est and separate
1a410 64 20 66 72 6f 6d 20 65 61 63 68 0a 2a 2a 20 6f  d from each.** o
1a420 74 68 65 72 20 62 79 20 61 20 22 2d 22 20 63 68  ther by a "-" ch
1a430 61 72 61 63 74 65 72 2e 0a 2a 2f 0a 73 74 61 74  aracter..*/.stat
1a440 69 63 20 76 6f 69 64 20 4d 44 35 44 69 67 65 73  ic void MD5Diges
1a450 74 54 6f 42 61 73 65 31 30 78 38 28 75 6e 73 69  tToBase10x8(unsi
1a460 67 6e 65 64 20 63 68 61 72 20 64 69 67 65 73 74  gned char digest
1a470 5b 31 36 5d 2c 20 63 68 61 72 20 7a 44 69 67 65  [16], char zDige
1a480 73 74 5b 35 30 5d 29 7b 0a 20 20 69 6e 74 20 69  st[50]){.  int i
1a490 2c 20 6a 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  , j;.  unsigned 
1a4a0 69 6e 74 20 78 3b 0a 20 20 66 6f 72 28 69 3d 6a  int x;.  for(i=j
1a4b0 3d 30 3b 20 69 3c 31 36 3b 20 69 2b 3d 32 29 7b  =0; i<16; i+=2){
1a4c0 0a 20 20 20 20 78 20 3d 20 64 69 67 65 73 74 5b  .    x = digest[
1a4d0 69 5d 2a 32 35 36 20 2b 20 64 69 67 65 73 74 5b  i]*256 + digest[
1a4e0 69 2b 31 5d 3b 0a 20 20 20 20 69 66 28 20 69 3e  i+1];.    if( i>
1a4f0 30 20 29 20 7a 44 69 67 65 73 74 5b 6a 2b 2b 5d  0 ) zDigest[j++]
1a500 20 3d 20 27 2d 27 3b 0a 20 20 20 20 73 70 72 69   = '-';.    spri
1a510 6e 74 66 28 26 7a 44 69 67 65 73 74 5b 6a 5d 2c  ntf(&zDigest[j],
1a520 20 22 25 30 35 75 22 2c 20 78 29 3b 0a 20 20 20   "%05u", x);.   
1a530 20 6a 20 2b 3d 20 35 3b 0a 20 20 7d 0a 20 20 7a   j += 5;.  }.  z
1a540 44 69 67 65 73 74 5b 6a 5d 20 3d 20 30 3b 0a 7d  Digest[j] = 0;.}
1a550 0a 0a 2f 2a 0a 2a 2a 20 41 20 54 43 4c 20 63 6f  ../*.** A TCL co
1a560 6d 6d 61 6e 64 20 66 6f 72 20 6d 64 35 2e 20 20  mmand for md5.  
1a570 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  The argument is 
1a580 74 68 65 20 74 65 78 74 20 74 6f 20 62 65 20 68  the text to be h
1a590 61 73 68 65 64 2e 20 20 54 68 65 0a 2a 2a 20 52  ashed.  The.** R
1a5a0 65 73 75 6c 74 20 69 73 20 74 68 65 20 68 61 73  esult is the has
1a5b0 68 20 69 6e 20 62 61 73 65 36 34 2e 20 20 0a 2a  h in base64.  .*
1a5c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 64 35  /.static int md5
1a5d0 5f 63 6d 64 28 76 6f 69 64 2a 63 64 2c 20 54 63  _cmd(void*cd, Tc
1a5e0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1a5f0 2c 20 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73  , int argc, cons
1a600 74 20 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a  t char **argv){.
1a610 20 20 4d 44 35 43 6f 6e 74 65 78 74 20 63 74 78    MD5Context ctx
1a620 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
1a630 72 20 64 69 67 65 73 74 5b 31 36 5d 3b 0a 20 20  r digest[16];.  
1a640 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20  char zBuf[50];. 
1a650 20 76 6f 69 64 20 28 2a 63 6f 6e 76 65 72 74 65   void (*converte
1a660 72 29 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  r)(unsigned char
1a670 2a 2c 20 63 68 61 72 2a 29 3b 0a 0a 20 20 69 66  *, char*);..  if
1a680 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20  ( argc!=2 ){.   
1a690 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1a6a0 74 28 69 6e 74 65 72 70 2c 22 77 72 6f 6e 67 20  t(interp,"wrong 
1a6b0 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1a6c0 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20  e \"", argv[0], 
1a6d0 0a 20 20 20 20 20 20 20 20 22 20 54 45 58 54 5c  .        " TEXT\
1a6e0 22 22 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  "", (char*)0);. 
1a6f0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1a700 52 4f 52 3b 0a 20 20 7d 0a 20 20 4d 44 35 49 6e  ROR;.  }.  MD5In
1a710 69 74 28 26 63 74 78 29 3b 0a 20 20 4d 44 35 55  it(&ctx);.  MD5U
1a720 70 64 61 74 65 28 26 63 74 78 2c 20 28 75 6e 73  pdate(&ctx, (uns
1a730 69 67 6e 65 64 20 63 68 61 72 2a 29 61 72 67 76  igned char*)argv
1a740 5b 31 5d 2c 20 28 75 6e 73 69 67 6e 65 64 29 73  [1], (unsigned)s
1a750 74 72 6c 65 6e 28 61 72 67 76 5b 31 5d 29 29 3b  trlen(argv[1]));
1a760 0a 20 20 4d 44 35 46 69 6e 61 6c 28 64 69 67 65  .  MD5Final(dige
1a770 73 74 2c 20 26 63 74 78 29 3b 0a 20 20 63 6f 6e  st, &ctx);.  con
1a780 76 65 72 74 65 72 20 3d 20 28 76 6f 69 64 28 2a  verter = (void(*
1a790 29 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a  )(unsigned char*
1a7a0 2c 63 68 61 72 2a 29 29 63 64 3b 0a 20 20 63 6f  ,char*))cd;.  co
1a7b0 6e 76 65 72 74 65 72 28 64 69 67 65 73 74 2c 20  nverter(digest, 
1a7c0 7a 42 75 66 29 3b 0a 20 20 54 63 6c 5f 41 70 70  zBuf);.  Tcl_App
1a7d0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1a7e0 2c 20 7a 42 75 66 2c 20 28 63 68 61 72 2a 29 30  , zBuf, (char*)0
1a7f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
1a800 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 54  OK;.}../*.** A T
1a810 43 4c 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 74 61  CL command to ta
1a820 6b 65 20 74 68 65 20 6d 64 35 20 68 61 73 68 20  ke the md5 hash 
1a830 6f 66 20 61 20 66 69 6c 65 2e 20 20 54 68 65 20  of a file.  The 
1a840 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0a  argument is the.
1a850 2a 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66  ** name of the f
1a860 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
1a870 6e 74 20 6d 64 35 66 69 6c 65 5f 63 6d 64 28 76  nt md5file_cmd(v
1a880 6f 69 64 2a 63 64 2c 20 54 63 6c 5f 49 6e 74 65  oid*cd, Tcl_Inte
1a890 72 70 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 61  rp*interp, int a
1a8a0 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rgc, const char 
1a8b0 2a 2a 61 72 67 76 29 7b 0a 20 20 46 49 4c 45 20  **argv){.  FILE 
1a8c0 2a 69 6e 3b 0a 20 20 4d 44 35 43 6f 6e 74 65 78  *in;.  MD5Contex
1a8d0 74 20 63 74 78 3b 0a 20 20 76 6f 69 64 20 28 2a  t ctx;.  void (*
1a8e0 63 6f 6e 76 65 72 74 65 72 29 28 75 6e 73 69 67  converter)(unsig
1a8f0 6e 65 64 20 63 68 61 72 2a 2c 20 63 68 61 72 2a  ned char*, char*
1a900 29 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  );.  unsigned ch
1a910 61 72 20 64 69 67 65 73 74 5b 31 36 5d 3b 0a 20  ar digest[16];. 
1a920 20 63 68 61 72 20 7a 42 75 66 5b 31 30 32 34 30   char zBuf[10240
1a930 5d 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 21 3d  ];..  if( argc!=
1a940 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
1a950 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1a960 2c 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20  ,"wrong # args: 
1a970 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
1a980 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20  rgv[0], .       
1a990 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20   " FILENAME\"", 
1a9a0 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72  (char*)0);.    r
1a9b0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1a9c0 0a 20 20 7d 0a 20 20 69 6e 20 3d 20 66 6f 70 65  .  }.  in = fope
1a9d0 6e 28 61 72 67 76 5b 31 5d 2c 22 72 62 22 29 3b  n(argv[1],"rb");
1a9e0 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a  .  if( in==0 ){.
1a9f0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1aa00 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 75 6e 61  sult(interp,"una
1aa10 62 6c 65 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65  ble to open file
1aa20 20 5c 22 22 2c 20 61 72 67 76 5b 31 5d 2c 20 0a   \"", argv[1], .
1aa30 20 20 20 20 20 20 20 20 20 22 5c 22 20 66 6f 72           "\" for
1aa40 20 72 65 61 64 69 6e 67 22 2c 20 28 63 68 61 72   reading", (char
1aa50 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  *)0);.    return
1aa60 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1aa70 20 20 4d 44 35 49 6e 69 74 28 26 63 74 78 29 3b    MD5Init(&ctx);
1aa80 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20  .  for(;;){.    
1aa90 69 6e 74 20 6e 3b 0a 20 20 20 20 6e 20 3d 20 28  int n;.    n = (
1aaa0 69 6e 74 29 66 72 65 61 64 28 7a 42 75 66 2c 20  int)fread(zBuf, 
1aab0 31 2c 20 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c  1, sizeof(zBuf),
1aac0 20 69 6e 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c   in);.    if( n<
1aad0 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
1aae0 4d 44 35 55 70 64 61 74 65 28 26 63 74 78 2c 20  MD5Update(&ctx, 
1aaf0 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
1ab00 7a 42 75 66 2c 20 28 75 6e 73 69 67 6e 65 64 29  zBuf, (unsigned)
1ab10 6e 29 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65  n);.  }.  fclose
1ab20 28 69 6e 29 3b 0a 20 20 4d 44 35 46 69 6e 61 6c  (in);.  MD5Final
1ab30 28 64 69 67 65 73 74 2c 20 26 63 74 78 29 3b 0a  (digest, &ctx);.
1ab40 20 20 63 6f 6e 76 65 72 74 65 72 20 3d 20 28 76    converter = (v
1ab50 6f 69 64 28 2a 29 28 75 6e 73 69 67 6e 65 64 20  oid(*)(unsigned 
1ab60 63 68 61 72 2a 2c 63 68 61 72 2a 29 29 63 64 3b  char*,char*))cd;
1ab70 0a 20 20 63 6f 6e 76 65 72 74 65 72 28 64 69 67  .  converter(dig
1ab80 65 73 74 2c 20 7a 42 75 66 29 3b 0a 20 20 54 63  est, zBuf);.  Tc
1ab90 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1aba0 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 28 63 68  nterp, zBuf, (ch
1abb0 61 72 2a 29 30 29 3b 0a 20 20 72 65 74 75 72 6e  ar*)0);.  return
1abc0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1abd0 2a 20 52 65 67 69 73 74 65 72 20 74 68 65 20 66  * Register the f
1abe0 6f 75 72 20 6e 65 77 20 54 43 4c 20 63 6f 6d 6d  our new TCL comm
1abf0 61 6e 64 73 20 66 6f 72 20 67 65 6e 65 72 61 74  ands for generat
1ac00 69 6e 67 20 4d 44 35 20 63 68 65 63 6b 73 75 6d  ing MD5 checksum
1ac10 73 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 54 43  s.** with the TC
1ac20 4c 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 2a  L interpreter..*
1ac30 2f 0a 69 6e 74 20 4d 64 35 5f 49 6e 69 74 28 54  /.int Md5_Init(T
1ac40 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1ac50 70 29 7b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65  p){.  Tcl_Create
1ac60 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
1ac70 22 6d 64 35 22 2c 20 28 54 63 6c 5f 43 6d 64 50  "md5", (Tcl_CmdP
1ac80 72 6f 63 2a 29 6d 64 35 5f 63 6d 64 2c 0a 20 20  roc*)md5_cmd,.  
1ac90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aca0 20 20 4d 44 35 44 69 67 65 73 74 54 6f 42 61 73    MD5DigestToBas
1acb0 65 31 36 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43  e16, 0);.  Tcl_C
1acc0 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74  reateCommand(int
1acd0 65 72 70 2c 20 22 6d 64 35 2d 31 30 78 38 22 2c  erp, "md5-10x8",
1ace0 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 6d   (Tcl_CmdProc*)m
1acf0 64 35 5f 63 6d 64 2c 0a 20 20 20 20 20 20 20 20  d5_cmd,.        
1ad00 20 20 20 20 20 20 20 20 20 20 20 20 4d 44 35 44              MD5D
1ad10 69 67 65 73 74 54 6f 42 61 73 65 31 30 78 38 2c  igestToBase10x8,
1ad20 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74   0);.  Tcl_Creat
1ad30 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  eCommand(interp,
1ad40 20 22 6d 64 35 66 69 6c 65 22 2c 20 28 54 63 6c   "md5file", (Tcl
1ad50 5f 43 6d 64 50 72 6f 63 2a 29 6d 64 35 66 69 6c  _CmdProc*)md5fil
1ad60 65 5f 63 6d 64 2c 0a 20 20 20 20 20 20 20 20 20  e_cmd,.         
1ad70 20 20 20 20 20 20 20 20 20 20 20 4d 44 35 44 69             MD5Di
1ad80 67 65 73 74 54 6f 42 61 73 65 31 36 2c 20 30 29  gestToBase16, 0)
1ad90 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 43 6f  ;.  Tcl_CreateCo
1ada0 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 6d  mmand(interp, "m
1adb0 64 35 66 69 6c 65 2d 31 30 78 38 22 2c 20 28 54  d5file-10x8", (T
1adc0 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 6d 64 35 66  cl_CmdProc*)md5f
1add0 69 6c 65 5f 63 6d 64 2c 0a 20 20 20 20 20 20 20  ile_cmd,.       
1ade0 20 20 20 20 20 20 20 20 20 20 20 20 20 4d 44 35               MD5
1adf0 44 69 67 65 73 74 54 6f 42 61 73 65 31 30 78 38  DigestToBase10x8
1ae00 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  , 0);.  return T
1ae10 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  CL_OK;.}.#endif 
1ae20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  /* defined(SQLIT
1ae30 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e  E_TEST) || defin
1ae40 65 64 28 53 51 4c 49 54 45 5f 54 43 4c 4d 44 35  ed(SQLITE_TCLMD5
1ae50 29 20 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65  ) */..#if define
1ae60 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f  d(SQLITE_TEST)./
1ae70 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 74 65 73 74  *.** During test
1ae80 69 6e 67 2c 20 74 68 65 20 73 70 65 63 69 61 6c  ing, the special
1ae90 20 6d 64 35 73 75 6d 28 29 20 61 67 67 72 65 67   md5sum() aggreg
1aea0 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  ate function is 
1aeb0 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 20 69 6e  available..** in
1aec0 73 69 64 65 20 53 51 4c 69 74 65 2e 20 20 54 68  side SQLite.  Th
1aed0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74  e following rout
1aee0 69 6e 65 73 20 69 6d 70 6c 65 6d 65 6e 74 20 74  ines implement t
1aef0 68 61 74 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  hat function..*/
1af00 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 64 35  .static void md5
1af10 73 74 65 70 28 73 71 6c 69 74 65 33 5f 63 6f 6e  step(sqlite3_con
1af20 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69  text *context, i
1af30 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
1af40 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a  _value **argv){.
1af50 20 20 4d 44 35 43 6f 6e 74 65 78 74 20 2a 70 3b    MD5Context *p;
1af60 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
1af70 61 72 67 63 3c 31 20 29 20 72 65 74 75 72 6e 3b  argc<1 ) return;
1af80 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61  .  p = sqlite3_a
1af90 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
1afa0 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66  (context, sizeof
1afb0 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 3d 3d  (*p));.  if( p==
1afc0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
1afd0 28 20 21 70 2d 3e 69 73 49 6e 69 74 20 29 7b 0a  ( !p->isInit ){.
1afe0 20 20 20 20 4d 44 35 49 6e 69 74 28 70 29 3b 0a      MD5Init(p);.
1aff0 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
1b000 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <argc; i++){.   
1b010 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61   const char *zDa
1b020 74 61 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69  ta = (char*)sqli
1b030 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
1b040 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28  rgv[i]);.    if(
1b050 20 7a 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20   zData ){.      
1b060 4d 44 35 55 70 64 61 74 65 28 70 2c 20 28 75 6e  MD5Update(p, (un
1b070 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 44 61  signed char*)zDa
1b080 74 61 2c 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  ta, (int)strlen(
1b090 7a 44 61 74 61 29 29 3b 0a 20 20 20 20 7d 0a 20  zData));.    }. 
1b0a0 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
1b0b0 20 6d 64 35 66 69 6e 61 6c 69 7a 65 28 73 71 6c   md5finalize(sql
1b0c0 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
1b0d0 6e 74 65 78 74 29 7b 0a 20 20 4d 44 35 43 6f 6e  ntext){.  MD5Con
1b0e0 74 65 78 74 20 2a 70 3b 0a 20 20 75 6e 73 69 67  text *p;.  unsig
1b0f0 6e 65 64 20 63 68 61 72 20 64 69 67 65 73 74 5b  ned char digest[
1b100 31 36 5d 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  16];.  char zBuf
1b110 5b 33 33 5d 3b 0a 20 20 70 20 3d 20 73 71 6c 69  [33];.  p = sqli
1b120 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
1b130 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73  ntext(context, s
1b140 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 4d 44  izeof(*p));.  MD
1b150 35 46 69 6e 61 6c 28 64 69 67 65 73 74 2c 70 29  5Final(digest,p)
1b160 3b 0a 20 20 4d 44 35 44 69 67 65 73 74 54 6f 42  ;.  MD5DigestToB
1b170 61 73 65 31 36 28 64 69 67 65 73 74 2c 20 7a 42  ase16(digest, zB
1b180 75 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72  uf);.  sqlite3_r
1b190 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
1b1a0 78 74 2c 20 7a 42 75 66 2c 20 2d 31 2c 20 53 51  xt, zBuf, -1, SQ
1b1b0 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
1b1c0 0a 7d 0a 69 6e 74 20 4d 64 35 5f 52 65 67 69 73  .}.int Md5_Regis
1b1d0 74 65 72 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ter(sqlite3 *db)
1b1e0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c  {.  int rc = sql
1b1f0 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
1b200 74 69 6f 6e 28 64 62 2c 20 22 6d 64 35 73 75 6d  tion(db, "md5sum
1b210 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  ", -1, SQLITE_UT
1b220 46 38 2c 20 30 2c 20 30 2c 20 0a 20 20 20 20 20  F8, 0, 0, .     
1b230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b240 20 20 20 20 20 20 20 20 20 20 20 20 6d 64 35 73              md5s
1b250 74 65 70 2c 20 6d 64 35 66 69 6e 61 6c 69 7a 65  tep, md5finalize
1b260 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6f 76 65  );.  sqlite3_ove
1b270 72 6c 6f 61 64 5f 66 75 6e 63 74 69 6f 6e 28 64  rload_function(d
1b280 62 2c 20 22 6d 64 35 73 75 6d 22 2c 20 2d 31 29  b, "md5sum", -1)
1b290 3b 20 20 2f 2a 20 54 6f 20 65 78 65 72 63 69 73  ;  /* To exercis
1b2a0 65 20 74 68 69 73 20 41 50 49 20 2a 2f 0a 20 20  e this API */.  
1b2b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
1b2c0 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53  dif /* defined(S
1b2d0 51 4c 49 54 45 5f 54 45 53 54 29 20 2a 2f 0a 0a  QLITE_TEST) */..
1b2e0 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61  ./*.** If the ma
1b2f0 63 72 6f 20 54 43 4c 53 48 20 69 73 20 6f 6e 65  cro TCLSH is one
1b300 2c 20 74 68 65 6e 20 70 75 74 20 69 6e 20 63 6f  , then put in co
1b310 64 65 20 74 68 69 73 20 66 6f 72 20 74 68 65 0a  de this for the.
1b320 2a 2a 20 22 6d 61 69 6e 22 20 72 6f 75 74 69 6e  ** "main" routin
1b330 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 69 74  e that will init
1b340 69 61 6c 69 7a 65 20 54 63 6c 20 61 6e 64 20 74  ialize Tcl and t
1b350 61 6b 65 20 69 6e 70 75 74 20 66 72 6f 6d 0a 2a  ake input from.*
1b360 2a 20 73 74 61 6e 64 61 72 64 20 69 6e 70 75 74  * standard input
1b370 2c 20 6f 72 20 69 66 20 61 20 66 69 6c 65 20 69  , or if a file i
1b380 73 20 6e 61 6d 65 64 20 6f 6e 20 74 68 65 20 63  s named on the c
1b390 6f 6d 6d 61 6e 64 20 6c 69 6e 65 0a 2a 2a 20 74  ommand line.** t
1b3a0 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
1b3b0 65 72 20 72 65 61 64 73 20 61 6e 64 20 65 76 61  er reads and eva
1b3c0 6c 75 61 74 65 73 20 74 68 61 74 20 66 69 6c 65  luates that file
1b3d0 2e 0a 2a 2f 0a 23 69 66 20 54 43 4c 53 48 3d 3d  ..*/.#if TCLSH==
1b3e0 31 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  1.static const c
1b3f0 68 61 72 20 2a 74 63 6c 73 68 5f 6d 61 69 6e 5f  har *tclsh_main_
1b400 6c 6f 6f 70 28 76 6f 69 64 29 7b 0a 20 20 73 74  loop(void){.  st
1b410 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
1b420 7a 4d 61 69 6e 6c 6f 6f 70 5b 5d 20 3d 0a 20 20  zMainloop[] =.  
1b430 20 20 22 73 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e    "set line {}\n
1b440 22 0a 20 20 20 20 22 77 68 69 6c 65 20 7b 21 5b  ".    "while {![
1b450 65 6f 66 20 73 74 64 69 6e 5d 7d 20 7b 5c 6e 22  eof stdin]} {\n"
1b460 0a 20 20 20 20 20 20 22 69 66 20 7b 24 6c 69 6e  .      "if {$lin
1b470 65 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20  e!=\"\"} {\n".  
1b480 20 20 20 20 20 20 22 70 75 74 73 20 2d 6e 6f 6e        "puts -non
1b490 65 77 6c 69 6e 65 20 5c 22 3e 20 5c 22 5c 6e 22  ewline \"> \"\n"
1b4a0 0a 20 20 20 20 20 20 22 7d 20 65 6c 73 65 20 7b  .      "} else {
1b4b0 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 70 75 74  \n".        "put
1b4c0 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 5c 22 25  s -nonewline \"%
1b4d0 20 5c 22 5c 6e 22 0a 20 20 20 20 20 20 22 7d 5c   \"\n".      "}\
1b4e0 6e 22 0a 20 20 20 20 20 20 22 66 6c 75 73 68 20  n".      "flush 
1b4f0 73 74 64 6f 75 74 5c 6e 22 0a 20 20 20 20 20 20  stdout\n".      
1b500 22 61 70 70 65 6e 64 20 6c 69 6e 65 20 5b 67 65  "append line [ge
1b510 74 73 20 73 74 64 69 6e 5d 5c 6e 22 0a 20 20 20  ts stdin]\n".   
1b520 20 20 20 22 69 66 20 7b 5b 69 6e 66 6f 20 63 6f     "if {[info co
1b530 6d 70 6c 65 74 65 20 24 6c 69 6e 65 5d 7d 20 7b  mplete $line]} {
1b540 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 69 66 20  \n".        "if 
1b550 7b 5b 63 61 74 63 68 20 7b 75 70 6c 65 76 65 6c  {[catch {uplevel
1b560 20 23 30 20 24 6c 69 6e 65 7d 20 72 65 73 75 6c   #0 $line} resul
1b570 74 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20  t]} {\n".       
1b580 20 20 20 22 70 75 74 73 20 73 74 64 65 72 72 20     "puts stderr 
1b590 5c 22 45 72 72 6f 72 3a 20 24 72 65 73 75 6c 74  \"Error: $result
1b5a0 5c 22 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 7d  \"\n".        "}
1b5b0 20 65 6c 73 65 69 66 20 7b 24 72 65 73 75 6c 74   elseif {$result
1b5c0 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20 20  !=\"\"} {\n".   
1b5d0 20 20 20 20 20 20 20 22 70 75 74 73 20 24 72 65         "puts $re
1b5e0 73 75 6c 74 5c 6e 22 0a 20 20 20 20 20 20 20 20  sult\n".        
1b5f0 22 7d 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 73  "}\n".        "s
1b600 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e 22 0a 20 20  et line {}\n".  
1b610 20 20 20 20 22 7d 20 65 6c 73 65 20 7b 5c 6e 22      "} else {\n"
1b620 0a 20 20 20 20 20 20 20 20 22 61 70 70 65 6e 64  .        "append
1b630 20 6c 69 6e 65 20 5c 5c 6e 5c 6e 22 0a 20 20 20   line \\n\n".   
1b640 20 20 20 22 7d 5c 6e 22 0a 20 20 20 20 22 7d 5c     "}\n".    "}\
1b650 6e 22 0a 20 20 3b 0a 20 20 72 65 74 75 72 6e 20  n".  ;.  return 
1b660 7a 4d 61 69 6e 6c 6f 6f 70 3b 0a 7d 0a 23 65 6e  zMainloop;.}.#en
1b670 64 69 66 0a 23 69 66 20 54 43 4c 53 48 3d 3d 32  dif.#if TCLSH==2
1b680 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
1b690 61 72 20 2a 74 63 6c 73 68 5f 6d 61 69 6e 5f 6c  ar *tclsh_main_l
1b6a0 6f 6f 70 28 76 6f 69 64 29 3b 0a 23 65 6e 64 69  oop(void);.#endi
1b6b0 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
1b6c0 5f 54 45 53 54 0a 73 74 61 74 69 63 20 76 6f 69  _TEST.static voi
1b6d0 64 20 69 6e 69 74 5f 61 6c 6c 28 54 63 6c 5f 49  d init_all(Tcl_I
1b6e0 6e 74 65 72 70 20 2a 29 3b 0a 73 74 61 74 69 63  nterp *);.static
1b6f0 20 69 6e 74 20 69 6e 69 74 5f 61 6c 6c 5f 63 6d   int init_all_cm
1b700 64 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  d(.  ClientData 
1b710 63 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  cd,.  Tcl_Interp
1b720 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1b730 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1b740 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1b750 0a 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ..  Tcl_Interp *
1b760 73 6c 61 76 65 3b 0a 20 20 69 66 28 20 6f 62 6a  slave;.  if( obj
1b770 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
1b780 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
1b790 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53  erp, 1, objv, "S
1b7a0 4c 41 56 45 22 29 3b 0a 20 20 20 20 72 65 74 75  LAVE");.    retu
1b7b0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1b7c0 7d 0a 0a 20 20 73 6c 61 76 65 20 3d 20 54 63 6c  }..  slave = Tcl
1b7d0 5f 47 65 74 53 6c 61 76 65 28 69 6e 74 65 72 70  _GetSlave(interp
1b7e0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
1b7f0 6f 62 6a 76 5b 31 5d 29 29 3b 0a 20 20 69 66 28  objv[1]));.  if(
1b800 20 21 73 6c 61 76 65 20 29 7b 0a 20 20 20 20 72   !slave ){.    r
1b810 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1b820 0a 20 20 7d 0a 0a 20 20 69 6e 69 74 5f 61 6c 6c  .  }..  init_all
1b830 28 73 6c 61 76 65 29 3b 0a 20 20 72 65 74 75 72  (slave);.  retur
1b840 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1b850 2a 2a 20 54 63 6c 63 6d 64 3a 20 64 62 5f 75 73  ** Tclcmd: db_us
1b860 65 5f 6c 65 67 61 63 79 5f 70 72 65 70 61 72 65  e_legacy_prepare
1b870 20 44 42 20 42 4f 4f 4c 45 41 4e 0a 2a 2a 0a 2a   DB BOOLEAN.**.*
1b880 2a 20 20 20 54 68 65 20 66 69 72 73 74 20 61 72  *   The first ar
1b890 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 63  gument to this c
1b8a0 6f 6d 6d 61 6e 64 20 6d 75 73 74 20 62 65 20 61  ommand must be a
1b8b0 20 64 61 74 61 62 61 73 65 20 63 6f 6d 6d 61 6e   database comman
1b8c0 64 20 63 72 65 61 74 65 64 20 62 79 0a 2a 2a 20  d created by.** 
1b8d0 20 20 5b 73 71 6c 69 74 65 33 5d 2e 20 49 66 20    [sqlite3]. If 
1b8e0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
1b8f0 65 6e 74 20 69 73 20 74 72 75 65 2c 20 74 68 65  ent is true, the
1b900 6e 20 74 68 65 20 68 61 6e 64 6c 65 20 69 73 20  n the handle is 
1b910 63 6f 6e 66 69 67 75 72 65 64 0a 2a 2a 20 20 20  configured.**   
1b920 74 6f 20 75 73 65 20 74 68 65 20 73 71 6c 69 74  to use the sqlit
1b930 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 29 20  e3_prepare_v2() 
1b940 66 75 6e 63 74 69 6f 6e 20 74 6f 20 70 72 65 70  function to prep
1b950 61 72 65 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  are statements. 
1b960 49 66 20 69 74 0a 2a 2a 20 20 20 69 73 20 66 61  If it.**   is fa
1b970 6c 73 65 2c 20 73 71 6c 69 74 65 33 5f 70 72 65  lse, sqlite3_pre
1b980 70 61 72 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  pare()..*/.stati
1b990 63 20 69 6e 74 20 64 62 5f 75 73 65 5f 6c 65 67  c int db_use_leg
1b9a0 61 63 79 5f 70 72 65 70 61 72 65 5f 63 6d 64 28  acy_prepare_cmd(
1b9b0 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 64  .  ClientData cd
1b9c0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1b9d0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
1b9e0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
1b9f0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
1ba00 20 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64   Tcl_CmdInfo cmd
1ba10 49 6e 66 6f 3b 0a 20 20 53 71 6c 69 74 65 44 62  Info;.  SqliteDb
1ba20 20 2a 70 44 62 3b 0a 20 20 69 6e 74 20 62 50 72   *pDb;.  int bPr
1ba30 65 70 61 72 65 3b 0a 0a 20 20 69 66 28 20 6f 62  epare;..  if( ob
1ba40 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
1ba50 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
1ba60 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
1ba70 44 42 20 42 4f 4f 4c 45 41 4e 22 29 3b 0a 20 20  DB BOOLEAN");.  
1ba80 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1ba90 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21  OR;.  }..  if( !
1baa0 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e  Tcl_GetCommandIn
1bab0 66 6f 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  fo(interp, Tcl_G
1bac0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
1bad0 29 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29 7b 0a  ), &cmdInfo) ){.
1bae0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1baf0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f  sult(interp, "no
1bb00 20 73 75 63 68 20 64 62 3a 20 22 2c 20 54 63 6c   such db: ", Tcl
1bb10 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1bb20 31 5d 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  1]), (char*)0);.
1bb30 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1bb40 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 44 62 20  RROR;.  }.  pDb 
1bb50 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 6d 64  = (SqliteDb*)cmd
1bb60 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44 61  Info.objClientDa
1bb70 74 61 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  ta;.  if( Tcl_Ge
1bb80 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
1bb90 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
1bba0 20 26 62 50 72 65 70 61 72 65 29 20 29 7b 0a 20   &bPrepare) ){. 
1bbb0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1bbc0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 70 44 62 2d  ROR;.  }..  pDb-
1bbd0 3e 62 4c 65 67 61 63 79 50 72 65 70 61 72 65 20  >bLegacyPrepare 
1bbe0 3d 20 62 50 72 65 70 61 72 65 3b 0a 0a 20 20 54  = bPrepare;..  T
1bbf0 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69  cl_ResetResult(i
1bc00 6e 74 65 72 70 29 3b 0a 20 20 72 65 74 75 72 6e  nterp);.  return
1bc10 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1bc20 2a 20 54 63 6c 63 6d 64 3a 20 64 62 5f 6c 61 73  * Tclcmd: db_las
1bc30 74 5f 73 74 6d 74 5f 70 74 72 20 44 42 0a 2a 2a  t_stmt_ptr DB.**
1bc40 0a 2a 2a 20 20 20 49 66 20 74 68 65 20 73 74 61  .**   If the sta
1bc50 74 65 6d 65 6e 74 20 63 61 63 68 65 20 61 73 73  tement cache ass
1bc60 6f 63 69 61 74 65 64 20 77 69 74 68 20 64 61 74  ociated with dat
1bc70 61 62 61 73 65 20 44 42 20 69 73 20 6e 6f 74 20  abase DB is not 
1bc80 65 6d 70 74 79 2c 0a 2a 2a 20 20 20 72 65 74 75  empty,.**   retu
1bc90 72 6e 20 74 68 65 20 74 65 78 74 20 72 65 70 72  rn the text repr
1bca0 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
1bcb0 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
1bcc0 75 73 65 64 20 73 74 61 74 65 6d 65 6e 74 0a 2a  used statement.*
1bcd0 2a 20 20 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73  *   handle..*/.s
1bce0 74 61 74 69 63 20 69 6e 74 20 64 62 5f 6c 61 73  tatic int db_las
1bcf0 74 5f 73 74 6d 74 5f 70 74 72 28 0a 20 20 43 6c  t_stmt_ptr(.  Cl
1bd00 69 65 6e 74 44 61 74 61 20 63 64 2c 0a 20 20 54  ientData cd,.  T
1bd10 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1bd20 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1bd30 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1bd40 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 65 78 74 65  objv[].){.  exte
1bd50 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 54 65  rn int sqlite3Te
1bd60 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72  stMakePointerStr
1bd70 28 54 63 6c 5f 49 6e 74 65 72 70 2a 2c 20 63 68  (Tcl_Interp*, ch
1bd80 61 72 2a 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 54  ar*, void*);.  T
1bd90 63 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49 6e  cl_CmdInfo cmdIn
1bda0 66 6f 3b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  fo;.  SqliteDb *
1bdb0 70 44 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  pDb;.  sqlite3_s
1bdc0 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
1bdd0 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d    char zBuf[100]
1bde0 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
1bdf0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
1be00 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
1be10 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 22 29 3b   1, objv, "DB");
1be20 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1be30 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
1be40 28 20 21 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e  ( !Tcl_GetComman
1be50 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 54 63  dInfo(interp, Tc
1be60 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1be70 5b 31 5d 29 2c 20 26 63 6d 64 49 6e 66 6f 29 20  [1]), &cmdInfo) 
1be80 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1be90 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1bea0 22 6e 6f 20 73 75 63 68 20 64 62 3a 20 22 2c 20  "no such db: ", 
1beb0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1bec0 6a 76 5b 31 5d 29 2c 20 28 63 68 61 72 2a 29 30  jv[1]), (char*)0
1bed0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1bee0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70  L_ERROR;.  }.  p
1bef0 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29  Db = (SqliteDb*)
1bf00 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e  cmdInfo.objClien
1bf10 74 44 61 74 61 3b 0a 0a 20 20 69 66 28 20 70 44  tData;..  if( pD
1bf20 62 2d 3e 73 74 6d 74 4c 69 73 74 20 29 20 70 53  b->stmtList ) pS
1bf30 74 6d 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c  tmt = pDb->stmtL
1bf40 69 73 74 2d 3e 70 53 74 6d 74 3b 0a 20 20 69 66  ist->pStmt;.  if
1bf50 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b  ( sqlite3TestMak
1bf60 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65  ePointerStr(inte
1bf70 72 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74 29  rp, zBuf, pStmt)
1bf80 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
1bf90 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1bfa0 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
1bfb0 74 65 72 70 2c 20 7a 42 75 66 2c 20 54 43 4c 5f  terp, zBuf, TCL_
1bfc0 56 4f 4c 41 54 49 4c 45 29 3b 0a 0a 20 20 72 65  VOLATILE);..  re
1bfd0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23  turn TCL_OK;.}.#
1bfe0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  endif../*.** Con
1bff0 66 69 67 75 72 65 20 74 68 65 20 69 6e 74 65 72  figure the inter
1c000 70 72 65 74 65 72 20 70 61 73 73 65 64 20 61 73  preter passed as
1c010 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
1c020 65 6e 74 20 74 6f 20 68 61 76 65 20 61 63 63 65  ent to have acce
1c030 73 73 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f 6d  ss.** to the com
1c040 6d 61 6e 64 73 20 61 6e 64 20 6c 69 6e 6b 65 64  mands and linked
1c050 20 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 20   variables that 
1c060 6d 61 6b 65 20 75 70 3a 0a 2a 2a 0a 2a 2a 20 20  make up:.**.**  
1c070 20 2a 20 74 68 65 20 5b 73 71 6c 69 74 65 33 5d   * the [sqlite3]
1c080 20 65 78 74 65 6e 73 69 6f 6e 20 69 74 73 65 6c   extension itsel
1c090 66 2c 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66  f, .**.**   * If
1c0a0 20 53 51 4c 49 54 45 5f 54 43 4c 4d 44 35 20 6f   SQLITE_TCLMD5 o
1c0b0 72 20 53 51 4c 49 54 45 5f 54 45 53 54 20 69 73  r SQLITE_TEST is
1c0c0 20 64 65 66 69 6e 65 64 2c 20 74 68 65 20 4d 64   defined, the Md
1c0d0 35 20 63 6f 6d 6d 61 6e 64 73 2c 20 61 6e 64 0a  5 commands, and.
1c0e0 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 53 51 4c  **.**   * If SQL
1c0f0 49 54 45 5f 54 45 53 54 20 69 73 20 73 65 74 2c  ITE_TEST is set,
1c100 20 74 68 65 20 76 61 72 69 6f 75 73 20 74 65 73   the various tes
1c110 74 20 69 6e 74 65 72 66 61 63 65 73 20 75 73 65  t interfaces use
1c120 64 20 62 79 20 74 68 65 20 54 63 6c 0a 2a 2a 20  d by the Tcl.** 
1c130 20 20 20 20 74 65 73 74 20 73 75 69 74 65 2e 0a      test suite..
1c140 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
1c150 6e 69 74 5f 61 6c 6c 28 54 63 6c 5f 49 6e 74 65  nit_all(Tcl_Inte
1c160 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 53  rp *interp){.  S
1c170 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74 65  qlite3_Init(inte
1c180 72 70 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65  rp);..#if define
1c190 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 7c  d(SQLITE_TEST) |
1c1a0 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
1c1b0 5f 54 43 4c 4d 44 35 29 0a 20 20 4d 64 35 5f 49  _TCLMD5).  Md5_I
1c1c0 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 23 65 6e  nit(interp);.#en
1c1d0 64 69 66 0a 0a 20 20 2f 2a 20 49 6e 73 74 61 6c  dif..  /* Instal
1c1e0 6c 20 74 68 65 20 5b 72 65 67 69 73 74 65 72 5f  l the [register_
1c1f0 64 62 73 74 61 74 5f 76 74 61 62 5d 20 63 6f 6d  dbstat_vtab] com
1c200 6d 61 6e 64 20 74 6f 20 61 63 63 65 73 73 20 74  mand to access t
1c210 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
1c220 6e 0a 20 20 2a 2a 20 6f 66 20 76 69 72 74 75 61  n.  ** of virtua
1c230 6c 20 74 61 62 6c 65 20 64 62 73 74 61 74 20 28  l table dbstat (
1c240 73 6f 75 72 63 65 20 66 69 6c 65 20 74 65 73 74  source file test
1c250 5f 73 74 61 74 2e 63 29 2e 20 54 68 69 73 20 63  _stat.c). This c
1c260 6f 6d 6d 61 6e 64 20 69 73 0a 20 20 2a 2a 20 72  ommand is.  ** r
1c270 65 71 75 69 72 65 64 20 66 6f 72 20 74 65 73 74  equired for test
1c280 66 69 78 74 75 72 65 20 61 6e 64 20 73 71 6c 69  fixture and sqli
1c290 74 65 33 5f 61 6e 61 6c 79 7a 65 72 2c 20 62 75  te3_analyzer, bu
1c2a0 74 20 6e 6f 74 20 62 79 20 74 68 65 20 70 72 6f  t not by the pro
1c2b0 64 75 63 74 69 6f 6e 0a 20 20 2a 2a 20 54 63 6c  duction.  ** Tcl
1c2c0 20 65 78 74 65 6e 73 69 6f 6e 2e 20 20 2a 2f 0a   extension.  */.
1c2d0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
1c2e0 54 45 5f 54 45 53 54 29 20 7c 7c 20 54 43 4c 53  TE_TEST) || TCLS
1c2f0 48 3d 3d 32 0a 20 20 7b 0a 20 20 20 20 65 78 74  H==2.  {.    ext
1c300 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1c310 73 74 53 74 61 74 5f 49 6e 69 74 28 54 63 6c 5f  stStat_Init(Tcl_
1c320 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 53 71  Interp*);.    Sq
1c330 6c 69 74 65 74 65 73 74 53 74 61 74 5f 49 6e 69  litetestStat_Ini
1c340 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 23  t(interp);.  }.#
1c350 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
1c360 4c 49 54 45 5f 54 45 53 54 0a 20 20 7b 0a 20 20  LITE_TEST.  {.  
1c370 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1c380 69 74 65 63 6f 6e 66 69 67 5f 49 6e 69 74 28 54  iteconfig_Init(T
1c390 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1c3a0 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1c3b0 74 65 74 65 73 74 31 5f 49 6e 69 74 28 54 63 6c  tetest1_Init(Tcl
1c3c0 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1c3d0 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1c3e0 74 65 73 74 32 5f 49 6e 69 74 28 54 63 6c 5f 49  test2_Init(Tcl_I
1c3f0 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1c400 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1c410 73 74 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  st3_Init(Tcl_Int
1c420 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1c430 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1c440 34 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  4_Init(Tcl_Inter
1c450 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1c460 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 35 5f  int Sqlitetest5_
1c470 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1c480 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
1c490 74 20 53 71 6c 69 74 65 74 65 73 74 36 5f 49 6e  t Sqlitetest6_In
1c4a0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1c4b0 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1c4c0 53 71 6c 69 74 65 74 65 73 74 37 5f 49 6e 69 74  Sqlitetest7_Init
1c4d0 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1c4e0 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1c4f0 6c 69 74 65 74 65 73 74 38 5f 49 6e 69 74 28 54  litetest8_Init(T
1c500 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1c510 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1c520 74 65 74 65 73 74 39 5f 49 6e 69 74 28 54 63 6c  tetest9_Init(Tcl
1c530 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1c540 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1c550 74 65 73 74 61 73 79 6e 63 5f 49 6e 69 74 28 54  testasync_Init(T
1c560 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1c570 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1c580 74 65 74 65 73 74 5f 61 75 74 6f 65 78 74 5f 49  tetest_autoext_I
1c590 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
1c5a0 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
1c5b0 20 53 71 6c 69 74 65 74 65 73 74 5f 62 6c 6f 62   Sqlitetest_blob
1c5c0 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1c5d0 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1c5e0 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f 64 65  nt Sqlitetest_de
1c5f0 6d 6f 76 66 73 5f 49 6e 69 74 28 54 63 6c 5f 49  movfs_Init(Tcl_I
1c600 6e 74 65 72 70 20 2a 29 3b 0a 20 20 20 20 65 78  nterp *);.    ex
1c610 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1c620 65 73 74 5f 66 75 6e 63 5f 49 6e 69 74 28 54 63  est_func_Init(Tc
1c630 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1c640 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1c650 65 74 65 73 74 5f 68 65 78 69 6f 5f 49 6e 69 74  etest_hexio_Init
1c660 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1c670 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1c680 6c 69 74 65 74 65 73 74 5f 69 6e 69 74 5f 49 6e  litetest_init_In
1c690 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1c6a0 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1c6b0 53 71 6c 69 74 65 74 65 73 74 5f 6d 61 6c 6c 6f  Sqlitetest_mallo
1c6c0 63 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  c_Init(Tcl_Inter
1c6d0 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1c6e0 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f 6d  int Sqlitetest_m
1c6f0 75 74 65 78 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  utex_Init(Tcl_In
1c700 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
1c710 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1c720 74 73 63 68 65 6d 61 5f 49 6e 69 74 28 54 63 6c  tschema_Init(Tcl
1c730 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1c740 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1c750 74 65 73 74 73 73 65 5f 49 6e 69 74 28 54 63 6c  testsse_Init(Tcl
1c760 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1c770 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1c780 74 65 73 74 74 63 6c 76 61 72 5f 49 6e 69 74 28  testtclvar_Init(
1c790 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1c7a0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1c7b0 69 74 65 74 65 73 74 66 73 5f 49 6e 69 74 28 54  itetestfs_Init(T
1c7c0 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1c7d0 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1c7e0 74 65 74 65 73 74 54 68 72 65 61 64 5f 49 6e 69  tetestThread_Ini
1c7f0 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
1c800 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1c810 71 6c 69 74 65 74 65 73 74 4f 6e 65 66 69 6c 65  qlitetestOnefile
1c820 5f 49 6e 69 74 28 29 3b 0a 20 20 20 20 65 78 74  _Init();.    ext
1c830 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1c840 73 74 4f 73 69 6e 73 74 5f 49 6e 69 74 28 54 63  stOsinst_Init(Tc
1c850 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1c860 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1c870 65 74 65 73 74 62 61 63 6b 75 70 5f 49 6e 69 74  etestbackup_Init
1c880 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1c890 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1c8a0 6c 69 74 65 74 65 73 74 69 6e 74 61 72 72 61 79  litetestintarray
1c8b0 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1c8c0 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1c8d0 6e 74 20 53 71 6c 69 74 65 74 65 73 74 76 66 73  nt Sqlitetestvfs
1c8e0 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1c8f0 20 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20   *);.    extern 
1c900 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 72 74  int Sqlitetestrt
1c910 72 65 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  ree_Init(Tcl_Int
1c920 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1c930 6e 20 69 6e 74 20 53 71 6c 69 74 65 71 75 6f 74  n int Sqlitequot
1c940 61 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  a_Init(Tcl_Inter
1c950 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1c960 69 6e 74 20 53 71 6c 69 74 65 6d 75 6c 74 69 70  int Sqlitemultip
1c970 6c 65 78 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  lex_Init(Tcl_Int
1c980 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1c990 6e 20 69 6e 74 20 53 71 6c 69 74 65 53 75 70 65  n int SqliteSupe
1c9a0 72 6c 6f 63 6b 5f 49 6e 69 74 28 54 63 6c 5f 49  rlock_Init(Tcl_I
1c9b0 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1c9c0 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1c9d0 73 74 53 79 73 63 61 6c 6c 5f 49 6e 69 74 28 54  stSyscall_Init(T
1c9e0 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 0a 23 69  cl_Interp*);..#i
1c9f0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1ca00 5f 45 4e 41 42 4c 45 5f 46 54 53 33 29 20 7c 7c  _ENABLE_FTS3) ||
1ca10 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1ca20 45 4e 41 42 4c 45 5f 46 54 53 34 29 0a 20 20 20  ENABLE_FTS4).   
1ca30 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1ca40 74 65 74 65 73 74 66 74 73 33 5f 49 6e 69 74 28  tetestfts3_Init(
1ca50 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1ca60 72 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  rp);.#endif..#if
1ca70 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1ca80 45 5f 5a 49 50 56 46 53 0a 20 20 20 20 65 78 74  E_ZIPVFS.    ext
1ca90 65 72 6e 20 69 6e 74 20 5a 69 70 76 66 73 5f 49  ern int Zipvfs_I
1caa0 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
1cab0 3b 0a 20 20 20 20 5a 69 70 76 66 73 5f 49 6e 69  ;.    Zipvfs_Ini
1cac0 74 28 69 6e 74 65 72 70 29 3b 0a 23 65 6e 64 69  t(interp);.#endi
1cad0 66 0a 0a 20 20 20 20 53 71 6c 69 74 65 63 6f 6e  f..    Sqlitecon
1cae0 66 69 67 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  fig_Init(interp)
1caf0 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
1cb00 31 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  1_Init(interp);.
1cb10 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 32 5f      Sqlitetest2_
1cb20 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
1cb30 20 20 53 71 6c 69 74 65 74 65 73 74 33 5f 49 6e    Sqlitetest3_In
1cb40 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1cb50 53 71 6c 69 74 65 74 65 73 74 34 5f 49 6e 69 74  Sqlitetest4_Init
1cb60 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1cb70 6c 69 74 65 74 65 73 74 35 5f 49 6e 69 74 28 69  litetest5_Init(i
1cb80 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1cb90 74 65 74 65 73 74 36 5f 49 6e 69 74 28 69 6e 74  tetest6_Init(int
1cba0 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1cbb0 74 65 73 74 37 5f 49 6e 69 74 28 69 6e 74 65 72  test7_Init(inter
1cbc0 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
1cbd0 73 74 38 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  st8_Init(interp)
1cbe0 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
1cbf0 39 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  9_Init(interp);.
1cc00 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 61 73      Sqlitetestas
1cc10 79 6e 63 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  ync_Init(interp)
1cc20 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
1cc30 5f 61 75 74 6f 65 78 74 5f 49 6e 69 74 28 69 6e  _autoext_Init(in
1cc40 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
1cc50 65 74 65 73 74 5f 62 6c 6f 62 5f 49 6e 69 74 28  etest_blob_Init(
1cc60 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
1cc70 69 74 65 74 65 73 74 5f 64 65 6d 6f 76 66 73 5f  itetest_demovfs_
1cc80 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
1cc90 20 20 53 71 6c 69 74 65 74 65 73 74 5f 66 75 6e    Sqlitetest_fun
1cca0 63 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  c_Init(interp);.
1ccb0 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 5f 68      Sqlitetest_h
1ccc0 65 78 69 6f 5f 49 6e 69 74 28 69 6e 74 65 72 70  exio_Init(interp
1ccd0 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
1cce0 74 5f 69 6e 69 74 5f 49 6e 69 74 28 69 6e 74 65  t_init_Init(inte
1ccf0 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
1cd00 65 73 74 5f 6d 61 6c 6c 6f 63 5f 49 6e 69 74 28  est_malloc_Init(
1cd10 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
1cd20 69 74 65 74 65 73 74 5f 6d 75 74 65 78 5f 49 6e  itetest_mutex_In
1cd30 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1cd40 53 71 6c 69 74 65 74 65 73 74 73 63 68 65 6d 61  Sqlitetestschema
1cd50 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
1cd60 20 20 20 53 71 6c 69 74 65 74 65 73 74 74 63 6c     Sqlitetesttcl
1cd70 76 61 72 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  var_Init(interp)
1cd80 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
1cd90 66 73 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  fs_Init(interp);
1cda0 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 54  .    SqlitetestT
1cdb0 68 72 65 61 64 5f 49 6e 69 74 28 69 6e 74 65 72  hread_Init(inter
1cdc0 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
1cdd0 73 74 4f 6e 65 66 69 6c 65 5f 49 6e 69 74 28 69  stOnefile_Init(i
1cde0 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1cdf0 74 65 74 65 73 74 4f 73 69 6e 73 74 5f 49 6e 69  tetestOsinst_Ini
1ce00 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
1ce10 71 6c 69 74 65 74 65 73 74 62 61 63 6b 75 70 5f  qlitetestbackup_
1ce20 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
1ce30 20 20 53 71 6c 69 74 65 74 65 73 74 69 6e 74 61    Sqlitetestinta
1ce40 72 72 61 79 5f 49 6e 69 74 28 69 6e 74 65 72 70  rray_Init(interp
1ce50 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
1ce60 74 76 66 73 5f 49 6e 69 74 28 69 6e 74 65 72 70  tvfs_Init(interp
1ce70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
1ce80 74 72 74 72 65 65 5f 49 6e 69 74 28 69 6e 74 65  trtree_Init(inte
1ce90 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 71  rp);.    Sqliteq
1cea0 75 6f 74 61 5f 49 6e 69 74 28 69 6e 74 65 72 70  uota_Init(interp
1ceb0 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 6d 75 6c  );.    Sqlitemul
1cec0 74 69 70 6c 65 78 5f 49 6e 69 74 28 69 6e 74 65  tiplex_Init(inte
1ced0 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 53  rp);.    SqliteS
1cee0 75 70 65 72 6c 6f 63 6b 5f 49 6e 69 74 28 69 6e  uperlock_Init(in
1cef0 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
1cf00 65 74 65 73 74 53 79 73 63 61 6c 6c 5f 49 6e 69  etestSyscall_Ini
1cf10 74 28 69 6e 74 65 72 70 29 3b 0a 0a 23 69 66 20  t(interp);..#if 
1cf20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
1cf30 4e 41 42 4c 45 5f 46 54 53 33 29 20 7c 7c 20 64  NABLE_FTS3) || d
1cf40 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
1cf50 41 42 4c 45 5f 46 54 53 34 29 0a 20 20 20 20 53  ABLE_FTS4).    S
1cf60 71 6c 69 74 65 74 65 73 74 66 74 73 33 5f 49 6e  qlitetestfts3_In
1cf70 69 74 28 69 6e 74 65 72 70 29 3b 0a 23 65 6e 64  it(interp);.#end
1cf80 69 66 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  if..    Tcl_Crea
1cf90 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 0a 20 20  teObjCommand(.  
1cfa0 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20 22 6c        interp, "l
1cfb0 6f 61 64 5f 74 65 73 74 66 69 78 74 75 72 65 5f  oad_testfixture_
1cfc0 65 78 74 65 6e 73 69 6f 6e 73 22 2c 20 69 6e 69  extensions", ini
1cfd0 74 5f 61 6c 6c 5f 63 6d 64 2c 20 30 2c 20 30 0a  t_all_cmd, 0, 0.
1cfe0 20 20 20 20 29 3b 0a 20 20 20 20 54 63 6c 5f 43      );.    Tcl_C
1cff0 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
1d000 0a 20 20 20 20 20 20 20 20 69 6e 74 65 72 70 2c  .        interp,
1d010 20 22 64 62 5f 75 73 65 5f 6c 65 67 61 63 79 5f   "db_use_legacy_
1d020 70 72 65 70 61 72 65 22 2c 20 64 62 5f 75 73 65  prepare", db_use
1d030 5f 6c 65 67 61 63 79 5f 70 72 65 70 61 72 65 5f  _legacy_prepare_
1d040 63 6d 64 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b  cmd, 0, 0.    );
1d050 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
1d060 62 6a 43 6f 6d 6d 61 6e 64 28 0a 20 20 20 20 20  bjCommand(.     
1d070 20 20 20 69 6e 74 65 72 70 2c 20 22 64 62 5f 6c     interp, "db_l
1d080 61 73 74 5f 73 74 6d 74 5f 70 74 72 22 2c 20 64  ast_stmt_ptr", d
1d090 62 5f 6c 61 73 74 5f 73 74 6d 74 5f 70 74 72 2c  b_last_stmt_ptr,
1d0a0 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 0a 23 69   0, 0.    );..#i
1d0b0 66 64 65 66 20 53 51 4c 49 54 45 5f 53 53 45 0a  fdef SQLITE_SSE.
1d0c0 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 73 73      Sqlitetestss
1d0d0 65 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  e_Init(interp);.
1d0e0 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69  #endif.  }.#endi
1d0f0 66 0a 7d 0a 0a 2f 2a 20 4e 65 65 64 65 64 20 66  f.}../* Needed f
1d100 6f 72 20 74 68 65 20 73 65 74 72 6c 69 6d 69 74  or the setrlimit
1d110 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6f  () system call o
1d120 6e 20 75 6e 69 78 20 2a 2f 0a 23 69 66 20 64 65  n unix */.#if de
1d130 66 69 6e 65 64 28 75 6e 69 78 29 0a 23 69 6e 63  fined(unix).#inc
1d140 6c 75 64 65 20 3c 73 79 73 2f 72 65 73 6f 75 72  lude <sys/resour
1d150 63 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 64  ce.h>.#endif..#d
1d160 65 66 69 6e 65 20 54 43 4c 53 48 5f 4d 41 49 4e  efine TCLSH_MAIN
1d170 20 6d 61 69 6e 20 20 20 2f 2a 20 4e 65 65 64 65   main   /* Neede
1d180 64 20 74 6f 20 66 61 6b 65 20 6f 75 74 20 6d 6b  d to fake out mk
1d190 74 63 6c 61 70 70 20 2a 2f 0a 69 6e 74 20 54 43  tclapp */.int TC
1d1a0 4c 53 48 5f 4d 41 49 4e 28 69 6e 74 20 61 72 67  LSH_MAIN(int arg
1d1b0 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29 7b  c, char **argv){
1d1c0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1d1d0 6e 74 65 72 70 3b 0a 0a 23 69 66 20 21 64 65 66  nterp;..#if !def
1d1e0 69 6e 65 64 28 5f 57 49 4e 33 32 5f 57 43 45 29  ined(_WIN32_WCE)
1d1f0 0a 20 20 69 66 28 20 67 65 74 65 6e 76 28 22 42  .  if( getenv("B
1d200 52 45 41 4b 22 29 20 29 7b 0a 20 20 20 20 66 70  REAK") ){.    fp
1d210 72 69 6e 74 66 28 73 74 64 65 72 72 2c 0a 20 20  rintf(stderr,.  
1d220 20 20 20 20 20 20 22 61 74 74 61 63 68 20 64 65        "attach de
1d230 62 75 67 67 65 72 20 74 6f 20 70 72 6f 63 65 73  bugger to proces
1d240 73 20 25 64 20 61 6e 64 20 70 72 65 73 73 20 61  s %d and press a
1d250 6e 79 20 6b 65 79 20 74 6f 20 63 6f 6e 74 69 6e  ny key to contin
1d260 75 65 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  ue.\n",.        
1d270 47 45 54 50 49 44 28 29 29 3b 0a 20 20 20 20 66  GETPID());.    f
1d280 67 65 74 63 28 73 74 64 69 6e 29 3b 0a 20 20 7d  getc(stdin);.  }
1d290 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 69  .#endif..  /* Si
1d2a0 6e 63 65 20 74 68 65 20 70 72 69 6d 61 72 79 20  nce the primary 
1d2b0 75 73 65 20 63 61 73 65 20 66 6f 72 20 74 68 69  use case for thi
1d2c0 73 20 62 69 6e 61 72 79 20 69 73 20 74 65 73 74  s binary is test
1d2d0 69 6e 67 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20  ing of SQLite,. 
1d2e0 20 2a 2a 20 62 65 20 73 75 72 65 20 74 6f 20 67   ** be sure to g
1d2f0 65 6e 65 72 61 74 65 20 63 6f 72 65 20 66 69 6c  enerate core fil
1d300 65 73 20 69 66 20 77 65 20 63 72 61 73 68 20 2a  es if we crash *
1d310 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
1d320 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20 64 65  LITE_TEST) && de
1d330 66 69 6e 65 64 28 75 6e 69 78 29 0a 20 20 7b 20  fined(unix).  { 
1d340 73 74 72 75 63 74 20 72 6c 69 6d 69 74 20 78 3b  struct rlimit x;
1d350 0a 20 20 20 20 67 65 74 72 6c 69 6d 69 74 28 52  .    getrlimit(R
1d360 4c 49 4d 49 54 5f 43 4f 52 45 2c 20 26 78 29 3b  LIMIT_CORE, &x);
1d370 0a 20 20 20 20 78 2e 72 6c 69 6d 5f 63 75 72 20  .    x.rlim_cur 
1d380 3d 20 78 2e 72 6c 69 6d 5f 6d 61 78 3b 0a 20 20  = x.rlim_max;.  
1d390 20 20 73 65 74 72 6c 69 6d 69 74 28 52 4c 49 4d    setrlimit(RLIM
1d3a0 49 54 5f 43 4f 52 45 2c 20 26 78 29 3b 0a 20 20  IT_CORE, &x);.  
1d3b0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
1d3c0 54 45 5f 54 45 53 54 20 26 26 20 75 6e 69 78 20  TE_TEST && unix 
1d3d0 2a 2f 0a 0a 0a 20 20 2f 2a 20 43 61 6c 6c 20 73  */...  /* Call s
1d3e0 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28  qlite3_shutdown(
1d3f0 29 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 64 6f  ) once before do
1d400 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73  ing anything els
1d410 65 2e 20 54 68 69 73 20 69 73 20 74 6f 0a 20 20  e. This is to.  
1d420 2a 2a 20 74 65 73 74 20 74 68 61 74 20 73 71 6c  ** test that sql
1d430 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 29 20  ite3_shutdown() 
1d440 63 61 6e 20 62 65 20 73 61 66 65 6c 79 20 63 61  can be safely ca
1d450 6c 6c 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  lled by a proces
1d460 73 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 73 71  s before.  ** sq
1d470 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
1d480 28 29 20 69 73 2e 20 2a 2f 0a 20 20 73 71 6c 69  () is. */.  sqli
1d490 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 29 3b 0a  te3_shutdown();.
1d4a0 0a 20 20 54 63 6c 5f 46 69 6e 64 45 78 65 63 75  .  Tcl_FindExecu
1d4b0 74 61 62 6c 65 28 61 72 67 76 5b 30 5d 29 3b 0a  table(argv[0]);.
1d4c0 20 20 54 63 6c 5f 53 65 74 53 79 73 74 65 6d 45    Tcl_SetSystemE
1d4d0 6e 63 6f 64 69 6e 67 28 4e 55 4c 4c 2c 20 22 75  ncoding(NULL, "u
1d4e0 74 66 2d 38 22 29 3b 0a 20 20 69 6e 74 65 72 70  tf-8");.  interp
1d4f0 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 49 6e 74   = Tcl_CreateInt
1d500 65 72 70 28 29 3b 0a 0a 23 69 66 20 54 43 4c 53  erp();..#if TCLS
1d510 48 3d 3d 32 0a 20 20 73 71 6c 69 74 65 33 5f 63  H==2.  sqlite3_c
1d520 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e  onfig(SQLITE_CON
1d530 46 49 47 5f 53 49 4e 47 4c 45 54 48 52 45 41 44  FIG_SINGLETHREAD
1d540 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 6e 69  );.#endif..  ini
1d550 74 5f 61 6c 6c 28 69 6e 74 65 72 70 29 3b 0a 20  t_all(interp);. 
1d560 20 69 66 28 20 61 72 67 63 3e 3d 32 20 29 7b 0a   if( argc>=2 ){.
1d570 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 63      int i;.    c
1d580 68 61 72 20 7a 41 72 67 63 5b 33 32 5d 3b 0a 20  har zArgc[32];. 
1d590 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
1d5a0 6e 74 66 28 73 69 7a 65 6f 66 28 7a 41 72 67 63  ntf(sizeof(zArgc
1d5b0 29 2c 20 7a 41 72 67 63 2c 20 22 25 64 22 2c 20  ), zArgc, "%d", 
1d5c0 61 72 67 63 2d 28 33 2d 54 43 4c 53 48 29 29 3b  argc-(3-TCLSH));
1d5d0 0a 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28  .    Tcl_SetVar(
1d5e0 69 6e 74 65 72 70 2c 22 61 72 67 63 22 2c 20 7a  interp,"argc", z
1d5f0 41 72 67 63 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c  Argc, TCL_GLOBAL
1d600 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 54 63 6c 5f  _ONLY);.    Tcl_
1d610 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 22 61  SetVar(interp,"a
1d620 72 67 76 30 22 2c 61 72 67 76 5b 31 5d 2c 54 43  rgv0",argv[1],TC
1d630 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a  L_GLOBAL_ONLY);.
1d640 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69      Tcl_SetVar(i
1d650 6e 74 65 72 70 2c 22 61 72 67 76 22 2c 20 22 22  nterp,"argv", ""
1d660 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c  , TCL_GLOBAL_ONL
1d670 59 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 33 2d  Y);.    for(i=3-
1d680 54 43 4c 53 48 3b 20 69 3c 61 72 67 63 3b 20 69  TCLSH; i<argc; i
1d690 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53  ++){.      Tcl_S
1d6a0 65 74 56 61 72 28 69 6e 74 65 72 70 2c 20 22 61  etVar(interp, "a
1d6b0 72 67 76 22 2c 20 61 72 67 76 5b 69 5d 2c 0a 20  rgv", argv[i],. 
1d6c0 20 20 20 20 20 20 20 20 20 54 43 4c 5f 47 4c 4f           TCL_GLO
1d6d0 42 41 4c 5f 4f 4e 4c 59 20 7c 20 54 43 4c 5f 4c  BAL_ONLY | TCL_L
1d6e0 49 53 54 5f 45 4c 45 4d 45 4e 54 20 7c 20 54 43  IST_ELEMENT | TC
1d6f0 4c 5f 41 50 50 45 4e 44 5f 56 41 4c 55 45 29 3b  L_APPEND_VALUE);
1d700 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 54  .    }.    if( T
1d710 43 4c 53 48 3d 3d 31 20 26 26 20 54 63 6c 5f 45  CLSH==1 && Tcl_E
1d720 76 61 6c 46 69 6c 65 28 69 6e 74 65 72 70 2c 20  valFile(interp, 
1d730 61 72 67 76 5b 31 5d 29 21 3d 54 43 4c 5f 4f 4b  argv[1])!=TCL_OK
1d740 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
1d750 63 68 61 72 20 2a 7a 49 6e 66 6f 20 3d 20 54 63  char *zInfo = Tc
1d760 6c 5f 47 65 74 56 61 72 28 69 6e 74 65 72 70 2c  l_GetVar(interp,
1d770 20 22 65 72 72 6f 72 49 6e 66 6f 22 2c 20 54 43   "errorInfo", TC
1d780 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a  L_GLOBAL_ONLY);.
1d790 20 20 20 20 20 20 69 66 28 20 7a 49 6e 66 6f 3d        if( zInfo=
1d7a0 3d 30 20 29 20 7a 49 6e 66 6f 20 3d 20 54 63 6c  =0 ) zInfo = Tcl
1d7b0 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74  _GetStringResult
1d7c0 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 20 20  (interp);.      
1d7d0 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
1d7e0 25 73 3a 20 25 73 5c 6e 22 2c 20 2a 61 72 67 76  %s: %s\n", *argv
1d7f0 2c 20 7a 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  , zInfo);.      
1d800 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
1d810 20 20 7d 0a 20 20 69 66 28 20 54 43 4c 53 48 3d    }.  if( TCLSH=
1d820 3d 32 20 7c 7c 20 61 72 67 63 3c 3d 31 20 29 7b  =2 || argc<=1 ){
1d830 0a 20 20 20 20 54 63 6c 5f 47 6c 6f 62 61 6c 45  .    Tcl_GlobalE
1d840 76 61 6c 28 69 6e 74 65 72 70 2c 20 74 63 6c 73  val(interp, tcls
1d850 68 5f 6d 61 69 6e 5f 6c 6f 6f 70 28 29 29 3b 0a  h_main_loop());.
1d860 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
1d870 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 54 43 4c 53  }.#endif /* TCLS
1d880 48 20 2a 2f 0a                                   H */.