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

Artifact 573e63c959b314d77486f3565fa79c60cda3df7e:


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 54 72 61 63 65 56 32    char *zTraceV2
1200: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1210: 54 68 65 20 74 72 61 63 65 5f 76 32 20 63 61 6c  The trace_v2 cal
1220: 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f  lback routine */
1230: 0a 20 20 63 68 61 72 20 2a 7a 50 72 6f 66 69 6c  .  char *zProfil
1240: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
1250: 20 54 68 65 20 70 72 6f 66 69 6c 65 20 63 61 6c   The profile 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 50 72 6f 67 72 65  .  char *zProgre
1280: 73 73 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ss;           /*
1290: 20 54 68 65 20 70 72 6f 67 72 65 73 73 20 63 61   The progress ca
12a0: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a  llback routine *
12b0: 2f 0a 20 20 63 68 61 72 20 2a 7a 41 75 74 68 3b  /.  char *zAuth;
12c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12d0: 2a 20 54 68 65 20 61 75 74 68 6f 72 69 7a 61 74  * The authorizat
12e0: 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75  ion callback rou
12f0: 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 64 69  tine */.  int di
1300: 73 61 62 6c 65 41 75 74 68 3b 20 20 20 20 20 20  sableAuth;      
1310: 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20       /* Disable 
1320: 74 68 65 20 61 75 74 68 6f 72 69 7a 65 72 20 69  the authorizer i
1330: 66 20 69 74 20 65 78 69 73 74 73 20 2a 2f 0a 20  f it exists */. 
1340: 20 63 68 61 72 20 2a 7a 4e 75 6c 6c 3b 20 20 20   char *zNull;   
1350: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1360: 65 78 74 20 74 6f 20 73 75 62 73 74 69 74 75 74  ext to substitut
1370: 65 20 66 6f 72 20 61 6e 20 53 51 4c 20 4e 55 4c  e for an SQL NUL
1380: 4c 20 76 61 6c 75 65 20 2a 2f 0a 20 20 53 71 6c  L value */.  Sql
1390: 46 75 6e 63 20 2a 70 46 75 6e 63 3b 20 20 20 20  Func *pFunc;    
13a0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
13b0: 6f 66 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73  of SQL functions
13c0: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70   */.  Tcl_Obj *p
13d0: 55 70 64 61 74 65 48 6f 6f 6b 3b 20 20 20 20 20  UpdateHook;     
13e0: 20 2f 2a 20 55 70 64 61 74 65 20 68 6f 6f 6b 20   /* Update 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 50  */.  Tcl_Obj *pP
1410: 72 65 55 70 64 61 74 65 48 6f 6f 6b 3b 20 20 20  reUpdateHook;   
1420: 2f 2a 20 50 72 65 2d 75 70 64 61 74 65 20 68 6f  /* Pre-update ho
1430: 6f 6b 20 73 63 72 69 70 74 20 28 69 66 20 61 6e  ok script (if an
1440: 79 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  y) */.  Tcl_Obj 
1450: 2a 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3b 20  *pRollbackHook; 
1460: 20 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 68     /* Rollback h
1470: 6f 6f 6b 20 73 63 72 69 70 74 20 28 69 66 20 61  ook script (if a
1480: 6e 79 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  ny) */.  Tcl_Obj
1490: 20 2a 70 57 61 6c 48 6f 6f 6b 3b 20 20 20 20 20   *pWalHook;     
14a0: 20 20 20 20 2f 2a 20 57 41 4c 20 68 6f 6f 6b 20      /* WAL hook 
14b0: 73 63 72 69 70 74 20 28 69 66 20 61 6e 79 29 20  script (if any) 
14c0: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 55  */.  Tcl_Obj *pU
14d0: 6e 6c 6f 63 6b 4e 6f 74 69 66 79 3b 20 20 20 20  nlockNotify;    
14e0: 2f 2a 20 55 6e 6c 6f 63 6b 20 6e 6f 74 69 66 79  /* Unlock notify
14f0: 20 73 63 72 69 70 74 20 28 69 66 20 61 6e 79 29   script (if any)
1500: 20 2a 2f 0a 20 20 53 71 6c 43 6f 6c 6c 61 74 65   */.  SqlCollate
1510: 20 2a 70 43 6f 6c 6c 61 74 65 3b 20 20 20 20 20   *pCollate;     
1520: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 53 51 4c 20   /* List of SQL 
1530: 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69  collation functi
1540: 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ons */.  int rc;
1550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1560: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
1570: 64 65 20 6f 66 20 6d 6f 73 74 20 72 65 63 65 6e  de of most recen
1580: 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29  t sqlite3_exec()
1590: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70   */.  Tcl_Obj *p
15a0: 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 3b 20 20  CollateNeeded;  
15b0: 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 6e 65   /* Collation ne
15c0: 65 64 65 64 20 73 63 72 69 70 74 20 2a 2f 0a 20  eded script */. 
15d0: 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74   SqlPreparedStmt
15e0: 20 2a 73 74 6d 74 4c 69 73 74 3b 20 2f 2a 20 4c   *stmtList; /* L
15f0: 69 73 74 20 6f 66 20 70 72 65 70 61 72 65 64 20  ist of prepared 
1600: 73 74 61 74 65 6d 65 6e 74 73 2a 2f 0a 20 20 53  statements*/.  S
1610: 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a  qlPreparedStmt *
1620: 73 74 6d 74 4c 61 73 74 3b 20 2f 2a 20 4c 61 73  stmtLast; /* Las
1630: 74 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 74  t statement in t
1640: 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  he list */.  int
1650: 20 6d 61 78 53 74 6d 74 3b 20 20 20 20 20 20 20   maxStmt;       
1660: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
1670: 65 78 74 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  ext maximum numb
1680: 65 72 20 6f 66 20 73 74 6d 74 4c 69 73 74 20 2a  er of stmtList *
1690: 2f 0a 20 20 69 6e 74 20 6e 53 74 6d 74 3b 20 20  /.  int nStmt;  
16a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16b0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 74 61 74  * Number of stat
16c0: 65 6d 65 6e 74 73 20 69 6e 20 73 74 6d 74 4c 69  ements in stmtLi
16d0: 73 74 20 2a 2f 0a 20 20 49 6e 63 72 62 6c 6f 62  st */.  Incrblob
16e0: 43 68 61 6e 6e 65 6c 20 2a 70 49 6e 63 72 62 6c  Channel *pIncrbl
16f0: 6f 62 3b 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73  ob;/* Linked lis
1700: 74 20 6f 66 20 6f 70 65 6e 20 69 6e 63 72 62 6c  t of open incrbl
1710: 6f 62 20 63 68 61 6e 6e 65 6c 73 20 2a 2f 0a 20  ob channels */. 
1720: 20 69 6e 74 20 6e 53 74 65 70 2c 20 6e 53 6f 72   int nStep, nSor
1730: 74 2c 20 6e 49 6e 64 65 78 3b 20 20 2f 2a 20 53  t, nIndex;  /* S
1740: 74 61 74 69 73 74 69 63 73 20 66 6f 72 20 6d 6f  tatistics for mo
1750: 73 74 20 72 65 63 65 6e 74 20 6f 70 65 72 61 74  st recent operat
1760: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 72  ion */.  int nTr
1770: 61 6e 73 61 63 74 69 6f 6e 3b 20 20 20 20 20 20  ansaction;      
1780: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1790: 20 6e 65 73 74 65 64 20 5b 74 72 61 6e 73 61 63   nested [transac
17a0: 74 69 6f 6e 5d 20 6d 65 74 68 6f 64 73 20 2a 2f  tion] methods */
17b0: 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73  .  int openFlags
17c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
17d0: 20 46 6c 61 67 73 20 75 73 65 64 20 74 6f 20 6f   Flags used to o
17e0: 70 65 6e 2e 20 20 28 53 51 4c 49 54 45 5f 4f 50  pen.  (SQLITE_OP
17f0: 45 4e 5f 55 52 49 29 20 2a 2f 0a 23 69 66 64 65  EN_URI) */.#ifde
1800: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
1810: 69 6e 74 20 62 4c 65 67 61 63 79 50 72 65 70 61  int bLegacyPrepa
1820: 72 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  re;        /* Tr
1830: 75 65 20 74 6f 20 75 73 65 20 73 71 6c 69 74 65  ue to use sqlite
1840: 33 5f 70 72 65 70 61 72 65 28 29 20 2a 2f 0a 23  3_prepare() */.#
1850: 65 6e 64 69 66 0a 7d 3b 0a 0a 73 74 72 75 63 74  endif.};..struct
1860: 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c   IncrblobChannel
1870: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f   {.  sqlite3_blo
1880: 62 20 2a 70 42 6c 6f 62 3b 20 20 20 20 20 20 2f  b *pBlob;      /
1890: 2a 20 73 71 6c 69 74 65 33 20 62 6c 6f 62 20 68  * sqlite3 blob h
18a0: 61 6e 64 6c 65 20 2a 2f 0a 20 20 53 71 6c 69 74  andle */.  Sqlit
18b0: 65 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20  eDb *pDb;       
18c0: 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74       /* Associat
18d0: 65 64 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ed database conn
18e0: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ection */.  int 
18f0: 69 53 65 65 6b 3b 20 20 20 20 20 20 20 20 20 20  iSeek;          
1900: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
1910: 20 73 65 65 6b 20 6f 66 66 73 65 74 20 2a 2f 0a   seek offset */.
1920: 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68    Tcl_Channel ch
1930: 61 6e 6e 65 6c 3b 20 20 20 20 20 20 2f 2a 20 43  annel;      /* C
1940: 68 61 6e 6e 65 6c 20 69 64 65 6e 74 69 66 69 65  hannel identifie
1950: 72 20 2a 2f 0a 20 20 49 6e 63 72 62 6c 6f 62 43  r */.  IncrblobC
1960: 68 61 6e 6e 65 6c 20 2a 70 4e 65 78 74 3b 20 20  hannel *pNext;  
1970: 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20   /* Linked list 
1980: 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 69 6e 63 72  of all open incr
1990: 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 73 20 2a 2f  blob channels */
19a0: 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  .  IncrblobChann
19b0: 65 6c 20 2a 70 50 72 65 76 3b 20 20 20 2f 2a 20  el *pPrev;   /* 
19c0: 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 61  Linked list of a
19d0: 6c 6c 20 6f 70 65 6e 20 69 6e 63 72 62 6c 6f 62  ll open incrblob
19e0: 20 63 68 61 6e 6e 65 6c 73 20 2a 2f 0a 7d 3b 0a   channels */.};.
19f0: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61  ./*.** Compute a
1a00: 20 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 74   string length t
1a10: 68 61 74 20 69 73 20 6c 69 6d 69 74 65 64 20 74  hat is limited t
1a20: 6f 20 77 68 61 74 20 63 61 6e 20 62 65 20 73 74  o what can be st
1a30: 6f 72 65 64 20 69 6e 0a 2a 2a 20 6c 6f 77 65 72  ored in.** lower
1a40: 20 33 30 20 62 69 74 73 20 6f 66 20 61 20 33 32   30 bits of a 32
1a50: 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74 65  -bit signed inte
1a60: 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ger..*/.static i
1a70: 6e 74 20 73 74 72 6c 65 6e 33 30 28 63 6f 6e 73  nt strlen30(cons
1a80: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 63 6f  t char *z){.  co
1a90: 6e 73 74 20 63 68 61 72 20 2a 7a 32 20 3d 20 7a  nst char *z2 = z
1aa0: 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a 32 20 29  ;.  while( *z2 )
1ab0: 7b 20 7a 32 2b 2b 3b 20 7d 0a 20 20 72 65 74 75  { z2++; }.  retu
1ac0: 72 6e 20 30 78 33 66 66 66 66 66 66 66 20 26 20  rn 0x3fffffff & 
1ad0: 28 69 6e 74 29 28 7a 32 20 2d 20 7a 29 3b 0a 7d  (int)(z2 - z);.}
1ae0: 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
1af0: 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
1b00: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  /*.** Close all 
1b10: 69 6e 63 72 62 6c 6f 62 20 63 68 61 6e 6e 65 6c  incrblob channel
1b20: 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 64  s opened using d
1b30: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1b40: 6f 6e 20 70 44 62 2e 0a 2a 2a 20 54 68 69 73 20  on pDb..** This 
1b50: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 73  is called when s
1b60: 68 75 74 74 69 6e 67 20 64 6f 77 6e 20 74 68 65  hutting down the
1b70: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
1b80: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
1b90: 76 6f 69 64 20 63 6c 6f 73 65 49 6e 63 72 62 6c  void closeIncrbl
1ba0: 6f 62 43 68 61 6e 6e 65 6c 73 28 53 71 6c 69 74  obChannels(Sqlit
1bb0: 65 44 62 20 2a 70 44 62 29 7b 0a 20 20 49 6e 63  eDb *pDb){.  Inc
1bc0: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 3b  rblobChannel *p;
1bd0: 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  .  IncrblobChann
1be0: 65 6c 20 2a 70 4e 65 78 74 3b 0a 0a 20 20 66 6f  el *pNext;..  fo
1bf0: 72 28 70 3d 70 44 62 2d 3e 70 49 6e 63 72 62 6c  r(p=pDb->pIncrbl
1c00: 6f 62 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b  ob; p; p=pNext){
1c10: 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e  .    pNext = p->
1c20: 70 4e 65 78 74 3b 0a 0a 20 20 20 20 2f 2a 20 4e  pNext;..    /* N
1c30: 6f 74 65 3a 20 43 61 6c 6c 69 6e 67 20 75 6e 72  ote: Calling unr
1c40: 65 67 69 73 74 65 72 20 68 65 72 65 20 63 61 6c  egister here cal
1c50: 6c 20 54 63 6c 5f 43 6c 6f 73 65 20 6f 6e 20 74  l Tcl_Close on t
1c60: 68 65 20 69 6e 63 72 62 6c 6f 62 20 63 68 61 6e  he incrblob chan
1c70: 6e 65 6c 2c 0a 20 20 20 20 2a 2a 20 77 68 69 63  nel,.    ** whic
1c80: 68 20 64 65 6c 65 74 65 73 20 74 68 65 20 49 6e  h deletes the In
1c90: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 73 74  crblobChannel st
1ca0: 72 75 63 74 75 72 65 20 61 74 20 2a 70 2e 20 53  ructure at *p. S
1cb0: 6f 20 64 6f 20 6e 6f 74 0a 20 20 20 20 2a 2a 20  o do not.    ** 
1cc0: 63 61 6c 6c 20 54 63 6c 5f 46 72 65 65 28 29 20  call Tcl_Free() 
1cd0: 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  here..    */.   
1ce0: 20 54 63 6c 5f 55 6e 72 65 67 69 73 74 65 72 43   Tcl_UnregisterC
1cf0: 68 61 6e 6e 65 6c 28 70 44 62 2d 3e 69 6e 74 65  hannel(pDb->inte
1d00: 72 70 2c 20 70 2d 3e 63 68 61 6e 6e 65 6c 29 3b  rp, p->channel);
1d10: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  .  }.}../*.** Cl
1d20: 6f 73 65 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74  ose an increment
1d30: 61 6c 20 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e  al blob channel.
1d40: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
1d50: 6e 63 72 62 6c 6f 62 43 6c 6f 73 65 28 43 6c 69  ncrblobClose(Cli
1d60: 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65  entData instance
1d70: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70  Data, Tcl_Interp
1d80: 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 49 6e 63   *interp){.  Inc
1d90: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 20  rblobChannel *p 
1da0: 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  = (IncrblobChann
1db0: 65 6c 20 2a 29 69 6e 73 74 61 6e 63 65 44 61 74  el *)instanceDat
1dc0: 61 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71  a;.  int rc = sq
1dd0: 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65  lite3_blob_close
1de0: 28 70 2d 3e 70 42 6c 6f 62 29 3b 0a 20 20 73 71  (p->pBlob);.  sq
1df0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 70  lite3 *db = p->p
1e00: 44 62 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 52 65  Db->db;..  /* Re
1e10: 6d 6f 76 65 20 74 68 65 20 63 68 61 6e 6e 65 6c  move the channel
1e20: 20 66 72 6f 6d 20 74 68 65 20 53 71 6c 69 74 65   from the Sqlite
1e30: 44 62 2e 70 49 6e 63 72 62 6c 6f 62 20 6c 69 73  Db.pIncrblob lis
1e40: 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  t. */.  if( p->p
1e50: 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70  Next ){.    p->p
1e60: 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d  Next->pPrev = p-
1e70: 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 69 66  >pPrev;.  }.  if
1e80: 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  ( p->pPrev ){.  
1e90: 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78    p->pPrev->pNex
1ea0: 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  t = p->pNext;.  
1eb0: 7d 0a 20 20 69 66 28 20 70 2d 3e 70 44 62 2d 3e  }.  if( p->pDb->
1ec0: 70 49 6e 63 72 62 6c 6f 62 3d 3d 70 20 29 7b 0a  pIncrblob==p ){.
1ed0: 20 20 20 20 70 2d 3e 70 44 62 2d 3e 70 49 6e 63      p->pDb->pInc
1ee0: 72 62 6c 6f 62 20 3d 20 70 2d 3e 70 4e 65 78 74  rblob = p->pNext
1ef0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65  ;.  }..  /* Free
1f00: 20 74 68 65 20 49 6e 63 72 62 6c 6f 62 43 68 61   the IncrblobCha
1f10: 6e 6e 65 6c 20 73 74 72 75 63 74 75 72 65 20 2a  nnel structure *
1f20: 2f 0a 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68  /.  Tcl_Free((ch
1f30: 61 72 20 2a 29 70 29 3b 0a 0a 20 20 69 66 28 20  ar *)p);..  if( 
1f40: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1f50: 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
1f60: 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
1f70: 20 2a 29 73 71 6c 69 74 65 33 5f 65 72 72 6d 73   *)sqlite3_errms
1f80: 67 28 64 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54  g(db), TCL_VOLAT
1f90: 49 4c 45 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ILE);.    return
1fa0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1fb0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1fc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64  .}../*.** Read d
1fd0: 61 74 61 20 66 72 6f 6d 20 61 6e 20 69 6e 63 72  ata from an incr
1fe0: 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 68 61  emental blob cha
1ff0: 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nnel..*/.static 
2000: 69 6e 74 20 69 6e 63 72 62 6c 6f 62 49 6e 70 75  int incrblobInpu
2010: 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  t(.  ClientData 
2020: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 0a 20 20  instanceData,.  
2030: 63 68 61 72 20 2a 62 75 66 2c 0a 20 20 69 6e 74  char *buf,.  int
2040: 20 62 75 66 53 69 7a 65 2c 0a 20 20 69 6e 74 20   bufSize,.  int 
2050: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 0a 29 7b  *errorCodePtr.){
2060: 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  .  IncrblobChann
2070: 65 6c 20 2a 70 20 3d 20 28 49 6e 63 72 62 6c 6f  el *p = (Incrblo
2080: 62 43 68 61 6e 6e 65 6c 20 2a 29 69 6e 73 74 61  bChannel *)insta
2090: 6e 63 65 44 61 74 61 3b 0a 20 20 69 6e 74 20 6e  nceData;.  int n
20a0: 52 65 61 64 20 3d 20 62 75 66 53 69 7a 65 3b 20  Read = bufSize; 
20b0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
20c0: 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 72 65  r of bytes to re
20d0: 61 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 6c 6f  ad */.  int nBlo
20e0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
20f0: 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69       /* Total si
2100: 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 62 20 2a  ze of the blob *
2110: 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
2120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2130: 20 2f 2a 20 73 71 6c 69 74 65 20 65 72 72 6f 72   /* sqlite error
2140: 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 6e 42 6c 6f   code */..  nBlo
2150: 62 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  b = sqlite3_blob
2160: 5f 62 79 74 65 73 28 70 2d 3e 70 42 6c 6f 62 29  _bytes(p->pBlob)
2170: 3b 0a 20 20 69 66 28 20 28 70 2d 3e 69 53 65 65  ;.  if( (p->iSee
2180: 6b 2b 6e 52 65 61 64 29 3e 6e 42 6c 6f 62 20 29  k+nRead)>nBlob )
2190: 7b 0a 20 20 20 20 6e 52 65 61 64 20 3d 20 6e 42  {.    nRead = nB
21a0: 6c 6f 62 2d 70 2d 3e 69 53 65 65 6b 3b 0a 20 20  lob-p->iSeek;.  
21b0: 7d 0a 20 20 69 66 28 20 6e 52 65 61 64 3c 3d 30  }.  if( nRead<=0
21c0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
21d0: 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71  ;.  }..  rc = sq
21e0: 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28  lite3_blob_read(
21f0: 70 2d 3e 70 42 6c 6f 62 2c 20 28 76 6f 69 64 20  p->pBlob, (void 
2200: 2a 29 62 75 66 2c 20 6e 52 65 61 64 2c 20 70 2d  *)buf, nRead, p-
2210: 3e 69 53 65 65 6b 29 3b 0a 20 20 69 66 28 20 72  >iSeek);.  if( r
2220: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2230: 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74      *errorCodePt
2240: 72 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75  r = rc;.    retu
2250: 72 6e 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 70 2d  rn -1;.  }..  p-
2260: 3e 69 53 65 65 6b 20 2b 3d 20 6e 52 65 61 64 3b  >iSeek += nRead;
2270: 0a 20 20 72 65 74 75 72 6e 20 6e 52 65 61 64 3b  .  return nRead;
2280: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
2290: 64 61 74 61 20 74 6f 20 61 6e 20 69 6e 63 72 65  data to an incre
22a0: 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 68 61 6e  mental blob chan
22b0: 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  nel..*/.static i
22c0: 6e 74 20 69 6e 63 72 62 6c 6f 62 4f 75 74 70 75  nt incrblobOutpu
22d0: 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  t(.  ClientData 
22e0: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 0a 20 20  instanceData,.  
22f0: 43 4f 4e 53 54 20 63 68 61 72 20 2a 62 75 66 2c  CONST char *buf,
2300: 0a 20 20 69 6e 74 20 74 6f 57 72 69 74 65 2c 0a  .  int toWrite,.
2310: 20 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65    int *errorCode
2320: 50 74 72 0a 29 7b 0a 20 20 49 6e 63 72 62 6c 6f  Ptr.){.  Incrblo
2330: 62 43 68 61 6e 6e 65 6c 20 2a 70 20 3d 20 28 49  bChannel *p = (I
2340: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a  ncrblobChannel *
2350: 29 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20  )instanceData;. 
2360: 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 74 6f   int nWrite = to
2370: 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 2f 2a  Write;        /*
2380: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
2390: 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 69   to write */.  i
23a0: 6e 74 20 6e 42 6c 6f 62 3b 20 20 20 20 20 20 20  nt nBlob;       
23b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
23c0: 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65  otal size of the
23d0: 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 6e 74 20 72   blob */.  int r
23e0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
23f0: 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
2400: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a  e error code */.
2410: 0a 20 20 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74  .  nBlob = sqlit
2420: 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70 2d  e3_blob_bytes(p-
2430: 3e 70 42 6c 6f 62 29 3b 0a 20 20 69 66 28 20 28  >pBlob);.  if( (
2440: 70 2d 3e 69 53 65 65 6b 2b 6e 57 72 69 74 65 29  p->iSeek+nWrite)
2450: 3e 6e 42 6c 6f 62 20 29 7b 0a 20 20 20 20 2a 65  >nBlob ){.    *e
2460: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 49  rrorCodePtr = EI
2470: 4e 56 41 4c 3b 0a 20 20 20 20 72 65 74 75 72 6e  NVAL;.    return
2480: 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e   -1;.  }.  if( n
2490: 57 72 69 74 65 3c 3d 30 20 29 7b 0a 20 20 20 20  Write<=0 ){.    
24a0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
24b0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c   rc = sqlite3_bl
24c0: 6f 62 5f 77 72 69 74 65 28 70 2d 3e 70 42 6c 6f  ob_write(p->pBlo
24d0: 62 2c 20 28 76 6f 69 64 20 2a 29 62 75 66 2c 20  b, (void *)buf, 
24e0: 6e 57 72 69 74 65 2c 20 70 2d 3e 69 53 65 65 6b  nWrite, p->iSeek
24f0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
2500: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 65  ITE_OK ){.    *e
2510: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 49  rrorCodePtr = EI
2520: 4f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31  O;.    return -1
2530: 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 69 53 65 65  ;.  }..  p->iSee
2540: 6b 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20 72  k += nWrite;.  r
2550: 65 74 75 72 6e 20 6e 57 72 69 74 65 3b 0a 7d 0a  eturn nWrite;.}.
2560: 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 61 6e 20 69  ./*.** Seek an i
2570: 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20  ncremental blob 
2580: 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74  channel..*/.stat
2590: 69 63 20 69 6e 74 20 69 6e 63 72 62 6c 6f 62 53  ic int incrblobS
25a0: 65 65 6b 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  eek(.  ClientDat
25b0: 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 0a  a instanceData,.
25c0: 20 20 6c 6f 6e 67 20 6f 66 66 73 65 74 2c 0a 20    long offset,. 
25d0: 20 69 6e 74 20 73 65 65 6b 4d 6f 64 65 2c 0a 20   int seekMode,. 
25e0: 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50   int *errorCodeP
25f0: 74 72 0a 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62  tr.){.  Incrblob
2600: 43 68 61 6e 6e 65 6c 20 2a 70 20 3d 20 28 49 6e  Channel *p = (In
2610: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 29  crblobChannel *)
2620: 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 0a 20  instanceData;.. 
2630: 20 73 77 69 74 63 68 28 20 73 65 65 6b 4d 6f 64   switch( seekMod
2640: 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 45  e ){.    case SE
2650: 45 4b 5f 53 45 54 3a 0a 20 20 20 20 20 20 70 2d  EK_SET:.      p-
2660: 3e 69 53 65 65 6b 20 3d 20 6f 66 66 73 65 74 3b  >iSeek = offset;
2670: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2680: 20 20 63 61 73 65 20 53 45 45 4b 5f 43 55 52 3a    case SEEK_CUR:
2690: 0a 20 20 20 20 20 20 70 2d 3e 69 53 65 65 6b 20  .      p->iSeek 
26a0: 2b 3d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20  += offset;.     
26b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
26c0: 20 53 45 45 4b 5f 45 4e 44 3a 0a 20 20 20 20 20   SEEK_END:.     
26d0: 20 70 2d 3e 69 53 65 65 6b 20 3d 20 73 71 6c 69   p->iSeek = sqli
26e0: 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70  te3_blob_bytes(p
26f0: 2d 3e 70 42 6c 6f 62 29 20 2b 20 6f 66 66 73 65  ->pBlob) + offse
2700: 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  t;.      break;.
2710: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73  .    default: as
2720: 73 65 72 74 28 21 22 42 61 64 20 73 65 65 6b 4d  sert(!"Bad seekM
2730: 6f 64 65 22 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  ode");.  }..  re
2740: 74 75 72 6e 20 70 2d 3e 69 53 65 65 6b 3b 0a 7d  turn p->iSeek;.}
2750: 0a 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  ...static void i
2760: 6e 63 72 62 6c 6f 62 57 61 74 63 68 28 43 6c 69  ncrblobWatch(Cli
2770: 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65  entData instance
2780: 44 61 74 61 2c 20 69 6e 74 20 6d 6f 64 65 29 7b  Data, int mode){
2790: 0a 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 7d  .  /* NO-OP */.}
27a0: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72  .static int incr
27b0: 62 6c 6f 62 48 61 6e 64 6c 65 28 43 6c 69 65 6e  blobHandle(Clien
27c0: 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61  tData instanceDa
27d0: 74 61 2c 20 69 6e 74 20 64 69 72 2c 20 43 6c 69  ta, int dir, Cli
27e0: 65 6e 74 44 61 74 61 20 2a 68 50 74 72 29 7b 0a  entData *hPtr){.
27f0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2800: 4f 52 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 54 63  OR;.}..static Tc
2810: 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 65 20 49 6e  l_ChannelType In
2820: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 54 79 70  crblobChannelTyp
2830: 65 20 3d 20 7b 0a 20 20 22 69 6e 63 72 62 6c 6f  e = {.  "incrblo
2840: 62 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  b",             
2850: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 79             /* ty
2860: 70 65 4e 61 6d 65 20 20 20 20 20 20 20 20 20 20  peName          
2870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2880: 20 20 20 2a 2f 0a 20 20 54 43 4c 5f 43 48 41 4e     */.  TCL_CHAN
2890: 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 32 2c 20 20  NEL_VERSION_2,  
28a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 76 65             /* ve
28b0: 72 73 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20  rsion           
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d0: 20 20 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f 62     */.  incrblob
28e0: 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
28f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6c             /* cl
2900: 6f 73 65 50 72 6f 63 20 20 20 20 20 20 20 20 20  oseProc         
2910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2920: 20 20 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f 62     */.  incrblob
2930: 49 6e 70 75 74 2c 20 20 20 20 20 20 20 20 20 20  Input,          
2940: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e             /* in
2950: 70 75 74 50 72 6f 63 20 20 20 20 20 20 20 20 20  putProc         
2960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2970: 20 20 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f 62     */.  incrblob
2980: 4f 75 74 70 75 74 2c 20 20 20 20 20 20 20 20 20  Output,         
2990: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75             /* ou
29a0: 74 70 75 74 50 72 6f 63 20 20 20 20 20 20 20 20  tputProc        
29b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c0: 20 20 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f 62     */.  incrblob
29d0: 53 65 65 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Seek,           
29e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 65             /* se
29f0: 65 6b 50 72 6f 63 20 20 20 20 20 20 20 20 20 20  ekProc          
2a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a10: 20 20 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20     */.  0,      
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 65             /* se
2a40: 74 4f 70 74 69 6f 6e 50 72 6f 63 20 20 20 20 20  tOptionProc     
2a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a60: 20 20 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20     */.  0,      
2a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 67 65             /* ge
2a90: 74 4f 70 74 69 6f 6e 50 72 6f 63 20 20 20 20 20  tOptionProc     
2aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab0: 20 20 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f 62     */.  incrblob
2ac0: 57 61 74 63 68 2c 20 20 20 20 20 20 20 20 20 20  Watch,          
2ad0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 77 61             /* wa
2ae0: 74 63 68 50 72 6f 63 20 28 74 68 69 73 20 69 73  tchProc (this is
2af0: 20 61 20 6e 6f 2d 6f 70 29 20 20 20 20 20 20 20   a no-op)       
2b00: 20 20 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f 62     */.  incrblob
2b10: 48 61 6e 64 6c 65 2c 20 20 20 20 20 20 20 20 20  Handle,         
2b20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 67 65             /* ge
2b30: 74 48 61 6e 64 6c 65 50 72 6f 63 20 28 61 6c 77  tHandleProc (alw
2b40: 61 79 73 20 72 65 74 75 72 6e 73 20 65 72 72 6f  ays returns erro
2b50: 72 29 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  r) */.  0,      
2b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6c             /* cl
2b80: 6f 73 65 32 50 72 6f 63 20 20 20 20 20 20 20 20  ose2Proc        
2b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba0: 20 20 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20     */.  0,      
2bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 62 6c             /* bl
2bd0: 6f 63 6b 4d 6f 64 65 50 72 6f 63 20 20 20 20 20  ockModeProc     
2be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf0: 20 20 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20     */.  0,      
2c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c             /* fl
2c20: 75 73 68 50 72 6f 63 20 20 20 20 20 20 20 20 20  ushProc         
2c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c40: 20 20 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20     */.  0,      
2c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 68 61             /* ha
2c70: 6e 64 6c 65 72 50 72 6f 63 20 20 20 20 20 20 20  ndlerProc       
2c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c90: 20 20 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20     */.  0,      
2ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 77 69             /* wi
2cc0: 64 65 53 65 65 6b 50 72 6f 63 20 20 20 20 20 20  deSeekProc      
2cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce0: 20 20 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20     */.};../*.** 
2cf0: 43 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e 63  Create a new inc
2d00: 72 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a  rblob channel..*
2d10: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 72 65  /.static int cre
2d20: 61 74 65 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  ateIncrblobChann
2d30: 65 6c 28 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  el(.  Tcl_Interp
2d40: 20 2a 69 6e 74 65 72 70 2c 0a 20 20 53 71 6c 69   *interp,.  Sqli
2d50: 74 65 44 62 20 2a 70 44 62 2c 0a 20 20 63 6f 6e  teDb *pDb,.  con
2d60: 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 0a 20 20  st char *zDb,.  
2d70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
2d80: 6c 65 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  le,.  const char
2d90: 20 2a 7a 43 6f 6c 75 6d 6e 2c 0a 20 20 73 71 6c   *zColumn,.  sql
2da0: 69 74 65 5f 69 6e 74 36 34 20 69 52 6f 77 2c 0a  ite_int64 iRow,.
2db0: 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79    int isReadonly
2dc0: 0a 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68  .){.  IncrblobCh
2dd0: 61 6e 6e 65 6c 20 2a 70 3b 0a 20 20 73 71 6c 69  annel *p;.  sqli
2de0: 74 65 33 20 2a 64 62 20 3d 20 70 44 62 2d 3e 64  te3 *db = pDb->d
2df0: 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f  b;.  sqlite3_blo
2e00: 62 20 2a 70 42 6c 6f 62 3b 0a 20 20 69 6e 74 20  b *pBlob;.  int 
2e10: 72 63 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20  rc;.  int flags 
2e20: 3d 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 7c 28  = TCL_READABLE|(
2e30: 69 73 52 65 61 64 6f 6e 6c 79 20 3f 20 30 20 3a  isReadonly ? 0 :
2e40: 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 29 3b 0a   TCL_WRITABLE);.
2e50: 0a 20 20 2f 2a 20 54 68 69 73 20 76 61 72 69 61  .  /* This varia
2e60: 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6e  ble is used to n
2e70: 61 6d 65 20 74 68 65 20 63 68 61 6e 6e 65 6c 73  ame the channels
2e80: 3a 20 22 69 6e 63 72 62 6c 6f 62 5f 5b 69 6e 63  : "incrblob_[inc
2e90: 72 20 63 6f 75 6e 74 5d 22 20 2a 2f 0a 20 20 73  r count]" */.  s
2ea0: 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 20  tatic int count 
2eb0: 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 43 68 61  = 0;.  char zCha
2ec0: 6e 6e 65 6c 5b 36 34 5d 3b 0a 0a 20 20 72 63 20  nnel[64];..  rc 
2ed0: 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f  = sqlite3_blob_o
2ee0: 70 65 6e 28 64 62 2c 20 7a 44 62 2c 20 7a 54 61  pen(db, zDb, zTa
2ef0: 62 6c 65 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 69 52  ble, zColumn, iR
2f00: 6f 77 2c 20 21 69 73 52 65 61 64 6f 6e 6c 79 2c  ow, !isReadonly,
2f10: 20 26 70 42 6c 6f 62 29 3b 0a 20 20 69 66 28 20   &pBlob);.  if( 
2f20: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2f30: 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
2f40: 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
2f50: 20 2a 29 73 71 6c 69 74 65 33 5f 65 72 72 6d 73   *)sqlite3_errms
2f60: 67 28 70 44 62 2d 3e 64 62 29 2c 20 54 43 4c 5f  g(pDb->db), TCL_
2f70: 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 72  VOLATILE);.    r
2f80: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2f90: 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 28 49 6e 63  .  }..  p = (Inc
2fa0: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 54  rblobChannel *)T
2fb0: 63 6c 5f 41 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  cl_Alloc(sizeof(
2fc0: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 29  IncrblobChannel)
2fd0: 29 3b 0a 20 20 70 2d 3e 69 53 65 65 6b 20 3d 20  );.  p->iSeek = 
2fe0: 30 3b 0a 20 20 70 2d 3e 70 42 6c 6f 62 20 3d 20  0;.  p->pBlob = 
2ff0: 70 42 6c 6f 62 3b 0a 0a 20 20 73 71 6c 69 74 65  pBlob;..  sqlite
3000: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
3010: 66 28 7a 43 68 61 6e 6e 65 6c 29 2c 20 7a 43 68  f(zChannel), zCh
3020: 61 6e 6e 65 6c 2c 20 22 69 6e 63 72 62 6c 6f 62  annel, "incrblob
3030: 5f 25 64 22 2c 20 2b 2b 63 6f 75 6e 74 29 3b 0a  _%d", ++count);.
3040: 20 20 70 2d 3e 63 68 61 6e 6e 65 6c 20 3d 20 54    p->channel = T
3050: 63 6c 5f 43 72 65 61 74 65 43 68 61 6e 6e 65 6c  cl_CreateChannel
3060: 28 26 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65  (&IncrblobChanne
3070: 6c 54 79 70 65 2c 20 7a 43 68 61 6e 6e 65 6c 2c  lType, zChannel,
3080: 20 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 54 63   p, flags);.  Tc
3090: 6c 5f 52 65 67 69 73 74 65 72 43 68 61 6e 6e 65  l_RegisterChanne
30a0: 6c 28 69 6e 74 65 72 70 2c 20 70 2d 3e 63 68 61  l(interp, p->cha
30b0: 6e 6e 65 6c 29 3b 0a 0a 20 20 2f 2a 20 4c 69 6e  nnel);..  /* Lin
30c0: 6b 20 74 68 65 20 6e 65 77 20 63 68 61 6e 6e 65  k the new channe
30d0: 6c 20 69 6e 74 6f 20 74 68 65 20 53 71 6c 69 74  l into the Sqlit
30e0: 65 44 62 2e 70 49 6e 63 72 62 6c 6f 62 20 6c 69  eDb.pIncrblob li
30f0: 73 74 2e 20 2a 2f 0a 20 20 70 2d 3e 70 4e 65 78  st. */.  p->pNex
3100: 74 20 3d 20 70 44 62 2d 3e 70 49 6e 63 72 62 6c  t = pDb->pIncrbl
3110: 6f 62 3b 0a 20 20 70 2d 3e 70 50 72 65 76 20 3d  ob;.  p->pPrev =
3120: 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65   0;.  if( p->pNe
3130: 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65  xt ){.    p->pNe
3140: 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20  xt->pPrev = p;. 
3150: 20 7d 0a 20 20 70 44 62 2d 3e 70 49 6e 63 72 62   }.  pDb->pIncrb
3160: 6c 6f 62 20 3d 20 70 3b 0a 20 20 70 2d 3e 70 44  lob = p;.  p->pD
3170: 62 20 3d 20 70 44 62 3b 0a 0a 20 20 54 63 6c 5f  b = pDb;..  Tcl_
3180: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
3190: 2c 20 28 63 68 61 72 20 2a 29 54 63 6c 5f 47 65  , (char *)Tcl_Ge
31a0: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 70 2d 3e  tChannelName(p->
31b0: 63 68 61 6e 6e 65 6c 29 2c 20 54 43 4c 5f 56 4f  channel), TCL_VO
31c0: 4c 41 54 49 4c 45 29 3b 0a 20 20 72 65 74 75 72  LATILE);.  retur
31d0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6c 73  n TCL_OK;.}.#els
31e0: 65 20 20 2f 2a 20 65 6c 73 65 20 63 6c 61 75 73  e  /* else claus
31f0: 65 20 66 6f 72 20 22 23 69 66 6e 64 65 66 20 53  e for "#ifndef S
3200: 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
3210: 4c 4f 42 22 20 2a 2f 0a 20 20 23 64 65 66 69 6e  LOB" */.  #defin
3220: 65 20 63 6c 6f 73 65 49 6e 63 72 62 6c 6f 62 43  e closeIncrblobC
3230: 68 61 6e 6e 65 6c 73 28 70 44 62 29 0a 23 65 6e  hannels(pDb).#en
3240: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20  dif../*.** Look 
3250: 61 74 20 74 68 65 20 73 63 72 69 70 74 20 70 72  at the script pr
3260: 65 66 69 78 20 69 6e 20 70 43 6d 64 2e 20 20 57  efix in pCmd.  W
3270: 65 20 77 69 6c 6c 20 62 65 20 65 78 65 63 75 74  e will be execut
3280: 69 6e 67 20 74 68 69 73 20 73 63 72 69 70 74 0a  ing this script.
3290: 2a 2a 20 61 66 74 65 72 20 66 69 72 73 74 20 61  ** after first a
32a0: 70 70 65 6e 64 69 6e 67 20 6f 6e 65 20 6f 72 20  ppending one or 
32b0: 6d 6f 72 65 20 61 72 67 75 6d 65 6e 74 73 2e 20  more arguments. 
32c0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e   This routine an
32d0: 61 6c 79 7a 65 73 0a 2a 2a 20 74 68 65 20 73 63  alyzes.** the sc
32e0: 72 69 70 74 20 74 6f 20 73 65 65 20 69 66 20 69  ript to see if i
32f0: 74 20 69 73 20 73 61 66 65 20 74 6f 20 75 73 65  t is safe to use
3300: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20   Tcl_EvalObjv() 
3310: 6f 6e 20 74 68 65 20 73 63 72 69 70 74 0a 2a 2a  on the script.**
3320: 20 72 61 74 68 65 72 20 74 68 61 6e 20 74 68 65   rather than the
3330: 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20 54 63   more general Tc
3340: 6c 5f 45 76 61 6c 45 78 28 29 2e 20 20 54 63 6c  l_EvalEx().  Tcl
3350: 5f 45 76 61 6c 4f 62 6a 76 28 29 20 69 73 20 6d  _EvalObjv() is m
3360: 75 63 68 0a 2a 2a 20 66 61 73 74 65 72 2e 0a 2a  uch.** faster..*
3370: 2a 0a 2a 2a 20 53 63 72 69 70 74 73 20 74 68 61  *.** Scripts tha
3380: 74 20 61 72 65 20 73 61 66 65 20 74 6f 20 75 73  t are safe to us
3390: 65 20 77 69 74 68 20 54 63 6c 5f 45 76 61 6c 4f  e with Tcl_EvalO
33a0: 62 6a 76 28 29 20 63 6f 6e 73 69 73 74 73 20 6f  bjv() consists o
33b0: 66 20 61 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 20 6e  f a.** command n
33c0: 61 6d 65 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20  ame followed by 
33d0: 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 61 72 67  zero or more arg
33e0: 75 6d 65 6e 74 73 20 77 69 74 68 20 6e 6f 20 5b  uments with no [
33f0: 2e 2e 2e 5d 20 6f 72 20 24 0a 2a 2a 20 6f 72 20  ...] or $.** or 
3400: 7b 2e 2e 2e 7d 20 6f 72 20 3b 20 74 6f 20 62 65  {...} or ; to be
3410: 20 73 65 65 6e 20 61 6e 79 77 68 65 72 65 2e 20   seen anywhere. 
3420: 20 4d 6f 73 74 20 63 61 6c 6c 62 61 63 6b 20 73   Most callback s
3430: 63 72 69 70 74 73 20 63 6f 6e 73 69 73 74 0a 2a  cripts consist.*
3440: 2a 20 6f 66 20 6a 75 73 74 20 61 20 73 69 6e 67  * of just a sing
3450: 6c 65 20 70 72 6f 63 65 64 75 72 65 20 6e 61 6d  le procedure nam
3460: 65 20 61 6e 64 20 74 68 65 79 20 6d 65 65 74 20  e and they meet 
3470: 74 68 69 73 20 72 65 71 75 69 72 65 6d 65 6e 74  this requirement
3480: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3490: 73 61 66 65 54 6f 55 73 65 45 76 61 6c 4f 62 6a  safeToUseEvalObj
34a0: 76 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  v(Tcl_Interp *in
34b0: 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a 70  terp, Tcl_Obj *p
34c0: 43 6d 64 29 7b 0a 20 20 2f 2a 20 57 65 20 63 6f  Cmd){.  /* We co
34d0: 75 6c 64 20 74 72 79 20 74 6f 20 64 6f 20 73 6f  uld try to do so
34e0: 6d 65 74 68 69 6e 67 20 77 69 74 68 20 54 63 6c  mething with Tcl
34f0: 5f 50 61 72 73 65 28 29 2e 20 20 42 75 74 20 77  _Parse().  But w
3500: 65 20 77 69 6c 6c 20 69 6e 73 74 65 61 64 0a 20  e will instead. 
3510: 20 2a 2a 20 6a 75 73 74 20 64 6f 20 61 20 73 65   ** just do a se
3520: 61 72 63 68 20 66 6f 72 20 66 6f 72 62 69 64 64  arch for forbidd
3530: 65 6e 20 63 68 61 72 61 63 74 65 72 73 2e 20 20  en characters.  
3540: 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  If any of the fo
3550: 72 62 69 64 64 65 6e 0a 20 20 2a 2a 20 63 68 61  rbidden.  ** cha
3560: 72 61 63 74 65 72 73 20 61 70 70 65 61 72 20 69  racters appear i
3570: 6e 20 70 43 6d 64 2c 20 77 65 20 77 69 6c 6c 20  n pCmd, we will 
3580: 72 65 70 6f 72 74 20 74 68 65 20 73 74 72 69 6e  report the strin
3590: 67 20 61 73 20 75 6e 73 61 66 65 2e 0a 20 20 2a  g as unsafe..  *
35a0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
35b0: 7a 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 7a 20  z;.  int n;.  z 
35c0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
35d0: 72 6f 6d 4f 62 6a 28 70 43 6d 64 2c 20 26 6e 29  romObj(pCmd, &n)
35e0: 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e  ;.  while( n-- >
35f0: 20 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 20   0 ){.    int c 
3600: 3d 20 2a 28 7a 2b 2b 29 3b 0a 20 20 20 20 69 66  = *(z++);.    if
3610: 28 20 63 3d 3d 27 24 27 20 7c 7c 20 63 3d 3d 27  ( c=='$' || c=='
3620: 5b 27 20 7c 7c 20 63 3d 3d 27 3b 27 20 29 20 72  [' || c==';' ) r
3630: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72  eturn 0;.  }.  r
3640: 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 1;.}../*.*
3650: 2a 20 46 69 6e 64 20 61 6e 20 53 71 6c 46 75 6e  * Find an SqlFun
3660: 63 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68  c structure with
3670: 20 74 68 65 20 67 69 76 65 6e 20 6e 61 6d 65 2e   the given name.
3680: 20 20 4f 72 20 63 72 65 61 74 65 20 61 20 6e 65    Or create a ne
3690: 77 0a 2a 2a 20 6f 6e 65 20 69 66 20 61 6e 20 65  w.** one if an e
36a0: 78 69 73 74 69 6e 67 20 6f 6e 65 20 63 61 6e 6e  xisting one cann
36b0: 6f 74 20 62 65 20 66 6f 75 6e 64 2e 20 20 52 65  ot be found.  Re
36c0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
36d0: 6f 20 74 68 65 0a 2a 2a 20 73 74 72 75 63 74 75  o the.** structu
36e0: 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 71  re..*/.static Sq
36f0: 6c 46 75 6e 63 20 2a 66 69 6e 64 53 71 6c 46 75  lFunc *findSqlFu
3700: 6e 63 28 53 71 6c 69 74 65 44 62 20 2a 70 44 62  nc(SqliteDb *pDb
3710: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
3720: 61 6d 65 29 7b 0a 20 20 53 71 6c 46 75 6e 63 20  ame){.  SqlFunc 
3730: 2a 70 2c 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74  *p, *pNew;.  int
3740: 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 33   nName = strlen3
3750: 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 70 4e 65 77  0(zName);.  pNew
3760: 20 3d 20 28 53 71 6c 46 75 6e 63 2a 29 54 63 6c   = (SqlFunc*)Tcl
3770: 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  _Alloc( sizeof(*
3780: 70 4e 65 77 29 20 2b 20 6e 4e 61 6d 65 20 2b 20  pNew) + nName + 
3790: 31 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 7a 4e 61  1 );.  pNew->zNa
37a0: 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65  me = (char*)&pNe
37b0: 77 5b 31 5d 3b 0a 20 20 6d 65 6d 63 70 79 28 70  w[1];.  memcpy(p
37c0: 4e 65 77 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  New->zName, zNam
37d0: 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 66  e, nName+1);.  f
37e0: 6f 72 28 70 3d 70 44 62 2d 3e 70 46 75 6e 63 3b  or(p=pDb->pFunc;
37f0: 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
3800: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
3810: 5f 73 74 72 69 63 6d 70 28 70 2d 3e 7a 4e 61 6d  _stricmp(p->zNam
3820: 65 2c 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 29 3d  e, pNew->zName)=
3830: 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =0 ){.      Tcl_
3840: 46 72 65 65 28 28 63 68 61 72 2a 29 70 4e 65 77  Free((char*)pNew
3850: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
3860: 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  p;.    }.  }.  p
3870: 4e 65 77 2d 3e 69 6e 74 65 72 70 20 3d 20 70 44  New->interp = pD
3880: 62 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 70 4e 65  b->interp;.  pNe
3890: 77 2d 3e 70 44 62 20 3d 20 70 44 62 3b 0a 20 20  w->pDb = pDb;.  
38a0: 70 4e 65 77 2d 3e 70 53 63 72 69 70 74 20 3d 20  pNew->pScript = 
38b0: 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74  0;.  pNew->pNext
38c0: 20 3d 20 70 44 62 2d 3e 70 46 75 6e 63 3b 0a 20   = pDb->pFunc;. 
38d0: 20 70 44 62 2d 3e 70 46 75 6e 63 20 3d 20 70 4e   pDb->pFunc = pN
38e0: 65 77 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65  ew;.  return pNe
38f0: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  w;.}../*.** Free
3900: 20 61 20 73 69 6e 67 6c 65 20 53 71 6c 50 72 65   a single SqlPre
3910: 70 61 72 65 64 53 74 6d 74 20 6f 62 6a 65 63 74  paredStmt object
3920: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3930: 20 64 62 46 72 65 65 53 74 6d 74 28 53 71 6c 50   dbFreeStmt(SqlP
3940: 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70 53 74  reparedStmt *pSt
3950: 6d 74 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  mt){.#ifdef SQLI
3960: 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71  TE_TEST.  if( sq
3970: 6c 69 74 65 33 5f 73 71 6c 28 70 53 74 6d 74 2d  lite3_sql(pStmt-
3980: 3e 70 53 74 6d 74 29 3d 3d 30 20 29 7b 0a 20 20  >pStmt)==0 ){.  
3990: 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72    Tcl_Free((char
39a0: 20 2a 29 70 53 74 6d 74 2d 3e 7a 53 71 6c 29 3b   *)pStmt->zSql);
39b0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
39c0: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
39d0: 53 74 6d 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20  Stmt->pStmt);.  
39e0: 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 20 2a  Tcl_Free((char *
39f0: 29 70 53 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  )pStmt);.}../*.*
3a00: 2a 20 46 69 6e 61 6c 69 7a 65 20 61 6e 64 20 66  * Finalize and f
3a10: 72 65 65 20 61 20 6c 69 73 74 20 6f 66 20 70 72  ree a list of pr
3a20: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
3a30: 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s.*/.static void
3a40: 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28   flushStmtCache(
3a50: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 29 7b 0a  SqliteDb *pDb){.
3a60: 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d    SqlPreparedStm
3a70: 74 20 2a 70 50 72 65 53 74 6d 74 3b 0a 20 20 53  t *pPreStmt;.  S
3a80: 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a  qlPreparedStmt *
3a90: 70 4e 65 78 74 3b 0a 0a 20 20 66 6f 72 28 70 50  pNext;..  for(pP
3aa0: 72 65 53 74 6d 74 20 3d 20 70 44 62 2d 3e 73 74  reStmt = pDb->st
3ab0: 6d 74 4c 69 73 74 3b 20 70 50 72 65 53 74 6d 74  mtList; pPreStmt
3ac0: 3b 20 70 50 72 65 53 74 6d 74 3d 70 4e 65 78 74  ; pPreStmt=pNext
3ad0: 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
3ae0: 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 3b 0a  PreStmt->pNext;.
3af0: 20 20 20 20 64 62 46 72 65 65 53 74 6d 74 28 70      dbFreeStmt(p
3b00: 50 72 65 53 74 6d 74 29 3b 0a 20 20 7d 0a 20 20  PreStmt);.  }.  
3b10: 70 44 62 2d 3e 6e 53 74 6d 74 20 3d 20 30 3b 0a  pDb->nStmt = 0;.
3b20: 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20    pDb->stmtLast 
3b30: 3d 20 30 3b 0a 20 20 70 44 62 2d 3e 73 74 6d 74  = 0;.  pDb->stmt
3b40: 4c 69 73 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  List = 0;.}../*.
3b50: 2a 2a 20 54 43 4c 20 63 61 6c 6c 73 20 74 68 69  ** TCL calls thi
3b60: 73 20 70 72 6f 63 65 64 75 72 65 20 77 68 65 6e  s procedure when
3b70: 20 61 6e 20 73 71 6c 69 74 65 33 20 64 61 74 61   an sqlite3 data
3b80: 62 61 73 65 20 63 6f 6d 6d 61 6e 64 20 69 73 0a  base command is.
3b90: 2a 2a 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73  ** deleted..*/.s
3ba0: 74 61 74 69 63 20 76 6f 69 64 20 44 62 44 65 6c  tatic void DbDel
3bb0: 65 74 65 43 6d 64 28 76 6f 69 64 20 2a 64 62 29  eteCmd(void *db)
3bc0: 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  {.  SqliteDb *pD
3bd0: 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 64  b = (SqliteDb*)d
3be0: 62 3b 0a 20 20 66 6c 75 73 68 53 74 6d 74 43 61  b;.  flushStmtCa
3bf0: 63 68 65 28 70 44 62 29 3b 0a 20 20 63 6c 6f 73  che(pDb);.  clos
3c00: 65 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c  eIncrblobChannel
3c10: 73 28 70 44 62 29 3b 0a 20 20 73 71 6c 69 74 65  s(pDb);.  sqlite
3c20: 33 5f 63 6c 6f 73 65 28 70 44 62 2d 3e 64 62 29  3_close(pDb->db)
3c30: 3b 0a 20 20 77 68 69 6c 65 28 20 70 44 62 2d 3e  ;.  while( pDb->
3c40: 70 46 75 6e 63 20 29 7b 0a 20 20 20 20 53 71 6c  pFunc ){.    Sql
3c50: 46 75 6e 63 20 2a 70 46 75 6e 63 20 3d 20 70 44  Func *pFunc = pD
3c60: 62 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 70 44  b->pFunc;.    pD
3c70: 62 2d 3e 70 46 75 6e 63 20 3d 20 70 46 75 6e 63  b->pFunc = pFunc
3c80: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61 73 73  ->pNext;.    ass
3c90: 65 72 74 28 20 70 46 75 6e 63 2d 3e 70 44 62 3d  ert( pFunc->pDb=
3ca0: 3d 70 44 62 20 29 3b 0a 20 20 20 20 54 63 6c 5f  =pDb );.    Tcl_
3cb0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 46 75  DecrRefCount(pFu
3cc0: 6e 63 2d 3e 70 53 63 72 69 70 74 29 3b 0a 20 20  nc->pScript);.  
3cd0: 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72    Tcl_Free((char
3ce0: 2a 29 70 46 75 6e 63 29 3b 0a 20 20 7d 0a 20 20  *)pFunc);.  }.  
3cf0: 77 68 69 6c 65 28 20 70 44 62 2d 3e 70 43 6f 6c  while( pDb->pCol
3d00: 6c 61 74 65 20 29 7b 0a 20 20 20 20 53 71 6c 43  late ){.    SqlC
3d10: 6f 6c 6c 61 74 65 20 2a 70 43 6f 6c 6c 61 74 65  ollate *pCollate
3d20: 20 3d 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65   = pDb->pCollate
3d30: 3b 0a 20 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c  ;.    pDb->pColl
3d40: 61 74 65 20 3d 20 70 43 6f 6c 6c 61 74 65 2d 3e  ate = pCollate->
3d50: 70 4e 65 78 74 3b 0a 20 20 20 20 54 63 6c 5f 46  pNext;.    Tcl_F
3d60: 72 65 65 28 28 63 68 61 72 2a 29 70 43 6f 6c 6c  ree((char*)pColl
3d70: 61 74 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ate);.  }.  if( 
3d80: 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20  pDb->zBusy ){.  
3d90: 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e    Tcl_Free(pDb->
3da0: 7a 42 75 73 79 29 3b 0a 20 20 7d 0a 20 20 69 66  zBusy);.  }.  if
3db0: 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b  ( pDb->zTrace ){
3dc0: 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44  .    Tcl_Free(pD
3dd0: 62 2d 3e 7a 54 72 61 63 65 29 3b 0a 20 20 7d 0a  b->zTrace);.  }.
3de0: 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63    if( pDb->zTrac
3df0: 65 56 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46  eV2 ){.    Tcl_F
3e00: 72 65 65 28 70 44 62 2d 3e 7a 54 72 61 63 65 56  ree(pDb->zTraceV
3e10: 32 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44  2);.  }.  if( pD
3e20: 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a 20  b->zProfile ){. 
3e30: 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d     Tcl_Free(pDb-
3e40: 3e 7a 50 72 6f 66 69 6c 65 29 3b 0a 20 20 7d 0a  >zProfile);.  }.
3e50: 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74 68    if( pDb->zAuth
3e60: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65   ){.    Tcl_Free
3e70: 28 70 44 62 2d 3e 7a 41 75 74 68 29 3b 0a 20 20  (pDb->zAuth);.  
3e80: 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 4e 75  }.  if( pDb->zNu
3e90: 6c 6c 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72  ll ){.    Tcl_Fr
3ea0: 65 65 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29 3b 0a  ee(pDb->zNull);.
3eb0: 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 70    }.  if( pDb->p
3ec0: 55 70 64 61 74 65 48 6f 6f 6b 20 29 7b 0a 20 20  UpdateHook ){.  
3ed0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
3ee0: 6e 74 28 70 44 62 2d 3e 70 55 70 64 61 74 65 48  nt(pDb->pUpdateH
3ef0: 6f 6f 6b 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ook);.  }.  if( 
3f00: 70 44 62 2d 3e 70 50 72 65 55 70 64 61 74 65 48  pDb->pPreUpdateH
3f10: 6f 6f 6b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44  ook ){.    Tcl_D
3f20: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d  ecrRefCount(pDb-
3f30: 3e 70 50 72 65 55 70 64 61 74 65 48 6f 6f 6b 29  >pPreUpdateHook)
3f40: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d  ;.  }.  if( pDb-
3f50: 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 20 29  >pRollbackHook )
3f60: 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  {.    Tcl_DecrRe
3f70: 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 52 6f 6c  fCount(pDb->pRol
3f80: 6c 62 61 63 6b 48 6f 6f 6b 29 3b 0a 20 20 7d 0a  lbackHook);.  }.
3f90: 20 20 69 66 28 20 70 44 62 2d 3e 70 57 61 6c 48    if( pDb->pWalH
3fa0: 6f 6f 6b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44  ook ){.    Tcl_D
3fb0: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d  ecrRefCount(pDb-
3fc0: 3e 70 57 61 6c 48 6f 6f 6b 29 3b 0a 20 20 7d 0a  >pWalHook);.  }.
3fd0: 20 20 69 66 28 20 70 44 62 2d 3e 70 43 6f 6c 6c    if( pDb->pColl
3fe0: 61 74 65 4e 65 65 64 65 64 20 29 7b 0a 20 20 20  ateNeeded ){.   
3ff0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
4000: 74 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e  t(pDb->pCollateN
4010: 65 65 64 65 64 29 3b 0a 20 20 7d 0a 20 20 54 63  eeded);.  }.  Tc
4020: 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 44  l_Free((char*)pD
4030: 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  b);.}../*.** Thi
4040: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
4050: 6c 65 64 20 77 68 65 6e 20 61 20 64 61 74 61 62  led when a datab
4060: 61 73 65 20 66 69 6c 65 20 69 73 20 6c 6f 63 6b  ase file is lock
4070: 65 64 20 77 68 69 6c 65 20 74 72 79 69 6e 67 0a  ed while trying.
4080: 2a 2a 20 74 6f 20 65 78 65 63 75 74 65 20 53 51  ** to execute SQ
4090: 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  L..*/.static int
40a0: 20 44 62 42 75 73 79 48 61 6e 64 6c 65 72 28 76   DbBusyHandler(v
40b0: 6f 69 64 20 2a 63 64 2c 20 69 6e 74 20 6e 54 72  oid *cd, int nTr
40c0: 69 65 73 29 7b 0a 20 20 53 71 6c 69 74 65 44 62  ies){.  SqliteDb
40d0: 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44   *pDb = (SqliteD
40e0: 62 2a 29 63 64 3b 0a 20 20 69 6e 74 20 72 63 3b  b*)cd;.  int rc;
40f0: 0a 20 20 63 68 61 72 20 7a 56 61 6c 5b 33 30 5d  .  char zVal[30]
4100: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ;..  sqlite3_snp
4110: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 56 61  rintf(sizeof(zVa
4120: 6c 29 2c 20 7a 56 61 6c 2c 20 22 25 64 22 2c 20  l), zVal, "%d", 
4130: 6e 54 72 69 65 73 29 3b 0a 20 20 72 63 20 3d 20  nTries);.  rc = 
4140: 54 63 6c 5f 56 61 72 45 76 61 6c 28 70 44 62 2d  Tcl_VarEval(pDb-
4150: 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 42  >interp, pDb->zB
4160: 75 73 79 2c 20 22 20 22 2c 20 7a 56 61 6c 2c 20  usy, " ", zVal, 
4170: 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 69 66 28  (char*)0);.  if(
4180: 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61   rc!=TCL_OK || a
4190: 74 6f 69 28 54 63 6c 5f 47 65 74 53 74 72 69 6e  toi(Tcl_GetStrin
41a0: 67 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74  gResult(pDb->int
41b0: 65 72 70 29 29 20 29 7b 0a 20 20 20 20 72 65 74  erp)) ){.    ret
41c0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
41d0: 75 72 6e 20 31 3b 0a 7d 0a 0a 23 69 66 6e 64 65  urn 1;.}..#ifnde
41e0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52  f SQLITE_OMIT_PR
41f0: 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a  OGRESS_CALLBACK.
4200: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
4210: 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 73  ne is invoked as
4220: 20 74 68 65 20 27 70 72 6f 67 72 65 73 73 20 63   the 'progress c
4230: 61 6c 6c 62 61 63 6b 27 20 66 6f 72 20 74 68 65  allback' for the
4240: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74   database..*/.st
4250: 61 74 69 63 20 69 6e 74 20 44 62 50 72 6f 67 72  atic int DbProgr
4260: 65 73 73 48 61 6e 64 6c 65 72 28 76 6f 69 64 20  essHandler(void 
4270: 2a 63 64 29 7b 0a 20 20 53 71 6c 69 74 65 44 62  *cd){.  SqliteDb
4280: 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44   *pDb = (SqliteD
4290: 62 2a 29 63 64 3b 0a 20 20 69 6e 74 20 72 63 3b  b*)cd;.  int rc;
42a0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 2d  ..  assert( pDb-
42b0: 3e 7a 50 72 6f 67 72 65 73 73 20 29 3b 0a 20 20  >zProgress );.  
42c0: 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 28 70 44  rc = Tcl_Eval(pD
42d0: 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e  b->interp, pDb->
42e0: 7a 50 72 6f 67 72 65 73 73 29 3b 0a 20 20 69 66  zProgress);.  if
42f0: 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20  ( rc!=TCL_OK || 
4300: 61 74 6f 69 28 54 63 6c 5f 47 65 74 53 74 72 69  atoi(Tcl_GetStri
4310: 6e 67 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e  ngResult(pDb->in
4320: 74 65 72 70 29 29 20 29 7b 0a 20 20 20 20 72 65  terp)) ){.    re
4330: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
4340: 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
4350: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
4360: 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a  _OMIT_TRACE./*.*
4370: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
4380: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
4390: 53 51 4c 69 74 65 20 74 72 61 63 65 20 68 61 6e  SQLite trace han
43a0: 64 6c 65 72 20 77 68 65 6e 65 76 65 72 20 61 20  dler whenever a 
43b0: 6e 65 77 0a 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20  new.** block of 
43c0: 53 51 4c 20 69 73 20 65 78 65 63 75 74 65 64 2e  SQL is executed.
43d0: 20 20 54 68 65 20 54 43 4c 20 73 63 72 69 70 74    The TCL script
43e0: 20 69 6e 20 70 44 62 2d 3e 7a 54 72 61 63 65 20   in pDb->zTrace 
43f0: 69 73 20 65 78 65 63 75 74 65 64 2e 0a 2a 2f 0a  is executed..*/.
4400: 73 74 61 74 69 63 20 76 6f 69 64 20 44 62 54 72  static void DbTr
4410: 61 63 65 48 61 6e 64 6c 65 72 28 76 6f 69 64 20  aceHandler(void 
4420: 2a 63 64 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *cd, const char 
4430: 2a 7a 53 71 6c 29 7b 0a 20 20 53 71 6c 69 74 65  *zSql){.  Sqlite
4440: 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74  Db *pDb = (Sqlit
4450: 65 44 62 2a 29 63 64 3b 0a 20 20 54 63 6c 5f 44  eDb*)cd;.  Tcl_D
4460: 53 74 72 69 6e 67 20 73 74 72 3b 0a 0a 20 20 54  String str;..  T
4470: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
4480: 73 74 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72  str);.  Tcl_DStr
4490: 69 6e 67 41 70 70 65 6e 64 28 26 73 74 72 2c 20  ingAppend(&str, 
44a0: 70 44 62 2d 3e 7a 54 72 61 63 65 2c 20 2d 31 29  pDb->zTrace, -1)
44b0: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41  ;.  Tcl_DStringA
44c0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74  ppendElement(&st
44d0: 72 2c 20 7a 53 71 6c 29 3b 0a 20 20 54 63 6c 5f  r, zSql);.  Tcl_
44e0: 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70  Eval(pDb->interp
44f0: 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c  , Tcl_DStringVal
4500: 75 65 28 26 73 74 72 29 29 3b 0a 20 20 54 63 6c  ue(&str));.  Tcl
4510: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 73 74  _DStringFree(&st
4520: 72 29 3b 0a 20 20 54 63 6c 5f 52 65 73 65 74 52  r);.  Tcl_ResetR
4530: 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72  esult(pDb->inter
4540: 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  p);.}.#endif..#i
4550: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
4560: 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 54 68  T_TRACE./*.** Th
4570: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
4580: 6c 6c 65 64 20 62 79 20 74 68 65 20 53 51 4c 69  lled by the SQLi
4590: 74 65 20 74 72 61 63 65 5f 76 32 20 68 61 6e 64  te trace_v2 hand
45a0: 6c 65 72 20 77 68 65 6e 65 76 65 72 20 61 20 6e  ler whenever a n
45b0: 65 77 0a 2a 2a 20 73 75 70 70 6f 72 74 65 64 20  ew.** supported 
45c0: 65 76 65 6e 74 20 69 73 20 67 65 6e 65 72 61 74  event is generat
45d0: 65 64 2e 20 20 55 6e 73 75 70 70 6f 72 74 65 64  ed.  Unsupported
45e0: 20 65 76 65 6e 74 20 74 79 70 65 73 20 61 72 65   event types are
45f0: 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 20 54 68 65   ignored..** The
4600: 20 54 43 4c 20 73 63 72 69 70 74 20 69 6e 20 70   TCL script in p
4610: 44 62 2d 3e 7a 54 72 61 63 65 56 32 20 69 73 20  Db->zTraceV2 is 
4620: 65 78 65 63 75 74 65 64 2c 20 77 69 74 68 20 74  executed, with t
4630: 68 65 20 61 72 67 75 6d 65 6e 74 73 20 66 6f 72  he arguments for
4640: 0a 2a 2a 20 74 68 65 20 65 76 65 6e 74 20 61 70  .** the event ap
4650: 70 65 6e 64 65 64 20 74 6f 20 69 74 20 28 61 73  pended to it (as
4660: 20 6c 69 73 74 20 65 6c 65 6d 65 6e 74 73 29 2e   list elements).
4670: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44  .*/.static int D
4680: 62 54 72 61 63 65 56 32 48 61 6e 64 6c 65 72 28  bTraceV2Handler(
4690: 0a 20 20 75 6e 73 69 67 6e 65 64 20 74 79 70 65  .  unsigned type
46a0: 2c 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20  , /* One of the 
46b0: 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 2a 20 65  SQLITE_TRACE_* e
46c0: 76 65 6e 74 20 74 79 70 65 73 2e 20 2a 2f 0a 20  vent types. */. 
46d0: 20 76 6f 69 64 20 2a 63 64 2c 20 20 20 20 20 20   void *cd,      
46e0: 2f 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  /* The original 
46f0: 63 6f 6e 74 65 78 74 20 64 61 74 61 20 70 6f 69  context data poi
4700: 6e 74 65 72 2e 20 2a 2f 0a 20 20 76 6f 69 64 20  nter. */.  void 
4710: 2a 70 64 2c 20 20 20 20 20 20 2f 2a 20 50 72 69  *pd,      /* Pri
4720: 6d 61 72 79 20 65 76 65 6e 74 20 64 61 74 61 2c  mary event data,
4730: 20 64 65 70 65 6e 64 73 20 6f 6e 20 65 76 65 6e   depends on even
4740: 74 20 74 79 70 65 2e 20 2a 2f 0a 20 20 76 6f 69  t type. */.  voi
4750: 64 20 2a 78 64 20 20 20 20 20 20 20 2f 2a 20 45  d *xd       /* E
4760: 78 74 72 61 20 65 76 65 6e 74 20 64 61 74 61 2c  xtra event data,
4770: 20 64 65 70 65 6e 64 73 20 6f 6e 20 65 76 65 6e   depends on even
4780: 74 20 74 79 70 65 2e 20 2a 2f 0a 29 7b 0a 20 20  t type. */.){.  
4790: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20  SqliteDb *pDb = 
47a0: 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20  (SqliteDb*)cd;. 
47b0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a   Tcl_Obj *pCmd;.
47c0: 0a 20 20 73 77 69 74 63 68 28 20 74 79 70 65 20  .  switch( type 
47d0: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
47e0: 54 45 5f 54 52 41 43 45 5f 53 54 4d 54 3a 20 7b  TE_TRACE_STMT: {
47f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
4800: 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 28 73 71  tmt *pStmt = (sq
4810: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 29 70 64 3b  lite3_stmt *)pd;
4820: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53 71  .      char *zSq
4830: 6c 20 3d 20 28 63 68 61 72 20 2a 29 78 64 3b 0a  l = (char *)xd;.
4840: 0a 20 20 20 20 20 20 70 43 6d 64 20 3d 20 54 63  .      pCmd = Tc
4850: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70  l_NewStringObj(p
4860: 44 62 2d 3e 7a 54 72 61 63 65 56 32 2c 20 2d 31  Db->zTraceV2, -1
4870: 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 63  );.      Tcl_Inc
4880: 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b  rRefCount(pCmd);
4890: 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  .      Tcl_ListO
48a0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
48b0: 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d  pDb->interp, pCm
48c0: 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
48d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
48e0: 20 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74    Tcl_NewWideInt
48f0: 4f 62 6a 28 28 54 63 6c 5f 57 69 64 65 49 6e 74  Obj((Tcl_WideInt
4900: 29 70 53 74 6d 74 29 29 3b 0a 20 20 20 20 20 20  )pStmt));.      
4910: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
4920: 64 45 6c 65 6d 65 6e 74 28 70 44 62 2d 3e 69 6e  dElement(pDb->in
4930: 74 65 72 70 2c 20 70 43 6d 64 2c 0a 20 20 20 20  terp, pCmd,.    
4940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4950: 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4e             Tcl_N
4960: 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 53 71 6c  ewStringObj(zSql
4970: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 20 20 54 63  , -1));.      Tc
4980: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d  l_EvalObjEx(pDb-
4990: 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54  >interp, pCmd, T
49a0: 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b  CL_EVAL_DIRECT);
49b0: 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52  .      Tcl_DecrR
49c0: 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20  efCount(pCmd);. 
49d0: 20 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65       Tcl_ResetRe
49e0: 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70  sult(pDb->interp
49f0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
4a00: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
4a10: 51 4c 49 54 45 5f 54 52 41 43 45 5f 50 52 4f 46  QLITE_TRACE_PROF
4a20: 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ILE: {.      sql
4a30: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
4a40: 20 3d 20 28 73 71 6c 69 74 65 33 5f 73 74 6d 74   = (sqlite3_stmt
4a50: 20 2a 29 70 64 3b 0a 20 20 20 20 20 20 73 71 6c   *)pd;.      sql
4a60: 69 74 65 33 5f 69 6e 74 36 34 20 6e 73 20 3d 20  ite3_int64 ns = 
4a70: 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 78  (sqlite3_int64)x
4a80: 64 3b 0a 0a 20 20 20 20 20 20 70 43 6d 64 20 3d  d;..      pCmd =
4a90: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
4aa0: 6a 28 70 44 62 2d 3e 7a 54 72 61 63 65 56 32 2c  j(pDb->zTraceV2,
4ab0: 20 2d 31 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f   -1);.      Tcl_
4ac0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d  IncrRefCount(pCm
4ad0: 64 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69  d);.      Tcl_Li
4ae0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
4af0: 6e 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20  nt(pDb->interp, 
4b00: 70 43 6d 64 2c 0a 20 20 20 20 20 20 20 20 20 20  pCmd,.          
4b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b20: 20 20 20 20 20 54 63 6c 5f 4e 65 77 57 69 64 65       Tcl_NewWide
4b30: 49 6e 74 4f 62 6a 28 28 54 63 6c 5f 57 69 64 65  IntObj((Tcl_Wide
4b40: 49 6e 74 29 70 53 74 6d 74 29 29 3b 0a 20 20 20  Int)pStmt));.   
4b50: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
4b60: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70 44 62 2d  pendElement(pDb-
4b70: 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 0a 20  >interp, pCmd,. 
4b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63                Tc
4ba0: 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28  l_NewWideIntObj(
4bb0: 28 54 63 6c 5f 57 69 64 65 49 6e 74 29 6e 73 29  (Tcl_WideInt)ns)
4bc0: 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 45 76 61  );.      Tcl_Eva
4bd0: 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69 6e 74 65  lObjEx(pDb->inte
4be0: 72 70 2c 20 70 43 6d 64 2c 20 54 43 4c 5f 45 56  rp, pCmd, TCL_EV
4bf0: 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20 20 20  AL_DIRECT);.    
4c00: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
4c10: 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20 20 20 20  nt(pCmd);.      
4c20: 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28  Tcl_ResetResult(
4c30: 70 44 62 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20  pDb->interp);.  
4c40: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4c50: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
4c60: 5f 54 52 41 43 45 5f 52 4f 57 3a 20 7b 0a 20 20  _TRACE_ROW: {.  
4c70: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
4c80: 20 2a 70 53 74 6d 74 20 3d 20 28 73 71 6c 69 74   *pStmt = (sqlit
4c90: 65 33 5f 73 74 6d 74 20 2a 29 70 64 3b 0a 0a 20  e3_stmt *)pd;.. 
4ca0: 20 20 20 20 20 70 43 6d 64 20 3d 20 54 63 6c 5f       pCmd = Tcl_
4cb0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 44 62  NewStringObj(pDb
4cc0: 2d 3e 7a 54 72 61 63 65 56 32 2c 20 2d 31 29 3b  ->zTraceV2, -1);
4cd0: 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  .      Tcl_IncrR
4ce0: 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20  efCount(pCmd);. 
4cf0: 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a       Tcl_ListObj
4d00: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70 44  AppendElement(pD
4d10: 62 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c  b->interp, pCmd,
4d20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d40: 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62  Tcl_NewWideIntOb
4d50: 6a 28 28 54 63 6c 5f 57 69 64 65 49 6e 74 29 70  j((Tcl_WideInt)p
4d60: 53 74 6d 74 29 29 3b 0a 20 20 20 20 20 20 54 63  Stmt));.      Tc
4d70: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d  l_EvalObjEx(pDb-
4d80: 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54  >interp, pCmd, T
4d90: 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b  CL_EVAL_DIRECT);
4da0: 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52  .      Tcl_DecrR
4db0: 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20  efCount(pCmd);. 
4dc0: 20 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65       Tcl_ResetRe
4dd0: 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70  sult(pDb->interp
4de0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
4df0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
4e00: 51 4c 49 54 45 5f 54 52 41 43 45 5f 43 4c 4f 53  QLITE_TRACE_CLOS
4e10: 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E: {.      sqlit
4e20: 65 33 20 2a 64 62 20 3d 20 28 73 71 6c 69 74 65  e3 *db = (sqlite
4e30: 33 20 2a 29 70 64 3b 0a 0a 20 20 20 20 20 20 70  3 *)pd;..      p
4e40: 43 6d 64 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72  Cmd = Tcl_NewStr
4e50: 69 6e 67 4f 62 6a 28 70 44 62 2d 3e 7a 54 72 61  ingObj(pDb->zTra
4e60: 63 65 56 32 2c 20 2d 31 29 3b 0a 20 20 20 20 20  ceV2, -1);.     
4e70: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
4e80: 74 28 70 43 6d 64 29 3b 0a 20 20 20 20 20 20 54  t(pCmd);.      T
4e90: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
4ea0: 45 6c 65 6d 65 6e 74 28 70 44 62 2d 3e 69 6e 74  Element(pDb->int
4eb0: 65 72 70 2c 20 70 43 6d 64 2c 0a 20 20 20 20 20  erp, pCmd,.     
4ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ed0: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4e 65            Tcl_Ne
4ee0: 77 57 69 64 65 49 6e 74 4f 62 6a 28 28 54 63 6c  wWideIntObj((Tcl
4ef0: 5f 57 69 64 65 49 6e 74 29 64 62 29 29 3b 0a 20  _WideInt)db));. 
4f00: 20 20 20 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a       Tcl_EvalObj
4f10: 45 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20  Ex(pDb->interp, 
4f20: 70 43 6d 64 2c 20 54 43 4c 5f 45 56 41 4c 5f 44  pCmd, TCL_EVAL_D
4f30: 49 52 45 43 54 29 3b 0a 20 20 20 20 20 20 54 63  IRECT);.      Tc
4f40: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
4f50: 43 6d 64 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f  Cmd);.      Tcl_
4f60: 52 65 73 65 74 52 65 73 75 6c 74 28 70 44 62 2d  ResetResult(pDb-
4f70: 3e 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 20 20  >interp);.      
4f80: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
4f90: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
4fa0: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  _OK;.}.#endif..#
4fb0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
4fc0: 49 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 54  IT_TRACE./*.** T
4fd0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
4fe0: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 53 51 4c  alled by the SQL
4ff0: 69 74 65 20 70 72 6f 66 69 6c 65 20 68 61 6e 64  ite profile hand
5000: 6c 65 72 20 61 66 74 65 72 20 61 20 73 74 61 74  ler after a stat
5010: 65 6d 65 6e 74 0a 2a 2a 20 53 51 4c 20 68 61 73  ement.** SQL has
5020: 20 65 78 65 63 75 74 65 64 2e 20 20 54 68 65 20   executed.  The 
5030: 54 43 4c 20 73 63 72 69 70 74 20 69 6e 20 70 44  TCL script in pD
5040: 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 69 73 20 65  b->zProfile is e
5050: 76 61 6c 75 61 74 65 64 2e 0a 2a 2f 0a 73 74 61  valuated..*/.sta
5060: 74 69 63 20 76 6f 69 64 20 44 62 50 72 6f 66 69  tic void DbProfi
5070: 6c 65 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a  leHandler(void *
5080: 63 64 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  cd, const char *
5090: 7a 53 71 6c 2c 20 73 71 6c 69 74 65 5f 75 69 6e  zSql, sqlite_uin
50a0: 74 36 34 20 74 6d 29 7b 0a 20 20 53 71 6c 69 74  t64 tm){.  Sqlit
50b0: 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69  eDb *pDb = (Sqli
50c0: 74 65 44 62 2a 29 63 64 3b 0a 20 20 54 63 6c 5f  teDb*)cd;.  Tcl_
50d0: 44 53 74 72 69 6e 67 20 73 74 72 3b 0a 20 20 63  DString str;.  c
50e0: 68 61 72 20 7a 54 6d 5b 31 30 30 5d 3b 0a 0a 20  har zTm[100];.. 
50f0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
5100: 66 28 73 69 7a 65 6f 66 28 7a 54 6d 29 2d 31 2c  f(sizeof(zTm)-1,
5110: 20 7a 54 6d 2c 20 22 25 6c 6c 64 22 2c 20 74 6d   zTm, "%lld", tm
5120: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
5130: 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 54 63  Init(&str);.  Tc
5140: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28  l_DStringAppend(
5150: 26 73 74 72 2c 20 70 44 62 2d 3e 7a 50 72 6f 66  &str, pDb->zProf
5160: 69 6c 65 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f  ile, -1);.  Tcl_
5170: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65  DStringAppendEle
5180: 6d 65 6e 74 28 26 73 74 72 2c 20 7a 53 71 6c 29  ment(&str, zSql)
5190: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41  ;.  Tcl_DStringA
51a0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74  ppendElement(&st
51b0: 72 2c 20 7a 54 6d 29 3b 0a 20 20 54 63 6c 5f 45  r, zTm);.  Tcl_E
51c0: 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c  val(pDb->interp,
51d0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75   Tcl_DStringValu
51e0: 65 28 26 73 74 72 29 29 3b 0a 20 20 54 63 6c 5f  e(&str));.  Tcl_
51f0: 44 53 74 72 69 6e 67 46 72 65 65 28 26 73 74 72  DStringFree(&str
5200: 29 3b 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65  );.  Tcl_ResetRe
5210: 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70  sult(pDb->interp
5220: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
5230: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
5240: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  is called when a
5250: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
5260: 63 6f 6d 6d 69 74 74 65 64 2e 20 20 54 68 65 0a  committed.  The.
5270: 2a 2a 20 54 43 4c 20 73 63 72 69 70 74 20 69 6e  ** TCL script in
5280: 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 69 73   pDb->zCommit is
5290: 20 65 78 65 63 75 74 65 64 2e 20 20 49 66 20 69   executed.  If i
52a0: 74 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65  t returns non-ze
52b0: 72 6f 20 6f 72 0a 2a 2a 20 69 66 20 69 74 20 74  ro or.** if it t
52c0: 68 72 6f 77 73 20 61 6e 20 65 78 63 65 70 74 69  hrows an excepti
52d0: 6f 6e 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74  on, the transact
52e0: 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
52f0: 63 6b 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66  ck instead.** of
5300: 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64   being committed
5310: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5320: 44 62 43 6f 6d 6d 69 74 48 61 6e 64 6c 65 72 28  DbCommitHandler(
5330: 76 6f 69 64 20 2a 63 64 29 7b 0a 20 20 53 71 6c  void *cd){.  Sql
5340: 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71  iteDb *pDb = (Sq
5350: 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69 6e  liteDb*)cd;.  in
5360: 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 54 63  t rc;..  rc = Tc
5370: 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65  l_Eval(pDb->inte
5380: 72 70 2c 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74  rp, pDb->zCommit
5390: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c  );.  if( rc!=TCL
53a0: 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28 54 63 6c 5f  _OK || atoi(Tcl_
53b0: 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28  GetStringResult(
53c0: 70 44 62 2d 3e 69 6e 74 65 72 70 29 29 20 29 7b  pDb->interp)) ){
53d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
53e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
53f0: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 44 62  ..static void Db
5400: 52 6f 6c 6c 62 61 63 6b 48 61 6e 64 6c 65 72 28  RollbackHandler(
5410: 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61  void *clientData
5420: 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  ){.  SqliteDb *p
5430: 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29  Db = (SqliteDb*)
5440: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 61 73  clientData;.  as
5450: 73 65 72 74 28 70 44 62 2d 3e 70 52 6f 6c 6c 62  sert(pDb->pRollb
5460: 61 63 6b 48 6f 6f 6b 29 3b 0a 20 20 69 66 28 20  ackHook);.  if( 
5470: 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 45 76 61 6c  TCL_OK!=Tcl_Eval
5480: 4f 62 6a 45 78 28 70 44 62 2d 3e 69 6e 74 65 72  ObjEx(pDb->inter
5490: 70 2c 20 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63  p, pDb->pRollbac
54a0: 6b 48 6f 6f 6b 2c 20 30 29 20 29 7b 0a 20 20 20  kHook, 0) ){.   
54b0: 20 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45   Tcl_BackgroundE
54c0: 72 72 6f 72 28 70 44 62 2d 3e 69 6e 74 65 72 70  rror(pDb->interp
54d0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
54e0: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 68  This procedure h
54f0: 61 6e 64 6c 65 73 20 77 61 6c 5f 68 6f 6f 6b 20  andles wal_hook 
5500: 63 61 6c 6c 62 61 63 6b 73 2e 0a 2a 2f 0a 73 74  callbacks..*/.st
5510: 61 74 69 63 20 69 6e 74 20 44 62 57 61 6c 48 61  atic int DbWalHa
5520: 6e 64 6c 65 72 28 0a 20 20 76 6f 69 64 20 2a 63  ndler(.  void *c
5530: 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 73 71 6c  lientData,.  sql
5540: 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73  ite3 *db,.  cons
5550: 74 20 63 68 61 72 20 2a 7a 44 62 2c 0a 20 20 69  t char *zDb,.  i
5560: 6e 74 20 6e 45 6e 74 72 79 0a 29 7b 0a 20 20 69  nt nEntry.){.  i
5570: 6e 74 20 72 65 74 20 3d 20 53 51 4c 49 54 45 5f  nt ret = SQLITE_
5580: 4f 4b 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  OK;.  Tcl_Obj *p
5590: 3b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  ;.  SqliteDb *pD
55a0: 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63  b = (SqliteDb*)c
55b0: 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 54 63 6c  lientData;.  Tcl
55c0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 20  _Interp *interp 
55d0: 3d 20 70 44 62 2d 3e 69 6e 74 65 72 70 3b 0a 20  = pDb->interp;. 
55e0: 20 61 73 73 65 72 74 28 70 44 62 2d 3e 70 57 61   assert(pDb->pWa
55f0: 6c 48 6f 6f 6b 29 3b 0a 0a 20 20 61 73 73 65 72  lHook);..  asser
5600: 74 28 20 64 62 3d 3d 70 44 62 2d 3e 64 62 20 29  t( db==pDb->db )
5610: 3b 0a 20 20 70 20 3d 20 54 63 6c 5f 44 75 70 6c  ;.  p = Tcl_Dupl
5620: 69 63 61 74 65 4f 62 6a 28 70 44 62 2d 3e 70 57  icateObj(pDb->pW
5630: 61 6c 48 6f 6f 6b 29 3b 0a 20 20 54 63 6c 5f 49  alHook);.  Tcl_I
5640: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 29 3b 0a  ncrRefCount(p);.
5650: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
5660: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
5670: 70 2c 20 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72  p, p, Tcl_NewStr
5680: 69 6e 67 4f 62 6a 28 7a 44 62 2c 20 2d 31 29 29  ingObj(zDb, -1))
5690: 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
56a0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
56b0: 65 72 70 2c 20 70 2c 20 54 63 6c 5f 4e 65 77 49  erp, p, Tcl_NewI
56c0: 6e 74 4f 62 6a 28 6e 45 6e 74 72 79 29 29 3b 0a  ntObj(nEntry));.
56d0: 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63    if( TCL_OK!=Tc
56e0: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65  l_EvalObjEx(inte
56f0: 72 70 2c 20 70 2c 20 30 29 0a 20 20 20 7c 7c 20  rp, p, 0).   || 
5700: 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49  TCL_OK!=Tcl_GetI
5710: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
5720: 2c 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75  , Tcl_GetObjResu
5730: 6c 74 28 69 6e 74 65 72 70 29 2c 20 26 72 65 74  lt(interp), &ret
5740: 29 0a 20 20 29 7b 0a 20 20 20 20 54 63 6c 5f 42  ).  ){.    Tcl_B
5750: 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69  ackgroundError(i
5760: 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 20 20 54 63  nterp);.  }.  Tc
5770: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
5780: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 65 74  );..  return ret
5790: 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  ;.}..#if defined
57a0: 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26  (SQLITE_TEST) &&
57b0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
57c0: 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f  ENABLE_UNLOCK_NO
57d0: 54 49 46 59 29 0a 73 74 61 74 69 63 20 76 6f 69  TIFY).static voi
57e0: 64 20 73 65 74 54 65 73 74 55 6e 6c 6f 63 6b 4e  d setTestUnlockN
57f0: 6f 74 69 66 79 56 61 72 73 28 54 63 6c 5f 49 6e  otifyVars(Tcl_In
5800: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
5810: 74 20 69 41 72 67 2c 20 69 6e 74 20 6e 41 72 67  t iArg, int nArg
5820: 29 7b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 36  ){.  char zBuf[6
5830: 34 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  4];.  sqlite3_sn
5840: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42  printf(sizeof(zB
5850: 75 66 29 2c 20 7a 42 75 66 2c 20 22 25 64 22 2c  uf), zBuf, "%d",
5860: 20 69 41 72 67 29 3b 0a 20 20 54 63 6c 5f 53 65   iArg);.  Tcl_Se
5870: 74 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71  tVar(interp, "sq
5880: 6c 69 74 65 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69  lite_unlock_noti
5890: 66 79 5f 61 72 67 22 2c 20 7a 42 75 66 2c 20 54  fy_arg", zBuf, T
58a0: 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b  CL_GLOBAL_ONLY);
58b0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
58c0: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29  ntf(sizeof(zBuf)
58d0: 2c 20 7a 42 75 66 2c 20 22 25 64 22 2c 20 6e 41  , zBuf, "%d", nA
58e0: 72 67 29 3b 0a 20 20 54 63 6c 5f 53 65 74 56 61  rg);.  Tcl_SetVa
58f0: 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
5900: 65 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 5f  e_unlock_notify_
5910: 61 72 67 63 6f 75 6e 74 22 2c 20 7a 42 75 66 2c  argcount", zBuf,
5920: 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59   TCL_GLOBAL_ONLY
5930: 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  );.}.#else.# def
5940: 69 6e 65 20 73 65 74 54 65 73 74 55 6e 6c 6f 63  ine setTestUnloc
5950: 6b 4e 6f 74 69 66 79 56 61 72 73 28 78 2c 79 2c  kNotifyVars(x,y,
5960: 7a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  z).#endif..#ifde
5970: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
5980: 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 0a 73 74  UNLOCK_NOTIFY.st
5990: 61 74 69 63 20 76 6f 69 64 20 44 62 55 6e 6c 6f  atic void DbUnlo
59a0: 63 6b 4e 6f 74 69 66 79 28 76 6f 69 64 20 2a 2a  ckNotify(void **
59b0: 61 70 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 29  apArg, int nArg)
59c0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
59d0: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
59e0: 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e  +){.    const in
59f0: 74 20 66 6c 61 67 73 20 3d 20 28 54 43 4c 5f 45  t flags = (TCL_E
5a00: 56 41 4c 5f 47 4c 4f 42 41 4c 7c 54 43 4c 5f 45  VAL_GLOBAL|TCL_E
5a10: 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20 20  VAL_DIRECT);.   
5a20: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
5a30: 20 28 53 71 6c 69 74 65 44 62 20 2a 29 61 70 41   (SqliteDb *)apA
5a40: 72 67 5b 69 5d 3b 0a 20 20 20 20 73 65 74 54 65  rg[i];.    setTe
5a50: 73 74 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 56 61  stUnlockNotifyVa
5a60: 72 73 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20  rs(pDb->interp, 
5a70: 69 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 61 73  i, nArg);.    as
5a80: 73 65 72 74 28 20 70 44 62 2d 3e 70 55 6e 6c 6f  sert( pDb->pUnlo
5a90: 63 6b 4e 6f 74 69 66 79 29 3b 0a 20 20 20 20 54  ckNotify);.    T
5aa0: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62  cl_EvalObjEx(pDb
5ab0: 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 70  ->interp, pDb->p
5ac0: 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 2c 20 66 6c  UnlockNotify, fl
5ad0: 61 67 73 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65  ags);.    Tcl_De
5ae0: 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e  crRefCount(pDb->
5af0: 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 29 3b 0a  pUnlockNotify);.
5b00: 20 20 20 20 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b      pDb->pUnlock
5b10: 4e 6f 74 69 66 79 20 3d 20 30 3b 0a 20 20 7d 0a  Notify = 0;.  }.
5b20: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
5b30: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50   SQLITE_ENABLE_P
5b40: 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 2f 2a  REUPDATE_HOOK./*
5b50: 0a 2a 2a 20 50 72 65 2d 75 70 64 61 74 65 20 68  .** Pre-update h
5b60: 6f 6f 6b 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f  ook callback..*/
5b70: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 44 62 50  .static void DbP
5b80: 72 65 55 70 64 61 74 65 48 61 6e 64 6c 65 72 28  reUpdateHandler(
5b90: 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 73 71  .  void *p,.  sq
5ba0: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 69 6e 74  lite3 *db,.  int
5bb0: 20 6f 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61   op,.  const cha
5bc0: 72 20 2a 7a 44 62 2c 0a 20 20 63 6f 6e 73 74 20  r *zDb,.  const 
5bd0: 63 68 61 72 20 2a 7a 54 62 6c 2c 0a 20 20 73 71  char *zTbl,.  sq
5be0: 6c 69 74 65 5f 69 6e 74 36 34 20 69 4b 65 79 31  lite_int64 iKey1
5bf0: 2c 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34  ,.  sqlite_int64
5c00: 20 69 4b 65 79 32 0a 29 7b 0a 20 20 53 71 6c 69   iKey2.){.  Sqli
5c10: 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c  teDb *pDb = (Sql
5c20: 69 74 65 44 62 20 2a 29 70 3b 0a 20 20 54 63 6c  iteDb *)p;.  Tcl
5c30: 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 20 20 73 74  _Obj *pCmd;.  st
5c40: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
5c50: 2a 61 7a 53 74 72 5b 5d 20 3d 20 7b 22 44 45 4c  *azStr[] = {"DEL
5c60: 45 54 45 22 2c 20 22 49 4e 53 45 52 54 22 2c 20  ETE", "INSERT", 
5c70: 22 55 50 44 41 54 45 22 7d 3b 0a 0a 20 20 61 73  "UPDATE"};..  as
5c80: 73 65 72 74 28 20 28 53 51 4c 49 54 45 5f 44 45  sert( (SQLITE_DE
5c90: 4c 45 54 45 2d 31 29 2f 39 20 3d 3d 20 30 20 29  LETE-1)/9 == 0 )
5ca0: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 53 51 4c  ;.  assert( (SQL
5cb0: 49 54 45 5f 49 4e 53 45 52 54 2d 31 29 2f 39 20  ITE_INSERT-1)/9 
5cc0: 3d 3d 20 31 20 29 3b 0a 20 20 61 73 73 65 72 74  == 1 );.  assert
5cd0: 28 20 28 53 51 4c 49 54 45 5f 55 50 44 41 54 45  ( (SQLITE_UPDATE
5ce0: 2d 31 29 2f 39 20 3d 3d 20 32 20 29 3b 0a 20 20  -1)/9 == 2 );.  
5cf0: 61 73 73 65 72 74 28 20 70 44 62 2d 3e 70 50 72  assert( pDb->pPr
5d00: 65 55 70 64 61 74 65 48 6f 6f 6b 20 29 3b 0a 20  eUpdateHook );. 
5d10: 20 61 73 73 65 72 74 28 20 64 62 3d 3d 70 44 62   assert( db==pDb
5d20: 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65 72 74  ->db );.  assert
5d30: 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 53  ( op==SQLITE_INS
5d40: 45 52 54 20 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54  ERT || op==SQLIT
5d50: 45 5f 55 50 44 41 54 45 20 7c 7c 20 6f 70 3d 3d  E_UPDATE || op==
5d60: 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 20 29 3b  SQLITE_DELETE );
5d70: 0a 0a 20 20 70 43 6d 64 20 3d 20 54 63 6c 5f 44  ..  pCmd = Tcl_D
5d80: 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 44 62 2d  uplicateObj(pDb-
5d90: 3e 70 50 72 65 55 70 64 61 74 65 48 6f 6f 6b 29  >pPreUpdateHook)
5da0: 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43  ;.  Tcl_IncrRefC
5db0: 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 54 63  ount(pCmd);.  Tc
5dc0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
5dd0: 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20  lement(0, pCmd, 
5de0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
5df0: 28 61 7a 53 74 72 5b 28 6f 70 2d 31 29 2f 39 5d  (azStr[(op-1)/9]
5e00: 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
5e10: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
5e20: 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f  nt(0, pCmd, Tcl_
5e30: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 44 62  NewStringObj(zDb
5e40: 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
5e50: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
5e60: 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f  nt(0, pCmd, Tcl_
5e70: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54 62  NewStringObj(zTb
5e80: 6c 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c  l, -1));.  Tcl_L
5e90: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
5ea0: 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c  ent(0, pCmd, Tcl
5eb0: 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 69  _NewWideIntObj(i
5ec0: 4b 65 79 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  Key1));.  Tcl_Li
5ed0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
5ee0: 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f  nt(0, pCmd, Tcl_
5ef0: 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 69 4b  NewWideIntObj(iK
5f00: 65 79 32 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61  ey2));.  Tcl_Eva
5f10: 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69 6e 74 65  lObjEx(pDb->inte
5f20: 72 70 2c 20 70 43 6d 64 2c 20 54 43 4c 5f 45 56  rp, pCmd, TCL_EV
5f30: 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20 54 63  AL_DIRECT);.  Tc
5f40: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
5f50: 43 6d 64 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  Cmd);.}.#endif /
5f60: 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
5f70: 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 20 2a  PREUPDATE_HOOK *
5f80: 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 44  /..static void D
5f90: 62 55 70 64 61 74 65 48 61 6e 64 6c 65 72 28 0a  bUpdateHandler(.
5fa0: 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 69 6e 74    void *p,.  int
5fb0: 20 6f 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61   op,.  const cha
5fc0: 72 20 2a 7a 44 62 2c 0a 20 20 63 6f 6e 73 74 20  r *zDb,.  const 
5fd0: 63 68 61 72 20 2a 7a 54 62 6c 2c 0a 20 20 73 71  char *zTbl,.  sq
5fe0: 6c 69 74 65 5f 69 6e 74 36 34 20 72 6f 77 69 64  lite_int64 rowid
5ff0: 0a 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  .){.  SqliteDb *
6000: 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 20  pDb = (SqliteDb 
6010: 2a 29 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  *)p;.  Tcl_Obj *
6020: 70 43 6d 64 3b 0a 20 20 73 74 61 74 69 63 20 63  pCmd;.  static c
6030: 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 53 74 72  onst char *azStr
6040: 5b 5d 20 3d 20 7b 22 44 45 4c 45 54 45 22 2c 20  [] = {"DELETE", 
6050: 22 49 4e 53 45 52 54 22 2c 20 22 55 50 44 41 54  "INSERT", "UPDAT
6060: 45 22 7d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  E"};..  assert( 
6070: 28 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2d 31  (SQLITE_DELETE-1
6080: 29 2f 39 20 3d 3d 20 30 20 29 3b 0a 20 20 61 73  )/9 == 0 );.  as
6090: 73 65 72 74 28 20 28 53 51 4c 49 54 45 5f 49 4e  sert( (SQLITE_IN
60a0: 53 45 52 54 2d 31 29 2f 39 20 3d 3d 20 31 20 29  SERT-1)/9 == 1 )
60b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 53 51 4c  ;.  assert( (SQL
60c0: 49 54 45 5f 55 50 44 41 54 45 2d 31 29 2f 39 20  ITE_UPDATE-1)/9 
60d0: 3d 3d 20 32 20 29 3b 0a 0a 20 20 61 73 73 65 72  == 2 );..  asser
60e0: 74 28 20 70 44 62 2d 3e 70 55 70 64 61 74 65 48  t( pDb->pUpdateH
60f0: 6f 6f 6b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ook );.  assert(
6100: 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 53 45   op==SQLITE_INSE
6110: 52 54 20 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54 45  RT || op==SQLITE
6120: 5f 55 50 44 41 54 45 20 7c 7c 20 6f 70 3d 3d 53  _UPDATE || op==S
6130: 51 4c 49 54 45 5f 44 45 4c 45 54 45 20 29 3b 0a  QLITE_DELETE );.
6140: 0a 20 20 70 43 6d 64 20 3d 20 54 63 6c 5f 44 75  .  pCmd = Tcl_Du
6150: 70 6c 69 63 61 74 65 4f 62 6a 28 70 44 62 2d 3e  plicateObj(pDb->
6160: 70 55 70 64 61 74 65 48 6f 6f 6b 29 3b 0a 20 20  pUpdateHook);.  
6170: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
6180: 28 70 43 6d 64 29 3b 0a 20 20 54 63 6c 5f 4c 69  (pCmd);.  Tcl_Li
6190: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
61a0: 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f  nt(0, pCmd, Tcl_
61b0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 61 7a 53  NewStringObj(azS
61c0: 74 72 5b 28 6f 70 2d 31 29 2f 39 5d 2c 20 2d 31  tr[(op-1)/9], -1
61d0: 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
61e0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
61f0: 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53  , pCmd, Tcl_NewS
6200: 74 72 69 6e 67 4f 62 6a 28 7a 44 62 2c 20 2d 31  tringObj(zDb, -1
6210: 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
6220: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
6230: 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53  , pCmd, Tcl_NewS
6240: 74 72 69 6e 67 4f 62 6a 28 7a 54 62 6c 2c 20 2d  tringObj(zTbl, -
6250: 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  1));.  Tcl_ListO
6260: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
6270: 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77  0, pCmd, Tcl_New
6280: 57 69 64 65 49 6e 74 4f 62 6a 28 72 6f 77 69 64  WideIntObj(rowid
6290: 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62  ));.  Tcl_EvalOb
62a0: 6a 45 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c  jEx(pDb->interp,
62b0: 20 70 43 6d 64 2c 20 54 43 4c 5f 45 56 41 4c 5f   pCmd, TCL_EVAL_
62c0: 44 49 52 45 43 54 29 3b 0a 20 20 54 63 6c 5f 44  DIRECT);.  Tcl_D
62d0: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64  ecrRefCount(pCmd
62e0: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
62f0: 64 20 74 63 6c 43 6f 6c 6c 61 74 65 4e 65 65 64  d tclCollateNeed
6300: 65 64 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78  ed(.  void *pCtx
6310: 2c 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  ,.  sqlite3 *db,
6320: 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 63 6f  .  int enc,.  co
6330: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a  nst char *zName.
6340: 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  ){.  SqliteDb *p
6350: 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 20 2a  Db = (SqliteDb *
6360: 29 70 43 74 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a  )pCtx;.  Tcl_Obj
6370: 20 2a 70 53 63 72 69 70 74 20 3d 20 54 63 6c 5f   *pScript = Tcl_
6380: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 44 62  DuplicateObj(pDb
6390: 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64  ->pCollateNeeded
63a0: 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  );.  Tcl_IncrRef
63b0: 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a  Count(pScript);.
63c0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
63d0: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 53  endElement(0, pS
63e0: 63 72 69 70 74 2c 20 54 63 6c 5f 4e 65 77 53 74  cript, Tcl_NewSt
63f0: 72 69 6e 67 4f 62 6a 28 7a 4e 61 6d 65 2c 20 2d  ringObj(zName, -
6400: 31 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f  1));.  Tcl_EvalO
6410: 62 6a 45 78 28 70 44 62 2d 3e 69 6e 74 65 72 70  bjEx(pDb->interp
6420: 2c 20 70 53 63 72 69 70 74 2c 20 30 29 3b 0a 20  , pScript, 0);. 
6430: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
6440: 74 28 70 53 63 72 69 70 74 29 3b 0a 7d 0a 0a 2f  t(pScript);.}../
6450: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
6460: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 65  e is called to e
6470: 76 61 6c 75 61 74 65 20 61 6e 20 53 51 4c 20 63  valuate an SQL c
6480: 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f  ollation functio
6490: 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a  n implemented.**
64a0: 20 75 73 69 6e 67 20 54 43 4c 20 73 63 72 69 70   using TCL scrip
64b0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
64c0: 20 74 63 6c 53 71 6c 43 6f 6c 6c 61 74 65 28 0a   tclSqlCollate(.
64d0: 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 0a 20 20    void *pCtx,.  
64e0: 69 6e 74 20 6e 41 2c 0a 20 20 63 6f 6e 73 74 20  int nA,.  const 
64f0: 76 6f 69 64 20 2a 7a 41 2c 0a 20 20 69 6e 74 20  void *zA,.  int 
6500: 6e 42 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  nB,.  const void
6510: 20 2a 7a 42 0a 29 7b 0a 20 20 53 71 6c 43 6f 6c   *zB.){.  SqlCol
6520: 6c 61 74 65 20 2a 70 20 3d 20 28 53 71 6c 43 6f  late *p = (SqlCo
6530: 6c 6c 61 74 65 20 2a 29 70 43 74 78 3b 0a 20 20  llate *)pCtx;.  
6540: 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 0a  Tcl_Obj *pCmd;..
6550: 20 20 70 43 6d 64 20 3d 20 54 63 6c 5f 4e 65 77    pCmd = Tcl_New
6560: 53 74 72 69 6e 67 4f 62 6a 28 70 2d 3e 7a 53 63  StringObj(p->zSc
6570: 72 69 70 74 2c 20 2d 31 29 3b 0a 20 20 54 63 6c  ript, -1);.  Tcl
6580: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43  _IncrRefCount(pC
6590: 6d 64 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  md);.  Tcl_ListO
65a0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
65b0: 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c  p->interp, pCmd,
65c0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
65d0: 6a 28 7a 41 2c 20 6e 41 29 29 3b 0a 20 20 54 63  j(zA, nA));.  Tc
65e0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
65f0: 6c 65 6d 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70  lement(p->interp
6600: 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53  , pCmd, Tcl_NewS
6610: 74 72 69 6e 67 4f 62 6a 28 7a 42 2c 20 6e 42 29  tringObj(zB, nB)
6620: 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  );.  Tcl_EvalObj
6630: 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43  Ex(p->interp, pC
6640: 6d 64 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52  md, TCL_EVAL_DIR
6650: 45 43 54 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72  ECT);.  Tcl_Decr
6660: 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a  RefCount(pCmd);.
6670: 20 20 72 65 74 75 72 6e 20 28 61 74 6f 69 28 54    return (atoi(T
6680: 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
6690: 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 29 29 3b  lt(p->interp)));
66a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
66b0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
66c0: 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20   to evaluate an 
66d0: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70  SQL function imp
66e0: 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 75 73 69 6e  lemented.** usin
66f0: 67 20 54 43 4c 20 73 63 72 69 70 74 2e 0a 2a 2f  g TCL script..*/
6700: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 63 6c  .static void tcl
6710: 53 71 6c 46 75 6e 63 28 73 71 6c 69 74 65 33 5f  SqlFunc(sqlite3_
6720: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
6730: 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69  , int argc, sqli
6740: 74 65 33 5f 76 61 6c 75 65 2a 2a 61 72 67 76 29  te3_value**argv)
6750: 7b 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70 20 3d  {.  SqlFunc *p =
6760: 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61   sqlite3_user_da
6770: 74 61 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 54  ta(context);.  T
6780: 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 20 20  cl_Obj *pCmd;.  
6790: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b  int i;.  int rc;
67a0: 0a 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 30 20  ..  if( argc==0 
67b0: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
67c0: 72 65 20 61 72 65 20 6e 6f 20 61 72 67 75 6d 65  re are no argume
67d0: 6e 74 73 20 74 6f 20 74 68 65 20 66 75 6e 63 74  nts to the funct
67e0: 69 6f 6e 2c 20 63 61 6c 6c 20 54 63 6c 5f 45 76  ion, call Tcl_Ev
67f0: 61 6c 4f 62 6a 45 78 20 6f 6e 20 74 68 65 0a 20  alObjEx on the. 
6800: 20 20 20 2a 2a 20 73 63 72 69 70 74 20 6f 62 6a     ** script obj
6810: 65 63 74 20 64 69 72 65 63 74 6c 79 2e 20 20 54  ect directly.  T
6820: 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 54  his allows the T
6830: 43 4c 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20 67  CL compiler to g
6840: 65 6e 65 72 61 74 65 0a 20 20 20 20 2a 2a 20 62  enerate.    ** b
6850: 79 74 65 63 6f 64 65 20 66 6f 72 20 74 68 65 20  ytecode for the 
6860: 63 6f 6d 6d 61 6e 64 20 6f 6e 20 74 68 65 20 66  command on the f
6870: 69 72 73 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20  irst invocation 
6880: 61 6e 64 20 74 68 75 73 20 6d 61 6b 65 0a 20 20  and thus make.  
6890: 20 20 2a 2a 20 73 75 62 73 65 71 75 65 6e 74 20    ** subsequent 
68a0: 69 6e 76 6f 63 61 74 69 6f 6e 73 20 6d 75 63 68  invocations much
68b0: 20 66 61 73 74 65 72 2e 20 2a 2f 0a 20 20 20 20   faster. */.    
68c0: 70 43 6d 64 20 3d 20 70 2d 3e 70 53 63 72 69 70  pCmd = p->pScrip
68d0: 74 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  t;.    Tcl_IncrR
68e0: 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20  efCount(pCmd);. 
68f0: 20 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c     rc = Tcl_Eval
6900: 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c  ObjEx(p->interp,
6910: 20 70 43 6d 64 2c 20 30 29 3b 0a 20 20 20 20 54   pCmd, 0);.    T
6920: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
6930: 70 43 6d 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pCmd);.  }else{.
6940: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
6950: 61 72 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  are arguments to
6960: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2c 20 6d   the function, m
6970: 61 6b 65 20 61 20 73 68 61 6c 6c 6f 77 20 63 6f  ake a shallow co
6980: 70 79 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  py of the.    **
6990: 20 73 63 72 69 70 74 20 6f 62 6a 65 63 74 2c 20   script object, 
69a0: 6c 61 70 70 65 6e 64 20 74 68 65 20 61 72 67 75  lappend the argu
69b0: 6d 65 6e 74 73 2c 20 74 68 65 6e 20 65 76 61 6c  ments, then eval
69c0: 75 61 74 65 20 74 68 65 20 63 6f 70 79 2e 0a 20  uate the copy.. 
69d0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 42 79 20     **.    ** By 
69e0: 22 73 68 61 6c 6c 6f 77 22 20 63 6f 70 79 2c 20  "shallow" copy, 
69f0: 77 65 20 6d 65 61 6e 20 6f 6e 6c 79 20 74 68 65  we mean only the
6a00: 20 6f 75 74 65 72 20 6c 69 73 74 20 54 63 6c 5f   outer list Tcl_
6a10: 4f 62 6a 20 69 73 20 64 75 70 6c 69 63 61 74 65  Obj is duplicate
6a20: 64 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6e 65  d..    ** The ne
6a30: 77 20 54 63 6c 5f 4f 62 6a 20 63 6f 6e 74 61 69  w Tcl_Obj contai
6a40: 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74  ns pointers to t
6a50: 68 65 20 6f 72 69 67 69 6e 61 6c 20 6c 69 73 74  he original list
6a60: 20 65 6c 65 6d 65 6e 74 73 2e 0a 20 20 20 20 2a   elements..    *
6a70: 2a 20 54 68 61 74 20 77 61 79 2c 20 77 68 65 6e  * That way, when
6a80: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20   Tcl_EvalObjv() 
6a90: 69 73 20 72 75 6e 20 61 6e 64 20 73 68 69 6d 6d  is run and shimm
6aa0: 65 72 73 20 74 68 65 20 66 69 72 73 74 20 65 6c  ers the first el
6ab0: 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 6f 66 20  ement.    ** of 
6ac0: 74 68 65 20 6c 69 73 74 20 74 6f 20 74 63 6c 43  the list to tclC
6ad0: 6d 64 4e 61 6d 65 54 79 70 65 2c 20 74 68 61 74  mdNameType, that
6ae0: 20 61 6c 74 65 72 6e 61 74 65 20 72 65 70 72 65   alternate repre
6af0: 73 65 6e 74 61 74 69 6f 6e 20 77 69 6c 6c 0a 20  sentation will. 
6b00: 20 20 20 2a 2a 20 62 65 20 70 72 65 73 65 72 76     ** be preserv
6b10: 65 64 20 61 6e 64 20 72 65 75 73 65 64 20 6f 6e  ed and reused on
6b20: 20 74 68 65 20 6e 65 78 74 20 69 6e 76 6f 63 61   the next invoca
6b30: 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
6b40: 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 41 72 67 3b   Tcl_Obj **aArg;
6b50: 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20  .    int nArg;. 
6b60: 20 20 20 69 66 28 20 54 63 6c 5f 4c 69 73 74 4f     if( Tcl_ListO
6b70: 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 70 2d  bjGetElements(p-
6b80: 3e 69 6e 74 65 72 70 2c 20 70 2d 3e 70 53 63 72  >interp, p->pScr
6b90: 69 70 74 2c 20 26 6e 41 72 67 2c 20 26 61 41 72  ipt, &nArg, &aAr
6ba0: 67 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  g) ){.      sqli
6bb0: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
6bc0: 28 63 6f 6e 74 65 78 74 2c 20 54 63 6c 5f 47 65  (context, Tcl_Ge
6bd0: 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 2d  tStringResult(p-
6be0: 3e 69 6e 74 65 72 70 29 2c 20 2d 31 29 3b 0a 20  >interp), -1);. 
6bf0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
6c00: 20 7d 0a 20 20 20 20 70 43 6d 64 20 3d 20 54 63   }.    pCmd = Tc
6c10: 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 6e 41 72  l_NewListObj(nAr
6c20: 67 2c 20 61 41 72 67 29 3b 0a 20 20 20 20 54 63  g, aArg);.    Tc
6c30: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
6c40: 43 6d 64 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Cmd);.    for(i=
6c50: 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b  0; i<argc; i++){
6c60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  .      sqlite3_v
6c70: 61 6c 75 65 20 2a 70 49 6e 20 3d 20 61 72 67 76  alue *pIn = argv
6c80: 5b 69 5d 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f  [i];.      Tcl_O
6c90: 62 6a 20 2a 70 56 61 6c 3b 0a 0a 20 20 20 20 20  bj *pVal;..     
6ca0: 20 2f 2a 20 53 65 74 20 70 56 61 6c 20 74 6f 20   /* Set pVal to 
6cb0: 63 6f 6e 74 61 69 6e 20 74 68 65 20 69 27 74 68  contain the i'th
6cc0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 69 73 20   column of this 
6cd0: 72 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20 73 77  row. */.      sw
6ce0: 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f 76 61  itch( sqlite3_va
6cf0: 6c 75 65 5f 74 79 70 65 28 70 49 6e 29 20 29 7b  lue_type(pIn) ){
6d00: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51  .        case SQ
6d10: 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20  LITE_BLOB: {.   
6d20: 20 20 20 20 20 20 20 69 6e 74 20 62 79 74 65 73         int bytes
6d30: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
6d40: 5f 62 79 74 65 73 28 70 49 6e 29 3b 0a 20 20 20  _bytes(pIn);.   
6d50: 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63         pVal = Tc
6d60: 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62  l_NewByteArrayOb
6d70: 6a 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  j(sqlite3_value_
6d80: 62 6c 6f 62 28 70 49 6e 29 2c 20 62 79 74 65 73  blob(pIn), bytes
6d90: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
6da0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
6db0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
6dc0: 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20  E_INTEGER: {.   
6dd0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 5f 69 6e         sqlite_in
6de0: 74 36 34 20 76 20 3d 20 73 71 6c 69 74 65 33 5f  t64 v = sqlite3_
6df0: 76 61 6c 75 65 5f 69 6e 74 36 34 28 70 49 6e 29  value_int64(pIn)
6e00: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
6e10: 76 3e 3d 2d 32 31 34 37 34 38 33 36 34 37 20 26  v>=-2147483647 &
6e20: 26 20 76 3c 3d 32 31 34 37 34 38 33 36 34 37 20  & v<=2147483647 
6e30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
6e40: 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 49 6e 74  Val = Tcl_NewInt
6e50: 4f 62 6a 28 28 69 6e 74 29 76 29 3b 0a 20 20 20  Obj((int)v);.   
6e60: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
6e70: 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d            pVal =
6e80: 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f   Tcl_NewWideIntO
6e90: 62 6a 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  bj(v);.         
6ea0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65   }.          bre
6eb0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
6ec0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
6ed0: 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20  E_FLOAT: {.     
6ee0: 20 20 20 20 20 64 6f 75 62 6c 65 20 72 20 3d 20       double r = 
6ef0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f  sqlite3_value_do
6f00: 75 62 6c 65 28 70 49 6e 29 3b 0a 20 20 20 20 20  uble(pIn);.     
6f10: 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f       pVal = Tcl_
6f20: 4e 65 77 44 6f 75 62 6c 65 4f 62 6a 28 72 29 3b  NewDoubleObj(r);
6f30: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
6f40: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6f50: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
6f60: 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20  NULL: {.        
6f70: 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77    pVal = Tcl_New
6f80: 53 74 72 69 6e 67 4f 62 6a 28 70 2d 3e 70 44 62  StringObj(p->pDb
6f90: 2d 3e 7a 4e 75 6c 6c 2c 20 2d 31 29 3b 0a 20 20  ->zNull, -1);.  
6fa0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
6fb0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6fc0: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
6fd0: 20 20 20 20 20 20 69 6e 74 20 62 79 74 65 73 20        int bytes 
6fe0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
6ff0: 62 79 74 65 73 28 70 49 6e 29 3b 0a 20 20 20 20  bytes(pIn);.    
7000: 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c        pVal = Tcl
7010: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63  _NewStringObj((c
7020: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61  har *)sqlite3_va
7030: 6c 75 65 5f 74 65 78 74 28 70 49 6e 29 2c 20 62  lue_text(pIn), b
7040: 79 74 65 73 29 3b 0a 20 20 20 20 20 20 20 20 20  ytes);.         
7050: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
7060: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
7070: 72 63 20 3d 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  rc = Tcl_ListObj
7080: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70 2d  AppendElement(p-
7090: 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 70  >interp, pCmd, p
70a0: 56 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Val);.      if( 
70b0: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  rc ){.        Tc
70c0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
70d0: 43 6d 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Cmd);.        sq
70e0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
70f0: 6f 72 28 63 6f 6e 74 65 78 74 2c 20 54 63 6c 5f  or(context, Tcl_
7100: 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28  GetStringResult(
7110: 70 2d 3e 69 6e 74 65 72 70 29 2c 20 2d 31 29 3b  p->interp), -1);
7120: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b  .        return;
7130: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
7140: 20 20 20 69 66 28 20 21 70 2d 3e 75 73 65 45 76     if( !p->useEv
7150: 61 6c 4f 62 6a 76 20 29 7b 0a 20 20 20 20 20 20  alObjv ){.      
7160: 2f 2a 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78  /* Tcl_EvalObjEx
7170: 28 29 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69  () will automati
7180: 63 61 6c 6c 79 20 63 61 6c 6c 20 54 63 6c 5f 45  cally call Tcl_E
7190: 76 61 6c 4f 62 6a 76 28 29 20 69 66 20 70 43 6d  valObjv() if pCm
71a0: 64 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61 20  d.      ** is a 
71b0: 6c 69 73 74 20 77 69 74 68 6f 75 74 20 61 20 73  list without a s
71c0: 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61  tring representa
71d0: 74 69 6f 6e 2e 20 20 54 6f 20 70 72 65 76 65 6e  tion.  To preven
71e0: 74 20 74 68 69 73 20 66 72 6f 6d 0a 20 20 20 20  t this from.    
71f0: 20 20 2a 2a 20 68 61 70 70 65 6e 69 6e 67 2c 20    ** happening, 
7200: 6d 61 6b 65 20 73 75 72 65 20 70 43 6d 64 20 68  make sure pCmd h
7210: 61 73 20 61 20 76 61 6c 69 64 20 73 74 72 69 6e  as a valid strin
7220: 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  g representation
7230: 20 2a 2f 0a 20 20 20 20 20 20 54 63 6c 5f 47 65   */.      Tcl_Ge
7240: 74 53 74 72 69 6e 67 28 70 43 6d 64 29 3b 0a 20  tString(pCmd);. 
7250: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 54 63     }.    rc = Tc
7260: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69  l_EvalObjEx(p->i
7270: 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 43 4c  nterp, pCmd, TCL
7280: 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20  _EVAL_DIRECT);. 
7290: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
72a0: 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 7d 0a 0a  unt(pCmd);.  }..
72b0: 20 20 69 66 28 20 72 63 20 26 26 20 72 63 21 3d    if( rc && rc!=
72c0: 54 43 4c 5f 52 45 54 55 52 4e 20 29 7b 0a 20 20  TCL_RETURN ){.  
72d0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
72e0: 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20  _error(context, 
72f0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73  Tcl_GetStringRes
7300: 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c 20  ult(p->interp), 
7310: 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  -1);.  }else{.  
7320: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 72 20    Tcl_Obj *pVar 
7330: 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75  = Tcl_GetObjResu
7340: 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 3b 0a 20  lt(p->interp);. 
7350: 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 75 38     int n;.    u8
7360: 20 2a 64 61 74 61 3b 0a 20 20 20 20 63 6f 6e 73   *data;.    cons
7370: 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20  t char *zType = 
7380: 28 70 56 61 72 2d 3e 74 79 70 65 50 74 72 20 3f  (pVar->typePtr ?
7390: 20 70 56 61 72 2d 3e 74 79 70 65 50 74 72 2d 3e   pVar->typePtr->
73a0: 6e 61 6d 65 20 3a 20 22 22 29 3b 0a 20 20 20 20  name : "");.    
73b0: 63 68 61 72 20 63 20 3d 20 7a 54 79 70 65 5b 30  char c = zType[0
73c0: 5d 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 62  ];.    if( c=='b
73d0: 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70  ' && strcmp(zTyp
73e0: 65 2c 22 62 79 74 65 61 72 72 61 79 22 29 3d 3d  e,"bytearray")==
73f0: 30 20 26 26 20 70 56 61 72 2d 3e 62 79 74 65 73  0 && pVar->bytes
7400: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
7410: 4f 6e 6c 79 20 72 65 74 75 72 6e 20 61 20 42 4c  Only return a BL
7420: 4f 42 20 74 79 70 65 20 69 66 20 74 68 65 20 54  OB type if the T
7430: 63 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 61  cl variable is a
7440: 20 62 79 74 65 61 72 72 61 79 20 61 6e 64 0a 20   bytearray and. 
7450: 20 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 20 73       ** has no s
7460: 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61  tring representa
7470: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 64  tion. */.      d
7480: 61 74 61 20 3d 20 54 63 6c 5f 47 65 74 42 79 74  ata = Tcl_GetByt
7490: 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 70 56  eArrayFromObj(pV
74a0: 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 73  ar, &n);.      s
74b0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c  qlite3_result_bl
74c0: 6f 62 28 63 6f 6e 74 65 78 74 2c 20 64 61 74 61  ob(context, data
74d0: 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  , n, SQLITE_TRAN
74e0: 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73  SIENT);.    }els
74f0: 65 20 69 66 28 20 63 3d 3d 27 62 27 20 26 26 20  e if( c=='b' && 
7500: 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 62 6f  strcmp(zType,"bo
7510: 6f 6c 65 61 6e 22 29 3d 3d 30 20 29 7b 0a 20 20  olean")==0 ){.  
7520: 20 20 20 20 54 63 6c 5f 47 65 74 49 6e 74 46 72      Tcl_GetIntFr
7530: 6f 6d 4f 62 6a 28 30 2c 20 70 56 61 72 2c 20 26  omObj(0, pVar, &
7540: 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
7550: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e  3_result_int(con
7560: 74 65 78 74 2c 20 6e 29 3b 0a 20 20 20 20 7d 65  text, n);.    }e
7570: 6c 73 65 20 69 66 28 20 63 3d 3d 27 64 27 20 26  lse if( c=='d' &
7580: 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22  & strcmp(zType,"
7590: 64 6f 75 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20  double")==0 ){. 
75a0: 20 20 20 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20       double r;. 
75b0: 20 20 20 20 20 54 63 6c 5f 47 65 74 44 6f 75 62       Tcl_GetDoub
75c0: 6c 65 46 72 6f 6d 4f 62 6a 28 30 2c 20 70 56 61  leFromObj(0, pVa
75d0: 72 2c 20 26 72 29 3b 0a 20 20 20 20 20 20 73 71  r, &r);.      sq
75e0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75  lite3_result_dou
75f0: 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 72 29 3b  ble(context, r);
7600: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
7610: 63 3d 3d 27 77 27 20 26 26 20 73 74 72 63 6d 70  c=='w' && strcmp
7620: 28 7a 54 79 70 65 2c 22 77 69 64 65 49 6e 74 22  (zType,"wideInt"
7630: 29 3d 3d 30 29 20 7c 7c 0a 20 20 20 20 20 20 20  )==0) ||.       
7640: 20 20 20 28 63 3d 3d 27 69 27 20 26 26 20 73 74     (c=='i' && st
7650: 72 63 6d 70 28 7a 54 79 70 65 2c 22 69 6e 74 22  rcmp(zType,"int"
7660: 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 54  )==0) ){.      T
7670: 63 6c 5f 57 69 64 65 49 6e 74 20 76 3b 0a 20 20  cl_WideInt v;.  
7680: 20 20 20 20 54 63 6c 5f 47 65 74 57 69 64 65 49      Tcl_GetWideI
7690: 6e 74 46 72 6f 6d 4f 62 6a 28 30 2c 20 70 56 61  ntFromObj(0, pVa
76a0: 72 2c 20 26 76 29 3b 0a 20 20 20 20 20 20 73 71  r, &v);.      sq
76b0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
76c0: 36 34 28 63 6f 6e 74 65 78 74 2c 20 76 29 3b 0a  64(context, v);.
76d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
76e0: 20 64 61 74 61 20 3d 20 28 75 6e 73 69 67 6e 65   data = (unsigne
76f0: 64 20 63 68 61 72 20 2a 29 54 63 6c 5f 47 65 74  d char *)Tcl_Get
7700: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 56  StringFromObj(pV
7710: 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 73  ar, &n);.      s
7720: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
7730: 78 74 28 63 6f 6e 74 65 78 74 2c 20 28 63 68 61  xt(context, (cha
7740: 72 20 2a 29 64 61 74 61 2c 20 6e 2c 20 53 51 4c  r *)data, n, SQL
7750: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
7760: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66      }.  }.}..#if
7770: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7780: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 2f  _AUTHORIZATION./
7790: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65  *.** This is the
77a0: 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20   authentication 
77b0: 66 75 6e 63 74 69 6f 6e 2e 20 20 49 74 20 61 70  function.  It ap
77c0: 70 65 6e 64 73 20 74 68 65 20 61 75 74 68 65 6e  pends the authen
77d0: 74 69 63 61 74 69 6f 6e 0a 2a 2a 20 74 79 70 65  tication.** type
77e0: 20 63 6f 64 65 20 61 6e 64 20 74 68 65 20 74 77   code and the tw
77f0: 6f 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 7a  o arguments to z
7800: 43 6d 64 5b 5d 20 74 68 65 6e 20 69 6e 76 6f 6b  Cmd[] then invok
7810: 65 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a  es the result.**
7820: 20 6f 6e 20 74 68 65 20 69 6e 74 65 72 70 72 65   on the interpre
7830: 74 65 72 2e 20 20 54 68 65 20 72 65 70 6c 79 20  ter.  The reply 
7840: 69 73 20 65 78 61 6d 69 6e 65 64 20 74 6f 20 64  is examined to d
7850: 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 0a  etermine if the.
7860: 2a 2a 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f  ** authenticatio
7870: 6e 20 66 61 69 6c 73 20 6f 72 20 73 75 63 63 65  n fails or succe
7880: 65 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  eds..*/.static i
7890: 6e 74 20 61 75 74 68 5f 63 61 6c 6c 62 61 63 6b  nt auth_callback
78a0: 28 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 2c 0a  (.  void *pArg,.
78b0: 20 20 69 6e 74 20 63 6f 64 65 2c 0a 20 20 63 6f    int code,.  co
78c0: 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 31 2c  nst char *zArg1,
78d0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
78e0: 41 72 67 32 2c 0a 20 20 63 6f 6e 73 74 20 63 68  Arg2,.  const ch
78f0: 61 72 20 2a 7a 41 72 67 33 2c 0a 20 20 63 6f 6e  ar *zArg3,.  con
7900: 73 74 20 63 68 61 72 20 2a 7a 41 72 67 34 0a 23  st char *zArg4.#
7910: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 53 45  ifdef SQLITE_USE
7920: 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e  R_AUTHENTICATION
7930: 0a 20 20 2c 63 6f 6e 73 74 20 63 68 61 72 20 2a  .  ,const char *
7940: 7a 41 72 67 35 0a 23 65 6e 64 69 66 0a 29 7b 0a  zArg5.#endif.){.
7950: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
7960: 6f 64 65 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  ode;.  Tcl_DStri
7970: 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74 20 72 63  ng str;.  int rc
7980: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
7990: 7a 52 65 70 6c 79 3b 0a 20 20 53 71 6c 69 74 65  zReply;.  Sqlite
79a0: 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74  Db *pDb = (Sqlit
79b0: 65 44 62 2a 29 70 41 72 67 3b 0a 20 20 69 66 28  eDb*)pArg;.  if(
79c0: 20 70 44 62 2d 3e 64 69 73 61 62 6c 65 41 75 74   pDb->disableAut
79d0: 68 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  h ) return SQLIT
79e0: 45 5f 4f 4b 3b 0a 0a 20 20 73 77 69 74 63 68 28  E_OK;..  switch(
79f0: 20 63 6f 64 65 20 29 7b 0a 20 20 20 20 63 61 73   code ){.    cas
7a00: 65 20 53 51 4c 49 54 45 5f 43 4f 50 59 20 20 20  e SQLITE_COPY   
7a10: 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f             : zCo
7a20: 64 65 3d 22 53 51 4c 49 54 45 5f 43 4f 50 59 22  de="SQLITE_COPY"
7a30: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
7a40: 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  e SQLITE_CREATE_
7a50: 49 4e 44 45 58 20 20 20 20 20 20 3a 20 7a 43 6f  INDEX      : zCo
7a60: 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54  de="SQLITE_CREAT
7a70: 45 5f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b  E_INDEX"; break;
7a80: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
7a90: 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 20 20 20  _CREATE_TABLE   
7aa0: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
7ab0: 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 22  TE_CREATE_TABLE"
7ac0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
7ad0: 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  e SQLITE_CREATE_
7ae0: 54 45 4d 50 5f 49 4e 44 45 58 20 3a 20 7a 43 6f  TEMP_INDEX : zCo
7af0: 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54  de="SQLITE_CREAT
7b00: 45 5f 54 45 4d 50 5f 49 4e 44 45 58 22 3b 20 62  E_TEMP_INDEX"; b
7b10: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
7b20: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
7b30: 50 5f 54 41 42 4c 45 20 3a 20 7a 43 6f 64 65 3d  P_TABLE : zCode=
7b40: 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54  "SQLITE_CREATE_T
7b50: 45 4d 50 5f 54 41 42 4c 45 22 3b 20 62 72 65 61  EMP_TABLE"; brea
7b60: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
7b70: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54  TE_CREATE_TEMP_T
7b80: 52 49 47 47 45 52 3a 20 7a 43 6f 64 65 3d 22 53  RIGGER: zCode="S
7b90: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
7ba0: 50 5f 54 52 49 47 47 45 52 22 3b 20 62 72 65 61  P_TRIGGER"; brea
7bb0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
7bc0: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56  TE_CREATE_TEMP_V
7bd0: 49 45 57 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51  IEW  : zCode="SQ
7be0: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50  LITE_CREATE_TEMP
7bf0: 5f 56 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20  _VIEW"; break;. 
7c00: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
7c10: 52 45 41 54 45 5f 54 52 49 47 47 45 52 20 20 20  REATE_TRIGGER   
7c20: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
7c30: 5f 43 52 45 41 54 45 5f 54 52 49 47 47 45 52 22  _CREATE_TRIGGER"
7c40: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
7c50: 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  e SQLITE_CREATE_
7c60: 56 49 45 57 20 20 20 20 20 20 20 3a 20 7a 43 6f  VIEW       : zCo
7c70: 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54  de="SQLITE_CREAT
7c80: 45 5f 56 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a  E_VIEW"; break;.
7c90: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
7ca0: 44 45 4c 45 54 45 20 20 20 20 20 20 20 20 20 20  DELETE          
7cb0: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
7cc0: 45 5f 44 45 4c 45 54 45 22 3b 20 62 72 65 61 6b  E_DELETE"; break
7cd0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
7ce0: 45 5f 44 52 4f 50 5f 49 4e 44 45 58 20 20 20 20  E_DROP_INDEX    
7cf0: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
7d00: 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58 22 3b  ITE_DROP_INDEX";
7d10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
7d20: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42   SQLITE_DROP_TAB
7d30: 4c 45 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64  LE        : zCod
7d40: 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54  e="SQLITE_DROP_T
7d50: 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20  ABLE"; break;.  
7d60: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52    case SQLITE_DR
7d70: 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 20 20 20  OP_TEMP_INDEX   
7d80: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
7d90: 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 22  DROP_TEMP_INDEX"
7da0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
7db0: 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  e SQLITE_DROP_TE
7dc0: 4d 50 5f 54 41 42 4c 45 20 20 20 3a 20 7a 43 6f  MP_TABLE   : zCo
7dd0: 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f  de="SQLITE_DROP_
7de0: 54 45 4d 50 5f 54 41 42 4c 45 22 3b 20 62 72 65  TEMP_TABLE"; bre
7df0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
7e00: 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 52  ITE_DROP_TEMP_TR
7e10: 49 47 47 45 52 20 3a 20 7a 43 6f 64 65 3d 22 53  IGGER : zCode="S
7e20: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
7e30: 54 52 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b  TRIGGER"; break;
7e40: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
7e50: 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 20  _DROP_TEMP_VIEW 
7e60: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
7e70: 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45  TE_DROP_TEMP_VIE
7e80: 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  W"; break;.    c
7e90: 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  ase SQLITE_DROP_
7ea0: 54 52 49 47 47 45 52 20 20 20 20 20 20 3a 20 7a  TRIGGER      : z
7eb0: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f  Code="SQLITE_DRO
7ec0: 50 5f 54 52 49 47 47 45 52 22 3b 20 62 72 65 61  P_TRIGGER"; brea
7ed0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
7ee0: 54 45 5f 44 52 4f 50 5f 56 49 45 57 20 20 20 20  TE_DROP_VIEW    
7ef0: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
7f00: 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45 57 22 3b  LITE_DROP_VIEW";
7f10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
7f20: 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 20 20   SQLITE_INSERT  
7f30: 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64            : zCod
7f40: 65 3d 22 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  e="SQLITE_INSERT
7f50: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
7f60: 73 65 20 53 51 4c 49 54 45 5f 50 52 41 47 4d 41  se SQLITE_PRAGMA
7f70: 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43              : zC
7f80: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 50 52 41 47  ode="SQLITE_PRAG
7f90: 4d 41 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  MA"; break;.    
7fa0: 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44  case SQLITE_READ
7fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3a 20                : 
7fc0: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 52 45  zCode="SQLITE_RE
7fd0: 41 44 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  AD"; break;.    
7fe0: 63 61 73 65 20 53 51 4c 49 54 45 5f 53 45 4c 45  case SQLITE_SELE
7ff0: 43 54 20 20 20 20 20 20 20 20 20 20 20 20 3a 20  CT            : 
8000: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 53 45  zCode="SQLITE_SE
8010: 4c 45 43 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20  LECT"; break;.  
8020: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 52    case SQLITE_TR
8030: 41 4e 53 41 43 54 49 4f 4e 20 20 20 20 20 20 20  ANSACTION       
8040: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
8050: 54 52 41 4e 53 41 43 54 49 4f 4e 22 3b 20 62 72  TRANSACTION"; br
8060: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
8070: 4c 49 54 45 5f 55 50 44 41 54 45 20 20 20 20 20  LITE_UPDATE     
8080: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
8090: 53 51 4c 49 54 45 5f 55 50 44 41 54 45 22 3b 20  SQLITE_UPDATE"; 
80a0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
80b0: 53 51 4c 49 54 45 5f 41 54 54 41 43 48 20 20 20  SQLITE_ATTACH   
80c0: 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65           : zCode
80d0: 3d 22 53 51 4c 49 54 45 5f 41 54 54 41 43 48 22  ="SQLITE_ATTACH"
80e0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
80f0: 65 20 53 51 4c 49 54 45 5f 44 45 54 41 43 48 20  e SQLITE_DETACH 
8100: 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f             : zCo
8110: 64 65 3d 22 53 51 4c 49 54 45 5f 44 45 54 41 43  de="SQLITE_DETAC
8120: 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  H"; break;.    c
8130: 61 73 65 20 53 51 4c 49 54 45 5f 41 4c 54 45 52  ase SQLITE_ALTER
8140: 5f 54 41 42 4c 45 20 20 20 20 20 20 20 3a 20 7a  _TABLE       : z
8150: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 41 4c 54  Code="SQLITE_ALT
8160: 45 52 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b  ER_TABLE"; break
8170: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
8180: 45 5f 52 45 49 4e 44 45 58 20 20 20 20 20 20 20  E_REINDEX       
8190: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
81a0: 49 54 45 5f 52 45 49 4e 44 45 58 22 3b 20 62 72  ITE_REINDEX"; br
81b0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
81c0: 4c 49 54 45 5f 41 4e 41 4c 59 5a 45 20 20 20 20  LITE_ANALYZE    
81d0: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
81e0: 53 51 4c 49 54 45 5f 41 4e 41 4c 59 5a 45 22 3b  SQLITE_ANALYZE";
81f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
8200: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56   SQLITE_CREATE_V
8210: 54 41 42 4c 45 20 20 20 20 20 3a 20 7a 43 6f 64  TABLE     : zCod
8220: 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45  e="SQLITE_CREATE
8230: 5f 56 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b  _VTABLE"; break;
8240: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
8250: 5f 44 52 4f 50 5f 56 54 41 42 4c 45 20 20 20 20  _DROP_VTABLE    
8260: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
8270: 54 45 5f 44 52 4f 50 5f 56 54 41 42 4c 45 22 3b  TE_DROP_VTABLE";
8280: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
8290: 20 53 51 4c 49 54 45 5f 46 55 4e 43 54 49 4f 4e   SQLITE_FUNCTION
82a0: 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64            : zCod
82b0: 65 3d 22 53 51 4c 49 54 45 5f 46 55 4e 43 54 49  e="SQLITE_FUNCTI
82c0: 4f 4e 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  ON"; break;.    
82d0: 63 61 73 65 20 53 51 4c 49 54 45 5f 53 41 56 45  case SQLITE_SAVE
82e0: 50 4f 49 4e 54 20 20 20 20 20 20 20 20 20 3a 20  POINT         : 
82f0: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 53 41  zCode="SQLITE_SA
8300: 56 45 50 4f 49 4e 54 22 3b 20 62 72 65 61 6b 3b  VEPOINT"; break;
8310: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
8320: 5f 52 45 43 55 52 53 49 56 45 20 20 20 20 20 20  _RECURSIVE      
8330: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
8340: 54 45 5f 52 45 43 55 52 53 49 56 45 22 3b 20 62  TE_RECURSIVE"; b
8350: 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
8360: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
8370: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
8380: 22 3f 3f 3f 3f 22 3b 20 62 72 65 61 6b 3b 0a 20  "????"; break;. 
8390: 20 7d 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67   }.  Tcl_DString
83a0: 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 54 63  Init(&str);.  Tc
83b0: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28  l_DStringAppend(
83c0: 26 73 74 72 2c 20 70 44 62 2d 3e 7a 41 75 74 68  &str, pDb->zAuth
83d0: 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53 74  , -1);.  Tcl_DSt
83e0: 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e  ringAppendElemen
83f0: 74 28 26 73 74 72 2c 20 7a 43 6f 64 65 29 3b 0a  t(&str, zCode);.
8400: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
8410: 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c  endElement(&str,
8420: 20 7a 41 72 67 31 20 3f 20 7a 41 72 67 31 20 3a   zArg1 ? zArg1 :
8430: 20 22 22 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72   "");.  Tcl_DStr
8440: 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ingAppendElement
8450: 28 26 73 74 72 2c 20 7a 41 72 67 32 20 3f 20 7a  (&str, zArg2 ? z
8460: 41 72 67 32 20 3a 20 22 22 29 3b 0a 20 20 54 63  Arg2 : "");.  Tc
8470: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45  l_DStringAppendE
8480: 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41 72  lement(&str, zAr
8490: 67 33 20 3f 20 7a 41 72 67 33 20 3a 20 22 22 29  g3 ? zArg3 : "")
84a0: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41  ;.  Tcl_DStringA
84b0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74  ppendElement(&st
84c0: 72 2c 20 7a 41 72 67 34 20 3f 20 7a 41 72 67 34  r, zArg4 ? zArg4
84d0: 20 3a 20 22 22 29 3b 0a 23 69 66 64 65 66 20 53   : "");.#ifdef S
84e0: 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45  QLITE_USER_AUTHE
84f0: 4e 54 49 43 41 54 49 4f 4e 0a 20 20 54 63 6c 5f  NTICATION.  Tcl_
8500: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65  DStringAppendEle
8510: 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41 72 67 35  ment(&str, zArg5
8520: 20 3f 20 7a 41 72 67 35 20 3a 20 22 22 29 3b 0a   ? zArg5 : "");.
8530: 23 65 6e 64 69 66 0a 20 20 72 63 20 3d 20 54 63  #endif.  rc = Tc
8540: 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c 28 70 44 62  l_GlobalEval(pDb
8550: 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44 53  ->interp, Tcl_DS
8560: 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29  tringValue(&str)
8570: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
8580: 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20 7a 52  Free(&str);.  zR
8590: 65 70 6c 79 20 3d 20 72 63 3d 3d 54 43 4c 5f 4f  eply = rc==TCL_O
85a0: 4b 20 3f 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  K ? Tcl_GetStrin
85b0: 67 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74  gResult(pDb->int
85c0: 65 72 70 29 20 3a 20 22 53 51 4c 49 54 45 5f 44  erp) : "SQLITE_D
85d0: 45 4e 59 22 3b 0a 20 20 69 66 28 20 73 74 72 63  ENY";.  if( strc
85e0: 6d 70 28 7a 52 65 70 6c 79 2c 22 53 51 4c 49 54  mp(zReply,"SQLIT
85f0: 45 5f 4f 4b 22 29 3d 3d 30 20 29 7b 0a 20 20 20  E_OK")==0 ){.   
8600: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
8610: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
8620: 63 6d 70 28 7a 52 65 70 6c 79 2c 22 53 51 4c 49  cmp(zReply,"SQLI
8630: 54 45 5f 44 45 4e 59 22 29 3d 3d 30 20 29 7b 0a  TE_DENY")==0 ){.
8640: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
8650: 44 45 4e 59 3b 0a 20 20 7d 65 6c 73 65 20 69 66  DENY;.  }else if
8660: 28 20 73 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c  ( strcmp(zReply,
8670: 22 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 22 29  "SQLITE_IGNORE")
8680: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
8690: 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 3b 0a 20  SQLITE_IGNORE;. 
86a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
86b0: 20 39 39 39 3b 0a 20 20 7d 0a 20 20 72 65 74 75   999;.  }.  retu
86c0: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
86d0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  /* SQLITE_OMIT_A
86e0: 55 54 48 4f 52 49 5a 41 54 49 4f 4e 20 2a 2f 0a  UTHORIZATION */.
86f0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
8700: 69 6e 65 20 72 65 61 64 73 20 61 20 6c 69 6e 65  ine reads a line
8710: 20 6f 66 20 74 65 78 74 20 66 72 6f 6d 20 46 49   of text from FI
8720: 4c 45 20 69 6e 2c 20 73 74 6f 72 65 73 0a 2a 2a  LE in, stores.**
8730: 20 74 68 65 20 74 65 78 74 20 69 6e 20 6d 65 6d   the text in mem
8740: 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
8750: 6d 20 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 72  m malloc() and r
8760: 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72  eturns a pointer
8770: 0a 2a 2a 20 74 6f 20 74 68 65 20 74 65 78 74 2e  .** to the text.
8780: 20 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e    NULL is return
8790: 65 64 20 61 74 20 65 6e 64 20 6f 66 20 66 69 6c  ed at end of fil
87a0: 65 2c 20 6f 72 20 69 66 20 6d 61 6c 6c 6f 63 28  e, or if malloc(
87b0: 29 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2a 0a 2a  ).** fails..**.*
87c0: 2a 20 54 68 65 20 69 6e 74 65 72 66 61 63 65 20  * The interface 
87d0: 69 73 20 6c 69 6b 65 20 22 72 65 61 64 6c 69 6e  is like "readlin
87e0: 65 22 20 62 75 74 20 6e 6f 20 63 6f 6d 6d 61 6e  e" but no comman
87f0: 64 2d 6c 69 6e 65 20 65 64 69 74 69 6e 67 0a 2a  d-line editing.*
8800: 2a 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a  * is done..**.**
8810: 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 73 68 65   copied from she
8820: 6c 6c 2e 63 20 66 72 6f 6d 20 27 2e 69 6d 70 6f  ll.c from '.impo
8830: 72 74 27 20 63 6f 6d 6d 61 6e 64 0a 2a 2f 0a 73  rt' command.*/.s
8840: 74 61 74 69 63 20 63 68 61 72 20 2a 6c 6f 63 61  tatic char *loca
8850: 6c 5f 67 65 74 6c 69 6e 65 28 63 68 61 72 20 2a  l_getline(char *
8860: 7a 50 72 6f 6d 70 74 2c 20 46 49 4c 45 20 2a 69  zPrompt, FILE *i
8870: 6e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 69 6e  n){.  char *zLin
8880: 65 3b 0a 20 20 69 6e 74 20 6e 4c 69 6e 65 3b 0a  e;.  int nLine;.
8890: 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 6e 4c 69 6e    int n;..  nLin
88a0: 65 20 3d 20 31 30 30 3b 0a 20 20 7a 4c 69 6e 65  e = 100;.  zLine
88b0: 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 4c 69 6e 65   = malloc( nLine
88c0: 20 29 3b 0a 20 20 69 66 28 20 7a 4c 69 6e 65 3d   );.  if( zLine=
88d0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
88e0: 20 6e 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28   n = 0;.  while(
88f0: 20 31 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 2b   1 ){.    if( n+
8900: 31 30 30 3e 6e 4c 69 6e 65 20 29 7b 0a 20 20 20  100>nLine ){.   
8910: 20 20 20 6e 4c 69 6e 65 20 3d 20 6e 4c 69 6e 65     nLine = nLine
8920: 2a 32 20 2b 20 31 30 30 3b 0a 20 20 20 20 20 20  *2 + 100;.      
8930: 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28  zLine = realloc(
8940: 7a 4c 69 6e 65 2c 20 6e 4c 69 6e 65 29 3b 0a 20  zLine, nLine);. 
8950: 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 3d 3d       if( zLine==
8960: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
8970: 20 20 7d 0a 20 20 20 20 69 66 28 20 66 67 65 74    }.    if( fget
8980: 73 28 26 7a 4c 69 6e 65 5b 6e 5d 2c 20 6e 4c 69  s(&zLine[n], nLi
8990: 6e 65 20 2d 20 6e 2c 20 69 6e 29 3d 3d 30 20 29  ne - n, in)==0 )
89a0: 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30  {.      if( n==0
89b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65   ){.        free
89c0: 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 20  (zLine);.       
89d0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
89e0: 20 7d 0a 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6e   }.      zLine[n
89f0: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65  ] = 0;.      bre
8a00: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68  ak;.    }.    wh
8a10: 69 6c 65 28 20 7a 4c 69 6e 65 5b 6e 5d 20 29 7b  ile( zLine[n] ){
8a20: 20 6e 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20   n++; }.    if( 
8a30: 6e 3e 30 20 26 26 20 7a 4c 69 6e 65 5b 6e 2d 31  n>0 && zLine[n-1
8a40: 5d 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20  ]=='\n' ){.     
8a50: 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a 4c 69 6e   n--;.      zLin
8a60: 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  e[n] = 0;.      
8a70: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
8a80: 0a 20 20 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c  .  zLine = reall
8a90: 6f 63 28 20 7a 4c 69 6e 65 2c 20 6e 2b 31 20 29  oc( zLine, n+1 )
8aa0: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4c 69 6e 65  ;.  return zLine
8ab0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
8ac0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 70 61 72   function is par
8ad0: 74 20 6f 66 20 74 68 65 20 69 6d 70 6c 65 6d 65  t of the impleme
8ae0: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 63  ntation of the c
8af0: 6f 6d 6d 61 6e 64 3a 0a 2a 2a 0a 2a 2a 20 20 20  ommand:.**.**   
8b00: 24 64 62 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  $db transaction 
8b10: 5b 2d 64 65 66 65 72 72 65 64 7c 2d 69 6d 6d 65  [-deferred|-imme
8b20: 64 69 61 74 65 7c 2d 65 78 63 6c 75 73 69 76 65  diate|-exclusive
8b30: 5d 20 53 43 52 49 50 54 0a 2a 2a 0a 2a 2a 20 49  ] SCRIPT.**.** I
8b40: 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 66 74  t is invoked aft
8b50: 65 72 20 65 76 61 6c 75 61 74 69 6e 67 20 74 68  er evaluating th
8b60: 65 20 73 63 72 69 70 74 20 53 43 52 49 50 54 20  e script SCRIPT 
8b70: 74 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c  to commit or rol
8b80: 6c 62 61 63 6b 0a 2a 2a 20 74 68 65 20 74 72 61  lback.** the tra
8b90: 6e 73 61 63 74 69 6f 6e 20 6f 72 20 73 61 76 65  nsaction or save
8ba0: 70 6f 69 6e 74 20 6f 70 65 6e 65 64 20 62 79 20  point opened by 
8bb0: 74 68 65 20 5b 74 72 61 6e 73 61 63 74 69 6f 6e  the [transaction
8bc0: 5d 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74  ] command..*/.st
8bd0: 61 74 69 63 20 69 6e 74 20 44 62 54 72 61 6e 73  atic int DbTrans
8be0: 50 6f 73 74 43 6d 64 28 0a 20 20 43 6c 69 65 6e  PostCmd(.  Clien
8bf0: 74 44 61 74 61 20 64 61 74 61 5b 5d 2c 20 20 20  tData data[],   
8c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c10: 2f 2a 20 64 61 74 61 5b 30 5d 20 69 73 20 74 68  /* data[0] is th
8c20: 65 20 53 71 6c 69 74 65 33 44 62 2a 20 66 6f 72  e Sqlite3Db* for
8c30: 20 24 64 62 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e   $db */.  Tcl_In
8c40: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
8c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8c60: 2a 20 54 63 6c 20 69 6e 74 65 72 70 72 65 74 65  * Tcl interprete
8c70: 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 75 6c  r */.  int resul
8c80: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
8c90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
8ca0: 65 73 75 6c 74 20 6f 66 20 65 76 61 6c 75 61 74  esult of evaluat
8cb0: 69 6e 67 20 53 43 52 49 50 54 20 2a 2f 0a 29 7b  ing SCRIPT */.){
8cc0: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
8cd0: 63 68 61 72 20 2a 63 6f 6e 73 74 20 61 7a 45 6e  char *const azEn
8ce0: 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 52 45 4c  d[] = {.    "REL
8cf0: 45 41 53 45 20 5f 74 63 6c 5f 74 72 61 6e 73 61  EASE _tcl_transa
8d00: 63 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 20 2f  ction",        /
8d10: 2a 20 72 63 3d 3d 54 43 4c 5f 45 52 52 4f 52 2c  * rc==TCL_ERROR,
8d20: 20 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d 30   nTransaction!=0
8d30: 20 2a 2f 0a 20 20 20 20 22 43 4f 4d 4d 49 54 22   */.    "COMMIT"
8d40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
8d50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 63             /* rc
8d60: 21 3d 54 43 4c 5f 45 52 52 4f 52 2c 20 6e 54 72  !=TCL_ERROR, nTr
8d70: 61 6e 73 61 63 74 69 6f 6e 3d 3d 30 20 2a 2f 0a  ansaction==0 */.
8d80: 20 20 20 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f      "ROLLBACK TO
8d90: 20 5f 74 63 6c 5f 74 72 61 6e 73 61 63 74 69 6f   _tcl_transactio
8da0: 6e 20 3b 20 52 45 4c 45 41 53 45 20 5f 74 63 6c  n ; RELEASE _tcl
8db0: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22 2c 0a 20  _transaction",. 
8dc0: 20 20 20 22 52 4f 4c 4c 42 41 43 4b 22 20 20 20     "ROLLBACK"   
8dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8de0: 20 20 20 20 20 20 2f 2a 20 72 63 3d 3d 54 43 4c        /* rc==TCL
8df0: 5f 45 52 52 4f 52 2c 20 6e 54 72 61 6e 73 61 63  _ERROR, nTransac
8e00: 74 69 6f 6e 3d 3d 30 20 2a 2f 0a 20 20 7d 3b 0a  tion==0 */.  };.
8e10: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
8e20: 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 64 61 74  = (SqliteDb*)dat
8e30: 61 5b 30 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d  a[0];.  int rc =
8e40: 20 72 65 73 75 6c 74 3b 0a 20 20 63 6f 6e 73 74   result;.  const
8e50: 20 63 68 61 72 20 2a 7a 45 6e 64 3b 0a 0a 20 20   char *zEnd;..  
8e60: 70 44 62 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pDb->nTransactio
8e70: 6e 2d 2d 3b 0a 20 20 7a 45 6e 64 20 3d 20 61 7a  n--;.  zEnd = az
8e80: 45 6e 64 5b 28 72 63 3d 3d 54 43 4c 5f 45 52 52  End[(rc==TCL_ERR
8e90: 4f 52 29 2a 32 20 2b 20 28 70 44 62 2d 3e 6e 54  OR)*2 + (pDb->nT
8ea0: 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 30 29 5d 3b  ransaction==0)];
8eb0: 0a 0a 20 20 70 44 62 2d 3e 64 69 73 61 62 6c 65  ..  pDb->disable
8ec0: 41 75 74 68 2b 2b 3b 0a 20 20 69 66 28 20 73 71  Auth++;.  if( sq
8ed0: 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e  lite3_exec(pDb->
8ee0: 64 62 2c 20 7a 45 6e 64 2c 20 30 2c 20 30 2c 20  db, zEnd, 0, 0, 
8ef0: 30 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  0) ){.      /* T
8f00: 68 69 73 20 69 73 20 61 20 74 72 69 63 6b 79 20  his is a tricky 
8f10: 73 63 65 6e 61 72 69 6f 20 74 6f 20 68 61 6e 64  scenario to hand
8f20: 6c 65 2e 20 54 68 65 20 6d 6f 73 74 20 6c 69 6b  le. The most lik
8f30: 65 6c 79 20 63 61 75 73 65 20 6f 66 20 61 6e 0a  ely cause of an.
8f40: 20 20 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 69        ** error i
8f50: 73 20 74 68 61 74 20 74 68 65 20 65 78 65 63 28  s that the exec(
8f60: 29 20 61 62 6f 76 65 20 77 61 73 20 61 6e 20 61  ) above was an a
8f70: 74 74 65 6d 70 74 20 74 6f 20 63 6f 6d 6d 69 74  ttempt to commit
8f80: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f   the.      ** to
8f90: 70 2d 6c 65 76 65 6c 20 74 72 61 6e 73 61 63 74  p-level transact
8fa0: 69 6f 6e 20 74 68 61 74 20 72 65 74 75 72 6e 65  ion that returne
8fb0: 64 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 4f  d SQLITE_BUSY. O
8fc0: 72 2c 20 6c 65 73 73 20 6c 69 6b 65 6c 79 2c 0a  r, less likely,.
8fd0: 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 61 6e        ** that an
8fe0: 20 49 4f 2d 65 72 72 6f 72 20 68 61 73 20 6f 63   IO-error has oc
8ff0: 63 75 72 72 65 64 2e 20 49 6e 20 65 69 74 68 65  curred. In eithe
9000: 72 20 63 61 73 65 2c 20 74 68 72 6f 77 20 61 20  r case, throw a 
9010: 54 63 6c 20 65 78 63 65 70 74 69 6f 6e 0a 20 20  Tcl exception.  
9020: 20 20 20 20 2a 2a 20 61 6e 64 20 74 72 79 20 74      ** and try t
9030: 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74  o rollback the t
9040: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20  ransaction..    
9050: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 42 75    **.      ** Bu
9060: 74 20 69 74 20 63 6f 75 6c 64 20 61 6c 73 6f 20  t it could also 
9070: 62 65 20 74 68 61 74 20 74 68 65 20 75 73 65 72  be that the user
9080: 20 65 78 65 63 75 74 65 64 20 6f 6e 65 20 6f 72   executed one or
9090: 20 6d 6f 72 65 20 42 45 47 49 4e 2c 0a 20 20 20   more BEGIN,.   
90a0: 20 20 20 2a 2a 20 43 4f 4d 4d 49 54 2c 20 53 41     ** COMMIT, SA
90b0: 56 45 50 4f 49 4e 54 2c 20 52 45 4c 45 41 53 45  VEPOINT, RELEASE
90c0: 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 63 6f 6d   or ROLLBACK com
90d0: 6d 61 6e 64 73 20 74 68 61 74 20 61 72 65 20 63  mands that are c
90e0: 6f 6e 66 75 73 69 6e 67 0a 20 20 20 20 20 20 2a  onfusing.      *
90f0: 2a 20 74 68 69 73 20 6d 65 74 68 6f 64 27 73 20  * this method's 
9100: 6c 6f 67 69 63 2e 20 4e 6f 74 20 63 6c 65 61 72  logic. Not clear
9110: 20 68 6f 77 20 74 68 69 73 20 77 6f 75 6c 64 20   how this would 
9120: 62 65 20 62 65 73 74 20 68 61 6e 64 6c 65 64 2e  be best handled.
9130: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  .      */.    if
9140: 28 20 72 63 21 3d 54 43 4c 5f 45 52 52 4f 52 20  ( rc!=TCL_ERROR 
9150: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
9160: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
9170: 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
9180: 28 70 44 62 2d 3e 64 62 29 2c 20 28 63 68 61 72  (pDb->db), (char
9190: 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  *)0);.      rc =
91a0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
91b0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78  }.    sqlite3_ex
91c0: 65 63 28 70 44 62 2d 3e 64 62 2c 20 22 52 4f 4c  ec(pDb->db, "ROL
91d0: 4c 42 41 43 4b 22 2c 20 30 2c 20 30 2c 20 30 29  LBACK", 0, 0, 0)
91e0: 3b 0a 20 20 7d 0a 20 20 70 44 62 2d 3e 64 69 73  ;.  }.  pDb->dis
91f0: 61 62 6c 65 41 75 74 68 2d 2d 3b 0a 0a 20 20 72  ableAuth--;..  r
9200: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
9210: 2a 2a 20 55 6e 6c 65 73 73 20 53 51 4c 49 54 45  ** Unless SQLITE
9220: 5f 54 45 53 54 20 69 73 20 64 65 66 69 6e 65 64  _TEST is defined
9230: 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
9240: 69 73 20 61 20 73 69 6d 70 6c 65 20 77 72 61 70  is a simple wrap
9250: 70 65 72 20 61 72 6f 75 6e 64 0a 2a 2a 20 73 71  per around.** sq
9260: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
9270: 28 29 2e 20 49 66 20 53 51 4c 49 54 45 5f 54 45  (). If SQLITE_TE
9280: 53 54 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74  ST is defined, t
9290: 68 65 6e 20 69 74 20 75 73 65 73 20 65 69 74 68  hen it uses eith
92a0: 65 72 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 70 72  er.** sqlite3_pr
92b0: 65 70 61 72 65 5f 76 32 28 29 20 6f 72 20 6c 65  epare_v2() or le
92c0: 67 61 63 79 20 69 6e 74 65 72 66 61 63 65 20 73  gacy interface s
92d0: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 29  qlite3_prepare()
92e0: 2c 20 64 65 70 65 6e 64 69 6e 67 0a 2a 2a 20 6f  , depending.** o
92f0: 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  n whether or not
9300: 20 74 68 65 20 5b 64 62 5f 75 73 65 5f 6c 65 67   the [db_use_leg
9310: 61 63 79 5f 70 72 65 70 61 72 65 5d 20 63 6f 6d  acy_prepare] com
9320: 6d 61 6e 64 20 68 61 73 20 62 65 65 6e 20 75 73  mand has been us
9330: 65 64 20 74 6f 0a 2a 2a 20 63 6f 6e 66 69 67 75  ed to.** configu
9340: 72 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  re the connectio
9350: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
9360: 20 64 62 50 72 65 70 61 72 65 28 0a 20 20 53 71   dbPrepare(.  Sq
9370: 6c 69 74 65 44 62 20 2a 70 44 62 2c 20 20 20 20  liteDb *pDb,    
9380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9390: 20 44 61 74 61 62 61 73 65 20 6f 62 6a 65 63 74   Database object
93a0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
93b0: 20 2a 7a 53 71 6c 2c 20 20 20 20 20 20 20 20 20   *zSql,         
93c0: 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 74 6f 20        /* SQL to 
93d0: 63 6f 6d 70 69 6c 65 20 2a 2f 0a 20 20 73 71 6c  compile */.  sql
93e0: 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74  ite3_stmt **ppSt
93f0: 6d 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  mt,          /* 
9400: 4f 55 54 3a 20 50 72 65 70 61 72 65 64 20 73 74  OUT: Prepared st
9410: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e  atement */.  con
9420: 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 75 74 20  st char **pzOut 
9430: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9440: 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20  OUT: Pointer to 
9450: 6e 65 78 74 20 53 51 4c 20 73 74 61 74 65 6d 65  next SQL stateme
9460: 6e 74 20 2a 2f 0a 29 7b 0a 23 69 66 64 65 66 20  nt */.){.#ifdef 
9470: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66  SQLITE_TEST.  if
9480: 28 20 70 44 62 2d 3e 62 4c 65 67 61 63 79 50 72  ( pDb->bLegacyPr
9490: 65 70 61 72 65 20 29 7b 0a 20 20 20 20 72 65 74  epare ){.    ret
94a0: 75 72 6e 20 73 71 6c 69 74 65 33 5f 70 72 65 70  urn sqlite3_prep
94b0: 61 72 65 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71  are(pDb->db, zSq
94c0: 6c 2c 20 2d 31 2c 20 70 70 53 74 6d 74 2c 20 70  l, -1, ppStmt, p
94d0: 7a 4f 75 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  zOut);.  }.#endi
94e0: 66 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  f.  return sqlit
94f0: 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 44  e3_prepare_v2(pD
9500: 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  b->db, zSql, -1,
9510: 20 70 70 53 74 6d 74 2c 20 70 7a 4f 75 74 29 3b   ppStmt, pzOut);
9520: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68  .}../*.** Search
9530: 20 74 68 65 20 63 61 63 68 65 20 66 6f 72 20 61   the cache for a
9540: 20 70 72 65 70 61 72 65 64 2d 73 74 61 74 65 6d   prepared-statem
9550: 65 6e 74 20 6f 62 6a 65 63 74 20 74 68 61 74 20  ent object that 
9560: 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 0a 2a  implements the.*
9570: 2a 20 66 69 72 73 74 20 53 51 4c 20 73 74 61 74  * first SQL stat
9580: 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 62 75 66  ement in the buf
9590: 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  fer pointed to b
95a0: 79 20 70 61 72 61 6d 65 74 65 72 20 7a 49 6e 2e  y parameter zIn.
95b0: 20 49 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 70   If.** no such p
95c0: 72 65 70 61 72 65 64 2d 73 74 61 74 65 6d 65 6e  repared-statemen
95d0: 74 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20  t can be found, 
95e0: 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 70 72 65  allocate and pre
95f0: 70 61 72 65 20 61 20 6e 65 77 0a 2a 2a 20 6f 6e  pare a new.** on
9600: 65 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73  e. In either cas
9610: 65 2c 20 62 69 6e 64 20 74 68 65 20 63 75 72 72  e, bind the curr
9620: 65 6e 74 20 76 61 6c 75 65 73 20 6f 66 20 74 68  ent values of th
9630: 65 20 72 65 6c 65 76 61 6e 74 20 54 63 6c 0a 2a  e relevant Tcl.*
9640: 2a 20 76 61 72 69 61 62 6c 65 73 20 74 6f 20 61  * variables to a
9650: 6e 79 20 24 76 61 72 2c 20 3a 76 61 72 20 6f 72  ny $var, :var or
9660: 20 40 76 61 72 20 76 61 72 69 61 62 6c 65 73 20   @var variables 
9670: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
9680: 2e 20 42 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75  . Before.** retu
9690: 72 6e 69 6e 67 2c 20 73 65 74 20 2a 70 70 50 72  rning, set *ppPr
96a0: 65 53 74 6d 74 20 74 6f 20 70 6f 69 6e 74 20 74  eStmt to point t
96b0: 6f 20 74 68 65 20 70 72 65 70 61 72 65 64 2d 73  o the prepared-s
96c0: 74 61 74 65 6d 65 6e 74 20 6f 62 6a 65 63 74 2e  tatement object.
96d0: 0a 2a 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 70 61  .**.** Output pa
96e0: 72 61 6d 65 74 65 72 20 2a 70 7a 4f 75 74 20 69  rameter *pzOut i
96f0: 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
9700: 6f 20 74 68 65 20 6e 65 78 74 20 53 51 4c 20 73  o the next SQL s
9710: 74 61 74 65 6d 65 6e 74 20 69 6e 0a 2a 2a 20 62  tatement in.** b
9720: 75 66 66 65 72 20 7a 49 6e 2c 20 6f 72 20 74 6f  uffer zIn, or to
9730: 20 74 68 65 20 27 5c 30 27 20 62 79 74 65 20 61   the '\0' byte a
9740: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 7a 49 6e  t the end of zIn
9750: 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 0a   if there is no.
9760: 2a 2a 20 6e 65 78 74 20 73 74 61 74 65 6d 65 6e  ** next statemen
9770: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  t..**.** If succ
9780: 65 73 73 66 75 6c 2c 20 54 43 4c 5f 4f 4b 20 69  essful, TCL_OK i
9790: 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
97a0: 72 77 69 73 65 2c 20 54 43 4c 5f 45 52 52 4f 52  rwise, TCL_ERROR
97b0: 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
97c0: 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  and an error mes
97d0: 73 61 67 65 20 6c 6f 61 64 65 64 20 69 6e 74 6f  sage loaded into
97e0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 70 44 62   interpreter pDb
97f0: 2d 3e 69 6e 74 65 72 70 2e 0a 2a 2f 0a 73 74 61  ->interp..*/.sta
9800: 74 69 63 20 69 6e 74 20 64 62 50 72 65 70 61 72  tic int dbPrepar
9810: 65 41 6e 64 42 69 6e 64 28 0a 20 20 53 71 6c 69  eAndBind(.  Sqli
9820: 74 65 44 62 20 2a 70 44 62 2c 20 20 20 20 20 20  teDb *pDb,      
9830: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
9840: 61 74 61 62 61 73 65 20 6f 62 6a 65 63 74 20 2a  atabase object *
9850: 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  /.  char const *
9860: 7a 49 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  zIn,            
9870: 20 20 20 20 2f 2a 20 53 51 4c 20 74 6f 20 63 6f      /* SQL to co
9880: 6d 70 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20  mpile */.  char 
9890: 63 6f 6e 73 74 20 2a 2a 70 7a 4f 75 74 2c 20 20  const **pzOut,  
98a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
98b0: 54 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65  T: Pointer to ne
98c0: 78 74 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  xt SQL statement
98d0: 20 2a 2f 0a 20 20 53 71 6c 50 72 65 70 61 72 65   */.  SqlPrepare
98e0: 64 53 74 6d 74 20 2a 2a 70 70 50 72 65 53 74 6d  dStmt **ppPreStm
98f0: 74 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4f 62  t     /* OUT: Ob
9900: 6a 65 63 74 20 75 73 65 64 20 74 6f 20 63 61 63  ject used to cac
9910: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  he statement */.
9920: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
9930: 2a 7a 53 71 6c 20 3d 20 7a 49 6e 3b 20 20 20 20  *zSql = zIn;    
9940: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
9950: 74 6f 20 66 69 72 73 74 20 53 51 4c 20 73 74 61  to first SQL sta
9960: 74 65 6d 65 6e 74 20 69 6e 20 7a 49 6e 20 2a 2f  tement in zIn */
9970: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
9980: 2a 70 53 74 6d 74 20 3d 20 30 3b 20 20 20 20 20  *pStmt = 0;     
9990: 20 20 20 2f 2a 20 50 72 65 70 61 72 65 64 20 73     /* Prepared s
99a0: 74 61 74 65 6d 65 6e 74 20 6f 62 6a 65 63 74 20  tatement object 
99b0: 2a 2f 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64  */.  SqlPrepared
99c0: 53 74 6d 74 20 2a 70 50 72 65 53 74 6d 74 3b 20  Stmt *pPreStmt; 
99d0: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
99e0: 74 6f 20 63 61 63 68 65 64 20 73 74 61 74 65 6d  to cached statem
99f0: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 71  ent */.  int nSq
9a00: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
9a10: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
9a20: 74 68 20 6f 66 20 7a 53 71 6c 20 69 6e 20 62 79  th of zSql in by
9a30: 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61  tes */.  int nVa
9a40: 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  r = 0;          
9a50: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
9a60: 65 72 20 6f 66 20 76 61 72 69 61 62 6c 65 73 20  er of variables 
9a70: 69 6e 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  in statement */.
9a80: 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 30 3b    int iParm = 0;
9a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9aa0: 20 20 2f 2a 20 4e 65 78 74 20 66 72 65 65 20 65    /* Next free e
9ab0: 6e 74 72 79 20 69 6e 20 61 70 50 61 72 6d 20 2a  ntry in apParm *
9ac0: 2f 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 69 6e  /.  char c;.  in
9ad0: 74 20 69 3b 0a 20 20 54 63 6c 5f 49 6e 74 65 72  t i;.  Tcl_Inter
9ae0: 70 20 2a 69 6e 74 65 72 70 20 3d 20 70 44 62 2d  p *interp = pDb-
9af0: 3e 69 6e 74 65 72 70 3b 0a 0a 20 20 2a 70 70 50  >interp;..  *ppP
9b00: 72 65 53 74 6d 74 20 3d 20 30 3b 0a 0a 20 20 2f  reStmt = 0;..  /
9b10: 2a 20 54 72 69 6d 20 73 70 61 63 65 73 20 66 72  * Trim spaces fr
9b20: 6f 6d 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  om the start of 
9b30: 7a 53 71 6c 20 61 6e 64 20 63 61 6c 63 75 6c 61  zSql and calcula
9b40: 74 65 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67  te the remaining
9b50: 20 6c 65 6e 67 74 68 2e 20 2a 2f 0a 20 20 77 68   length. */.  wh
9b60: 69 6c 65 28 20 28 63 20 3d 20 7a 53 71 6c 5b 30  ile( (c = zSql[0
9b70: 5d 29 3d 3d 27 20 27 20 7c 7c 20 63 3d 3d 27 5c  ])==' ' || c=='\
9b80: 74 27 20 7c 7c 20 63 3d 3d 27 5c 72 27 20 7c 7c  t' || c=='\r' ||
9b90: 20 63 3d 3d 27 5c 6e 27 20 29 7b 20 7a 53 71 6c   c=='\n' ){ zSql
9ba0: 2b 2b 3b 20 7d 0a 20 20 6e 53 71 6c 20 3d 20 73  ++; }.  nSql = s
9bb0: 74 72 6c 65 6e 33 30 28 7a 53 71 6c 29 3b 0a 0a  trlen30(zSql);..
9bc0: 20 20 66 6f 72 28 70 50 72 65 53 74 6d 74 20 3d    for(pPreStmt =
9bd0: 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 3b 20   pDb->stmtList; 
9be0: 70 50 72 65 53 74 6d 74 3b 20 70 50 72 65 53 74  pPreStmt; pPreSt
9bf0: 6d 74 3d 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65  mt=pPreStmt->pNe
9c00: 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d  xt){.    int n =
9c10: 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 3b   pPreStmt->nSql;
9c20: 0a 20 20 20 20 69 66 28 20 6e 53 71 6c 3e 3d 6e  .    if( nSql>=n
9c30: 0a 20 20 20 20 20 20 20 20 26 26 20 6d 65 6d 63  .        && memc
9c40: 6d 70 28 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71  mp(pPreStmt->zSq
9c50: 6c 2c 20 7a 53 71 6c 2c 20 6e 29 3d 3d 30 0a 20  l, zSql, n)==0. 
9c60: 20 20 20 20 20 20 20 26 26 20 28 7a 53 71 6c 5b         && (zSql[
9c70: 6e 5d 3d 3d 30 20 7c 7c 20 7a 53 71 6c 5b 6e 2d  n]==0 || zSql[n-
9c80: 31 5d 3d 3d 27 3b 27 29 0a 20 20 20 20 29 7b 0a  1]==';').    ){.
9c90: 20 20 20 20 20 20 70 53 74 6d 74 20 3d 20 70 50        pStmt = pP
9ca0: 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74 3b 0a 20  reStmt->pStmt;. 
9cb0: 20 20 20 20 20 2a 70 7a 4f 75 74 20 3d 20 26 7a       *pzOut = &z
9cc0: 53 71 6c 5b 70 50 72 65 53 74 6d 74 2d 3e 6e 53  Sql[pPreStmt->nS
9cd0: 71 6c 5d 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57  ql];..      /* W
9ce0: 68 65 6e 20 61 20 70 72 65 70 61 72 65 64 20 73  hen a prepared s
9cf0: 74 61 74 65 6d 65 6e 74 20 69 73 20 66 6f 75 6e  tatement is foun
9d00: 64 2c 20 75 6e 6c 69 6e 6b 20 69 74 20 66 72 6f  d, unlink it fro
9d10: 6d 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63  m the.      ** c
9d20: 61 63 68 65 20 6c 69 73 74 2e 20 20 49 74 20 77  ache list.  It w
9d30: 69 6c 6c 20 6c 61 74 65 72 20 62 65 20 61 64 64  ill later be add
9d40: 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65 20 62  ed back to the b
9d50: 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a  eginning.      *
9d60: 2a 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 6c  * of the cache l
9d70: 69 73 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ist in order to 
9d80: 69 6d 70 6c 65 6d 65 6e 74 20 4c 52 55 20 72 65  implement LRU re
9d90: 70 6c 61 63 65 6d 65 6e 74 2e 0a 20 20 20 20 20  placement..     
9da0: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50   */.      if( pP
9db0: 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 20 29 7b  reStmt->pPrev ){
9dc0: 0a 20 20 20 20 20 20 20 20 70 50 72 65 53 74 6d  .        pPreStm
9dd0: 74 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20  t->pPrev->pNext 
9de0: 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78  = pPreStmt->pNex
9df0: 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
9e00: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d          pDb->stm
9e10: 74 4c 69 73 74 20 3d 20 70 50 72 65 53 74 6d 74  tList = pPreStmt
9e20: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
9e30: 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65 53  .      if( pPreS
9e40: 74 6d 74 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  tmt->pNext ){.  
9e50: 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e        pPreStmt->
9e60: 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
9e70: 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 3b 0a  PreStmt->pPrev;.
9e80: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
9e90: 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61       pDb->stmtLa
9ea0: 73 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70  st = pPreStmt->p
9eb0: 50 72 65 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Prev;.      }.  
9ec0: 20 20 20 20 70 44 62 2d 3e 6e 53 74 6d 74 2d 2d      pDb->nStmt--
9ed0: 3b 0a 20 20 20 20 20 20 6e 56 61 72 20 3d 20 73  ;.      nVar = s
9ee0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61  qlite3_bind_para
9ef0: 6d 65 74 65 72 5f 63 6f 75 6e 74 28 70 53 74 6d  meter_count(pStm
9f00: 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
9f10: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
9f20: 20 49 66 20 6e 6f 20 70 72 65 70 61 72 65 64 20   If no prepared 
9f30: 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 66 6f  statement was fo
9f40: 75 6e 64 2e 20 43 6f 6d 70 69 6c 65 20 74 68 65  und. Compile the
9f50: 20 53 51 4c 20 74 65 78 74 2e 20 41 6c 73 6f 20   SQL text. Also 
9f60: 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 61 20  allocate.  ** a 
9f70: 6e 65 77 20 53 71 6c 50 72 65 70 61 72 65 64 53  new SqlPreparedS
9f80: 74 6d 74 20 73 74 72 75 63 74 75 72 65 2e 20 20  tmt structure.  
9f90: 2a 2f 0a 20 20 69 66 28 20 70 50 72 65 53 74 6d  */.  if( pPreStm
9fa0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  t==0 ){.    int 
9fb0: 6e 42 79 74 65 3b 0a 0a 20 20 20 20 69 66 28 20  nByte;..    if( 
9fc0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 64 62 50 72 65  SQLITE_OK!=dbPre
9fd0: 70 61 72 65 28 70 44 62 2c 20 7a 53 71 6c 2c 20  pare(pDb, zSql, 
9fe0: 26 70 53 74 6d 74 2c 20 70 7a 4f 75 74 29 20 29  &pStmt, pzOut) )
9ff0: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f  {.      Tcl_SetO
a000: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
a010: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
a020: 6a 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  j(sqlite3_errmsg
a030: 28 70 44 62 2d 3e 64 62 29 2c 20 2d 31 29 29 3b  (pDb->db), -1));
a040: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
a050: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
a060: 20 20 20 69 66 28 20 70 53 74 6d 74 3d 3d 30 20     if( pStmt==0 
a070: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  ){.      if( SQL
a080: 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f  ITE_OK!=sqlite3_
a090: 65 72 72 63 6f 64 65 28 70 44 62 2d 3e 64 62 29  errcode(pDb->db)
a0a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   ){.        /* A
a0b0: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 65 72   compile-time er
a0c0: 72 6f 72 20 69 6e 20 74 68 65 20 73 74 61 74 65  ror in the state
a0d0: 6d 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ment. */.       
a0e0: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
a0f0: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
a100: 77 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74  wStringObj(sqlit
a110: 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64  e3_errmsg(pDb->d
a120: 62 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 20 20  b), -1));.      
a130: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
a140: 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  OR;.      }else{
a150: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
a160: 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 61 20  statement was a 
a170: 6e 6f 2d 6f 70 2e 20 20 43 6f 6e 74 69 6e 75 65  no-op.  Continue
a180: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 74 61   to the next sta
a190: 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 20 20 2a  tement.        *
a1a0: 2a 20 69 6e 20 74 68 65 20 53 51 4c 20 73 74 72  * in the SQL str
a1b0: 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ing..        */.
a1c0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
a1d0: 43 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  CL_OK;.      }. 
a1e0: 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74     }..    assert
a1f0: 28 20 70 50 72 65 53 74 6d 74 3d 3d 30 20 29 3b  ( pPreStmt==0 );
a200: 0a 20 20 20 20 6e 56 61 72 20 3d 20 73 71 6c 69  .    nVar = sqli
a210: 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  te3_bind_paramet
a220: 65 72 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b  er_count(pStmt);
a230: 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 73 69 7a  .    nByte = siz
a240: 65 6f 66 28 53 71 6c 50 72 65 70 61 72 65 64 53  eof(SqlPreparedS
a250: 74 6d 74 29 20 2b 20 6e 56 61 72 2a 73 69 7a 65  tmt) + nVar*size
a260: 6f 66 28 54 63 6c 5f 4f 62 6a 20 2a 29 3b 0a 20  of(Tcl_Obj *);. 
a270: 20 20 20 70 50 72 65 53 74 6d 74 20 3d 20 28 53     pPreStmt = (S
a280: 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 2a 29  qlPreparedStmt*)
a290: 54 63 6c 5f 41 6c 6c 6f 63 28 6e 42 79 74 65 29  Tcl_Alloc(nByte)
a2a0: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 72  ;.    memset(pPr
a2b0: 65 53 74 6d 74 2c 20 30 2c 20 6e 42 79 74 65 29  eStmt, 0, nByte)
a2c0: 3b 0a 0a 20 20 20 20 70 50 72 65 53 74 6d 74 2d  ;..    pPreStmt-
a2d0: 3e 70 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a  >pStmt = pStmt;.
a2e0: 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53      pPreStmt->nS
a2f0: 71 6c 20 3d 20 28 69 6e 74 29 28 2a 70 7a 4f 75  ql = (int)(*pzOu
a300: 74 20 2d 20 7a 53 71 6c 29 3b 0a 20 20 20 20 70  t - zSql);.    p
a310: 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 20 3d 20  PreStmt->zSql = 
a320: 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 74 6d  sqlite3_sql(pStm
a330: 74 29 3b 0a 20 20 20 20 70 50 72 65 53 74 6d 74  t);.    pPreStmt
a340: 2d 3e 61 70 50 61 72 6d 20 3d 20 28 54 63 6c 5f  ->apParm = (Tcl_
a350: 4f 62 6a 20 2a 2a 29 26 70 50 72 65 53 74 6d 74  Obj **)&pPreStmt
a360: 5b 31 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  [1];.#ifdef SQLI
a370: 54 45 5f 54 45 53 54 0a 20 20 20 20 69 66 28 20  TE_TEST.    if( 
a380: 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 3d 3d  pPreStmt->zSql==
a390: 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  0 ){.      char 
a3a0: 2a 7a 43 6f 70 79 20 3d 20 54 63 6c 5f 41 6c 6c  *zCopy = Tcl_All
a3b0: 6f 63 28 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71  oc(pPreStmt->nSq
a3c0: 6c 20 2b 20 31 29 3b 0a 20 20 20 20 20 20 6d 65  l + 1);.      me
a3d0: 6d 63 70 79 28 7a 43 6f 70 79 2c 20 7a 53 71 6c  mcpy(zCopy, zSql
a3e0: 2c 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c  , pPreStmt->nSql
a3f0: 29 3b 0a 20 20 20 20 20 20 7a 43 6f 70 79 5b 70  );.      zCopy[p
a400: 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 5d 20 3d  PreStmt->nSql] =
a410: 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 70 50 72   '\0';.      pPr
a420: 65 53 74 6d 74 2d 3e 7a 53 71 6c 20 3d 20 7a 43  eStmt->zSql = zC
a430: 6f 70 79 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  opy;.    }.#endi
a440: 66 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  f.  }.  assert( 
a450: 70 50 72 65 53 74 6d 74 20 29 3b 0a 20 20 61 73  pPreStmt );.  as
a460: 73 65 72 74 28 20 73 74 72 6c 65 6e 33 30 28 70  sert( strlen30(p
a470: 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 29 3d 3d  PreStmt->zSql)==
a480: 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 20 29  pPreStmt->nSql )
a490: 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 6d  ;.  assert( 0==m
a4a0: 65 6d 63 6d 70 28 70 50 72 65 53 74 6d 74 2d 3e  emcmp(pPreStmt->
a4b0: 7a 53 71 6c 2c 20 7a 53 71 6c 2c 20 70 50 72 65  zSql, zSql, pPre
a4c0: 53 74 6d 74 2d 3e 6e 53 71 6c 29 20 29 3b 0a 0a  Stmt->nSql) );..
a4d0: 20 20 2f 2a 20 42 69 6e 64 20 76 61 6c 75 65 73    /* Bind values
a4e0: 20 74 6f 20 70 61 72 61 6d 65 74 65 72 73 20 74   to parameters t
a4f0: 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 24  hat begin with $
a500: 20 6f 72 20 3a 20 2a 2f 0a 20 20 66 6f 72 28 69   or : */.  for(i
a510: 3d 31 3b 20 69 3c 3d 6e 56 61 72 3b 20 69 2b 2b  =1; i<=nVar; i++
a520: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
a530: 72 20 2a 7a 56 61 72 20 3d 20 73 71 6c 69 74 65  r *zVar = sqlite
a540: 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
a550: 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 20 69 29 3b  _name(pStmt, i);
a560: 0a 20 20 20 20 69 66 28 20 7a 56 61 72 21 3d 30  .    if( zVar!=0
a570: 20 26 26 20 28 7a 56 61 72 5b 30 5d 3d 3d 27 24   && (zVar[0]=='$
a580: 27 20 7c 7c 20 7a 56 61 72 5b 30 5d 3d 3d 27 3a  ' || zVar[0]==':
a590: 27 20 7c 7c 20 7a 56 61 72 5b 30 5d 3d 3d 27 40  ' || zVar[0]=='@
a5a0: 27 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  ') ){.      Tcl_
a5b0: 4f 62 6a 20 2a 70 56 61 72 20 3d 20 54 63 6c 5f  Obj *pVar = Tcl_
a5c0: 47 65 74 56 61 72 32 45 78 28 69 6e 74 65 72 70  GetVar2Ex(interp
a5d0: 2c 20 26 7a 56 61 72 5b 31 5d 2c 20 30 2c 20 30  , &zVar[1], 0, 0
a5e0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 56 61  );.      if( pVa
a5f0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  r ){.        int
a600: 20 6e 3b 0a 20 20 20 20 20 20 20 20 75 38 20 2a   n;.        u8 *
a610: 64 61 74 61 3b 0a 20 20 20 20 20 20 20 20 63 6f  data;.        co
a620: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20  nst char *zType 
a630: 3d 20 28 70 56 61 72 2d 3e 74 79 70 65 50 74 72  = (pVar->typePtr
a640: 20 3f 20 70 56 61 72 2d 3e 74 79 70 65 50 74 72   ? pVar->typePtr
a650: 2d 3e 6e 61 6d 65 20 3a 20 22 22 29 3b 0a 20 20  ->name : "");.  
a660: 20 20 20 20 20 20 63 20 3d 20 7a 54 79 70 65 5b        c = zType[
a670: 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0];.        if( 
a680: 7a 56 61 72 5b 30 5d 3d 3d 27 40 27 20 7c 7c 0a  zVar[0]=='@' ||.
a690: 20 20 20 20 20 20 20 20 20 20 20 28 63 3d 3d 27             (c=='
a6a0: 62 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79  b' && strcmp(zTy
a6b0: 70 65 2c 22 62 79 74 65 61 72 72 61 79 22 29 3d  pe,"bytearray")=
a6c0: 3d 30 20 26 26 20 70 56 61 72 2d 3e 62 79 74 65  =0 && pVar->byte
a6d0: 73 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  s==0) ){.       
a6e0: 20 20 20 2f 2a 20 4c 6f 61 64 20 61 20 42 4c 4f     /* Load a BLO
a6f0: 42 20 74 79 70 65 20 69 66 20 74 68 65 20 54 63  B type if the Tc
a700: 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 61 20  l variable is a 
a710: 62 79 74 65 61 72 72 61 79 20 61 6e 64 0a 20 20  bytearray and.  
a720: 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 68 61          ** it ha
a730: 73 20 6e 6f 20 73 74 72 69 6e 67 20 72 65 70 72  s no string repr
a740: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 72 20 74 68  esentation or th
a750: 65 20 68 6f 73 74 0a 20 20 20 20 20 20 20 20 20  e host.         
a760: 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 6e 61   ** parameter na
a770: 6d 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 22  me begins with "
a780: 40 22 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  @". */.         
a790: 20 64 61 74 61 20 3d 20 54 63 6c 5f 47 65 74 42   data = Tcl_GetB
a7a0: 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28  yteArrayFromObj(
a7b0: 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20  pVar, &n);.     
a7c0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
a7d0: 64 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 69 2c  d_blob(pStmt, i,
a7e0: 20 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45   data, n, SQLITE
a7f0: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
a800: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
a810: 6f 75 6e 74 28 70 56 61 72 29 3b 0a 20 20 20 20  ount(pVar);.    
a820: 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e        pPreStmt->
a830: 61 70 50 61 72 6d 5b 69 50 61 72 6d 2b 2b 5d 20  apParm[iParm++] 
a840: 3d 20 70 56 61 72 3b 0a 20 20 20 20 20 20 20 20  = pVar;.        
a850: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 62 27  }else if( c=='b'
a860: 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65   && strcmp(zType
a870: 2c 22 62 6f 6f 6c 65 61 6e 22 29 3d 3d 30 20 29  ,"boolean")==0 )
a880: 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  {.          Tcl_
a890: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
a8a0: 74 65 72 70 2c 20 70 56 61 72 2c 20 26 6e 29 3b  terp, pVar, &n);
a8b0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
a8c0: 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d  e3_bind_int(pStm
a8d0: 74 2c 20 69 2c 20 6e 29 3b 0a 20 20 20 20 20 20  t, i, n);.      
a8e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
a8f0: 64 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79  d' && strcmp(zTy
a900: 70 65 2c 22 64 6f 75 62 6c 65 22 29 3d 3d 30 20  pe,"double")==0 
a910: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 64 6f 75  ){.          dou
a920: 62 6c 65 20 72 3b 0a 20 20 20 20 20 20 20 20 20  ble r;.         
a930: 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72   Tcl_GetDoubleFr
a940: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 56  omObj(interp, pV
a950: 61 72 2c 20 26 72 29 3b 0a 20 20 20 20 20 20 20  ar, &r);.       
a960: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
a970: 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20 69 2c  double(pStmt, i,
a980: 20 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   r);.        }el
a990: 73 65 20 69 66 28 20 28 63 3d 3d 27 77 27 20 26  se if( (c=='w' &
a9a0: 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22  & strcmp(zType,"
a9b0: 77 69 64 65 49 6e 74 22 29 3d 3d 30 29 20 7c 7c  wideInt")==0) ||
a9c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  .              (
a9d0: 63 3d 3d 27 69 27 20 26 26 20 73 74 72 63 6d 70  c=='i' && strcmp
a9e0: 28 7a 54 79 70 65 2c 22 69 6e 74 22 29 3d 3d 30  (zType,"int")==0
a9f0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  ) ){.          T
aa00: 63 6c 5f 57 69 64 65 49 6e 74 20 76 3b 0a 20 20  cl_WideInt v;.  
aa10: 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 57          Tcl_GetW
aa20: 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  ideIntFromObj(in
aa30: 74 65 72 70 2c 20 70 56 61 72 2c 20 26 76 29 3b  terp, pVar, &v);
aa40: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
aa50: 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53  e3_bind_int64(pS
aa60: 74 6d 74 2c 20 69 2c 20 76 29 3b 0a 20 20 20 20  tmt, i, v);.    
aa70: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
aa80: 20 20 20 20 20 64 61 74 61 20 3d 20 28 75 6e 73       data = (uns
aa90: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 54 63 6c  igned char *)Tcl
aaa0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
aab0: 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20  j(pVar, &n);.   
aac0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
aad0: 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  ind_text(pStmt, 
aae0: 69 2c 20 28 63 68 61 72 20 2a 29 64 61 74 61 2c  i, (char *)data,
aaf0: 20 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49   n, SQLITE_STATI
ab00: 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 54 63  C);.          Tc
ab10: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
ab20: 56 61 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Var);.          
ab30: 70 50 72 65 53 74 6d 74 2d 3e 61 70 50 61 72 6d  pPreStmt->apParm
ab40: 5b 69 50 61 72 6d 2b 2b 5d 20 3d 20 70 56 61 72  [iParm++] = pVar
ab50: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
ab60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
ab70: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75   sqlite3_bind_nu
ab80: 6c 6c 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20  ll(pStmt, i);.  
ab90: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
aba0: 20 20 70 50 72 65 53 74 6d 74 2d 3e 6e 50 61 72    pPreStmt->nPar
abb0: 6d 20 3d 20 69 50 61 72 6d 3b 0a 20 20 2a 70 70  m = iParm;.  *pp
abc0: 50 72 65 53 74 6d 74 20 3d 20 70 50 72 65 53 74  PreStmt = pPreSt
abd0: 6d 74 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54 43  mt;..  return TC
abe0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  L_OK;.}../*.** R
abf0: 65 6c 65 61 73 65 20 61 20 73 74 61 74 65 6d 65  elease a stateme
ac00: 6e 74 20 72 65 66 65 72 65 6e 63 65 20 6f 62 74  nt reference obt
ac10: 61 69 6e 65 64 20 62 79 20 63 61 6c 6c 69 6e 67  ained by calling
ac20: 20 64 62 50 72 65 70 61 72 65 41 6e 64 42 69 6e   dbPrepareAndBin
ac30: 64 28 29 2e 0a 2a 2a 20 54 68 65 72 65 20 73 68  d()..** There sh
ac40: 6f 75 6c 64 20 62 65 20 65 78 61 63 74 6c 79 20  ould be exactly 
ac50: 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  one call to this
ac60: 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 65 61   function for ea
ac70: 63 68 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 64 62  ch call to.** db
ac80: 50 72 65 70 61 72 65 41 6e 64 42 69 6e 64 28 29  PrepareAndBind()
ac90: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64  ..**.** If the d
aca0: 69 73 63 61 72 64 20 70 61 72 61 6d 65 74 65 72  iscard parameter
acb0: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
acc0: 65 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  en the statement
acd0: 20 69 73 20 64 65 6c 65 74 65 64 0a 2a 2a 20 69   is deleted.** i
ace0: 6d 6d 65 64 69 61 74 65 6c 79 2e 20 4f 74 68 65  mmediately. Othe
acf0: 72 77 69 73 65 20 69 74 20 69 73 20 61 64 64 65  rwise it is adde
ad00: 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73  d to the LRU lis
ad10: 74 20 61 6e 64 20 6d 61 79 20 62 65 20 72 65 74  t and may be ret
ad20: 75 72 6e 65 64 0a 2a 2a 20 62 79 20 61 20 73 75  urned.** by a su
ad30: 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f  bsequent call to
ad40: 20 64 62 50 72 65 70 61 72 65 41 6e 64 42 69 6e   dbPrepareAndBin
ad50: 64 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  d()..*/.static v
ad60: 6f 69 64 20 64 62 52 65 6c 65 61 73 65 53 74 6d  oid dbReleaseStm
ad70: 74 28 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  t(.  SqliteDb *p
ad80: 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Db,             
ad90: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
ada0: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 53 71 6c   handle */.  Sql
adb0: 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70 50  PreparedStmt *pP
adc0: 72 65 53 74 6d 74 2c 20 20 20 20 20 20 2f 2a 20  reStmt,      /* 
add0: 50 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  Prepared stateme
ade0: 6e 74 20 68 61 6e 64 6c 65 20 74 6f 20 72 65 6c  nt handle to rel
adf0: 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 64 69  ease */.  int di
ae00: 73 63 61 72 64 20 20 20 20 20 20 20 20 20 20 20  scard           
ae10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
ae20: 65 20 74 6f 20 64 65 6c 65 74 65 20 28 6e 6f 74  e to delete (not
ae30: 20 63 61 63 68 65 29 20 74 68 65 20 70 50 72 65   cache) the pPre
ae40: 53 74 6d 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  Stmt */.){.  int
ae50: 20 69 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74   i;..  /* Free t
ae60: 68 65 20 62 6f 75 6e 64 20 73 74 72 69 6e 67 20  he bound string 
ae70: 61 6e 64 20 62 6c 6f 62 20 70 61 72 61 6d 65 74  and blob paramet
ae80: 65 72 73 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ers */.  for(i=0
ae90: 3b 20 69 3c 70 50 72 65 53 74 6d 74 2d 3e 6e 50  ; i<pPreStmt->nP
aea0: 61 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54  arm; i++){.    T
aeb0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
aec0: 70 50 72 65 53 74 6d 74 2d 3e 61 70 50 61 72 6d  pPreStmt->apParm
aed0: 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 70 50 72 65  [i]);.  }.  pPre
aee0: 53 74 6d 74 2d 3e 6e 50 61 72 6d 20 3d 20 30 3b  Stmt->nParm = 0;
aef0: 0a 0a 20 20 69 66 28 20 70 44 62 2d 3e 6d 61 78  ..  if( pDb->max
af00: 53 74 6d 74 3c 3d 30 20 7c 7c 20 64 69 73 63 61  Stmt<=0 || disca
af10: 72 64 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  rd ){.    /* If 
af20: 74 68 65 20 63 61 63 68 65 20 69 73 20 74 75 72  the cache is tur
af30: 6e 65 64 20 6f 66 66 2c 20 64 65 61 6c 6c 6f 63  ned off, dealloc
af40: 61 74 65 64 20 74 68 65 20 73 74 61 74 65 6d 65  ated the stateme
af50: 6e 74 20 2a 2f 0a 20 20 20 20 64 62 46 72 65 65  nt */.    dbFree
af60: 53 74 6d 74 28 70 50 72 65 53 74 6d 74 29 3b 0a  Stmt(pPreStmt);.
af70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
af80: 41 64 64 20 74 68 65 20 70 72 65 70 61 72 65 64  Add the prepared
af90: 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 74 68   statement to th
afa0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
afb0: 68 65 20 63 61 63 68 65 20 6c 69 73 74 2e 20 2a  he cache list. *
afc0: 2f 0a 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e  /.    pPreStmt->
afd0: 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e 73 74 6d  pNext = pDb->stm
afe0: 74 4c 69 73 74 3b 0a 20 20 20 20 70 50 72 65 53  tList;.    pPreS
aff0: 74 6d 74 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a  tmt->pPrev = 0;.
b000: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 73 74 6d      if( pDb->stm
b010: 74 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 70 44  tList ){.     pD
b020: 62 2d 3e 73 74 6d 74 4c 69 73 74 2d 3e 70 50 72  b->stmtList->pPr
b030: 65 76 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a 20  ev = pPreStmt;. 
b040: 20 20 20 7d 0a 20 20 20 20 70 44 62 2d 3e 73 74     }.    pDb->st
b050: 6d 74 4c 69 73 74 20 3d 20 70 50 72 65 53 74 6d  mtList = pPreStm
b060: 74 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e  t;.    if( pDb->
b070: 73 74 6d 74 4c 61 73 74 3d 3d 30 20 29 7b 0a 20  stmtLast==0 ){. 
b080: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44 62       assert( pDb
b090: 2d 3e 6e 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20  ->nStmt==0 );.  
b0a0: 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73      pDb->stmtLas
b0b0: 74 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a 20 20  t = pPreStmt;.  
b0c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
b0d0: 73 73 65 72 74 28 20 70 44 62 2d 3e 6e 53 74 6d  ssert( pDb->nStm
b0e0: 74 3e 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  t>0 );.    }.   
b0f0: 20 70 44 62 2d 3e 6e 53 74 6d 74 2b 2b 3b 0a 0a   pDb->nStmt++;..
b100: 20 20 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76      /* If we hav
b110: 65 20 74 6f 6f 20 6d 61 6e 79 20 73 74 61 74 65  e too many state
b120: 6d 65 6e 74 20 69 6e 20 63 61 63 68 65 2c 20 72  ment in cache, r
b130: 65 6d 6f 76 65 20 74 68 65 20 73 75 72 70 6c 75  emove the surplu
b140: 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68  s from.    ** th
b150: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 63 61 63  e end of the cac
b160: 68 65 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 20  he list.  */.   
b170: 20 77 68 69 6c 65 28 20 70 44 62 2d 3e 6e 53 74   while( pDb->nSt
b180: 6d 74 3e 70 44 62 2d 3e 6d 61 78 53 74 6d 74 20  mt>pDb->maxStmt 
b190: 29 7b 0a 20 20 20 20 20 20 53 71 6c 50 72 65 70  ){.      SqlPrep
b1a0: 61 72 65 64 53 74 6d 74 20 2a 70 4c 61 73 74 20  aredStmt *pLast 
b1b0: 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 3b  = pDb->stmtLast;
b1c0: 0a 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74  .      pDb->stmt
b1d0: 4c 61 73 74 20 3d 20 70 4c 61 73 74 2d 3e 70 50  Last = pLast->pP
b1e0: 72 65 76 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e  rev;.      pDb->
b1f0: 73 74 6d 74 4c 61 73 74 2d 3e 70 4e 65 78 74 20  stmtLast->pNext 
b200: 3d 20 30 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e  = 0;.      pDb->
b210: 6e 53 74 6d 74 2d 2d 3b 0a 20 20 20 20 20 20 64  nStmt--;.      d
b220: 62 46 72 65 65 53 74 6d 74 28 70 4c 61 73 74 29  bFreeStmt(pLast)
b230: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
b240: 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20 75  *.** Structure u
b250: 73 65 64 20 77 69 74 68 20 64 62 45 76 61 6c 58  sed with dbEvalX
b260: 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 3a 0a  XX() functions:.
b270: 2a 2a 0a 2a 2a 20 20 20 64 62 45 76 61 6c 49 6e  **.**   dbEvalIn
b280: 69 74 28 29 0a 2a 2a 20 20 20 64 62 45 76 61 6c  it().**   dbEval
b290: 53 74 65 70 28 29 0a 2a 2a 20 20 20 64 62 45 76  Step().**   dbEv
b2a0: 61 6c 46 69 6e 61 6c 69 7a 65 28 29 0a 2a 2a 20  alFinalize().** 
b2b0: 20 20 64 62 45 76 61 6c 52 6f 77 49 6e 66 6f 28    dbEvalRowInfo(
b2c0: 29 0a 2a 2a 20 20 20 64 62 45 76 61 6c 43 6f 6c  ).**   dbEvalCol
b2d0: 75 6d 6e 56 61 6c 75 65 28 29 0a 2a 2f 0a 74 79  umnValue().*/.ty
b2e0: 70 65 64 65 66 20 73 74 72 75 63 74 20 44 62 45  pedef struct DbE
b2f0: 76 61 6c 43 6f 6e 74 65 78 74 20 44 62 45 76 61  valContext DbEva
b300: 6c 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74  lContext;.struct
b310: 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 7b   DbEvalContext {
b320: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
b330: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b340: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
b350: 61 6e 64 6c 65 20 2a 2f 0a 20 20 54 63 6c 5f 4f  andle */.  Tcl_O
b360: 62 6a 20 2a 70 53 71 6c 3b 20 20 20 20 20 20 20  bj *pSql;       
b370: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62             /* Ob
b380: 6a 65 63 74 20 68 6f 6c 64 69 6e 67 20 73 74 72  ject holding str
b390: 69 6e 67 20 7a 53 71 6c 20 2a 2f 0a 20 20 63 6f  ing zSql */.  co
b3a0: 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20  nst char *zSql; 
b3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b3c0: 20 52 65 6d 61 69 6e 69 6e 67 20 53 51 4c 20 74   Remaining SQL t
b3d0: 6f 20 65 78 65 63 75 74 65 20 2a 2f 0a 20 20 53  o execute */.  S
b3e0: 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a  qlPreparedStmt *
b3f0: 70 50 72 65 53 74 6d 74 3b 20 20 20 20 20 20 2f  pPreStmt;      /
b400: 2a 20 43 75 72 72 65 6e 74 20 73 74 61 74 65 6d  * Current statem
b410: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  ent */.  int nCo
b420: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
b430: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
b440: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 72 65  er of columns re
b450: 74 75 72 6e 65 64 20 62 79 20 70 53 74 6d 74 20  turned by pStmt 
b460: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 41  */.  Tcl_Obj *pA
b470: 72 72 61 79 3b 20 20 20 20 20 20 20 20 20 20 20  rray;           
b480: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
b490: 61 72 72 61 79 20 76 61 72 69 61 62 6c 65 20 2a  array variable *
b4a0: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70  /.  Tcl_Obj **ap
b4b0: 43 6f 6c 4e 61 6d 65 3b 20 20 20 20 20 20 20 20  ColName;        
b4c0: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
b4d0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a  column names */.
b4e0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  };../*.** Releas
b4f0: 65 20 61 6e 79 20 63 61 63 68 65 20 6f 66 20 63  e any cache of c
b500: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 63 75 72 72  olumn names curr
b510: 65 6e 74 6c 79 20 68 65 6c 64 20 61 73 20 70 61  ently held as pa
b520: 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 44 62 45  rt of.** the DbE
b530: 76 61 6c 43 6f 6e 74 65 78 74 20 73 74 72 75 63  valContext struc
b540: 74 75 72 65 20 70 61 73 73 65 64 20 61 73 20 74  ture passed as t
b550: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
b560: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
b570: 64 20 64 62 52 65 6c 65 61 73 65 43 6f 6c 75 6d  d dbReleaseColum
b580: 6e 4e 61 6d 65 73 28 44 62 45 76 61 6c 43 6f 6e  nNames(DbEvalCon
b590: 74 65 78 74 20 2a 70 29 7b 0a 20 20 69 66 28 20  text *p){.  if( 
b5a0: 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65 20 29 7b 0a  p->apColName ){.
b5b0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
b5c0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
b5d0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54  l; i++){.      T
b5e0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
b5f0: 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29  p->apColName[i])
b600: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f  ;.    }.    Tcl_
b610: 46 72 65 65 28 28 63 68 61 72 20 2a 29 70 2d 3e  Free((char *)p->
b620: 61 70 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20 20  apColName);.    
b630: 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 30  p->apColName = 0
b640: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 43 6f 6c 20  ;.  }.  p->nCol 
b650: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  = 0;.}../*.** In
b660: 69 74 69 61 6c 69 7a 65 20 61 20 44 62 45 76 61  itialize a DbEva
b670: 6c 43 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75  lContext structu
b680: 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 41 72  re..**.** If pAr
b690: 72 61 79 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  ray is not NULL,
b6a0: 20 74 68 65 6e 20 69 74 20 63 6f 6e 74 61 69 6e   then it contain
b6b0: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
b6c0: 54 63 6c 20 61 72 72 61 79 0a 2a 2a 20 76 61 72  Tcl array.** var
b6d0: 69 61 62 6c 65 2e 20 54 68 65 20 22 2a 22 20 6d  iable. The "*" m
b6e0: 65 6d 62 65 72 20 6f 66 20 74 68 69 73 20 61 72  ember of this ar
b6f0: 72 61 79 20 69 73 20 73 65 74 20 74 6f 20 61 20  ray is set to a 
b700: 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 0a  list containing.
b710: 2a 2a 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  ** the names of 
b720: 74 68 65 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75  the columns retu
b730: 72 6e 65 64 20 62 79 20 74 68 65 20 73 74 61 74  rned by the stat
b740: 65 6d 65 6e 74 20 61 73 20 70 61 72 74 20 6f 66  ement as part of
b750: 20 65 61 63 68 0a 2a 2a 20 63 61 6c 6c 20 74 6f   each.** call to
b760: 20 64 62 45 76 61 6c 53 74 65 70 28 29 2c 20 69   dbEvalStep(), i
b770: 6e 20 6f 72 64 65 72 20 66 72 6f 6d 20 6c 65 66  n order from lef
b780: 74 20 74 6f 20 72 69 67 68 74 2e 20 65 2e 67 2e  t to right. e.g.
b790: 20 69 66 20 74 68 65 20 6e 61 6d 65 73 0a 2a 2a   if the names.**
b7a0: 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65 64   of the returned
b7b0: 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 61 2c 20   columns are a, 
b7c0: 62 20 61 6e 64 20 63 2c 20 69 74 20 64 6f 65 73  b and c, it does
b7d0: 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20   the equivalent 
b7e0: 6f 66 20 74 68 65 0a 2a 2a 20 74 63 6c 20 63 6f  of the.** tcl co
b7f0: 6d 6d 61 6e 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  mmand:.**.**    
b800: 20 73 65 74 20 24 7b 70 41 72 72 61 79 7d 28 2a   set ${pArray}(*
b810: 29 20 7b 61 20 62 20 63 7d 0a 2a 2f 0a 73 74 61  ) {a b c}.*/.sta
b820: 74 69 63 20 76 6f 69 64 20 64 62 45 76 61 6c 49  tic void dbEvalI
b830: 6e 69 74 28 0a 20 20 44 62 45 76 61 6c 43 6f 6e  nit(.  DbEvalCon
b840: 74 65 78 74 20 2a 70 2c 20 20 20 20 20 20 20 20  text *p,        
b850: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
b860: 72 20 74 6f 20 73 74 72 75 63 74 75 72 65 20 74  r to structure t
b870: 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 2a 2f 0a  o initialize */.
b880: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 2c    SqliteDb *pDb,
b890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8a0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61    /* Database ha
b8b0: 6e 64 6c 65 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ndle */.  Tcl_Ob
b8c0: 6a 20 2a 70 53 71 6c 2c 20 20 20 20 20 20 20 20  j *pSql,        
b8d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a            /* Obj
b8e0: 65 63 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 53  ect containing S
b8f0: 51 4c 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 54  QL script */.  T
b900: 63 6c 5f 4f 62 6a 20 2a 70 41 72 72 61 79 20 20  cl_Obj *pArray  
b910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b920: 2a 20 4e 61 6d 65 20 6f 66 20 54 63 6c 20 61 72  * Name of Tcl ar
b930: 72 61 79 20 74 6f 20 73 65 74 20 28 2a 29 20 65  ray to set (*) e
b940: 6c 65 6d 65 6e 74 20 6f 66 20 2a 2f 0a 29 7b 0a  lement of */.){.
b950: 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73    memset(p, 0, s
b960: 69 7a 65 6f 66 28 44 62 45 76 61 6c 43 6f 6e 74  izeof(DbEvalCont
b970: 65 78 74 29 29 3b 0a 20 20 70 2d 3e 70 44 62 20  ext));.  p->pDb 
b980: 3d 20 70 44 62 3b 0a 20 20 70 2d 3e 7a 53 71 6c  = pDb;.  p->zSql
b990: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
b9a0: 28 70 53 71 6c 29 3b 0a 20 20 70 2d 3e 70 53 71  (pSql);.  p->pSq
b9b0: 6c 20 3d 20 70 53 71 6c 3b 0a 20 20 54 63 6c 5f  l = pSql;.  Tcl_
b9c0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 53 71  IncrRefCount(pSq
b9d0: 6c 29 3b 0a 20 20 69 66 28 20 70 41 72 72 61 79  l);.  if( pArray
b9e0: 20 29 7b 0a 20 20 20 20 70 2d 3e 70 41 72 72 61   ){.    p->pArra
b9f0: 79 20 3d 20 70 41 72 72 61 79 3b 0a 20 20 20 20  y = pArray;.    
ba00: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
ba10: 28 70 41 72 72 61 79 29 3b 0a 20 20 7d 0a 7d 0a  (pArray);.  }.}.
ba20: 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 69 6e  ./*.** Obtain in
ba30: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
ba40: 74 68 65 20 72 6f 77 20 74 68 61 74 20 74 68 65  the row that the
ba50: 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 70   DbEvalContext p
ba60: 61 73 73 65 64 20 61 73 20 74 68 65 0a 2a 2a 20  assed as the.** 
ba70: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 63  first argument c
ba80: 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
ba90: 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  to..*/.static vo
baa0: 69 64 20 64 62 45 76 61 6c 52 6f 77 49 6e 66 6f  id dbEvalRowInfo
bab0: 28 0a 20 20 44 62 45 76 61 6c 43 6f 6e 74 65 78  (.  DbEvalContex
bac0: 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
bad0: 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 69 6f      /* Evaluatio
bae0: 6e 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  n context */.  i
baf0: 6e 74 20 2a 70 6e 43 6f 6c 2c 20 20 20 20 20 20  nt *pnCol,      
bb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bb10: 2a 20 4f 55 54 3a 20 4e 75 6d 62 65 72 20 6f 66  * OUT: Number of
bb20: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f   column names */
bb30: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 2a 70 61  .  Tcl_Obj ***pa
bb40: 70 43 6f 6c 4e 61 6d 65 20 20 20 20 20 20 20 20  pColName        
bb50: 20 20 20 2f 2a 20 4f 55 54 3a 20 41 72 72 61 79     /* OUT: Array
bb60: 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73   of column names
bb70: 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 43 6f 6d 70   */.){.  /* Comp
bb80: 75 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  ute column names
bb90: 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 70 2d 3e   */.  if( 0==p->
bba0: 61 70 43 6f 6c 4e 61 6d 65 20 29 7b 0a 20 20 20  apColName ){.   
bbb0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
bbc0: 53 74 6d 74 20 3d 20 70 2d 3e 70 50 72 65 53 74  Stmt = p->pPreSt
bbd0: 6d 74 2d 3e 70 53 74 6d 74 3b 0a 20 20 20 20 69  mt->pStmt;.    i
bbe0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
bbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bc00: 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c  Iterator variabl
bc10: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f  e */.    int nCo
bc20: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
bc30: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
bc40: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75   of columns retu
bc50: 72 6e 65 64 20 62 79 20 70 53 74 6d 74 20 2a 2f  rned by pStmt */
bc60: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61  .    Tcl_Obj **a
bc70: 70 43 6f 6c 4e 61 6d 65 20 3d 20 30 3b 20 20 20  pColName = 0;   
bc80: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63     /* Array of c
bc90: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 0a  olumn names */..
bca0: 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 6e 43      p->nCol = nC
bcb0: 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ol = sqlite3_col
bcc0: 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29  umn_count(pStmt)
bcd0: 3b 0a 20 20 20 20 69 66 28 20 6e 43 6f 6c 3e 30  ;.    if( nCol>0
bce0: 20 26 26 20 28 70 61 70 43 6f 6c 4e 61 6d 65 20   && (papColName 
bcf0: 7c 7c 20 70 2d 3e 70 41 72 72 61 79 29 20 29 7b  || p->pArray) ){
bd00: 0a 20 20 20 20 20 20 61 70 43 6f 6c 4e 61 6d 65  .      apColName
bd10: 20 3d 20 28 54 63 6c 5f 4f 62 6a 2a 2a 29 54 63   = (Tcl_Obj**)Tc
bd20: 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  l_Alloc( sizeof(
bd30: 54 63 6c 5f 4f 62 6a 2a 29 2a 6e 43 6f 6c 20 29  Tcl_Obj*)*nCol )
bd40: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
bd50: 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
bd60: 20 20 20 20 20 20 20 61 70 43 6f 6c 4e 61 6d 65         apColName
bd70: 5b 69 5d 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72  [i] = Tcl_NewStr
bd80: 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63  ingObj(sqlite3_c
bd90: 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74  olumn_name(pStmt
bda0: 2c 69 29 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  ,i), -1);.      
bdb0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
bdc0: 6e 74 28 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29  nt(apColName[i])
bdd0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
bde0: 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 61  p->apColName = a
bdf0: 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 20 20 7d 0a  pColName;.    }.
be00: 0a 20 20 20 20 2f 2a 20 49 66 20 72 65 73 75 6c  .    /* If resul
be10: 74 73 20 61 72 65 20 62 65 69 6e 67 20 73 74 6f  ts are being sto
be20: 72 65 64 20 69 6e 20 61 6e 20 61 72 72 61 79 20  red in an array 
be30: 76 61 72 69 61 62 6c 65 2c 20 74 68 65 6e 20 63  variable, then c
be40: 72 65 61 74 65 0a 20 20 20 20 2a 2a 20 74 68 65  reate.    ** the
be50: 20 61 72 72 61 79 28 2a 29 20 65 6e 74 72 79 20   array(*) entry 
be60: 66 6f 72 20 74 68 61 74 20 61 72 72 61 79 0a 20  for that array. 
be70: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d     */.    if( p-
be80: 3e 70 41 72 72 61 79 20 29 7b 0a 20 20 20 20 20  >pArray ){.     
be90: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
bea0: 65 72 70 20 3d 20 70 2d 3e 70 44 62 2d 3e 69 6e  erp = p->pDb->in
beb0: 74 65 72 70 3b 0a 20 20 20 20 20 20 54 63 6c 5f  terp;.      Tcl_
bec0: 4f 62 6a 20 2a 70 43 6f 6c 4c 69 73 74 20 3d 20  Obj *pColList = 
bed0: 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20  Tcl_NewObj();.  
bee0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 74      Tcl_Obj *pSt
bef0: 61 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69  ar = Tcl_NewStri
bf00: 6e 67 4f 62 6a 28 22 2a 22 2c 20 2d 31 29 3b 0a  ngObj("*", -1);.
bf10: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
bf20: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
bf30: 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62        Tcl_ListOb
bf40: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
bf50: 6e 74 65 72 70 2c 20 70 43 6f 6c 4c 69 73 74 2c  nterp, pColList,
bf60: 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a   apColName[i]);.
bf70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 63        }.      Tc
bf80: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
bf90: 53 74 61 72 29 3b 0a 20 20 20 20 20 20 54 63 6c  Star);.      Tcl
bfa0: 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65  _ObjSetVar2(inte
bfb0: 72 70 2c 20 70 2d 3e 70 41 72 72 61 79 2c 20 70  rp, p->pArray, p
bfc0: 53 74 61 72 2c 20 70 43 6f 6c 4c 69 73 74 2c 20  Star, pColList, 
bfd0: 30 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 44 65  0);.      Tcl_De
bfe0: 63 72 52 65 66 43 6f 75 6e 74 28 70 53 74 61 72  crRefCount(pStar
bff0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
c000: 69 66 28 20 70 61 70 43 6f 6c 4e 61 6d 65 20 29  if( papColName )
c010: 7b 0a 20 20 20 20 2a 70 61 70 43 6f 6c 4e 61 6d  {.    *papColNam
c020: 65 20 3d 20 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65  e = p->apColName
c030: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 6e 43 6f  ;.  }.  if( pnCo
c040: 6c 20 29 7b 0a 20 20 20 20 2a 70 6e 43 6f 6c 20  l ){.    *pnCol 
c050: 3d 20 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7d 0a 7d  = p->nCol;.  }.}
c060: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6f  ../*.** Return o
c070: 6e 65 20 6f 66 20 54 43 4c 5f 4f 4b 2c 20 54 43  ne of TCL_OK, TC
c080: 4c 5f 42 52 45 41 4b 20 6f 72 20 54 43 4c 5f 45  L_BREAK or TCL_E
c090: 52 52 4f 52 2e 20 49 66 20 54 43 4c 5f 45 52 52  RROR. If TCL_ERR
c0a0: 4f 52 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  OR is.** returne
c0b0: 64 2c 20 74 68 65 6e 20 61 6e 20 65 72 72 6f 72  d, then an error
c0c0: 20 6d 65 73 73 61 67 65 20 69 73 20 73 74 6f 72   message is stor
c0d0: 65 64 20 69 6e 20 74 68 65 20 69 6e 74 65 72 70  ed in the interp
c0e0: 72 65 74 65 72 20 62 65 66 6f 72 65 0a 2a 2a 20  reter before.** 
c0f0: 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
c100: 20 41 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20   A return value 
c110: 6f 66 20 54 43 4c 5f 4f 4b 20 6d 65 61 6e 73 20  of TCL_OK means 
c120: 74 68 65 72 65 20 69 73 20 61 20 72 6f 77 20 6f  there is a row o
c130: 66 20 64 61 74 61 20 61 76 61 69 6c 61 62 6c 65  f data available
c140: 2e 20 54 68 65 0a 2a 2a 20 64 61 74 61 20 6d 61  . The.** data ma
c150: 79 20 62 65 20 61 63 63 65 73 73 65 64 20 75 73  y be accessed us
c160: 69 6e 67 20 64 62 45 76 61 6c 52 6f 77 49 6e 66  ing dbEvalRowInf
c170: 6f 28 29 20 61 6e 64 20 64 62 45 76 61 6c 43 6f  o() and dbEvalCo
c180: 6c 75 6d 6e 56 61 6c 75 65 28 29 2e 20 54 68 69  lumnValue(). Thi
c190: 73 0a 2a 2a 20 69 73 20 61 6e 61 6c 6f 67 6f 75  s.** is analogou
c1a0: 73 20 74 6f 20 61 20 72 65 74 75 72 6e 20 6f 66  s to a return of
c1b0: 20 53 51 4c 49 54 45 5f 52 4f 57 20 66 72 6f 6d   SQLITE_ROW from
c1c0: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e   sqlite3_step().
c1d0: 20 49 66 20 54 43 4c 5f 42 52 45 41 4b 0a 2a 2a   If TCL_BREAK.**
c1e0: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68   is returned, th
c1f0: 65 6e 20 74 68 65 20 53 51 4c 20 73 63 72 69 70  en the SQL scrip
c200: 74 20 68 61 73 20 66 69 6e 69 73 68 65 64 20 65  t has finished e
c210: 78 65 63 75 74 69 6e 67 20 61 6e 64 20 74 68 65  xecuting and the
c220: 72 65 20 61 72 65 0a 2a 2a 20 6e 6f 20 66 75 72  re are.** no fur
c230: 74 68 65 72 20 72 6f 77 73 20 61 76 61 69 6c 61  ther rows availa
c240: 62 6c 65 2e 20 54 68 69 73 20 69 73 20 73 69 6d  ble. This is sim
c250: 69 6c 61 72 20 74 6f 20 53 51 4c 49 54 45 5f 44  ilar to SQLITE_D
c260: 4f 4e 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ONE..*/.static i
c270: 6e 74 20 64 62 45 76 61 6c 53 74 65 70 28 44 62  nt dbEvalStep(Db
c280: 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 70 29 7b  EvalContext *p){
c290: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
c2a0: 50 72 65 76 53 71 6c 20 3d 20 30 3b 20 20 20 20  PrevSql = 0;    
c2b0: 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 76     /* Previous v
c2c0: 61 6c 75 65 20 6f 66 20 70 2d 3e 7a 53 71 6c 20  alue of p->zSql 
c2d0: 2a 2f 0a 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e  */..  while( p->
c2e0: 7a 53 71 6c 5b 30 5d 20 7c 7c 20 70 2d 3e 70 50  zSql[0] || p->pP
c2f0: 72 65 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 6e  reStmt ){.    in
c300: 74 20 72 63 3b 0a 20 20 20 20 69 66 28 20 70 2d  t rc;.    if( p-
c310: 3e 70 50 72 65 53 74 6d 74 3d 3d 30 20 29 7b 0a  >pPreStmt==0 ){.
c320: 20 20 20 20 20 20 7a 50 72 65 76 53 71 6c 20 3d        zPrevSql =
c330: 20 28 70 2d 3e 7a 53 71 6c 3d 3d 7a 50 72 65 76   (p->zSql==zPrev
c340: 53 71 6c 20 3f 20 30 20 3a 20 70 2d 3e 7a 53 71  Sql ? 0 : p->zSq
c350: 6c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 64  l);.      rc = d
c360: 62 50 72 65 70 61 72 65 41 6e 64 42 69 6e 64 28  bPrepareAndBind(
c370: 70 2d 3e 70 44 62 2c 20 70 2d 3e 7a 53 71 6c 2c  p->pDb, p->zSql,
c380: 20 26 70 2d 3e 7a 53 71 6c 2c 20 26 70 2d 3e 70   &p->zSql, &p->p
c390: 50 72 65 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  PreStmt);.      
c3a0: 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 29  if( rc!=TCL_OK )
c3b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
c3c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
c3d0: 20 72 63 73 3b 0a 20 20 20 20 20 20 53 71 6c 69   rcs;.      Sqli
c3e0: 74 65 44 62 20 2a 70 44 62 20 3d 20 70 2d 3e 70  teDb *pDb = p->p
c3f0: 44 62 3b 0a 20 20 20 20 20 20 53 71 6c 50 72 65  Db;.      SqlPre
c400: 70 61 72 65 64 53 74 6d 74 20 2a 70 50 72 65 53  paredStmt *pPreS
c410: 74 6d 74 20 3d 20 70 2d 3e 70 50 72 65 53 74 6d  tmt = p->pPreStm
c420: 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
c430: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 70  _stmt *pStmt = p
c440: 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74 3b 0a  PreStmt->pStmt;.
c450: 0a 20 20 20 20 20 20 72 63 73 20 3d 20 73 71 6c  .      rcs = sql
c460: 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
c470: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 73 3d  ;.      if( rcs=
c480: 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
c490: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
c4a0: 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  L_OK;.      }.  
c4b0: 20 20 20 20 69 66 28 20 70 2d 3e 70 41 72 72 61      if( p->pArra
c4c0: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 64 62 45  y ){.        dbE
c4d0: 76 61 6c 52 6f 77 49 6e 66 6f 28 70 2c 20 30 2c  valRowInfo(p, 0,
c4e0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
c4f0: 20 20 20 72 63 73 20 3d 20 73 71 6c 69 74 65 33     rcs = sqlite3
c500: 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 0a  _reset(pStmt);..
c510: 20 20 20 20 20 20 70 44 62 2d 3e 6e 53 74 65 70        pDb->nStep
c520: 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f   = sqlite3_stmt_
c530: 73 74 61 74 75 73 28 70 53 74 6d 74 2c 53 51 4c  status(pStmt,SQL
c540: 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46  ITE_STMTSTATUS_F
c550: 55 4c 4c 53 43 41 4e 5f 53 54 45 50 2c 31 29 3b  ULLSCAN_STEP,1);
c560: 0a 20 20 20 20 20 20 70 44 62 2d 3e 6e 53 6f 72  .      pDb->nSor
c570: 74 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  t = sqlite3_stmt
c580: 5f 73 74 61 74 75 73 28 70 53 74 6d 74 2c 53 51  _status(pStmt,SQ
c590: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
c5a0: 53 4f 52 54 2c 31 29 3b 0a 20 20 20 20 20 20 70  SORT,1);.      p
c5b0: 44 62 2d 3e 6e 49 6e 64 65 78 20 3d 20 73 71 6c  Db->nIndex = sql
c5c0: 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73  ite3_stmt_status
c5d0: 28 70 53 74 6d 74 2c 53 51 4c 49 54 45 5f 53 54  (pStmt,SQLITE_ST
c5e0: 4d 54 53 54 41 54 55 53 5f 41 55 54 4f 49 4e 44  MTSTATUS_AUTOIND
c5f0: 45 58 2c 31 29 3b 0a 20 20 20 20 20 20 64 62 52  EX,1);.      dbR
c600: 65 6c 65 61 73 65 43 6f 6c 75 6d 6e 4e 61 6d 65  eleaseColumnName
c610: 73 28 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  s(p);.      p->p
c620: 50 72 65 53 74 6d 74 20 3d 20 30 3b 0a 0a 20 20  PreStmt = 0;..  
c630: 20 20 20 20 69 66 28 20 72 63 73 21 3d 53 51 4c      if( rcs!=SQL
c640: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
c650: 20 20 2f 2a 20 49 66 20 61 20 72 75 6e 2d 74 69    /* If a run-ti
c660: 6d 65 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  me error occurs,
c670: 20 72 65 70 6f 72 74 20 74 68 65 20 65 72 72 6f   report the erro
c680: 72 20 61 6e 64 20 73 74 6f 70 20 72 65 61 64 69  r and stop readi
c690: 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  ng.        ** th
c6a0: 65 20 53 51 4c 2e 20 20 2a 2f 0a 20 20 20 20 20  e SQL.  */.     
c6b0: 20 20 20 64 62 52 65 6c 65 61 73 65 53 74 6d 74     dbReleaseStmt
c6c0: 28 70 44 62 2c 20 70 50 72 65 53 74 6d 74 2c 20  (pDb, pPreStmt, 
c6d0: 31 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 54  1);.#if SQLITE_T
c6e0: 45 53 54 0a 20 20 20 20 20 20 20 20 69 66 28 20  EST.        if( 
c6f0: 70 2d 3e 70 44 62 2d 3e 62 4c 65 67 61 63 79 50  p->pDb->bLegacyP
c700: 72 65 70 61 72 65 20 26 26 20 72 63 73 3d 3d 53  repare && rcs==S
c710: 51 4c 49 54 45 5f 53 43 48 45 4d 41 20 26 26 20  QLITE_SCHEMA && 
c720: 7a 50 72 65 76 53 71 6c 20 29 7b 0a 20 20 20 20  zPrevSql ){.    
c730: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
c740: 72 75 6e 74 69 6d 65 20 65 72 72 6f 72 20 77 61  runtime error wa
c750: 73 20 61 6e 20 53 51 4c 49 54 45 5f 53 43 48 45  s an SQLITE_SCHE
c760: 4d 41 2c 20 61 6e 64 20 74 68 65 20 64 61 74 61  MA, and the data
c770: 62 61 73 65 0a 20 20 20 20 20 20 20 20 20 20 2a  base.          *
c780: 2a 20 68 61 6e 64 6c 65 20 69 73 20 63 6f 6e 66  * handle is conf
c790: 69 67 75 72 65 64 20 74 6f 20 75 73 65 20 74 68  igured to use th
c7a0: 65 20 6c 65 67 61 63 79 20 73 71 6c 69 74 65 33  e legacy sqlite3
c7b0: 5f 70 72 65 70 61 72 65 28 29 0a 20 20 20 20 20  _prepare().     
c7c0: 20 20 20 20 20 2a 2a 20 69 6e 74 65 72 66 61 63       ** interfac
c7d0: 65 2c 20 72 65 74 72 79 20 70 72 65 70 61 72 65  e, retry prepare
c7e0: 28 29 2f 73 74 65 70 28 29 20 6f 6e 20 74 68 65  ()/step() on the
c7f0: 20 73 61 6d 65 20 53 51 4c 20 73 74 61 74 65 6d   same SQL statem
c800: 65 6e 74 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ent..          *
c810: 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70  * This only happ
c820: 65 6e 73 20 6f 6e 63 65 2e 20 49 66 20 74 68 65  ens once. If the
c830: 72 65 20 69 73 20 61 20 73 65 63 6f 6e 64 20 53  re is a second S
c840: 51 4c 49 54 45 5f 53 43 48 45 4d 41 0a 20 20 20  QLITE_SCHEMA.   
c850: 20 20 20 20 20 20 20 2a 2a 20 65 72 72 6f 72 2c         ** error,
c860: 20 74 68 65 20 65 72 72 6f 72 20 77 69 6c 6c 20   the error will 
c870: 62 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  be returned to t
c880: 68 65 20 63 61 6c 6c 65 72 2e 20 2a 2f 0a 20 20  he caller. */.  
c890: 20 20 20 20 20 20 20 20 70 2d 3e 7a 53 71 6c 20          p->zSql 
c8a0: 3d 20 7a 50 72 65 76 53 71 6c 3b 0a 20 20 20 20  = zPrevSql;.    
c8b0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
c8c0: 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
c8d0: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74  .        Tcl_Set
c8e0: 4f 62 6a 52 65 73 75 6c 74 28 70 44 62 2d 3e 69  ObjResult(pDb->i
c8f0: 6e 74 65 72 70 2c 0a 20 20 20 20 20 20 20 20 20  nterp,.         
c900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c910: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
c920: 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28  (sqlite3_errmsg(
c930: 70 44 62 2d 3e 64 62 29 2c 20 2d 31 29 29 3b 0a  pDb->db), -1));.
c940: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
c950: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
c960: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 64  }else{.        d
c970: 62 52 65 6c 65 61 73 65 53 74 6d 74 28 70 44 62  bReleaseStmt(pDb
c980: 2c 20 70 50 72 65 53 74 6d 74 2c 20 30 29 3b 0a  , pPreStmt, 0);.
c990: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
c9a0: 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 73 68 65 64  }..  /* Finished
c9b0: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   */.  return TCL
c9c0: 5f 42 52 45 41 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _BREAK;.}../*.**
c9d0: 20 46 72 65 65 20 61 6c 6c 20 72 65 73 6f 75 72   Free all resour
c9e0: 63 65 73 20 63 75 72 72 65 6e 74 6c 79 20 68 65  ces currently he
c9f0: 6c 64 20 62 79 20 74 68 65 20 44 62 45 76 61 6c  ld by the DbEval
ca00: 43 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75 72  Context structur
ca10: 65 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74  e passed.** as t
ca20: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
ca30: 74 2e 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20  t. There should 
ca40: 62 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 63  be exactly one c
ca50: 61 6c 6c 20 74 6f 20 74 68 69 73 20 66 75 6e 63  all to this func
ca60: 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 65 61 63 68  tion.** for each
ca70: 20 63 61 6c 6c 20 74 6f 20 64 62 45 76 61 6c 49   call to dbEvalI
ca80: 6e 69 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  nit()..*/.static
ca90: 20 76 6f 69 64 20 64 62 45 76 61 6c 46 69 6e 61   void dbEvalFina
caa0: 6c 69 7a 65 28 44 62 45 76 61 6c 43 6f 6e 74 65  lize(DbEvalConte
cab0: 78 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  xt *p){.  if( p-
cac0: 3e 70 50 72 65 53 74 6d 74 20 29 7b 0a 20 20 20  >pPreStmt ){.   
cad0: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
cae0: 2d 3e 70 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d  ->pPreStmt->pStm
caf0: 74 29 3b 0a 20 20 20 20 64 62 52 65 6c 65 61 73  t);.    dbReleas
cb00: 65 53 74 6d 74 28 70 2d 3e 70 44 62 2c 20 70 2d  eStmt(p->pDb, p-
cb10: 3e 70 50 72 65 53 74 6d 74 2c 20 30 29 3b 0a 20  >pPreStmt, 0);. 
cb20: 20 20 20 70 2d 3e 70 50 72 65 53 74 6d 74 20 3d     p->pPreStmt =
cb30: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d   0;.  }.  if( p-
cb40: 3e 70 41 72 72 61 79 20 29 7b 0a 20 20 20 20 54  >pArray ){.    T
cb50: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
cb60: 70 2d 3e 70 41 72 72 61 79 29 3b 0a 20 20 20 20  p->pArray);.    
cb70: 70 2d 3e 70 41 72 72 61 79 20 3d 20 30 3b 0a 20  p->pArray = 0;. 
cb80: 20 7d 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66   }.  Tcl_DecrRef
cb90: 43 6f 75 6e 74 28 70 2d 3e 70 53 71 6c 29 3b 0a  Count(p->pSql);.
cba0: 20 20 64 62 52 65 6c 65 61 73 65 43 6f 6c 75 6d    dbReleaseColum
cbb0: 6e 4e 61 6d 65 73 28 70 29 3b 0a 7d 0a 0a 2f 2a  nNames(p);.}../*
cbc0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
cbd0: 6e 74 65 72 20 74 6f 20 61 20 54 63 6c 5f 4f 62  nter to a Tcl_Ob
cbe0: 6a 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68  j structure with
cbf0: 20 72 65 66 2d 63 6f 75 6e 74 20 30 20 74 68 61   ref-count 0 tha
cc00: 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68  t contains.** th
cc10: 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  e value for the 
cc20: 69 43 6f 6c 27 74 68 20 63 6f 6c 75 6d 6e 20 6f  iCol'th column o
cc30: 66 20 74 68 65 20 72 6f 77 20 63 75 72 72 65 6e  f the row curren
cc40: 74 6c 79 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  tly pointed to b
cc50: 79 0a 2a 2a 20 74 68 65 20 44 62 45 76 61 6c 43  y.** the DbEvalC
cc60: 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75 72 65  ontext structure
cc70: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
cc80: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  irst argument..*
cc90: 2f 0a 73 74 61 74 69 63 20 54 63 6c 5f 4f 62 6a  /.static Tcl_Obj
cca0: 20 2a 64 62 45 76 61 6c 43 6f 6c 75 6d 6e 56 61   *dbEvalColumnVa
ccb0: 6c 75 65 28 44 62 45 76 61 6c 43 6f 6e 74 65 78  lue(DbEvalContex
ccc0: 74 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b  t *p, int iCol){
ccd0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
cce0: 2a 70 53 74 6d 74 20 3d 20 70 2d 3e 70 50 72 65  *pStmt = p->pPre
ccf0: 53 74 6d 74 2d 3e 70 53 74 6d 74 3b 0a 20 20 73  Stmt->pStmt;.  s
cd00: 77 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f 63  witch( sqlite3_c
cd10: 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74  olumn_type(pStmt
cd20: 2c 20 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 63  , iCol) ){.    c
cd30: 61 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a  ase SQLITE_BLOB:
cd40: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 79 74   {.      int byt
cd50: 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  es = sqlite3_col
cd60: 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c  umn_bytes(pStmt,
cd70: 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 63 6f   iCol);.      co
cd80: 6e 73 74 20 63 68 61 72 20 2a 7a 42 6c 6f 62 20  nst char *zBlob 
cd90: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
cda0: 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 69 43 6f  _blob(pStmt, iCo
cdb0: 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a  l);.      if( !z
cdc0: 42 6c 6f 62 20 29 20 62 79 74 65 73 20 3d 20 30  Blob ) bytes = 0
cdd0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
cde0: 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f  cl_NewByteArrayO
cdf0: 62 6a 28 28 75 38 2a 29 7a 42 6c 6f 62 2c 20 62  bj((u8*)zBlob, b
ce00: 79 74 65 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ytes);.    }.   
ce10: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54   case SQLITE_INT
ce20: 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71  EGER: {.      sq
ce30: 6c 69 74 65 5f 69 6e 74 36 34 20 76 20 3d 20 73  lite_int64 v = s
ce40: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
ce50: 74 36 34 28 70 53 74 6d 74 2c 20 69 43 6f 6c 29  t64(pStmt, iCol)
ce60: 3b 0a 20 20 20 20 20 20 69 66 28 20 76 3e 3d 2d  ;.      if( v>=-
ce70: 32 31 34 37 34 38 33 36 34 37 20 26 26 20 76 3c  2147483647 && v<
ce80: 3d 32 31 34 37 34 38 33 36 34 37 20 29 7b 0a 20  =2147483647 ){. 
ce90: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 63         return Tc
cea0: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 28 69 6e 74  l_NewIntObj((int
ceb0: 29 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  )v);.      }else
cec0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
ced0: 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f   Tcl_NewWideIntO
cee0: 62 6a 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20  bj(v);.      }. 
cef0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
cf00: 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20  LITE_FLOAT: {.  
cf10: 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e      return Tcl_N
cf20: 65 77 44 6f 75 62 6c 65 4f 62 6a 28 73 71 6c 69  ewDoubleObj(sqli
cf30: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c  te3_column_doubl
cf40: 65 28 70 53 74 6d 74 2c 20 69 43 6f 6c 29 29 3b  e(pStmt, iCol));
cf50: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
cf60: 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20  SQLITE_NULL: {. 
cf70: 20 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f       return Tcl_
cf80: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 2d 3e  NewStringObj(p->
cf90: 70 44 62 2d 3e 7a 4e 75 6c 6c 2c 20 2d 31 29 3b  pDb->zNull, -1);
cfa0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
cfb0: 74 75 72 6e 20 54 63 6c 5f 4e 65 77 53 74 72 69  turn Tcl_NewStri
cfc0: 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73 71 6c  ngObj((char*)sql
cfd0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
cfe0: 28 70 53 74 6d 74 2c 20 69 43 6f 6c 29 2c 20 2d  (pStmt, iCol), -
cff0: 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  1);.}../*.** If 
d000: 75 73 69 6e 67 20 54 63 6c 20 76 65 72 73 69 6f  using Tcl versio
d010: 6e 20 38 2e 36 20 6f 72 20 67 72 65 61 74 65 72  n 8.6 or greater
d020: 2c 20 75 73 65 20 74 68 65 20 4e 52 20 66 75 6e  , use the NR fun
d030: 63 74 69 6f 6e 73 20 74 6f 20 61 76 6f 69 64 0a  ctions to avoid.
d040: 2a 2a 20 72 65 63 75 72 73 69 76 65 20 65 76 61  ** recursive eva
d050: 6c 75 74 69 6f 6e 20 6f 66 20 73 63 72 69 70 74  lution of script
d060: 73 20 62 79 20 74 68 65 20 5b 64 62 20 65 76 61  s by the [db eva
d070: 6c 5d 20 61 6e 64 20 5b 64 62 20 74 72 61 6e 73  l] and [db trans
d080: 5d 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 73 2e 20 45  ].** commands. E
d090: 76 65 6e 20 69 66 20 74 68 65 20 68 65 61 64 65  ven if the heade
d0a0: 72 73 20 75 73 65 64 20 77 68 69 6c 65 20 63 6f  rs used while co
d0b0: 6d 70 69 6c 69 6e 67 20 74 68 65 20 65 78 74 65  mpiling the exte
d0c0: 6e 73 69 6f 6e 0a 2a 2a 20 61 72 65 20 38 2e 36  nsion.** are 8.6
d0d0: 20 6f 72 20 6e 65 77 65 72 2c 20 74 68 65 20 63   or newer, the c
d0e0: 6f 64 65 20 73 74 69 6c 6c 20 74 65 73 74 73 20  ode still tests 
d0f0: 74 68 65 20 54 63 6c 20 76 65 72 73 69 6f 6e 20  the Tcl version 
d100: 61 74 20 72 75 6e 74 69 6d 65 2e 0a 2a 2a 20 54  at runtime..** T
d110: 68 69 73 20 61 6c 6c 6f 77 73 20 73 74 75 62 73  his allows stubs
d120: 2d 65 6e 61 62 6c 65 64 20 62 75 69 6c 64 73 20  -enabled builds 
d130: 74 6f 20 62 65 20 75 73 65 64 20 77 69 74 68 20  to be used with 
d140: 6f 6c 64 65 72 20 54 63 6c 20 6c 69 62 72 61 72  older Tcl librar
d150: 69 65 73 2e 0a 2a 2f 0a 23 69 66 20 54 43 4c 5f  ies..*/.#if TCL_
d160: 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 3e 38 20  MAJOR_VERSION>8 
d170: 7c 7c 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45  || (TCL_MAJOR_VE
d180: 52 53 49 4f 4e 3d 3d 38 20 26 26 20 54 43 4c 5f  RSION==8 && TCL_
d190: 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 3e 3d 36  MINOR_VERSION>=6
d1a0: 29 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  ).# define SQLIT
d1b0: 45 5f 54 43 4c 5f 4e 52 45 20 31 0a 73 74 61 74  E_TCL_NRE 1.stat
d1c0: 69 63 20 69 6e 74 20 44 62 55 73 65 4e 72 65 28  ic int DbUseNre(
d1d0: 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 6d 61 6a  void){.  int maj
d1e0: 6f 72 2c 20 6d 69 6e 6f 72 3b 0a 20 20 54 63 6c  or, minor;.  Tcl
d1f0: 5f 47 65 74 56 65 72 73 69 6f 6e 28 26 6d 61 6a  _GetVersion(&maj
d200: 6f 72 2c 20 26 6d 69 6e 6f 72 2c 20 30 2c 20 30  or, &minor, 0, 0
d210: 29 3b 0a 20 20 72 65 74 75 72 6e 28 20 28 6d 61  );.  return( (ma
d220: 6a 6f 72 3d 3d 38 20 26 26 20 6d 69 6e 6f 72 3e  jor==8 && minor>
d230: 3d 36 29 20 7c 7c 20 6d 61 6a 6f 72 3e 38 20 29  =6) || major>8 )
d240: 3b 0a 7d 0a 23 65 6c 73 65 0a 2f 2a 0a 2a 2a 20  ;.}.#else./*.** 
d250: 43 6f 6d 70 69 6c 69 6e 67 20 75 73 69 6e 67 20  Compiling using 
d260: 68 65 61 64 65 72 73 20 65 61 72 6c 69 65 72 20  headers earlier 
d270: 74 68 61 6e 20 38 2e 36 2e 20 49 6e 20 74 68 69  than 8.6. In thi
d280: 73 20 63 61 73 65 20 4e 52 20 63 61 6e 6e 6f 74  s case NR cannot
d290: 20 62 65 0a 2a 2a 20 75 73 65 64 2c 20 73 6f 20   be.** used, so 
d2a0: 44 62 55 73 65 4e 72 65 28 29 20 74 6f 20 61 6c  DbUseNre() to al
d2b0: 77 61 79 73 20 72 65 74 75 72 6e 20 7a 65 72 6f  ways return zero
d2c0: 2e 20 41 64 64 20 23 64 65 66 69 6e 65 73 20 66  . Add #defines f
d2d0: 6f 72 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20  or the other.** 
d2e0: 54 63 6c 5f 4e 52 78 78 78 28 29 20 66 75 6e 63  Tcl_NRxxx() func
d2f0: 74 69 6f 6e 73 20 74 6f 20 70 72 65 76 65 6e 74  tions to prevent
d300: 20 74 68 65 6d 20 66 72 6f 6d 20 63 61 75 73 69   them from causi
d310: 6e 67 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 65  ng compilation e
d320: 72 72 6f 72 73 2c 0a 2a 2a 20 65 76 65 6e 20 74  rrors,.** even t
d330: 68 6f 75 67 68 20 74 68 65 20 6f 6e 6c 79 20 69  hough the only i
d340: 6e 76 6f 63 61 74 69 6f 6e 73 20 6f 66 20 74 68  nvocations of th
d350: 65 6d 20 61 72 65 20 77 69 74 68 69 6e 20 63 6f  em are within co
d360: 6e 64 69 74 69 6f 6e 61 6c 20 62 6c 6f 63 6b 73  nditional blocks
d370: 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a  .** of the form:
d380: 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 44 62 55  .**.**   if( DbU
d390: 73 65 4e 72 65 28 29 20 29 20 7b 20 2e 2e 2e 20  seNre() ) { ... 
d3a0: 7d 0a 2a 2f 0a 23 20 64 65 66 69 6e 65 20 53 51  }.*/.# define SQ
d3b0: 4c 49 54 45 5f 54 43 4c 5f 4e 52 45 20 30 0a 23  LITE_TCL_NRE 0.#
d3c0: 20 64 65 66 69 6e 65 20 44 62 55 73 65 4e 72 65   define DbUseNre
d3d0: 28 29 20 30 0a 23 20 64 65 66 69 6e 65 20 54 63  () 0.# define Tc
d3e0: 6c 5f 4e 52 41 64 64 43 61 6c 6c 62 61 63 6b 28  l_NRAddCallback(
d3f0: 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 28 76 6f  a,b,c,d,e,f) (vo
d400: 69 64 29 30 0a 23 20 64 65 66 69 6e 65 20 54 63  id)0.# define Tc
d410: 6c 5f 4e 52 45 76 61 6c 4f 62 6a 28 61 2c 62 2c  l_NREvalObj(a,b,
d420: 63 29 20 30 0a 23 20 64 65 66 69 6e 65 20 54 63  c) 0.# define Tc
d430: 6c 5f 4e 52 43 72 65 61 74 65 43 6f 6d 6d 61 6e  l_NRCreateComman
d440: 64 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 28  d(a,b,c,d,e,f) (
d450: 76 6f 69 64 29 30 0a 23 65 6e 64 69 66 0a 0a 2f  void)0.#endif../
d460: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
d470: 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  on is part of th
d480: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
d490: 20 6f 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64 3a   of the command:
d4a0: 0a 2a 2a 0a 2a 2a 20 20 20 24 64 62 20 65 76 61  .**.**   $db eva
d4b0: 6c 20 53 51 4c 20 3f 41 52 52 41 59 4e 41 4d 45  l SQL ?ARRAYNAME
d4c0: 3f 20 53 43 52 49 50 54 0a 2a 2f 0a 73 74 61 74  ? SCRIPT.*/.stat
d4d0: 69 63 20 69 6e 74 20 44 62 45 76 61 6c 4e 65 78  ic int DbEvalNex
d4e0: 74 43 6d 64 28 0a 20 20 43 6c 69 65 6e 74 44 61  tCmd(.  ClientDa
d4f0: 74 61 20 64 61 74 61 5b 5d 2c 20 20 20 20 20 20  ta data[],      
d500: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d510: 64 61 74 61 5b 30 5d 20 69 73 20 74 68 65 20 28  data[0] is the (
d520: 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 2a 29 20  DbEvalContext*) 
d530: 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
d540: 2a 69 6e 74 65 72 70 2c 20 20 20 20 20 20 20 20  *interp,        
d550: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 63 6c            /* Tcl
d560: 20 69 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a   interpreter */.
d570: 20 20 69 6e 74 20 72 65 73 75 6c 74 20 20 20 20    int result    
d580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d590: 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
d5a0: 20 73 6f 20 66 61 72 20 2a 2f 0a 29 7b 0a 20 20   so far */.){.  
d5b0: 69 6e 74 20 72 63 20 3d 20 72 65 73 75 6c 74 3b  int rc = result;
d5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5d0: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
d5e0: 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65  ode */..  /* The
d5f0: 20 66 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 6f   first element o
d600: 66 20 74 68 65 20 64 61 74 61 5b 5d 20 61 72 72  f the data[] arr
d610: 61 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ay is a pointer 
d620: 74 6f 20 61 20 44 62 45 76 61 6c 43 6f 6e 74 65  to a DbEvalConte
d630: 78 74 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72  xt.  ** structur
d640: 65 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e  e allocated usin
d650: 67 20 54 63 6c 5f 41 6c 6c 6f 63 28 29 2e 20 54  g Tcl_Alloc(). T
d660: 68 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e  he second elemen
d670: 74 20 6f 66 20 64 61 74 61 5b 5d 0a 20 20 2a 2a  t of data[].  **
d680: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
d690: 20 61 20 54 63 6c 5f 4f 62 6a 20 63 6f 6e 74 61   a Tcl_Obj conta
d6a0: 69 6e 69 6e 67 20 74 68 65 20 73 63 72 69 70 74  ining the script
d6b0: 20 74 6f 20 72 75 6e 20 66 6f 72 20 65 61 63 68   to run for each
d6c0: 20 72 6f 77 0a 20 20 2a 2a 20 72 65 74 75 72 6e   row.  ** return
d6d0: 65 64 20 62 79 20 74 68 65 20 71 75 65 72 69 65  ed by the querie
d6e0: 73 20 65 6e 63 61 70 73 75 6c 61 74 65 64 20 69  s encapsulated i
d6f0: 6e 20 64 61 74 61 5b 30 5d 2e 20 2a 2f 0a 20 20  n data[0]. */.  
d700: 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 70  DbEvalContext *p
d710: 20 3d 20 28 44 62 45 76 61 6c 43 6f 6e 74 65 78   = (DbEvalContex
d720: 74 20 2a 29 64 61 74 61 5b 30 5d 3b 0a 20 20 54  t *)data[0];.  T
d730: 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 20  cl_Obj *pScript 
d740: 3d 20 28 54 63 6c 5f 4f 62 6a 20 2a 29 64 61 74  = (Tcl_Obj *)dat
d750: 61 5b 31 5d 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  a[1];.  Tcl_Obj 
d760: 2a 70 41 72 72 61 79 20 3d 20 70 2d 3e 70 41 72  *pArray = p->pAr
d770: 72 61 79 3b 0a 0a 20 20 77 68 69 6c 65 28 20 28  ray;..  while( (
d780: 72 63 3d 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 72 63  rc==TCL_OK || rc
d790: 3d 3d 54 43 4c 5f 43 4f 4e 54 49 4e 55 45 29 20  ==TCL_CONTINUE) 
d7a0: 26 26 20 54 43 4c 5f 4f 4b 3d 3d 28 72 63 20 3d  && TCL_OK==(rc =
d7b0: 20 64 62 45 76 61 6c 53 74 65 70 28 70 29 29 20   dbEvalStep(p)) 
d7c0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
d7d0: 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20    int nCol;.    
d7e0: 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 43 6f 6c 4e  Tcl_Obj **apColN
d7f0: 61 6d 65 3b 0a 20 20 20 20 64 62 45 76 61 6c 52  ame;.    dbEvalR
d800: 6f 77 49 6e 66 6f 28 70 2c 20 26 6e 43 6f 6c 2c  owInfo(p, &nCol,
d810: 20 26 61 70 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20   &apColName);.  
d820: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
d830: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54  l; i++){.      T
d840: 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c 20 3d 20 64  cl_Obj *pVal = d
d850: 62 45 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65  bEvalColumnValue
d860: 28 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66  (p, i);.      if
d870: 28 20 70 41 72 72 61 79 3d 3d 30 20 29 7b 0a 20  ( pArray==0 ){. 
d880: 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65         Tcl_ObjSe
d890: 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 61 70  tVar2(interp, ap
d8a0: 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20 30 2c 20 70  ColName[i], 0, p
d8b0: 56 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  Val, 0);.      }
d8c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 54 63  else{.        Tc
d8d0: 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74  l_ObjSetVar2(int
d8e0: 65 72 70 2c 20 70 41 72 72 61 79 2c 20 61 70 43  erp, pArray, apC
d8f0: 6f 6c 4e 61 6d 65 5b 69 5d 2c 20 70 56 61 6c 2c  olName[i], pVal,
d900: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
d910: 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72   }..    /* The r
d920: 65 71 75 69 72 65 64 20 69 6e 74 65 72 70 72 65  equired interpre
d930: 74 65 72 20 76 61 72 69 61 62 6c 65 73 20 61 72  ter variables ar
d940: 65 20 6e 6f 77 20 70 6f 70 75 6c 61 74 65 64 20  e now populated 
d950: 77 69 74 68 20 74 68 65 20 64 61 74 61 0a 20 20  with the data.  
d960: 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 63 75    ** from the cu
d970: 72 72 65 6e 74 20 72 6f 77 2e 20 49 66 20 75 73  rrent row. If us
d980: 69 6e 67 20 4e 52 45 2c 20 73 63 68 65 64 75 6c  ing NRE, schedul
d990: 65 20 63 61 6c 6c 62 61 63 6b 73 20 74 6f 20 65  e callbacks to e
d9a0: 76 61 6c 75 61 74 65 0a 20 20 20 20 2a 2a 20 73  valuate.    ** s
d9b0: 63 72 69 70 74 20 70 53 63 72 69 70 74 2c 20 74  cript pScript, t
d9c0: 68 65 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68  hen to invoke th
d9d0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69  is function agai
d9e0: 6e 20 74 6f 20 66 65 74 63 68 20 74 68 65 20 6e  n to fetch the n
d9f0: 65 78 74 0a 20 20 20 20 2a 2a 20 72 6f 77 20 28  ext.    ** row (
da00: 6f 72 20 63 6c 65 61 6e 20 75 70 20 69 66 20 74  or clean up if t
da10: 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 78 74 20  here is no next 
da20: 72 6f 77 20 6f 72 20 74 68 65 20 73 63 72 69 70  row or the scrip
da30: 74 20 74 68 72 6f 77 73 20 61 6e 0a 20 20 20 20  t throws an.    
da40: 2a 2a 20 65 78 63 65 70 74 69 6f 6e 29 2e 20 41  ** exception). A
da50: 66 74 65 72 20 73 63 68 65 64 75 6c 69 6e 67 20  fter scheduling 
da60: 74 68 65 20 63 61 6c 6c 62 61 63 6b 73 2c 20 72  the callbacks, r
da70: 65 74 75 72 6e 20 63 6f 6e 74 72 6f 6c 20 74 6f  eturn control to
da80: 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 61 6c 6c   the.    ** call
da90: 65 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  er..    **.    *
daa0: 2a 20 49 66 20 6e 6f 74 20 75 73 69 6e 67 20 4e  * If not using N
dab0: 52 45 2c 20 65 76 61 6c 75 61 74 65 20 70 53 63  RE, evaluate pSc
dac0: 72 69 70 74 20 64 69 72 65 63 74 6c 79 20 61 6e  ript directly an
dad0: 64 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20  d continue with 
dae0: 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65 78 74 20  the.    ** next 
daf0: 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 69  iteration of thi
db00: 73 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f  s while(...) loo
db10: 70 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 44  p.  */.    if( D
db20: 62 55 73 65 4e 72 65 28 29 20 29 7b 0a 20 20 20  bUseNre() ){.   
db30: 20 20 20 54 63 6c 5f 4e 52 41 64 64 43 61 6c 6c     Tcl_NRAddCall
db40: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 44 62 45  back(interp, DbE
db50: 76 61 6c 4e 65 78 74 43 6d 64 2c 20 28 76 6f 69  valNextCmd, (voi
db60: 64 2a 29 70 2c 20 28 76 6f 69 64 2a 29 70 53 63  d*)p, (void*)pSc
db70: 72 69 70 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ript, 0, 0);.   
db80: 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e 52     return Tcl_NR
db90: 45 76 61 6c 4f 62 6a 28 69 6e 74 65 72 70 2c 20  EvalObj(interp, 
dba0: 70 53 63 72 69 70 74 2c 20 30 29 3b 0a 20 20 20  pScript, 0);.   
dbb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
dbc0: 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78   = Tcl_EvalObjEx
dbd0: 28 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74  (interp, pScript
dbe0: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 0);.    }.  }.
dbf0: 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  .  Tcl_DecrRefCo
dc00: 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 20 20  unt(pScript);.  
dc10: 64 62 45 76 61 6c 46 69 6e 61 6c 69 7a 65 28 70  dbEvalFinalize(p
dc20: 29 3b 0a 20 20 54 63 6c 5f 46 72 65 65 28 28 63  );.  Tcl_Free((c
dc30: 68 61 72 20 2a 29 70 29 3b 0a 0a 20 20 69 66 28  har *)p);..  if(
dc40: 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 72   rc==TCL_OK || r
dc50: 63 3d 3d 54 43 4c 5f 42 52 45 41 4b 20 29 7b 0a  c==TCL_BREAK ){.
dc60: 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73      Tcl_ResetRes
dc70: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  ult(interp);.   
dc80: 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20   rc = TCL_OK;.  
dc90: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
dca0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
dcb0: 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79  ction is used by
dcc0: 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
dcd0: 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ions of the foll
dce0: 6f 77 69 6e 67 20 64 61 74 61 62 61 73 65 0a 2a  owing database.*
dcf0: 2a 20 68 61 6e 64 6c 65 20 73 75 62 2d 63 6f 6d  * handle sub-com
dd00: 6d 61 6e 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 24  mands:.**.**   $
dd10: 64 62 20 75 70 64 61 74 65 5f 68 6f 6f 6b 20 3f  db update_hook ?
dd20: 53 43 52 49 50 54 3f 0a 2a 2a 20 20 20 24 64 62  SCRIPT?.**   $db
dd30: 20 77 61 6c 5f 68 6f 6f 6b 20 3f 53 43 52 49 50   wal_hook ?SCRIP
dd40: 54 3f 0a 2a 2a 20 20 20 24 64 62 20 63 6f 6d 6d  T?.**   $db comm
dd50: 69 74 5f 68 6f 6f 6b 20 3f 53 43 52 49 50 54 3f  it_hook ?SCRIPT?
dd60: 0a 2a 2a 20 20 20 24 64 62 20 70 72 65 75 70 64  .**   $db preupd
dd70: 61 74 65 20 68 6f 6f 6b 20 3f 53 43 52 49 50 54  ate hook ?SCRIPT
dd80: 3f 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ?.*/.static void
dd90: 20 44 62 48 6f 6f 6b 43 6d 64 28 0a 20 20 54 63   DbHookCmd(.  Tc
dda0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
ddb0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
ddc0: 20 54 63 6c 20 69 6e 74 65 72 70 72 65 74 65 72   Tcl interpreter
ddd0: 20 2a 2f 0a 20 20 53 71 6c 69 74 65 44 62 20 2a   */.  SqliteDb *
dde0: 70 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  pDb,            
ddf0: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
de00: 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 54 63  e handle */.  Tc
de10: 6c 5f 4f 62 6a 20 2a 70 41 72 67 2c 20 20 20 20  l_Obj *pArg,    
de20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
de30: 20 53 43 52 49 50 54 20 61 72 67 75 6d 65 6e 74   SCRIPT argument
de40: 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20   (or NULL) */.  
de50: 54 63 6c 5f 4f 62 6a 20 2a 2a 70 70 48 6f 6f 6b  Tcl_Obj **ppHook
de60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de70: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6d 65  /* Pointer to me
de80: 6d 62 65 72 20 6f 66 20 53 71 6c 69 74 65 44 62  mber of SqliteDb
de90: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
dea0: 20 2a 64 62 20 3d 20 70 44 62 2d 3e 64 62 3b 0a   *db = pDb->db;.
deb0: 0a 20 20 69 66 28 20 2a 70 70 48 6f 6f 6b 20 29  .  if( *ppHook )
dec0: 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  {.    Tcl_SetObj
ded0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 2a  Result(interp, *
dee0: 70 70 48 6f 6f 6b 29 3b 0a 20 20 20 20 69 66 28  ppHook);.    if(
def0: 20 70 41 72 67 20 29 7b 0a 20 20 20 20 20 20 54   pArg ){.      T
df00: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
df10: 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20 20 20 20 20  *ppHook);.      
df20: 2a 70 70 48 6f 6f 6b 20 3d 20 30 3b 0a 20 20 20  *ppHook = 0;.   
df30: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 72   }.  }.  if( pAr
df40: 67 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  g ){.    assert(
df50: 20 21 28 2a 70 70 48 6f 6f 6b 29 20 29 3b 0a 20   !(*ppHook) );. 
df60: 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 43 68     if( Tcl_GetCh
df70: 61 72 4c 65 6e 67 74 68 28 70 41 72 67 29 3e 30  arLength(pArg)>0
df80: 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 48 6f 6f   ){.      *ppHoo
df90: 6b 20 3d 20 70 41 72 67 3b 0a 20 20 20 20 20 20  k = pArg;.      
dfa0: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
dfb0: 28 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20 20 20 7d  (*ppHook);.    }
dfc0: 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  .  }..#ifdef SQL
dfd0: 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50  ITE_ENABLE_PREUP
dfe0: 44 41 54 45 5f 48 4f 4f 4b 0a 20 20 73 71 6c 69  DATE_HOOK.  sqli
dff0: 74 65 33 5f 70 72 65 75 70 64 61 74 65 5f 68 6f  te3_preupdate_ho
e000: 6f 6b 28 64 62 2c 20 28 70 44 62 2d 3e 70 50 72  ok(db, (pDb->pPr
e010: 65 55 70 64 61 74 65 48 6f 6f 6b 3f 44 62 50 72  eUpdateHook?DbPr
e020: 65 55 70 64 61 74 65 48 61 6e 64 6c 65 72 3a 30  eUpdateHandler:0
e030: 29 2c 20 70 44 62 29 3b 0a 23 65 6e 64 69 66 0a  ), pDb);.#endif.
e040: 20 20 73 71 6c 69 74 65 33 5f 75 70 64 61 74 65    sqlite3_update
e050: 5f 68 6f 6f 6b 28 64 62 2c 20 28 70 44 62 2d 3e  _hook(db, (pDb->
e060: 70 55 70 64 61 74 65 48 6f 6f 6b 3f 44 62 55 70  pUpdateHook?DbUp
e070: 64 61 74 65 48 61 6e 64 6c 65 72 3a 30 29 2c 20  dateHandler:0), 
e080: 70 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pDb);.  sqlite3_
e090: 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28 64 62  rollback_hook(db
e0a0: 2c 20 28 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63  , (pDb->pRollbac
e0b0: 6b 48 6f 6f 6b 3f 44 62 52 6f 6c 6c 62 61 63 6b  kHook?DbRollback
e0c0: 48 61 6e 64 6c 65 72 3a 30 29 2c 20 70 44 62 29  Handler:0), pDb)
e0d0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  ;.  sqlite3_wal_
e0e0: 68 6f 6f 6b 28 64 62 2c 20 28 70 44 62 2d 3e 70  hook(db, (pDb->p
e0f0: 57 61 6c 48 6f 6f 6b 3f 44 62 57 61 6c 48 61 6e  WalHook?DbWalHan
e100: 64 6c 65 72 3a 30 29 2c 20 70 44 62 29 3b 0a 7d  dler:0), pDb);.}
e110: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 22 73 71 6c  ../*.** The "sql
e120: 69 74 65 22 20 63 6f 6d 6d 61 6e 64 20 62 65 6c  ite" command bel
e130: 6f 77 20 63 72 65 61 74 65 73 20 61 20 6e 65 77  ow creates a new
e140: 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 66 6f 72   Tcl command for
e150: 20 65 61 63 68 0a 2a 2a 20 63 6f 6e 6e 65 63 74   each.** connect
e160: 69 6f 6e 20 69 74 20 6f 70 65 6e 73 20 74 6f 20  ion it opens to 
e170: 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  an SQLite databa
e180: 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  se.  This routin
e190: 65 20 69 73 20 69 6e 76 6f 6b 65 64 0a 2a 2a 20  e is invoked.** 
e1a0: 77 68 65 6e 65 76 65 72 20 6f 6e 65 20 6f 66 20  whenever one of 
e1b0: 74 68 6f 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  those connection
e1c0: 2d 73 70 65 63 69 66 69 63 20 63 6f 6d 6d 61 6e  -specific comman
e1d0: 64 73 20 69 73 20 65 78 65 63 75 74 65 64 0a 2a  ds is executed.*
e1e0: 2a 20 69 6e 20 54 63 6c 2e 20 20 46 6f 72 20 65  * in Tcl.  For e
e1f0: 78 61 6d 70 6c 65 2c 20 69 66 20 79 6f 75 20 72  xample, if you r
e200: 75 6e 20 54 63 6c 20 63 6f 64 65 20 6c 69 6b 65  un Tcl code like
e210: 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
e220: 20 20 20 73 71 6c 69 74 65 33 20 64 62 31 20 20     sqlite3 db1  
e230: 22 6d 79 5f 64 61 74 61 62 61 73 65 22 0a 2a 2a  "my_database".**
e240: 20 20 20 20 20 20 20 64 62 31 20 63 6c 6f 73 65         db1 close
e250: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
e260: 20 63 6f 6d 6d 61 6e 64 20 6f 70 65 6e 73 20 61   command opens a
e270: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74   connection to t
e280: 68 65 20 22 6d 79 5f 64 61 74 61 62 61 73 65 22  he "my_database"
e290: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 61 6e 64   database.** and
e2a0: 20 63 61 6c 6c 73 20 74 68 61 74 20 63 6f 6e 6e   calls that conn
e2b0: 65 63 74 69 6f 6e 20 22 64 62 31 22 2e 20 20 54  ection "db1".  T
e2c0: 68 65 20 73 65 63 6f 6e 64 20 63 6f 6d 6d 61 6e  he second comman
e2d0: 64 20 63 61 75 73 65 73 20 74 68 69 73 0a 2a 2a  d causes this.**
e2e0: 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 62   subroutine to b
e2f0: 65 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a 73 74  e invoked..*/.st
e300: 61 74 69 63 20 69 6e 74 20 44 62 4f 62 6a 43 6d  atic int DbObjCm
e310: 64 28 76 6f 69 64 20 2a 63 64 2c 20 54 63 6c 5f  d(void *cd, Tcl_
e320: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
e330: 69 6e 74 20 6f 62 6a 63 2c 54 63 6c 5f 4f 62 6a  int objc,Tcl_Obj
e340: 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76 29 7b 0a 20   *const*objv){. 
e350: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
e360: 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a   (SqliteDb*)cd;.
e370: 20 20 69 6e 74 20 63 68 6f 69 63 65 3b 0a 20 20    int choice;.  
e380: 69 6e 74 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b  int rc = TCL_OK;
e390: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
e3a0: 63 68 61 72 20 2a 44 42 5f 73 74 72 73 5b 5d 20  char *DB_strs[] 
e3b0: 3d 20 7b 0a 20 20 20 20 22 61 75 74 68 6f 72 69  = {.    "authori
e3c0: 7a 65 72 22 2c 20 20 20 20 20 20 20 20 20 22 62  zer",         "b
e3d0: 61 63 6b 75 70 22 2c 20 20 20 20 20 20 20 20 20  ackup",         
e3e0: 20 20 20 22 62 75 73 79 22 2c 0a 20 20 20 20 22     "busy",.    "
e3f0: 63 61 63 68 65 22 2c 20 20 20 20 20 20 20 20 20  cache",         
e400: 20 20 20 20 20 22 63 68 61 6e 67 65 73 22 2c 20       "changes", 
e410: 20 20 20 20 20 20 20 20 20 20 22 63 6c 6f 73 65            "close
e420: 22 2c 0a 20 20 20 20 22 63 6f 6c 6c 61 74 65 22  ",.    "collate"
e430: 2c 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6f  ,            "co
e440: 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 22 2c  llation_needed",
e450: 20 20 22 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 22 2c    "commit_hook",
e460: 0a 20 20 20 20 22 63 6f 6d 70 6c 65 74 65 22 2c  .    "complete",
e470: 20 20 20 20 20 20 20 20 20 20 20 22 63 6f 70 79             "copy
e480: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
e490: 22 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74  "enable_load_ext
e4a0: 65 6e 73 69 6f 6e 22 2c 0a 20 20 20 20 22 65 72  ension",.    "er
e4b0: 72 6f 72 63 6f 64 65 22 2c 20 20 20 20 20 20 20  rorcode",       
e4c0: 20 20 20 22 65 76 61 6c 22 2c 20 20 20 20 20 20     "eval",      
e4d0: 20 20 20 20 20 20 20 20 22 65 78 69 73 74 73 22          "exists"
e4e0: 2c 0a 20 20 20 20 22 66 75 6e 63 74 69 6f 6e 22  ,.    "function"
e4f0: 2c 20 20 20 20 20 20 20 20 20 20 20 22 69 6e 63  ,           "inc
e500: 72 62 6c 6f 62 22 2c 20 20 20 20 20 20 20 20 20  rblob",         
e510: 20 22 69 6e 74 65 72 72 75 70 74 22 2c 0a 20 20   "interrupt",.  
e520: 20 20 22 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72    "last_insert_r
e530: 6f 77 69 64 22 2c 20 20 22 6e 75 6c 6c 76 61 6c  owid",  "nullval
e540: 75 65 22 2c 20 20 20 20 20 20 20 20 20 22 6f 6e  ue",         "on
e550: 65 63 6f 6c 75 6d 6e 22 2c 0a 20 20 20 20 22 70  ecolumn",.    "p
e560: 72 65 75 70 64 61 74 65 22 2c 20 20 20 20 20 20  reupdate",      
e570: 20 20 20 20 22 70 72 6f 66 69 6c 65 22 2c 20 20      "profile",  
e580: 20 20 20 20 20 20 20 20 20 22 70 72 6f 67 72 65           "progre
e590: 73 73 22 2c 0a 20 20 20 20 22 72 65 6b 65 79 22  ss",.    "rekey"
e5a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ,              "
e5b0: 72 65 73 74 6f 72 65 22 2c 20 20 20 20 20 20 20  restore",       
e5c0: 20 20 20 20 22 72 6f 6c 6c 62 61 63 6b 5f 68 6f      "rollback_ho
e5d0: 6f 6b 22 2c 0a 20 20 20 20 22 73 74 61 74 75 73  ok",.    "status
e5e0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ",             "
e5f0: 74 69 6d 65 6f 75 74 22 2c 20 20 20 20 20 20 20  timeout",       
e600: 20 20 20 20 22 74 6f 74 61 6c 5f 63 68 61 6e 67      "total_chang
e610: 65 73 22 2c 0a 20 20 20 20 22 74 72 61 63 65 22  es",.    "trace"
e620: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ,              "
e630: 74 72 61 63 65 5f 76 32 22 2c 20 20 20 20 20 20  trace_v2",      
e640: 20 20 20 20 22 74 72 61 6e 73 61 63 74 69 6f 6e      "transaction
e650: 22 2c 0a 20 20 20 20 22 75 6e 6c 6f 63 6b 5f 6e  ",.    "unlock_n
e660: 6f 74 69 66 79 22 2c 20 20 20 20 20 20 22 75 70  otify",      "up
e670: 64 61 74 65 5f 68 6f 6f 6b 22 2c 20 20 20 20 20  date_hook",     
e680: 20 20 22 76 65 72 73 69 6f 6e 22 2c 0a 20 20 20    "version",.   
e690: 20 22 77 61 6c 5f 68 6f 6f 6b 22 2c 0a 20 20 20   "wal_hook",.   
e6a0: 20 30 0a 20 20 7d 3b 0a 20 20 65 6e 75 6d 20 44   0.  };.  enum D
e6b0: 42 5f 65 6e 75 6d 20 7b 0a 20 20 20 20 44 42 5f  B_enum {.    DB_
e6c0: 41 55 54 48 4f 52 49 5a 45 52 2c 20 20 20 20 20  AUTHORIZER,     
e6d0: 20 20 20 44 42 5f 42 41 43 4b 55 50 2c 20 20 20     DB_BACKUP,   
e6e0: 20 20 20 20 20 20 20 20 44 42 5f 42 55 53 59 2c          DB_BUSY,
e6f0: 0a 20 20 20 20 44 42 5f 43 41 43 48 45 2c 20 20  .    DB_CACHE,  
e700: 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 43 48             DB_CH
e710: 41 4e 47 45 53 2c 20 20 20 20 20 20 20 20 20 20  ANGES,          
e720: 44 42 5f 43 4c 4f 53 45 2c 0a 20 20 20 20 44 42  DB_CLOSE,.    DB
e730: 5f 43 4f 4c 4c 41 54 45 2c 20 20 20 20 20 20 20  _COLLATE,       
e740: 20 20 20 20 44 42 5f 43 4f 4c 4c 41 54 49 4f 4e      DB_COLLATION
e750: 5f 4e 45 45 44 45 44 2c 20 44 42 5f 43 4f 4d 4d  _NEEDED, DB_COMM
e760: 49 54 5f 48 4f 4f 4b 2c 0a 20 20 20 20 44 42 5f  IT_HOOK,.    DB_
e770: 43 4f 4d 50 4c 45 54 45 2c 20 20 20 20 20 20 20  COMPLETE,       
e780: 20 20 20 44 42 5f 43 4f 50 59 2c 20 20 20 20 20     DB_COPY,     
e790: 20 20 20 20 20 20 20 20 44 42 5f 45 4e 41 42 4c          DB_ENABL
e7a0: 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  E_LOAD_EXTENSION
e7b0: 2c 0a 20 20 20 20 44 42 5f 45 52 52 4f 52 43 4f  ,.    DB_ERRORCO
e7c0: 44 45 2c 20 20 20 20 20 20 20 20 20 44 42 5f 45  DE,         DB_E
e7d0: 56 41 4c 2c 20 20 20 20 20 20 20 20 20 20 20 20  VAL,            
e7e0: 20 44 42 5f 45 58 49 53 54 53 2c 0a 20 20 20 20   DB_EXISTS,.    
e7f0: 44 42 5f 46 55 4e 43 54 49 4f 4e 2c 20 20 20 20  DB_FUNCTION,    
e800: 20 20 20 20 20 20 44 42 5f 49 4e 43 52 42 4c 4f        DB_INCRBLO
e810: 42 2c 20 20 20 20 20 20 20 20 20 44 42 5f 49 4e  B,         DB_IN
e820: 54 45 52 52 55 50 54 2c 0a 20 20 20 20 44 42 5f  TERRUPT,.    DB_
e830: 4c 41 53 54 5f 49 4e 53 45 52 54 5f 52 4f 57 49  LAST_INSERT_ROWI
e840: 44 2c 20 44 42 5f 4e 55 4c 4c 56 41 4c 55 45 2c  D, DB_NULLVALUE,
e850: 20 20 20 20 20 20 20 20 44 42 5f 4f 4e 45 43 4f          DB_ONECO
e860: 4c 55 4d 4e 2c 0a 20 20 20 20 44 42 5f 50 52 45  LUMN,.    DB_PRE
e870: 55 50 44 41 54 45 2c 20 20 20 20 20 20 20 20 20  UPDATE,         
e880: 44 42 5f 50 52 4f 46 49 4c 45 2c 20 20 20 20 20  DB_PROFILE,     
e890: 20 20 20 20 20 44 42 5f 50 52 4f 47 52 45 53 53       DB_PROGRESS
e8a0: 2c 0a 20 20 20 20 44 42 5f 52 45 4b 45 59 2c 20  ,.    DB_REKEY, 
e8b0: 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 52              DB_R
e8c0: 45 53 54 4f 52 45 2c 20 20 20 20 20 20 20 20 20  ESTORE,         
e8d0: 20 44 42 5f 52 4f 4c 4c 42 41 43 4b 5f 48 4f 4f   DB_ROLLBACK_HOO
e8e0: 4b 2c 0a 20 20 20 20 44 42 5f 53 54 41 54 55 53  K,.    DB_STATUS
e8f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f  ,            DB_
e900: 54 49 4d 45 4f 55 54 2c 20 20 20 20 20 20 20 20  TIMEOUT,        
e910: 20 20 44 42 5f 54 4f 54 41 4c 5f 43 48 41 4e 47    DB_TOTAL_CHANG
e920: 45 53 2c 0a 20 20 20 20 44 42 5f 54 52 41 43 45  ES,.    DB_TRACE
e930: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 44 42  ,             DB
e940: 5f 54 52 41 43 45 5f 56 32 2c 20 20 20 20 20 20  _TRACE_V2,      
e950: 20 20 20 44 42 5f 54 52 41 4e 53 41 43 54 49 4f     DB_TRANSACTIO
e960: 4e 2c 0a 20 20 20 20 44 42 5f 55 4e 4c 4f 43 4b  N,.    DB_UNLOCK
e970: 5f 4e 4f 54 49 46 59 2c 20 20 20 20 20 44 42 5f  _NOTIFY,     DB_
e980: 55 50 44 41 54 45 5f 48 4f 4f 4b 2c 20 20 20 20  UPDATE_HOOK,    
e990: 20 20 44 42 5f 56 45 52 53 49 4f 4e 2c 0a 20 20    DB_VERSION,.  
e9a0: 20 20 44 42 5f 57 41 4c 5f 48 4f 4f 4b 2c 0a 20    DB_WAL_HOOK,. 
e9b0: 20 7d 3b 0a 20 20 2f 2a 20 64 6f 6e 27 74 20 6c   };.  /* don't l
e9c0: 65 61 76 65 20 74 72 61 69 6c 69 6e 67 20 63 6f  eave trailing co
e9d0: 6d 6d 61 73 20 6f 6e 20 44 42 5f 65 6e 75 6d 2c  mmas on DB_enum,
e9e0: 20 69 74 20 63 6f 6e 66 75 73 65 73 20 74 68 65   it confuses the
e9f0: 20 41 49 58 20 78 6c 63 20 63 6f 6d 70 69 6c 65   AIX xlc compile
ea00: 72 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62 6a 63  r */..  if( objc
ea10: 3c 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  <2 ){.    Tcl_Wr
ea20: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
ea30: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 55 42  p, 1, objv, "SUB
ea40: 43 4f 4d 4d 41 4e 44 20 2e 2e 2e 22 29 3b 0a 20  COMMAND ...");. 
ea50: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
ea60: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54  ROR;.  }.  if( T
ea70: 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f  cl_GetIndexFromO
ea80: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
ea90: 31 5d 2c 20 44 42 5f 73 74 72 73 2c 20 22 6f 70  1], DB_strs, "op
eaa0: 74 69 6f 6e 22 2c 20 30 2c 20 26 63 68 6f 69 63  tion", 0, &choic
eab0: 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  e) ){.    return
eac0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
ead0: 0a 20 20 73 77 69 74 63 68 28 20 28 65 6e 75 6d  .  switch( (enum
eae0: 20 44 42 5f 65 6e 75 6d 29 63 68 6f 69 63 65 20   DB_enum)choice 
eaf0: 29 7b 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20  ){..  /*    $db 
eb00: 61 75 74 68 6f 72 69 7a 65 72 20 3f 43 41 4c 4c  authorizer ?CALL
eb10: 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20  BACK?.  **.  ** 
eb20: 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e  Invoke the given
eb30: 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61 75 74   callback to aut
eb40: 68 6f 72 69 7a 65 20 65 61 63 68 20 53 51 4c 20  horize each SQL 
eb50: 6f 70 65 72 61 74 69 6f 6e 20 61 73 20 69 74 20  operation as it 
eb60: 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 64  is.  ** compiled
eb70: 2e 20 20 35 20 61 72 67 75 6d 65 6e 74 73 20 61  .  5 arguments a
eb80: 72 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  re appended to t
eb90: 68 65 20 63 61 6c 6c 62 61 63 6b 20 62 65 66 6f  he callback befo
eba0: 72 65 20 69 74 20 69 73 0a 20 20 2a 2a 20 69 6e  re it is.  ** in
ebb0: 76 6f 6b 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  voked:.  **.  **
ebc0: 20 20 20 28 31 29 20 54 68 65 20 61 75 74 68 6f     (1) The autho
ebd0: 72 69 7a 61 74 69 6f 6e 20 74 79 70 65 20 28 65  rization type (e
ebe0: 78 3a 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45  x: SQLITE_CREATE
ebf0: 5f 54 41 42 4c 45 2c 20 53 51 4c 49 54 45 5f 49  _TABLE, SQLITE_I
ec00: 4e 53 45 52 54 2c 20 2e 2e 2e 29 0a 20 20 2a 2a  NSERT, ...).  **
ec10: 20 20 20 28 32 29 20 46 69 72 73 74 20 64 65 73     (2) First des
ec20: 63 72 69 70 74 69 76 65 20 6e 61 6d 65 20 28 64  criptive name (d
ec30: 65 70 65 6e 64 73 20 6f 6e 20 61 75 74 68 6f 72  epends on author
ec40: 69 7a 61 74 69 6f 6e 20 74 79 70 65 29 0a 20 20  ization type).  
ec50: 2a 2a 20 20 20 28 33 29 20 53 65 63 6f 6e 64 20  **   (3) Second 
ec60: 64 65 73 63 72 69 70 74 69 76 65 20 6e 61 6d 65  descriptive name
ec70: 0a 20 20 2a 2a 20 20 20 28 34 29 20 4e 61 6d 65  .  **   (4) Name
ec80: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
ec90: 20 28 65 78 3a 20 22 6d 61 69 6e 22 2c 20 22 74   (ex: "main", "t
eca0: 65 6d 70 22 29 0a 20 20 2a 2a 20 20 20 28 35 29  emp").  **   (5)
ecb0: 20 4e 61 6d 65 20 6f 66 20 74 72 69 67 67 65 72   Name of trigger
ecc0: 20 74 68 61 74 20 69 73 20 64 6f 69 6e 67 20 74   that is doing t
ecd0: 68 65 20 61 63 63 65 73 73 0a 20 20 2a 2a 0a 20  he access.  **. 
ece0: 20 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61 63 6b   ** The callback
ecf0: 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 6f   should return o
ed00: 6e 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  n of the followi
ed10: 6e 67 20 73 74 72 69 6e 67 73 3a 20 53 51 4c 49  ng strings: SQLI
ed20: 54 45 5f 4f 4b 2c 0a 20 20 2a 2a 20 53 51 4c 49  TE_OK,.  ** SQLI
ed30: 54 45 5f 49 47 4e 4f 52 45 2c 20 6f 72 20 53 51  TE_IGNORE, or SQ
ed40: 4c 49 54 45 5f 44 45 4e 59 2e 20 20 41 6e 79 20  LITE_DENY.  Any 
ed50: 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c  other return val
ed60: 75 65 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 0a  ue is an error..
ed70: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69    **.  ** If thi
ed80: 73 20 6d 65 74 68 6f 64 20 69 73 20 69 6e 76 6f  s method is invo
ed90: 6b 65 64 20 77 69 74 68 20 6e 6f 20 61 72 67 75  ked with no argu
eda0: 6d 65 6e 74 73 2c 20 74 68 65 20 63 75 72 72 65  ments, the curre
edb0: 6e 74 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  nt authorization
edc0: 0a 20 20 2a 2a 20 63 61 6c 6c 62 61 63 6b 20 73  .  ** callback s
edd0: 74 72 69 6e 67 20 69 73 20 72 65 74 75 72 6e 65  tring is returne
ede0: 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  d..  */.  case D
edf0: 42 5f 41 55 54 48 4f 52 49 5a 45 52 3a 20 7b 0a  B_AUTHORIZER: {.
ee00: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
ee10: 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
ee20: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
ee30: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 61  esult(interp, "a
ee40: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 6e 6f 74  uthorization not
ee50: 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68   available in th
ee60: 69 73 20 62 75 69 6c 64 22 2c 0a 20 20 20 20 20  is build",.     
ee70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee80: 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72  (char*)0);.    r
ee90: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
eea0: 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 6f  .#else.    if( o
eeb0: 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54  bjc>3 ){.      T
eec0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
eed0: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
eee0: 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a   "?CALLBACK?");.
eef0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
ef00: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73  _ERROR;.    }els
ef10: 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b  e if( objc==2 ){
ef20: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
ef30: 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 20 20 20  zAuth ){.       
ef40: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
ef50: 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a  t(interp, pDb->z
ef60: 41 75 74 68 2c 20 28 63 68 61 72 2a 29 30 29 3b  Auth, (char*)0);
ef70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
ef80: 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  se{.      char *
ef90: 7a 41 75 74 68 3b 0a 20 20 20 20 20 20 69 6e 74  zAuth;.      int
efa0: 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20   len;.      if( 
efb0: 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20  pDb->zAuth ){.  
efc0: 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70        Tcl_Free(p
efd0: 44 62 2d 3e 7a 41 75 74 68 29 3b 0a 20 20 20 20  Db->zAuth);.    
efe0: 20 20 7d 0a 20 20 20 20 20 20 7a 41 75 74 68 20    }.      zAuth 
eff0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
f000: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
f010: 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  &len);.      if(
f020: 20 7a 41 75 74 68 20 26 26 20 6c 65 6e 3e 30 20   zAuth && len>0 
f030: 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
f040: 7a 41 75 74 68 20 3d 20 54 63 6c 5f 41 6c 6c 6f  zAuth = Tcl_Allo
f050: 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20  c( len + 1 );.  
f060: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62        memcpy(pDb
f070: 2d 3e 7a 41 75 74 68 2c 20 7a 41 75 74 68 2c 20  ->zAuth, zAuth, 
f080: 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65  len+1);.      }e
f090: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62  lse{.        pDb
f0a0: 2d 3e 7a 41 75 74 68 20 3d 20 30 3b 0a 20 20 20  ->zAuth = 0;.   
f0b0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
f0c0: 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20  Db->zAuth ){.   
f0d0: 20 20 20 20 20 74 79 70 65 64 65 66 20 69 6e 74       typedef int
f0e0: 20 28 2a 73 71 6c 69 74 65 33 5f 61 75 74 68 5f   (*sqlite3_auth_
f0f0: 63 62 29 28 0a 20 20 20 20 20 20 20 20 20 20 20  cb)(.           
f100: 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
f110: 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72  char*,const char
f120: 2a 2c 0a 20 20 20 20 20 20 20 20 20 20 20 63 6f  *,.           co
f130: 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20  nst char*,const 
f140: 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20 20 20  char*);.        
f150: 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e  pDb->interp = in
f160: 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71  terp;.        sq
f170: 6c 69 74 65 33 5f 73 65 74 5f 61 75 74 68 6f 72  lite3_set_author
f180: 69 7a 65 72 28 70 44 62 2d 3e 64 62 2c 28 73 71  izer(pDb->db,(sq
f190: 6c 69 74 65 33 5f 61 75 74 68 5f 63 62 29 61 75  lite3_auth_cb)au
f1a0: 74 68 5f 63 61 6c 6c 62 61 63 6b 2c 70 44 62 29  th_callback,pDb)
f1b0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
f1c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
f1d0: 65 74 5f 61 75 74 68 6f 72 69 7a 65 72 28 70 44  et_authorizer(pD
f1e0: 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  b->db, 0, 0);.  
f1f0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
f200: 69 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  if.    break;.  
f210: 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 62  }..  /*    $db b
f220: 61 63 6b 75 70 20 3f 44 41 54 41 42 41 53 45 3f  ackup ?DATABASE?
f230: 20 46 49 4c 45 4e 41 4d 45 0a 20 20 2a 2a 0a 20   FILENAME.  **. 
f240: 20 2a 2a 20 4f 70 65 6e 20 6f 72 20 63 72 65 61   ** Open or crea
f250: 74 65 20 61 20 64 61 74 61 62 61 73 65 20 66 69  te a database fi
f260: 6c 65 20 6e 61 6d 65 64 20 46 49 4c 45 4e 41 4d  le named FILENAM
f270: 45 2e 20 20 54 72 61 6e 73 66 65 72 20 74 68 65  E.  Transfer the
f280: 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66  .  ** content of
f290: 20 6c 6f 63 61 6c 20 64 61 74 61 62 61 73 65 20   local database 
f2a0: 44 41 54 41 42 41 53 45 20 28 64 65 66 61 75 6c  DATABASE (defaul
f2b0: 74 3a 20 22 6d 61 69 6e 22 29 20 69 6e 74 6f 20  t: "main") into 
f2c0: 74 68 65 0a 20 20 2a 2a 20 46 49 4c 45 4e 41 4d  the.  ** FILENAM
f2d0: 45 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  E database..  */
f2e0: 0a 20 20 63 61 73 65 20 44 42 5f 42 41 43 4b 55  .  case DB_BACKU
f2f0: 50 3a 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  P: {.    const c
f300: 68 61 72 20 2a 7a 44 65 73 74 46 69 6c 65 3b 0a  har *zDestFile;.
f310: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
f320: 7a 53 72 63 44 62 3b 0a 20 20 20 20 73 71 6c 69  zSrcDb;.    sqli
f330: 74 65 33 20 2a 70 44 65 73 74 3b 0a 20 20 20 20  te3 *pDest;.    
f340: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a  sqlite3_backup *
f350: 70 42 61 63 6b 75 70 3b 0a 0a 20 20 20 20 69 66  pBackup;..    if
f360: 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20  ( objc==3 ){.   
f370: 20 20 20 7a 53 72 63 44 62 20 3d 20 22 6d 61 69     zSrcDb = "mai
f380: 6e 22 3b 0a 20 20 20 20 20 20 7a 44 65 73 74 46  n";.      zDestF
f390: 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ile = Tcl_GetStr
f3a0: 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
f3b0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63    }else if( objc
f3c0: 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 7a 53 72  ==4 ){.      zSr
f3d0: 63 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  cDb = Tcl_GetStr
f3e0: 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
f3f0: 20 20 20 20 7a 44 65 73 74 46 69 6c 65 20 3d 20      zDestFile = 
f400: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
f410: 6a 76 5b 33 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  jv[3]);.    }els
f420: 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  e{.      Tcl_Wro
f430: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
f440: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 44 41 54  , 2, objv, "?DAT
f450: 41 42 41 53 45 3f 20 46 49 4c 45 4e 41 4d 45 22  ABASE? FILENAME"
f460: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
f470: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
f480: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
f490: 33 5f 6f 70 65 6e 5f 76 32 28 7a 44 65 73 74 46  3_open_v2(zDestF
f4a0: 69 6c 65 2c 20 26 70 44 65 73 74 2c 0a 20 20 20  ile, &pDest,.   
f4b0: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
f4c0: 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
f4d0: 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
f4e0: 43 52 45 41 54 45 7c 20 70 44 62 2d 3e 6f 70 65  CREATE| pDb->ope
f4f0: 6e 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20  nFlags, 0);.    
f500: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
f510: 4b 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  K ){.      Tcl_A
f520: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
f530: 72 70 2c 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e  rp, "cannot open
f540: 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65   target database
f550: 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  : ",.           
f560: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
f570: 44 65 73 74 29 2c 20 28 63 68 61 72 2a 29 30 29  Dest), (char*)0)
f580: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
f590: 63 6c 6f 73 65 28 70 44 65 73 74 29 3b 0a 20 20  close(pDest);.  
f5a0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
f5b0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
f5c0: 70 42 61 63 6b 75 70 20 3d 20 73 71 6c 69 74 65  pBackup = sqlite
f5d0: 33 5f 62 61 63 6b 75 70 5f 69 6e 69 74 28 70 44  3_backup_init(pD
f5e0: 65 73 74 2c 20 22 6d 61 69 6e 22 2c 20 70 44 62  est, "main", pDb
f5f0: 2d 3e 64 62 2c 20 7a 53 72 63 44 62 29 3b 0a 20  ->db, zSrcDb);. 
f600: 20 20 20 69 66 28 20 70 42 61 63 6b 75 70 3d 3d     if( pBackup==
f610: 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  0 ){.      Tcl_A
f620: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
f630: 72 70 2c 20 22 62 61 63 6b 75 70 20 66 61 69 6c  rp, "backup fail
f640: 65 64 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20  ed: ",.         
f650: 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67    sqlite3_errmsg
f660: 28 70 44 65 73 74 29 2c 20 28 63 68 61 72 2a 29  (pDest), (char*)
f670: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
f680: 33 5f 63 6c 6f 73 65 28 70 44 65 73 74 29 3b 0a  3_close(pDest);.
f690: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
f6a0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
f6b0: 20 20 77 68 69 6c 65 28 20 20 28 72 63 20 3d 20    while(  (rc = 
f6c0: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 73  sqlite3_backup_s
f6d0: 74 65 70 28 70 42 61 63 6b 75 70 2c 31 30 30 29  tep(pBackup,100)
f6e0: 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 7d  )==SQLITE_OK ){}
f6f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63  .    sqlite3_bac
f700: 6b 75 70 5f 66 69 6e 69 73 68 28 70 42 61 63 6b  kup_finish(pBack
f710: 75 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  up);.    if( rc=
f720: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
f730: 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f        rc = TCL_O
f740: 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
f750: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
f760: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61  sult(interp, "ba
f770: 63 6b 75 70 20 66 61 69 6c 65 64 3a 20 22 2c 0a  ckup failed: ",.
f780: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
f790: 65 33 5f 65 72 72 6d 73 67 28 70 44 65 73 74 29  e3_errmsg(pDest)
f7a0: 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
f7b0: 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f     rc = TCL_ERRO
f7c0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  R;.    }.    sql
f7d0: 69 74 65 33 5f 63 6c 6f 73 65 28 70 44 65 73 74  ite3_close(pDest
f7e0: 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
f7f0: 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 62  }..  /*    $db b
f800: 75 73 79 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20  usy ?CALLBACK?. 
f810: 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20   **.  ** Invoke 
f820: 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62 61  the given callba
f830: 63 6b 20 69 66 20 61 6e 20 53 51 4c 20 73 74 61  ck if an SQL sta
f840: 74 65 6d 65 6e 74 20 61 74 74 65 6d 70 74 73 20  tement attempts 
f850: 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 6c  to open.  ** a l
f860: 6f 63 6b 65 64 20 64 61 74 61 62 61 73 65 20 66  ocked database f
f870: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ile..  */.  case
f880: 20 44 42 5f 42 55 53 59 3a 20 7b 0a 20 20 20 20   DB_BUSY: {.    
f890: 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20  if( objc>3 ){.  
f8a0: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
f8b0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
f8c0: 6f 62 6a 76 2c 20 22 43 41 4c 4c 42 41 43 4b 22  objv, "CALLBACK"
f8d0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
f8e0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
f8f0: 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32  else if( objc==2
f900: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44   ){.      if( pD
f910: 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20 20  b->zBusy ){.    
f920: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
f930: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62  sult(interp, pDb
f940: 2d 3e 7a 42 75 73 79 2c 20 28 63 68 61 72 2a 29  ->zBusy, (char*)
f950: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
f960: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61  }else{.      cha
f970: 72 20 2a 7a 42 75 73 79 3b 0a 20 20 20 20 20 20  r *zBusy;.      
f980: 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69  int len;.      i
f990: 66 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b  f( pDb->zBusy ){
f9a0: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65  .        Tcl_Fre
f9b0: 65 28 70 44 62 2d 3e 7a 42 75 73 79 29 3b 0a 20  e(pDb->zBusy);. 
f9c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 42 75       }.      zBu
f9d0: 73 79 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  sy = Tcl_GetStri
f9e0: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
f9f0: 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20  ], &len);.      
fa00: 69 66 28 20 7a 42 75 73 79 20 26 26 20 6c 65 6e  if( zBusy && len
fa10: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  >0 ){.        pD
fa20: 62 2d 3e 7a 42 75 73 79 20 3d 20 54 63 6c 5f 41  b->zBusy = Tcl_A
fa30: 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b  lloc( len + 1 );
fa40: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
fa50: 70 44 62 2d 3e 7a 42 75 73 79 2c 20 7a 42 75 73  pDb->zBusy, zBus
fa60: 79 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20  y, len+1);.     
fa70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
fa80: 70 44 62 2d 3e 7a 42 75 73 79 20 3d 20 30 3b 0a  pDb->zBusy = 0;.
fa90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
faa0: 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a  ( pDb->zBusy ){.
fab0: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74          pDb->int
fac0: 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20  erp = interp;.  
fad0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75        sqlite3_bu
fae0: 73 79 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e  sy_handler(pDb->
faf0: 64 62 2c 20 44 62 42 75 73 79 48 61 6e 64 6c 65  db, DbBusyHandle
fb00: 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d  r, pDb);.      }
fb10: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
fb20: 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c  lite3_busy_handl
fb30: 65 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30  er(pDb->db, 0, 0
fb40: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
fb50: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
fb60: 0a 20 20 2f 2a 20 20 20 20 20 24 64 62 20 63 61  .  /*     $db ca
fb70: 63 68 65 20 66 6c 75 73 68 0a 20 20 2a 2a 20 20  che flush.  **  
fb80: 20 20 20 24 64 62 20 63 61 63 68 65 20 73 69 7a     $db cache siz
fb90: 65 20 6e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6c  e n.  **.  ** Fl
fba0: 75 73 68 20 74 68 65 20 70 72 65 70 61 72 65 64  ush the prepared
fbb0: 20 73 74 61 74 65 6d 65 6e 74 20 63 61 63 68 65   statement cache
fbc0: 2c 20 6f 72 20 73 65 74 20 74 68 65 20 6d 61 78  , or set the max
fbd0: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 0a 20  imum number of. 
fbe0: 20 2a 2a 20 63 61 63 68 65 64 20 73 74 61 74 65   ** cached state
fbf0: 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 63 61  ments..  */.  ca
fc00: 73 65 20 44 42 5f 43 41 43 48 45 3a 20 7b 0a 20  se DB_CACHE: {. 
fc10: 20 20 20 63 68 61 72 20 2a 73 75 62 43 6d 64 3b     char *subCmd;
fc20: 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 20  .    int n;..   
fc30: 20 69 66 28 20 6f 62 6a 63 3c 3d 32 20 29 7b 0a   if( objc<=2 ){.
fc40: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
fc50: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
fc60: 2c 20 6f 62 6a 76 2c 20 22 63 61 63 68 65 20 6f  , objv, "cache o
fc70: 70 74 69 6f 6e 20 3f 61 72 67 3f 22 29 3b 0a 20  ption ?arg?");. 
fc80: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
fc90: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
fca0: 20 73 75 62 43 6d 64 20 3d 20 54 63 6c 5f 47 65   subCmd = Tcl_Ge
fcb0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 20  tStringFromObj( 
fcc0: 6f 62 6a 76 5b 32 5d 2c 20 30 20 29 3b 0a 20 20  objv[2], 0 );.  
fcd0: 20 20 69 66 28 20 2a 73 75 62 43 6d 64 3d 3d 27    if( *subCmd=='
fce0: 66 27 20 26 26 20 73 74 72 63 6d 70 28 73 75 62  f' && strcmp(sub
fcf0: 43 6d 64 2c 22 66 6c 75 73 68 22 29 3d 3d 30 20  Cmd,"flush")==0 
fd00: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a  ){.      if( obj
fd10: 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20  c!=3 ){.        
fd20: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
fd30: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
fd40: 2c 20 22 66 6c 75 73 68 22 29 3b 0a 20 20 20 20  , "flush");.    
fd50: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
fd60: 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73  RROR;.      }els
fd70: 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 75 73 68  e{.        flush
fd80: 53 74 6d 74 43 61 63 68 65 28 20 70 44 62 20 29  StmtCache( pDb )
fd90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
fda0: 6c 73 65 20 69 66 28 20 2a 73 75 62 43 6d 64 3d  lse if( *subCmd=
fdb0: 3d 27 73 27 20 26 26 20 73 74 72 63 6d 70 28 73  ='s' && strcmp(s
fdc0: 75 62 43 6d 64 2c 22 73 69 7a 65 22 29 3d 3d 30  ubCmd,"size")==0
fdd0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f 62   ){.      if( ob
fde0: 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 20  jc!=4 ){.       
fdf0: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
fe00: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
fe10: 76 2c 20 22 73 69 7a 65 20 6e 22 29 3b 0a 20 20  v, "size n");.  
fe20: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
fe30: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65  _ERROR;.      }e
fe40: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28  lse{.        if(
fe50: 20 54 43 4c 5f 45 52 52 4f 52 3d 3d 54 63 6c 5f   TCL_ERROR==Tcl_
fe60: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
fe70: 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  terp, objv[3], &
fe80: 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  n) ){.          
fe90: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
fea0: 28 20 69 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f  ( interp, "canno
feb0: 74 20 63 6f 6e 76 65 72 74 20 5c 22 22 2c 0a 20  t convert \"",. 
fec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63                Tc
fed0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
fee0: 62 6a 28 6f 62 6a 76 5b 33 5d 2c 30 29 2c 20 22  bj(objv[3],0), "
fef0: 5c 22 20 74 6f 20 69 6e 74 65 67 65 72 22 2c 20  \" to integer", 
ff00: 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
ff10: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
ff20: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d  ERROR;.        }
ff30: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
ff40: 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 20  if( n<0 ){.     
ff50: 20 20 20 20 20 20 20 66 6c 75 73 68 53 74 6d 74         flushStmt
ff60: 43 61 63 68 65 28 20 70 44 62 20 29 3b 0a 20 20  Cache( pDb );.  
ff70: 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 30 3b            n = 0;
ff80: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
ff90: 20 69 66 28 20 6e 3e 4d 41 58 5f 50 52 45 50 41   if( n>MAX_PREPA
ffa0: 52 45 44 5f 53 54 4d 54 53 20 29 7b 0a 20 20 20  RED_STMTS ){.   
ffb0: 20 20 20 20 20 20 20 20 20 6e 20 3d 20 4d 41 58           n = MAX
ffc0: 5f 50 52 45 50 41 52 45 44 5f 53 54 4d 54 53 3b  _PREPARED_STMTS;
ffd0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
ffe0: 20 20 20 20 20 20 20 70 44 62 2d 3e 6d 61 78 53         pDb->maxS
fff0: 74 6d 74 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20  tmt = n;.       
10000 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
10010 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f  else{.      Tcl_
10020 41 70 70 65 6e 64 52 65 73 75 6c 74 28 20 69 6e  AppendResult( in
10030 74 65 72 70 2c 20 22 62 61 64 20 6f 70 74 69 6f  terp, "bad optio
10040 6e 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20  n \"",.         
10050 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
10060 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 30 29  omObj(objv[2],0)
10070 2c 20 22 5c 22 3a 20 6d 75 73 74 20 62 65 20 66  , "\": must be f
10080 6c 75 73 68 20 6f 72 20 73 69 7a 65 22 2c 0a 20  lush or size",. 
10090 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
100a0 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
100b0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
100c0 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
100d0 0a 0a 20 20 2f 2a 20 20 20 20 20 24 64 62 20 63  ..  /*     $db c
100e0 68 61 6e 67 65 73 0a 20 20 2a 2a 0a 20 20 2a 2a  hanges.  **.  **
100f0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
10100 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  er of rows that 
10110 77 65 72 65 20 6d 6f 64 69 66 69 65 64 2c 20 69  were modified, i
10120 6e 73 65 72 74 65 64 2c 20 6f 72 20 64 65 6c 65  nserted, or dele
10130 74 65 64 20 62 79 0a 20 20 2a 2a 20 74 68 65 20  ted by.  ** the 
10140 6d 6f 73 74 20 72 65 63 65 6e 74 20 49 4e 53 45  most recent INSE
10150 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45  RT, UPDATE or DE
10160 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2c 20  LETE statement, 
10170 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67 0a 20 20  not including.  
10180 2a 2a 20 61 6e 79 20 63 68 61 6e 67 65 73 20 6d  ** any changes m
10190 61 64 65 20 62 79 20 74 72 69 67 67 65 72 20 70  ade by trigger p
101a0 72 6f 67 72 61 6d 73 2e 0a 20 20 2a 2f 0a 20 20  rograms..  */.  
101b0 63 61 73 65 20 44 42 5f 43 48 41 4e 47 45 53 3a  case DB_CHANGES:
101c0 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a   {.    Tcl_Obj *
101d0 70 52 65 73 75 6c 74 3b 0a 20 20 20 20 69 66 28  pResult;.    if(
101e0 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
101f0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
10200 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
10210 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 72  jv, "");.      r
10220 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
10230 0a 20 20 20 20 7d 0a 20 20 20 20 70 52 65 73 75  .    }.    pResu
10240 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52  lt = Tcl_GetObjR
10250 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
10260 20 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f 62 6a     Tcl_SetIntObj
10270 28 70 52 65 73 75 6c 74 2c 20 73 71 6c 69 74 65  (pResult, sqlite
10280 33 5f 63 68 61 6e 67 65 73 28 70 44 62 2d 3e 64  3_changes(pDb->d
10290 62 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  b));.    break;.
102a0 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62    }..  /*    $db
102b0 20 63 6c 6f 73 65 0a 20 20 2a 2a 0a 20 20 2a 2a   close.  **.  **
102c0 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 64 61   Shutdown the da
102d0 74 61 62 61 73 65 0a 20 20 2a 2f 0a 20 20 63 61  tabase.  */.  ca
102e0 73 65 20 44 42 5f 43 4c 4f 53 45 3a 20 7b 0a 20  se DB_CLOSE: {. 
102f0 20 20 20 54 63 6c 5f 44 65 6c 65 74 65 43 6f 6d     Tcl_DeleteCom
10300 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 54 63 6c  mand(interp, Tcl
10310 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
10320 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 29 3b 0a  j(objv[0], 0));.
10330 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
10340 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64    /*.  **     $d
10350 62 20 63 6f 6c 6c 61 74 65 20 4e 41 4d 45 20 53  b collate NAME S
10360 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20  CRIPT.  **.  ** 
10370 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 51 4c  Create a new SQL
10380 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74   collation funct
10390 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e  ion called NAME.
103a0 20 20 57 68 65 6e 65 76 65 72 0a 20 20 2a 2a 20    Whenever.  ** 
103b0 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 69 73  that function is
103c0 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65 20   called, invoke 
103d0 53 43 52 49 50 54 20 74 6f 20 65 76 61 6c 75 61  SCRIPT to evalua
103e0 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e  te the function.
103f0 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
10400 43 4f 4c 4c 41 54 45 3a 20 7b 0a 20 20 20 20 53  COLLATE: {.    S
10410 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 43 6f 6c 6c  qlCollate *pColl
10420 61 74 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ate;.    char *z
10430 4e 61 6d 65 3b 0a 20 20 20 20 63 68 61 72 20 2a  Name;.    char *
10440 7a 53 63 72 69 70 74 3b 0a 20 20 20 20 69 6e 74  zScript;.    int
10450 20 6e 53 63 72 69 70 74 3b 0a 20 20 20 20 69 66   nScript;.    if
10460 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  ( objc!=4 ){.   
10470 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
10480 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
10490 62 6a 76 2c 20 22 4e 41 4d 45 20 53 43 52 49 50  bjv, "NAME SCRIP
104a0 54 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  T");.      retur
104b0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
104c0 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 54   }.    zName = T
104d0 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
104e0 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b  Obj(objv[2], 0);
104f0 0a 20 20 20 20 7a 53 63 72 69 70 74 20 3d 20 54  .    zScript = T
10500 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
10510 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6e 53  Obj(objv[3], &nS
10520 63 72 69 70 74 29 3b 0a 20 20 20 20 70 43 6f 6c  cript);.    pCol
10530 6c 61 74 65 20 3d 20 28 53 71 6c 43 6f 6c 6c 61  late = (SqlColla
10540 74 65 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73  te*)Tcl_Alloc( s
10550 69 7a 65 6f 66 28 2a 70 43 6f 6c 6c 61 74 65 29  izeof(*pCollate)
10560 20 2b 20 6e 53 63 72 69 70 74 20 2b 20 31 20 29   + nScript + 1 )
10570 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 61  ;.    if( pColla
10580 74 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 54  te==0 ) return T
10590 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 70 43  CL_ERROR;.    pC
105a0 6f 6c 6c 61 74 65 2d 3e 69 6e 74 65 72 70 20 3d  ollate->interp =
105b0 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 70 43 6f   interp;.    pCo
105c0 6c 6c 61 74 65 2d 3e 70 4e 65 78 74 20 3d 20 70  llate->pNext = p
105d0 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 3b 0a 20 20  Db->pCollate;.  
105e0 20 20 70 43 6f 6c 6c 61 74 65 2d 3e 7a 53 63 72    pCollate->zScr
105f0 69 70 74 20 3d 20 28 63 68 61 72 2a 29 26 70 43  ipt = (char*)&pC
10600 6f 6c 6c 61 74 65 5b 31 5d 3b 0a 20 20 20 20 70  ollate[1];.    p
10610 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 20 3d 20 70  Db->pCollate = p
10620 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 6d 65 6d  Collate;.    mem
10630 63 70 79 28 70 43 6f 6c 6c 61 74 65 2d 3e 7a 53  cpy(pCollate->zS
10640 63 72 69 70 74 2c 20 7a 53 63 72 69 70 74 2c 20  cript, zScript, 
10650 6e 53 63 72 69 70 74 2b 31 29 3b 0a 20 20 20 20  nScript+1);.    
10660 69 66 28 20 73 71 6c 69 74 65 33 5f 63 72 65 61  if( sqlite3_crea
10670 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 70 44 62  te_collation(pDb
10680 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c  ->db, zName, SQL
10690 49 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20  ITE_UTF8,.      
106a0 20 20 70 43 6f 6c 6c 61 74 65 2c 20 74 63 6c 53    pCollate, tclS
106b0 71 6c 43 6f 6c 6c 61 74 65 29 20 29 7b 0a 20 20  qlCollate) ){.  
106c0 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
106d0 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
106e0 2a 29 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  *)sqlite3_errmsg
106f0 28 70 44 62 2d 3e 64 62 29 2c 20 54 43 4c 5f 56  (pDb->db), TCL_V
10700 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 20 20  OLATILE);.      
10710 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
10720 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  ;.    }.    brea
10730 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
10740 2a 20 20 20 20 20 24 64 62 20 63 6f 6c 6c 61 74  *     $db collat
10750 69 6f 6e 5f 6e 65 65 64 65 64 20 53 43 52 49 50  ion_needed SCRIP
10760 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 72 65 61  T.  **.  ** Crea
10770 74 65 20 61 20 6e 65 77 20 53 51 4c 20 63 6f 6c  te a new SQL col
10780 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  lation function 
10790 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 57 68  called NAME.  Wh
107a0 65 6e 65 76 65 72 0a 20 20 2a 2a 20 74 68 61 74  enever.  ** that
107b0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
107c0 6c 65 64 2c 20 69 6e 76 6f 6b 65 20 53 43 52 49  led, invoke SCRI
107d0 50 54 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  PT to evaluate t
107e0 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a  he function..  *
107f0 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f 4c 4c  /.  case DB_COLL
10800 41 54 49 4f 4e 5f 4e 45 45 44 45 44 3a 20 7b 0a  ATION_NEEDED: {.
10810 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20      if( objc!=3 
10820 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
10830 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
10840 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 43 52 49  , 2, objv, "SCRI
10850 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  PT");.      retu
10860 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
10870 20 20 7d 0a 20 20 20 20 69 66 28 20 70 44 62 2d    }.    if( pDb-
10880 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 20  >pCollateNeeded 
10890 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63  ){.      Tcl_Dec
108a0 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70  rRefCount(pDb->p
108b0 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a  CollateNeeded);.
108c0 20 20 20 20 7d 0a 20 20 20 20 70 44 62 2d 3e 70      }.    pDb->p
108d0 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 20 3d 20  CollateNeeded = 
108e0 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
108f0 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 54  (objv[2]);.    T
10900 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
10910 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65  pDb->pCollateNee
10920 64 65 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ded);.    sqlite
10930 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64  3_collation_need
10940 65 64 28 70 44 62 2d 3e 64 62 2c 20 70 44 62 2c  ed(pDb->db, pDb,
10950 20 74 63 6c 43 6f 6c 6c 61 74 65 4e 65 65 64 65   tclCollateNeede
10960 64 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  d);.    break;. 
10970 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20   }..  /*    $db 
10980 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 20 3f 43 41 4c  commit_hook ?CAL
10990 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a  LBACK?.  **.  **
109a0 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65   Invoke the give
109b0 6e 20 63 61 6c 6c 62 61 63 6b 20 6a 75 73 74 20  n callback just 
109c0 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e  before committin
109d0 67 20 65 76 65 72 79 20 53 51 4c 20 74 72 61 6e  g every SQL tran
109e0 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 49 66  saction..  ** If
109f0 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 74 68   the callback th
10a00 72 6f 77 73 20 61 6e 20 65 78 63 65 70 74 69 6f  rows an exceptio
10a10 6e 20 6f 72 20 72 65 74 75 72 6e 73 20 6e 6f 6e  n or returns non
10a20 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a  -zero, then the.
10a30 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
10a40 20 69 73 20 61 62 6f 72 74 65 64 2e 20 20 49 66   is aborted.  If
10a50 20 43 41 4c 4c 42 41 43 4b 20 69 73 20 61 6e 20   CALLBACK is an 
10a60 65 6d 70 74 79 20 73 74 72 69 6e 67 2c 20 74 68  empty string, th
10a70 65 20 63 61 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  e callback.  ** 
10a80 69 73 20 64 69 73 61 62 6c 65 64 2e 0a 20 20 2a  is disabled..  *
10a90 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f 4d 4d  /.  case DB_COMM
10aa0 49 54 5f 48 4f 4f 4b 3a 20 7b 0a 20 20 20 20 69  IT_HOOK: {.    i
10ab0 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20  f( objc>3 ){.   
10ac0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
10ad0 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
10ae0 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f  bjv, "?CALLBACK?
10af0 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
10b00 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
10b10 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d  }else if( objc==
10b20 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  2 ){.      if( p
10b30 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20  Db->zCommit ){. 
10b40 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
10b50 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
10b60 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 2c 20 28 63  pDb->zCommit, (c
10b70 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 7d  har*)0);.      }
10b80 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10b90 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
10ba0 6f 6d 6d 69 74 3b 0a 20 20 20 20 20 20 69 6e 74  ommit;.      int
10bb0 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20   len;.      if( 
10bc0 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a  pDb->zCommit ){.
10bd0 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65          Tcl_Free
10be0 28 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 29 3b 0a  (pDb->zCommit);.
10bf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 43        }.      zC
10c00 6f 6d 6d 69 74 20 3d 20 54 63 6c 5f 47 65 74 53  ommit = Tcl_GetS
10c10 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
10c20 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20  v[2], &len);.   
10c30 20 20 20 69 66 28 20 7a 43 6f 6d 6d 69 74 20 26     if( zCommit &
10c40 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20  & len>0 ){.     
10c50 20 20 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20     pDb->zCommit 
10c60 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e  = Tcl_Alloc( len
10c70 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20   + 1 );.        
10c80 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 43 6f 6d  memcpy(pDb->zCom
10c90 6d 69 74 2c 20 7a 43 6f 6d 6d 69 74 2c 20 6c 65  mit, zCommit, le
10ca0 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  n+1);.      }els
10cb0 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  e{.        pDb->
10cc0 7a 43 6f 6d 6d 69 74 20 3d 20 30 3b 0a 20 20 20  zCommit = 0;.   
10cd0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
10ce0 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20  Db->zCommit ){. 
10cf0 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65         pDb->inte
10d00 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20  rp = interp;.   
10d10 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6d       sqlite3_com
10d20 6d 69 74 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62  mit_hook(pDb->db
10d30 2c 20 44 62 43 6f 6d 6d 69 74 48 61 6e 64 6c 65  , DbCommitHandle
10d40 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d  r, pDb);.      }
10d50 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
10d60 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f  lite3_commit_hoo
10d70 6b 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29  k(pDb->db, 0, 0)
10d80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
10d90 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
10da0 20 20 2f 2a 20 20 20 20 24 64 62 20 63 6f 6d 70    /*    $db comp
10db0 6c 65 74 65 20 53 51 4c 0a 20 20 2a 2a 0a 20 20  lete SQL.  **.  
10dc0 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
10dd0 66 20 53 51 4c 20 69 73 20 61 20 63 6f 6d 70 6c  f SQL is a compl
10de0 65 74 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ete SQL statemen
10df0 74 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45  t.  Return FALSE
10e00 20 69 66 0a 20 20 2a 2a 20 61 64 64 69 74 69 6f   if.  ** additio
10e10 6e 61 6c 20 6c 69 6e 65 73 20 6f 66 20 69 6e 70  nal lines of inp
10e20 75 74 20 61 72 65 20 6e 65 65 64 65 64 2e 20 20  ut are needed.  
10e30 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20  This is similar 
10e40 74 6f 20 74 68 65 0a 20 20 2a 2a 20 62 75 69 6c  to the.  ** buil
10e50 74 2d 69 6e 20 22 69 6e 66 6f 20 63 6f 6d 70 6c  t-in "info compl
10e60 65 74 65 22 20 63 6f 6d 6d 61 6e 64 20 6f 66 20  ete" command of 
10e70 54 63 6c 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  Tcl..  */.  case
10e80 20 44 42 5f 43 4f 4d 50 4c 45 54 45 3a 20 7b 0a   DB_COMPLETE: {.
10e90 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
10ea0 4d 49 54 5f 43 4f 4d 50 4c 45 54 45 0a 20 20 20  MIT_COMPLETE.   
10eb0 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c   Tcl_Obj *pResul
10ec0 74 3b 0a 20 20 20 20 69 6e 74 20 69 73 43 6f 6d  t;.    int isCom
10ed0 70 6c 65 74 65 3b 0a 20 20 20 20 69 66 28 20 6f  plete;.    if( o
10ee0 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc!=3 ){.      
10ef0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
10f00 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
10f10 2c 20 22 53 51 4c 22 29 3b 0a 20 20 20 20 20 20  , "SQL");.      
10f20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
10f30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 73 43 6f  ;.    }.    isCo
10f40 6d 70 6c 65 74 65 20 3d 20 73 71 6c 69 74 65 33  mplete = sqlite3
10f50 5f 63 6f 6d 70 6c 65 74 65 28 20 54 63 6c 5f 47  _complete( Tcl_G
10f60 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
10f70 6f 62 6a 76 5b 32 5d 2c 20 30 29 20 29 3b 0a 20  objv[2], 0) );. 
10f80 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c     pResult = Tcl
10f90 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _GetObjResult(in
10fa0 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53  terp);.    Tcl_S
10fb0 65 74 42 6f 6f 6c 65 61 6e 4f 62 6a 28 70 52 65  etBooleanObj(pRe
10fc0 73 75 6c 74 2c 20 69 73 43 6f 6d 70 6c 65 74 65  sult, isComplete
10fd0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72  );.#endif.    br
10fe0 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
10ff0 20 20 24 64 62 20 63 6f 70 79 20 63 6f 6e 66 6c    $db copy confl
11000 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d 20 74 61  ict-algorithm ta
11010 62 6c 65 20 66 69 6c 65 6e 61 6d 65 20 3f 53 45  ble filename ?SE
11020 50 41 52 41 54 4f 52 3f 20 3f 4e 55 4c 4c 49 4e  PARATOR? ?NULLIN
11030 44 49 43 41 54 4f 52 3f 0a 20 20 2a 2a 0a 20 20  DICATOR?.  **.  
11040 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 69 6e 74  ** Copy data int
11050 6f 20 74 61 62 6c 65 20 66 72 6f 6d 20 66 69 6c  o table from fil
11060 65 6e 61 6d 65 2c 20 6f 70 74 69 6f 6e 61 6c 6c  ename, optionall
11070 79 20 75 73 69 6e 67 20 53 45 50 41 52 41 54 4f  y using SEPARATO
11080 52 0a 20 20 2a 2a 20 61 73 20 63 6f 6c 75 6d 6e  R.  ** as column
11090 20 73 65 70 61 72 61 74 6f 72 73 2e 20 20 49 66   separators.  If
110a0 20 61 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69   a column contai
110b0 6e 73 20 61 20 6e 75 6c 6c 20 73 74 72 69 6e 67  ns a null string
110c0 2c 20 6f 72 20 74 68 65 0a 20 20 2a 2a 20 76 61  , or the.  ** va
110d0 6c 75 65 20 6f 66 20 4e 55 4c 4c 49 4e 44 49 43  lue of NULLINDIC
110e0 41 54 4f 52 2c 20 61 20 4e 55 4c 4c 20 69 73 20  ATOR, a NULL is 
110f0 69 6e 73 65 72 74 65 64 20 66 6f 72 20 74 68 65  inserted for the
11100 20 63 6f 6c 75 6d 6e 2e 0a 20 20 2a 2a 20 63 6f   column..  ** co
11110 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d  nflict-algorithm
11120 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 20 73   is one of the s
11130 71 6c 69 74 65 20 63 6f 6e 66 6c 69 63 74 20 61  qlite conflict a
11140 6c 67 6f 72 69 74 68 6d 73 3a 0a 20 20 2a 2a 20  lgorithms:.  ** 
11150 20 20 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 62 6f     rollback, abo
11160 72 74 2c 20 66 61 69 6c 2c 20 69 67 6e 6f 72 65  rt, fail, ignore
11170 2c 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 4f  , replace.  ** O
11180 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74 75 72  n success, retur
11190 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
111a0 6c 69 6e 65 73 20 70 72 6f 63 65 73 73 65 64 2c  lines processed,
111b0 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
111c0 20 73 61 6d 65 0a 20 20 2a 2a 20 61 73 20 27 64   same.  ** as 'd
111d0 62 20 63 68 61 6e 67 65 73 27 20 64 75 65 20 74  b changes' due t
111e0 6f 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72  o conflict-algor
111f0 69 74 68 6d 20 73 65 6c 65 63 74 65 64 2e 0a 20  ithm selected.. 
11200 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 63 6f   **.  ** This co
11210 64 65 20 69 73 20 62 61 73 69 63 61 6c 6c 79 20  de is basically 
11220 61 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  an implementatio
11230 6e 2f 65 6e 68 61 6e 63 65 6d 65 6e 74 20 6f 66  n/enhancement of
11240 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  .  ** the sqlite
11250 33 20 73 68 65 6c 6c 2e 63 20 22 2e 69 6d 70 6f  3 shell.c ".impo
11260 72 74 22 20 63 6f 6d 6d 61 6e 64 2e 0a 20 20 2a  rt" command..  *
11270 2a 0a 20 20 2a 2a 20 54 68 69 73 20 63 6f 6d 6d  *.  ** This comm
11280 61 6e 64 20 75 73 61 67 65 20 69 73 20 65 71 75  and usage is equ
11290 69 76 61 6c 65 6e 74 20 74 6f 20 74 68 65 20 73  ivalent to the s
112a0 71 6c 69 74 65 32 2e 78 20 43 4f 50 59 20 73 74  qlite2.x COPY st
112b0 61 74 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20 77 68  atement,.  ** wh
112c0 69 63 68 20 69 6d 70 6f 72 74 73 20 66 69 6c 65  ich imports file
112d0 20 64 61 74 61 20 69 6e 74 6f 20 61 20 74 61 62   data into a tab
112e0 6c 65 20 75 73 69 6e 67 20 74 68 65 20 50 6f 73  le using the Pos
112f0 74 67 72 65 53 51 4c 20 43 4f 50 59 20 66 69 6c  tgreSQL COPY fil
11300 65 20 66 6f 72 6d 61 74 3a 0a 20 20 2a 2a 20 20  e format:.  **  
11310 20 24 64 62 20 63 6f 70 79 20 24 63 6f 6e 66 6c   $db copy $confl
11320 69 74 5f 61 6c 67 6f 20 24 74 61 62 6c 65 5f 6e  it_algo $table_n
11330 61 6d 65 20 24 66 69 6c 65 6e 61 6d 65 20 5c 74  ame $filename \t
11340 20 5c 5c 4e 0a 20 20 2a 2f 0a 20 20 63 61 73 65   \\N.  */.  case
11350 20 44 42 5f 43 4f 50 59 3a 20 7b 0a 20 20 20 20   DB_COPY: {.    
11360 63 68 61 72 20 2a 7a 54 61 62 6c 65 3b 20 20 20  char *zTable;   
11370 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
11380 6e 73 65 72 74 20 64 61 74 61 20 69 6e 74 6f 20  nsert data into 
11390 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20  this table */.  
113a0 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 20 20    char *zFile;  
113b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
113c0 20 54 68 65 20 66 69 6c 65 20 66 72 6f 6d 20 77   The file from w
113d0 68 69 63 68 20 74 6f 20 65 78 74 72 61 63 74 20  hich to extract 
113e0 64 61 74 61 20 2a 2f 0a 20 20 20 20 63 68 61 72  data */.    char
113f0 20 2a 7a 43 6f 6e 66 6c 69 63 74 3b 20 20 20 20   *zConflict;    
11400 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
11410 6f 6e 66 6c 69 63 74 20 61 6c 67 6f 72 69 74 68  onflict algorith
11420 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20  m to use */.    
11430 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
11440 74 6d 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 41  tmt;        /* A
11450 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
11460 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20    int nCol;     
11470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11480 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
11490 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ns in the table 
114a0 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  */.    int nByte
114b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
114c0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
114d0 62 79 74 65 73 20 69 6e 20 61 6e 20 53 51 4c 20  bytes in an SQL 
114e0 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e  string */.    in
114f0 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
11500 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
11510 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
11520 20 20 69 6e 74 20 6e 53 65 70 3b 20 20 20 20 20    int nSep;     
11530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11540 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
11550 20 69 6e 20 7a 53 65 70 5b 5d 20 2a 2f 0a 20 20   in zSep[] */.  
11560 20 20 69 6e 74 20 6e 4e 75 6c 6c 3b 20 20 20 20    int nNull;    
11570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11580 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
11590 20 69 6e 20 7a 4e 75 6c 6c 5b 5d 20 2a 2f 0a 20   in zNull[] */. 
115a0 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20     char *zSql;  
115b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
115c0 2a 20 41 6e 20 53 51 4c 20 73 74 61 74 65 6d 65  * An SQL stateme
115d0 6e 74 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  nt */.    char *
115e0 7a 4c 69 6e 65 3b 20 20 20 20 20 20 20 20 20 20  zLine;          
115f0 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
11600 65 20 6c 69 6e 65 20 6f 66 20 69 6e 70 75 74 20  e line of input 
11610 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 2a 2f  from the file */
11620 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f  .    char **azCo
11630 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
11640 20 2f 2a 20 7a 4c 69 6e 65 5b 5d 20 62 72 6f 6b   /* zLine[] brok
11650 65 6e 20 75 70 20 69 6e 74 6f 20 63 6f 6c 75 6d  en up into colum
11660 6e 73 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  ns */.    const 
11670 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 20 20  char *zCommit;  
11680 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20        /* How to 
11690 63 6f 6d 6d 69 74 20 63 68 61 6e 67 65 73 20 2a  commit changes *
116a0 2f 0a 20 20 20 20 46 49 4c 45 20 2a 69 6e 3b 20  /.    FILE *in; 
116b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
116c0 20 20 2f 2a 20 54 68 65 20 69 6e 70 75 74 20 66    /* The input f
116d0 69 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c  ile */.    int l
116e0 69 6e 65 6e 6f 20 3d 20 30 3b 20 20 20 20 20 20  ineno = 0;      
116f0 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e         /* Line n
11700 75 6d 62 65 72 20 6f 66 20 69 6e 70 75 74 20 66  umber of input f
11710 69 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  ile */.    char 
11720 7a 4c 69 6e 65 4e 75 6d 5b 38 30 5d 3b 20 20 20  zLineNum[80];   
11730 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e         /* Line n
11740 75 6d 62 65 72 20 70 72 69 6e 74 20 62 75 66 66  umber print buff
11750 65 72 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62  er */.    Tcl_Ob
11760 6a 20 2a 70 52 65 73 75 6c 74 3b 20 20 20 20 20  j *pResult;     
11770 20 20 20 20 20 20 2f 2a 20 69 6e 74 65 72 70 20        /* interp 
11780 72 65 73 75 6c 74 20 2a 2f 0a 0a 20 20 20 20 63  result */..    c
11790 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 70 3b  onst char *zSep;
117a0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
117b0 2a 7a 4e 75 6c 6c 3b 0a 20 20 20 20 69 66 28 20  *zNull;.    if( 
117c0 6f 62 6a 63 3c 35 20 7c 7c 20 6f 62 6a 63 3e 37  objc<5 || objc>7
117d0 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
117e0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
117f0 70 2c 20 32 2c 20 6f 62 6a 76 2c 0a 20 20 20 20  p, 2, objv,.    
11800 20 20 20 20 20 22 43 4f 4e 46 4c 49 43 54 2d 41       "CONFLICT-A
11810 4c 47 4f 52 49 54 48 4d 20 54 41 42 4c 45 20 46  LGORITHM TABLE F
11820 49 4c 45 4e 41 4d 45 20 3f 53 45 50 41 52 41 54  ILENAME ?SEPARAT
11830 4f 52 3f 20 3f 4e 55 4c 4c 49 4e 44 49 43 41 54  OR? ?NULLINDICAT
11840 4f 52 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74  OR?");.      ret
11850 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
11860 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a     }.    if( obj
11870 63 3e 3d 36 20 29 7b 0a 20 20 20 20 20 20 7a 53  c>=6 ){.      zS
11880 65 70 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  ep = Tcl_GetStri
11890 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 35  ngFromObj(objv[5
118a0 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ], 0);.    }else
118b0 7b 0a 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22  {.      zSep = "
118c0 5c 74 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  \t";.    }.    i
118d0 66 28 20 6f 62 6a 63 3e 3d 37 20 29 7b 0a 20 20  f( objc>=7 ){.  
118e0 20 20 20 20 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f      zNull = Tcl_
118f0 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
11900 28 6f 62 6a 76 5b 36 5d 2c 20 30 29 3b 0a 20 20  (objv[6], 0);.  
11910 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
11920 4e 75 6c 6c 20 3d 20 22 22 3b 0a 20 20 20 20 7d  Null = "";.    }
11930 0a 20 20 20 20 7a 43 6f 6e 66 6c 69 63 74 20 3d  .    zConflict =
11940 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
11950 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30  omObj(objv[2], 0
11960 29 3b 0a 20 20 20 20 7a 54 61 62 6c 65 20 3d 20  );.    zTable = 
11970 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
11980 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 30 29  mObj(objv[3], 0)
11990 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 54 63  ;.    zFile = Tc
119a0 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
119b0 62 6a 28 6f 62 6a 76 5b 34 5d 2c 20 30 29 3b 0a  bj(objv[4], 0);.
119c0 20 20 20 20 6e 53 65 70 20 3d 20 73 74 72 6c 65      nSep = strle
119d0 6e 33 30 28 7a 53 65 70 29 3b 0a 20 20 20 20 6e  n30(zSep);.    n
119e0 4e 75 6c 6c 20 3d 20 73 74 72 6c 65 6e 33 30 28  Null = strlen30(
119f0 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20  zNull);.    if( 
11a00 6e 53 65 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nSep==0 ){.     
11a10 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
11a20 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 3a  t(interp,"Error:
11a30 20 6e 6f 6e 2d 6e 75 6c 6c 20 73 65 70 61 72 61   non-null separa
11a40 74 6f 72 20 72 65 71 75 69 72 65 64 20 66 6f 72  tor required for
11a50 20 63 6f 70 79 22 2c 0a 20 20 20 20 20 20 20 20   copy",.        
11a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
11a70 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
11a80 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
11a90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 73  ;.    }.    if(s
11aa0 74 72 63 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c  trcmp(zConflict,
11ab0 20 22 72 6f 6c 6c 62 61 63 6b 22 29 20 21 3d 20   "rollback") != 
11ac0 30 20 26 26 0a 20 20 20 20 20 20 20 73 74 72 63  0 &&.       strc
11ad0 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 61  mp(zConflict, "a
11ae0 62 6f 72 74 22 20 20 20 29 20 21 3d 20 30 20 26  bort"   ) != 0 &
11af0 26 0a 20 20 20 20 20 20 20 73 74 72 63 6d 70 28  &.       strcmp(
11b00 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 66 61 69 6c  zConflict, "fail
11b10 22 20 20 20 20 29 20 21 3d 20 30 20 26 26 0a 20  "    ) != 0 &&. 
11b20 20 20 20 20 20 20 73 74 72 63 6d 70 28 7a 43 6f        strcmp(zCo
11b30 6e 66 6c 69 63 74 2c 20 22 69 67 6e 6f 72 65 22  nflict, "ignore"
11b40 20 20 29 20 21 3d 20 30 20 26 26 0a 20 20 20 20    ) != 0 &&.    
11b50 20 20 20 73 74 72 63 6d 70 28 7a 43 6f 6e 66 6c     strcmp(zConfl
11b60 69 63 74 2c 20 22 72 65 70 6c 61 63 65 22 20 29  ict, "replace" )
11b70 20 21 3d 20 30 20 29 20 7b 0a 20 20 20 20 20 20   != 0 ) {.      
11b80 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
11b90 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a  (interp, "Error:
11ba0 20 5c 22 22 2c 20 7a 43 6f 6e 66 6c 69 63 74 2c   \"", zConflict,
11bb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22  .            "\"
11bc0 2c 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72  , conflict-algor
11bd0 69 74 68 6d 20 6d 75 73 74 20 62 65 20 6f 6e 65  ithm must be one
11be0 20 6f 66 3a 20 72 6f 6c 6c 62 61 63 6b 2c 20 22   of: rollback, "
11bf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 61 62  .            "ab
11c00 6f 72 74 2c 20 66 61 69 6c 2c 20 69 67 6e 6f 72  ort, fail, ignor
11c10 65 2c 20 6f 72 20 72 65 70 6c 61 63 65 22 2c 20  e, or replace", 
11c20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
11c30 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
11c40 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71  R;.    }.    zSq
11c50 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
11c60 6e 74 66 28 22 53 45 4c 45 43 54 20 2a 20 46 52  ntf("SELECT * FR
11c70 4f 4d 20 27 25 71 27 22 2c 20 7a 54 61 62 6c 65  OM '%q'", zTable
11c80 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d  );.    if( zSql=
11c90 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =0 ){.      Tcl_
11ca0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
11cb0 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 6e 6f 20  erp, "Error: no 
11cc0 73 75 63 68 20 74 61 62 6c 65 3a 20 22 2c 20 7a  such table: ", z
11cd0 54 61 62 6c 65 2c 20 28 63 68 61 72 2a 29 30 29  Table, (char*)0)
11ce0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
11cf0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
11d00 20 20 20 20 6e 42 79 74 65 20 3d 20 73 74 72 6c      nByte = strl
11d10 65 6e 33 30 28 7a 53 71 6c 29 3b 0a 20 20 20 20  en30(zSql);.    
11d20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
11d30 70 61 72 65 28 70 44 62 2d 3e 64 62 2c 20 7a 53  pare(pDb->db, zS
11d40 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
11d50 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
11d60 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20  free(zSql);.    
11d70 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
11d80 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
11d90 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a  (interp, "Error:
11da0 20 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d   ", sqlite3_errm
11db0 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 28 63 68  sg(pDb->db), (ch
11dc0 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 6e 43  ar*)0);.      nC
11dd0 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ol = 0;.    }els
11de0 65 7b 0a 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20  e{.      nCol = 
11df0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
11e00 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20  ount(pStmt);.   
11e10 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
11e20 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
11e30 20 20 20 20 69 66 28 20 6e 43 6f 6c 3d 3d 30 20      if( nCol==0 
11e40 29 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ) {.      return
11e50 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
11e60 7d 0a 20 20 20 20 7a 53 71 6c 20 3d 20 6d 61 6c  }.    zSql = mal
11e70 6c 6f 63 28 20 6e 42 79 74 65 20 2b 20 35 30 20  loc( nByte + 50 
11e80 2b 20 6e 43 6f 6c 2a 32 20 29 3b 0a 20 20 20 20  + nCol*2 );.    
11e90 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20 7b 0a  if( zSql==0 ) {.
11ea0 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
11eb0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
11ec0 45 72 72 6f 72 3a 20 63 61 6e 27 74 20 6d 61 6c  Error: can't mal
11ed0 6c 6f 63 28 29 22 2c 20 28 63 68 61 72 2a 29 30  loc()", (char*)0
11ee0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
11ef0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
11f00 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
11f10 72 69 6e 74 66 28 6e 42 79 74 65 2b 35 30 2c 20  rintf(nByte+50, 
11f20 7a 53 71 6c 2c 20 22 49 4e 53 45 52 54 20 4f 52  zSql, "INSERT OR
11f30 20 25 71 20 49 4e 54 4f 20 27 25 71 27 20 56 41   %q INTO '%q' VA
11f40 4c 55 45 53 28 3f 22 2c 0a 20 20 20 20 20 20 20  LUES(?",.       
11f50 20 20 7a 43 6f 6e 66 6c 69 63 74 2c 20 7a 54 61    zConflict, zTa
11f60 62 6c 65 29 3b 0a 20 20 20 20 6a 20 3d 20 73 74  ble);.    j = st
11f70 72 6c 65 6e 33 30 28 7a 53 71 6c 29 3b 0a 20 20  rlen30(zSql);.  
11f80 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 43 6f    for(i=1; i<nCo
11f90 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 7a  l; i++){.      z
11fa0 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 2c 27 3b 0a  Sql[j++] = ',';.
11fb0 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20        zSql[j++] 
11fc0 3d 20 27 3f 27 3b 0a 20 20 20 20 7d 0a 20 20 20  = '?';.    }.   
11fd0 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 29 27   zSql[j++] = ')'
11fe0 3b 0a 20 20 20 20 7a 53 71 6c 5b 6a 5d 20 3d 20  ;.    zSql[j] = 
11ff0 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  0;.    rc = sqli
12000 74 65 33 5f 70 72 65 70 61 72 65 28 70 44 62 2d  te3_prepare(pDb-
12010 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  >db, zSql, -1, &
12020 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 66  pStmt, 0);.    f
12030 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69  ree(zSql);.    i
12040 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54  f( rc ){.      T
12050 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
12060 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20  interp, "Error: 
12070 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
12080 67 28 70 44 62 2d 3e 64 62 29 2c 20 28 63 68 61  g(pDb->db), (cha
12090 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  r*)0);.      sql
120a0 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
120b0 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  tmt);.      retu
120c0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
120d0 20 20 7d 0a 20 20 20 20 69 6e 20 3d 20 66 6f 70    }.    in = fop
120e0 65 6e 28 7a 46 69 6c 65 2c 20 22 72 62 22 29 3b  en(zFile, "rb");
120f0 0a 20 20 20 20 69 66 28 20 69 6e 3d 3d 30 20 29  .    if( in==0 )
12100 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
12110 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
12120 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20   "Error: cannot 
12130 6f 70 65 6e 20 66 69 6c 65 3a 20 22 2c 20 7a 46  open file: ", zF
12140 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  ile, NULL);.    
12150 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
12160 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ze(pStmt);.     
12170 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
12180 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 7a 43  R;.    }.    azC
12190 6f 6c 20 3d 20 6d 61 6c 6c 6f 63 28 20 73 69 7a  ol = malloc( siz
121a0 65 6f 66 28 61 7a 43 6f 6c 5b 30 5d 29 2a 28 6e  eof(azCol[0])*(n
121b0 43 6f 6c 2b 31 29 20 29 3b 0a 20 20 20 20 69 66  Col+1) );.    if
121c0 28 20 61 7a 43 6f 6c 3d 3d 30 20 29 20 7b 0a 20  ( azCol==0 ) {. 
121d0 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
121e0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45  esult(interp, "E
121f0 72 72 6f 72 3a 20 63 61 6e 27 74 20 6d 61 6c 6c  rror: can't mall
12200 6f 63 28 29 22 2c 20 28 63 68 61 72 2a 29 30 29  oc()", (char*)0)
12210 3b 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28 69  ;.      fclose(i
12220 6e 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  n);.      return
12230 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
12240 7d 0a 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69  }.    (void)sqli
12250 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62  te3_exec(pDb->db
12260 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 2c  , "BEGIN", 0, 0,
12270 20 30 29 3b 0a 20 20 20 20 7a 43 6f 6d 6d 69 74   0);.    zCommit
12280 20 3d 20 22 43 4f 4d 4d 49 54 22 3b 0a 20 20 20   = "COMMIT";.   
12290 20 77 68 69 6c 65 28 20 28 7a 4c 69 6e 65 20 3d   while( (zLine =
122a0 20 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28 30   local_getline(0
122b0 2c 20 69 6e 29 29 21 3d 30 20 29 7b 0a 20 20 20  , in))!=0 ){.   
122c0 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20     char *z;.    
122d0 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20    lineno++;.    
122e0 20 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20 7a 4c 69    azCol[0] = zLi
122f0 6e 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ne;.      for(i=
12300 30 2c 20 7a 3d 7a 4c 69 6e 65 3b 20 2a 7a 3b 20  0, z=zLine; *z; 
12310 7a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  z++){.        if
12320 28 20 2a 7a 3d 3d 7a 53 65 70 5b 30 5d 20 26 26  ( *z==zSep[0] &&
12330 20 73 74 72 6e 63 6d 70 28 7a 2c 20 7a 53 65 70   strncmp(z, zSep
12340 2c 20 6e 53 65 70 29 3d 3d 30 20 29 7b 0a 20 20  , nSep)==0 ){.  
12350 20 20 20 20 20 20 20 20 2a 7a 20 3d 20 30 3b 0a          *z = 0;.
12360 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20            i++;. 
12370 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e           if( i<n
12380 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Col ){.         
12390 20 20 20 61 7a 43 6f 6c 5b 69 5d 20 3d 20 26 7a     azCol[i] = &z
123a0 5b 6e 53 65 70 5d 3b 0a 20 20 20 20 20 20 20 20  [nSep];.        
123b0 20 20 20 20 7a 20 2b 3d 20 6e 53 65 70 2d 31 3b      z += nSep-1;
123c0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
123d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
123e0 20 20 20 20 20 69 66 28 20 69 2b 31 21 3d 6e 43       if( i+1!=nC
123f0 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  ol ){.        ch
12400 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20 20 20  ar *zErr;.      
12410 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 73 74 72    int nErr = str
12420 6c 65 6e 33 30 28 7a 46 69 6c 65 29 20 2b 20 32  len30(zFile) + 2
12430 30 30 3b 0a 20 20 20 20 20 20 20 20 7a 45 72 72  00;.        zErr
12440 20 3d 20 6d 61 6c 6c 6f 63 28 6e 45 72 72 29 3b   = malloc(nErr);
12450 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 45 72  .        if( zEr
12460 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  r ){.          s
12470 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
12480 6e 45 72 72 2c 20 7a 45 72 72 2c 0a 20 20 20 20  nErr, zErr,.    
12490 20 20 20 20 20 20 20 20 20 22 45 72 72 6f 72 3a           "Error:
124a0 20 25 73 20 6c 69 6e 65 20 25 64 3a 20 65 78 70   %s line %d: exp
124b0 65 63 74 65 64 20 25 64 20 63 6f 6c 75 6d 6e 73  ected %d columns
124c0 20 6f 66 20 64 61 74 61 20 62 75 74 20 66 6f 75   of data but fou
124d0 6e 64 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20  nd %d",.        
124e0 20 20 20 20 20 7a 46 69 6c 65 2c 20 6c 69 6e 65       zFile, line
124f0 6e 6f 2c 20 6e 43 6f 6c 2c 20 69 2b 31 29 3b 0a  no, nCol, i+1);.
12500 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70            Tcl_Ap
12510 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
12520 70 2c 20 7a 45 72 72 2c 20 28 63 68 61 72 2a 29  p, zErr, (char*)
12530 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 72  0);.          fr
12540 65 65 28 7a 45 72 72 29 3b 0a 20 20 20 20 20 20  ee(zErr);.      
12550 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 43 6f 6d    }.        zCom
12560 6d 69 74 20 3d 20 22 52 4f 4c 4c 42 41 43 4b 22  mit = "ROLLBACK"
12570 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
12580 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
12590 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
125a0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  i++){.        /*
125b0 20 63 68 65 63 6b 20 66 6f 72 20 6e 75 6c 6c 20   check for null 
125c0 64 61 74 61 2c 20 69 66 20 73 6f 2c 20 62 69 6e  data, if so, bin
125d0 64 20 61 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20  d as null */.   
125e0 20 20 20 20 20 69 66 28 20 28 6e 4e 75 6c 6c 3e       if( (nNull>
125f0 30 20 26 26 20 73 74 72 63 6d 70 28 61 7a 43 6f  0 && strcmp(azCo
12600 6c 5b 69 5d 2c 20 7a 4e 75 6c 6c 29 3d 3d 30 29  l[i], zNull)==0)
12610 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 74  .          || st
12620 72 6c 65 6e 33 30 28 61 7a 43 6f 6c 5b 69 5d 29  rlen30(azCol[i])
12630 3d 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  ==0.        ){. 
12640 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
12650 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74  _bind_null(pStmt
12660 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  , i+1);.        
12670 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
12680 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
12690 78 74 28 70 53 74 6d 74 2c 20 69 2b 31 2c 20 61  xt(pStmt, i+1, a
126a0 7a 43 6f 6c 5b 69 5d 2c 20 2d 31 2c 20 53 51 4c  zCol[i], -1, SQL
126b0 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
126c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
126d0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65       sqlite3_ste
126e0 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  p(pStmt);.      
126f0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  rc = sqlite3_res
12700 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  et(pStmt);.     
12710 20 66 72 65 65 28 7a 4c 69 6e 65 29 3b 0a 20 20   free(zLine);.  
12720 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
12730 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
12740 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
12750 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 3a  t(interp,"Error:
12760 20 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d   ", sqlite3_errm
12770 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 28 63 68  sg(pDb->db), (ch
12780 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 20 20  ar*)0);.        
12790 7a 43 6f 6d 6d 69 74 20 3d 20 22 52 4f 4c 4c 42  zCommit = "ROLLB
127a0 41 43 4b 22 3b 0a 20 20 20 20 20 20 20 20 62 72  ACK";.        br
127b0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
127c0 20 7d 0a 20 20 20 20 66 72 65 65 28 61 7a 43 6f   }.    free(azCo
127d0 6c 29 3b 0a 20 20 20 20 66 63 6c 6f 73 65 28 69  l);.    fclose(i
127e0 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  n);.    sqlite3_
127f0 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
12800 0a 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74  .    (void)sqlit
12810 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62 2c  e3_exec(pDb->db,
12820 20 7a 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 2c 20   zCommit, 0, 0, 
12830 30 29 3b 0a 0a 20 20 20 20 69 66 28 20 7a 43 6f  0);..    if( zCo
12840 6d 6d 69 74 5b 30 5d 20 3d 3d 20 27 43 27 20 29  mmit[0] == 'C' )
12850 7b 0a 20 20 20 20 20 20 2f 2a 20 73 75 63 63 65  {.      /* succe
12860 73 73 2c 20 73 65 74 20 72 65 73 75 6c 74 20 61  ss, set result a
12870 73 20 6e 75 6d 62 65 72 20 6f 66 20 6c 69 6e 65  s number of line
12880 73 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20  s processed */. 
12890 20 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54       pResult = T
128a0 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_GetObjResult(
128b0 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 20 20 54  interp);.      T
128c0 63 6c 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52 65  cl_SetIntObj(pRe
128d0 73 75 6c 74 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20  sult, lineno);. 
128e0 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b       rc = TCL_OK
128f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
12900 20 20 20 2f 2a 20 66 61 69 6c 75 72 65 2c 20 61     /* failure, a
12910 70 70 65 6e 64 20 6c 69 6e 65 6e 6f 20 77 68 65  ppend lineno whe
12920 72 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20  re failed */.   
12930 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
12940 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c 69 6e 65  ntf(sizeof(zLine
12950 4e 75 6d 29 2c 20 7a 4c 69 6e 65 4e 75 6d 2c 22  Num), zLineNum,"
12960 25 64 22 2c 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20  %d",lineno);.   
12970 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
12980 75 6c 74 28 69 6e 74 65 72 70 2c 22 2c 20 66 61  ult(interp,", fa
12990 69 6c 65 64 20 77 68 69 6c 65 20 70 72 6f 63 65  iled while proce
129a0 73 73 69 6e 67 20 6c 69 6e 65 3a 20 22 2c 7a 4c  ssing line: ",zL
129b0 69 6e 65 4e 75 6d 2c 0a 20 20 20 20 20 20 20 20  ineNum,.        
129c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
129d0 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
129e0 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  rc = TCL_ERROR;.
129f0 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
12a00 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
12a10 20 20 20 24 64 62 20 65 6e 61 62 6c 65 5f 6c 6f     $db enable_lo
12a20 61 64 5f 65 78 74 65 6e 73 69 6f 6e 20 42 4f 4f  ad_extension BOO
12a30 4c 45 41 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  LEAN.  **.  ** T
12a40 75 72 6e 20 74 68 65 20 65 78 74 65 6e 73 69 6f  urn the extensio
12a50 6e 20 6c 6f 61 64 69 6e 67 20 66 65 61 74 75 72  n loading featur
12a60 65 20 6f 6e 20 6f 72 20 6f 66 66 2e 20 20 49 74  e on or off.  It
12a70 20 69 66 20 6f 66 66 20 62 79 0a 20 20 2a 2a 20   if off by.  ** 
12a80 64 65 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20  default..  */.  
12a90 63 61 73 65 20 44 42 5f 45 4e 41 42 4c 45 5f 4c  case DB_ENABLE_L
12aa0 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 3a 20 7b  OAD_EXTENSION: {
12ab0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12ac0 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
12ad0 49 4f 4e 0a 20 20 20 20 69 6e 74 20 6f 6e 6f 66  ION.    int onof
12ae0 66 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  f;.    if( objc!
12af0 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =3 ){.      Tcl_
12b00 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
12b10 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 42  erp, 2, objv, "B
12b20 4f 4f 4c 45 41 4e 22 29 3b 0a 20 20 20 20 20 20  OOLEAN");.      
12b30 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
12b40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
12b50 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
12b60 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
12b70 6a 76 5b 32 5d 2c 20 26 6f 6e 6f 66 66 29 20 29  jv[2], &onoff) )
12b80 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  {.      return T
12b90 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
12ba0 20 20 20 20 73 71 6c 69 74 65 33 5f 65 6e 61 62      sqlite3_enab
12bb0 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f  le_load_extensio
12bc0 6e 28 70 44 62 2d 3e 64 62 2c 20 6f 6e 6f 66 66  n(pDb->db, onoff
12bd0 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 23 65  );.    break;.#e
12be0 6c 73 65 0a 20 20 20 20 54 63 6c 5f 41 70 70 65  lse.    Tcl_Appe
12bf0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
12c00 20 22 65 78 74 65 6e 73 69 6f 6e 20 6c 6f 61 64   "extension load
12c10 69 6e 67 20 69 73 20 74 75 72 6e 65 64 20 6f 66  ing is turned of
12c20 66 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  f at compile-tim
12c30 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e",.            
12c40 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
12c50 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
12c60 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6e 64 69 66  CL_ERROR;.#endif
12c70 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
12c80 20 20 20 24 64 62 20 65 72 72 6f 72 63 6f 64 65     $db errorcode
12c90 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72  .  **.  ** Retur
12ca0 6e 20 74 68 65 20 6e 75 6d 65 72 69 63 20 65 72  n the numeric er
12cb0 72 6f 72 20 63 6f 64 65 20 74 68 61 74 20 77 61  ror code that wa
12cc0 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  s returned by th
12cd0 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 20 20  e most recent.  
12ce0 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  ** call to sqlit
12cf0 65 33 5f 65 78 65 63 28 29 2e 0a 20 20 2a 2f 0a  e3_exec()..  */.
12d00 20 20 63 61 73 65 20 44 42 5f 45 52 52 4f 52 43    case DB_ERRORC
12d10 4f 44 45 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 53  ODE: {.    Tcl_S
12d20 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
12d30 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
12d40 6a 28 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  j(sqlite3_errcod
12d50 65 28 70 44 62 2d 3e 64 62 29 29 29 3b 0a 20 20  e(pDb->db)));.  
12d60 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
12d70 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 65  /*.  **    $db e
12d80 78 69 73 74 73 20 24 73 71 6c 0a 20 20 2a 2a 20  xists $sql.  ** 
12d90 20 20 20 24 64 62 20 6f 6e 65 63 6f 6c 75 6d 6e     $db onecolumn
12da0 20 24 73 71 6c 0a 20 20 2a 2a 0a 20 20 2a 2a 20   $sql.  **.  ** 
12db0 54 68 65 20 6f 6e 65 63 6f 6c 75 6d 6e 20 6d 65  The onecolumn me
12dc0 74 68 6f 64 20 69 73 20 74 68 65 20 65 71 75 69  thod is the equi
12dd0 76 61 6c 65 6e 74 20 6f 66 3a 0a 20 20 2a 2a 20  valent of:.  ** 
12de0 20 20 20 20 6c 69 6e 64 65 78 20 5b 24 64 62 20      lindex [$db 
12df0 65 76 61 6c 20 24 73 71 6c 5d 20 30 0a 20 20 2a  eval $sql] 0.  *
12e00 2f 0a 20 20 63 61 73 65 20 44 42 5f 45 58 49 53  /.  case DB_EXIS
12e10 54 53 3a 0a 20 20 63 61 73 65 20 44 42 5f 4f 4e  TS:.  case DB_ON
12e20 45 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 54  ECOLUMN: {.    T
12e30 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 20  cl_Obj *pResult 
12e40 3d 20 30 3b 0a 20 20 20 20 44 62 45 76 61 6c 43  = 0;.    DbEvalC
12e50 6f 6e 74 65 78 74 20 73 45 76 61 6c 3b 0a 20 20  ontext sEval;.  
12e60 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
12e70 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
12e80 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
12e90 32 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 22 29 3b  2, objv, "SQL");
12ea0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
12eb0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
12ec0 20 20 20 20 64 62 45 76 61 6c 49 6e 69 74 28 26      dbEvalInit(&
12ed0 73 45 76 61 6c 2c 20 70 44 62 2c 20 6f 62 6a 76  sEval, pDb, objv
12ee0 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20 72 63 20  [2], 0);.    rc 
12ef0 3d 20 64 62 45 76 61 6c 53 74 65 70 28 26 73 45  = dbEvalStep(&sE
12f00 76 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 63 68  val);.    if( ch
12f10 6f 69 63 65 3d 3d 44 42 5f 4f 4e 45 43 4f 4c 55  oice==DB_ONECOLU
12f20 4d 4e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  MN ){.      if( 
12f30 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20  rc==TCL_OK ){.  
12f40 20 20 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20        pResult = 
12f50 64 62 45 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75  dbEvalColumnValu
12f60 65 28 26 73 45 76 61 6c 2c 20 30 29 3b 0a 20 20  e(&sEval, 0);.  
12f70 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
12f80 3d 3d 54 43 4c 5f 42 52 45 41 4b 20 29 7b 0a 20  ==TCL_BREAK ){. 
12f90 20 20 20 20 20 20 20 54 63 6c 5f 52 65 73 65 74         Tcl_Reset
12fa0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
12fb0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
12fc0 65 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 42 52  e if( rc==TCL_BR
12fd0 45 41 4b 20 7c 7c 20 72 63 3d 3d 54 43 4c 5f 4f  EAK || rc==TCL_O
12fe0 4b 20 29 7b 0a 20 20 20 20 20 20 70 52 65 73 75  K ){.      pResu
12ff0 6c 74 20 3d 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c  lt = Tcl_NewBool
13000 65 61 6e 4f 62 6a 28 72 63 3d 3d 54 43 4c 5f 4f  eanObj(rc==TCL_O
13010 4b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62  K);.    }.    db
13020 45 76 61 6c 46 69 6e 61 6c 69 7a 65 28 26 73 45  EvalFinalize(&sE
13030 76 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 70 52  val);.    if( pR
13040 65 73 75 6c 74 20 29 20 54 63 6c 5f 53 65 74 4f  esult ) Tcl_SetO
13050 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
13060 20 70 52 65 73 75 6c 74 29 3b 0a 0a 20 20 20 20   pResult);..    
13070 69 66 28 20 72 63 3d 3d 54 43 4c 5f 42 52 45 41  if( rc==TCL_BREA
13080 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
13090 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  TCL_OK;.    }.  
130a0 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
130b0 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 65  /*.  **    $db e
130c0 76 61 6c 20 24 73 71 6c 20 3f 61 72 72 61 79 3f  val $sql ?array?
130d0 20 3f 7b 20 20 2e 2e 2e 63 6f 64 65 2e 2e 2e 20   ?{  ...code... 
130e0 7d 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  }?.  **.  ** The
130f0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69   SQL statement i
13100 6e 20 24 73 71 6c 20 69 73 20 65 76 61 6c 75 61  n $sql is evalua
13110 74 65 64 2e 20 20 46 6f 72 20 65 61 63 68 20 72  ted.  For each r
13120 6f 77 2c 20 74 68 65 20 76 61 6c 75 65 73 20 61  ow, the values a
13130 72 65 0a 20 20 2a 2a 20 70 6c 61 63 65 64 20 69  re.  ** placed i
13140 6e 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  n elements of th
13150 65 20 61 72 72 61 79 20 6e 61 6d 65 64 20 22 61  e array named "a
13160 72 72 61 79 22 20 61 6e 64 20 2e 2e 2e 63 6f 64  rray" and ...cod
13170 65 2e 2e 2e 20 69 73 20 65 78 65 63 75 74 65 64  e... is executed
13180 2e 0a 20 20 2a 2a 20 49 66 20 22 61 72 72 61 79  ..  ** If "array
13190 22 20 61 6e 64 20 22 63 6f 64 65 22 20 61 72 65  " and "code" are
131a0 20 6f 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 6e   omitted, then n
131b0 6f 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 65 76  o callback is ev
131c0 65 72 79 20 69 6e 76 6f 6b 65 64 2e 0a 20 20 2a  ery invoked..  *
131d0 2a 20 49 66 20 22 61 72 72 61 79 22 20 69 73 20  * If "array" is 
131e0 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c  an empty string,
131f0 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 73   then the values
13200 20 61 72 65 20 70 6c 61 63 65 64 20 69 6e 20 76   are placed in v
13210 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 74 68  ariables.  ** th
13220 61 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  at have the same
13230 20 6e 61 6d 65 20 61 73 20 74 68 65 20 66 69 65   name as the fie
13240 6c 64 73 20 65 78 74 72 61 63 74 65 64 20 62 79  lds extracted by
13250 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f   the query..  */
13260 0a 20 20 63 61 73 65 20 44 42 5f 45 56 41 4c 3a  .  case DB_EVAL:
13270 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3c   {.    if( objc<
13280 33 20 7c 7c 20 6f 62 6a 63 3e 35 20 29 7b 0a 20  3 || objc>5 ){. 
13290 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
132a0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
132b0 20 6f 62 6a 76 2c 20 22 53 51 4c 20 3f 41 52 52   objv, "SQL ?ARR
132c0 41 59 2d 4e 41 4d 45 3f 20 3f 53 43 52 49 50 54  AY-NAME? ?SCRIPT
132d0 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ?");.      retur
132e0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
132f0 20 7d 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63   }..    if( objc
13300 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 44 62 45  ==3 ){.      DbE
13310 76 61 6c 43 6f 6e 74 65 78 74 20 73 45 76 61 6c  valContext sEval
13320 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20  ;.      Tcl_Obj 
13330 2a 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f  *pRet = Tcl_NewO
13340 62 6a 28 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f  bj();.      Tcl_
13350 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 52 65  IncrRefCount(pRe
13360 74 29 3b 0a 20 20 20 20 20 20 64 62 45 76 61 6c  t);.      dbEval
13370 49 6e 69 74 28 26 73 45 76 61 6c 2c 20 70 44 62  Init(&sEval, pDb
13380 2c 20 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20  , objv[2], 0);. 
13390 20 20 20 20 20 77 68 69 6c 65 28 20 54 43 4c 5f       while( TCL_
133a0 4f 4b 3d 3d 28 72 63 20 3d 20 64 62 45 76 61 6c  OK==(rc = dbEval
133b0 53 74 65 70 28 26 73 45 76 61 6c 29 29 20 29 7b  Step(&sEval)) ){
133c0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  .        int i;.
133d0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c          int nCol
133e0 3b 0a 20 20 20 20 20 20 20 20 64 62 45 76 61 6c  ;.        dbEval
133f0 52 6f 77 49 6e 66 6f 28 26 73 45 76 61 6c 2c 20  RowInfo(&sEval, 
13400 26 6e 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 20  &nCol, 0);.     
13410 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
13420 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
13430 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
13440 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
13450 65 72 70 2c 20 70 52 65 74 2c 20 64 62 45 76 61  erp, pRet, dbEva
13460 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65 28 26 73 45  lColumnValue(&sE
13470 76 61 6c 2c 20 69 29 29 3b 0a 20 20 20 20 20 20  val, i));.      
13480 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
13490 20 20 64 62 45 76 61 6c 46 69 6e 61 6c 69 7a 65    dbEvalFinalize
134a0 28 26 73 45 76 61 6c 29 3b 0a 20 20 20 20 20 20  (&sEval);.      
134b0 69 66 28 20 72 63 3d 3d 54 43 4c 5f 42 52 45 41  if( rc==TCL_BREA
134c0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  K ){.        Tcl
134d0 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
134e0 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 20 20 20  terp, pRet);.   
134f0 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b       rc = TCL_OK
13500 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13510 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
13520 28 70 52 65 74 29 3b 0a 20 20 20 20 7d 65 6c 73  (pRet);.    }els
13530 65 7b 0a 20 20 20 20 20 20 43 6c 69 65 6e 74 44  e{.      ClientD
13540 61 74 61 20 63 64 32 5b 32 5d 3b 0a 20 20 20 20  ata cd2[2];.    
13550 20 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20    DbEvalContext 
13560 2a 70 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62  *p;.      Tcl_Ob
13570 6a 20 2a 70 41 72 72 61 79 20 3d 20 30 3b 0a 20  j *pArray = 0;. 
13580 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53       Tcl_Obj *pS
13590 63 72 69 70 74 3b 0a 0a 20 20 20 20 20 20 69 66  cript;..      if
135a0 28 20 6f 62 6a 63 3d 3d 35 20 26 26 20 2a 28 63  ( objc==5 && *(c
135b0 68 61 72 20 2a 29 54 63 6c 5f 47 65 74 53 74 72  har *)Tcl_GetStr
135c0 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 20 29 7b 0a  ing(objv[3]) ){.
135d0 20 20 20 20 20 20 20 20 70 41 72 72 61 79 20 3d          pArray =
135e0 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20 20 20 20   objv[3];.      
135f0 7d 0a 20 20 20 20 20 20 70 53 63 72 69 70 74 20  }.      pScript 
13600 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 3b 0a  = objv[objc-1];.
13610 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65        Tcl_IncrRe
13620 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b  fCount(pScript);
13630 0a 0a 20 20 20 20 20 20 70 20 3d 20 28 44 62 45  ..      p = (DbE
13640 76 61 6c 43 6f 6e 74 65 78 74 20 2a 29 54 63 6c  valContext *)Tcl
13650 5f 41 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 44 62  _Alloc(sizeof(Db
13660 45 76 61 6c 43 6f 6e 74 65 78 74 29 29 3b 0a 20  EvalContext));. 
13670 20 20 20 20 20 64 62 45 76 61 6c 49 6e 69 74 28       dbEvalInit(
13680 70 2c 20 70 44 62 2c 20 6f 62 6a 76 5b 32 5d 2c  p, pDb, objv[2],
13690 20 70 41 72 72 61 79 29 3b 0a 0a 20 20 20 20 20   pArray);..     
136a0 20 63 64 32 5b 30 5d 20 3d 20 28 76 6f 69 64 20   cd2[0] = (void 
136b0 2a 29 70 3b 0a 20 20 20 20 20 20 63 64 32 5b 31  *)p;.      cd2[1
136c0 5d 20 3d 20 28 76 6f 69 64 20 2a 29 70 53 63 72  ] = (void *)pScr
136d0 69 70 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ipt;.      rc = 
136e0 44 62 45 76 61 6c 4e 65 78 74 43 6d 64 28 63 64  DbEvalNextCmd(cd
136f0 32 2c 20 69 6e 74 65 72 70 2c 20 54 43 4c 5f 4f  2, interp, TCL_O
13700 4b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72  K);.    }.    br
13710 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
13720 20 2a 2a 20 20 20 20 20 24 64 62 20 66 75 6e 63   **     $db func
13730 74 69 6f 6e 20 4e 41 4d 45 20 5b 2d 61 72 67 63  tion NAME [-argc
13740 6f 75 6e 74 20 4e 5d 20 5b 2d 64 65 74 65 72 6d  ount N] [-determ
13750 69 6e 69 73 74 69 63 5d 20 53 43 52 49 50 54 0a  inistic] SCRIPT.
13760 20 20 2a 2a 0a 20 20 2a 2a 20 43 72 65 61 74 65    **.  ** Create
13770 20 61 20 6e 65 77 20 53 51 4c 20 66 75 6e 63 74   a new SQL funct
13780 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e  ion called NAME.
13790 20 20 57 68 65 6e 65 76 65 72 20 74 68 61 74 20    Whenever that 
137a0 66 75 6e 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a  function is.  **
137b0 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65 20   called, invoke 
137c0 53 43 52 49 50 54 20 74 6f 20 65 76 61 6c 75 61  SCRIPT to evalua
137d0 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e  te the function.
137e0 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
137f0 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20  FUNCTION: {.    
13800 69 6e 74 20 66 6c 61 67 73 20 3d 20 53 51 4c 49  int flags = SQLI
13810 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 53 71 6c  TE_UTF8;.    Sql
13820 46 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20 20  Func *pFunc;.   
13830 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70   Tcl_Obj *pScrip
13840 74 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 61  t;.    char *zNa
13850 6d 65 3b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67  me;.    int nArg
13860 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20 69   = -1;.    int i
13870 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3c 34  ;.    if( objc<4
13880 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
13890 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
138a0 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d  p, 2, objv, "NAM
138b0 45 20 3f 53 57 49 54 43 48 45 53 3f 20 53 43 52  E ?SWITCHES? SCR
138c0 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65 74  IPT");.      ret
138d0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
138e0 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 33     }.    for(i=3
138f0 3b 20 69 3c 28 6f 62 6a 63 2d 31 29 3b 20 69 2b  ; i<(objc-1); i+
13900 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  +){.      const 
13910 63 68 61 72 20 2a 7a 20 3d 20 54 63 6c 5f 47 65  char *z = Tcl_Ge
13920 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69 5d 29  tString(objv[i])
13930 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  ;.      int n = 
13940 73 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20  strlen30(z);.   
13950 20 20 20 69 66 28 20 6e 3e 32 20 26 26 20 73 74     if( n>2 && st
13960 72 6e 63 6d 70 28 7a 2c 20 22 2d 61 72 67 63 6f  rncmp(z, "-argco
13970 75 6e 74 22 2c 6e 29 3d 3d 30 20 29 7b 0a 20 20  unt",n)==0 ){.  
13980 20 20 20 20 20 20 69 66 28 20 69 3d 3d 28 6f 62        if( i==(ob
13990 6a 63 2d 32 29 20 29 7b 0a 20 20 20 20 20 20 20  jc-2) ){.       
139a0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
139b0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6f 70 74  ult(interp, "opt
139c0 69 6f 6e 20 72 65 71 75 69 72 65 73 20 61 6e 20  ion requires an 
139d0 61 72 67 75 6d 65 6e 74 3a 20 22 2c 20 7a 2c 20  argument: ", z, 
139e0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  0);.          re
139f0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
13a00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13a10 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
13a20 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
13a30 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 6e 41 72 67  objv[i+1], &nArg
13a40 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
13a50 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 69 66  RROR;.        if
13a60 28 20 6e 41 72 67 3c 30 20 29 7b 0a 20 20 20 20  ( nArg<0 ){.    
13a70 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
13a80 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
13a90 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  number of argume
13aa0 6e 74 73 20 6d 75 73 74 20 62 65 20 6e 6f 6e 2d  nts must be non-
13ab0 6e 65 67 61 74 69 76 65 22 2c 0a 20 20 20 20 20  negative",.     
13ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ad0 20 20 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b        (char*)0);
13ae0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
13af0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
13b00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
13b10 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a  ++;.      }else.
13b20 20 20 20 20 20 20 69 66 28 20 6e 3e 32 20 26 26        if( n>2 &&
13b30 20 73 74 72 6e 63 6d 70 28 7a 2c 20 22 2d 64 65   strncmp(z, "-de
13b40 74 65 72 6d 69 6e 69 73 74 69 63 22 2c 6e 29 3d  terministic",n)=
13b50 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c  =0 ){.        fl
13b60 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 44 45  ags |= SQLITE_DE
13b70 54 45 52 4d 49 4e 49 53 54 49 43 3b 0a 20 20 20  TERMINISTIC;.   
13b80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13b90 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
13ba0 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20  lt(interp, "bad 
13bb0 6f 70 74 69 6f 6e 20 5c 22 22 2c 20 7a 2c 0a 20  option \"", z,. 
13bc0 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 3a 20             "\": 
13bd0 6d 75 73 74 20 62 65 20 2d 61 72 67 63 6f 75 6e  must be -argcoun
13be0 74 20 6f 72 20 2d 64 65 74 65 72 6d 69 6e 69 73  t or -determinis
13bf0 74 69 63 22 2c 20 30 0a 20 20 20 20 20 20 20 20  tic", 0.        
13c00 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
13c10 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
13c20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
13c30 70 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 6f  pScript = objv[o
13c40 62 6a 63 2d 31 5d 3b 0a 20 20 20 20 7a 4e 61 6d  bjc-1];.    zNam
13c50 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
13c60 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
13c70 2c 20 30 29 3b 0a 20 20 20 20 70 46 75 6e 63 20  , 0);.    pFunc 
13c80 3d 20 66 69 6e 64 53 71 6c 46 75 6e 63 28 70 44  = findSqlFunc(pD
13c90 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69  b, zName);.    i
13ca0 66 28 20 70 46 75 6e 63 3d 3d 30 20 29 20 72 65  f( pFunc==0 ) re
13cb0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
13cc0 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 70      if( pFunc->p
13cd0 53 63 72 69 70 74 20 29 7b 0a 20 20 20 20 20 20  Script ){.      
13ce0 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
13cf0 28 70 46 75 6e 63 2d 3e 70 53 63 72 69 70 74 29  (pFunc->pScript)
13d00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 75 6e  ;.    }.    pFun
13d10 63 2d 3e 70 53 63 72 69 70 74 20 3d 20 70 53 63  c->pScript = pSc
13d20 72 69 70 74 3b 0a 20 20 20 20 54 63 6c 5f 49 6e  ript;.    Tcl_In
13d30 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69  crRefCount(pScri
13d40 70 74 29 3b 0a 20 20 20 20 70 46 75 6e 63 2d 3e  pt);.    pFunc->
13d50 75 73 65 45 76 61 6c 4f 62 6a 76 20 3d 20 73 61  useEvalObjv = sa
13d60 66 65 54 6f 55 73 65 45 76 61 6c 4f 62 6a 76 28  feToUseEvalObjv(
13d70 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74 29  interp, pScript)
13d80 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
13d90 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
13da0 6f 6e 28 70 44 62 2d 3e 64 62 2c 20 7a 4e 61 6d  on(pDb->db, zNam
13db0 65 2c 20 6e 41 72 67 2c 20 66 6c 61 67 73 2c 0a  e, nArg, flags,.
13dc0 20 20 20 20 20 20 20 20 70 46 75 6e 63 2c 20 74          pFunc, t
13dd0 63 6c 53 71 6c 46 75 6e 63 2c 20 30 2c 20 30 29  clSqlFunc, 0, 0)
13de0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
13df0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13e00 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b   rc = TCL_ERROR;
13e10 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65  .      Tcl_SetRe
13e20 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
13e30 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 65 72 72  ar *)sqlite3_err
13e40 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 54 43  msg(pDb->db), TC
13e50 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20  L_VOLATILE);.   
13e60 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
13e70 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
13e80 20 24 64 62 20 69 6e 63 72 62 6c 6f 62 20 3f 2d   $db incrblob ?-
13e90 72 65 61 64 6f 6e 6c 79 3f 20 3f 44 42 3f 20 54  readonly? ?DB? T
13ea0 41 42 4c 45 20 43 4f 4c 55 4d 4e 20 52 4f 57 49  ABLE COLUMN ROWI
13eb0 44 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  D.  */.  case DB
13ec0 5f 49 4e 43 52 42 4c 4f 42 3a 20 7b 0a 23 69 66  _INCRBLOB: {.#if
13ed0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13ee0 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 54 63 6c  INCRBLOB.    Tcl
13ef0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
13f00 74 65 72 70 2c 20 22 69 6e 63 72 62 6c 6f 62 20  terp, "incrblob 
13f10 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 69 6e  not available in
13f20 20 74 68 69 73 20 62 75 69 6c 64 22 2c 20 28 63   this build", (c
13f30 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74  har*)0);.    ret
13f40 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23  urn TCL_ERROR;.#
13f50 65 6c 73 65 0a 20 20 20 20 69 6e 74 20 69 73 52  else.    int isR
13f60 65 61 64 6f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20  eadonly = 0;.   
13f70 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
13f80 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 63   = "main";.    c
13f90 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c  onst char *zTabl
13fa0 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
13fb0 72 20 2a 7a 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r *zColumn;.    
13fc0 54 63 6c 5f 57 69 64 65 49 6e 74 20 69 52 6f 77  Tcl_WideInt iRow
13fd0 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
13fe0 66 6f 72 20 74 68 65 20 2d 72 65 61 64 6f 6e 6c  for the -readonl
13ff0 79 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  y option */.    
14000 69 66 28 20 6f 62 6a 63 3e 33 20 26 26 20 73 74  if( objc>3 && st
14010 72 63 6d 70 28 54 63 6c 5f 47 65 74 53 74 72 69  rcmp(Tcl_GetStri
14020 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 22 2d 72  ng(objv[2]), "-r
14030 65 61 64 6f 6e 6c 79 22 29 3d 3d 30 20 29 7b 0a  eadonly")==0 ){.
14040 20 20 20 20 20 20 69 73 52 65 61 64 6f 6e 6c 79        isReadonly
14050 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 1;.    }..   
14060 20 69 66 28 20 6f 62 6a 63 21 3d 28 35 2b 69 73   if( objc!=(5+is
14070 52 65 61 64 6f 6e 6c 79 29 20 26 26 20 6f 62 6a  Readonly) && obj
14080 63 21 3d 28 36 2b 69 73 52 65 61 64 6f 6e 6c 79  c!=(6+isReadonly
14090 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  ) ){.      Tcl_W
140a0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
140b0 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 2d  rp, 2, objv, "?-
140c0 72 65 61 64 6f 6e 6c 79 3f 20 3f 44 42 3f 20 54  readonly? ?DB? T
140d0 41 42 4c 45 20 43 4f 4c 55 4d 4e 20 52 4f 57 49  ABLE COLUMN ROWI
140e0 44 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  D");.      retur
140f0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
14100 20 7d 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63   }..    if( objc
14110 3d 3d 28 36 2b 69 73 52 65 61 64 6f 6e 6c 79 29  ==(6+isReadonly)
14120 20 29 7b 0a 20 20 20 20 20 20 7a 44 62 20 3d 20   ){.      zDb = 
14130 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
14140 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  jv[2]);.    }.  
14150 20 20 7a 54 61 62 6c 65 20 3d 20 54 63 6c 5f 47    zTable = Tcl_G
14160 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 6f 62  etString(objv[ob
14170 6a 63 2d 33 5d 29 3b 0a 20 20 20 20 7a 43 6f 6c  jc-3]);.    zCol
14180 75 6d 6e 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  umn = Tcl_GetStr
14190 69 6e 67 28 6f 62 6a 76 5b 6f 62 6a 63 2d 32 5d  ing(objv[objc-2]
141a0 29 3b 0a 20 20 20 20 72 63 20 3d 20 54 63 6c 5f  );.    rc = Tcl_
141b0 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62  GetWideIntFromOb
141c0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 6f  j(interp, objv[o
141d0 62 6a 63 2d 31 5d 2c 20 26 69 52 6f 77 29 3b 0a  bjc-1], &iRow);.
141e0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c  .    if( rc==TCL
141f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
14200 3d 20 63 72 65 61 74 65 49 6e 63 72 62 6c 6f 62  = createIncrblob
14210 43 68 61 6e 6e 65 6c 28 0a 20 20 20 20 20 20 20  Channel(.       
14220 20 20 20 69 6e 74 65 72 70 2c 20 70 44 62 2c 20     interp, pDb, 
14230 7a 44 62 2c 20 7a 54 61 62 6c 65 2c 20 7a 43 6f  zDb, zTable, zCo
14240 6c 75 6d 6e 2c 20 28 73 71 6c 69 74 65 33 5f 69  lumn, (sqlite3_i
14250 6e 74 36 34 29 69 52 6f 77 2c 20 69 73 52 65 61  nt64)iRow, isRea
14260 64 6f 6e 6c 79 0a 20 20 20 20 20 20 29 3b 0a 20  donly.      );. 
14270 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
14280 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
14290 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 69 6e  .  **     $db in
142a0 74 65 72 72 75 70 74 0a 20 20 2a 2a 0a 20 20 2a  terrupt.  **.  *
142b0 2a 20 49 6e 74 65 72 72 75 70 74 20 74 68 65 20  * Interrupt the 
142c0 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 65  execution of the
142d0 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 53 51 4c 20   inner-most SQL 
142e0 69 6e 74 65 72 70 72 65 74 65 72 2e 20 20 54 68  interpreter.  Th
142f0 69 73 0a 20 20 2a 2a 20 63 61 75 73 65 73 20 74  is.  ** causes t
14300 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
14310 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72   to return an er
14320 72 6f 72 20 6f 66 20 53 51 4c 49 54 45 5f 49 4e  ror of SQLITE_IN
14330 54 45 52 52 55 50 54 2e 0a 20 20 2a 2f 0a 20 20  TERRUPT..  */.  
14340 63 61 73 65 20 44 42 5f 49 4e 54 45 52 52 55 50  case DB_INTERRUP
14350 54 3a 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  T: {.    sqlite3
14360 5f 69 6e 74 65 72 72 75 70 74 28 70 44 62 2d 3e  _interrupt(pDb->
14370 64 62 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  db);.    break;.
14380 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
14390 20 20 20 24 64 62 20 6e 75 6c 6c 76 61 6c 75 65     $db nullvalue
143a0 20 3f 53 54 52 49 4e 47 3f 0a 20 20 2a 2a 0a 20   ?STRING?.  **. 
143b0 20 2a 2a 20 43 68 61 6e 67 65 20 74 65 78 74 20   ** Change text 
143c0 75 73 65 64 20 77 68 65 6e 20 61 20 4e 55 4c 4c  used when a NULL
143d0 20 63 6f 6d 65 73 20 62 61 63 6b 20 66 72 6f 6d   comes back from
143e0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
143f0 66 20 3f 53 54 52 49 4e 47 3f 0a 20 20 2a 2a 20  f ?STRING?.  ** 
14400 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20  is not present, 
14410 74 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74  then the current
14420 20 73 74 72 69 6e 67 20 75 73 65 64 20 66 6f 72   string used for
14430 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
14440 64 2e 0a 20 20 2a 2a 20 49 66 20 53 54 52 49 4e  d..  ** If STRIN
14450 47 20 69 73 20 70 72 65 73 65 6e 74 2c 20 74 68  G is present, th
14460 65 6e 20 53 54 52 49 4e 47 20 69 73 20 72 65 74  en STRING is ret
14470 75 72 6e 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2f  urned..  **.  */
14480 0a 20 20 63 61 73 65 20 44 42 5f 4e 55 4c 4c 56  .  case DB_NULLV
14490 41 4c 55 45 3a 20 7b 0a 20 20 20 20 69 66 28 20  ALUE: {.    if( 
144a0 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21  objc!=2 && objc!
144b0 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =3 ){.      Tcl_
144c0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
144d0 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e  erp, 2, objv, "N
144e0 55 4c 4c 56 41 4c 55 45 22 29 3b 0a 20 20 20 20  ULLVALUE");.    
144f0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
14500 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OR;.    }.    if
14510 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20  ( objc==3 ){.   
14520 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
14530 20 20 63 68 61 72 20 2a 7a 4e 75 6c 6c 20 3d 20    char *zNull = 
14540 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
14550 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c  mObj(objv[2], &l
14560 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  en);.      if( p
14570 44 62 2d 3e 7a 4e 75 6c 6c 20 29 7b 0a 20 20 20  Db->zNull ){.   
14580 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44       Tcl_Free(pD
14590 62 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  b->zNull);.     
145a0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 4e 75   }.      if( zNu
145b0 6c 6c 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20  ll && len>0 ){. 
145c0 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 75 6c         pDb->zNul
145d0 6c 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c  l = Tcl_Alloc( l
145e0 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20  en + 1 );.      
145f0 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 4e    memcpy(pDb->zN
14600 75 6c 6c 2c 20 7a 4e 75 6c 6c 2c 20 6c 65 6e 29  ull, zNull, len)
14610 3b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  ;.        pDb->z
14620 4e 75 6c 6c 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27  Null[len] = '\0'
14630 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
14640 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 75 6c         pDb->zNul
14650 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  l = 0;.      }. 
14660 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 53 65 74     }.    Tcl_Set
14670 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
14680 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
14690 62 6a 28 70 44 62 2d 3e 7a 4e 75 6c 6c 2c 20 2d  bj(pDb->zNull, -
146a0 31 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  1));.    break;.
146b0 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
146c0 20 20 20 24 64 62 20 6c 61 73 74 5f 69 6e 73 65     $db last_inse
146d0 72 74 5f 72 6f 77 69 64 0a 20 20 2a 2a 0a 20 20  rt_rowid.  **.  
146e0 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74  ** Return an int
146f0 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
14700 65 20 52 4f 57 49 44 20 66 6f 72 20 74 68 65 20  e ROWID for the 
14710 6d 6f 73 74 20 72 65 63 65 6e 74 20 69 6e 73 65  most recent inse
14720 72 74 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  rt..  */.  case 
14730 44 42 5f 4c 41 53 54 5f 49 4e 53 45 52 54 5f 52  DB_LAST_INSERT_R
14740 4f 57 49 44 3a 20 7b 0a 20 20 20 20 54 63 6c 5f  OWID: {.    Tcl_
14750 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20  Obj *pResult;.  
14760 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 72 6f    Tcl_WideInt ro
14770 77 69 64 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a  wid;.    if( obj
14780 63 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=2 ){.      Tc
14790 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
147a0 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
147b0 22 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  "");.      retur
147c0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
147d0 20 7d 0a 20 20 20 20 72 6f 77 69 64 20 3d 20 73   }.    rowid = s
147e0 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65  qlite3_last_inse
147f0 72 74 5f 72 6f 77 69 64 28 70 44 62 2d 3e 64 62  rt_rowid(pDb->db
14800 29 3b 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d  );.    pResult =
14810 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c   Tcl_GetObjResul
14820 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54  t(interp);.    T
14830 63 6c 5f 53 65 74 57 69 64 65 49 6e 74 4f 62 6a  cl_SetWideIntObj
14840 28 70 52 65 73 75 6c 74 2c 20 72 6f 77 69 64 29  (pResult, rowid)
14850 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
14860 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  /*.  ** The 
14870 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 20 6d 65 74  DB_ONECOLUMN met
14880 68 6f 64 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  hod is implement
14890 65 64 20 74 6f 67 65 74 68 65 72 20 77 69 74 68  ed together with
148a0 20 44 42 5f 45 58 49 53 54 53 2e 0a 20 20 2a 2f   DB_EXISTS..  */
148b0 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 70 72  ..  /*    $db pr
148c0 6f 67 72 65 73 73 20 3f 4e 20 43 41 4c 4c 42 41  ogress ?N CALLBA
148d0 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e  CK?.  **.  ** In
148e0 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63  voke the given c
148f0 61 6c 6c 62 61 63 6b 20 65 76 65 72 79 20 4e 20  allback every N 
14900 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
14910 6f 70 63 6f 64 65 73 20 77 68 69 6c 65 20 65 78  opcodes while ex
14920 65 63 75 74 69 6e 67 0a 20 20 2a 2a 20 71 75 65  ecuting.  ** que
14930 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  ries..  */.  cas
14940 65 20 44 42 5f 50 52 4f 47 52 45 53 53 3a 20 7b  e DB_PROGRESS: {
14950 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32  .    if( objc==2
14960 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44   ){.      if( pD
14970 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29 7b 0a  b->zProgress ){.
14980 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65          Tcl_Appe
14990 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
149a0 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 2c   pDb->zProgress,
149b0 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
149c0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
149d0 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20  ( objc==4 ){.   
149e0 20 20 20 63 68 61 72 20 2a 7a 50 72 6f 67 72 65     char *zProgre
149f0 73 73 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65  ss;.      int le
14a00 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 4e 3b 0a  n;.      int N;.
14a10 20 20 20 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b        if( TCL_OK
14a20 21 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  !=Tcl_GetIntFrom
14a30 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
14a40 5b 32 5d 2c 20 26 4e 29 20 29 7b 0a 20 20 20 20  [2], &N) ){.    
14a50 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
14a60 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 3b 0a 20  RROR;.      };. 
14a70 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50       if( pDb->zP
14a80 72 6f 67 72 65 73 73 20 29 7b 0a 20 20 20 20 20  rogress ){.     
14a90 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d     Tcl_Free(pDb-
14aa0 3e 7a 50 72 6f 67 72 65 73 73 29 3b 0a 20 20 20  >zProgress);.   
14ab0 20 20 20 7d 0a 20 20 20 20 20 20 7a 50 72 6f 67     }.      zProg
14ac0 72 65 73 73 20 3d 20 54 63 6c 5f 47 65 74 53 74  ress = Tcl_GetSt
14ad0 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
14ae0 5b 33 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20  [3], &len);.    
14af0 20 20 69 66 28 20 7a 50 72 6f 67 72 65 73 73 20    if( zProgress 
14b00 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20  && len>0 ){.    
14b10 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65      pDb->zProgre
14b20 73 73 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20  ss = Tcl_Alloc( 
14b30 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20  len + 1 );.     
14b40 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a     memcpy(pDb->z
14b50 50 72 6f 67 72 65 73 73 2c 20 7a 50 72 6f 67 72  Progress, zProgr
14b60 65 73 73 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20  ess, len+1);.   
14b70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14b80 20 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73    pDb->zProgress
14b90 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69   = 0;.      }.#i
14ba0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14bb0 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42  T_PROGRESS_CALLB
14bc0 41 43 4b 0a 20 20 20 20 20 20 69 66 28 20 70 44  ACK.      if( pD
14bd0 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29 7b 0a  b->zProgress ){.
14be0 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74          pDb->int
14bf0 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20  erp = interp;.  
14c00 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72        sqlite3_pr
14c10 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65 72 28 70  ogress_handler(p
14c20 44 62 2d 3e 64 62 2c 20 4e 2c 20 44 62 50 72 6f  Db->db, N, DbPro
14c30 67 72 65 73 73 48 61 6e 64 6c 65 72 2c 20 70 44  gressHandler, pD
14c40 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  b);.      }else{
14c50 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14c60 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65  _progress_handle
14c70 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 2c  r(pDb->db, 0, 0,
14c80 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e   0);.      }.#en
14c90 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  dif.    }else{. 
14ca0 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
14cb0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
14cc0 20 6f 62 6a 76 2c 20 22 4e 20 43 41 4c 4c 42 41   objv, "N CALLBA
14cd0 43 4b 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  CK");.      retu
14ce0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
14cf0 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
14d00 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20   }..  /*    $db 
14d10 70 72 6f 66 69 6c 65 20 3f 43 41 4c 4c 42 41 43  profile ?CALLBAC
14d20 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b  K?.  **.  ** Mak
14d30 65 20 61 72 72 61 6e 67 65 6d 65 6e 74 73 20 74  e arrangements t
14d40 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 43 41 4c  o invoke the CAL
14d50 4c 42 41 43 4b 20 72 6f 75 74 69 6e 65 20 61 66  LBACK routine af
14d60 74 65 72 20 65 61 63 68 20 53 51 4c 20 73 74 61  ter each SQL sta
14d70 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 61 74  tement.  ** that
14d80 20 68 61 73 20 72 75 6e 2e 20 20 54 68 65 20 74   has run.  The t
14d90 65 78 74 20 6f 66 20 74 68 65 20 53 51 4c 20 61  ext of the SQL a
14da0 6e 64 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  nd the amount of
14db0 20 65 6c 61 70 73 65 20 74 69 6d 65 20 61 72 65   elapse time are
14dc0 0a 20 20 2a 2a 20 61 70 70 65 6e 64 65 64 20 74  .  ** appended t
14dd0 6f 20 43 41 4c 4c 42 41 43 4b 20 62 65 66 6f 72  o CALLBACK befor
14de0 65 20 74 68 65 20 73 63 72 69 70 74 20 69 73 20  e the script is 
14df0 72 75 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  run..  */.  case
14e00 20 44 42 5f 50 52 4f 46 49 4c 45 3a 20 7b 0a 20   DB_PROFILE: {. 
14e10 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b     if( objc>3 ){
14e20 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
14e30 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
14e40 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42  2, objv, "?CALLB
14e50 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65  ACK?");.      re
14e60 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
14e70 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62      }else if( ob
14e80 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69  jc==2 ){.      i
14e90 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65  f( pDb->zProfile
14ea0 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
14eb0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
14ec0 65 72 70 2c 20 70 44 62 2d 3e 7a 50 72 6f 66 69  erp, pDb->zProfi
14ed0 6c 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  le, (char*)0);. 
14ee0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
14ef0 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 50  {.      char *zP
14f00 72 6f 66 69 6c 65 3b 0a 20 20 20 20 20 20 69 6e  rofile;.      in
14f10 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28  t len;.      if(
14f20 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29   pDb->zProfile )
14f30 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72  {.        Tcl_Fr
14f40 65 65 28 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65  ee(pDb->zProfile
14f50 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
14f60 20 7a 50 72 6f 66 69 6c 65 20 3d 20 54 63 6c 5f   zProfile = Tcl_
14f70 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
14f80 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b  (objv[2], &len);
14f90 0a 20 20 20 20 20 20 69 66 28 20 7a 50 72 6f 66  .      if( zProf
14fa0 69 6c 65 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a  ile && len>0 ){.
14fb0 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 50 72          pDb->zPr
14fc0 6f 66 69 6c 65 20 3d 20 54 63 6c 5f 41 6c 6c 6f  ofile = Tcl_Allo
14fd0 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20  c( len + 1 );.  
14fe0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62        memcpy(pDb
14ff0 2d 3e 7a 50 72 6f 66 69 6c 65 2c 20 7a 50 72 6f  ->zProfile, zPro
15000 66 69 6c 65 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20  file, len+1);.  
15010 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15020 20 20 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65     pDb->zProfile
15030 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69   = 0;.      }.#i
15040 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
15050 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26  E_OMIT_TRACE) &&
15060 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
15070 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
15080 4f 49 4e 54 29 0a 20 20 20 20 20 20 69 66 28 20  OINT).      if( 
15090 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b  pDb->zProfile ){
150a0 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e  .        pDb->in
150b0 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20  terp = interp;. 
150c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70         sqlite3_p
150d0 72 6f 66 69 6c 65 28 70 44 62 2d 3e 64 62 2c 20  rofile(pDb->db, 
150e0 44 62 50 72 6f 66 69 6c 65 48 61 6e 64 6c 65 72  DbProfileHandler
150f0 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65  , pDb);.      }e
15100 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
15110 69 74 65 33 5f 70 72 6f 66 69 6c 65 28 70 44 62  ite3_profile(pDb
15120 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ->db, 0, 0);.   
15130 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
15140 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
15150 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20  ..  /*.  **     
15160 24 64 62 20 72 65 6b 65 79 20 4b 45 59 0a 20 20  $db rekey KEY.  
15170 2a 2a 0a 20 20 2a 2a 20 43 68 61 6e 67 65 20 74  **.  ** Change t
15180 68 65 20 65 6e 63 72 79 70 74 69 6f 6e 20 6b 65  he encryption ke
15190 79 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  y on the current
151a0 6c 79 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  ly open database
151b0 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
151c0 5f 52 45 4b 45 59 3a 20 7b 0a 23 69 66 20 64 65  _REKEY: {.#if de
151d0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 53  fined(SQLITE_HAS
151e0 5f 43 4f 44 45 43 29 20 26 26 20 21 64 65 66 69  _CODEC) && !defi
151f0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
15200 43 4f 44 45 43 5f 46 52 4f 4d 5f 54 43 4c 29 0a  CODEC_FROM_TCL).
15210 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20      int nKey;.  
15220 20 20 76 6f 69 64 20 2a 70 4b 65 79 3b 0a 23 65    void *pKey;.#e
15230 6e 64 69 66 0a 20 20 20 20 69 66 28 20 6f 62 6a  ndif.    if( obj
15240 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=3 ){.      Tc
15250 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
15260 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
15270 22 4b 45 59 22 29 3b 0a 20 20 20 20 20 20 72 65  "KEY");.      re
15280 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
15290 20 20 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65      }.#if define
152a0 64 28 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  d(SQLITE_HAS_COD
152b0 45 43 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  EC) && !defined(
152c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 44 45  SQLITE_OMIT_CODE
152d0 43 5f 46 52 4f 4d 5f 54 43 4c 29 0a 20 20 20 20  C_FROM_TCL).    
152e0 70 4b 65 79 20 3d 20 54 63 6c 5f 47 65 74 42 79  pKey = Tcl_GetBy
152f0 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f  teArrayFromObj(o
15300 62 6a 76 5b 32 5d 2c 20 26 6e 4b 65 79 29 3b 0a  bjv[2], &nKey);.
15310 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
15320 5f 72 65 6b 65 79 28 70 44 62 2d 3e 64 62 2c 20  _rekey(pDb->db, 
15330 70 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 20  pKey, nKey);.   
15340 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
15350 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
15360 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65  t(interp, sqlite
15370 33 5f 65 72 72 73 74 72 28 72 63 29 2c 20 28 63  3_errstr(rc), (c
15380 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72  har*)0);.      r
15390 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  c = TCL_ERROR;. 
153a0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
153b0 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
153c0 20 20 20 20 24 64 62 20 72 65 73 74 6f 72 65 20      $db restore 
153d0 3f 44 41 54 41 42 41 53 45 3f 20 46 49 4c 45 4e  ?DATABASE? FILEN
153e0 41 4d 45 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 70  AME.  **.  ** Op
153f0 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69  en a database fi
15400 6c 65 20 6e 61 6d 65 64 20 46 49 4c 45 4e 41 4d  le named FILENAM
15410 45 2e 20 20 54 72 61 6e 73 66 65 72 20 74 68 65  E.  Transfer the
15420 20 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20 6f 66   content.  ** of
15430 20 46 49 4c 45 4e 41 4d 45 20 69 6e 74 6f 20 74   FILENAME into t
15440 68 65 20 6c 6f 63 61 6c 20 64 61 74 61 62 61 73  he local databas
15450 65 20 44 41 54 41 42 41 53 45 20 28 64 65 66 61  e DATABASE (defa
15460 75 6c 74 3a 20 22 6d 61 69 6e 22 29 2e 0a 20 20  ult: "main")..  
15470 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 52 45 53  */.  case DB_RES
15480 54 4f 52 45 3a 20 7b 0a 20 20 20 20 63 6f 6e 73  TORE: {.    cons
15490 74 20 63 68 61 72 20 2a 7a 53 72 63 46 69 6c 65  t char *zSrcFile
154a0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
154b0 20 2a 7a 44 65 73 74 44 62 3b 0a 20 20 20 20 73   *zDestDb;.    s
154c0 71 6c 69 74 65 33 20 2a 70 53 72 63 3b 0a 20 20  qlite3 *pSrc;.  
154d0 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70    sqlite3_backup
154e0 20 2a 70 42 61 63 6b 75 70 3b 0a 20 20 20 20 69   *pBackup;.    i
154f0 6e 74 20 6e 54 69 6d 65 6f 75 74 20 3d 20 30 3b  nt nTimeout = 0;
15500 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d  ..    if( objc==
15510 33 20 29 7b 0a 20 20 20 20 20 20 7a 44 65 73 74  3 ){.      zDest
15520 44 62 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20  Db = "main";.   
15530 20 20 20 7a 53 72 63 46 69 6c 65 20 3d 20 54 63     zSrcFile = Tc
15540 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
15550 5b 32 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  [2]);.    }else 
15560 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20  if( objc==4 ){. 
15570 20 20 20 20 20 7a 44 65 73 74 44 62 20 3d 20 54       zDestDb = T
15580 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
15590 76 5b 32 5d 29 3b 0a 20 20 20 20 20 20 7a 53 72  v[2]);.      zSr
155a0 63 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53  cFile = Tcl_GetS
155b0 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a  tring(objv[3]);.
155c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
155d0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
155e0 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
155f0 76 2c 20 22 3f 44 41 54 41 42 41 53 45 3f 20 46  v, "?DATABASE? F
15600 49 4c 45 4e 41 4d 45 22 29 3b 0a 20 20 20 20 20  ILENAME");.     
15610 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
15620 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  R;.    }.    rc 
15630 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76  = sqlite3_open_v
15640 32 28 7a 53 72 63 46 69 6c 65 2c 20 26 70 53 72  2(zSrcFile, &pSr
15650 63 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  c,.             
15660 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
15670 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
15680 20 7c 20 70 44 62 2d 3e 6f 70 65 6e 46 6c 61 67   | pDb->openFlag
15690 73 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  s, 0);.    if( r
156a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
156b0 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
156c0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
156d0 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 73 6f 75 72  cannot open sour
156e0 63 65 20 64 61 74 61 62 61 73 65 3a 20 22 2c 0a  ce database: ",.
156f0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
15700 65 33 5f 65 72 72 6d 73 67 28 70 53 72 63 29 2c  e3_errmsg(pSrc),
15710 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
15720 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28    sqlite3_close(
15730 70 53 72 63 29 3b 0a 20 20 20 20 20 20 72 65 74  pSrc);.      ret
15740 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
15750 20 20 20 7d 0a 20 20 20 20 70 42 61 63 6b 75 70     }.    pBackup
15760 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75   = sqlite3_backu
15770 70 5f 69 6e 69 74 28 70 44 62 2d 3e 64 62 2c 20  p_init(pDb->db, 
15780 7a 44 65 73 74 44 62 2c 20 70 53 72 63 2c 20 22  zDestDb, pSrc, "
15790 6d 61 69 6e 22 29 3b 0a 20 20 20 20 69 66 28 20  main");.    if( 
157a0 70 42 61 63 6b 75 70 3d 3d 30 20 29 7b 0a 20 20  pBackup==0 ){.  
157b0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
157c0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 72 65  sult(interp, "re
157d0 73 74 6f 72 65 20 66 61 69 6c 65 64 3a 20 22 2c  store failed: ",
157e0 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  .           sqli
157f0 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e  te3_errmsg(pDb->
15800 64 62 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  db), (char*)0);.
15810 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c        sqlite3_cl
15820 6f 73 65 28 70 53 72 63 29 3b 0a 20 20 20 20 20  ose(pSrc);.     
15830 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
15840 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69  R;.    }.    whi
15850 6c 65 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65  le( (rc = sqlite
15860 33 5f 62 61 63 6b 75 70 5f 73 74 65 70 28 70 42  3_backup_step(pB
15870 61 63 6b 75 70 2c 31 30 30 29 29 3d 3d 53 51 4c  ackup,100))==SQL
15880 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20  ITE_OK.         
15890 20 20 20 20 20 7c 7c 20 72 63 3d 3d 53 51 4c 49       || rc==SQLI
158a0 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
158b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
158c0 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20  BUSY ){.        
158d0 69 66 28 20 6e 54 69 6d 65 6f 75 74 2b 2b 20 3e  if( nTimeout++ >
158e0 3d 20 33 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  = 3 ) break;.   
158f0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6c 65       sqlite3_sle
15900 65 70 28 31 30 30 29 3b 0a 20 20 20 20 20 20 7d  ep(100);.      }
15910 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
15920 65 33 5f 62 61 63 6b 75 70 5f 66 69 6e 69 73 68  e3_backup_finish
15930 28 70 42 61 63 6b 75 70 29 3b 0a 20 20 20 20 69  (pBackup);.    i
15940 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
15950 4e 45 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  NE ){.      rc =
15960 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c   TCL_OK;.    }el
15970 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  se if( rc==SQLIT
15980 45 5f 42 55 53 59 20 7c 7c 20 72 63 3d 3d 53 51  E_BUSY || rc==SQ
15990 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20  LITE_LOCKED ){. 
159a0 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
159b0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 72  esult(interp, "r
159c0 65 73 74 6f 72 65 20 66 61 69 6c 65 64 3a 20 73  estore failed: s
159d0 6f 75 72 63 65 20 64 61 74 61 62 61 73 65 20 62  ource database b
159e0 75 73 79 22 2c 0a 20 20 20 20 20 20 20 20 20 20  usy",.          
159f0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
15a00 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 63  ar*)0);.      rc
15a10 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20   = TCL_ERROR;.  
15a20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54    }else{.      T
15a30 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
15a40 69 6e 74 65 72 70 2c 20 22 72 65 73 74 6f 72 65  interp, "restore
15a50 20 66 61 69 6c 65 64 3a 20 22 2c 0a 20 20 20 20   failed: ",.    
15a60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65         sqlite3_e
15a70 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20  rrmsg(pDb->db), 
15a80 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
15a90 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b   rc = TCL_ERROR;
15aa0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
15ab0 65 33 5f 63 6c 6f 73 65 28 70 53 72 63 29 3b 0a  e3_close(pSrc);.
15ac0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
15ad0 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64    /*.  **     $d
15ae0 62 20 73 74 61 74 75 73 20 28 73 74 65 70 7c 73  b status (step|s
15af0 6f 72 74 7c 61 75 74 6f 69 6e 64 65 78 29 0a 20  ort|autoindex). 
15b00 20 2a 2a 0a 20 20 2a 2a 20 44 69 73 70 6c 61 79   **.  ** Display
15b10 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
15b20 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50  US_FULLSCAN_STEP
15b30 20 6f 72 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f   or.  ** SQLITE_
15b40 53 54 4d 54 53 54 41 54 55 53 5f 53 4f 52 54 20  STMTSTATUS_SORT 
15b50 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63  for the most rec
15b60 65 6e 74 20 65 76 61 6c 2e 0a 20 20 2a 2f 0a 20  ent eval..  */. 
15b70 20 63 61 73 65 20 44 42 5f 53 54 41 54 55 53 3a   case DB_STATUS:
15b80 20 7b 0a 20 20 20 20 69 6e 74 20 76 3b 0a 20 20   {.    int v;.  
15b90 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
15ba0 70 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  p;.    if( objc!
15bb0 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =3 ){.      Tcl_
15bc0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
15bd0 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 28  erp, 2, objv, "(
15be0 73 74 65 70 7c 73 6f 72 74 7c 61 75 74 6f 69 6e  step|sort|autoin
15bf0 64 65 78 29 22 29 3b 0a 20 20 20 20 20 20 72 65  dex)");.      re
15c00 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
15c10 20 20 20 20 7d 0a 20 20 20 20 7a 4f 70 20 3d 20      }.    zOp = 
15c20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
15c30 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20  jv[2]);.    if( 
15c40 73 74 72 63 6d 70 28 7a 4f 70 2c 20 22 73 74 65  strcmp(zOp, "ste
15c50 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  p")==0 ){.      
15c60 76 20 3d 20 70 44 62 2d 3e 6e 53 74 65 70 3b 0a  v = pDb->nStep;.
15c70 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
15c80 72 63 6d 70 28 7a 4f 70 2c 20 22 73 6f 72 74 22  rcmp(zOp, "sort"
15c90 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 76 20  )==0 ){.      v 
15ca0 3d 20 70 44 62 2d 3e 6e 53 6f 72 74 3b 0a 20 20  = pDb->nSort;.  
15cb0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
15cc0 6d 70 28 7a 4f 70 2c 20 22 61 75 74 6f 69 6e 64  mp(zOp, "autoind
15cd0 65 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ex")==0 ){.     
15ce0 20 76 20 3d 20 70 44 62 2d 3e 6e 49 6e 64 65 78   v = pDb->nIndex
15cf0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
15d00 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
15d10 75 6c 74 28 69 6e 74 65 72 70 2c 0a 20 20 20 20  ult(interp,.    
15d20 20 20 20 20 20 20 20 20 22 62 61 64 20 61 72 67          "bad arg
15d30 75 6d 65 6e 74 3a 20 73 68 6f 75 6c 64 20 62 65  ument: should be
15d40 20 61 75 74 6f 69 6e 64 65 78 2c 20 73 74 65 70   autoindex, step
15d50 2c 20 6f 72 20 73 6f 72 74 22 2c 0a 20 20 20 20  , or sort",.    
15d60 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 30          (char*)0
15d70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
15d80 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
15d90 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
15da0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
15db0 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 76 29 29 3b  l_NewIntObj(v));
15dc0 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
15dd0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24  .  /*.  **     $
15de0 64 62 20 74 69 6d 65 6f 75 74 20 4d 49 4c 4c 45  db timeout MILLE
15df0 53 45 43 4f 4e 44 53 0a 20 20 2a 2a 0a 20 20 2a  SECONDS.  **.  *
15e00 2a 20 44 65 6c 61 79 20 66 6f 72 20 74 68 65 20  * Delay for the 
15e10 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73  number of millis
15e20 65 63 6f 6e 64 73 20 73 70 65 63 69 66 69 65 64  econds specified
15e30 20 77 68 65 6e 20 61 20 66 69 6c 65 20 69 73 20   when a file is 
15e40 6c 6f 63 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 63  locked..  */.  c
15e50 61 73 65 20 44 42 5f 54 49 4d 45 4f 55 54 3a 20  ase DB_TIMEOUT: 
15e60 7b 0a 20 20 20 20 69 6e 74 20 6d 73 3b 0a 20 20  {.    int ms;.  
15e70 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
15e80 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
15e90 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
15ea0 32 2c 20 6f 62 6a 76 2c 20 22 4d 49 4c 4c 49 53  2, objv, "MILLIS
15eb0 45 43 4f 4e 44 53 22 29 3b 0a 20 20 20 20 20 20  ECONDS");.      
15ec0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
15ed0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
15ee0 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
15ef0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
15f00 5d 2c 20 26 6d 73 29 20 29 20 72 65 74 75 72 6e  ], &ms) ) return
15f10 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
15f20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d  sqlite3_busy_tim
15f30 65 6f 75 74 28 70 44 62 2d 3e 64 62 2c 20 6d 73  eout(pDb->db, ms
15f40 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
15f50 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
15f60 20 24 64 62 20 74 6f 74 61 6c 5f 63 68 61 6e 67   $db total_chang
15f70 65 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74  es.  **.  ** Ret
15f80 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
15f90 66 20 72 6f 77 73 20 74 68 61 74 20 77 65 72 65  f rows that were
15fa0 20 6d 6f 64 69 66 69 65 64 2c 20 69 6e 73 65 72   modified, inser
15fb0 74 65 64 2c 20 6f 72 20 64 65 6c 65 74 65 64 0a  ted, or deleted.
15fc0 20 20 2a 2a 20 73 69 6e 63 65 20 74 68 65 20 64    ** since the d
15fd0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 77  atabase handle w
15fe0 61 73 20 63 72 65 61 74 65 64 2e 0a 20 20 2a 2f  as created..  */
15ff0 0a 20 20 63 61 73 65 20 44 42 5f 54 4f 54 41 4c  .  case DB_TOTAL
16000 5f 43 48 41 4e 47 45 53 3a 20 7b 0a 20 20 20 20  _CHANGES: {.    
16010 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74  Tcl_Obj *pResult
16020 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ;.    if( objc!=
16030 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  2 ){.      Tcl_W
16040 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
16050 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 22 29  rp, 2, objv, "")
16060 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
16070 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
16080 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63      pResult = Tc
16090 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_GetObjResult(i
160a0 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f  nterp);.    Tcl_
160b0 53 65 74 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c  SetIntObj(pResul
160c0 74 2c 20 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c  t, sqlite3_total
160d0 5f 63 68 61 6e 67 65 73 28 70 44 62 2d 3e 64 62  _changes(pDb->db
160e0 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  ));.    break;. 
160f0 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20   }..  /*    $db 
16100 74 72 61 63 65 20 3f 43 41 4c 4c 42 41 43 4b 3f  trace ?CALLBACK?
16110 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20  .  **.  ** Make 
16120 61 72 72 61 6e 67 65 6d 65 6e 74 73 20 74 6f 20  arrangements to 
16130 69 6e 76 6f 6b 65 20 74 68 65 20 43 41 4c 4c 42  invoke the CALLB
16140 41 43 4b 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  ACK routine for 
16150 65 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d 65  each SQL stateme
16160 6e 74 0a 20 20 2a 2a 20 74 68 61 74 20 69 73 20  nt.  ** that is 
16170 65 78 65 63 75 74 65 64 2e 20 20 54 68 65 20 74  executed.  The t
16180 65 78 74 20 6f 66 20 74 68 65 20 53 51 4c 20 69  ext of the SQL i
16190 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 43 41  s appended to CA
161a0 4c 4c 42 41 43 4b 20 62 65 66 6f 72 65 0a 20 20  LLBACK before.  
161b0 2a 2a 20 69 74 20 69 73 20 65 78 65 63 75 74 65  ** it is execute
161c0 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  d..  */.  case D
161d0 42 5f 54 52 41 43 45 3a 20 7b 0a 20 20 20 20 69  B_TRACE: {.    i
161e0 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20  f( objc>3 ){.   
161f0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
16200 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
16210 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f  bjv, "?CALLBACK?
16220 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
16230 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
16240 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d  }else if( objc==
16250 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  2 ){.      if( p
16260 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20  Db->zTrace ){.  
16270 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
16280 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
16290 44 62 2d 3e 7a 54 72 61 63 65 2c 20 28 63 68 61  Db->zTrace, (cha
162a0 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  r*)0);.      }. 
162b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
162c0 63 68 61 72 20 2a 7a 54 72 61 63 65 3b 0a 20 20  char *zTrace;.  
162d0 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
162e0 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61     if( pDb->zTra
162f0 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  ce ){.        Tc
16300 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 54 72 61  l_Free(pDb->zTra
16310 63 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ce);.      }.   
16320 20 20 20 7a 54 72 61 63 65 20 3d 20 54 63 6c 5f     zTrace = Tcl_
16330 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
16340 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b  (objv[2], &len);
16350 0a 20 20 20 20 20 20 69 66 28 20 7a 54 72 61 63  .      if( zTrac
16360 65 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20  e && len>0 ){.  
16370 20 20 20 20 20 20 70 44 62 2d 3e 7a 54 72 61 63        pDb->zTrac
16380 65 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c  e = Tcl_Alloc( l
16390 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20  en + 1 );.      
163a0 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 54    memcpy(pDb->zT
163b0 72 61 63 65 2c 20 7a 54 72 61 63 65 2c 20 6c 65  race, zTrace, le
163c0 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  n+1);.      }els
163d0 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  e{.        pDb->
163e0 7a 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 20 20  zTrace = 0;.    
163f0 20 20 7d 0a 23 69 66 20 21 64 65 66 69 6e 65 64    }.#if !defined
16400 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41  (SQLITE_OMIT_TRA
16410 43 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  CE) && !defined(
16420 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
16430 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20  TING_POINT).    
16440 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63    if( pDb->zTrac
16450 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  e ){.        pDb
16460 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72  ->interp = inter
16470 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  p;.        sqlit
16480 65 33 5f 74 72 61 63 65 28 70 44 62 2d 3e 64 62  e3_trace(pDb->db
16490 2c 20 44 62 54 72 61 63 65 48 61 6e 64 6c 65 72  , DbTraceHandler
164a0 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65  , pDb);.      }e
164b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
164c0 69 74 65 33 5f 74 72 61 63 65 28 70 44 62 2d 3e  ite3_trace(pDb->
164d0 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  db, 0, 0);.     
164e0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
164f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
16500 20 20 2f 2a 20 20 20 20 24 64 62 20 74 72 61 63    /*    $db trac
16510 65 5f 76 32 20 3f 43 41 4c 4c 42 41 43 4b 3f 20  e_v2 ?CALLBACK? 
16520 3f 4d 41 53 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a  ?MASK?.  **.  **
16530 20 4d 61 6b 65 20 61 72 72 61 6e 67 65 6d 65 6e   Make arrangemen
16540 74 73 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65  ts to invoke the
16550 20 43 41 4c 4c 42 41 43 4b 20 72 6f 75 74 69 6e   CALLBACK routin
16560 65 20 66 6f 72 20 65 61 63 68 20 74 72 61 63 65  e for each trace
16570 20 65 76 65 6e 74 0a 20 20 2a 2a 20 6d 61 74 63   event.  ** matc
16580 68 69 6e 67 20 74 68 65 20 6d 61 73 6b 20 74 68  hing the mask th
16590 61 74 20 69 73 20 67 65 6e 65 72 61 74 65 64 2e  at is generated.
165a0 20 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 73    The parameters
165b0 20 61 72 65 20 61 70 70 65 6e 64 65 64 20 74 6f   are appended to
165c0 0a 20 20 2a 2a 20 43 41 4c 4c 42 41 43 4b 20 62  .  ** CALLBACK b
165d0 65 66 6f 72 65 20 69 74 20 69 73 20 65 78 65 63  efore it is exec
165e0 75 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  uted..  */.  cas
165f0 65 20 44 42 5f 54 52 41 43 45 5f 56 32 3a 20 7b  e DB_TRACE_V2: {
16600 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 34 20  .    if( objc>4 
16610 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
16620 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
16630 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c  , 2, objv, "?CAL
16640 4c 42 41 43 4b 3f 20 3f 4d 41 53 4b 3f 22 29 3b  LBACK? ?MASK?");
16650 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
16660 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c  L_ERROR;.    }el
16670 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29  se if( objc==2 )
16680 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  {.      if( pDb-
16690 3e 7a 54 72 61 63 65 56 32 20 29 7b 0a 20 20 20  >zTraceV2 ){.   
166a0 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
166b0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44  esult(interp, pD
166c0 62 2d 3e 7a 54 72 61 63 65 56 32 2c 20 28 63 68  b->zTraceV2, (ch
166d0 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ar*)0);.      }.
166e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
166f0 20 63 68 61 72 20 2a 7a 54 72 61 63 65 56 32 3b   char *zTraceV2;
16700 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a  .      int len;.
16710 20 20 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e        Tcl_WideIn
16720 74 20 77 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20  t wMask = 0;.   
16730 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29     if( objc==4 )
16740 7b 0a 20 20 20 20 20 20 20 20 73 74 61 74 69 63  {.        static
16750 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 54 54 59   const char *TTY
16760 50 45 5f 73 74 72 73 5b 5d 20 3d 20 7b 0a 20 20  PE_strs[] = {.  
16770 20 20 20 20 20 20 20 20 22 73 74 61 74 65 6d 65          "stateme
16780 6e 74 22 2c 20 22 70 72 6f 66 69 6c 65 22 2c 20  nt", "profile", 
16790 22 72 6f 77 22 2c 20 22 63 6c 6f 73 65 22 2c 20  "row", "close", 
167a0 30 0a 20 20 20 20 20 20 20 20 7d 3b 0a 20 20 20  0.        };.   
167b0 20 20 20 20 20 65 6e 75 6d 20 54 54 59 50 45 5f       enum TTYPE_
167c0 65 6e 75 6d 20 7b 0a 20 20 20 20 20 20 20 20 20  enum {.         
167d0 20 54 54 59 50 45 5f 53 54 4d 54 2c 20 54 54 59   TTYPE_STMT, TTY
167e0 50 45 5f 50 52 4f 46 49 4c 45 2c 20 54 54 59 50  PE_PROFILE, TTYP
167f0 45 5f 52 4f 57 2c 20 54 54 59 50 45 5f 43 4c 4f  E_ROW, TTYPE_CLO
16800 53 45 0a 20 20 20 20 20 20 20 20 7d 3b 0a 20 20  SE.        };.  
16810 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
16820 20 20 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21       if( TCL_OK!
16830 3d 54 63 6c 5f 4c 69 73 74 4f 62 6a 4c 65 6e 67  =Tcl_ListObjLeng
16840 74 68 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  th(interp, objv[
16850 33 5d 2c 20 26 6c 65 6e 29 20 29 7b 0a 20 20 20  3], &len) ){.   
16860 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
16870 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  L_ERROR;.       
16880 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69   }.        for(i
16890 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b  =0; i<len; i++){
168a0 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4f  .          Tcl_O
168b0 62 6a 20 2a 70 4f 62 6a 3b 0a 20 20 20 20 20 20  bj *pObj;.      
168c0 20 20 20 20 69 6e 74 20 74 74 79 70 65 3b 0a 20      int ttype;. 
168d0 20 20 20 20 20 20 20 20 20 69 66 28 20 54 43 4c           if( TCL
168e0 5f 4f 4b 21 3d 54 63 6c 5f 4c 69 73 74 4f 62 6a  _OK!=Tcl_ListObj
168f0 49 6e 64 65 78 28 69 6e 74 65 72 70 2c 20 6f 62  Index(interp, ob
16900 6a 76 5b 33 5d 2c 20 69 2c 20 26 70 4f 62 6a 29  jv[3], i, &pObj)
16910 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
16920 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
16930 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
16940 20 20 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f          if( Tcl_
16950 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28  GetIndexFromObj(
16960 69 6e 74 65 72 70 2c 20 70 4f 62 6a 2c 20 54 54  interp, pObj, TT
16970 59 50 45 5f 73 74 72 73 2c 20 22 74 72 61 63 65  YPE_strs, "trace
16980 20 74 79 70 65 22 2c 0a 20 20 20 20 20 20 20 20   type",.        
16990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
169a0 20 20 20 20 20 20 20 20 20 20 30 2c 20 26 74 74            0, &tt
169b0 79 70 65 29 21 3d 54 43 4c 5f 4f 4b 20 29 7b 0a  ype)!=TCL_OK ){.
169c0 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
169d0 57 69 64 65 49 6e 74 20 77 54 79 70 65 3b 0a 20  WideInt wType;. 
169e0 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4f             Tcl_O
169f0 62 6a 20 2a 70 45 72 72 6f 72 20 3d 20 54 63 6c  bj *pError = Tcl
16a00 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 54 63  _DuplicateObj(Tc
16a10 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_GetObjResult(i
16a20 6e 74 65 72 70 29 29 3b 0a 20 20 20 20 20 20 20  nterp));.       
16a30 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66       Tcl_IncrRef
16a40 43 6f 75 6e 74 28 70 45 72 72 6f 72 29 3b 0a 20  Count(pError);. 
16a50 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 54             if( T
16a60 43 4c 5f 4f 4b 3d 3d 54 63 6c 5f 47 65 74 57 69  CL_OK==Tcl_GetWi
16a70 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  deIntFromObj(int
16a80 65 72 70 2c 20 70 4f 62 6a 2c 20 26 77 54 79 70  erp, pObj, &wTyp
16a90 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  e) ){.          
16aa0 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
16ab0 6f 75 6e 74 28 70 45 72 72 6f 72 29 3b 0a 20 20  ount(pError);.  
16ac0 20 20 20 20 20 20 20 20 20 20 20 20 77 4d 61 73              wMas
16ad0 6b 20 7c 3d 20 77 54 79 70 65 3b 0a 20 20 20 20  k |= wType;.    
16ae0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
16af0 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c               Tcl
16b00 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
16b10 74 65 72 70 2c 20 70 45 72 72 6f 72 29 3b 0a 20  terp, pError);. 
16b20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c               Tcl
16b30 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 45  _DecrRefCount(pE
16b40 72 72 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 20  rror);.         
16b50 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
16b60 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20  ERROR;.         
16b70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
16b80 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
16b90 20 20 73 77 69 74 63 68 28 20 28 65 6e 75 6d 20    switch( (enum 
16ba0 54 54 59 50 45 5f 65 6e 75 6d 29 74 74 79 70 65  TTYPE_enum)ttype
16bb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
16bc0 20 20 63 61 73 65 20 54 54 59 50 45 5f 53 54 4d    case TTYPE_STM
16bd0 54 3a 20 20 20 20 77 4d 61 73 6b 20 7c 3d 20 53  T:    wMask |= S
16be0 51 4c 49 54 45 5f 54 52 41 43 45 5f 53 54 4d 54  QLITE_TRACE_STMT
16bf0 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
16c00 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54            case T
16c10 54 59 50 45 5f 50 52 4f 46 49 4c 45 3a 20 77 4d  TYPE_PROFILE: wM
16c20 61 73 6b 20 7c 3d 20 53 51 4c 49 54 45 5f 54 52  ask |= SQLITE_TR
16c30 41 43 45 5f 50 52 4f 46 49 4c 45 3b 20 62 72 65  ACE_PROFILE; bre
16c40 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
16c50 20 20 63 61 73 65 20 54 54 59 50 45 5f 52 4f 57    case TTYPE_ROW
16c60 3a 20 20 20 20 20 77 4d 61 73 6b 20 7c 3d 20 53  :     wMask |= S
16c70 51 4c 49 54 45 5f 54 52 41 43 45 5f 52 4f 57 3b  QLITE_TRACE_ROW;
16c80 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
16c90 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54            case T
16ca0 54 59 50 45 5f 43 4c 4f 53 45 3a 20 20 20 77 4d  TYPE_CLOSE:   wM
16cb0 61 73 6b 20 7c 3d 20 53 51 4c 49 54 45 5f 54 52  ask |= SQLITE_TR
16cc0 41 43 45 5f 43 4c 4f 53 45 3b 20 20 20 62 72 65  ACE_CLOSE;   bre
16cd0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
16ce0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
16cf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
16d00 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 77 4d 61  lse{.        wMa
16d10 73 6b 20 3d 20 53 51 4c 49 54 45 5f 54 52 41 43  sk = SQLITE_TRAC
16d20 45 5f 53 54 4d 54 3b 20 2f 2a 20 75 73 65 20 74  E_STMT; /* use t
16d30 68 65 20 22 6c 65 67 61 63 79 22 20 64 65 66 61  he "legacy" defa
16d40 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  ult */.      }. 
16d50 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 54       if( pDb->zT
16d60 72 61 63 65 56 32 20 29 7b 0a 20 20 20 20 20 20  raceV2 ){.      
16d70 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e    Tcl_Free(pDb->
16d80 7a 54 72 61 63 65 56 32 29 3b 0a 20 20 20 20 20  zTraceV2);.     
16d90 20 7d 0a 20 20 20 20 20 20 7a 54 72 61 63 65 56   }.      zTraceV
16da0 32 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  2 = Tcl_GetStrin
16db0 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
16dc0 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69  , &len);.      i
16dd0 66 28 20 7a 54 72 61 63 65 56 32 20 26 26 20 6c  f( zTraceV2 && l
16de0 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  en>0 ){.        
16df0 70 44 62 2d 3e 7a 54 72 61 63 65 56 32 20 3d 20  pDb->zTraceV2 = 
16e00 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b  Tcl_Alloc( len +
16e10 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65   1 );.        me
16e20 6d 63 70 79 28 70 44 62 2d 3e 7a 54 72 61 63 65  mcpy(pDb->zTrace
16e30 56 32 2c 20 7a 54 72 61 63 65 56 32 2c 20 6c 65  V2, zTraceV2, le
16e40 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  n+1);.      }els
16e50 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  e{.        pDb->
16e60 7a 54 72 61 63 65 56 32 20 3d 20 30 3b 0a 20 20  zTraceV2 = 0;.  
16e70 20 20 20 20 7d 0a 23 69 66 20 21 64 65 66 69 6e      }.#if !defin
16e80 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ed(SQLITE_OMIT_T
16e90 52 41 43 45 29 20 26 26 20 21 64 65 66 69 6e 65  RACE) && !define
16ea0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  d(SQLITE_OMIT_FL
16eb0 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20  OATING_POINT).  
16ec0 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72      if( pDb->zTr
16ed0 61 63 65 56 32 20 29 7b 0a 20 20 20 20 20 20 20  aceV2 ){.       
16ee0 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69   pDb->interp = i
16ef0 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73  nterp;.        s
16f00 71 6c 69 74 65 33 5f 74 72 61 63 65 5f 76 32 28  qlite3_trace_v2(
16f10 70 44 62 2d 3e 64 62 2c 20 28 75 6e 73 69 67 6e  pDb->db, (unsign
16f20 65 64 29 77 4d 61 73 6b 2c 20 44 62 54 72 61 63  ed)wMask, DbTrac
16f30 65 56 32 48 61 6e 64 6c 65 72 2c 20 70 44 62 29  eV2Handler, pDb)
16f40 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
16f50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74         sqlite3_t
16f60 72 61 63 65 5f 76 32 28 70 44 62 2d 3e 64 62 2c  race_v2(pDb->db,
16f70 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
16f80 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
16f90 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
16fa0 20 20 2f 2a 20 20 20 20 24 64 62 20 74 72 61 6e    /*    $db tran
16fb0 73 61 63 74 69 6f 6e 20 5b 2d 64 65 66 65 72 72  saction [-deferr
16fc0 65 64 7c 2d 69 6d 6d 65 64 69 61 74 65 7c 2d 65  ed|-immediate|-e
16fd0 78 63 6c 75 73 69 76 65 5d 20 53 43 52 49 50 54  xclusive] SCRIPT
16fe0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 74 61 72 74  .  **.  ** Start
16ff0 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
17000 6f 6e 20 28 69 66 20 77 65 20 61 72 65 20 6e 6f  on (if we are no
17010 74 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  t already in the
17020 20 6d 69 64 73 74 20 6f 66 20 61 0a 20 20 2a 2a   midst of a.  **
17030 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 20 61 6e   transaction) an
17040 64 20 65 78 65 63 75 74 65 20 74 68 65 20 54 43  d execute the TC
17050 4c 20 73 63 72 69 70 74 20 53 43 52 49 50 54 2e  L script SCRIPT.
17060 20 20 41 66 74 65 72 20 53 43 52 49 50 54 0a 20    After SCRIPT. 
17070 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 73 2c 20 65   ** completes, e
17080 69 74 68 65 72 20 63 6f 6d 6d 69 74 20 74 68 65  ither commit the
17090 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20   transaction or 
170a0 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 69 66 20  roll it back if 
170b0 53 43 52 49 50 54 0a 20 20 2a 2a 20 74 68 72 6f  SCRIPT.  ** thro
170c0 77 73 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 2e  ws an exception.
170d0 20 20 4f 72 20 69 66 20 6e 6f 20 6e 65 77 20 74    Or if no new t
170e0 72 61 6e 73 61 74 69 6f 6e 20 77 61 73 20 73 74  ransation was st
170f0 61 72 74 65 64 2c 20 64 6f 20 6e 6f 74 68 69 6e  arted, do nothin
17100 67 2e 0a 20 20 2a 2a 20 70 61 73 73 20 74 68 65  g..  ** pass the
17110 20 65 78 63 65 70 74 69 6f 6e 20 6f 6e 20 75 70   exception on up
17120 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 2a 2a   the stack..  **
17130 0a 20 20 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61  .  ** This comma
17140 6e 64 20 77 61 73 20 69 6e 73 70 69 72 65 64 20  nd was inspired 
17150 62 79 20 44 61 76 65 20 54 68 6f 6d 61 73 27 73  by Dave Thomas's
17160 20 74 61 6c 6b 20 6f 6e 20 52 75 62 79 20 61 74   talk on Ruby at
17170 20 74 68 65 0a 20 20 2a 2a 20 32 30 30 35 20 4f   the.  ** 2005 O
17180 27 52 65 69 6c 6c 79 20 4f 70 65 6e 20 53 6f 75  'Reilly Open Sou
17190 72 63 65 20 43 6f 6e 76 65 6e 74 69 6f 6e 20 28  rce Convention (
171a0 4f 53 43 4f 4e 29 2e 0a 20 20 2a 2f 0a 20 20 63  OSCON)..  */.  c
171b0 61 73 65 20 44 42 5f 54 52 41 4e 53 41 43 54 49  ase DB_TRANSACTI
171c0 4f 4e 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62  ON: {.    Tcl_Ob
171d0 6a 20 2a 70 53 63 72 69 70 74 3b 0a 20 20 20 20  j *pScript;.    
171e0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 65 67  const char *zBeg
171f0 69 6e 20 3d 20 22 53 41 56 45 50 4f 49 4e 54 20  in = "SAVEPOINT 
17200 5f 74 63 6c 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _tcl_transaction
17210 22 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  ";.    if( objc!
17220 3d 33 20 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b  =3 && objc!=4 ){
17230 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
17240 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
17250 32 2c 20 6f 62 6a 76 2c 20 22 5b 54 59 50 45 5d  2, objv, "[TYPE]
17260 20 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20   SCRIPT");.     
17270 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
17280 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  R;.    }..    if
17290 28 20 70 44 62 2d 3e 6e 54 72 61 6e 73 61 63 74  ( pDb->nTransact
172a0 69 6f 6e 3d 3d 30 20 26 26 20 6f 62 6a 63 3d 3d  ion==0 && objc==
172b0 34 20 29 7b 0a 20 20 20 20 20 20 73 74 61 74 69  4 ){.      stati
172c0 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 54 54  c const char *TT
172d0 59 50 45 5f 73 74 72 73 5b 5d 20 3d 20 7b 0a 20  YPE_strs[] = {. 
172e0 20 20 20 20 20 20 20 22 64 65 66 65 72 72 65 64         "deferred
172f0 22 2c 20 20 20 22 65 78 63 6c 75 73 69 76 65 22  ",   "exclusive"
17300 2c 20 20 22 69 6d 6d 65 64 69 61 74 65 22 2c 20  ,  "immediate", 
17310 30 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20  0.      };.     
17320 20 65 6e 75 6d 20 54 54 59 50 45 5f 65 6e 75 6d   enum TTYPE_enum
17330 20 7b 0a 20 20 20 20 20 20 20 20 54 54 59 50 45   {.        TTYPE
17340 5f 44 45 46 45 52 52 45 44 2c 20 54 54 59 50 45  _DEFERRED, TTYPE
17350 5f 45 58 43 4c 55 53 49 56 45 2c 20 54 54 59 50  _EXCLUSIVE, TTYP
17360 45 5f 49 4d 4d 45 44 49 41 54 45 0a 20 20 20 20  E_IMMEDIATE.    
17370 20 20 7d 3b 0a 20 20 20 20 20 20 69 6e 74 20 74    };.      int t
17380 74 79 70 65 3b 0a 20 20 20 20 20 20 69 66 28 20  type;.      if( 
17390 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d  Tcl_GetIndexFrom
173a0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
173b0 5b 32 5d 2c 20 54 54 59 50 45 5f 73 74 72 73 2c  [2], TTYPE_strs,
173c0 20 22 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 79   "transaction ty
173d0 70 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  pe",.           
173e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173f0 20 20 20 30 2c 20 26 74 74 79 70 65 29 20 29 7b     0, &ttype) ){
17400 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
17410 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
17420 20 7d 0a 20 20 20 20 20 20 73 77 69 74 63 68 28   }.      switch(
17430 20 28 65 6e 75 6d 20 54 54 59 50 45 5f 65 6e 75   (enum TTYPE_enu
17440 6d 29 74 74 79 70 65 20 29 7b 0a 20 20 20 20 20  m)ttype ){.     
17450 20 20 20 63 61 73 65 20 54 54 59 50 45 5f 44 45     case TTYPE_DE
17460 46 45 52 52 45 44 3a 20 20 20 20 2f 2a 20 6e 6f  FERRED:    /* no
17470 2d 6f 70 20 2a 2f 3b 20 20 20 20 20 20 20 20 20  -op */;         
17480 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
17490 20 20 20 20 20 20 20 63 61 73 65 20 54 54 59 50         case TTYP
174a0 45 5f 45 58 43 4c 55 53 49 56 45 3a 20 20 20 7a  E_EXCLUSIVE:   z
174b0 42 65 67 69 6e 20 3d 20 22 42 45 47 49 4e 20 45  Begin = "BEGIN E
174c0 58 43 4c 55 53 49 56 45 22 3b 20 20 62 72 65 61  XCLUSIVE";  brea
174d0 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
174e0 54 54 59 50 45 5f 49 4d 4d 45 44 49 41 54 45 3a  TTYPE_IMMEDIATE:
174f0 20 20 20 7a 42 65 67 69 6e 20 3d 20 22 42 45 47     zBegin = "BEG
17500 49 4e 20 49 4d 4d 45 44 49 41 54 45 22 3b 20 20  IN IMMEDIATE";  
17510 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
17520 20 20 20 7d 0a 20 20 20 20 70 53 63 72 69 70 74     }.    pScript
17530 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 3b   = objv[objc-1];
17540 0a 0a 20 20 20 20 2f 2a 20 52 75 6e 20 74 68 65  ..    /* Run the
17550 20 53 51 4c 69 74 65 20 42 45 47 49 4e 20 63 6f   SQLite BEGIN co
17560 6d 6d 61 6e 64 20 74 6f 20 6f 70 65 6e 20 61 20  mmand to open a 
17570 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 73  transaction or s
17580 61 76 65 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20 20  avepoint. */.   
17590 20 70 44 62 2d 3e 64 69 73 61 62 6c 65 41 75 74   pDb->disableAut
175a0 68 2b 2b 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  h++;.    rc = sq
175b0 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e  lite3_exec(pDb->
175c0 64 62 2c 20 7a 42 65 67 69 6e 2c 20 30 2c 20 30  db, zBegin, 0, 0
175d0 2c 20 30 29 3b 0a 20 20 20 20 70 44 62 2d 3e 64  , 0);.    pDb->d
175e0 69 73 61 62 6c 65 41 75 74 68 2d 2d 3b 0a 20 20  isableAuth--;.  
175f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
17600 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  _OK ){.      Tcl
17610 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
17620 74 65 72 70 2c 20 73 71 6c 69 74 65 33 5f 65 72  terp, sqlite3_er
17630 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 28  rmsg(pDb->db), (
17640 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
17650 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
17660 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 62 2d  ;.    }.    pDb-
17670 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b  >nTransaction++;
17680 0a 0a 20 20 20 20 2f 2a 20 49 66 20 75 73 69 6e  ..    /* If usin
17690 67 20 4e 52 45 2c 20 73 63 68 65 64 75 6c 65 20  g NRE, schedule 
176a0 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 69 6e  a callback to in
176b0 76 6f 6b 65 20 74 68 65 20 73 63 72 69 70 74 20  voke the script 
176c0 70 53 63 72 69 70 74 2c 20 74 68 65 6e 0a 20 20  pScript, then.  
176d0 20 20 2a 2a 20 61 20 73 65 63 6f 6e 64 20 63 61    ** a second ca
176e0 6c 6c 62 61 63 6b 20 74 6f 20 63 6f 6d 6d 69 74  llback to commit
176f0 20 28 6f 72 20 72 6f 6c 6c 62 61 63 6b 29 20 74   (or rollback) t
17700 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  he transaction o
17710 72 20 73 61 76 65 70 6f 69 6e 74 0a 20 20 20 20  r savepoint.    
17720 2a 2a 20 6f 70 65 6e 65 64 20 61 62 6f 76 65 2e  ** opened above.
17730 20 49 66 20 6e 6f 74 20 75 73 69 6e 67 20 4e 52   If not using NR
17740 45 2c 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  E, evaluate the 
17750 73 63 72 69 70 74 20 64 69 72 65 63 74 6c 79 2c  script directly,
17760 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 63 61 6c   then.    ** cal
17770 6c 20 66 75 6e 63 74 69 6f 6e 20 44 62 54 72 61  l function DbTra
17780 6e 73 50 6f 73 74 43 6d 64 28 29 20 74 6f 20 63  nsPostCmd() to c
17790 6f 6d 6d 69 74 20 28 6f 72 20 72 6f 6c 6c 62 61  ommit (or rollba
177a0 63 6b 29 20 74 68 65 20 74 72 61 6e 73 61 63 74  ck) the transact
177b0 69 6f 6e 0a 20 20 20 20 2a 2a 20 6f 72 20 73 61  ion.    ** or sa
177c0 76 65 70 6f 69 6e 74 2e 20 20 2a 2f 0a 20 20 20  vepoint.  */.   
177d0 20 69 66 28 20 44 62 55 73 65 4e 72 65 28 29 20   if( DbUseNre() 
177e0 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 4e 52 41  ){.      Tcl_NRA
177f0 64 64 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72  ddCallback(inter
17800 70 2c 20 44 62 54 72 61 6e 73 50 6f 73 74 43 6d  p, DbTransPostCm
17810 64 2c 20 63 64 2c 20 30 2c 20 30 2c 20 30 29 3b  d, cd, 0, 0, 0);
17820 0a 20 20 20 20 20 20 28 76 6f 69 64 29 54 63 6c  .      (void)Tcl
17830 5f 4e 52 45 76 61 6c 4f 62 6a 28 69 6e 74 65 72  _NREvalObj(inter
17840 70 2c 20 70 53 63 72 69 70 74 2c 20 30 29 3b 0a  p, pScript, 0);.
17850 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17860 20 72 63 20 3d 20 44 62 54 72 61 6e 73 50 6f 73   rc = DbTransPos
17870 74 43 6d 64 28 26 63 64 2c 20 69 6e 74 65 72 70  tCmd(&cd, interp
17880 2c 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28  , Tcl_EvalObjEx(
17890 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c  interp, pScript,
178a0 20 30 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20   0));.    }.    
178b0 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
178c0 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 75 6e 6c  .  **    $db unl
178d0 6f 63 6b 5f 6e 6f 74 69 66 79 20 3f 73 63 72 69  ock_notify ?scri
178e0 70 74 3f 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  pt?.  */.  case 
178f0 44 42 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59  DB_UNLOCK_NOTIFY
17900 3a 20 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  : {.#ifndef SQLI
17910 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b  TE_ENABLE_UNLOCK
17920 5f 4e 4f 54 49 46 59 0a 20 20 20 20 54 63 6c 5f  _NOTIFY.    Tcl_
17930 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
17940 65 72 70 2c 20 22 75 6e 6c 6f 63 6b 5f 6e 6f 74  erp, "unlock_not
17950 69 66 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  ify not availabl
17960 65 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64 22  e in this build"
17970 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
17980 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 30 29         (char*)0)
17990 3b 0a 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45  ;.    rc = TCL_E
179a0 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 20 20  RROR;.#else.    
179b0 69 66 28 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f  if( objc!=2 && o
179c0 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc!=3 ){.      
179d0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
179e0 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
179f0 2c 20 22 3f 53 43 52 49 50 54 3f 22 29 3b 0a 20  , "?SCRIPT?");. 
17a00 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52       rc = TCL_ER
17a10 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ROR;.    }else{.
17a20 20 20 20 20 20 20 76 6f 69 64 20 28 2a 78 4e 6f        void (*xNo
17a30 74 69 66 79 29 28 76 6f 69 64 20 2a 2a 2c 20 69  tify)(void **, i
17a40 6e 74 29 20 3d 20 30 3b 0a 20 20 20 20 20 20 76  nt) = 0;.      v
17a50 6f 69 64 20 2a 70 4e 6f 74 69 66 79 41 72 67 20  oid *pNotifyArg 
17a60 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  = 0;..      if( 
17a70 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69  pDb->pUnlockNoti
17a80 66 79 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  fy ){.        Tc
17a90 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
17aa0 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66  Db->pUnlockNotif
17ab0 79 29 3b 0a 20 20 20 20 20 20 20 20 70 44 62 2d  y);.        pDb-
17ac0 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 20 3d  >pUnlockNotify =
17ad0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   0;.      }..   
17ae0 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29     if( objc==3 )
17af0 7b 0a 20 20 20 20 20 20 20 20 78 4e 6f 74 69 66  {.        xNotif
17b00 79 20 3d 20 44 62 55 6e 6c 6f 63 6b 4e 6f 74 69  y = DbUnlockNoti
17b10 66 79 3b 0a 20 20 20 20 20 20 20 20 70 4e 6f 74  fy;.        pNot
17b20 69 66 79 41 72 67 20 3d 20 28 76 6f 69 64 20 2a  ifyArg = (void *
17b30 29 70 44 62 3b 0a 20 20 20 20 20 20 20 20 70 44  )pDb;.        pD
17b40 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79  b->pUnlockNotify
17b50 20 3d 20 6f 62 6a 76 5b 32 5d 3b 0a 20 20 20 20   = objv[2];.    
17b60 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
17b70 6f 75 6e 74 28 70 44 62 2d 3e 70 55 6e 6c 6f 63  ount(pDb->pUnloc
17b80 6b 4e 6f 74 69 66 79 29 3b 0a 20 20 20 20 20 20  kNotify);.      
17b90 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  }..      if( sql
17ba0 69 74 65 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69  ite3_unlock_noti
17bb0 66 79 28 70 44 62 2d 3e 64 62 2c 20 78 4e 6f 74  fy(pDb->db, xNot
17bc0 69 66 79 2c 20 70 4e 6f 74 69 66 79 41 72 67 29  ify, pNotifyArg)
17bd0 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
17be0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
17bf0 65 72 70 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  erp, sqlite3_err
17c00 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 28 63  msg(pDb->db), (c
17c10 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 20  har*)0);.       
17c20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b   rc = TCL_ERROR;
17c30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
17c40 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b  endif.    break;
17c50 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
17c60 20 20 20 24 64 62 20 70 72 65 75 70 64 61 74 65     $db preupdate
17c70 5f 68 6f 6f 6b 20 63 6f 75 6e 74 0a 20 20 2a 2a  _hook count.  **
17c80 20 20 20 20 24 64 62 20 70 72 65 75 70 64 61 74      $db preupdat
17c90 65 5f 68 6f 6f 6b 20 68 6f 6f 6b 20 3f 53 43 52  e_hook hook ?SCR
17ca0 49 50 54 3f 0a 20 20 2a 2a 20 20 20 20 24 64 62  IPT?.  **    $db
17cb0 20 70 72 65 75 70 64 61 74 65 5f 68 6f 6f 6b 20   preupdate_hook 
17cc0 6e 65 77 20 49 4e 44 45 58 0a 20 20 2a 2a 20 20  new INDEX.  **  
17cd0 20 20 24 64 62 20 70 72 65 75 70 64 61 74 65 5f    $db preupdate_
17ce0 68 6f 6f 6b 20 6f 6c 64 20 49 4e 44 45 58 0a 20  hook old INDEX. 
17cf0 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 50 52   */.  case DB_PR
17d00 45 55 50 44 41 54 45 3a 20 7b 0a 23 69 66 6e 64  EUPDATE: {.#ifnd
17d10 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
17d20 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a  _PREUPDATE_HOOK.
17d30 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
17d40 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 72  sult(interp, "pr
17d50 65 75 70 64 61 74 65 5f 68 6f 6f 6b 20 77 61 73  eupdate_hook was
17d60 20 6f 6d 69 74 74 65 64 20 61 74 20 63 6f 6d 70   omitted at comp
17d70 69 6c 65 2d 74 69 6d 65 22 29 3b 0a 20 20 20 20  ile-time");.    
17d80 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  rc = TCL_ERROR;.
17d90 23 65 6c 73 65 0a 20 20 20 20 73 74 61 74 69 63  #else.    static
17da0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 53   const char *azS
17db0 75 62 5b 5d 20 3d 20 7b 22 63 6f 75 6e 74 22 2c  ub[] = {"count",
17dc0 20 22 64 65 70 74 68 22 2c 20 22 68 6f 6f 6b 22   "depth", "hook"
17dd0 2c 20 22 6e 65 77 22 2c 20 22 6f 6c 64 22 2c 20  , "new", "old", 
17de0 30 7d 3b 0a 20 20 20 20 65 6e 75 6d 20 44 62 50  0};.    enum DbP
17df0 72 65 75 70 64 61 74 65 53 75 62 43 6d 64 20 7b  reupdateSubCmd {
17e00 0a 20 20 20 20 20 20 50 52 45 5f 43 4f 55 4e 54  .      PRE_COUNT
17e10 2c 20 50 52 45 5f 44 45 50 54 48 2c 20 50 52 45  , PRE_DEPTH, PRE
17e20 5f 48 4f 4f 4b 2c 20 50 52 45 5f 4e 45 57 2c 20  _HOOK, PRE_NEW, 
17e30 50 52 45 5f 4f 4c 44 0a 20 20 20 20 7d 3b 0a 20  PRE_OLD.    };. 
17e40 20 20 20 69 6e 74 20 69 53 75 62 3b 0a 0a 20 20     int iSub;..  
17e50 20 20 69 66 28 20 6f 62 6a 63 3c 33 20 29 7b 0a    if( objc<3 ){.
17e60 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
17e70 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
17e80 2c 20 6f 62 6a 76 2c 20 22 53 55 42 2d 43 4f 4d  , objv, "SUB-COM
17e90 4d 41 4e 44 20 3f 41 52 47 53 3f 22 29 3b 0a 20  MAND ?ARGS?");. 
17ea0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 54 63 6c     }.    if( Tcl
17eb0 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a  _GetIndexFromObj
17ec0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
17ed0 2c 20 61 7a 53 75 62 2c 20 22 73 75 62 2d 63 6f  , azSub, "sub-co
17ee0 6d 6d 61 6e 64 22 2c 20 30 2c 20 26 69 53 75 62  mmand", 0, &iSub
17ef0 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
17f00 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
17f10 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 28 20   }..    switch( 
17f20 28 65 6e 75 6d 20 44 62 50 72 65 75 70 64 61 74  (enum DbPreupdat
17f30 65 53 75 62 43 6d 64 29 69 53 75 62 20 29 7b 0a  eSubCmd)iSub ){.
17f40 20 20 20 20 20 20 63 61 73 65 20 50 52 45 5f 43        case PRE_C
17f50 4f 55 4e 54 3a 20 7b 0a 20 20 20 20 20 20 20 20  OUNT: {.        
17f60 69 6e 74 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74  int nCol = sqlit
17f70 65 33 5f 70 72 65 75 70 64 61 74 65 5f 63 6f 75  e3_preupdate_cou
17f80 6e 74 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20 20  nt(pDb->db);.   
17f90 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52       Tcl_SetObjR
17fa0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
17fb0 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 43 6f 6c  l_NewIntObj(nCol
17fc0 29 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ));.        brea
17fd0 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
17fe0 20 20 63 61 73 65 20 50 52 45 5f 48 4f 4f 4b 3a    case PRE_HOOK:
17ff0 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f   {.        if( o
18000 62 6a 63 3e 34 20 29 7b 0a 20 20 20 20 20 20 20  bjc>4 ){.       
18010 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
18020 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
18030 62 6a 76 2c 20 22 68 6f 6f 6b 20 3f 53 43 52 49  bjv, "hook ?SCRI
18040 50 54 3f 22 29 3b 0a 20 20 20 20 20 20 20 20 20  PT?");.         
18050 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
18060 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  R;.        }.   
18070 20 20 20 20 20 44 62 48 6f 6f 6b 43 6d 64 28 69       DbHookCmd(i
18080 6e 74 65 72 70 2c 20 70 44 62 2c 20 28 6f 62 6a  nterp, pDb, (obj
18090 63 3d 3d 34 20 3f 20 6f 62 6a 76 5b 33 5d 20 3a  c==4 ? objv[3] :
180a0 20 30 29 2c 20 26 70 44 62 2d 3e 70 50 72 65 55   0), &pDb->pPreU
180b0 70 64 61 74 65 48 6f 6f 6b 29 3b 0a 20 20 20 20  pdateHook);.    
180c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
180d0 20 7d 0a 0a 20 20 20 20 20 20 63 61 73 65 20 50   }..      case P
180e0 52 45 5f 44 45 50 54 48 3a 20 7b 0a 20 20 20 20  RE_DEPTH: {.    
180f0 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65      Tcl_Obj *pRe
18100 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f  t;.        if( o
18110 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc!=3 ){.      
18120 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
18130 41 72 67 73 28 69 6e 74 65 72 70 2c 20 33 2c 20  Args(interp, 3, 
18140 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 20  objv, "");.     
18150 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
18160 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d  ERROR;.        }
18170 0a 20 20 20 20 20 20 20 20 70 52 65 74 20 3d 20  .        pRet = 
18180 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71  Tcl_NewIntObj(sq
18190 6c 69 74 65 33 5f 70 72 65 75 70 64 61 74 65 5f  lite3_preupdate_
181a0 64 65 70 74 68 28 70 44 62 2d 3e 64 62 29 29 3b  depth(pDb->db));
181b0 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74  .        Tcl_Set
181c0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
181d0 2c 20 70 52 65 74 29 3b 0a 20 20 20 20 20 20 20  , pRet);.       
181e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
181f0 0a 20 20 20 20 20 20 63 61 73 65 20 50 52 45 5f  .      case PRE_
18200 4e 45 57 3a 0a 20 20 20 20 20 20 63 61 73 65 20  NEW:.      case 
18210 50 52 45 5f 4f 4c 44 3a 20 7b 0a 20 20 20 20 20  PRE_OLD: {.     
18220 20 20 20 69 6e 74 20 69 49 64 78 3b 0a 20 20 20     int iIdx;.   
18230 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c       sqlite3_val
18240 75 65 20 2a 70 56 61 6c 75 65 3b 0a 20 20 20 20  ue *pValue;.    
18250 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20      if( objc!=4 
18260 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  ){.          Tcl
18270 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
18280 74 65 72 70 2c 20 33 2c 20 6f 62 6a 76 2c 20 22  terp, 3, objv, "
18290 49 4e 44 45 58 22 29 3b 0a 20 20 20 20 20 20 20  INDEX");.       
182a0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
182b0 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ROR;.        }. 
182c0 20 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47         if( Tcl_G
182d0 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
182e0 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 69  erp, objv[3], &i
182f0 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Idx) ){.        
18300 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
18310 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  OR;.        }.. 
18320 20 20 20 20 20 20 20 69 66 28 20 69 53 75 62 3d         if( iSub=
18330 3d 50 52 45 5f 4f 4c 44 20 29 7b 0a 20 20 20 20  =PRE_OLD ){.    
18340 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
18350 65 33 5f 70 72 65 75 70 64 61 74 65 5f 6f 6c 64  e3_preupdate_old
18360 28 70 44 62 2d 3e 64 62 2c 20 69 49 64 78 2c 20  (pDb->db, iIdx, 
18370 26 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  &pValue);.      
18380 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
18390 20 20 20 61 73 73 65 72 74 28 20 69 53 75 62 3d     assert( iSub=
183a0 3d 50 52 45 5f 4e 45 57 20 29 3b 0a 20 20 20 20  =PRE_NEW );.    
183b0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
183c0 65 33 5f 70 72 65 75 70 64 61 74 65 5f 6e 65 77  e3_preupdate_new
183d0 28 70 44 62 2d 3e 64 62 2c 20 69 49 64 78 2c 20  (pDb->db, iIdx, 
183e0 26 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  &pValue);.      
183f0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28    }..        if(
18400 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
18410 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  {.          Tcl_
18420 4f 62 6a 20 2a 70 4f 62 6a 3b 0a 20 20 20 20 20  Obj *pObj;.     
18430 20 20 20 20 20 70 4f 62 6a 20 3d 20 54 63 6c 5f       pObj = Tcl_
18440 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68  NewStringObj((ch
18450 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
18460 65 5f 74 65 78 74 28 70 56 61 6c 75 65 29 2c 20  e_text(pValue), 
18470 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 54  -1);.          T
18480 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
18490 69 6e 74 65 72 70 2c 20 70 4f 62 6a 29 3b 0a 20  interp, pObj);. 
184a0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
184b0 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65          Tcl_Appe
184c0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
184d0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
184e0 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20  pDb->db), 0);.  
184f0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
18500 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
18510 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
18520 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
18530 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44  TE_ENABLE_PREUPD
18540 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a 20 20 20 20  ATE_HOOK */.    
18550 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
18560 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 77 61 6c  .  **    $db wal
18570 5f 68 6f 6f 6b 20 3f 73 63 72 69 70 74 3f 0a 20  _hook ?script?. 
18580 20 2a 2a 20 20 20 20 24 64 62 20 75 70 64 61 74   **    $db updat
18590 65 5f 68 6f 6f 6b 20 3f 73 63 72 69 70 74 3f 0a  e_hook ?script?.
185a0 20 20 2a 2a 20 20 20 20 24 64 62 20 72 6f 6c 6c    **    $db roll
185b0 62 61 63 6b 5f 68 6f 6f 6b 20 3f 73 63 72 69 70  back_hook ?scrip
185c0 74 3f 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  t?.  */.  case D
185d0 42 5f 57 41 4c 5f 48 4f 4f 4b 3a 0a 20 20 63 61  B_WAL_HOOK:.  ca
185e0 73 65 20 44 42 5f 55 50 44 41 54 45 5f 48 4f 4f  se DB_UPDATE_HOO
185f0 4b 3a 0a 20 20 63 61 73 65 20 44 42 5f 52 4f 4c  K:.  case DB_ROL
18600 4c 42 41 43 4b 5f 48 4f 4f 4b 3a 20 7b 0a 20 20  LBACK_HOOK: {.  
18610 20 20 2f 2a 20 73 65 74 20 70 70 48 6f 6f 6b 20    /* set ppHook 
18620 74 6f 20 70 6f 69 6e 74 20 61 74 20 70 55 70 64  to point at pUpd
18630 61 74 65 48 6f 6f 6b 20 6f 72 20 70 52 6f 6c 6c  ateHook or pRoll
18640 62 61 63 6b 48 6f 6f 6b 2c 20 64 65 70 65 6e 64  backHook, depend
18650 69 6e 67 20 6f 6e 0a 20 20 20 20 2a 2a 20 77 68  ing on.    ** wh
18660 65 74 68 65 72 20 5b 24 64 62 20 75 70 64 61 74  ether [$db updat
18670 65 5f 68 6f 6f 6b 5d 20 6f 72 20 5b 24 64 62 20  e_hook] or [$db 
18680 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 5d 20 77  rollback_hook] w
18690 61 73 20 69 6e 76 6f 6b 65 64 2e 0a 20 20 20 20  as invoked..    
186a0 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  */.    Tcl_Obj *
186b0 2a 70 70 48 6f 6f 6b 20 3d 20 30 3b 0a 20 20 20  *ppHook = 0;.   
186c0 20 69 66 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f   if( choice==DB_
186d0 57 41 4c 5f 48 4f 4f 4b 20 29 20 70 70 48 6f 6f  WAL_HOOK ) ppHoo
186e0 6b 20 3d 20 26 70 44 62 2d 3e 70 57 61 6c 48 6f  k = &pDb->pWalHo
186f0 6f 6b 3b 0a 20 20 20 20 69 66 28 20 63 68 6f 69  ok;.    if( choi
18700 63 65 3d 3d 44 42 5f 55 50 44 41 54 45 5f 48 4f  ce==DB_UPDATE_HO
18710 4f 4b 20 29 20 70 70 48 6f 6f 6b 20 3d 20 26 70  OK ) ppHook = &p
18720 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b 3b  Db->pUpdateHook;
18730 0a 20 20 20 20 69 66 28 20 63 68 6f 69 63 65 3d  .    if( choice=
18740 3d 44 42 5f 52 4f 4c 4c 42 41 43 4b 5f 48 4f 4f  =DB_ROLLBACK_HOO
18750 4b 20 29 20 70 70 48 6f 6f 6b 20 3d 20 26 70 44  K ) ppHook = &pD
18760 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b  b->pRollbackHook
18770 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33  ;.    if( objc>3
18780 20 29 7b 0a 20 20 20 20 20 20 20 54 63 6c 5f 57   ){.       Tcl_W
18790 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
187a0 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 53  rp, 2, objv, "?S
187b0 43 52 49 50 54 3f 22 29 3b 0a 20 20 20 20 20 20  CRIPT?");.      
187c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
187d0 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 44 62  R;.    }..    Db
187e0 48 6f 6f 6b 43 6d 64 28 69 6e 74 65 72 70 2c 20  HookCmd(interp, 
187f0 70 44 62 2c 20 28 6f 62 6a 63 3d 3d 33 20 3f 20  pDb, (objc==3 ? 
18800 6f 62 6a 76 5b 32 5d 20 3a 20 30 29 2c 20 70 70  objv[2] : 0), pp
18810 48 6f 6f 6b 29 3b 0a 20 20 20 20 62 72 65 61 6b  Hook);.    break
18820 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24  ;.  }..  /*    $
18830 64 62 20 76 65 72 73 69 6f 6e 0a 20 20 2a 2a 0a  db version.  **.
18840 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20    ** Return the 
18850 76 65 72 73 69 6f 6e 20 73 74 72 69 6e 67 20 66  version string f
18860 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65  or this database
18870 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
18880 5f 56 45 52 53 49 4f 4e 3a 20 7b 0a 20 20 20 20  _VERSION: {.    
18890 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
188a0 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71  terp, (char *)sq
188b0 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e  lite3_libversion
188c0 28 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  (), TCL_STATIC);
188d0 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
188e0 0a 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 6f 66 20  ..  } /* End of 
188f0 74 68 65 20 53 57 49 54 43 48 20 73 74 61 74 65  the SWITCH state
18900 6d 65 6e 74 20 2a 2f 0a 20 20 72 65 74 75 72 6e  ment */.  return
18910 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49   rc;.}..#if SQLI
18920 54 45 5f 54 43 4c 5f 4e 52 45 0a 2f 2a 0a 2a 2a  TE_TCL_NRE./*.**
18930 20 41 64 61 70 74 6f 72 20 74 68 61 74 20 70 72   Adaptor that pr
18940 6f 76 69 64 65 73 20 61 6e 20 6f 62 6a 43 6d 64  ovides an objCmd
18950 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20 74 68   interface to th
18960 65 20 4e 52 45 2d 65 6e 61 62 6c 65 64 0a 2a 2a  e NRE-enabled.**
18970 20 69 6e 74 65 72 66 61 63 65 20 69 6d 70 6c 65   interface imple
18980 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  mentation..*/.st
18990 61 74 69 63 20 69 6e 74 20 44 62 4f 62 6a 43 6d  atic int DbObjCm
189a0 64 41 64 61 70 74 6f 72 28 0a 20 20 76 6f 69 64  dAdaptor(.  void
189b0 20 2a 63 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65   *cd,.  Tcl_Inte
189c0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
189d0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
189e0 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76 0a 29 7b  j *const*objv.){
189f0 0a 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e 52  .  return Tcl_NR
18a00 43 61 6c 6c 4f 62 6a 50 72 6f 63 28 69 6e 74 65  CallObjProc(inte
18a10 72 70 2c 20 44 62 4f 62 6a 43 6d 64 2c 20 63 64  rp, DbObjCmd, cd
18a20 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b 0a 7d  , objc, objv);.}
18a30 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
18a40 45 5f 54 43 4c 5f 4e 52 45 20 2a 2f 0a 0a 2f 2a  E_TCL_NRE */../*
18a50 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 20 44 42  .**   sqlite3 DB
18a60 4e 41 4d 45 20 46 49 4c 45 4e 41 4d 45 20 3f 2d  NAME FILENAME ?-
18a70 76 66 73 20 56 46 53 4e 41 4d 45 3f 20 3f 2d 6b  vfs VFSNAME? ?-k
18a80 65 79 20 4b 45 59 3f 20 3f 2d 72 65 61 64 6f 6e  ey KEY? ?-readon
18a90 6c 79 20 42 4f 4f 4c 45 41 4e 3f 0a 2a 2a 20 20  ly BOOLEAN?.**  
18aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ab0 20 20 20 20 20 20 20 20 20 3f 2d 63 72 65 61 74           ?-creat
18ac0 65 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d 6e 6f 6d  e BOOLEAN? ?-nom
18ad0 75 74 65 78 20 42 4f 4f 4c 45 41 4e 3f 0a 2a 2a  utex BOOLEAN?.**
18ae0 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
18af0 6d 61 69 6e 20 54 63 6c 20 63 6f 6d 6d 61 6e 64  main Tcl command
18b00 2e 20 20 57 68 65 6e 20 74 68 65 20 22 73 71 6c  .  When the "sql
18b10 69 74 65 22 20 54 63 6c 20 63 6f 6d 6d 61 6e 64  ite" Tcl command
18b20 20 69 73 0a 2a 2a 20 69 6e 76 6f 6b 65 64 2c 20   is.** invoked, 
18b30 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e  this routine run
18b40 73 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 61  s to process tha
18b50 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  t command..**.**
18b60 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
18b70 65 6e 74 2c 20 44 42 4e 41 4d 45 2c 20 69 73 20  ent, DBNAME, is 
18b80 61 6e 20 61 72 62 69 74 72 61 72 79 20 6e 61 6d  an arbitrary nam
18b90 65 20 66 6f 72 20 61 20 6e 65 77 0a 2a 2a 20 64  e for a new.** d
18ba0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
18bb0 6f 6e 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e  on.  This comman
18bc0 64 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 20  d creates a new 
18bd0 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 64 0a 2a 2a  command named.**
18be0 20 44 42 4e 41 4d 45 20 74 68 61 74 20 69 73 20   DBNAME that is 
18bf0 75 73 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20  used to control 
18c00 74 68 61 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  that connection.
18c10 20 20 54 68 65 20 64 61 74 61 62 61 73 65 0a 2a    The database.*
18c20 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  * connection is 
18c30 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65  deleted when the
18c40 20 44 42 4e 41 4d 45 20 63 6f 6d 6d 61 6e 64 20   DBNAME command 
18c50 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a  is deleted..**.*
18c60 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67  * The second arg
18c70 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d  ument is the nam
18c80 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
18c90 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74  e file..**.*/.st
18ca0 61 74 69 63 20 69 6e 74 20 44 62 4d 61 69 6e 28  atic int DbMain(
18cb0 76 6f 69 64 20 2a 63 64 2c 20 54 63 6c 5f 49 6e  void *cd, Tcl_In
18cc0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
18cd0 74 20 6f 62 6a 63 2c 54 63 6c 5f 4f 62 6a 20 2a  t objc,Tcl_Obj *
18ce0 63 6f 6e 73 74 2a 6f 62 6a 76 29 7b 0a 20 20 53  const*objv){.  S
18cf0 71 6c 69 74 65 44 62 20 2a 70 3b 0a 20 20 63 6f  qliteDb *p;.  co
18d00 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 3b 0a  nst char *zArg;.
18d10 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 3b    char *zErrMsg;
18d20 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73  .  int i;.  cons
18d30 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20  t char *zFile;. 
18d40 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66   const char *zVf
18d50 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 66 6c 61  s = 0;.  int fla
18d60 67 73 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  gs;.  Tcl_DStrin
18d70 67 20 74 72 61 6e 73 6c 61 74 65 64 46 69 6c 65  g translatedFile
18d80 6e 61 6d 65 3b 0a 23 69 66 20 64 65 66 69 6e 65  name;.#if define
18d90 64 28 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  d(SQLITE_HAS_COD
18da0 45 43 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  EC) && !defined(
18db0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 44 45  SQLITE_OMIT_CODE
18dc0 43 5f 46 52 4f 4d 5f 54 43 4c 29 0a 20 20 76 6f  C_FROM_TCL).  vo
18dd0 69 64 20 2a 70 4b 65 79 20 3d 20 30 3b 0a 20 20  id *pKey = 0;.  
18de0 69 6e 74 20 6e 4b 65 79 20 3d 20 30 3b 0a 23 65  int nKey = 0;.#e
18df0 6e 64 69 66 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ndif.  int rc;..
18e00 20 20 2f 2a 20 49 6e 20 6e 6f 72 6d 61 6c 20 75    /* In normal u
18e10 73 65 2c 20 65 61 63 68 20 54 43 4c 20 69 6e 74  se, each TCL int
18e20 65 72 70 72 65 74 65 72 20 72 75 6e 73 20 69 6e  erpreter runs in
18e30 20 61 20 73 69 6e 67 6c 65 20 74 68 72 65 61 64   a single thread
18e40 2e 20 20 53 6f 0a 20 20 2a 2a 20 62 79 20 64 65  .  So.  ** by de
18e50 66 61 75 6c 74 2c 20 77 65 20 63 61 6e 20 74 75  fault, we can tu
18e60 72 6e 20 6f 66 20 6d 75 74 65 78 69 6e 67 20 6f  rn of mutexing o
18e70 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  n SQLite databas
18e80 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20  e connections.. 
18e90 20 2a 2a 20 48 6f 77 65 76 65 72 2c 20 66 6f 72   ** However, for
18ea0 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65   testing purpose
18eb0 73 20 69 74 20 69 73 20 75 73 65 66 75 6c 20 74  s it is useful t
18ec0 6f 20 68 61 76 65 20 6d 75 74 65 78 65 73 20 74  o have mutexes t
18ed0 75 72 6e 65 64 0a 20 20 2a 2a 20 6f 6e 2e 20 20  urned.  ** on.  
18ee0 53 6f 2c 20 62 79 20 64 65 66 61 75 6c 74 2c 20  So, by default, 
18ef0 6d 75 74 65 78 65 73 20 64 65 66 61 75 6c 74 20  mutexes default 
18f00 6f 66 66 2e 20 20 42 75 74 20 69 66 20 63 6f 6d  off.  But if com
18f10 70 69 6c 65 64 20 77 69 74 68 0a 20 20 2a 2a 20  piled with.  ** 
18f20 53 51 4c 49 54 45 5f 54 43 4c 5f 44 45 46 41 55  SQLITE_TCL_DEFAU
18f30 4c 54 5f 46 55 4c 4c 4d 55 54 45 58 20 74 68 65  LT_FULLMUTEX the
18f40 6e 20 6d 75 74 65 78 65 73 20 64 65 66 61 75 6c  n mutexes defaul
18f50 74 20 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65  t on..  */.#ifde
18f60 66 20 53 51 4c 49 54 45 5f 54 43 4c 5f 44 45 46  f SQLITE_TCL_DEF
18f70 41 55 4c 54 5f 46 55 4c 4c 4d 55 54 45 58 0a 20  AULT_FULLMUTEX. 
18f80 20 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f   flags = SQLITE_
18f90 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
18fa0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
18fb0 41 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ATE | SQLITE_OPE
18fc0 4e 5f 46 55 4c 4c 4d 55 54 45 58 3b 0a 23 65 6c  N_FULLMUTEX;.#el
18fd0 73 65 0a 20 20 66 6c 61 67 73 20 3d 20 53 51 4c  se.  flags = SQL
18fe0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
18ff0 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
19000 5f 43 52 45 41 54 45 20 7c 20 53 51 4c 49 54 45  _CREATE | SQLITE
19010 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 3b 0a 23  _OPEN_NOMUTEX;.#
19020 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6f 62 6a  endif..  if( obj
19030 63 3d 3d 32 20 29 7b 0a 20 20 20 20 7a 41 72 67  c==2 ){.    zArg
19040 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
19050 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c  FromObj(objv[1],
19060 20 30 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72   0);.    if( str
19070 63 6d 70 28 7a 41 72 67 2c 22 2d 76 65 72 73 69  cmp(zArg,"-versi
19080 6f 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  on")==0 ){.     
19090 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
190a0 74 28 69 6e 74 65 72 70 2c 73 71 6c 69 74 65 33  t(interp,sqlite3
190b0 5f 6c 69 62 76 65 72 73 69 6f 6e 28 29 2c 20 28  _libversion(), (
190c0 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
190d0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20  return TCL_OK;. 
190e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72     }.    if( str
190f0 63 6d 70 28 7a 41 72 67 2c 22 2d 73 6f 75 72 63  cmp(zArg,"-sourc
19100 65 69 64 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  eid")==0 ){.    
19110 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
19120 6c 74 28 69 6e 74 65 72 70 2c 73 71 6c 69 74 65  lt(interp,sqlite
19130 33 5f 73 6f 75 72 63 65 69 64 28 29 2c 20 28 63  3_sourceid(), (c
19140 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72  har*)0);.      r
19150 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20  eturn TCL_OK;.  
19160 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72 63    }.    if( strc
19170 6d 70 28 7a 41 72 67 2c 22 2d 68 61 73 2d 63 6f  mp(zArg,"-has-co
19180 64 65 63 22 29 3d 3d 30 20 29 7b 0a 23 69 66 20  dec")==0 ){.#if 
19190 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48  defined(SQLITE_H
191a0 41 53 5f 43 4f 44 45 43 29 20 26 26 20 21 64 65  AS_CODEC) && !de
191b0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
191c0 54 5f 43 4f 44 45 43 5f 46 52 4f 4d 5f 54 43 4c  T_CODEC_FROM_TCL
191d0 29 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  ).      Tcl_Appe
191e0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
191f0 22 31 22 2c 28 63 68 61 72 2a 29 30 29 3b 0a 23  "1",(char*)0);.#
19200 65 6c 73 65 0a 20 20 20 20 20 20 54 63 6c 5f 41  else.      Tcl_A
19210 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
19220 72 70 2c 22 30 22 2c 28 63 68 61 72 2a 29 30 29  rp,"0",(char*)0)
19230 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72  ;.#endif.      r
19240 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20  eturn TCL_OK;.  
19250 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d    }.  }.  for(i=
19260 33 3b 20 69 2b 31 3c 6f 62 6a 63 3b 20 69 2b 3d  3; i+1<objc; i+=
19270 32 29 7b 0a 20 20 20 20 7a 41 72 67 20 3d 20 54  2){.    zArg = T
19280 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
19290 76 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 73  v[i]);.    if( s
192a0 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 6b 65 79  trcmp(zArg,"-key
192b0 22 29 3d 3d 30 20 29 7b 0a 23 69 66 20 64 65 66  ")==0 ){.#if def
192c0 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 53 5f  ined(SQLITE_HAS_
192d0 43 4f 44 45 43 29 20 26 26 20 21 64 65 66 69 6e  CODEC) && !defin
192e0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ed(SQLITE_OMIT_C
192f0 4f 44 45 43 5f 46 52 4f 4d 5f 54 43 4c 29 0a 20  ODEC_FROM_TCL). 
19300 20 20 20 20 20 70 4b 65 79 20 3d 20 54 63 6c 5f       pKey = Tcl_
19310 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d  GetByteArrayFrom
19320 4f 62 6a 28 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26  Obj(objv[i+1], &
19330 6e 4b 65 79 29 3b 0a 23 65 6e 64 69 66 0a 20 20  nKey);.#endif.  
19340 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
19350 6d 70 28 7a 41 72 67 2c 20 22 2d 76 66 73 22 29  mp(zArg, "-vfs")
19360 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 56 66  ==0 ){.      zVf
19370 73 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  s = Tcl_GetStrin
19380 67 28 6f 62 6a 76 5b 69 2b 31 5d 29 3b 0a 20 20  g(objv[i+1]);.  
19390 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
193a0 6d 70 28 7a 41 72 67 2c 20 22 2d 72 65 61 64 6f  mp(zArg, "-reado
193b0 6e 6c 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  nly")==0 ){.    
193c0 20 20 69 6e 74 20 62 3b 0a 20 20 20 20 20 20 69    int b;.      i
193d0 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61  f( Tcl_GetBoolea
193e0 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  nFromObj(interp,
193f0 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 62 29 20   objv[i+1], &b) 
19400 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
19410 4f 52 3b 0a 20 20 20 20 20 20 69 66 28 20 62 20  OR;.      if( b 
19420 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  ){.        flags
19430 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45   &= ~(SQLITE_OPE
19440 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
19450 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b  TE_OPEN_CREATE);
19460 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c  .        flags |
19470 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
19480 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65  ADONLY;.      }e
19490 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 61  lse{.        fla
194a0 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50  gs &= ~SQLITE_OP
194b0 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  EN_READONLY;.   
194c0 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51       flags |= SQ
194d0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
194e0 49 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ITE;.      }.   
194f0 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
19500 70 28 7a 41 72 67 2c 20 22 2d 63 72 65 61 74 65  p(zArg, "-create
19510 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
19520 6e 74 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20  nt b;.      if( 
19530 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
19540 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
19550 6a 76 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20 72  jv[i+1], &b) ) r
19560 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
19570 0a 20 20 20 20 20 20 69 66 28 20 62 20 26 26 20  .      if( b && 
19580 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
19590 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3d 3d  OPEN_READONLY)==
195a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61  0 ){.        fla
195b0 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45  gs |= SQLITE_OPE
195c0 4e 5f 43 52 45 41 54 45 3b 0a 20 20 20 20 20 20  N_CREATE;.      
195d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
195e0 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
195f0 4f 50 45 4e 5f 43 52 45 41 54 45 3b 0a 20 20 20  OPEN_CREATE;.   
19600 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
19610 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20  f( strcmp(zArg, 
19620 22 2d 6e 6f 6d 75 74 65 78 22 29 3d 3d 30 20 29  "-nomutex")==0 )
19630 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 3b 0a 20  {.      int b;. 
19640 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74       if( Tcl_Get
19650 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
19660 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d  nterp, objv[i+1]
19670 2c 20 26 62 29 20 29 20 72 65 74 75 72 6e 20 54  , &b) ) return T
19680 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
19690 69 66 28 20 62 20 29 7b 0a 20 20 20 20 20 20 20  if( b ){.       
196a0 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45   flags |= SQLITE
196b0 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 3b 0a 20  _OPEN_NOMUTEX;. 
196c0 20 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20         flags &= 
196d0 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c  ~SQLITE_OPEN_FUL
196e0 4c 4d 55 54 45 58 3b 0a 20 20 20 20 20 20 7d 65  LMUTEX;.      }e
196f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 61  lse{.        fla
19700 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50  gs &= ~SQLITE_OP
19710 45 4e 5f 4e 4f 4d 55 54 45 58 3b 0a 20 20 20 20  EN_NOMUTEX;.    
19720 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
19730 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22  ( strcmp(zArg, "
19740 2d 66 75 6c 6c 6d 75 74 65 78 22 29 3d 3d 30 20  -fullmutex")==0 
19750 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 3b 0a  ){.      int b;.
19760 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65        if( Tcl_Ge
19770 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
19780 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 2b 31  interp, objv[i+1
19790 5d 2c 20 26 62 29 20 29 20 72 65 74 75 72 6e 20  ], &b) ) return 
197a0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
197b0 20 69 66 28 20 62 20 29 7b 0a 20 20 20 20 20 20   if( b ){.      
197c0 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54    flags |= SQLIT
197d0 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58  E_OPEN_FULLMUTEX
197e0 3b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  ;.        flags 
197f0 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  &= ~SQLITE_OPEN_
19800 4e 4f 4d 55 54 45 58 3b 0a 20 20 20 20 20 20 7d  NOMUTEX;.      }
19810 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6c  else{.        fl
19820 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f  ags &= ~SQLITE_O
19830 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 3b 0a 20  PEN_FULLMUTEX;. 
19840 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
19850 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67   if( strcmp(zArg
19860 2c 20 22 2d 75 72 69 22 29 3d 3d 30 20 29 7b 0a  , "-uri")==0 ){.
19870 20 20 20 20 20 20 69 6e 74 20 62 3b 0a 20 20 20        int b;.   
19880 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f     if( Tcl_GetBo
19890 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
198a0 65 72 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20  erp, objv[i+1], 
198b0 26 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  &b) ) return TCL
198c0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 69 66  _ERROR;.      if
198d0 28 20 62 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ( b ){.        f
198e0 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
198f0 50 45 4e 5f 55 52 49 3b 0a 20 20 20 20 20 20 7d  PEN_URI;.      }
19900 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6c  else{.        fl
19910 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f  ags &= ~SQLITE_O
19920 50 45 4e 5f 55 52 49 3b 0a 20 20 20 20 20 20 7d  PEN_URI;.      }
19930 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
19940 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
19950 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 6b 6e  lt(interp, "unkn
19960 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 22 2c 20 7a  own option: ", z
19970 41 72 67 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  Arg, (char*)0);.
19980 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
19990 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
199a0 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3c 33 20 7c  }.  if( objc<3 |
199b0 7c 20 28 6f 62 6a 63 26 31 29 21 3d 31 20 29 7b  | (objc&1)!=1 ){
199c0 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
199d0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
199e0 20 6f 62 6a 76 2c 0a 20 20 20 20 20 20 22 48 41   objv,.      "HA
199f0 4e 44 4c 45 20 46 49 4c 45 4e 41 4d 45 20 3f 2d  NDLE FILENAME ?-
19a00 76 66 73 20 56 46 53 4e 41 4d 45 3f 20 3f 2d 72  vfs VFSNAME? ?-r
19a10 65 61 64 6f 6e 6c 79 20 42 4f 4f 4c 45 41 4e 3f  eadonly BOOLEAN?
19a20 20 3f 2d 63 72 65 61 74 65 20 42 4f 4f 4c 45 41   ?-create BOOLEA
19a30 4e 3f 22 0a 20 20 20 20 20 20 22 20 3f 2d 6e 6f  N?".      " ?-no
19a40 6d 75 74 65 78 20 42 4f 4f 4c 45 41 4e 3f 20 3f  mutex BOOLEAN? ?
19a50 2d 66 75 6c 6c 6d 75 74 65 78 20 42 4f 4f 4c 45  -fullmutex BOOLE
19a60 41 4e 3f 20 3f 2d 75 72 69 20 42 4f 4f 4c 45 41  AN? ?-uri BOOLEA
19a70 4e 3f 22 0a 23 69 66 20 64 65 66 69 6e 65 64 28  N?".#if defined(
19a80 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
19a90 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
19aa0 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 44 45 43 5f  LITE_OMIT_CODEC_
19ab0 46 52 4f 4d 5f 54 43 4c 29 0a 20 20 20 20 20 20  FROM_TCL).      
19ac0 22 20 3f 2d 6b 65 79 20 43 4f 44 45 43 4b 45 59  " ?-key CODECKEY
19ad0 3f 22 0a 23 65 6e 64 69 66 0a 20 20 20 20 29 3b  ?".#endif.    );
19ae0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
19af0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 45 72  ERROR;.  }.  zEr
19b00 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70 20 3d 20  rMsg = 0;.  p = 
19b10 28 53 71 6c 69 74 65 44 62 2a 29 54 63 6c 5f 41  (SqliteDb*)Tcl_A
19b20 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29  lloc( sizeof(*p)
19b30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   );.  if( p==0 )
19b40 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  {.    Tcl_SetRes
19b50 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
19b60 72 20 2a 29 22 6d 61 6c 6c 6f 63 20 66 61 69 6c  r *)"malloc fail
19b70 65 64 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  ed", TCL_STATIC)
19b80 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
19b90 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 6d 65  _ERROR;.  }.  me
19ba0 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f  mset(p, 0, sizeo
19bb0 66 28 2a 70 29 29 3b 0a 20 20 7a 46 69 6c 65 20  f(*p));.  zFile 
19bc0 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
19bd0 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
19be0 30 29 3b 0a 20 20 7a 46 69 6c 65 20 3d 20 54 63  0);.  zFile = Tc
19bf0 6c 5f 54 72 61 6e 73 6c 61 74 65 46 69 6c 65 4e  l_TranslateFileN
19c00 61 6d 65 28 69 6e 74 65 72 70 2c 20 7a 46 69 6c  ame(interp, zFil
19c10 65 2c 20 26 74 72 61 6e 73 6c 61 74 65 64 46 69  e, &translatedFi
19c20 6c 65 6e 61 6d 65 29 3b 0a 20 20 72 63 20 3d 20  lename);.  rc = 
19c30 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28  sqlite3_open_v2(
19c40 7a 46 69 6c 65 2c 20 26 70 2d 3e 64 62 2c 20 66  zFile, &p->db, f
19c50 6c 61 67 73 2c 20 7a 56 66 73 29 3b 0a 20 20 54  lags, zVfs);.  T
19c60 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
19c70 74 72 61 6e 73 6c 61 74 65 64 46 69 6c 65 6e 61  translatedFilena
19c80 6d 65 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62  me);.  if( p->db
19c90 20 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c 49   ){.    if( SQLI
19ca0 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 65  TE_OK!=sqlite3_e
19cb0 72 72 63 6f 64 65 28 70 2d 3e 64 62 29 20 29 7b  rrcode(p->db) ){
19cc0 0a 20 20 20 20 20 20 7a 45 72 72 4d 73 67 20 3d  .      zErrMsg =
19cd0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
19ce0 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65  ("%s", sqlite3_e
19cf0 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20  rrmsg(p->db));. 
19d00 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f       sqlite3_clo
19d10 73 65 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 20  se(p->db);.     
19d20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 20 20   p->db = 0;.    
19d30 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  }.  }else{.    z
19d40 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33  ErrMsg = sqlite3
19d50 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73  _mprintf("%s", s
19d60 71 6c 69 74 65 33 5f 65 72 72 73 74 72 28 72 63  qlite3_errstr(rc
19d70 29 29 3b 0a 20 20 7d 0a 23 69 66 20 64 65 66 69  ));.  }.#if defi
19d80 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 53 5f 43  ned(SQLITE_HAS_C
19d90 4f 44 45 43 29 20 26 26 20 21 64 65 66 69 6e 65  ODEC) && !define
19da0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  d(SQLITE_OMIT_CO
19db0 44 45 43 5f 46 52 4f 4d 5f 54 43 4c 29 0a 20 20  DEC_FROM_TCL).  
19dc0 69 66 28 20 70 2d 3e 64 62 20 29 7b 0a 20 20 20  if( p->db ){.   
19dd0 20 73 71 6c 69 74 65 33 5f 6b 65 79 28 70 2d 3e   sqlite3_key(p->
19de0 64 62 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 29 3b  db, pKey, nKey);
19df0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
19e00 28 20 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20 20  ( p->db==0 ){.  
19e10 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
19e20 69 6e 74 65 72 70 2c 20 7a 45 72 72 4d 73 67 2c  interp, zErrMsg,
19e30 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a   TCL_VOLATILE);.
19e40 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68      Tcl_Free((ch
19e50 61 72 2a 29 70 29 3b 0a 20 20 20 20 73 71 6c 69  ar*)p);.    sqli
19e60 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67  te3_free(zErrMsg
19e70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
19e80 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70  L_ERROR;.  }.  p
19e90 2d 3e 6d 61 78 53 74 6d 74 20 3d 20 4e 55 4d 5f  ->maxStmt = NUM_
19ea0 50 52 45 50 41 52 45 44 5f 53 54 4d 54 53 3b 0a  PREPARED_STMTS;.
19eb0 20 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d    p->openFlags =
19ec0 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
19ed0 4f 50 45 4e 5f 55 52 49 3b 0a 20 20 70 2d 3e 69  OPEN_URI;.  p->i
19ee0 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a  nterp = interp;.
19ef0 20 20 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65 74    zArg = Tcl_Get
19f00 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
19f10 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 69 66 28  jv[1], 0);.  if(
19f20 20 44 62 55 73 65 4e 72 65 28 29 20 29 7b 0a 20   DbUseNre() ){. 
19f30 20 20 20 54 63 6c 5f 4e 52 43 72 65 61 74 65 43     Tcl_NRCreateC
19f40 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 7a  ommand(interp, z
19f50 41 72 67 2c 20 44 62 4f 62 6a 43 6d 64 41 64 61  Arg, DbObjCmdAda
19f60 70 74 6f 72 2c 20 44 62 4f 62 6a 43 6d 64 2c 0a  ptor, DbObjCmd,.
19f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f80 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
19f90 2c 20 44 62 44 65 6c 65 74 65 43 6d 64 29 3b 0a  , DbDeleteCmd);.
19fa0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c    }else{.    Tcl
19fb0 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
19fc0 64 28 69 6e 74 65 72 70 2c 20 7a 41 72 67 2c 20  d(interp, zArg, 
19fd0 44 62 4f 62 6a 43 6d 64 2c 20 28 63 68 61 72 2a  DbObjCmd, (char*
19fe0 29 70 2c 20 44 62 44 65 6c 65 74 65 43 6d 64 29  )p, DbDeleteCmd)
19ff0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
1a000 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1a010 50 72 6f 76 69 64 65 20 61 20 64 75 6d 6d 79 20  Provide a dummy 
1a020 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 20 69 66  Tcl_InitStubs if
1a030 20 77 65 20 61 72 65 20 75 73 69 6e 67 20 74 68   we are using th
1a040 69 73 20 61 73 20 61 20 73 74 61 74 69 63 0a 2a  is as a static.*
1a050 2a 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69  * library..*/.#i
1a060 66 6e 64 65 66 20 55 53 45 5f 54 43 4c 5f 53 54  fndef USE_TCL_ST
1a070 55 42 53 0a 23 20 75 6e 64 65 66 20 20 54 63 6c  UBS.# undef  Tcl
1a080 5f 49 6e 69 74 53 74 75 62 73 0a 23 20 64 65 66  _InitStubs.# def
1a090 69 6e 65 20 54 63 6c 5f 49 6e 69 74 53 74 75 62  ine Tcl_InitStub
1a0a0 73 28 61 2c 62 2c 63 29 20 54 43 4c 5f 56 45 52  s(a,b,c) TCL_VER
1a0b0 53 49 4f 4e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  SION.#endif../*.
1a0c0 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20  ** Make sure we 
1a0d0 68 61 76 65 20 61 20 50 41 43 4b 41 47 45 5f 56  have a PACKAGE_V
1a0e0 45 52 53 49 4f 4e 20 6d 61 63 72 6f 20 64 65 66  ERSION macro def
1a0f0 69 6e 65 64 2e 20 20 54 68 69 73 20 77 69 6c 6c  ined.  This will
1a100 20 62 65 0a 2a 2a 20 64 65 66 69 6e 65 64 20 61   be.** defined a
1a110 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 62 79 20  utomatically by 
1a120 74 68 65 20 54 45 41 20 6d 61 6b 65 66 69 6c 65  the TEA makefile
1a130 2e 20 20 42 75 74 20 6f 74 68 65 72 20 6d 61 6b  .  But other mak
1a140 65 66 69 6c 65 73 0a 2a 2a 20 64 6f 20 6e 6f 74  efiles.** do not
1a150 20 64 65 66 69 6e 65 20 69 74 2e 0a 2a 2f 0a 23   define it..*/.#
1a160 69 66 6e 64 65 66 20 50 41 43 4b 41 47 45 5f 56  ifndef PACKAGE_V
1a170 45 52 53 49 4f 4e 0a 23 20 64 65 66 69 6e 65 20  ERSION.# define 
1a180 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 20  PACKAGE_VERSION 
1a190 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 0a 23  SQLITE_VERSION.#
1a1a0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  endif../*.** Ini
1a1b0 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64  tialize this mod
1a1c0 75 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ule..**.** This 
1a1d0 54 63 6c 20 6d 6f 64 75 6c 65 20 63 6f 6e 74 61  Tcl module conta
1a1e0 69 6e 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c  ins only a singl
1a1f0 65 20 6e 65 77 20 54 63 6c 20 63 6f 6d 6d 61 6e  e new Tcl comman
1a200 64 20 6e 61 6d 65 64 20 22 73 71 6c 69 74 65 22  d named "sqlite"
1a210 2e 0a 2a 2a 20 28 48 65 6e 63 65 20 74 68 65 72  ..** (Hence ther
1a220 65 20 69 73 20 6e 6f 20 6e 61 6d 65 73 70 61 63  e is no namespac
1a230 65 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  e.  There is no 
1a240 70 6f 69 6e 74 20 69 6e 20 75 73 69 6e 67 20 61  point in using a
1a250 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69 66   namespace.** if
1a260 20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e 20 6f   the extension o
1a270 6e 6c 79 20 73 75 70 70 6c 69 65 73 20 6f 6e 65  nly supplies one
1a280 20 6e 65 77 20 6e 61 6d 65 21 29 20 20 54 68 65   new name!)  The
1a290 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d 61 6e   "sqlite" comman
1a2a0 64 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20  d is.** used to 
1a2b0 6f 70 65 6e 20 61 20 6e 65 77 20 53 51 4c 69 74  open a new SQLit
1a2c0 65 20 64 61 74 61 62 61 73 65 2e 20 20 53 65 65  e database.  See
1a2d0 20 74 68 65 20 44 62 4d 61 69 6e 28 29 20 72 6f   the DbMain() ro
1a2e0 75 74 69 6e 65 20 61 62 6f 76 65 0a 2a 2a 20 66  utine above.** f
1a2f0 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
1a300 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  formation..**.**
1a310 20 54 68 65 20 45 58 54 45 52 4e 20 6d 61 63 72   The EXTERN macr
1a320 6f 73 20 61 72 65 20 72 65 71 75 69 72 65 64 20  os are required 
1a330 62 79 20 54 43 4c 20 69 6e 20 6f 72 64 65 72 20  by TCL in order 
1a340 74 6f 20 77 6f 72 6b 20 6f 6e 20 77 69 6e 64 6f  to work on windo
1a350 77 73 2e 0a 2a 2f 0a 45 58 54 45 52 4e 20 69 6e  ws..*/.EXTERN in
1a360 74 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 54  t Sqlite3_Init(T
1a370 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1a380 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 54  p){.  int rc = T
1a390 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 69 6e 74  cl_InitStubs(int
1a3a0 65 72 70 2c 20 22 38 2e 34 22 2c 20 30 29 20 3f  erp, "8.4", 0) ?
1a3b0 20 54 43 4c 5f 4f 4b 20 3a 20 54 43 4c 5f 45 52   TCL_OK : TCL_ER
1a3c0 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 3d 3d 54  ROR;.  if( rc==T
1a3d0 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c  CL_OK ){.    Tcl
1a3e0 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
1a3f0 64 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  d(interp, "sqlit
1a400 65 33 22 2c 20 28 54 63 6c 5f 4f 62 6a 43 6d 64  e3", (Tcl_ObjCmd
1a410 50 72 6f 63 2a 29 44 62 4d 61 69 6e 2c 20 30 2c  Proc*)DbMain, 0,
1a420 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c   0);.#ifndef SQL
1a430 49 54 45 5f 33 5f 53 55 46 46 49 58 5f 4f 4e 4c  ITE_3_SUFFIX_ONL
1a440 59 0a 20 20 20 20 2f 2a 20 54 68 65 20 22 73 71  Y.    /* The "sq
1a450 6c 69 74 65 22 20 61 6c 69 61 73 20 69 73 20 75  lite" alias is u
1a460 6e 64 6f 63 75 6d 65 6e 74 65 64 2e 20 20 49 74  ndocumented.  It
1a470 20 69 73 20 68 65 72 65 20 6f 6e 6c 79 20 74 6f   is here only to
1a480 20 73 75 70 70 6f 72 74 0a 20 20 20 20 2a 2a 20   support.    ** 
1a490 6c 65 67 61 63 79 20 73 63 72 69 70 74 73 2e 20  legacy scripts. 
1a4a0 20 41 6c 6c 20 6e 65 77 20 73 63 72 69 70 74 73   All new scripts
1a4b0 20 73 68 6f 75 6c 64 20 75 73 65 20 6f 6e 6c 79   should use only
1a4c0 20 74 68 65 20 22 73 71 6c 69 74 65 33 22 0a 20   the "sqlite3". 
1a4d0 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 2a     ** command. *
1a4e0 2f 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  /.    Tcl_Create
1a4f0 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
1a500 70 2c 20 22 73 71 6c 69 74 65 22 2c 20 28 54 63  p, "sqlite", (Tc
1a510 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 2a 29 44 62  l_ObjCmdProc*)Db
1a520 4d 61 69 6e 2c 20 30 2c 20 30 29 3b 0a 23 65 6e  Main, 0, 0);.#en
1a530 64 69 66 0a 20 20 20 20 72 63 20 3d 20 54 63 6c  dif.    rc = Tcl
1a540 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65  _PkgProvide(inte
1a550 72 70 2c 20 22 73 71 6c 69 74 65 33 22 2c 20 50  rp, "sqlite3", P
1a560 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29 3b  ACKAGE_VERSION);
1a570 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1a580 3b 0a 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 54  ;.}.EXTERN int T
1a590 63 6c 73 71 6c 69 74 65 33 5f 49 6e 69 74 28 54  clsqlite3_Init(T
1a5a0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1a5b0 70 29 7b 20 72 65 74 75 72 6e 20 53 71 6c 69 74  p){ return Sqlit
1a5c0 65 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  e3_Init(interp);
1a5d0 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 53 71   }.EXTERN int Sq
1a5e0 6c 69 74 65 33 5f 55 6e 6c 6f 61 64 28 54 63 6c  lite3_Unload(Tcl
1a5f0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1a600 20 69 6e 74 20 66 6c 61 67 73 29 7b 20 72 65 74   int flags){ ret
1a610 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 45 58  urn TCL_OK; }.EX
1a620 54 45 52 4e 20 69 6e 74 20 54 63 6c 73 71 6c 69  TERN int Tclsqli
1a630 74 65 33 5f 55 6e 6c 6f 61 64 28 54 63 6c 5f 49  te3_Unload(Tcl_I
1a640 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
1a650 6e 74 20 66 6c 61 67 73 29 7b 20 72 65 74 75 72  nt flags){ retur
1a660 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 0a 2f 2a 20  n TCL_OK; }../* 
1a670 42 65 63 61 75 73 65 20 69 74 20 61 63 63 65 73  Because it acces
1a680 73 65 73 20 74 68 65 20 66 69 6c 65 2d 73 79 73  ses the file-sys
1a690 74 65 6d 20 61 6e 64 20 75 73 65 73 20 70 65 72  tem and uses per
1a6a0 73 69 73 74 65 6e 74 20 73 74 61 74 65 2c 20 53  sistent state, S
1a6b0 51 4c 69 74 65 0a 2a 2a 20 69 73 20 6e 6f 74 20  QLite.** is not 
1a6c0 63 6f 6e 73 69 64 65 72 65 64 20 61 70 70 72 6f  considered appro
1a6d0 70 72 69 61 74 65 20 66 6f 72 20 73 61 66 65 20  priate for safe 
1a6e0 69 6e 74 65 72 70 72 65 74 65 72 73 2e 20 20 48  interpreters.  H
1a6f0 65 6e 63 65 2c 20 77 65 20 63 61 75 73 65 0a 2a  ence, we cause.*
1a700 2a 20 74 68 65 20 5f 53 61 66 65 49 6e 69 74 28  * the _SafeInit(
1a710 29 20 69 6e 74 65 72 66 61 63 65 73 20 72 65 74  ) interfaces ret
1a720 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 2e 0a 2a  urn TCL_ERROR..*
1a730 2f 0a 45 58 54 45 52 4e 20 69 6e 74 20 53 71 6c  /.EXTERN int Sql
1a740 69 74 65 33 5f 53 61 66 65 49 6e 69 74 28 54 63  ite3_SafeInit(Tc
1a750 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1a760 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ){ return TCL_ER
1a770 52 4f 52 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e  ROR; }.EXTERN in
1a780 74 20 53 71 6c 69 74 65 33 5f 53 61 66 65 55 6e  t Sqlite3_SafeUn
1a790 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72 70 20  load(Tcl_Interp 
1a7a0 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c 61  *interp, int fla
1a7b0 67 73 29 7b 72 65 74 75 72 6e 20 54 43 4c 5f 45  gs){return TCL_E
1a7c0 52 52 4f 52 3b 7d 0a 0a 0a 0a 23 69 66 6e 64 65  RROR;}....#ifnde
1a7d0 66 20 53 51 4c 49 54 45 5f 33 5f 53 55 46 46 49  f SQLITE_3_SUFFI
1a7e0 58 5f 4f 4e 4c 59 0a 69 6e 74 20 53 71 6c 69 74  X_ONLY.int Sqlit
1a7f0 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  e_Init(Tcl_Inter
1a800 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75  p *interp){ retu
1a810 72 6e 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28  rn Sqlite3_Init(
1a820 69 6e 74 65 72 70 29 3b 20 7d 0a 69 6e 74 20 54  interp); }.int T
1a830 63 6c 73 71 6c 69 74 65 5f 49 6e 69 74 28 54 63  clsqlite_Init(Tc
1a840 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1a850 29 7b 20 72 65 74 75 72 6e 20 53 71 6c 69 74 65  ){ return Sqlite
1a860 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 20  3_Init(interp); 
1a870 7d 0a 69 6e 74 20 53 71 6c 69 74 65 5f 55 6e 6c  }.int Sqlite_Unl
1a880 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  oad(Tcl_Interp *
1a890 69 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c 61 67  interp, int flag
1a8a0 73 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  s){ return TCL_O
1a8b0 4b 3b 20 7d 0a 69 6e 74 20 54 63 6c 73 71 6c 69  K; }.int Tclsqli
1a8c0 74 65 5f 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e  te_Unload(Tcl_In
1a8d0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
1a8e0 74 20 66 6c 61 67 73 29 7b 20 72 65 74 75 72 6e  t flags){ return
1a8f0 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 23 65 6e 64 69   TCL_OK; }.#endi
1a900 66 0a 0a 23 69 66 64 65 66 20 54 43 4c 53 48 0a  f..#ifdef TCLSH.
1a910 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
1a920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
1a960 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64  * All of the cod
1a970 65 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69  e that follows i
1a980 73 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20  s used to build 
1a990 73 74 61 6e 64 61 6c 6f 6e 65 20 54 43 4c 20 69  standalone TCL i
1a9a0 6e 74 65 72 70 72 65 74 65 72 73 0a 2a 2a 20 74  nterpreters.** t
1a9b0 68 61 74 20 61 72 65 20 73 74 61 74 69 63 61 6c  hat are statical
1a9c0 6c 79 20 6c 69 6e 6b 65 64 20 77 69 74 68 20 53  ly linked with S
1a9d0 51 4c 69 74 65 2e 20 20 45 6e 61 62 6c 65 20 74  QLite.  Enable t
1a9e0 68 65 73 65 20 62 79 20 63 6f 6d 70 69 6c 69 6e  hese by compilin
1a9f0 67 0a 2a 2a 20 77 69 74 68 20 2d 44 54 43 4c 53  g.** with -DTCLS
1aa00 48 3d 6e 20 77 68 65 72 65 20 6e 20 63 61 6e 20  H=n where n can 
1aa10 62 65 20 31 20 6f 72 20 32 2e 20 20 41 6e 20 6e  be 1 or 2.  An n
1aa20 20 6f 66 20 31 20 67 65 6e 65 72 61 74 65 73 20   of 1 generates 
1aa30 61 20 73 74 61 6e 64 61 72 64 0a 2a 2a 20 74 63  a standard.** tc
1aa40 6c 73 68 20 62 75 74 20 77 69 74 68 20 53 51 4c  lsh but with SQL
1aa50 69 74 65 20 62 75 69 6c 74 20 69 6e 2e 20 20 41  ite built in.  A
1aa60 6e 20 6e 20 6f 66 20 32 20 67 65 6e 65 72 61 74  n n of 2 generat
1aa70 65 73 20 74 68 65 20 53 51 4c 69 74 65 20 73 70  es the SQLite sp
1aa80 61 63 65 0a 2a 2a 20 61 6e 61 6c 79 73 69 73 20  ace.** analysis 
1aa90 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 0a 23 69 66  program..*/..#if
1aaa0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1aab0 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e 65 64  TEST) || defined
1aac0 28 53 51 4c 49 54 45 5f 54 43 4c 4d 44 35 29 0a  (SQLITE_TCLMD5).
1aad0 2f 2a 0a 20 2a 20 54 68 69 73 20 63 6f 64 65 20  /*. * This code 
1aae0 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 4d  implements the M
1aaf0 44 35 20 6d 65 73 73 61 67 65 2d 64 69 67 65 73  D5 message-diges
1ab00 74 20 61 6c 67 6f 72 69 74 68 6d 2e 0a 20 2a 20  t algorithm.. * 
1ab10 54 68 65 20 61 6c 67 6f 72 69 74 68 6d 20 69 73  The algorithm is
1ab20 20 64 75 65 20 74 6f 20 52 6f 6e 20 52 69 76 65   due to Ron Rive
1ab30 73 74 2e 20 20 54 68 69 73 20 63 6f 64 65 20 77  st.  This code w
1ab40 61 73 0a 20 2a 20 77 72 69 74 74 65 6e 20 62 79  as. * written by
1ab50 20 43 6f 6c 69 6e 20 50 6c 75 6d 62 20 69 6e 20   Colin Plumb in 
1ab60 31 39 39 33 2c 20 6e 6f 20 63 6f 70 79 72 69 67  1993, no copyrig
1ab70 68 74 20 69 73 20 63 6c 61 69 6d 65 64 2e 0a 20  ht is claimed.. 
1ab80 2a 20 54 68 69 73 20 63 6f 64 65 20 69 73 20 69  * This code is i
1ab90 6e 20 74 68 65 20 70 75 62 6c 69 63 20 64 6f 6d  n the public dom
1aba0 61 69 6e 3b 20 64 6f 20 77 69 74 68 20 69 74 20  ain; do with it 
1abb0 77 68 61 74 20 79 6f 75 20 77 69 73 68 2e 0a 20  what you wish.. 
1abc0 2a 0a 20 2a 20 45 71 75 69 76 61 6c 65 6e 74 20  *. * Equivalent 
1abd0 63 6f 64 65 20 69 73 20 61 76 61 69 6c 61 62 6c  code is availabl
1abe0 65 20 66 72 6f 6d 20 52 53 41 20 44 61 74 61 20  e from RSA Data 
1abf0 53 65 63 75 72 69 74 79 2c 20 49 6e 63 2e 0a 20  Security, Inc.. 
1ac00 2a 20 54 68 69 73 20 63 6f 64 65 20 68 61 73 20  * This code has 
1ac10 62 65 65 6e 20 74 65 73 74 65 64 20 61 67 61 69  been tested agai
1ac20 6e 73 74 20 74 68 61 74 2c 20 61 6e 64 20 69 73  nst that, and is
1ac30 20 65 71 75 69 76 61 6c 65 6e 74 2c 0a 20 2a 20   equivalent,. * 
1ac40 65 78 63 65 70 74 20 74 68 61 74 20 79 6f 75 20  except that you 
1ac50 64 6f 6e 27 74 20 6e 65 65 64 20 74 6f 20 69 6e  don't need to in
1ac60 63 6c 75 64 65 20 74 77 6f 20 70 61 67 65 73 20  clude two pages 
1ac70 6f 66 20 6c 65 67 61 6c 65 73 65 0a 20 2a 20 77  of legalese. * w
1ac80 69 74 68 20 65 76 65 72 79 20 63 6f 70 79 2e 0a  ith every copy..
1ac90 20 2a 0a 20 2a 20 54 6f 20 63 6f 6d 70 75 74 65   *. * To compute
1aca0 20 74 68 65 20 6d 65 73 73 61 67 65 20 64 69 67   the message dig
1acb0 65 73 74 20 6f 66 20 61 20 63 68 75 6e 6b 20 6f  est of a chunk o
1acc0 66 20 62 79 74 65 73 2c 20 64 65 63 6c 61 72 65  f bytes, declare
1acd0 20 61 6e 0a 20 2a 20 4d 44 35 43 6f 6e 74 65 78   an. * MD5Contex
1ace0 74 20 73 74 72 75 63 74 75 72 65 2c 20 70 61 73  t structure, pas
1acf0 73 20 69 74 20 74 6f 20 4d 44 35 49 6e 69 74 2c  s it to MD5Init,
1ad00 20 63 61 6c 6c 20 4d 44 35 55 70 64 61 74 65 20   call MD5Update 
1ad10 61 73 0a 20 2a 20 6e 65 65 64 65 64 20 6f 6e 20  as. * needed on 
1ad20 62 75 66 66 65 72 73 20 66 75 6c 6c 20 6f 66 20  buffers full of 
1ad30 62 79 74 65 73 2c 20 61 6e 64 20 74 68 65 6e 20  bytes, and then 
1ad40 63 61 6c 6c 20 4d 44 35 46 69 6e 61 6c 2c 20 77  call MD5Final, w
1ad50 68 69 63 68 0a 20 2a 20 77 69 6c 6c 20 66 69 6c  hich. * will fil
1ad60 6c 20 61 20 73 75 70 70 6c 69 65 64 20 31 36 2d  l a supplied 16-
1ad70 62 79 74 65 20 61 72 72 61 79 20 77 69 74 68 20  byte array with 
1ad80 74 68 65 20 64 69 67 65 73 74 2e 0a 20 2a 2f 0a  the digest.. */.
1ad90 0a 2f 2a 0a 20 2a 20 49 66 20 63 6f 6d 70 69 6c  ./*. * If compil
1ada0 65 64 20 6f 6e 20 61 20 6d 61 63 68 69 6e 65 20  ed on a machine 
1adb0 74 68 61 74 20 64 6f 65 73 6e 27 74 20 68 61 76  that doesn't hav
1adc0 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  e a 32-bit integ
1add0 65 72 2c 0a 20 2a 20 79 6f 75 20 6a 75 73 74 20  er,. * you just 
1ade0 73 65 74 20 22 75 69 6e 74 33 32 22 20 74 6f 20  set "uint32" to 
1adf0 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
1ae00 64 61 74 61 74 79 70 65 20 66 6f 72 20 61 6e 0a  datatype for an.
1ae10 20 2a 20 75 6e 73 69 67 6e 65 64 20 33 32 2d 62   * unsigned 32-b
1ae20 69 74 20 69 6e 74 65 67 65 72 2e 20 20 46 6f 72  it integer.  For
1ae30 20 65 78 61 6d 70 6c 65 3a 0a 20 2a 0a 20 2a 20   example:. *. * 
1ae40 20 20 20 20 20 20 63 63 20 2d 44 75 69 6e 74 33        cc -Duint3
1ae50 32 3d 27 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  2='unsigned long
1ae60 27 20 6d 64 35 2e 63 0a 20 2a 0a 20 2a 2f 0a 23  ' md5.c. *. */.#
1ae70 69 66 6e 64 65 66 20 75 69 6e 74 33 32 0a 23 20  ifndef uint32.# 
1ae80 20 64 65 66 69 6e 65 20 75 69 6e 74 33 32 20 75   define uint32 u
1ae90 6e 73 69 67 6e 65 64 20 69 6e 74 0a 23 65 6e 64  nsigned int.#end
1aea0 69 66 0a 0a 73 74 72 75 63 74 20 4d 44 35 43 6f  if..struct MD5Co
1aeb0 6e 74 65 78 74 20 7b 0a 20 20 69 6e 74 20 69 73  ntext {.  int is
1aec0 49 6e 69 74 3b 0a 20 20 75 69 6e 74 33 32 20 62  Init;.  uint32 b
1aed0 75 66 5b 34 5d 3b 0a 20 20 75 69 6e 74 33 32 20  uf[4];.  uint32 
1aee0 62 69 74 73 5b 32 5d 3b 0a 20 20 75 6e 73 69 67  bits[2];.  unsig
1aef0 6e 65 64 20 63 68 61 72 20 69 6e 5b 36 34 5d 3b  ned char in[64];
1af00 0a 7d 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  .};.typedef stru
1af10 63 74 20 4d 44 35 43 6f 6e 74 65 78 74 20 4d 44  ct MD5Context MD
1af20 35 43 6f 6e 74 65 78 74 3b 0a 0a 2f 2a 0a 20 2a  5Context;../*. *
1af30 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 6f 64 65   Note: this code
1af40 20 69 73 20 68 61 72 6d 6c 65 73 73 20 6f 6e 20   is harmless on 
1af50 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e 20 6d 61  little-endian ma
1af60 63 68 69 6e 65 73 2e 0a 20 2a 2f 0a 73 74 61 74  chines.. */.stat
1af70 69 63 20 76 6f 69 64 20 62 79 74 65 52 65 76 65  ic void byteReve
1af80 72 73 65 20 28 75 6e 73 69 67 6e 65 64 20 63 68  rse (unsigned ch
1af90 61 72 20 2a 62 75 66 2c 20 75 6e 73 69 67 6e 65  ar *buf, unsigne
1afa0 64 20 6c 6f 6e 67 73 29 7b 0a 20 20 20 20 20 20  d longs){.      
1afb0 20 20 75 69 6e 74 33 32 20 74 3b 0a 20 20 20 20    uint32 t;.    
1afc0 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20      do {.       
1afd0 20 20 20 20 20 20 20 20 20 74 20 3d 20 28 75 69           t = (ui
1afe0 6e 74 33 32 29 28 28 75 6e 73 69 67 6e 65 64 29  nt32)((unsigned)
1aff0 62 75 66 5b 33 5d 3c 3c 38 20 7c 20 62 75 66 5b  buf[3]<<8 | buf[
1b000 32 5d 29 20 3c 3c 20 31 36 20 7c 0a 20 20 20 20  2]) << 16 |.    
1b010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b020 20 20 20 20 20 20 20 20 28 28 75 6e 73 69 67 6e          ((unsign
1b030 65 64 29 62 75 66 5b 31 5d 3c 3c 38 20 7c 20 62  ed)buf[1]<<8 | b
1b040 75 66 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20  uf[0]);.        
1b050 20 20 20 20 20 20 20 20 2a 28 75 69 6e 74 33 32          *(uint32
1b060 20 2a 29 62 75 66 20 3d 20 74 3b 0a 20 20 20 20   *)buf = t;.    
1b070 20 20 20 20 20 20 20 20 20 20 20 20 62 75 66 20              buf 
1b080 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d 20  += 4;.        } 
1b090 77 68 69 6c 65 20 28 2d 2d 6c 6f 6e 67 73 29 3b  while (--longs);
1b0a0 0a 7d 0a 2f 2a 20 54 68 65 20 66 6f 75 72 20 63  .}./* The four c
1b0b0 6f 72 65 20 66 75 6e 63 74 69 6f 6e 73 20 2d 20  ore functions - 
1b0c0 46 31 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 20  F1 is optimized 
1b0d0 73 6f 6d 65 77 68 61 74 20 2a 2f 0a 0a 2f 2a 20  somewhat */../* 
1b0e0 23 64 65 66 69 6e 65 20 46 31 28 78 2c 20 79 2c  #define F1(x, y,
1b0f0 20 7a 29 20 28 78 20 26 20 79 20 7c 20 7e 78 20   z) (x & y | ~x 
1b100 26 20 7a 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20  & z) */.#define 
1b110 46 31 28 78 2c 20 79 2c 20 7a 29 20 28 7a 20 5e  F1(x, y, z) (z ^
1b120 20 28 78 20 26 20 28 79 20 5e 20 7a 29 29 29 0a   (x & (y ^ z))).
1b130 23 64 65 66 69 6e 65 20 46 32 28 78 2c 20 79 2c  #define F2(x, y,
1b140 20 7a 29 20 46 31 28 7a 2c 20 78 2c 20 79 29 0a   z) F1(z, x, y).
1b150 23 64 65 66 69 6e 65 20 46 33 28 78 2c 20 79 2c  #define F3(x, y,
1b160 20 7a 29 20 28 78 20 5e 20 79 20 5e 20 7a 29 0a   z) (x ^ y ^ z).
1b170 23 64 65 66 69 6e 65 20 46 34 28 78 2c 20 79 2c  #define F4(x, y,
1b180 20 7a 29 20 28 79 20 5e 20 28 78 20 7c 20 7e 7a   z) (y ^ (x | ~z
1b190 29 29 0a 0a 2f 2a 20 54 68 69 73 20 69 73 20 74  ))../* This is t
1b1a0 68 65 20 63 65 6e 74 72 61 6c 20 73 74 65 70 20  he central step 
1b1b0 69 6e 20 74 68 65 20 4d 44 35 20 61 6c 67 6f 72  in the MD5 algor
1b1c0 69 74 68 6d 2e 20 2a 2f 0a 23 64 65 66 69 6e 65  ithm. */.#define
1b1d0 20 4d 44 35 53 54 45 50 28 66 2c 20 77 2c 20 78   MD5STEP(f, w, x
1b1e0 2c 20 79 2c 20 7a 2c 20 64 61 74 61 2c 20 73 29  , y, z, data, s)
1b1f0 20 5c 0a 20 20 20 20 20 20 20 20 28 20 77 20 2b   \.        ( w +
1b200 3d 20 66 28 78 2c 20 79 2c 20 7a 29 20 2b 20 64  = f(x, y, z) + d
1b210 61 74 61 2c 20 20 77 20 3d 20 77 3c 3c 73 20 7c  ata,  w = w<<s |
1b220 20 77 3e 3e 28 33 32 2d 73 29 2c 20 20 77 20 2b   w>>(32-s),  w +
1b230 3d 20 78 20 29 0a 0a 2f 2a 0a 20 2a 20 54 68 65  = x )../*. * The
1b240 20 63 6f 72 65 20 6f 66 20 74 68 65 20 4d 44 35   core of the MD5
1b250 20 61 6c 67 6f 72 69 74 68 6d 2c 20 74 68 69 73   algorithm, this
1b260 20 61 6c 74 65 72 73 20 61 6e 20 65 78 69 73 74   alters an exist
1b270 69 6e 67 20 4d 44 35 20 68 61 73 68 20 74 6f 0a  ing MD5 hash to.
1b280 20 2a 20 72 65 66 6c 65 63 74 20 74 68 65 20 61   * reflect the a
1b290 64 64 69 74 69 6f 6e 20 6f 66 20 31 36 20 6c 6f  ddition of 16 lo
1b2a0 6e 67 77 6f 72 64 73 20 6f 66 20 6e 65 77 20 64  ngwords of new d
1b2b0 61 74 61 2e 20 20 4d 44 35 55 70 64 61 74 65 20  ata.  MD5Update 
1b2c0 62 6c 6f 63 6b 73 0a 20 2a 20 74 68 65 20 64 61  blocks. * the da
1b2d0 74 61 20 61 6e 64 20 63 6f 6e 76 65 72 74 73 20  ta and converts 
1b2e0 62 79 74 65 73 20 69 6e 74 6f 20 6c 6f 6e 67 77  bytes into longw
1b2f0 6f 72 64 73 20 66 6f 72 20 74 68 69 73 20 72 6f  ords for this ro
1b300 75 74 69 6e 65 2e 0a 20 2a 2f 0a 73 74 61 74 69  utine.. */.stati
1b310 63 20 76 6f 69 64 20 4d 44 35 54 72 61 6e 73 66  c void MD5Transf
1b320 6f 72 6d 28 75 69 6e 74 33 32 20 62 75 66 5b 34  orm(uint32 buf[4
1b330 5d 2c 20 63 6f 6e 73 74 20 75 69 6e 74 33 32 20  ], const uint32 
1b340 69 6e 5b 31 36 5d 29 7b 0a 20 20 20 20 20 20 20  in[16]){.       
1b350 20 72 65 67 69 73 74 65 72 20 75 69 6e 74 33 32   register uint32
1b360 20 61 2c 20 62 2c 20 63 2c 20 64 3b 0a 0a 20 20   a, b, c, d;..  
1b370 20 20 20 20 20 20 61 20 3d 20 62 75 66 5b 30 5d        a = buf[0]
1b380 3b 0a 20 20 20 20 20 20 20 20 62 20 3d 20 62 75  ;.        b = bu
1b390 66 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 63 20  f[1];.        c 
1b3a0 3d 20 62 75 66 5b 32 5d 3b 0a 20 20 20 20 20 20  = buf[2];.      
1b3b0 20 20 64 20 3d 20 62 75 66 5b 33 5d 3b 0a 0a 20    d = buf[3];.. 
1b3c0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
1b3d0 31 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69  1, a, b, c, d, i
1b3e0 6e 5b 20 30 5d 2b 30 78 64 37 36 61 61 34 37 38  n[ 0]+0xd76aa478
1b3f0 2c 20 20 37 29 3b 0a 20 20 20 20 20 20 20 20 4d  ,  7);.        M
1b400 44 35 53 54 45 50 28 46 31 2c 20 64 2c 20 61 2c  D5STEP(F1, d, a,
1b410 20 62 2c 20 63 2c 20 69 6e 5b 20 31 5d 2b 30 78   b, c, in[ 1]+0x
1b420 65 38 63 37 62 37 35 36 2c 20 31 32 29 3b 0a 20  e8c7b756, 12);. 
1b430 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
1b440 31 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69  1, c, d, a, b, i
1b450 6e 5b 20 32 5d 2b 30 78 32 34 32 30 37 30 64 62  n[ 2]+0x242070db
1b460 2c 20 31 37 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 17);.        M
1b470 44 35 53 54 45 50 28 46 31 2c 20 62 2c 20 63 2c  D5STEP(F1, b, c,
1b480 20 64 2c 20 61 2c 20 69 6e 5b 20 33 5d 2b 30 78   d, a, in[ 3]+0x
1b490 63 31 62 64 63 65 65 65 2c 20 32 32 29 3b 0a 20  c1bdceee, 22);. 
1b4a0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
1b4b0 31 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69  1, a, b, c, d, i
1b4c0 6e 5b 20 34 5d 2b 30 78 66 35 37 63 30 66 61 66  n[ 4]+0xf57c0faf
1b4d0 2c 20 20 37 29 3b 0a 20 20 20 20 20 20 20 20 4d  ,  7);.        M
1b4e0 44 35 53 54 45 50 28 46 31 2c 20 64 2c 20 61 2c  D5STEP(F1, d, a,
1b4f0 20 62 2c 20 63 2c 20 69 6e 5b 20 35 5d 2b 30 78   b, c, in[ 5]+0x
1b500 34 37 38 37 63 36 32 61 2c 20 31 32 29 3b 0a 20  4787c62a, 12);. 
1b510 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
1b520 31 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69  1, c, d, a, b, i
1b530 6e 5b 20 36 5d 2b 30 78 61 38 33 30 34 36 31 33  n[ 6]+0xa8304613
1b540 2c 20 31 37 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 17);.        M
1b550 44 35 53 54 45 50 28 46 31 2c 20 62 2c 20 63 2c  D5STEP(F1, b, c,
1b560 20 64 2c 20 61 2c 20 69 6e 5b 20 37 5d 2b 30 78   d, a, in[ 7]+0x
1b570 66 64 34 36 39 35 30 31 2c 20 32 32 29 3b 0a 20  fd469501, 22);. 
1b580 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
1b590 31 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69  1, a, b, c, d, i
1b5a0 6e 5b 20 38 5d 2b 30 78 36 39 38 30 39 38 64 38  n[ 8]+0x698098d8
1b5b0 2c 20 20 37 29 3b 0a 20 20 20 20 20 20 20 20 4d  ,  7);.        M
1b5c0 44 35 53 54 45 50 28 46 31 2c 20 64 2c 20 61 2c  D5STEP(F1, d, a,
1b5d0 20 62 2c 20 63 2c 20 69 6e 5b 20 39 5d 2b 30 78   b, c, in[ 9]+0x
1b5e0 38 62 34 34 66 37 61 66 2c 20 31 32 29 3b 0a 20  8b44f7af, 12);. 
1b5f0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
1b600 31 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69  1, c, d, a, b, i
1b610 6e 5b 31 30 5d 2b 30 78 66 66 66 66 35 62 62 31  n[10]+0xffff5bb1
1b620 2c 20 31 37 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 17);.        M
1b630 44 35 53 54 45 50 28 46 31 2c 20 62 2c 20 63 2c  D5STEP(F1, b, c,
1b640 20 64 2c 20 61 2c 20 69 6e 5b 31 31 5d 2b 30 78   d, a, in[11]+0x
1b650 38 39 35 63 64 37 62 65 2c 20 32 32 29 3b 0a 20  895cd7be, 22);. 
1b660 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
1b670 31 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69  1, a, b, c, d, i
1b680 6e 5b 31 32 5d 2b 30 78 36 62 39 30 31 31 32 32  n[12]+0x6b901122
1b690 2c 20 20 37 29 3b 0a 20 20 20 20 20 20 20 20 4d  ,  7);.        M
1b6a0 44 35 53 54 45 50 28 46 31 2c 20 64 2c 20 61 2c  D5STEP(F1, d, a,
1b6b0 20 62 2c 20 63 2c 20 69 6e 5b 31 33 5d 2b 30 78   b, c, in[13]+0x
1b6c0 66 64 39 38 37 31 39 33 2c 20 31 32 29 3b 0a 20  fd987193, 12);. 
1b6d0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
1b6e0 31 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69  1, c, d, a, b, i
1b6f0 6e 5b 31 34 5d 2b 30 78 61 36 37 39 34 33 38 65  n[14]+0xa679438e
1b700 2c 20 31 37 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 17);.        M
1b710 44 35 53 54 45 50 28 46 31 2c 20 62 2c 20 63 2c  D5STEP(F1, b, c,
1b720 20 64 2c 20 61 2c 20 69 6e 5b 31 35 5d 2b 30 78   d, a, in[15]+0x
1b730 34 39 62 34 30 38 32 31 2c 20 32 32 29 3b 0a 0a  49b40821, 22);..
1b740 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
1b750 46 32 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20  F2, a, b, c, d, 
1b760 69 6e 5b 20 31 5d 2b 30 78 66 36 31 65 32 35 36  in[ 1]+0xf61e256
1b770 32 2c 20 20 35 29 3b 0a 20 20 20 20 20 20 20 20  2,  5);.        
1b780 4d 44 35 53 54 45 50 28 46 32 2c 20 64 2c 20 61  MD5STEP(F2, d, a
1b790 2c 20 62 2c 20 63 2c 20 69 6e 5b 20 36 5d 2b 30  , b, c, in[ 6]+0
1b7a0 78 63 30 34 30 62 33 34 30 2c 20 20 39 29 3b 0a  xc040b340,  9);.
1b7b0 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
1b7c0 46 32 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20  F2, c, d, a, b, 
1b7d0 69 6e 5b 31 31 5d 2b 30 78 32 36 35 65 35 61 35  in[11]+0x265e5a5
1b7e0 31 2c 20 31 34 29 3b 0a 20 20 20 20 20 20 20 20  1, 14);.        
1b7f0 4d 44 35 53 54 45 50 28 46 32 2c 20 62 2c 20 63  MD5STEP(F2, b, c
1b800 2c 20 64 2c 20 61 2c 20 69 6e 5b 20 30 5d 2b 30  , d, a, in[ 0]+0
1b810 78 65 39 62 36 63 37 61 61 2c 20 32 30 29 3b 0a  xe9b6c7aa, 20);.
1b820 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
1b830 46 32 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20  F2, a, b, c, d, 
1b840 69 6e 5b 20 35 5d 2b 30 78 64 36 32 66 31 30 35  in[ 5]+0xd62f105
1b850 64 2c 20 20 35 29 3b 0a 20 20 20 20 20 20 20 20  d,  5);.        
1b860 4d 44 35 53 54 45 50 28 46 32 2c 20 64 2c 20 61  MD5STEP(F2, d, a
1b870 2c 20 62 2c 20 63 2c 20 69 6e 5b 31 30 5d 2b 30  , b, c, in[10]+0
1b880 78 30 32 34 34 31 34 35 33 2c 20 20 39 29 3b 0a  x02441453,  9);.
1b890 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
1b8a0 46 32 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20  F2, c, d, a, b, 
1b8b0 69 6e 5b 31 35 5d 2b 30 78 64 38 61 31 65 36 38  in[15]+0xd8a1e68
1b8c0 31 2c 20 31 34 29 3b 0a 20 20 20 20 20 20 20 20  1, 14);.        
1b8d0 4d 44 35 53 54 45 50 28 46 32 2c 20 62 2c 20 63  MD5STEP(F2, b, c
1b8e0 2c 20 64 2c 20 61 2c 20 69 6e 5b 20 34 5d 2b 30  , d, a, in[ 4]+0
1b8f0 78 65 37 64 33 66 62 63 38 2c 20 32 30 29 3b 0a  xe7d3fbc8, 20);.
1b900 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
1b910 46 32 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20  F2, a, b, c, d, 
1b920 69 6e 5b 20 39 5d 2b 30 78 32 31 65 31 63 64 65  in[ 9]+0x21e1cde
1b930 36 2c 20 20 35 29 3b 0a 20 20 20 20 20 20 20 20  6,  5);.        
1b940 4d 44 35 53 54 45 50 28 46 32 2c 20 64 2c 20 61  MD5STEP(F2, d, a
1b950 2c 20 62 2c 20 63 2c 20 69 6e 5b 31 34 5d 2b 30  , b, c, in[14]+0
1b960 78 63 33 33 37 30 37 64 36 2c 20 20 39 29 3b 0a  xc33707d6,  9);.
1b970 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
1b980 46 32 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20  F2, c, d, a, b, 
1b990 69 6e 5b 20 33 5d 2b 30 78 66 34 64 35 30 64 38  in[ 3]+0xf4d50d8
1b9a0 37 2c 20 31 34 29 3b 0a 20 20 20 20 20 20 20 20  7, 14);.        
1b9b0 4d 44 35 53 54 45 50 28 46 32 2c 20 62 2c 20 63  MD5STEP(F2, b, c
1b9c0 2c 20 64 2c 20 61 2c 20 69 6e 5b 20 38 5d 2b 30  , d, a, in[ 8]+0
1b9d0 78 34 35 35 61 31 34 65 64 2c 20 32 30 29 3b 0a  x455a14ed, 20);.
1b9e0 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
1b9f0 46 32 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20  F2, a, b, c, d, 
1ba00 69 6e 5b 31 33 5d 2b 30 78 61 39 65 33 65 39 30  in[13]+0xa9e3e90
1ba10 35 2c 20 20 35 29 3b 0a 20 20 20 20 20 20 20 20  5,  5);.        
1ba20 4d 44 35 53 54 45 50 28 46 32 2c 20 64 2c 20 61  MD5STEP(F2, d, a
1ba30 2c 20 62 2c 20 63 2c 20 69 6e 5b 20 32 5d 2b 30  , b, c, in[ 2]+0
1ba40 78 66 63 65 66 61 33 66 38 2c 20 20 39 29 3b 0a  xfcefa3f8,  9);.
1ba50 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
1ba60 46 32 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20  F2, c, d, a, b, 
1ba70 69 6e 5b 20 37 5d 2b 30 78 36 37 36 66 30 32 64  in[ 7]+0x676f02d
1ba80 39 2c 20 31 34 29 3b 0a 20 20 20 20 20 20 20 20  9, 14);.        
1ba90 4d 44 35 53 54 45 50 28 46 32 2c 20 62 2c 20 63  MD5STEP(F2, b, c
1baa0 2c 20 64 2c 20 61 2c 20 69 6e 5b 31 32 5d 2b 30  , d, a, in[12]+0
1bab0 78 38 64 32 61 34 63 38 61 2c 20 32 30 29 3b 0a  x8d2a4c8a, 20);.
1bac0 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1bad0 28 46 33 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c  (F3, a, b, c, d,
1bae0 20 69 6e 5b 20 35 5d 2b 30 78 66 66 66 61 33 39   in[ 5]+0xfffa39
1baf0 34 32 2c 20 20 34 29 3b 0a 20 20 20 20 20 20 20  42,  4);.       
1bb00 20 4d 44 35 53 54 45 50 28 46 33 2c 20 64 2c 20   MD5STEP(F3, d, 
1bb10 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20 38 5d 2b  a, b, c, in[ 8]+
1bb20 30 78 38 37 37 31 66 36 38 31 2c 20 31 31 29 3b  0x8771f681, 11);
1bb30 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1bb40 28 46 33 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c  (F3, c, d, a, b,
1bb50 20 69 6e 5b 31 31 5d 2b 30 78 36 64 39 64 36 31   in[11]+0x6d9d61
1bb60 32 32 2c 20 31 36 29 3b 0a 20 20 20 20 20 20 20  22, 16);.       
1bb70 20 4d 44 35 53 54 45 50 28 46 33 2c 20 62 2c 20   MD5STEP(F3, b, 
1bb80 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 31 34 5d 2b  c, d, a, in[14]+
1bb90 30 78 66 64 65 35 33 38 30 63 2c 20 32 33 29 3b  0xfde5380c, 23);
1bba0 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1bbb0 28 46 33 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c  (F3, a, b, c, d,
1bbc0 20 69 6e 5b 20 31 5d 2b 30 78 61 34 62 65 65 61   in[ 1]+0xa4beea
1bbd0 34 34 2c 20 20 34 29 3b 0a 20 20 20 20 20 20 20  44,  4);.       
1bbe0 20 4d 44 35 53 54 45 50 28 46 33 2c 20 64 2c 20   MD5STEP(F3, d, 
1bbf0 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20 34 5d 2b  a, b, c, in[ 4]+
1bc00 30 78 34 62 64 65 63 66 61 39 2c 20 31 31 29 3b  0x4bdecfa9, 11);
1bc10 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1bc20 28 46 33 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c  (F3, c, d, a, b,
1bc30 20 69 6e 5b 20 37 5d 2b 30 78 66 36 62 62 34 62   in[ 7]+0xf6bb4b
1bc40 36 30 2c 20 31 36 29 3b 0a 20 20 20 20 20 20 20  60, 16);.       
1bc50 20 4d 44 35 53 54 45 50 28 46 33 2c 20 62 2c 20   MD5STEP(F3, b, 
1bc60 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 31 30 5d 2b  c, d, a, in[10]+
1bc70 30 78 62 65 62 66 62 63 37 30 2c 20 32 33 29 3b  0xbebfbc70, 23);
1bc80 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1bc90 28 46 33 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c  (F3, a, b, c, d,
1bca0 20 69 6e 5b 31 33 5d 2b 30 78 32 38 39 62 37 65   in[13]+0x289b7e
1bcb0 63 36 2c 20 20 34 29 3b 0a 20 20 20 20 20 20 20  c6,  4);.       
1bcc0 20 4d 44 35 53 54 45 50 28 46 33 2c 20 64 2c 20   MD5STEP(F3, d, 
1bcd0 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20 30 5d 2b  a, b, c, in[ 0]+
1bce0 30 78 65 61 61 31 32 37 66 61 2c 20 31 31 29 3b  0xeaa127fa, 11);
1bcf0 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1bd00 28 46 33 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c  (F3, c, d, a, b,
1bd10 20 69 6e 5b 20 33 5d 2b 30 78 64 34 65 66 33 30   in[ 3]+0xd4ef30
1bd20 38 35 2c 20 31 36 29 3b 0a 20 20 20 20 20 20 20  85, 16);.       
1bd30 20 4d 44 35 53 54 45 50 28 46 33 2c 20 62 2c 20   MD5STEP(F3, b, 
1bd40 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 20 36 5d 2b  c, d, a, in[ 6]+
1bd50 30 78 30 34 38 38 31 64 30 35 2c 20 32 33 29 3b  0x04881d05, 23);
1bd60 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1bd70 28 46 33 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c  (F3, a, b, c, d,
1bd80 20 69 6e 5b 20 39 5d 2b 30 78 64 39 64 34 64 30   in[ 9]+0xd9d4d0
1bd90 33 39 2c 20 20 34 29 3b 0a 20 20 20 20 20 20 20  39,  4);.       
1bda0 20 4d 44 35 53 54 45 50 28 46 33 2c 20 64 2c 20   MD5STEP(F3, d, 
1bdb0 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 31 32 5d 2b  a, b, c, in[12]+
1bdc0 30 78 65 36 64 62 39 39 65 35 2c 20 31 31 29 3b  0xe6db99e5, 11);
1bdd0 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1bde0 28 46 33 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c  (F3, c, d, a, b,
1bdf0 20 69 6e 5b 31 35 5d 2b 30 78 31 66 61 32 37 63   in[15]+0x1fa27c
1be00 66 38 2c 20 31 36 29 3b 0a 20 20 20 20 20 20 20  f8, 16);.       
1be10 20 4d 44 35 53 54 45 50 28 46 33 2c 20 62 2c 20   MD5STEP(F3, b, 
1be20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 20 32 5d 2b  c, d, a, in[ 2]+
1be30 30 78 63 34 61 63 35 36 36 35 2c 20 32 33 29 3b  0xc4ac5665, 23);
1be40 0a 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ..        MD5STE
1be50 50 28 46 34 2c 20 61 2c 20 62 2c 20 63 2c 20 64  P(F4, a, b, c, d
1be60 2c 20 69 6e 5b 20 30 5d 2b 30 78 66 34 32 39 32  , in[ 0]+0xf4292
1be70 32 34 34 2c 20 20 36 29 3b 0a 20 20 20 20 20 20  244,  6);.      
1be80 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 64 2c    MD5STEP(F4, d,
1be90 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20 37 5d   a, b, c, in[ 7]
1bea0 2b 30 78 34 33 32 61 66 66 39 37 2c 20 31 30 29  +0x432aff97, 10)
1beb0 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
1bec0 50 28 46 34 2c 20 63 2c 20 64 2c 20 61 2c 20 62  P(F4, c, d, a, b
1bed0 2c 20 69 6e 5b 31 34 5d 2b 30 78 61 62 39 34 32  , in[14]+0xab942
1bee0 33 61 37 2c 20 31 35 29 3b 0a 20 20 20 20 20 20  3a7, 15);.      
1bef0 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 62 2c    MD5STEP(F4, b,
1bf00 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 20 35 5d   c, d, a, in[ 5]
1bf10 2b 30 78 66 63 39 33 61 30 33 39 2c 20 32 31 29  +0xfc93a039, 21)
1bf20 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
1bf30 50 28 46 34 2c 20 61 2c 20 62 2c 20 63 2c 20 64  P(F4, a, b, c, d
1bf40 2c 20 69 6e 5b 31 32 5d 2b 30 78 36 35 35 62 35  , in[12]+0x655b5
1bf50 39 63 33 2c 20 20 36 29 3b 0a 20 20 20 20 20 20  9c3,  6);.      
1bf60 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 64 2c    MD5STEP(F4, d,
1bf70 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20 33 5d   a, b, c, in[ 3]
1bf80 2b 30 78 38 66 30 63 63 63 39 32 2c 20 31 30 29  +0x8f0ccc92, 10)
1bf90 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
1bfa0 50 28 46 34 2c 20 63 2c 20 64 2c 20 61 2c 20 62  P(F4, c, d, a, b
1bfb0 2c 20 69 6e 5b 31 30 5d 2b 30 78 66 66 65 66 66  , in[10]+0xffeff
1bfc0 34 37 64 2c 20 31 35 29 3b 0a 20 20 20 20 20 20  47d, 15);.      
1bfd0 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 62 2c    MD5STEP(F4, b,
1bfe0 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 20 31 5d   c, d, a, in[ 1]
1bff0 2b 30 78 38 35 38 34 35 64 64 31 2c 20 32 31 29  +0x85845dd1, 21)
1c000 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
1c010 50 28 46 34 2c 20 61 2c 20 62 2c 20 63 2c 20 64  P(F4, a, b, c, d
1c020 2c 20 69 6e 5b 20 38 5d 2b 30 78 36 66 61 38 37  , in[ 8]+0x6fa87
1c030 65 34 66 2c 20 20 36 29 3b 0a 20 20 20 20 20 20  e4f,  6);.      
1c040 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 64 2c    MD5STEP(F4, d,
1c050 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 31 35 5d   a, b, c, in[15]
1c060 2b 30 78 66 65 32 63 65 36 65 30 2c 20 31 30 29  +0xfe2ce6e0, 10)
1c070 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
1c080 50 28 46 34 2c 20 63 2c 20 64 2c 20 61 2c 20 62  P(F4, c, d, a, b
1c090 2c 20 69 6e 5b 20 36 5d 2b 30 78 61 33 30 31 34  , in[ 6]+0xa3014
1c0a0 33 31 34 2c 20 31 35 29 3b 0a 20 20 20 20 20 20  314, 15);.      
1c0b0 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 62 2c    MD5STEP(F4, b,
1c0c0 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 31 33 5d   c, d, a, in[13]
1c0d0 2b 30 78 34 65 30 38 31 31 61 31 2c 20 32 31 29  +0x4e0811a1, 21)
1c0e0 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
1c0f0 50 28 46 34 2c 20 61 2c 20 62 2c 20 63 2c 20 64  P(F4, a, b, c, d
1c100 2c 20 69 6e 5b 20 34 5d 2b 30 78 66 37 35 33 37  , in[ 4]+0xf7537
1c110 65 38 32 2c 20 20 36 29 3b 0a 20 20 20 20 20 20  e82,  6);.      
1c120 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 64 2c    MD5STEP(F4, d,
1c130 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 31 31 5d   a, b, c, in[11]
1c140 2b 30 78 62 64 33 61 66 32 33 35 2c 20 31 30 29  +0xbd3af235, 10)
1c150 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
1c160 50 28 46 34 2c 20 63 2c 20 64 2c 20 61 2c 20 62  P(F4, c, d, a, b
1c170 2c 20 69 6e 5b 20 32 5d 2b 30 78 32 61 64 37 64  , in[ 2]+0x2ad7d
1c180 32 62 62 2c 20 31 35 29 3b 0a 20 20 20 20 20 20  2bb, 15);.      
1c190 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 62 2c    MD5STEP(F4, b,
1c1a0 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 20 39 5d   c, d, a, in[ 9]
1c1b0 2b 30 78 65 62 38 36 64 33 39 31 2c 20 32 31 29  +0xeb86d391, 21)
1c1c0 3b 0a 0a 20 20 20 20 20 20 20 20 62 75 66 5b 30  ;..        buf[0
1c1d0 5d 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 20 20  ] += a;.        
1c1e0 62 75 66 5b 31 5d 20 2b 3d 20 62 3b 0a 20 20 20  buf[1] += b;.   
1c1f0 20 20 20 20 20 62 75 66 5b 32 5d 20 2b 3d 20 63       buf[2] += c
1c200 3b 0a 20 20 20 20 20 20 20 20 62 75 66 5b 33 5d  ;.        buf[3]
1c210 20 2b 3d 20 64 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20   += d;.}../*. * 
1c220 53 74 61 72 74 20 4d 44 35 20 61 63 63 75 6d 75  Start MD5 accumu
1c230 6c 61 74 69 6f 6e 2e 20 20 53 65 74 20 62 69 74  lation.  Set bit
1c240 20 63 6f 75 6e 74 20 74 6f 20 30 20 61 6e 64 20   count to 0 and 
1c250 62 75 66 66 65 72 20 74 6f 20 6d 79 73 74 65 72  buffer to myster
1c260 69 6f 75 73 0a 20 2a 20 69 6e 69 74 69 61 6c 69  ious. * initiali
1c270 7a 61 74 69 6f 6e 20 63 6f 6e 73 74 61 6e 74 73  zation constants
1c280 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  .. */.static voi
1c290 64 20 4d 44 35 49 6e 69 74 28 4d 44 35 43 6f 6e  d MD5Init(MD5Con
1c2a0 74 65 78 74 20 2a 63 74 78 29 7b 0a 20 20 20 20  text *ctx){.    
1c2b0 20 20 20 20 63 74 78 2d 3e 69 73 49 6e 69 74 20      ctx->isInit 
1c2c0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63 74 78  = 1;.        ctx
1c2d0 2d 3e 62 75 66 5b 30 5d 20 3d 20 30 78 36 37 34  ->buf[0] = 0x674
1c2e0 35 32 33 30 31 3b 0a 20 20 20 20 20 20 20 20 63  52301;.        c
1c2f0 74 78 2d 3e 62 75 66 5b 31 5d 20 3d 20 30 78 65  tx->buf[1] = 0xe
1c300 66 63 64 61 62 38 39 3b 0a 20 20 20 20 20 20 20  fcdab89;.       
1c310 20 63 74 78 2d 3e 62 75 66 5b 32 5d 20 3d 20 30   ctx->buf[2] = 0
1c320 78 39 38 62 61 64 63 66 65 3b 0a 20 20 20 20 20  x98badcfe;.     
1c330 20 20 20 63 74 78 2d 3e 62 75 66 5b 33 5d 20 3d     ctx->buf[3] =
1c340 20 30 78 31 30 33 32 35 34 37 36 3b 0a 20 20 20   0x10325476;.   
1c350 20 20 20 20 20 63 74 78 2d 3e 62 69 74 73 5b 30       ctx->bits[0
1c360 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63  ] = 0;.        c
1c370 74 78 2d 3e 62 69 74 73 5b 31 5d 20 3d 20 30 3b  tx->bits[1] = 0;
1c380 0a 7d 0a 0a 2f 2a 0a 20 2a 20 55 70 64 61 74 65  .}../*. * Update
1c390 20 63 6f 6e 74 65 78 74 20 74 6f 20 72 65 66 6c   context to refl
1c3a0 65 63 74 20 74 68 65 20 63 6f 6e 63 61 74 65 6e  ect the concaten
1c3b0 61 74 69 6f 6e 20 6f 66 20 61 6e 6f 74 68 65 72  ation of another
1c3c0 20 62 75 66 66 65 72 20 66 75 6c 6c 0a 20 2a 20   buffer full. * 
1c3d0 6f 66 20 62 79 74 65 73 2e 0a 20 2a 2f 0a 73 74  of bytes.. */.st
1c3e0 61 74 69 63 0a 76 6f 69 64 20 4d 44 35 55 70 64  atic.void MD5Upd
1c3f0 61 74 65 28 4d 44 35 43 6f 6e 74 65 78 74 20 2a  ate(MD5Context *
1c400 63 74 78 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67  ctx, const unsig
1c410 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20 75  ned char *buf, u
1c420 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 65 6e 29  nsigned int len)
1c430 7b 0a 20 20 20 20 20 20 20 20 75 69 6e 74 33 32  {.        uint32
1c440 20 74 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20   t;..        /* 
1c450 55 70 64 61 74 65 20 62 69 74 63 6f 75 6e 74 20  Update bitcount 
1c460 2a 2f 0a 0a 20 20 20 20 20 20 20 20 74 20 3d 20  */..        t = 
1c470 63 74 78 2d 3e 62 69 74 73 5b 30 5d 3b 0a 20 20  ctx->bits[0];.  
1c480 20 20 20 20 20 20 69 66 20 28 28 63 74 78 2d 3e        if ((ctx->
1c490 62 69 74 73 5b 30 5d 20 3d 20 74 20 2b 20 28 28  bits[0] = t + ((
1c4a0 75 69 6e 74 33 32 29 6c 65 6e 20 3c 3c 20 33 29  uint32)len << 3)
1c4b0 29 20 3c 20 74 29 0a 20 20 20 20 20 20 20 20 20  ) < t).         
1c4c0 20 20 20 20 20 20 20 63 74 78 2d 3e 62 69 74 73         ctx->bits
1c4d0 5b 31 5d 2b 2b 3b 20 2f 2a 20 43 61 72 72 79 20  [1]++; /* Carry 
1c4e0 66 72 6f 6d 20 6c 6f 77 20 74 6f 20 68 69 67 68  from low to high
1c4f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 74 78 2d   */.        ctx-
1c500 3e 62 69 74 73 5b 31 5d 20 2b 3d 20 6c 65 6e 20  >bits[1] += len 
1c510 3e 3e 20 32 39 3b 0a 0a 20 20 20 20 20 20 20 20  >> 29;..        
1c520 74 20 3d 20 28 74 20 3e 3e 20 33 29 20 26 20 30  t = (t >> 3) & 0
1c530 78 33 66 3b 20 20 20 20 2f 2a 20 42 79 74 65 73  x3f;    /* Bytes
1c540 20 61 6c 72 65 61 64 79 20 69 6e 20 73 68 73 49   already in shsI
1c550 6e 66 6f 2d 3e 64 61 74 61 20 2a 2f 0a 0a 20 20  nfo->data */..  
1c560 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20        /* Handle 
1c570 61 6e 79 20 6c 65 61 64 69 6e 67 20 6f 64 64 2d  any leading odd-
1c580 73 69 7a 65 64 20 63 68 75 6e 6b 73 20 2a 2f 0a  sized chunks */.
1c590 0a 20 20 20 20 20 20 20 20 69 66 20 28 20 74 20  .        if ( t 
1c5a0 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
1c5b0 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
1c5c0 72 20 2a 70 20 3d 20 28 75 6e 73 69 67 6e 65 64  r *p = (unsigned
1c5d0 20 63 68 61 72 20 2a 29 63 74 78 2d 3e 69 6e 20   char *)ctx->in 
1c5e0 2b 20 74 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  + t;..          
1c5f0 20 20 20 20 20 20 74 20 3d 20 36 34 2d 74 3b 0a        t = 64-t;.
1c600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c610 69 66 20 28 6c 65 6e 20 3c 20 74 29 20 7b 0a 20  if (len < t) {. 
1c620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c630 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 2c         memcpy(p,
1c640 20 62 75 66 2c 20 6c 65 6e 29 3b 0a 20 20 20 20   buf, len);.    
1c650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c660 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
1c670 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1c680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65                me
1c690 6d 63 70 79 28 70 2c 20 62 75 66 2c 20 74 29 3b  mcpy(p, buf, t);
1c6a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c6b0 20 62 79 74 65 52 65 76 65 72 73 65 28 63 74 78   byteReverse(ctx
1c6c0 2d 3e 69 6e 2c 20 31 36 29 3b 0a 20 20 20 20 20  ->in, 16);.     
1c6d0 20 20 20 20 20 20 20 20 20 20 20 4d 44 35 54 72             MD5Tr
1c6e0 61 6e 73 66 6f 72 6d 28 63 74 78 2d 3e 62 75 66  ansform(ctx->buf
1c6f0 2c 20 28 75 69 6e 74 33 32 20 2a 29 63 74 78 2d  , (uint32 *)ctx-
1c700 3e 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  >in);.          
1c710 20 20 20 20 20 20 62 75 66 20 2b 3d 20 74 3b 0a        buf += t;.
1c720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c730 6c 65 6e 20 2d 3d 20 74 3b 0a 20 20 20 20 20 20  len -= t;.      
1c740 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
1c750 50 72 6f 63 65 73 73 20 64 61 74 61 20 69 6e 20  Process data in 
1c760 36 34 2d 62 79 74 65 20 63 68 75 6e 6b 73 20 2a  64-byte chunks *
1c770 2f 0a 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  /..        while
1c780 20 28 6c 65 6e 20 3e 3d 20 36 34 29 20 7b 0a 20   (len >= 64) {. 
1c790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
1c7a0 65 6d 63 70 79 28 63 74 78 2d 3e 69 6e 2c 20 62  emcpy(ctx->in, b
1c7b0 75 66 2c 20 36 34 29 3b 0a 20 20 20 20 20 20 20  uf, 64);.       
1c7c0 20 20 20 20 20 20 20 20 20 62 79 74 65 52 65 76           byteRev
1c7d0 65 72 73 65 28 63 74 78 2d 3e 69 6e 2c 20 31 36  erse(ctx->in, 16
1c7e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1c7f0 20 20 20 4d 44 35 54 72 61 6e 73 66 6f 72 6d 28     MD5Transform(
1c800 63 74 78 2d 3e 62 75 66 2c 20 28 75 69 6e 74 33  ctx->buf, (uint3
1c810 32 20 2a 29 63 74 78 2d 3e 69 6e 29 3b 0a 20 20  2 *)ctx->in);.  
1c820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 75                bu
1c830 66 20 2b 3d 20 36 34 3b 0a 20 20 20 20 20 20 20  f += 64;.       
1c840 20 20 20 20 20 20 20 20 20 6c 65 6e 20 2d 3d 20           len -= 
1c850 36 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  64;.        }.. 
1c860 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65         /* Handle
1c870 20 61 6e 79 20 72 65 6d 61 69 6e 69 6e 67 20 62   any remaining b
1c880 79 74 65 73 20 6f 66 20 64 61 74 61 2e 20 2a 2f  ytes of data. */
1c890 0a 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ..        memcpy
1c8a0 28 63 74 78 2d 3e 69 6e 2c 20 62 75 66 2c 20 6c  (ctx->in, buf, l
1c8b0 65 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 46 69  en);.}../*. * Fi
1c8c0 6e 61 6c 20 77 72 61 70 75 70 20 2d 20 70 61 64  nal wrapup - pad
1c8d0 20 74 6f 20 36 34 2d 62 79 74 65 20 62 6f 75 6e   to 64-byte boun
1c8e0 64 61 72 79 20 77 69 74 68 20 74 68 65 20 62 69  dary with the bi
1c8f0 74 20 70 61 74 74 65 72 6e 0a 20 2a 20 31 20 30  t pattern. * 1 0
1c900 2a 20 28 36 34 2d 62 69 74 20 63 6f 75 6e 74 20  * (64-bit count 
1c910 6f 66 20 62 69 74 73 20 70 72 6f 63 65 73 73 65  of bits processe
1c920 64 2c 20 4d 53 42 2d 66 69 72 73 74 29 0a 20 2a  d, MSB-first). *
1c930 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 4d 44  /.static void MD
1c940 35 46 69 6e 61 6c 28 75 6e 73 69 67 6e 65 64 20  5Final(unsigned 
1c950 63 68 61 72 20 64 69 67 65 73 74 5b 31 36 5d 2c  char digest[16],
1c960 20 4d 44 35 43 6f 6e 74 65 78 74 20 2a 63 74 78   MD5Context *ctx
1c970 29 7b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67  ){.        unsig
1c980 6e 65 64 20 63 6f 75 6e 74 3b 0a 20 20 20 20 20  ned count;.     
1c990 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
1c9a0 20 2a 70 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a   *p;..        /*
1c9b0 20 43 6f 6d 70 75 74 65 20 6e 75 6d 62 65 72 20   Compute number 
1c9c0 6f 66 20 62 79 74 65 73 20 6d 6f 64 20 36 34 20  of bytes mod 64 
1c9d0 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 75 6e 74  */.        count
1c9e0 20 3d 20 28 63 74 78 2d 3e 62 69 74 73 5b 30 5d   = (ctx->bits[0]
1c9f0 20 3e 3e 20 33 29 20 26 20 30 78 33 46 3b 0a 0a   >> 3) & 0x3F;..
1ca00 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74          /* Set t
1ca10 68 65 20 66 69 72 73 74 20 63 68 61 72 20 6f 66  he first char of
1ca20 20 70 61 64 64 69 6e 67 20 74 6f 20 30 78 38 30   padding to 0x80
1ca30 2e 20 20 54 68 69 73 20 69 73 20 73 61 66 65 20  .  This is safe 
1ca40 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 0a 20  since there is. 
1ca50 20 20 20 20 20 20 20 20 20 20 61 6c 77 61 79 73            always
1ca60 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 62 79   at least one by
1ca70 74 65 20 66 72 65 65 20 2a 2f 0a 20 20 20 20 20  te free */.     
1ca80 20 20 20 70 20 3d 20 63 74 78 2d 3e 69 6e 20 2b     p = ctx->in +
1ca90 20 63 6f 75 6e 74 3b 0a 20 20 20 20 20 20 20 20   count;.        
1caa0 2a 70 2b 2b 20 3d 20 30 78 38 30 3b 0a 0a 20 20  *p++ = 0x80;..  
1cab0 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
1cac0 66 20 70 61 64 64 69 6e 67 20 6e 65 65 64 65 64  f padding needed
1cad0 20 74 6f 20 6d 61 6b 65 20 36 34 20 62 79 74 65   to make 64 byte
1cae0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 75  s */.        cou
1caf0 6e 74 20 3d 20 36 34 20 2d 20 31 20 2d 20 63 6f  nt = 64 - 1 - co
1cb00 75 6e 74 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  unt;..        /*
1cb10 20 50 61 64 20 6f 75 74 20 74 6f 20 35 36 20 6d   Pad out to 56 m
1cb20 6f 64 20 36 34 20 2a 2f 0a 20 20 20 20 20 20 20  od 64 */.       
1cb30 20 69 66 20 28 63 6f 75 6e 74 20 3c 20 38 29 20   if (count < 8) 
1cb40 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1cb50 20 20 2f 2a 20 54 77 6f 20 6c 6f 74 73 20 6f 66    /* Two lots of
1cb60 20 70 61 64 64 69 6e 67 3a 20 20 50 61 64 20 74   padding:  Pad t
1cb70 68 65 20 66 69 72 73 74 20 62 6c 6f 63 6b 20 74  he first block t
1cb80 6f 20 36 34 20 62 79 74 65 73 20 2a 2f 0a 20 20  o 64 bytes */.  
1cb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65                me
1cba0 6d 73 65 74 28 70 2c 20 30 2c 20 63 6f 75 6e 74  mset(p, 0, count
1cbb0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1cbc0 20 20 20 62 79 74 65 52 65 76 65 72 73 65 28 63     byteReverse(c
1cbd0 74 78 2d 3e 69 6e 2c 20 31 36 29 3b 0a 20 20 20  tx->in, 16);.   
1cbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 4d 44 35               MD5
1cbf0 54 72 61 6e 73 66 6f 72 6d 28 63 74 78 2d 3e 62  Transform(ctx->b
1cc00 75 66 2c 20 28 75 69 6e 74 33 32 20 2a 29 63 74  uf, (uint32 *)ct
1cc10 78 2d 3e 69 6e 29 3b 0a 0a 20 20 20 20 20 20 20  x->in);..       
1cc20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 77 20           /* Now 
1cc30 66 69 6c 6c 20 74 68 65 20 6e 65 78 74 20 62 6c  fill the next bl
1cc40 6f 63 6b 20 77 69 74 68 20 35 36 20 62 79 74 65  ock with 56 byte
1cc50 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  s */.           
1cc60 20 20 20 20 20 6d 65 6d 73 65 74 28 63 74 78 2d       memset(ctx-
1cc70 3e 69 6e 2c 20 30 2c 20 35 36 29 3b 0a 20 20 20  >in, 0, 56);.   
1cc80 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
1cc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1cca0 20 50 61 64 20 62 6c 6f 63 6b 20 74 6f 20 35 36   Pad block to 56
1ccb0 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20   bytes */.      
1ccc0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74            memset
1ccd0 28 70 2c 20 30 2c 20 63 6f 75 6e 74 2d 38 29 3b  (p, 0, count-8);
1cce0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1ccf0 20 20 20 62 79 74 65 52 65 76 65 72 73 65 28 63     byteReverse(c
1cd00 74 78 2d 3e 69 6e 2c 20 31 34 29 3b 0a 0a 20 20  tx->in, 14);..  
1cd10 20 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20        /* Append 
1cd20 6c 65 6e 67 74 68 20 69 6e 20 62 69 74 73 20 61  length in bits a
1cd30 6e 64 20 74 72 61 6e 73 66 6f 72 6d 20 2a 2f 0a  nd transform */.
1cd40 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 63          memcpy(c
1cd50 74 78 2d 3e 69 6e 20 2b 20 31 34 2a 34 2c 20 63  tx->in + 14*4, c
1cd60 74 78 2d 3e 62 69 74 73 2c 20 38 29 3b 0a 0a 20  tx->bits, 8);.. 
1cd70 20 20 20 20 20 20 20 4d 44 35 54 72 61 6e 73 66         MD5Transf
1cd80 6f 72 6d 28 63 74 78 2d 3e 62 75 66 2c 20 28 75  orm(ctx->buf, (u
1cd90 69 6e 74 33 32 20 2a 29 63 74 78 2d 3e 69 6e 29  int32 *)ctx->in)
1cda0 3b 0a 20 20 20 20 20 20 20 20 62 79 74 65 52 65  ;.        byteRe
1cdb0 76 65 72 73 65 28 28 75 6e 73 69 67 6e 65 64 20  verse((unsigned 
1cdc0 63 68 61 72 20 2a 29 63 74 78 2d 3e 62 75 66 2c  char *)ctx->buf,
1cdd0 20 34 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d   4);.        mem
1cde0 63 70 79 28 64 69 67 65 73 74 2c 20 63 74 78 2d  cpy(digest, ctx-
1cdf0 3e 62 75 66 2c 20 31 36 29 3b 0a 7d 0a 0a 2f 2a  >buf, 16);.}../*
1ce00 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 31 32  .** Convert a 12
1ce10 38 2d 62 69 74 20 4d 44 35 20 64 69 67 65 73 74  8-bit MD5 digest
1ce20 20 69 6e 74 6f 20 61 20 33 32 2d 64 69 67 69 74   into a 32-digit
1ce30 20 62 61 73 65 2d 31 36 20 6e 75 6d 62 65 72 2e   base-16 number.
1ce40 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1ce50 4d 44 35 44 69 67 65 73 74 54 6f 42 61 73 65 31  MD5DigestToBase1
1ce60 36 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  6(unsigned char 
1ce70 2a 64 69 67 65 73 74 2c 20 63 68 61 72 20 2a 7a  *digest, char *z
1ce80 42 75 66 29 7b 0a 20 20 73 74 61 74 69 63 20 63  Buf){.  static c
1ce90 68 61 72 20 63 6f 6e 73 74 20 7a 45 6e 63 6f 64  har const zEncod
1cea0 65 5b 5d 20 3d 20 22 30 31 32 33 34 35 36 37 38  e[] = "012345678
1ceb0 39 61 62 63 64 65 66 22 3b 0a 20 20 69 6e 74 20  9abcdef";.  int 
1cec0 69 2c 20 6a 3b 0a 0a 20 20 66 6f 72 28 6a 3d 69  i, j;..  for(j=i
1ced0 3d 30 3b 20 69 3c 31 36 3b 20 69 2b 2b 29 7b 0a  =0; i<16; i++){.
1cee0 20 20 20 20 69 6e 74 20 61 20 3d 20 64 69 67 65      int a = dige
1cef0 73 74 5b 69 5d 3b 0a 20 20 20 20 7a 42 75 66 5b  st[i];.    zBuf[
1cf00 6a 2b 2b 5d 20 3d 20 7a 45 6e 63 6f 64 65 5b 28  j++] = zEncode[(
1cf10 61 3e 3e 34 29 26 30 78 66 5d 3b 0a 20 20 20 20  a>>4)&0xf];.    
1cf20 7a 42 75 66 5b 6a 2b 2b 5d 20 3d 20 7a 45 6e 63  zBuf[j++] = zEnc
1cf30 6f 64 65 5b 61 20 26 20 30 78 66 5d 3b 0a 20 20  ode[a & 0xf];.  
1cf40 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b  }.  zBuf[j] = 0;
1cf50 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  .}.../*.** Conve
1cf60 72 74 20 61 20 31 32 38 2d 62 69 74 20 4d 44 35  rt a 128-bit MD5
1cf70 20 64 69 67 65 73 74 20 69 6e 74 6f 20 73 65 71   digest into seq
1cf80 75 65 6e 63 79 20 6f 66 20 65 69 67 68 74 20 35  uency of eight 5
1cf90 2d 64 69 67 69 74 20 69 6e 74 65 67 65 72 73 0a  -digit integers.
1cfa0 2a 2a 20 65 61 63 68 20 72 65 70 72 65 73 65 6e  ** each represen
1cfb0 74 69 6e 67 20 31 36 20 62 69 74 73 20 6f 66 20  ting 16 bits of 
1cfc0 74 68 65 20 64 69 67 65 73 74 20 61 6e 64 20 73  the digest and s
1cfd0 65 70 61 72 61 74 65 64 20 66 72 6f 6d 20 65 61  eparated from ea
1cfe0 63 68 0a 2a 2a 20 6f 74 68 65 72 20 62 79 20 61  ch.** other by a
1cff0 20 22 2d 22 20 63 68 61 72 61 63 74 65 72 2e 0a   "-" character..
1d000 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 4d  */.static void M
1d010 44 35 44 69 67 65 73 74 54 6f 42 61 73 65 31 30  D5DigestToBase10
1d020 78 38 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  x8(unsigned char
1d030 20 64 69 67 65 73 74 5b 31 36 5d 2c 20 63 68 61   digest[16], cha
1d040 72 20 7a 44 69 67 65 73 74 5b 35 30 5d 29 7b 0a  r zDigest[50]){.
1d050 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 75 6e    int i, j;.  un
1d060 73 69 67 6e 65 64 20 69 6e 74 20 78 3b 0a 20 20  signed int x;.  
1d070 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 31 36 3b  for(i=j=0; i<16;
1d080 20 69 2b 3d 32 29 7b 0a 20 20 20 20 78 20 3d 20   i+=2){.    x = 
1d090 64 69 67 65 73 74 5b 69 5d 2a 32 35 36 20 2b 20  digest[i]*256 + 
1d0a0 64 69 67 65 73 74 5b 69 2b 31 5d 3b 0a 20 20 20  digest[i+1];.   
1d0b0 20 69 66 28 20 69 3e 30 20 29 20 7a 44 69 67 65   if( i>0 ) zDige
1d0c0 73 74 5b 6a 2b 2b 5d 20 3d 20 27 2d 27 3b 0a 20  st[j++] = '-';. 
1d0d0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
1d0e0 6e 74 66 28 35 30 2d 6a 2c 20 26 7a 44 69 67 65  ntf(50-j, &zDige
1d0f0 73 74 5b 6a 5d 2c 20 22 25 30 35 75 22 2c 20 78  st[j], "%05u", x
1d100 29 3b 0a 20 20 20 20 6a 20 2b 3d 20 35 3b 0a 20  );.    j += 5;. 
1d110 20 7d 0a 20 20 7a 44 69 67 65 73 74 5b 6a 5d 20   }.  zDigest[j] 
1d120 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20  = 0;.}../*.** A 
1d130 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 66 6f 72 20  TCL command for 
1d140 6d 64 35 2e 20 20 54 68 65 20 61 72 67 75 6d 65  md5.  The argume
1d150 6e 74 20 69 73 20 74 68 65 20 74 65 78 74 20 74  nt is the text t
1d160 6f 20 62 65 20 68 61 73 68 65 64 2e 20 20 54 68  o be hashed.  Th
1d170 65 0a 2a 2a 20 52 65 73 75 6c 74 20 69 73 20 74  e.** Result is t
1d180 68 65 20 68 61 73 68 20 69 6e 20 62 61 73 65 36  he hash in base6
1d190 34 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  4..*/.static int
1d1a0 20 6d 64 35 5f 63 6d 64 28 76 6f 69 64 2a 63 64   md5_cmd(void*cd
1d1b0 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
1d1c0 74 65 72 70 2c 20 69 6e 74 20 61 72 67 63 2c 20  terp, int argc, 
1d1d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67  const char **arg
1d1e0 76 29 7b 0a 20 20 4d 44 35 43 6f 6e 74 65 78 74  v){.  MD5Context
1d1f0 20 63 74 78 3b 0a 20 20 75 6e 73 69 67 6e 65 64   ctx;.  unsigned
1d200 20 63 68 61 72 20 64 69 67 65 73 74 5b 31 36 5d   char digest[16]
1d210 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30  ;.  char zBuf[50
1d220 5d 3b 0a 20 20 76 6f 69 64 20 28 2a 63 6f 6e 76  ];.  void (*conv
1d230 65 72 74 65 72 29 28 75 6e 73 69 67 6e 65 64 20  erter)(unsigned 
1d240 63 68 61 72 2a 2c 20 63 68 61 72 2a 29 3b 0a 0a  char*, char*);..
1d250 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b    if( argc!=2 ){
1d260 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1d270 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 77 72  esult(interp,"wr
1d280 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
1d290 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
1d2a0 30 5d 2c 0a 20 20 20 20 20 20 20 20 22 20 54 45  0],.        " TE
1d2b0 58 54 5c 22 22 2c 20 28 63 68 61 72 2a 29 30 29  XT\"", (char*)0)
1d2c0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1d2d0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 4d 44  _ERROR;.  }.  MD
1d2e0 35 49 6e 69 74 28 26 63 74 78 29 3b 0a 20 20 4d  5Init(&ctx);.  M
1d2f0 44 35 55 70 64 61 74 65 28 26 63 74 78 2c 20 28  D5Update(&ctx, (
1d300 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 61  unsigned char*)a
1d310 72 67 76 5b 31 5d 2c 20 28 75 6e 73 69 67 6e 65  rgv[1], (unsigne
1d320 64 29 73 74 72 6c 65 6e 28 61 72 67 76 5b 31 5d  d)strlen(argv[1]
1d330 29 29 3b 0a 20 20 4d 44 35 46 69 6e 61 6c 28 64  ));.  MD5Final(d
1d340 69 67 65 73 74 2c 20 26 63 74 78 29 3b 0a 20 20  igest, &ctx);.  
1d350 63 6f 6e 76 65 72 74 65 72 20 3d 20 28 76 6f 69  converter = (voi
1d360 64 28 2a 29 28 75 6e 73 69 67 6e 65 64 20 63 68  d(*)(unsigned ch
1d370 61 72 2a 2c 63 68 61 72 2a 29 29 63 64 3b 0a 20  ar*,char*))cd;. 
1d380 20 63 6f 6e 76 65 72 74 65 72 28 64 69 67 65 73   converter(diges
1d390 74 2c 20 7a 42 75 66 29 3b 0a 20 20 54 63 6c 5f  t, zBuf);.  Tcl_
1d3a0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1d3b0 65 72 70 2c 20 7a 42 75 66 2c 20 28 63 68 61 72  erp, zBuf, (char
1d3c0 2a 29 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  *)0);.  return T
1d3d0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1d3e0 41 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 74 6f  A TCL command to
1d3f0 20 74 61 6b 65 20 74 68 65 20 6d 64 35 20 68 61   take the md5 ha
1d400 73 68 20 6f 66 20 61 20 66 69 6c 65 2e 20 20 54  sh of a file.  T
1d410 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  he argument is t
1d420 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 74 68  he.** name of th
1d430 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  e file..*/.stati
1d440 63 20 69 6e 74 20 6d 64 35 66 69 6c 65 5f 63 6d  c int md5file_cm
1d450 64 28 76 6f 69 64 2a 63 64 2c 20 54 63 6c 5f 49  d(void*cd, Tcl_I
1d460 6e 74 65 72 70 2a 69 6e 74 65 72 70 2c 20 69 6e  nterp*interp, in
1d470 74 20 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68  t argc, const ch
1d480 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 46 49  ar **argv){.  FI
1d490 4c 45 20 2a 69 6e 3b 0a 20 20 4d 44 35 43 6f 6e  LE *in;.  MD5Con
1d4a0 74 65 78 74 20 63 74 78 3b 0a 20 20 76 6f 69 64  text ctx;.  void
1d4b0 20 28 2a 63 6f 6e 76 65 72 74 65 72 29 28 75 6e   (*converter)(un
1d4c0 73 69 67 6e 65 64 20 63 68 61 72 2a 2c 20 63 68  signed char*, ch
1d4d0 61 72 2a 29 3b 0a 20 20 75 6e 73 69 67 6e 65 64  ar*);.  unsigned
1d4e0 20 63 68 61 72 20 64 69 67 65 73 74 5b 31 36 5d   char digest[16]
1d4f0 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30  ;.  char zBuf[10
1d500 32 34 30 5d 3b 0a 0a 20 20 69 66 28 20 61 72 67  240];..  if( arg
1d510 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
1d520 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1d530 65 72 70 2c 22 77 72 6f 6e 67 20 23 20 61 72 67  erp,"wrong # arg
1d540 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1d550 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
1d560 20 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22     " FILENAME\""
1d570 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
1d580 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1d590 52 3b 0a 20 20 7d 0a 20 20 69 6e 20 3d 20 66 6f  R;.  }.  in = fo
1d5a0 70 65 6e 28 61 72 67 76 5b 31 5d 2c 22 72 62 22  pen(argv[1],"rb"
1d5b0 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20 29  );.  if( in==0 )
1d5c0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1d5d0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 75  Result(interp,"u
1d5e0 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 66 69  nable to open fi
1d5f0 6c 65 20 5c 22 22 2c 20 61 72 67 76 5b 31 5d 2c  le \"", argv[1],
1d600 0a 20 20 20 20 20 20 20 20 20 22 5c 22 20 66 6f  .         "\" fo
1d610 72 20 72 65 61 64 69 6e 67 22 2c 20 28 63 68 61  r reading", (cha
1d620 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72  r*)0);.    retur
1d630 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1d640 0a 20 20 4d 44 35 49 6e 69 74 28 26 63 74 78 29  .  MD5Init(&ctx)
1d650 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20  ;.  for(;;){.   
1d660 20 69 6e 74 20 6e 3b 0a 20 20 20 20 6e 20 3d 20   int n;.    n = 
1d670 28 69 6e 74 29 66 72 65 61 64 28 7a 42 75 66 2c  (int)fread(zBuf,
1d680 20 31 2c 20 73 69 7a 65 6f 66 28 7a 42 75 66 29   1, sizeof(zBuf)
1d690 2c 20 69 6e 29 3b 0a 20 20 20 20 69 66 28 20 6e  , in);.    if( n
1d6a0 3c 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  <=0 ) break;.   
1d6b0 20 4d 44 35 55 70 64 61 74 65 28 26 63 74 78 2c   MD5Update(&ctx,
1d6c0 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
1d6d0 29 7a 42 75 66 2c 20 28 75 6e 73 69 67 6e 65 64  )zBuf, (unsigned
1d6e0 29 6e 29 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73  )n);.  }.  fclos
1d6f0 65 28 69 6e 29 3b 0a 20 20 4d 44 35 46 69 6e 61  e(in);.  MD5Fina
1d700 6c 28 64 69 67 65 73 74 2c 20 26 63 74 78 29 3b  l(digest, &ctx);
1d710 0a 20 20 63 6f 6e 76 65 72 74 65 72 20 3d 20 28  .  converter = (
1d720 76 6f 69 64 28 2a 29 28 75 6e 73 69 67 6e 65 64  void(*)(unsigned
1d730 20 63 68 61 72 2a 2c 63 68 61 72 2a 29 29 63 64   char*,char*))cd
1d740 3b 0a 20 20 63 6f 6e 76 65 72 74 65 72 28 64 69  ;.  converter(di
1d750 67 65 73 74 2c 20 7a 42 75 66 29 3b 0a 20 20 54  gest, zBuf);.  T
1d760 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1d770 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 28 63  interp, zBuf, (c
1d780 68 61 72 2a 29 30 29 3b 0a 20 20 72 65 74 75 72  har*)0);.  retur
1d790 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1d7a0 2a 2a 20 52 65 67 69 73 74 65 72 20 74 68 65 20  ** Register the 
1d7b0 66 6f 75 72 20 6e 65 77 20 54 43 4c 20 63 6f 6d  four new TCL com
1d7c0 6d 61 6e 64 73 20 66 6f 72 20 67 65 6e 65 72 61  mands for genera
1d7d0 74 69 6e 67 20 4d 44 35 20 63 68 65 63 6b 73 75  ting MD5 checksu
1d7e0 6d 73 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 54  ms.** with the T
1d7f0 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a  CL interpreter..
1d800 2a 2f 0a 69 6e 74 20 4d 64 35 5f 49 6e 69 74 28  */.int Md5_Init(
1d810 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1d820 72 70 29 7b 0a 20 20 54 63 6c 5f 43 72 65 61 74  rp){.  Tcl_Creat
1d830 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  eCommand(interp,
1d840 20 22 6d 64 35 22 2c 20 28 54 63 6c 5f 43 6d 64   "md5", (Tcl_Cmd
1d850 50 72 6f 63 2a 29 6d 64 35 5f 63 6d 64 2c 0a 20  Proc*)md5_cmd,. 
1d860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d870 20 20 20 4d 44 35 44 69 67 65 73 74 54 6f 42 61     MD5DigestToBa
1d880 73 65 31 36 2c 20 30 29 3b 0a 20 20 54 63 6c 5f  se16, 0);.  Tcl_
1d890 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e  CreateCommand(in
1d8a0 74 65 72 70 2c 20 22 6d 64 35 2d 31 30 78 38 22  terp, "md5-10x8"
1d8b0 2c 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29  , (Tcl_CmdProc*)
1d8c0 6d 64 35 5f 63 6d 64 2c 0a 20 20 20 20 20 20 20  md5_cmd,.       
1d8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 4d 44 35               MD5
1d8e0 44 69 67 65 73 74 54 6f 42 61 73 65 31 30 78 38  DigestToBase10x8
1d8f0 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61  , 0);.  Tcl_Crea
1d900 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  teCommand(interp
1d910 2c 20 22 6d 64 35 66 69 6c 65 22 2c 20 28 54 63  , "md5file", (Tc
1d920 6c 5f 43 6d 64 50 72 6f 63 2a 29 6d 64 35 66 69  l_CmdProc*)md5fi
1d930 6c 65 5f 63 6d 64 2c 0a 20 20 20 20 20 20 20 20  le_cmd,.        
1d940 20 20 20 20 20 20 20 20 20 20 20 20 4d 44 35 44              MD5D
1d950 69 67 65 73 74 54 6f 42 61 73 65 31 36 2c 20 30  igestToBase16, 0
1d960 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 43  );.  Tcl_CreateC
1d970 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
1d980 6d 64 35 66 69 6c 65 2d 31 30 78 38 22 2c 20 28  md5file-10x8", (
1d990 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 6d 64 35  Tcl_CmdProc*)md5
1d9a0 66 69 6c 65 5f 63 6d 64 2c 0a 20 20 20 20 20 20  file_cmd,.      
1d9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4d 44                MD
1d9c0 35 44 69 67 65 73 74 54 6f 42 61 73 65 31 30 78  5DigestToBase10x
1d9d0 38 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  8, 0);.  return 
1d9e0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  TCL_OK;.}.#endif
1d9f0 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49   /* defined(SQLI
1da00 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69  TE_TEST) || defi
1da10 6e 65 64 28 53 51 4c 49 54 45 5f 54 43 4c 4d 44  ned(SQLITE_TCLMD
1da20 35 29 20 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e  5) */..#if defin
1da30 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a  ed(SQLITE_TEST).
1da40 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 74 65 73  /*.** During tes
1da50 74 69 6e 67 2c 20 74 68 65 20 73 70 65 63 69 61  ting, the specia
1da60 6c 20 6d 64 35 73 75 6d 28 29 20 61 67 67 72 65  l md5sum() aggre
1da70 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 69 73  gate function is
1da80 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 20 69   available..** i
1da90 6e 73 69 64 65 20 53 51 4c 69 74 65 2e 20 20 54  nside SQLite.  T
1daa0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
1dab0 74 69 6e 65 73 20 69 6d 70 6c 65 6d 65 6e 74 20  tines implement 
1dac0 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  that function..*
1dad0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 64  /.static void md
1dae0 35 73 74 65 70 28 73 71 6c 69 74 65 33 5f 63 6f  5step(sqlite3_co
1daf0 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20  ntext *context, 
1db00 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
1db10 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b  3_value **argv){
1db20 0a 20 20 4d 44 35 43 6f 6e 74 65 78 74 20 2a 70  .  MD5Context *p
1db30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
1db40 20 61 72 67 63 3c 31 20 29 20 72 65 74 75 72 6e   argc<1 ) return
1db50 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f  ;.  p = sqlite3_
1db60 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78  aggregate_contex
1db70 74 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f  t(context, sizeo
1db80 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 3d  f(*p));.  if( p=
1db90 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
1dba0 66 28 20 21 70 2d 3e 69 73 49 6e 69 74 20 29 7b  f( !p->isInit ){
1dbb0 0a 20 20 20 20 4d 44 35 49 6e 69 74 28 70 29 3b  .    MD5Init(p);
1dbc0 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
1dbd0 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20  i<argc; i++){.  
1dbe0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
1dbf0 61 74 61 20 3d 20 28 63 68 61 72 2a 29 73 71 6c  ata = (char*)sql
1dc00 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
1dc10 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 69 66  argv[i]);.    if
1dc20 28 20 7a 44 61 74 61 20 29 7b 0a 20 20 20 20 20  ( zData ){.     
1dc30 20 4d 44 35 55 70 64 61 74 65 28 70 2c 20 28 75   MD5Update(p, (u
1dc40 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 44  nsigned char*)zD
1dc50 61 74 61 2c 20 28 69 6e 74 29 73 74 72 6c 65 6e  ata, (int)strlen
1dc60 28 7a 44 61 74 61 29 29 3b 0a 20 20 20 20 7d 0a  (zData));.    }.
1dc70 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
1dc80 64 20 6d 64 35 66 69 6e 61 6c 69 7a 65 28 73 71  d md5finalize(sq
1dc90 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
1dca0 6f 6e 74 65 78 74 29 7b 0a 20 20 4d 44 35 43 6f  ontext){.  MD5Co
1dcb0 6e 74 65 78 74 20 2a 70 3b 0a 20 20 75 6e 73 69  ntext *p;.  unsi
1dcc0 67 6e 65 64 20 63 68 61 72 20 64 69 67 65 73 74  gned char digest
1dcd0 5b 31 36 5d 3b 0a 20 20 63 68 61 72 20 7a 42 75  [16];.  char zBu
1dce0 66 5b 33 33 5d 3b 0a 20 20 70 20 3d 20 73 71 6c  f[33];.  p = sql
1dcf0 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
1dd00 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  ontext(context, 
1dd10 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 4d  sizeof(*p));.  M
1dd20 44 35 46 69 6e 61 6c 28 64 69 67 65 73 74 2c 70  D5Final(digest,p
1dd30 29 3b 0a 20 20 4d 44 35 44 69 67 65 73 74 54 6f  );.  MD5DigestTo
1dd40 42 61 73 65 31 36 28 64 69 67 65 73 74 2c 20 7a  Base16(digest, z
1dd50 42 75 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Buf);.  sqlite3_
1dd60 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
1dd70 65 78 74 2c 20 7a 42 75 66 2c 20 2d 31 2c 20 53  ext, zBuf, -1, S
1dd80 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
1dd90 3b 0a 7d 0a 69 6e 74 20 4d 64 35 5f 52 65 67 69  ;.}.int Md5_Regi
1dda0 73 74 65 72 28 73 71 6c 69 74 65 33 20 2a 64 62  ster(sqlite3 *db
1ddb0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71  ){.  int rc = sq
1ddc0 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
1ddd0 63 74 69 6f 6e 28 64 62 2c 20 22 6d 64 35 73 75  ction(db, "md5su
1dde0 6d 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55  m", -1, SQLITE_U
1ddf0 54 46 38 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  TF8, 0, 0,.     
1de00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de10 20 20 20 20 20 20 20 20 20 20 20 20 6d 64 35 73              md5s
1de20 74 65 70 2c 20 6d 64 35 66 69 6e 61 6c 69 7a 65  tep, md5finalize
1de30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6f 76 65  );.  sqlite3_ove
1de40 72 6c 6f 61 64 5f 66 75 6e 63 74 69 6f 6e 28 64  rload_function(d
1de50 62 2c 20 22 6d 64 35 73 75 6d 22 2c 20 2d 31 29  b, "md5sum", -1)
1de60 3b 20 20 2f 2a 20 54 6f 20 65 78 65 72 63 69 73  ;  /* To exercis
1de70 65 20 74 68 69 73 20 41 50 49 20 2a 2f 0a 20 20  e this API */.  
1de80 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
1de90 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53  dif /* defined(S
1dea0 51 4c 49 54 45 5f 54 45 53 54 29 20 2a 2f 0a 0a  QLITE_TEST) */..
1deb0 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61  ./*.** If the ma
1dec0 63 72 6f 20 54 43 4c 53 48 20 69 73 20 6f 6e 65  cro TCLSH is one
1ded0 2c 20 74 68 65 6e 20 70 75 74 20 69 6e 20 63 6f  , then put in co
1dee0 64 65 20 74 68 69 73 20 66 6f 72 20 74 68 65 0a  de this for the.
1def0 2a 2a 20 22 6d 61 69 6e 22 20 72 6f 75 74 69 6e  ** "main" routin
1df00 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 69 74  e that will init
1df10 69 61 6c 69 7a 65 20 54 63 6c 20 61 6e 64 20 74  ialize Tcl and t
1df20 61 6b 65 20 69 6e 70 75 74 20 66 72 6f 6d 0a 2a  ake input from.*
1df30 2a 20 73 74 61 6e 64 61 72 64 20 69 6e 70 75 74  * standard input
1df40 2c 20 6f 72 20 69 66 20 61 20 66 69 6c 65 20 69  , or if a file i
1df50 73 20 6e 61 6d 65 64 20 6f 6e 20 74 68 65 20 63  s named on the c
1df60 6f 6d 6d 61 6e 64 20 6c 69 6e 65 0a 2a 2a 20 74  ommand line.** t
1df70 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
1df80 65 72 20 72 65 61 64 73 20 61 6e 64 20 65 76 61  er reads and eva
1df90 6c 75 61 74 65 73 20 74 68 61 74 20 66 69 6c 65  luates that file
1dfa0 2e 0a 2a 2f 0a 23 69 66 20 54 43 4c 53 48 3d 3d  ..*/.#if TCLSH==
1dfb0 31 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  1.static const c
1dfc0 68 61 72 20 2a 74 63 6c 73 68 5f 6d 61 69 6e 5f  har *tclsh_main_
1dfd0 6c 6f 6f 70 28 76 6f 69 64 29 7b 0a 20 20 73 74  loop(void){.  st
1dfe0 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
1dff0 7a 4d 61 69 6e 6c 6f 6f 70 5b 5d 20 3d 0a 20 20  zMainloop[] =.  
1e000 20 20 22 73 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e    "set line {}\n
1e010 22 0a 20 20 20 20 22 77 68 69 6c 65 20 7b 21 5b  ".    "while {![
1e020 65 6f 66 20 73 74 64 69 6e 5d 7d 20 7b 5c 6e 22  eof stdin]} {\n"
1e030 0a 20 20 20 20 20 20 22 69 66 20 7b 24 6c 69 6e  .      "if {$lin
1e040 65 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20  e!=\"\"} {\n".  
1e050 20 20 20 20 20 20 22 70 75 74 73 20 2d 6e 6f 6e        "puts -non
1e060 65 77 6c 69 6e 65 20 5c 22 3e 20 5c 22 5c 6e 22  ewline \"> \"\n"
1e070 0a 20 20 20 20 20 20 22 7d 20 65 6c 73 65 20 7b  .      "} else {
1e080 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 70 75 74  \n".        "put
1e090 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 5c 22 25  s -nonewline \"%
1e0a0 20 5c 22 5c 6e 22 0a 20 20 20 20 20 20 22 7d 5c   \"\n".      "}\
1e0b0 6e 22 0a 20 20 20 20 20 20 22 66 6c 75 73 68 20  n".      "flush 
1e0c0 73 74 64 6f 75 74 5c 6e 22 0a 20 20 20 20 20 20  stdout\n".      
1e0d0 22 61 70 70 65 6e 64 20 6c 69 6e 65 20 5b 67 65  "append line [ge
1e0e0 74 73 20 73 74 64 69 6e 5d 5c 6e 22 0a 20 20 20  ts stdin]\n".   
1e0f0 20 20 20 22 69 66 20 7b 5b 69 6e 66 6f 20 63 6f     "if {[info co
1e100 6d 70 6c 65 74 65 20 24 6c 69 6e 65 5d 7d 20 7b  mplete $line]} {
1e110 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 69 66 20  \n".        "if 
1e120 7b 5b 63 61 74 63 68 20 7b 75 70 6c 65 76 65 6c  {[catch {uplevel
1e130 20 23 30 20 24 6c 69 6e 65 7d 20 72 65 73 75 6c   #0 $line} resul
1e140 74 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20  t]} {\n".       
1e150 20 20 20 22 70 75 74 73 20 73 74 64 65 72 72 20     "puts stderr 
1e160 5c 22 45 72 72 6f 72 3a 20 24 72 65 73 75 6c 74  \"Error: $result
1e170 5c 22 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 7d  \"\n".        "}
1e180 20 65 6c 73 65 69 66 20 7b 24 72 65 73 75 6c 74   elseif {$result
1e190 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20 20  !=\"\"} {\n".   
1e1a0 20 20 20 20 20 20 20 22 70 75 74 73 20 24 72 65         "puts $re
1e1b0 73 75 6c 74 5c 6e 22 0a 20 20 20 20 20 20 20 20  sult\n".        
1e1c0 22 7d 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 73  "}\n".        "s
1e1d0 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e 22 0a 20 20  et line {}\n".  
1e1e0 20 20 20 20 22 7d 20 65 6c 73 65 20 7b 5c 6e 22      "} else {\n"
1e1f0 0a 20 20 20 20 20 20 20 20 22 61 70 70 65 6e 64  .        "append
1e200 20 6c 69 6e 65 20 5c 5c 6e 5c 6e 22 0a 20 20 20   line \\n\n".   
1e210 20 20 20 22 7d 5c 6e 22 0a 20 20 20 20 22 7d 5c     "}\n".    "}\
1e220 6e 22 0a 20 20 3b 0a 20 20 72 65 74 75 72 6e 20  n".  ;.  return 
1e230 7a 4d 61 69 6e 6c 6f 6f 70 3b 0a 7d 0a 23 65 6e  zMainloop;.}.#en
1e240 64 69 66 0a 23 69 66 20 54 43 4c 53 48 3d 3d 32  dif.#if TCLSH==2
1e250 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
1e260 61 72 20 2a 74 63 6c 73 68 5f 6d 61 69 6e 5f 6c  ar *tclsh_main_l
1e270 6f 6f 70 28 76 6f 69 64 29 3b 0a 23 65 6e 64 69  oop(void);.#endi
1e280 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
1e290 5f 54 45 53 54 0a 73 74 61 74 69 63 20 76 6f 69  _TEST.static voi
1e2a0 64 20 69 6e 69 74 5f 61 6c 6c 28 54 63 6c 5f 49  d init_all(Tcl_I
1e2b0 6e 74 65 72 70 20 2a 29 3b 0a 73 74 61 74 69 63  nterp *);.static
1e2c0 20 69 6e 74 20 69 6e 69 74 5f 61 6c 6c 5f 63 6d   int init_all_cm
1e2d0 64 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  d(.  ClientData 
1e2e0 63 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  cd,.  Tcl_Interp
1e2f0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1e300 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1e310 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1e320 0a 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ..  Tcl_Interp *
1e330 73 6c 61 76 65 3b 0a 20 20 69 66 28 20 6f 62 6a  slave;.  if( obj
1e340 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
1e350 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
1e360 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53  erp, 1, objv, "S
1e370 4c 41 56 45 22 29 3b 0a 20 20 20 20 72 65 74 75  LAVE");.    retu
1e380 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1e390 7d 0a 0a 20 20 73 6c 61 76 65 20 3d 20 54 63 6c  }..  slave = Tcl
1e3a0 5f 47 65 74 53 6c 61 76 65 28 69 6e 74 65 72 70  _GetSlave(interp
1e3b0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
1e3c0 6f 62 6a 76 5b 31 5d 29 29 3b 0a 20 20 69 66 28  objv[1]));.  if(
1e3d0 20 21 73 6c 61 76 65 20 29 7b 0a 20 20 20 20 72   !slave ){.    r
1e3e0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1e3f0 0a 20 20 7d 0a 0a 20 20 69 6e 69 74 5f 61 6c 6c  .  }..  init_all
1e400 28 73 6c 61 76 65 29 3b 0a 20 20 72 65 74 75 72  (slave);.  retur
1e410 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1e420 2a 2a 20 54 63 6c 63 6d 64 3a 20 64 62 5f 75 73  ** Tclcmd: db_us
1e430 65 5f 6c 65 67 61 63 79 5f 70 72 65 70 61 72 65  e_legacy_prepare
1e440 20 44 42 20 42 4f 4f 4c 45 41 4e 0a 2a 2a 0a 2a   DB BOOLEAN.**.*
1e450 2a 20 20 20 54 68 65 20 66 69 72 73 74 20 61 72  *   The first ar
1e460 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 63  gument to this c
1e470 6f 6d 6d 61 6e 64 20 6d 75 73 74 20 62 65 20 61  ommand must be a
1e480 20 64 61 74 61 62 61 73 65 20 63 6f 6d 6d 61 6e   database comman
1e490 64 20 63 72 65 61 74 65 64 20 62 79 0a 2a 2a 20  d created by.** 
1e4a0 20 20 5b 73 71 6c 69 74 65 33 5d 2e 20 49 66 20    [sqlite3]. If 
1e4b0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
1e4c0 65 6e 74 20 69 73 20 74 72 75 65 2c 20 74 68 65  ent is true, the
1e4d0 6e 20 74 68 65 20 68 61 6e 64 6c 65 20 69 73 20  n the handle is 
1e4e0 63 6f 6e 66 69 67 75 72 65 64 0a 2a 2a 20 20 20  configured.**   
1e4f0 74 6f 20 75 73 65 20 74 68 65 20 73 71 6c 69 74  to use the sqlit
1e500 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 29 20  e3_prepare_v2() 
1e510 66 75 6e 63 74 69 6f 6e 20 74 6f 20 70 72 65 70  function to prep
1e520 61 72 65 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  are statements. 
1e530 49 66 20 69 74 0a 2a 2a 20 20 20 69 73 20 66 61  If it.**   is fa
1e540 6c 73 65 2c 20 73 71 6c 69 74 65 33 5f 70 72 65  lse, sqlite3_pre
1e550 70 61 72 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  pare()..*/.stati
1e560 63 20 69 6e 74 20 64 62 5f 75 73 65 5f 6c 65 67  c int db_use_leg
1e570 61 63 79 5f 70 72 65 70 61 72 65 5f 63 6d 64 28  acy_prepare_cmd(
1e580 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 64  .  ClientData cd
1e590 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1e5a0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
1e5b0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
1e5c0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
1e5d0 20 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64   Tcl_CmdInfo cmd
1e5e0 49 6e 66 6f 3b 0a 20 20 53 71 6c 69 74 65 44 62  Info;.  SqliteDb
1e5f0 20 2a 70 44 62 3b 0a 20 20 69 6e 74 20 62 50 72   *pDb;.  int bPr
1e600 65 70 61 72 65 3b 0a 0a 20 20 69 66 28 20 6f 62  epare;..  if( ob
1e610 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
1e620 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
1e630 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
1e640 44 42 20 42 4f 4f 4c 45 41 4e 22 29 3b 0a 20 20  DB BOOLEAN");.  
1e650 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1e660 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21  OR;.  }..  if( !
1e670 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e  Tcl_GetCommandIn
1e680 66 6f 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  fo(interp, Tcl_G
1e690 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
1e6a0 29 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29 7b 0a  ), &cmdInfo) ){.
1e6b0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1e6c0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f  sult(interp, "no
1e6d0 20 73 75 63 68 20 64 62 3a 20 22 2c 20 54 63 6c   such db: ", Tcl
1e6e0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1e6f0 31 5d 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  1]), (char*)0);.
1e700 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1e710 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 44 62 20  RROR;.  }.  pDb 
1e720 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 6d 64  = (SqliteDb*)cmd
1e730 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44 61  Info.objClientDa
1e740 74 61 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  ta;.  if( Tcl_Ge
1e750 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
1e760 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
1e770 20 26 62 50 72 65 70 61 72 65 29 20 29 7b 0a 20   &bPrepare) ){. 
1e780 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1e790 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 70 44 62 2d  ROR;.  }..  pDb-
1e7a0 3e 62 4c 65 67 61 63 79 50 72 65 70 61 72 65 20  >bLegacyPrepare 
1e7b0 3d 20 62 50 72 65 70 61 72 65 3b 0a 0a 20 20 54  = bPrepare;..  T
1e7c0 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69  cl_ResetResult(i
1e7d0 6e 74 65 72 70 29 3b 0a 20 20 72 65 74 75 72 6e  nterp);.  return
1e7e0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1e7f0 2a 20 54 63 6c 63 6d 64 3a 20 64 62 5f 6c 61 73  * Tclcmd: db_las
1e800 74 5f 73 74 6d 74 5f 70 74 72 20 44 42 0a 2a 2a  t_stmt_ptr DB.**
1e810 0a 2a 2a 20 20 20 49 66 20 74 68 65 20 73 74 61  .**   If the sta
1e820 74 65 6d 65 6e 74 20 63 61 63 68 65 20 61 73 73  tement cache ass
1e830 6f 63 69 61 74 65 64 20 77 69 74 68 20 64 61 74  ociated with dat
1e840 61 62 61 73 65 20 44 42 20 69 73 20 6e 6f 74 20  abase DB is not 
1e850 65 6d 70 74 79 2c 0a 2a 2a 20 20 20 72 65 74 75  empty,.**   retu
1e860 72 6e 20 74 68 65 20 74 65 78 74 20 72 65 70 72  rn the text repr
1e870 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
1e880 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
1e890 75 73 65 64 20 73 74 61 74 65 6d 65 6e 74 0a 2a  used statement.*
1e8a0 2a 20 20 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73  *   handle..*/.s
1e8b0 74 61 74 69 63 20 69 6e 74 20 64 62 5f 6c 61 73  tatic int db_las
1e8c0 74 5f 73 74 6d 74 5f 70 74 72 28 0a 20 20 43 6c  t_stmt_ptr(.  Cl
1e8d0 69 65 6e 74 44 61 74 61 20 63 64 2c 0a 20 20 54  ientData cd,.  T
1e8e0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1e8f0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1e900 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1e910 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 65 78 74 65  objv[].){.  exte
1e920 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 54 65  rn int sqlite3Te
1e930 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72  stMakePointerStr
1e940 28 54 63 6c 5f 49 6e 74 65 72 70 2a 2c 20 63 68  (Tcl_Interp*, ch
1e950 61 72 2a 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 54  ar*, void*);.  T
1e960 63 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49 6e  cl_CmdInfo cmdIn
1e970 66 6f 3b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  fo;.  SqliteDb *
1e980 70 44 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  pDb;.  sqlite3_s
1e990 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
1e9a0 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d    char zBuf[100]
1e9b0 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
1e9c0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
1e9d0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
1e9e0 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 22 29 3b   1, objv, "DB");
1e9f0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1ea00 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
1ea10 28 20 21 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e  ( !Tcl_GetComman
1ea20 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 54 63  dInfo(interp, Tc
1ea30 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1ea40 5b 31 5d 29 2c 20 26 63 6d 64 49 6e 66 6f 29 20  [1]), &cmdInfo) 
1ea50 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1ea60 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1ea70 22 6e 6f 20 73 75 63 68 20 64 62 3a 20 22 2c 20  "no such db: ", 
1ea80 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1ea90 6a 76 5b 31 5d 29 2c 20 28 63 68 61 72 2a 29 30  jv[1]), (char*)0
1eaa0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1eab0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70  L_ERROR;.  }.  p
1eac0 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29  Db = (SqliteDb*)
1ead0 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e  cmdInfo.objClien
1eae0 74 44 61 74 61 3b 0a 0a 20 20 69 66 28 20 70 44  tData;..  if( pD
1eaf0 62 2d 3e 73 74 6d 74 4c 69 73 74 20 29 20 70 53  b->stmtList ) pS
1eb00 74 6d 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c  tmt = pDb->stmtL
1eb10 69 73 74 2d 3e 70 53 74 6d 74 3b 0a 20 20 69 66  ist->pStmt;.  if
1eb20 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b  ( sqlite3TestMak
1eb30 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65  ePointerStr(inte
1eb40 72 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74 29  rp, zBuf, pStmt)
1eb50 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
1eb60 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1eb70 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
1eb80 74 65 72 70 2c 20 7a 42 75 66 2c 20 54 43 4c 5f  terp, zBuf, TCL_
1eb90 56 4f 4c 41 54 49 4c 45 29 3b 0a 0a 20 20 72 65  VOLATILE);..  re
1eba0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23  turn TCL_OK;.}.#
1ebb0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1ebc0 54 45 53 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43  TEST */../*.** C
1ebd0 6f 6e 66 69 67 75 72 65 20 74 68 65 20 69 6e 74  onfigure the int
1ebe0 65 72 70 72 65 74 65 72 20 70 61 73 73 65 64 20  erpreter passed 
1ebf0 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
1ec00 75 6d 65 6e 74 20 74 6f 20 68 61 76 65 20 61 63  ument to have ac
1ec10 63 65 73 73 0a 2a 2a 20 74 6f 20 74 68 65 20 63  cess.** to the c
1ec20 6f 6d 6d 61 6e 64 73 20 61 6e 64 20 6c 69 6e 6b  ommands and link
1ec30 65 64 20 76 61 72 69 61 62 6c 65 73 20 74 68 61  ed variables tha
1ec40 74 20 6d 61 6b 65 20 75 70 3a 0a 2a 2a 0a 2a 2a  t make up:.**.**
1ec50 20 20 20 2a 20 74 68 65 20 5b 73 71 6c 69 74 65     * the [sqlite
1ec60 33 5d 20 65 78 74 65 6e 73 69 6f 6e 20 69 74 73  3] extension its
1ec70 65 6c 66 2c 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49  elf,.**.**   * I
1ec80 66 20 53 51 4c 49 54 45 5f 54 43 4c 4d 44 35 20  f SQLITE_TCLMD5 
1ec90 6f 72 20 53 51 4c 49 54 45 5f 54 45 53 54 20 69  or SQLITE_TEST i
1eca0 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65 20 4d  s defined, the M
1ecb0 64 35 20 63 6f 6d 6d 61 6e 64 73 2c 20 61 6e 64  d5 commands, and
1ecc0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 53 51  .**.**   * If SQ
1ecd0 4c 49 54 45 5f 54 45 53 54 20 69 73 20 73 65 74  LITE_TEST is set
1ece0 2c 20 74 68 65 20 76 61 72 69 6f 75 73 20 74 65  , the various te
1ecf0 73 74 20 69 6e 74 65 72 66 61 63 65 73 20 75 73  st interfaces us
1ed00 65 64 20 62 79 20 74 68 65 20 54 63 6c 0a 2a 2a  ed by the Tcl.**
1ed10 20 20 20 20 20 74 65 73 74 20 73 75 69 74 65 2e       test suite.
1ed20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1ed30 69 6e 69 74 5f 61 6c 6c 28 54 63 6c 5f 49 6e 74  init_all(Tcl_Int
1ed40 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20  erp *interp){.  
1ed50 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74  Sqlite3_Init(int
1ed60 65 72 70 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e  erp);..#if defin
1ed70 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20  ed(SQLITE_TEST) 
1ed80 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
1ed90 45 5f 54 43 4c 4d 44 35 29 0a 20 20 4d 64 35 5f  E_TCLMD5).  Md5_
1eda0 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 23 65  Init(interp);.#e
1edb0 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
1edc0 49 54 45 5f 54 45 53 54 0a 20 20 7b 0a 20 20 20  ITE_TEST.  {.   
1edd0 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1ede0 74 65 63 6f 6e 66 69 67 5f 49 6e 69 74 28 54 63  teconfig_Init(Tc
1edf0 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1ee00 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1ee10 65 74 65 73 74 31 5f 49 6e 69 74 28 54 63 6c 5f  etest1_Init(Tcl_
1ee20 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
1ee30 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1ee40 65 73 74 32 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  est2_Init(Tcl_In
1ee50 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
1ee60 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1ee70 74 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  t3_Init(Tcl_Inte
1ee80 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
1ee90 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 34   int Sqlitetest4
1eea0 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1eeb0 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1eec0 6e 74 20 53 71 6c 69 74 65 74 65 73 74 35 5f 49  nt Sqlitetest5_I
1eed0 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
1eee0 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
1eef0 20 53 71 6c 69 74 65 74 65 73 74 36 5f 49 6e 69   Sqlitetest6_Ini
1ef00 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
1ef10 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1ef20 71 6c 69 74 65 74 65 73 74 37 5f 49 6e 69 74 28  qlitetest7_Init(
1ef30 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1ef40 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1ef50 69 74 65 74 65 73 74 38 5f 49 6e 69 74 28 54 63  itetest8_Init(Tc
1ef60 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1ef70 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1ef80 65 74 65 73 74 39 5f 49 6e 69 74 28 54 63 6c 5f  etest9_Init(Tcl_
1ef90 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
1efa0 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1efb0 65 73 74 61 73 79 6e 63 5f 49 6e 69 74 28 54 63  estasync_Init(Tc
1efc0 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1efd0 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1efe0 65 74 65 73 74 5f 61 75 74 6f 65 78 74 5f 49 6e  etest_autoext_In
1eff0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1f000 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1f010 53 71 6c 69 74 65 74 65 73 74 5f 62 6c 6f 62 5f  Sqlitetest_blob_
1f020 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1f030 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
1f040 74 20 53 71 6c 69 74 65 74 65 73 74 5f 64 65 6d  t Sqlitetest_dem
1f050 6f 76 66 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  ovfs_Init(Tcl_In
1f060 74 65 72 70 20 2a 29 3b 0a 20 20 20 20 65 78 74  terp *);.    ext
1f070 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1f080 73 74 5f 66 75 6e 63 5f 49 6e 69 74 28 54 63 6c  st_func_Init(Tcl
1f090 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1f0a0 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1f0b0 74 65 73 74 5f 68 65 78 69 6f 5f 49 6e 69 74 28  test_hexio_Init(
1f0c0 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1f0d0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1f0e0 69 74 65 74 65 73 74 5f 69 6e 69 74 5f 49 6e 69  itetest_init_Ini
1f0f0 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
1f100 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1f110 71 6c 69 74 65 74 65 73 74 5f 6d 61 6c 6c 6f 63  qlitetest_malloc
1f120 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1f130 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1f140 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f 6d 75  nt Sqlitetest_mu
1f150 74 65 78 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  tex_Init(Tcl_Int
1f160 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1f170 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1f180 73 63 68 65 6d 61 5f 49 6e 69 74 28 54 63 6c 5f  schema_Init(Tcl_
1f190 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
1f1a0 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1f1b0 65 73 74 73 73 65 5f 49 6e 69 74 28 54 63 6c 5f  estsse_Init(Tcl_
1f1c0 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
1f1d0 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1f1e0 65 73 74 74 63 6c 76 61 72 5f 49 6e 69 74 28 54  esttclvar_Init(T
1f1f0 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1f200 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1f210 74 65 74 65 73 74 66 73 5f 49 6e 69 74 28 54 63  tetestfs_Init(Tc
1f220 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1f230 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1f240 65 74 65 73 74 54 68 72 65 61 64 5f 49 6e 69 74  etestThread_Init
1f250 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1f260 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1f270 6c 69 74 65 74 65 73 74 4f 6e 65 66 69 6c 65 5f  litetestOnefile_
1f280 49 6e 69 74 28 29 3b 0a 20 20 20 20 65 78 74 65  Init();.    exte
1f290 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1f2a0 74 4f 73 69 6e 73 74 5f 49 6e 69 74 28 54 63 6c  tOsinst_Init(Tcl
1f2b0 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1f2c0 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1f2d0 74 65 73 74 62 61 63 6b 75 70 5f 49 6e 69 74 28  testbackup_Init(
1f2e0 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1f2f0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1f300 69 74 65 74 65 73 74 69 6e 74 61 72 72 61 79 5f  itetestintarray_
1f310 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1f320 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
1f330 74 20 53 71 6c 69 74 65 74 65 73 74 76 66 73 5f  t Sqlitetestvfs_
1f340 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
1f350 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1f360 6e 74 20 53 71 6c 69 74 65 74 65 73 74 72 74 72  nt Sqlitetestrtr
1f370 65 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  ee_Init(Tcl_Inte
1f380 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
1f390 20 69 6e 74 20 53 71 6c 69 74 65 71 75 6f 74 61   int Sqlitequota
1f3a0 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1f3b0 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1f3c0 6e 74 20 53 71 6c 69 74 65 6d 75 6c 74 69 70 6c  nt Sqlitemultipl
1f3d0 65 78 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  ex_Init(Tcl_Inte
1f3e0 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
1f3f0 20 69 6e 74 20 53 71 6c 69 74 65 53 75 70 65 72   int SqliteSuper
1f400 6c 6f 63 6b 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  lock_Init(Tcl_In
1f410 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
1f420 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1f430 74 53 79 73 63 61 6c 6c 5f 49 6e 69 74 28 54 63  tSyscall_Init(Tc
1f440 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 23 69 66 20  l_Interp*);.#if 
1f450 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
1f460 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 20 26  NABLE_SESSION) &
1f470 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
1f480 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54  _ENABLE_PREUPDAT
1f490 45 5f 48 4f 4f 4b 29 0a 20 20 20 20 65 78 74 65  E_HOOK).    exte
1f4a0 72 6e 20 69 6e 74 20 54 65 73 74 53 65 73 73 69  rn int TestSessi
1f4b0 6f 6e 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  on_Init(Tcl_Inte
1f4c0 72 70 2a 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  rp*);.#endif.   
1f4d0 20 65 78 74 65 72 6e 20 69 6e 74 20 46 74 73 35   extern int Fts5
1f4e0 74 63 6c 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  tcl_Init(Tcl_Int
1f4f0 65 72 70 20 2a 29 3b 0a 20 20 20 20 65 78 74 65  erp *);.    exte
1f500 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 52 62 75  rn int SqliteRbu
1f510 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1f520 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1f530 6e 74 20 53 71 6c 69 74 65 74 65 73 74 74 63 6c  nt Sqlitetesttcl
1f540 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1f550 2a 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  *);.#if defined(
1f560 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54  SQLITE_ENABLE_FT
1f570 53 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  S3) || defined(S
1f580 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53  QLITE_ENABLE_FTS
1f590 34 29 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  4).    extern in
1f5a0 74 20 53 71 6c 69 74 65 74 65 73 74 66 74 73 33  t Sqlitetestfts3
1f5b0 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1f5c0 20 2a 69 6e 74 65 72 70 29 3b 0a 23 65 6e 64 69   *interp);.#endi
1f5d0 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
1f5e0 5f 45 4e 41 42 4c 45 5f 5a 49 50 56 46 53 0a 20  _ENABLE_ZIPVFS. 
1f5f0 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 5a 69     extern int Zi
1f600 70 76 66 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  pvfs_Init(Tcl_In
1f610 74 65 72 70 2a 29 3b 0a 20 20 20 20 5a 69 70 76  terp*);.    Zipv
1f620 66 73 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  fs_Init(interp);
1f630 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 53 71 6c  .#endif..    Sql
1f640 69 74 65 63 6f 6e 66 69 67 5f 49 6e 69 74 28 69  iteconfig_Init(i
1f650 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1f660 74 65 74 65 73 74 31 5f 49 6e 69 74 28 69 6e 74  tetest1_Init(int
1f670 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1f680 74 65 73 74 32 5f 49 6e 69 74 28 69 6e 74 65 72  test2_Init(inter
1f690 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
1f6a0 73 74 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  st3_Init(interp)
1f6b0 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
1f6c0 34 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  4_Init(interp);.
1f6d0 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 35 5f      Sqlitetest5_
1f6e0 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
1f6f0 20 20 53 71 6c 69 74 65 74 65 73 74 36 5f 49 6e    Sqlitetest6_In
1f700 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1f710 53 71 6c 69 74 65 74 65 73 74 37 5f 49 6e 69 74  Sqlitetest7_Init
1f720 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1f730 6c 69 74 65 74 65 73 74 38 5f 49 6e 69 74 28 69  litetest8_Init(i
1f740 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1f750 74 65 74 65 73 74 39 5f 49 6e 69 74 28 69 6e 74  tetest9_Init(int
1f760 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1f770 74 65 73 74 61 73 79 6e 63 5f 49 6e 69 74 28 69  testasync_Init(i
1f780 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1f790 74 65 74 65 73 74 5f 61 75 74 6f 65 78 74 5f 49  tetest_autoext_I
1f7a0 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1f7b0 20 53 71 6c 69 74 65 74 65 73 74 5f 62 6c 6f 62   Sqlitetest_blob
1f7c0 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
1f7d0 20 20 20 53 71 6c 69 74 65 74 65 73 74 5f 64 65     Sqlitetest_de
1f7e0 6d 6f 76 66 73 5f 49 6e 69 74 28 69 6e 74 65 72  movfs_Init(inter
1f7f0 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
1f800 73 74 5f 66 75 6e 63 5f 49 6e 69 74 28 69 6e 74  st_func_Init(int
1f810 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1f820 74 65 73 74 5f 68 65 78 69 6f 5f 49 6e 69 74 28  test_hexio_Init(
1f830 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
1f840 69 74 65 74 65 73 74 5f 69 6e 69 74 5f 49 6e 69  itetest_init_Ini
1f850 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
1f860 71 6c 69 74 65 74 65 73 74 5f 6d 61 6c 6c 6f 63  qlitetest_malloc
1f870 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
1f880 20 20 20 53 71 6c 69 74 65 74 65 73 74 5f 6d 75     Sqlitetest_mu
1f890 74 65 78 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  tex_Init(interp)
1f8a0 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
1f8b0 73 63 68 65 6d 61 5f 49 6e 69 74 28 69 6e 74 65  schema_Init(inte
1f8c0 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
1f8d0 65 73 74 74 63 6c 76 61 72 5f 49 6e 69 74 28 69  esttclvar_Init(i
1f8e0 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1f8f0 74 65 74 65 73 74 66 73 5f 49 6e 69 74 28 69 6e  tetestfs_Init(in
1f900 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
1f910 65 74 65 73 74 54 68 72 65 61 64 5f 49 6e 69 74  etestThread_Init
1f920 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1f930 6c 69 74 65 74 65 73 74 4f 6e 65 66 69 6c 65 5f  litetestOnefile_
1f940 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
1f950 20 20 53 71 6c 69 74 65 74 65 73 74 4f 73 69 6e    SqlitetestOsin
1f960 73 74 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  st_Init(interp);
1f970 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 62  .    Sqlitetestb
1f980 61 63 6b 75 70 5f 49 6e 69 74 28 69 6e 74 65 72  ackup_Init(inter
1f990 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
1f9a0 73 74 69 6e 74 61 72 72 61 79 5f 49 6e 69 74 28  stintarray_Init(
1f9b0 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
1f9c0 69 74 65 74 65 73 74 76 66 73 5f 49 6e 69 74 28  itetestvfs_Init(
1f9d0 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
1f9e0 69 74 65 74 65 73 74 72 74 72 65 65 5f 49 6e 69  itetestrtree_Ini
1f9f0 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
1fa00 71 6c 69 74 65 71 75 6f 74 61 5f 49 6e 69 74 28  qlitequota_Init(
1fa10 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
1fa20 69 74 65 6d 75 6c 74 69 70 6c 65 78 5f 49 6e 69  itemultiplex_Ini
1fa30 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
1fa40 71 6c 69 74 65 53 75 70 65 72 6c 6f 63 6b 5f 49  qliteSuperlock_I
1fa50 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1fa60 20 53 71 6c 69 74 65 74 65 73 74 53 79 73 63 61   SqlitetestSysca
1fa70 6c 6c 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  ll_Init(interp);
1fa80 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
1fa90 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49  ITE_ENABLE_SESSI
1faa0 4f 4e 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  ON) && defined(S
1fab0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45  QLITE_ENABLE_PRE
1fac0 55 50 44 41 54 45 5f 48 4f 4f 4b 29 0a 20 20 20  UPDATE_HOOK).   
1fad0 20 54 65 73 74 53 65 73 73 69 6f 6e 5f 49 6e 69   TestSession_Ini
1fae0 74 28 69 6e 74 65 72 70 29 3b 0a 23 65 6e 64 69  t(interp);.#endi
1faf0 66 0a 20 20 20 20 46 74 73 35 74 63 6c 5f 49 6e  f.    Fts5tcl_In
1fb00 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1fb10 53 71 6c 69 74 65 52 62 75 5f 49 6e 69 74 28 69  SqliteRbu_Init(i
1fb20 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1fb30 74 65 74 65 73 74 74 63 6c 5f 49 6e 69 74 28 69  tetesttcl_Init(i
1fb40 6e 74 65 72 70 29 3b 0a 0a 23 69 66 20 64 65 66  nterp);..#if def
1fb50 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
1fb60 4c 45 5f 46 54 53 33 29 20 7c 7c 20 64 65 66 69  LE_FTS3) || defi
1fb70 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
1fb80 45 5f 46 54 53 34 29 0a 20 20 20 20 53 71 6c 69  E_FTS4).    Sqli
1fb90 74 65 74 65 73 74 66 74 73 33 5f 49 6e 69 74 28  tetestfts3_Init(
1fba0 69 6e 74 65 72 70 29 3b 0a 23 65 6e 64 69 66 0a  interp);.#endif.
1fbb0 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
1fbc0 62 6a 43 6f 6d 6d 61 6e 64 28 0a 20 20 20 20 20  bjCommand(.     
1fbd0 20 20 20 69 6e 74 65 72 70 2c 20 22 6c 6f 61 64     interp, "load
1fbe0 5f 74 65 73 74 66 69 78 74 75 72 65 5f 65 78 74  _testfixture_ext
1fbf0 65 6e 73 69 6f 6e 73 22 2c 20 69 6e 69 74 5f 61  ensions", init_a
1fc00 6c 6c 5f 63 6d 64 2c 20 30 2c 20 30 0a 20 20 20  ll_cmd, 0, 0.   
1fc10 20 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61   );.    Tcl_Crea
1fc20 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 0a 20 20  teObjCommand(.  
1fc30 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20 22 64        interp, "d
1fc40 62 5f 75 73 65 5f 6c 65 67 61 63 79 5f 70 72 65  b_use_legacy_pre
1fc50 70 61 72 65 22 2c 20 64 62 5f 75 73 65 5f 6c 65  pare", db_use_le
1fc60 67 61 63 79 5f 70 72 65 70 61 72 65 5f 63 6d 64  gacy_prepare_cmd
1fc70 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20  , 0, 0.    );.  
1fc80 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
1fc90 6f 6d 6d 61 6e 64 28 0a 20 20 20 20 20 20 20 20  ommand(.        
1fca0 69 6e 74 65 72 70 2c 20 22 64 62 5f 6c 61 73 74  interp, "db_last
1fcb0 5f 73 74 6d 74 5f 70 74 72 22 2c 20 64 62 5f 6c  _stmt_ptr", db_l
1fcc0 61 73 74 5f 73 74 6d 74 5f 70 74 72 2c 20 30 2c  ast_stmt_ptr, 0,
1fcd0 20 30 0a 20 20 20 20 29 3b 0a 0a 23 69 66 64 65   0.    );..#ifde
1fce0 66 20 53 51 4c 49 54 45 5f 53 53 45 0a 20 20 20  f SQLITE_SSE.   
1fcf0 20 53 71 6c 69 74 65 74 65 73 74 73 73 65 5f 49   Sqlitetestsse_I
1fd00 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 23 65 6e  nit(interp);.#en
1fd10 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d  dif.  }.#endif.}
1fd20 0a 0a 2f 2a 20 4e 65 65 64 65 64 20 66 6f 72 20  ../* Needed for 
1fd30 74 68 65 20 73 65 74 72 6c 69 6d 69 74 28 29 20  the setrlimit() 
1fd40 73 79 73 74 65 6d 20 63 61 6c 6c 20 6f 6e 20 75  system call on u
1fd50 6e 69 78 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  nix */.#if defin
1fd60 65 64 28 75 6e 69 78 29 0a 23 69 6e 63 6c 75 64  ed(unix).#includ
1fd70 65 20 3c 73 79 73 2f 72 65 73 6f 75 72 63 65 2e  e <sys/resource.
1fd80 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  h>.#endif..#defi
1fd90 6e 65 20 54 43 4c 53 48 5f 4d 41 49 4e 20 6d 61  ne TCLSH_MAIN ma
1fda0 69 6e 20 20 20 2f 2a 20 4e 65 65 64 65 64 20 74  in   /* Needed t
1fdb0 6f 20 66 61 6b 65 20 6f 75 74 20 6d 6b 74 63 6c  o fake out mktcl
1fdc0 61 70 70 20 2a 2f 0a 69 6e 74 20 54 43 4c 53 48  app */.int TCLSH
1fdd0 5f 4d 41 49 4e 28 69 6e 74 20 61 72 67 63 2c 20  _MAIN(int argc, 
1fde0 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20  char **argv){.  
1fdf0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1fe00 72 70 3b 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  rp;..#if !define
1fe10 64 28 5f 57 49 4e 33 32 5f 57 43 45 29 0a 20 20  d(_WIN32_WCE).  
1fe20 69 66 28 20 67 65 74 65 6e 76 28 22 42 52 45 41  if( getenv("BREA
1fe30 4b 22 29 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  K") ){.    fprin
1fe40 74 66 28 73 74 64 65 72 72 2c 0a 20 20 20 20 20  tf(stderr,.     
1fe50 20 20 20 22 61 74 74 61 63 68 20 64 65 62 75 67     "attach debug
1fe60 67 65 72 20 74 6f 20 70 72 6f 63 65 73 73 20 25  ger to process %
1fe70 64 20 61 6e 64 20 70 72 65 73 73 20 61 6e 79 20  d and press any 
1fe80 6b 65 79 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e  key to continue.
1fe90 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 47 45 54  \n",.        GET
1fea0 50 49 44 28 29 29 3b 0a 20 20 20 20 66 67 65 74  PID());.    fget
1feb0 63 28 73 74 64 69 6e 29 3b 0a 20 20 7d 0a 23 65  c(stdin);.  }.#e
1fec0 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 69 6e 63 65  ndif..  /* Since
1fed0 20 74 68 65 20 70 72 69 6d 61 72 79 20 75 73 65   the primary use
1fee0 20 63 61 73 65 20 66 6f 72 20 74 68 69 73 20 62   case for this b
1fef0 69 6e 61 72 79 20 69 73 20 74 65 73 74 69 6e 67  inary is testing
1ff00 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20 20 2a 2a   of SQLite,.  **
1ff10 20 62 65 20 73 75 72 65 20 74 6f 20 67 65 6e 65   be sure to gene
1ff20 72 61 74 65 20 63 6f 72 65 20 66 69 6c 65 73 20  rate core files 
1ff30 69 66 20 77 65 20 63 72 61 73 68 20 2a 2f 0a 23  if we crash */.#
1ff40 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1ff50 45 5f 54 45 53 54 29 20 26 26 20 64 65 66 69 6e  E_TEST) && defin
1ff60 65 64 28 75 6e 69 78 29 0a 20 20 7b 20 73 74 72  ed(unix).  { str
1ff70 75 63 74 20 72 6c 69 6d 69 74 20 78 3b 0a 20 20  uct rlimit x;.  
1ff80 20 20 67 65 74 72 6c 69 6d 69 74 28 52 4c 49 4d    getrlimit(RLIM
1ff90 49 54 5f 43 4f 52 45 2c 20 26 78 29 3b 0a 20 20  IT_CORE, &x);.  
1ffa0 20 20 78 2e 72 6c 69 6d 5f 63 75 72 20 3d 20 78    x.rlim_cur = x
1ffb0 2e 72 6c 69 6d 5f 6d 61 78 3b 0a 20 20 20 20 73  .rlim_max;.    s
1ffc0 65 74 72 6c 69 6d 69 74 28 52 4c 49 4d 49 54 5f  etrlimit(RLIMIT_
1ffd0 43 4f 52 45 2c 20 26 78 29 3b 0a 20 20 7d 0a 23  CORE, &x);.  }.#
1ffe0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1fff0 54 45 53 54 20 26 26 20 75 6e 69 78 20 2a 2f 0a  TEST && unix */.
20000 0a 0a 20 20 2f 2a 20 43 61 6c 6c 20 73 71 6c 69  ..  /* Call sqli
20010 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 29 20 6f  te3_shutdown() o
20020 6e 63 65 20 62 65 66 6f 72 65 20 64 6f 69 6e 67  nce before doing
20030 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 2e 20   anything else. 
20040 54 68 69 73 20 69 73 20 74 6f 0a 20 20 2a 2a 20  This is to.  ** 
20050 74 65 73 74 20 74 68 61 74 20 73 71 6c 69 74 65  test that sqlite
20060 33 5f 73 68 75 74 64 6f 77 6e 28 29 20 63 61 6e  3_shutdown() can
20070 20 62 65 20 73 61 66 65 6c 79 20 63 61 6c 6c 65   be safely calle
20080 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 62  d by a process b
20090 65 66 6f 72 65 0a 20 20 2a 2a 20 73 71 6c 69 74  efore.  ** sqlit
200a0 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20  e3_initialize() 
200b0 69 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  is. */.  sqlite3
200c0 5f 73 68 75 74 64 6f 77 6e 28 29 3b 0a 0a 20 20  _shutdown();..  
200d0 54 63 6c 5f 46 69 6e 64 45 78 65 63 75 74 61 62  Tcl_FindExecutab
200e0 6c 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 54  le(argv[0]);.  T
200f0 63 6c 5f 53 65 74 53 79 73 74 65 6d 45 6e 63 6f  cl_SetSystemEnco
20100 64 69 6e 67 28 4e 55 4c 4c 2c 20 22 75 74 66 2d  ding(NULL, "utf-
20110 38 22 29 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20  8");.  interp = 
20120 54 63 6c 5f 43 72 65 61 74 65 49 6e 74 65 72 70  Tcl_CreateInterp
20130 28 29 3b 0a 0a 23 69 66 20 54 43 4c 53 48 3d 3d  ();..#if TCLSH==
20140 32 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66  2.  sqlite3_conf
20150 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  ig(SQLITE_CONFIG
20160 5f 53 49 4e 47 4c 45 54 48 52 45 41 44 29 3b 0a  _SINGLETHREAD);.
20170 23 65 6e 64 69 66 0a 0a 20 20 69 6e 69 74 5f 61  #endif..  init_a
20180 6c 6c 28 69 6e 74 65 72 70 29 3b 0a 20 20 69 66  ll(interp);.  if
20190 28 20 61 72 67 63 3e 3d 32 20 29 7b 0a 20 20 20  ( argc>=2 ){.   
201a0 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 68 61 72   int i;.    char
201b0 20 7a 41 72 67 63 5b 33 32 5d 3b 0a 20 20 20 20   zArgc[32];.    
201c0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
201d0 28 73 69 7a 65 6f 66 28 7a 41 72 67 63 29 2c 20  (sizeof(zArgc), 
201e0 7a 41 72 67 63 2c 20 22 25 64 22 2c 20 61 72 67  zArgc, "%d", arg
201f0 63 2d 28 33 2d 54 43 4c 53 48 29 29 3b 0a 20 20  c-(3-TCLSH));.  
20200 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74    Tcl_SetVar(int
20210 65 72 70 2c 22 61 72 67 63 22 2c 20 7a 41 72 67  erp,"argc", zArg
20220 63 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e  c, TCL_GLOBAL_ON
20230 4c 59 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  LY);.    Tcl_Set
20240 56 61 72 28 69 6e 74 65 72 70 2c 22 61 72 67 76  Var(interp,"argv
20250 30 22 2c 61 72 67 76 5b 31 5d 2c 54 43 4c 5f 47  0",argv[1],TCL_G
20260 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20  LOBAL_ONLY);.   
20270 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65   Tcl_SetVar(inte
20280 72 70 2c 22 61 72 67 76 22 2c 20 22 22 2c 20 54  rp,"argv", "", T
20290 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b  CL_GLOBAL_ONLY);
202a0 0a 20 20 20 20 66 6f 72 28 69 3d 33 2d 54 43 4c  .    for(i=3-TCL
202b0 53 48 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29  SH; i<argc; i++)
202c0 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 56  {.      Tcl_SetV
202d0 61 72 28 69 6e 74 65 72 70 2c 20 22 61 72 67 76  ar(interp, "argv
202e0 22 2c 20 61 72 67 76 5b 69 5d 2c 0a 20 20 20 20  ", argv[i],.    
202f0 20 20 20 20 20 20 54 43 4c 5f 47 4c 4f 42 41 4c        TCL_GLOBAL
20300 5f 4f 4e 4c 59 20 7c 20 54 43 4c 5f 4c 49 53 54  _ONLY | TCL_LIST
20310 5f 45 4c 45 4d 45 4e 54 20 7c 20 54 43 4c 5f 41  _ELEMENT | TCL_A
20320 50 50 45 4e 44 5f 56 41 4c 55 45 29 3b 0a 20 20  PPEND_VALUE);.  
20330 20 20 7d 0a 20 20 20 20 69 66 28 20 54 43 4c 53    }.    if( TCLS
20340 48 3d 3d 31 20 26 26 20 54 63 6c 5f 45 76 61 6c  H==1 && Tcl_Eval
20350 46 69 6c 65 28 69 6e 74 65 72 70 2c 20 61 72 67  File(interp, arg
20360 76 5b 31 5d 29 21 3d 54 43 4c 5f 4f 4b 20 29 7b  v[1])!=TCL_OK ){
20370 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
20380 72 20 2a 7a 49 6e 66 6f 20 3d 20 54 63 6c 5f 47  r *zInfo = Tcl_G
20390 65 74 56 61 72 28 69 6e 74 65 72 70 2c 20 22 65  etVar(interp, "e
203a0 72 72 6f 72 49 6e 66 6f 22 2c 20 54 43 4c 5f 47  rrorInfo", TCL_G
203b0 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20  LOBAL_ONLY);.   
203c0 20 20 20 69 66 28 20 7a 49 6e 66 6f 3d 3d 30 20     if( zInfo==0 
203d0 29 20 7a 49 6e 66 6f 20 3d 20 54 63 6c 5f 47 65  ) zInfo = Tcl_Ge
203e0 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e  tStringResult(in
203f0 74 65 72 70 29 3b 0a 20 20 20 20 20 20 66 70 72  terp);.      fpr
20400 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25 73 3a  intf(stderr,"%s:
20410 20 25 73 5c 6e 22 2c 20 2a 61 72 67 76 2c 20 7a   %s\n", *argv, z
20420 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 72 65 74  Info);.      ret
20430 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
20440 0a 20 20 69 66 28 20 54 43 4c 53 48 3d 3d 32 20  .  if( TCLSH==2 
20450 7c 7c 20 61 72 67 63 3c 3d 31 20 29 7b 0a 20 20  || argc<=1 ){.  
20460 20 20 54 63 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c    Tcl_GlobalEval
20470 28 69 6e 74 65 72 70 2c 20 74 63 6c 73 68 5f 6d  (interp, tclsh_m
20480 61 69 6e 5f 6c 6f 6f 70 28 29 29 3b 0a 20 20 7d  ain_loop());.  }
20490 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
204a0 65 6e 64 69 66 20 2f 2a 20 54 43 4c 53 48 20 2a  endif /* TCLSH *
204b0 2f 0a                                            /.