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

Artifact 5c213bf5fee084390f632df2328cf0821d483799:


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 20 5c 0a 20 20  TING_POINT) \.  
16440 20 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51    && !defined(SQ
16450 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43  LITE_OMIT_DEPREC
16460 41 54 45 44 29 0a 20 20 20 20 20 20 69 66 28 20  ATED).      if( 
16470 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20  pDb->zTrace ){. 
16480 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65         pDb->inte
16490 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20  rp = interp;.   
164a0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 72 61       sqlite3_tra
164b0 63 65 28 70 44 62 2d 3e 64 62 2c 20 44 62 54 72  ce(pDb->db, DbTr
164c0 61 63 65 48 61 6e 64 6c 65 72 2c 20 70 44 62 29  aceHandler, pDb)
164d0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
164e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74         sqlite3_t
164f0 72 61 63 65 28 70 44 62 2d 3e 64 62 2c 20 30 2c  race(pDb->db, 0,
16500 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e   0);.      }.#en
16510 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 62 72  dif.    }.    br
16520 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
16530 20 20 24 64 62 20 74 72 61 63 65 5f 76 32 20 3f    $db trace_v2 ?
16540 43 41 4c 4c 42 41 43 4b 3f 20 3f 4d 41 53 4b 3f  CALLBACK? ?MASK?
16550 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20  .  **.  ** Make 
16560 61 72 72 61 6e 67 65 6d 65 6e 74 73 20 74 6f 20  arrangements to 
16570 69 6e 76 6f 6b 65 20 74 68 65 20 43 41 4c 4c 42  invoke the CALLB
16580 41 43 4b 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  ACK routine for 
16590 65 61 63 68 20 74 72 61 63 65 20 65 76 65 6e 74  each trace event
165a0 0a 20 20 2a 2a 20 6d 61 74 63 68 69 6e 67 20 74  .  ** matching t
165b0 68 65 20 6d 61 73 6b 20 74 68 61 74 20 69 73 20  he mask that is 
165c0 67 65 6e 65 72 61 74 65 64 2e 20 20 54 68 65 20  generated.  The 
165d0 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 61  parameters are a
165e0 70 70 65 6e 64 65 64 20 74 6f 0a 20 20 2a 2a 20  ppended to.  ** 
165f0 43 41 4c 4c 42 41 43 4b 20 62 65 66 6f 72 65 20  CALLBACK before 
16600 69 74 20 69 73 20 65 78 65 63 75 74 65 64 2e 0a  it is executed..
16610 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 54    */.  case DB_T
16620 52 41 43 45 5f 56 32 3a 20 7b 0a 20 20 20 20 69  RACE_V2: {.    i
16630 66 28 20 6f 62 6a 63 3e 34 20 29 7b 0a 20 20 20  f( objc>4 ){.   
16640 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
16650 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
16660 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f  bjv, "?CALLBACK?
16670 20 3f 4d 41 53 4b 3f 22 29 3b 0a 20 20 20 20 20   ?MASK?");.     
16680 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
16690 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  R;.    }else if(
166a0 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20   objc==2 ){.    
166b0 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63    if( pDb->zTrac
166c0 65 56 32 20 29 7b 0a 20 20 20 20 20 20 20 20 54  eV2 ){.        T
166d0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
166e0 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 54 72  interp, pDb->zTr
166f0 61 63 65 56 32 2c 20 28 63 68 61 72 2a 29 30 29  aceV2, (char*)0)
16700 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
16710 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20  lse{.      char 
16720 2a 7a 54 72 61 63 65 56 32 3b 0a 20 20 20 20 20  *zTraceV2;.     
16730 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20   int len;.      
16740 54 63 6c 5f 57 69 64 65 49 6e 74 20 77 4d 61 73  Tcl_WideInt wMas
16750 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  k = 0;.      if(
16760 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20   objc==4 ){.    
16770 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
16780 20 63 68 61 72 20 2a 54 54 59 50 45 5f 73 74 72   char *TTYPE_str
16790 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  s[] = {.        
167a0 20 20 22 73 74 61 74 65 6d 65 6e 74 22 2c 20 22    "statement", "
167b0 70 72 6f 66 69 6c 65 22 2c 20 22 72 6f 77 22 2c  profile", "row",
167c0 20 22 63 6c 6f 73 65 22 2c 20 30 0a 20 20 20 20   "close", 0.    
167d0 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 20 20 65      };.        e
167e0 6e 75 6d 20 54 54 59 50 45 5f 65 6e 75 6d 20 7b  num TTYPE_enum {
167f0 0a 20 20 20 20 20 20 20 20 20 20 54 54 59 50 45  .          TTYPE
16800 5f 53 54 4d 54 2c 20 54 54 59 50 45 5f 50 52 4f  _STMT, TTYPE_PRO
16810 46 49 4c 45 2c 20 54 54 59 50 45 5f 52 4f 57 2c  FILE, TTYPE_ROW,
16820 20 54 54 59 50 45 5f 43 4c 4f 53 45 0a 20 20 20   TTYPE_CLOSE.   
16830 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 20 20       };.        
16840 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 69  int i;.        i
16850 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 4c  f( TCL_OK!=Tcl_L
16860 69 73 74 4f 62 6a 4c 65 6e 67 74 68 28 69 6e 74  istObjLength(int
16870 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6c  erp, objv[3], &l
16880 65 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  en) ){.         
16890 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
168a0 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  R;.        }.   
168b0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
168c0 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  len; i++){.     
168d0 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 4f       Tcl_Obj *pO
168e0 62 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  bj;.          in
168f0 74 20 74 74 79 70 65 3b 0a 20 20 20 20 20 20 20  t ttype;.       
16900 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54     if( TCL_OK!=T
16910 63 6c 5f 4c 69 73 74 4f 62 6a 49 6e 64 65 78 28  cl_ListObjIndex(
16920 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
16930 20 69 2c 20 26 70 4f 62 6a 29 20 29 7b 0a 20 20   i, &pObj) ){.  
16940 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
16950 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
16960 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16970 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 64    if( Tcl_GetInd
16980 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  exFromObj(interp
16990 2c 20 70 4f 62 6a 2c 20 54 54 59 50 45 5f 73 74  , pObj, TTYPE_st
169a0 72 73 2c 20 22 74 72 61 63 65 20 74 79 70 65 22  rs, "trace type"
169b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
169c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
169d0 20 20 20 20 30 2c 20 26 74 74 79 70 65 29 21 3d      0, &ttype)!=
169e0 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  TCL_OK ){.      
169f0 20 20 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e        Tcl_WideIn
16a00 74 20 77 54 79 70 65 3b 0a 20 20 20 20 20 20 20  t wType;.       
16a10 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 45       Tcl_Obj *pE
16a20 72 72 6f 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69  rror = Tcl_Dupli
16a30 63 61 74 65 4f 62 6a 28 54 63 6c 5f 47 65 74 4f  cateObj(Tcl_GetO
16a40 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  bjResult(interp)
16a50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 54  );.            T
16a60 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
16a70 70 45 72 72 6f 72 29 3b 0a 20 20 20 20 20 20 20  pError);.       
16a80 20 20 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b 3d       if( TCL_OK=
16a90 3d 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46  =Tcl_GetWideIntF
16aa0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70  romObj(interp, p
16ab0 4f 62 6a 2c 20 26 77 54 79 70 65 29 20 29 7b 0a  Obj, &wType) ){.
16ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63                Tc
16ad0 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
16ae0 45 72 72 6f 72 29 3b 0a 20 20 20 20 20 20 20 20  Error);.        
16af0 20 20 20 20 20 20 77 4d 61 73 6b 20 7c 3d 20 77        wMask |= w
16b00 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Type;.          
16b10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
16b20 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62         Tcl_SetOb
16b30 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
16b40 70 45 72 72 6f 72 29 3b 0a 20 20 20 20 20 20 20  pError);.       
16b50 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52         Tcl_DecrR
16b60 65 66 43 6f 75 6e 74 28 70 45 72 72 6f 72 29 3b  efCount(pError);
16b70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
16b80 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
16b90 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
16ba0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
16bb0 20 20 20 20 20 20 20 20 20 20 20 20 73 77 69 74              swit
16bc0 63 68 28 20 28 65 6e 75 6d 20 54 54 59 50 45 5f  ch( (enum TTYPE_
16bd0 65 6e 75 6d 29 74 74 79 70 65 20 29 7b 0a 20 20  enum)ttype ){.  
16be0 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65              case
16bf0 20 54 54 59 50 45 5f 53 54 4d 54 3a 20 20 20 20   TTYPE_STMT:    
16c00 77 4d 61 73 6b 20 7c 3d 20 53 51 4c 49 54 45 5f  wMask |= SQLITE_
16c10 54 52 41 43 45 5f 53 54 4d 54 3b 20 20 20 20 62  TRACE_STMT;    b
16c20 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
16c30 20 20 20 20 63 61 73 65 20 54 54 59 50 45 5f 50      case TTYPE_P
16c40 52 4f 46 49 4c 45 3a 20 77 4d 61 73 6b 20 7c 3d  ROFILE: wMask |=
16c50 20 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 50 52   SQLITE_TRACE_PR
16c60 4f 46 49 4c 45 3b 20 62 72 65 61 6b 3b 0a 20 20  OFILE; break;.  
16c70 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65              case
16c80 20 54 54 59 50 45 5f 52 4f 57 3a 20 20 20 20 20   TTYPE_ROW:     
16c90 77 4d 61 73 6b 20 7c 3d 20 53 51 4c 49 54 45 5f  wMask |= SQLITE_
16ca0 54 52 41 43 45 5f 52 4f 57 3b 20 20 20 20 20 62  TRACE_ROW;     b
16cb0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
16cc0 20 20 20 20 63 61 73 65 20 54 54 59 50 45 5f 43      case TTYPE_C
16cd0 4c 4f 53 45 3a 20 20 20 77 4d 61 73 6b 20 7c 3d  LOSE:   wMask |=
16ce0 20 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 43 4c   SQLITE_TRACE_CL
16cf0 4f 53 45 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  OSE;   break;.  
16d00 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
16d10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16d20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
16d30 20 20 20 20 20 20 20 77 4d 61 73 6b 20 3d 20 53         wMask = S
16d40 51 4c 49 54 45 5f 54 52 41 43 45 5f 53 54 4d 54  QLITE_TRACE_STMT
16d50 3b 20 2f 2a 20 75 73 65 20 74 68 65 20 22 6c 65  ; /* use the "le
16d60 67 61 63 79 22 20 64 65 66 61 75 6c 74 20 2a 2f  gacy" default */
16d70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
16d80 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 56 32  f( pDb->zTraceV2
16d90 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
16da0 46 72 65 65 28 70 44 62 2d 3e 7a 54 72 61 63 65  Free(pDb->zTrace
16db0 56 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  V2);.      }.   
16dc0 20 20 20 7a 54 72 61 63 65 56 32 20 3d 20 54 63     zTraceV2 = Tc
16dd0 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
16de0 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e  bj(objv[2], &len
16df0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 54 72  );.      if( zTr
16e00 61 63 65 56 32 20 26 26 20 6c 65 6e 3e 30 20 29  aceV2 && len>0 )
16e10 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
16e20 54 72 61 63 65 56 32 20 3d 20 54 63 6c 5f 41 6c  TraceV2 = Tcl_Al
16e30 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a  loc( len + 1 );.
16e40 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
16e50 44 62 2d 3e 7a 54 72 61 63 65 56 32 2c 20 7a 54  Db->zTraceV2, zT
16e60 72 61 63 65 56 32 2c 20 6c 65 6e 2b 31 29 3b 0a  raceV2, len+1);.
16e70 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
16e80 20 20 20 20 20 70 44 62 2d 3e 7a 54 72 61 63 65       pDb->zTrace
16e90 56 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  V2 = 0;.      }.
16ea0 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
16eb0 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20  ITE_OMIT_TRACE) 
16ec0 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
16ed0 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
16ee0 5f 50 4f 49 4e 54 29 0a 20 20 20 20 20 20 69 66  _POINT).      if
16ef0 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 56 32 20  ( pDb->zTraceV2 
16f00 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
16f10 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b  interp = interp;
16f20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
16f30 5f 74 72 61 63 65 5f 76 32 28 70 44 62 2d 3e 64  _trace_v2(pDb->d
16f40 62 2c 20 28 75 6e 73 69 67 6e 65 64 29 77 4d 61  b, (unsigned)wMa
16f50 73 6b 2c 20 44 62 54 72 61 63 65 56 32 48 61 6e  sk, DbTraceV2Han
16f60 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20  dler, pDb);.    
16f70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
16f80 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65 5f 76   sqlite3_trace_v
16f90 32 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 2c  2(pDb->db, 0, 0,
16fa0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e   0);.      }.#en
16fb0 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 62 72  dif.    }.    br
16fc0 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
16fd0 20 20 24 64 62 20 74 72 61 6e 73 61 63 74 69 6f    $db transactio
16fe0 6e 20 5b 2d 64 65 66 65 72 72 65 64 7c 2d 69 6d  n [-deferred|-im
16ff0 6d 65 64 69 61 74 65 7c 2d 65 78 63 6c 75 73 69  mediate|-exclusi
17000 76 65 5d 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a  ve] SCRIPT.  **.
17010 20 20 2a 2a 20 53 74 61 72 74 20 61 20 6e 65 77    ** Start a new
17020 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 66   transaction (if
17030 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65   we are not alre
17040 61 64 79 20 69 6e 20 74 68 65 20 6d 69 64 73 74  ady in the midst
17050 20 6f 66 20 61 0a 20 20 2a 2a 20 74 72 61 6e 73   of a.  ** trans
17060 61 63 74 69 6f 6e 29 20 61 6e 64 20 65 78 65 63  action) and exec
17070 75 74 65 20 74 68 65 20 54 43 4c 20 73 63 72 69  ute the TCL scri
17080 70 74 20 53 43 52 49 50 54 2e 20 20 41 66 74 65  pt SCRIPT.  Afte
17090 72 20 53 43 52 49 50 54 0a 20 20 2a 2a 20 63 6f  r SCRIPT.  ** co
170a0 6d 70 6c 65 74 65 73 2c 20 65 69 74 68 65 72 20  mpletes, either 
170b0 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  commit the trans
170c0 61 63 74 69 6f 6e 20 6f 72 20 72 6f 6c 6c 20 69  action or roll i
170d0 74 20 62 61 63 6b 20 69 66 20 53 43 52 49 50 54  t back if SCRIPT
170e0 0a 20 20 2a 2a 20 74 68 72 6f 77 73 20 61 6e 20  .  ** throws an 
170f0 65 78 63 65 70 74 69 6f 6e 2e 20 20 4f 72 20 69  exception.  Or i
17100 66 20 6e 6f 20 6e 65 77 20 74 72 61 6e 73 61 74  f no new transat
17110 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64 2c  ion was started,
17120 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 20 20 2a   do nothing..  *
17130 2a 20 70 61 73 73 20 74 68 65 20 65 78 63 65 70  * pass the excep
17140 74 69 6f 6e 20 6f 6e 20 75 70 20 74 68 65 20 73  tion on up the s
17150 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  tack..  **.  ** 
17160 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 77 61 73  This command was
17170 20 69 6e 73 70 69 72 65 64 20 62 79 20 44 61 76   inspired by Dav
17180 65 20 54 68 6f 6d 61 73 27 73 20 74 61 6c 6b 20  e Thomas's talk 
17190 6f 6e 20 52 75 62 79 20 61 74 20 74 68 65 0a 20  on Ruby at the. 
171a0 20 2a 2a 20 32 30 30 35 20 4f 27 52 65 69 6c 6c   ** 2005 O'Reill
171b0 79 20 4f 70 65 6e 20 53 6f 75 72 63 65 20 43 6f  y Open Source Co
171c0 6e 76 65 6e 74 69 6f 6e 20 28 4f 53 43 4f 4e 29  nvention (OSCON)
171d0 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
171e0 5f 54 52 41 4e 53 41 43 54 49 4f 4e 3a 20 7b 0a  _TRANSACTION: {.
171f0 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63      Tcl_Obj *pSc
17200 72 69 70 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20  ript;.    const 
17210 63 68 61 72 20 2a 7a 42 65 67 69 6e 20 3d 20 22  char *zBegin = "
17220 53 41 56 45 50 4f 49 4e 54 20 5f 74 63 6c 5f 74  SAVEPOINT _tcl_t
17230 72 61 6e 73 61 63 74 69 6f 6e 22 3b 0a 20 20 20  ransaction";.   
17240 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 26 26 20   if( objc!=3 && 
17250 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 20  objc!=4 ){.     
17260 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
17270 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
17280 76 2c 20 22 5b 54 59 50 45 5d 20 53 43 52 49 50  v, "[TYPE] SCRIP
17290 54 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  T");.      retur
172a0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
172b0 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 44 62 2d   }..    if( pDb-
172c0 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 30  >nTransaction==0
172d0 20 26 26 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20   && objc==4 ){. 
172e0 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
172f0 74 20 63 68 61 72 20 2a 54 54 59 50 45 5f 73 74  t char *TTYPE_st
17300 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  rs[] = {.       
17310 20 22 64 65 66 65 72 72 65 64 22 2c 20 20 20 22   "deferred",   "
17320 65 78 63 6c 75 73 69 76 65 22 2c 20 20 22 69 6d  exclusive",  "im
17330 6d 65 64 69 61 74 65 22 2c 20 30 0a 20 20 20 20  mediate", 0.    
17340 20 20 7d 3b 0a 20 20 20 20 20 20 65 6e 75 6d 20    };.      enum 
17350 54 54 59 50 45 5f 65 6e 75 6d 20 7b 0a 20 20 20  TTYPE_enum {.   
17360 20 20 20 20 20 54 54 59 50 45 5f 44 45 46 45 52       TTYPE_DEFER
17370 52 45 44 2c 20 54 54 59 50 45 5f 45 58 43 4c 55  RED, TTYPE_EXCLU
17380 53 49 56 45 2c 20 54 54 59 50 45 5f 49 4d 4d 45  SIVE, TTYPE_IMME
17390 44 49 41 54 45 0a 20 20 20 20 20 20 7d 3b 0a 20  DIATE.      };. 
173a0 20 20 20 20 20 69 6e 74 20 74 74 79 70 65 3b 0a       int ttype;.
173b0 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65        if( Tcl_Ge
173c0 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e  tIndexFromObj(in
173d0 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 54  terp, objv[2], T
173e0 54 59 50 45 5f 73 74 72 73 2c 20 22 74 72 61 6e  TYPE_strs, "tran
173f0 73 61 63 74 69 6f 6e 20 74 79 70 65 22 2c 0a 20  saction type",. 
17400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17410 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
17420 26 74 74 79 70 65 29 20 29 7b 0a 20 20 20 20 20  &ttype) ){.     
17430 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
17440 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
17450 20 20 20 73 77 69 74 63 68 28 20 28 65 6e 75 6d     switch( (enum
17460 20 54 54 59 50 45 5f 65 6e 75 6d 29 74 74 79 70   TTYPE_enum)ttyp
17470 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73  e ){.        cas
17480 65 20 54 54 59 50 45 5f 44 45 46 45 52 52 45 44  e TTYPE_DEFERRED
17490 3a 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f  :    /* no-op */
174a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
174b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
174c0 20 63 61 73 65 20 54 54 59 50 45 5f 45 58 43 4c   case TTYPE_EXCL
174d0 55 53 49 56 45 3a 20 20 20 7a 42 65 67 69 6e 20  USIVE:   zBegin 
174e0 3d 20 22 42 45 47 49 4e 20 45 58 43 4c 55 53 49  = "BEGIN EXCLUSI
174f0 56 45 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  VE";  break;.   
17500 20 20 20 20 20 63 61 73 65 20 54 54 59 50 45 5f       case TTYPE_
17510 49 4d 4d 45 44 49 41 54 45 3a 20 20 20 7a 42 65  IMMEDIATE:   zBe
17520 67 69 6e 20 3d 20 22 42 45 47 49 4e 20 49 4d 4d  gin = "BEGIN IMM
17530 45 44 49 41 54 45 22 3b 20 20 62 72 65 61 6b 3b  EDIATE";  break;
17540 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
17550 20 20 20 70 53 63 72 69 70 74 20 3d 20 6f 62 6a     pScript = obj
17560 76 5b 6f 62 6a 63 2d 31 5d 3b 0a 0a 20 20 20 20  v[objc-1];..    
17570 2f 2a 20 52 75 6e 20 74 68 65 20 53 51 4c 69 74  /* Run the SQLit
17580 65 20 42 45 47 49 4e 20 63 6f 6d 6d 61 6e 64 20  e BEGIN command 
17590 74 6f 20 6f 70 65 6e 20 61 20 74 72 61 6e 73 61  to open a transa
175a0 63 74 69 6f 6e 20 6f 72 20 73 61 76 65 70 6f 69  ction or savepoi
175b0 6e 74 2e 20 2a 2f 0a 20 20 20 20 70 44 62 2d 3e  nt. */.    pDb->
175c0 64 69 73 61 62 6c 65 41 75 74 68 2b 2b 3b 0a 20  disableAuth++;. 
175d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
175e0 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 7a 42  exec(pDb->db, zB
175f0 65 67 69 6e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  egin, 0, 0, 0);.
17600 20 20 20 20 70 44 62 2d 3e 64 69 73 61 62 6c 65      pDb->disable
17610 41 75 74 68 2d 2d 3b 0a 20 20 20 20 69 66 28 20  Auth--;.    if( 
17620 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
17630 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
17640 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
17650 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
17660 44 62 2d 3e 64 62 29 2c 20 28 63 68 61 72 2a 29  Db->db), (char*)
17670 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
17680 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
17690 7d 0a 20 20 20 20 70 44 62 2d 3e 6e 54 72 61 6e  }.    pDb->nTran
176a0 73 61 63 74 69 6f 6e 2b 2b 3b 0a 0a 20 20 20 20  saction++;..    
176b0 2f 2a 20 49 66 20 75 73 69 6e 67 20 4e 52 45 2c  /* If using NRE,
176c0 20 73 63 68 65 64 75 6c 65 20 61 20 63 61 6c 6c   schedule a call
176d0 62 61 63 6b 20 74 6f 20 69 6e 76 6f 6b 65 20 74  back to invoke t
176e0 68 65 20 73 63 72 69 70 74 20 70 53 63 72 69 70  he script pScrip
176f0 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61  t, then.    ** a
17700 20 73 65 63 6f 6e 64 20 63 61 6c 6c 62 61 63 6b   second callback
17710 20 74 6f 20 63 6f 6d 6d 69 74 20 28 6f 72 20 72   to commit (or r
17720 6f 6c 6c 62 61 63 6b 29 20 74 68 65 20 74 72 61  ollback) the tra
17730 6e 73 61 63 74 69 6f 6e 20 6f 72 20 73 61 76 65  nsaction or save
17740 70 6f 69 6e 74 0a 20 20 20 20 2a 2a 20 6f 70 65  point.    ** ope
17750 6e 65 64 20 61 62 6f 76 65 2e 20 49 66 20 6e 6f  ned above. If no
17760 74 20 75 73 69 6e 67 20 4e 52 45 2c 20 65 76 61  t using NRE, eva
17770 6c 75 61 74 65 20 74 68 65 20 73 63 72 69 70 74  luate the script
17780 20 64 69 72 65 63 74 6c 79 2c 20 74 68 65 6e 0a   directly, then.
17790 20 20 20 20 2a 2a 20 63 61 6c 6c 20 66 75 6e 63      ** call func
177a0 74 69 6f 6e 20 44 62 54 72 61 6e 73 50 6f 73 74  tion DbTransPost
177b0 43 6d 64 28 29 20 74 6f 20 63 6f 6d 6d 69 74 20  Cmd() to commit 
177c0 28 6f 72 20 72 6f 6c 6c 62 61 63 6b 29 20 74 68  (or rollback) th
177d0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  e transaction.  
177e0 20 20 2a 2a 20 6f 72 20 73 61 76 65 70 6f 69 6e    ** or savepoin
177f0 74 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 44  t.  */.    if( D
17800 62 55 73 65 4e 72 65 28 29 20 29 7b 0a 20 20 20  bUseNre() ){.   
17810 20 20 20 54 63 6c 5f 4e 52 41 64 64 43 61 6c 6c     Tcl_NRAddCall
17820 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 44 62 54  back(interp, DbT
17830 72 61 6e 73 50 6f 73 74 43 6d 64 2c 20 63 64 2c  ransPostCmd, cd,
17840 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
17850 20 28 76 6f 69 64 29 54 63 6c 5f 4e 52 45 76 61   (void)Tcl_NREva
17860 6c 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 53 63  lObj(interp, pSc
17870 72 69 70 74 2c 20 30 29 3b 0a 20 20 20 20 7d 65  ript, 0);.    }e
17880 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
17890 44 62 54 72 61 6e 73 50 6f 73 74 43 6d 64 28 26  DbTransPostCmd(&
178a0 63 64 2c 20 69 6e 74 65 72 70 2c 20 54 63 6c 5f  cd, interp, Tcl_
178b0 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70  EvalObjEx(interp
178c0 2c 20 70 53 63 72 69 70 74 2c 20 30 29 29 3b 0a  , pScript, 0));.
178d0 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
178e0 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
178f0 20 20 20 24 64 62 20 75 6e 6c 6f 63 6b 5f 6e 6f     $db unlock_no
17900 74 69 66 79 20 3f 73 63 72 69 70 74 3f 0a 20 20  tify ?script?.  
17910 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 55 4e 4c  */.  case DB_UNL
17920 4f 43 4b 5f 4e 4f 54 49 46 59 3a 20 7b 0a 23 69  OCK_NOTIFY: {.#i
17930 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  fndef SQLITE_ENA
17940 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46  BLE_UNLOCK_NOTIF
17950 59 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  Y.    Tcl_Append
17960 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
17970 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 20 6e 6f  unlock_notify no
17980 74 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74  t available in t
17990 68 69 73 20 62 75 69 6c 64 22 2c 0a 20 20 20 20  his build",.    
179a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179b0 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
179c0 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  rc = TCL_ERROR;.
179d0 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 6f 62  #else.    if( ob
179e0 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33  jc!=2 && objc!=3
179f0 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
17a00 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
17a10 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 53 43  p, 2, objv, "?SC
17a20 52 49 50 54 3f 22 29 3b 0a 20 20 20 20 20 20 72  RIPT?");.      r
17a30 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  c = TCL_ERROR;. 
17a40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17a50 76 6f 69 64 20 28 2a 78 4e 6f 74 69 66 79 29 28  void (*xNotify)(
17a60 76 6f 69 64 20 2a 2a 2c 20 69 6e 74 29 20 3d 20  void **, int) = 
17a70 30 3b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70  0;.      void *p
17a80 4e 6f 74 69 66 79 41 72 67 20 3d 20 30 3b 0a 0a  NotifyArg = 0;..
17a90 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70        if( pDb->p
17aa0 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 20 29 7b 0a  UnlockNotify ){.
17ab0 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72          Tcl_Decr
17ac0 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 55  RefCount(pDb->pU
17ad0 6e 6c 6f 63 6b 4e 6f 74 69 66 79 29 3b 0a 20 20  nlockNotify);.  
17ae0 20 20 20 20 20 20 70 44 62 2d 3e 70 55 6e 6c 6f        pDb->pUnlo
17af0 63 6b 4e 6f 74 69 66 79 20 3d 20 30 3b 0a 20 20  ckNotify = 0;.  
17b00 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
17b10 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20   objc==3 ){.    
17b20 20 20 20 20 78 4e 6f 74 69 66 79 20 3d 20 44 62      xNotify = Db
17b30 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 3b 0a 20 20  UnlockNotify;.  
17b40 20 20 20 20 20 20 70 4e 6f 74 69 66 79 41 72 67        pNotifyArg
17b50 20 3d 20 28 76 6f 69 64 20 2a 29 70 44 62 3b 0a   = (void *)pDb;.
17b60 20 20 20 20 20 20 20 20 70 44 62 2d 3e 70 55 6e          pDb->pUn
17b70 6c 6f 63 6b 4e 6f 74 69 66 79 20 3d 20 6f 62 6a  lockNotify = obj
17b80 76 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20 54 63  v[2];.        Tc
17b90 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
17ba0 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66  Db->pUnlockNotif
17bb0 79 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  y);.      }..   
17bc0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 75     if( sqlite3_u
17bd0 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 28 70 44 62  nlock_notify(pDb
17be0 2d 3e 64 62 2c 20 78 4e 6f 74 69 66 79 2c 20 70  ->db, xNotify, p
17bf0 4e 6f 74 69 66 79 41 72 67 29 20 29 7b 0a 20 20  NotifyArg) ){.  
17c00 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
17c10 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73  Result(interp, s
17c20 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44  qlite3_errmsg(pD
17c30 62 2d 3e 64 62 29 2c 20 28 63 68 61 72 2a 29 30  b->db), (char*)0
17c40 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
17c50 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
17c60 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
17c70 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
17c80 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62    /*.  **    $db
17c90 20 70 72 65 75 70 64 61 74 65 5f 68 6f 6f 6b 20   preupdate_hook 
17ca0 63 6f 75 6e 74 0a 20 20 2a 2a 20 20 20 20 24 64  count.  **    $d
17cb0 62 20 70 72 65 75 70 64 61 74 65 5f 68 6f 6f 6b  b preupdate_hook
17cc0 20 68 6f 6f 6b 20 3f 53 43 52 49 50 54 3f 0a 20   hook ?SCRIPT?. 
17cd0 20 2a 2a 20 20 20 20 24 64 62 20 70 72 65 75 70   **    $db preup
17ce0 64 61 74 65 5f 68 6f 6f 6b 20 6e 65 77 20 49 4e  date_hook new IN
17cf0 44 45 58 0a 20 20 2a 2a 20 20 20 20 24 64 62 20  DEX.  **    $db 
17d00 70 72 65 75 70 64 61 74 65 5f 68 6f 6f 6b 20 6f  preupdate_hook o
17d10 6c 64 20 49 4e 44 45 58 0a 20 20 2a 2f 0a 20 20  ld INDEX.  */.  
17d20 63 61 73 65 20 44 42 5f 50 52 45 55 50 44 41 54  case DB_PREUPDAT
17d30 45 3a 20 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  E: {.#ifndef SQL
17d40 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50  ITE_ENABLE_PREUP
17d50 44 41 54 45 5f 48 4f 4f 4b 0a 20 20 20 20 54 63  DATE_HOOK.    Tc
17d60 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
17d70 6e 74 65 72 70 2c 20 22 70 72 65 75 70 64 61 74  nterp, "preupdat
17d80 65 5f 68 6f 6f 6b 20 77 61 73 20 6f 6d 69 74 74  e_hook was omitt
17d90 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ed at compile-ti
17da0 6d 65 22 29 3b 0a 20 20 20 20 72 63 20 3d 20 54  me");.    rc = T
17db0 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a  CL_ERROR;.#else.
17dc0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
17dd0 20 63 68 61 72 20 2a 61 7a 53 75 62 5b 5d 20 3d   char *azSub[] =
17de0 20 7b 22 63 6f 75 6e 74 22 2c 20 22 64 65 70 74   {"count", "dept
17df0 68 22 2c 20 22 68 6f 6f 6b 22 2c 20 22 6e 65 77  h", "hook", "new
17e00 22 2c 20 22 6f 6c 64 22 2c 20 30 7d 3b 0a 20 20  ", "old", 0};.  
17e10 20 20 65 6e 75 6d 20 44 62 50 72 65 75 70 64 61    enum DbPreupda
17e20 74 65 53 75 62 43 6d 64 20 7b 0a 20 20 20 20 20  teSubCmd {.     
17e30 20 50 52 45 5f 43 4f 55 4e 54 2c 20 50 52 45 5f   PRE_COUNT, PRE_
17e40 44 45 50 54 48 2c 20 50 52 45 5f 48 4f 4f 4b 2c  DEPTH, PRE_HOOK,
17e50 20 50 52 45 5f 4e 45 57 2c 20 50 52 45 5f 4f 4c   PRE_NEW, PRE_OL
17e60 44 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74  D.    };.    int
17e70 20 69 53 75 62 3b 0a 0a 20 20 20 20 69 66 28 20   iSub;..    if( 
17e80 6f 62 6a 63 3c 33 20 29 7b 0a 20 20 20 20 20 20  objc<3 ){.      
17e90 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
17ea0 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
17eb0 2c 20 22 53 55 42 2d 43 4f 4d 4d 41 4e 44 20 3f  , "SUB-COMMAND ?
17ec0 41 52 47 53 3f 22 29 3b 0a 20 20 20 20 7d 0a 20  ARGS?");.    }. 
17ed0 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e     if( Tcl_GetIn
17ee0 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  dexFromObj(inter
17ef0 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 61 7a 53 75  p, objv[2], azSu
17f00 62 2c 20 22 73 75 62 2d 63 6f 6d 6d 61 6e 64 22  b, "sub-command"
17f10 2c 20 30 2c 20 26 69 53 75 62 29 20 29 7b 0a 20  , 0, &iSub) ){. 
17f20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
17f30 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
17f40 20 20 73 77 69 74 63 68 28 20 28 65 6e 75 6d 20    switch( (enum 
17f50 44 62 50 72 65 75 70 64 61 74 65 53 75 62 43 6d  DbPreupdateSubCm
17f60 64 29 69 53 75 62 20 29 7b 0a 20 20 20 20 20 20  d)iSub ){.      
17f70 63 61 73 65 20 50 52 45 5f 43 4f 55 4e 54 3a 20  case PRE_COUNT: 
17f80 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43  {.        int nC
17f90 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  ol = sqlite3_pre
17fa0 75 70 64 61 74 65 5f 63 6f 75 6e 74 28 70 44 62  update_count(pDb
17fb0 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20 54  ->db);.        T
17fc0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
17fd0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
17fe0 6e 74 4f 62 6a 28 6e 43 6f 6c 29 29 3b 0a 20 20  ntObj(nCol));.  
17ff0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
18000 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 61 73 65     }..      case
18010 20 50 52 45 5f 48 4f 4f 4b 3a 20 7b 0a 20 20 20   PRE_HOOK: {.   
18020 20 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 34 20       if( objc>4 
18030 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  ){.          Tcl
18040 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
18050 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
18060 68 6f 6f 6b 20 3f 53 43 52 49 50 54 3f 22 29 3b  hook ?SCRIPT?");
18070 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
18080 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
18090 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 44       }.        D
180a0 62 48 6f 6f 6b 43 6d 64 28 69 6e 74 65 72 70 2c  bHookCmd(interp,
180b0 20 70 44 62 2c 20 28 6f 62 6a 63 3d 3d 34 20 3f   pDb, (objc==4 ?
180c0 20 6f 62 6a 76 5b 33 5d 20 3a 20 30 29 2c 20 26   objv[3] : 0), &
180d0 70 44 62 2d 3e 70 50 72 65 55 70 64 61 74 65 48  pDb->pPreUpdateH
180e0 6f 6f 6b 29 3b 0a 20 20 20 20 20 20 20 20 62 72  ook);.        br
180f0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
18100 20 20 20 20 63 61 73 65 20 50 52 45 5f 44 45 50      case PRE_DEP
18110 54 48 3a 20 7b 0a 20 20 20 20 20 20 20 20 54 63  TH: {.        Tc
18120 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 20 20 20  l_Obj *pRet;.   
18130 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33       if( objc!=3
18140 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63   ){.          Tc
18150 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
18160 6e 74 65 72 70 2c 20 33 2c 20 6f 62 6a 76 2c 20  nterp, 3, objv, 
18170 22 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  "");.          r
18180 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
18190 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
181a0 20 20 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65     pRet = Tcl_Ne
181b0 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f  wIntObj(sqlite3_
181c0 70 72 65 75 70 64 61 74 65 5f 64 65 70 74 68 28  preupdate_depth(
181d0 70 44 62 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20  pDb->db));.     
181e0 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
181f0 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74  ult(interp, pRet
18200 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
18210 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
18220 20 63 61 73 65 20 50 52 45 5f 4e 45 57 3a 0a 20   case PRE_NEW:. 
18230 20 20 20 20 20 63 61 73 65 20 50 52 45 5f 4f 4c       case PRE_OL
18240 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  D: {.        int
18250 20 69 49 64 78 3b 0a 20 20 20 20 20 20 20 20 73   iIdx;.        s
18260 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56  qlite3_value *pV
18270 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  alue;.        if
18280 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  ( objc!=4 ){.   
18290 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67         Tcl_Wrong
182a0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
182b0 33 2c 20 6f 62 6a 76 2c 20 22 49 4e 44 45 58 22  3, objv, "INDEX"
182c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
182d0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
182e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
182f0 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
18300 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
18310 62 6a 76 5b 33 5d 2c 20 26 69 49 64 78 29 20 29  bjv[3], &iIdx) )
18320 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
18330 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
18340 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
18350 20 69 66 28 20 69 53 75 62 3d 3d 50 52 45 5f 4f   if( iSub==PRE_O
18360 4c 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  LD ){.          
18370 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
18380 75 70 64 61 74 65 5f 6f 6c 64 28 70 44 62 2d 3e  update_old(pDb->
18390 64 62 2c 20 69 49 64 78 2c 20 26 70 56 61 6c 75  db, iIdx, &pValu
183a0 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  e);.        }els
183b0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  e{.          ass
183c0 65 72 74 28 20 69 53 75 62 3d 3d 50 52 45 5f 4e  ert( iSub==PRE_N
183d0 45 57 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  EW );.          
183e0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
183f0 75 70 64 61 74 65 5f 6e 65 77 28 70 44 62 2d 3e  update_new(pDb->
18400 64 62 2c 20 69 49 64 78 2c 20 26 70 56 61 6c 75  db, iIdx, &pValu
18410 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  e);.        }.. 
18420 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
18430 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18440 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70        Tcl_Obj *p
18450 4f 62 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Obj;.          p
18460 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72  Obj = Tcl_NewStr
18470 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73 71  ingObj((char*)sq
18480 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
18490 28 70 56 61 6c 75 65 29 2c 20 2d 31 29 3b 0a 20  (pValue), -1);. 
184a0 20 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74           Tcl_Set
184b0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
184c0 2c 20 70 4f 62 6a 29 3b 0a 20 20 20 20 20 20 20  , pObj);.       
184d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
184e0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
184f0 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74  lt(interp, sqlit
18500 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64  e3_errmsg(pDb->d
18510 62 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  b), 0);.        
18520 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
18530 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OR;.        }.  
18540 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
18550 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
18560 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f  BLE_PREUPDATE_HO
18570 4f 4b 20 2a 2f 0a 20 20 20 20 62 72 65 61 6b 3b  OK */.    break;
18580 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
18590 20 20 20 24 64 62 20 77 61 6c 5f 68 6f 6f 6b 20     $db wal_hook 
185a0 3f 73 63 72 69 70 74 3f 0a 20 20 2a 2a 20 20 20  ?script?.  **   
185b0 20 24 64 62 20 75 70 64 61 74 65 5f 68 6f 6f 6b   $db update_hook
185c0 20 3f 73 63 72 69 70 74 3f 0a 20 20 2a 2a 20 20   ?script?.  **  
185d0 20 20 24 64 62 20 72 6f 6c 6c 62 61 63 6b 5f 68    $db rollback_h
185e0 6f 6f 6b 20 3f 73 63 72 69 70 74 3f 0a 20 20 2a  ook ?script?.  *
185f0 2f 0a 20 20 63 61 73 65 20 44 42 5f 57 41 4c 5f  /.  case DB_WAL_
18600 48 4f 4f 4b 3a 0a 20 20 63 61 73 65 20 44 42 5f  HOOK:.  case DB_
18610 55 50 44 41 54 45 5f 48 4f 4f 4b 3a 0a 20 20 63  UPDATE_HOOK:.  c
18620 61 73 65 20 44 42 5f 52 4f 4c 4c 42 41 43 4b 5f  ase DB_ROLLBACK_
18630 48 4f 4f 4b 3a 20 7b 0a 20 20 20 20 2f 2a 20 73  HOOK: {.    /* s
18640 65 74 20 70 70 48 6f 6f 6b 20 74 6f 20 70 6f 69  et ppHook to poi
18650 6e 74 20 61 74 20 70 55 70 64 61 74 65 48 6f 6f  nt at pUpdateHoo
18660 6b 20 6f 72 20 70 52 6f 6c 6c 62 61 63 6b 48 6f  k or pRollbackHo
18670 6f 6b 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  ok, depending on
18680 0a 20 20 20 20 2a 2a 20 77 68 65 74 68 65 72 20  .    ** whether 
18690 5b 24 64 62 20 75 70 64 61 74 65 5f 68 6f 6f 6b  [$db update_hook
186a0 5d 20 6f 72 20 5b 24 64 62 20 72 6f 6c 6c 62 61  ] or [$db rollba
186b0 63 6b 5f 68 6f 6f 6b 5d 20 77 61 73 20 69 6e 76  ck_hook] was inv
186c0 6f 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  oked..    */.   
186d0 20 54 63 6c 5f 4f 62 6a 20 2a 2a 70 70 48 6f 6f   Tcl_Obj **ppHoo
186e0 6b 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 63  k = 0;.    if( c
186f0 68 6f 69 63 65 3d 3d 44 42 5f 57 41 4c 5f 48 4f  hoice==DB_WAL_HO
18700 4f 4b 20 29 20 70 70 48 6f 6f 6b 20 3d 20 26 70  OK ) ppHook = &p
18710 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 3b 0a 20 20  Db->pWalHook;.  
18720 20 20 69 66 28 20 63 68 6f 69 63 65 3d 3d 44 42    if( choice==DB
18730 5f 55 50 44 41 54 45 5f 48 4f 4f 4b 20 29 20 70  _UPDATE_HOOK ) p
18740 70 48 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e 70 55  pHook = &pDb->pU
18750 70 64 61 74 65 48 6f 6f 6b 3b 0a 20 20 20 20 69  pdateHook;.    i
18760 66 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f 52 4f  f( choice==DB_RO
18770 4c 4c 42 41 43 4b 5f 48 4f 4f 4b 20 29 20 70 70  LLBACK_HOOK ) pp
18780 48 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e 70 52 6f  Hook = &pDb->pRo
18790 6c 6c 62 61 63 6b 48 6f 6f 6b 3b 0a 20 20 20 20  llbackHook;.    
187a0 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20  if( objc>3 ){.  
187b0 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
187c0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
187d0 20 6f 62 6a 76 2c 20 22 3f 53 43 52 49 50 54 3f   objv, "?SCRIPT?
187e0 22 29 3b 0a 20 20 20 20 20 20 20 72 65 74 75 72  ");.       retur
187f0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
18800 20 7d 0a 0a 20 20 20 20 44 62 48 6f 6f 6b 43 6d   }..    DbHookCm
18810 64 28 69 6e 74 65 72 70 2c 20 70 44 62 2c 20 28  d(interp, pDb, (
18820 6f 62 6a 63 3d 3d 33 20 3f 20 6f 62 6a 76 5b 32  objc==3 ? objv[2
18830 5d 20 3a 20 30 29 2c 20 70 70 48 6f 6f 6b 29 3b  ] : 0), ppHook);
18840 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
18850 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 76 65 72  .  /*    $db ver
18860 73 69 6f 6e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52  sion.  **.  ** R
18870 65 74 75 72 6e 20 74 68 65 20 76 65 72 73 69 6f  eturn the versio
18880 6e 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68 69  n string for thi
18890 73 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  s database..  */
188a0 0a 20 20 63 61 73 65 20 44 42 5f 56 45 52 53 49  .  case DB_VERSI
188b0 4f 4e 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 53 65  ON: {.    Tcl_Se
188c0 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
188d0 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
188e0 6c 69 62 76 65 72 73 69 6f 6e 28 29 2c 20 54 43  libversion(), TC
188f0 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 62  L_STATIC);.    b
18900 72 65 61 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 7d 20  reak;.  }...  } 
18910 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 53 57  /* End of the SW
18920 49 54 43 48 20 73 74 61 74 65 6d 65 6e 74 20 2a  ITCH statement *
18930 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  /.  return rc;.}
18940 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 43 4c  ..#if SQLITE_TCL
18950 5f 4e 52 45 0a 2f 2a 0a 2a 2a 20 41 64 61 70 74  _NRE./*.** Adapt
18960 6f 72 20 74 68 61 74 20 70 72 6f 76 69 64 65 73  or that provides
18970 20 61 6e 20 6f 62 6a 43 6d 64 20 69 6e 74 65 72   an objCmd inter
18980 66 61 63 65 20 74 6f 20 74 68 65 20 4e 52 45 2d  face to the NRE-
18990 65 6e 61 62 6c 65 64 0a 2a 2a 20 69 6e 74 65 72  enabled.** inter
189a0 66 61 63 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  face implementat
189b0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
189c0 6e 74 20 44 62 4f 62 6a 43 6d 64 41 64 61 70 74  nt DbObjCmdAdapt
189d0 6f 72 28 0a 20 20 76 6f 69 64 20 2a 63 64 2c 0a  or(.  void *cd,.
189e0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
189f0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
18a00 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e  ,.  Tcl_Obj *con
18a10 73 74 2a 6f 62 6a 76 0a 29 7b 0a 20 20 72 65 74  st*objv.){.  ret
18a20 75 72 6e 20 54 63 6c 5f 4e 52 43 61 6c 6c 4f 62  urn Tcl_NRCallOb
18a30 6a 50 72 6f 63 28 69 6e 74 65 72 70 2c 20 44 62  jProc(interp, Db
18a40 4f 62 6a 43 6d 64 2c 20 63 64 2c 20 6f 62 6a 63  ObjCmd, cd, objc
18a50 2c 20 6f 62 6a 76 29 3b 0a 7d 0a 23 65 6e 64 69  , objv);.}.#endi
18a60 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 43 4c 5f  f /* SQLITE_TCL_
18a70 4e 52 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 20 20  NRE */../*.**   
18a80 73 71 6c 69 74 65 33 20 44 42 4e 41 4d 45 20 46  sqlite3 DBNAME F
18a90 49 4c 45 4e 41 4d 45 20 3f 2d 76 66 73 20 56 46  ILENAME ?-vfs VF
18aa0 53 4e 41 4d 45 3f 20 3f 2d 6b 65 79 20 4b 45 59  SNAME? ?-key KEY
18ab0 3f 20 3f 2d 72 65 61 64 6f 6e 6c 79 20 42 4f 4f  ? ?-readonly BOO
18ac0 4c 45 41 4e 3f 0a 2a 2a 20 20 20 20 20 20 20 20  LEAN?.**        
18ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ae0 20 20 20 3f 2d 63 72 65 61 74 65 20 42 4f 4f 4c     ?-create BOOL
18af0 45 41 4e 3f 20 3f 2d 6e 6f 6d 75 74 65 78 20 42  EAN? ?-nomutex B
18b00 4f 4f 4c 45 41 4e 3f 0a 2a 2a 0a 2a 2a 20 54 68  OOLEAN?.**.** Th
18b10 69 73 20 69 73 20 74 68 65 20 6d 61 69 6e 20 54  is is the main T
18b20 63 6c 20 63 6f 6d 6d 61 6e 64 2e 20 20 57 68 65  cl command.  Whe
18b30 6e 20 74 68 65 20 22 73 71 6c 69 74 65 22 20 54  n the "sqlite" T
18b40 63 6c 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a  cl command is.**
18b50 20 69 6e 76 6f 6b 65 64 2c 20 74 68 69 73 20 72   invoked, this r
18b60 6f 75 74 69 6e 65 20 72 75 6e 73 20 74 6f 20 70  outine runs to p
18b70 72 6f 63 65 73 73 20 74 68 61 74 20 63 6f 6d 6d  rocess that comm
18b80 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  and..**.** The f
18b90 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2c 20 44  irst argument, D
18ba0 42 4e 41 4d 45 2c 20 69 73 20 61 6e 20 61 72 62  BNAME, is an arb
18bb0 69 74 72 61 72 79 20 6e 61 6d 65 20 66 6f 72 20  itrary name for 
18bc0 61 20 6e 65 77 0a 2a 2a 20 64 61 74 61 62 61 73  a new.** databas
18bd0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 54  e connection.  T
18be0 68 69 73 20 63 6f 6d 6d 61 6e 64 20 63 72 65 61  his command crea
18bf0 74 65 73 20 61 20 6e 65 77 20 63 6f 6d 6d 61 6e  tes a new comman
18c00 64 20 6e 61 6d 65 64 0a 2a 2a 20 44 42 4e 41 4d  d named.** DBNAM
18c10 45 20 74 68 61 74 20 69 73 20 75 73 65 64 20 74  E that is used t
18c20 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 61 74 20 63  o control that c
18c30 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 54 68 65 20  onnection.  The 
18c40 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e  database.** conn
18c50 65 63 74 69 6f 6e 20 69 73 20 64 65 6c 65 74 65  ection is delete
18c60 64 20 77 68 65 6e 20 74 68 65 20 44 42 4e 41 4d  d when the DBNAM
18c70 45 20 63 6f 6d 6d 61 6e 64 20 69 73 20 64 65 6c  E command is del
18c80 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  eted..**.** The 
18c90 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
18ca0 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
18cb0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
18cc0 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ..**.*/.static i
18cd0 6e 74 20 44 62 4d 61 69 6e 28 76 6f 69 64 20 2a  nt DbMain(void *
18ce0 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  cd, Tcl_Interp *
18cf0 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63  interp, int objc
18d00 2c 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a  ,Tcl_Obj *const*
18d10 6f 62 6a 76 29 7b 0a 20 20 53 71 6c 69 74 65 44  objv){.  SqliteD
18d20 62 20 2a 70 3b 0a 20 20 63 6f 6e 73 74 20 63 68  b *p;.  const ch
18d30 61 72 20 2a 7a 41 72 67 3b 0a 20 20 63 68 61 72  ar *zArg;.  char
18d40 20 2a 7a 45 72 72 4d 73 67 3b 0a 20 20 69 6e 74   *zErrMsg;.  int
18d50 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   i;.  const char
18d60 20 2a 7a 46 69 6c 65 3b 0a 20 20 63 6f 6e 73 74   *zFile;.  const
18d70 20 63 68 61 72 20 2a 7a 56 66 73 20 3d 20 30 3b   char *zVfs = 0;
18d80 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 0a 20 20  .  int flags;.  
18d90 54 63 6c 5f 44 53 74 72 69 6e 67 20 74 72 61 6e  Tcl_DString tran
18da0 73 6c 61 74 65 64 46 69 6c 65 6e 61 6d 65 3b 0a  slatedFilename;.
18db0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
18dc0 54 45 5f 48 41 53 5f 43 4f 44 45 43 29 20 26 26  TE_HAS_CODEC) &&
18dd0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
18de0 5f 4f 4d 49 54 5f 43 4f 44 45 43 5f 46 52 4f 4d  _OMIT_CODEC_FROM
18df0 5f 54 43 4c 29 0a 20 20 76 6f 69 64 20 2a 70 4b  _TCL).  void *pK
18e00 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4b  ey = 0;.  int nK
18e10 65 79 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  ey = 0;.#endif. 
18e20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 49   int rc;..  /* I
18e30 6e 20 6e 6f 72 6d 61 6c 20 75 73 65 2c 20 65 61  n normal use, ea
18e40 63 68 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  ch TCL interpret
18e50 65 72 20 72 75 6e 73 20 69 6e 20 61 20 73 69 6e  er runs in a sin
18e60 67 6c 65 20 74 68 72 65 61 64 2e 20 20 53 6f 0a  gle thread.  So.
18e70 20 20 2a 2a 20 62 79 20 64 65 66 61 75 6c 74 2c    ** by default,
18e80 20 77 65 20 63 61 6e 20 74 75 72 6e 20 6f 66 20   we can turn of 
18e90 6d 75 74 65 78 69 6e 67 20 6f 6e 20 53 51 4c 69  mutexing on SQLi
18ea0 74 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  te database conn
18eb0 65 63 74 69 6f 6e 73 2e 0a 20 20 2a 2a 20 48 6f  ections..  ** Ho
18ec0 77 65 76 65 72 2c 20 66 6f 72 20 74 65 73 74 69  wever, for testi
18ed0 6e 67 20 70 75 72 70 6f 73 65 73 20 69 74 20 69  ng purposes it i
18ee0 73 20 75 73 65 66 75 6c 20 74 6f 20 68 61 76 65  s useful to have
18ef0 20 6d 75 74 65 78 65 73 20 74 75 72 6e 65 64 0a   mutexes turned.
18f00 20 20 2a 2a 20 6f 6e 2e 20 20 53 6f 2c 20 62 79    ** on.  So, by
18f10 20 64 65 66 61 75 6c 74 2c 20 6d 75 74 65 78 65   default, mutexe
18f20 73 20 64 65 66 61 75 6c 74 20 6f 66 66 2e 20 20  s default off.  
18f30 42 75 74 20 69 66 20 63 6f 6d 70 69 6c 65 64 20  But if compiled 
18f40 77 69 74 68 0a 20 20 2a 2a 20 53 51 4c 49 54 45  with.  ** SQLITE
18f50 5f 54 43 4c 5f 44 45 46 41 55 4c 54 5f 46 55 4c  _TCL_DEFAULT_FUL
18f60 4c 4d 55 54 45 58 20 74 68 65 6e 20 6d 75 74 65  LMUTEX then mute
18f70 78 65 73 20 64 65 66 61 75 6c 74 20 6f 6e 2e 0a  xes default on..
18f80 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
18f90 54 45 5f 54 43 4c 5f 44 45 46 41 55 4c 54 5f 46  TE_TCL_DEFAULT_F
18fa0 55 4c 4c 4d 55 54 45 58 0a 20 20 66 6c 61 67 73  ULLMUTEX.  flags
18fb0 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
18fc0 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54  EADWRITE | SQLIT
18fd0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 20  E_OPEN_CREATE | 
18fe0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c  SQLITE_OPEN_FULL
18ff0 4d 55 54 45 58 3b 0a 23 65 6c 73 65 0a 20 20 66  MUTEX;.#else.  f
19000 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50  lags = SQLITE_OP
19010 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53  EN_READWRITE | S
19020 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
19030 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
19040 4e 4f 4d 55 54 45 58 3b 0a 23 65 6e 64 69 66 0a  NOMUTEX;.#endif.
19050 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29  .  if( objc==2 )
19060 7b 0a 20 20 20 20 7a 41 72 67 20 3d 20 54 63 6c  {.    zArg = Tcl
19070 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
19080 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20  j(objv[1], 0);. 
19090 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41     if( strcmp(zA
190a0 72 67 2c 22 2d 76 65 72 73 69 6f 6e 22 29 3d 3d  rg,"-version")==
190b0 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  0 ){.      Tcl_A
190c0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
190d0 72 70 2c 73 71 6c 69 74 65 33 5f 6c 69 62 76 65  rp,sqlite3_libve
190e0 72 73 69 6f 6e 28 29 2c 20 28 63 68 61 72 2a 29  rsion(), (char*)
190f0 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
19100 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20   TCL_OK;.    }. 
19110 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41     if( strcmp(zA
19120 72 67 2c 22 2d 73 6f 75 72 63 65 69 64 22 29 3d  rg,"-sourceid")=
19130 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =0 ){.      Tcl_
19140 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
19150 65 72 70 2c 73 71 6c 69 74 65 33 5f 73 6f 75 72  erp,sqlite3_sour
19160 63 65 69 64 28 29 2c 20 28 63 68 61 72 2a 29 30  ceid(), (char*)0
19170 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
19180 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  TCL_OK;.    }.  
19190 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72    if( strcmp(zAr
191a0 67 2c 22 2d 68 61 73 2d 63 6f 64 65 63 22 29 3d  g,"-has-codec")=
191b0 3d 30 20 29 7b 0a 23 69 66 20 64 65 66 69 6e 65  =0 ){.#if define
191c0 64 28 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  d(SQLITE_HAS_COD
191d0 45 43 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  EC) && !defined(
191e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 44 45  SQLITE_OMIT_CODE
191f0 43 5f 46 52 4f 4d 5f 54 43 4c 29 0a 20 20 20 20  C_FROM_TCL).    
19200 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
19210 6c 74 28 69 6e 74 65 72 70 2c 22 31 22 2c 28 63  lt(interp,"1",(c
19220 68 61 72 2a 29 30 29 3b 0a 23 65 6c 73 65 0a 20  har*)0);.#else. 
19230 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
19240 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 30 22  esult(interp,"0"
19250 2c 28 63 68 61 72 2a 29 30 29 3b 0a 23 65 6e 64  ,(char*)0);.#end
19260 69 66 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  if.      return 
19270 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  TCL_OK;.    }.  
19280 7d 0a 20 20 66 6f 72 28 69 3d 33 3b 20 69 2b 31  }.  for(i=3; i+1
19290 3c 6f 62 6a 63 3b 20 69 2b 3d 32 29 7b 0a 20 20  <objc; i+=2){.  
192a0 20 20 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65 74    zArg = Tcl_Get
192b0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69 5d 29 3b  String(objv[i]);
192c0 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
192d0 7a 41 72 67 2c 22 2d 6b 65 79 22 29 3d 3d 30 20  zArg,"-key")==0 
192e0 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  ){.#if defined(S
192f0 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 29  QLITE_HAS_CODEC)
19300 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
19310 49 54 45 5f 4f 4d 49 54 5f 43 4f 44 45 43 5f 46  ITE_OMIT_CODEC_F
19320 52 4f 4d 5f 54 43 4c 29 0a 20 20 20 20 20 20 70  ROM_TCL).      p
19330 4b 65 79 20 3d 20 54 63 6c 5f 47 65 74 42 79 74  Key = Tcl_GetByt
19340 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62  eArrayFromObj(ob
19350 6a 76 5b 69 2b 31 5d 2c 20 26 6e 4b 65 79 29 3b  jv[i+1], &nKey);
19360 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
19370 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72  e if( strcmp(zAr
19380 67 2c 20 22 2d 76 66 73 22 29 3d 3d 30 20 29 7b  g, "-vfs")==0 ){
19390 0a 20 20 20 20 20 20 7a 56 66 73 20 3d 20 54 63  .      zVfs = Tc
193a0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
193b0 5b 69 2b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  [i+1]);.    }els
193c0 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72  e if( strcmp(zAr
193d0 67 2c 20 22 2d 72 65 61 64 6f 6e 6c 79 22 29 3d  g, "-readonly")=
193e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
193f0 62 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c  b;.      if( Tcl
19400 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
19410 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
19420 69 2b 31 5d 2c 20 26 62 29 20 29 20 72 65 74 75  i+1], &b) ) retu
19430 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
19440 20 20 20 20 69 66 28 20 62 20 29 7b 0a 20 20 20      if( b ){.   
19450 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 28       flags &= ~(
19460 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
19470 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
19480 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 20 20 20  N_CREATE);.     
19490 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49     flags |= SQLI
194a0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
194b0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
194c0 20 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20         flags &= 
194d0 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  ~SQLITE_OPEN_REA
194e0 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 66  DONLY;.        f
194f0 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
19500 50 45 4e 5f 52 45 41 44 57 52 49 54 45 3b 0a 20  PEN_READWRITE;. 
19510 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
19520 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67   if( strcmp(zArg
19530 2c 20 22 2d 63 72 65 61 74 65 22 29 3d 3d 30 20  , "-create")==0 
19540 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 3b 0a  ){.      int b;.
19550 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65        if( Tcl_Ge
19560 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
19570 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 2b 31  interp, objv[i+1
19580 5d 2c 20 26 62 29 20 29 20 72 65 74 75 72 6e 20  ], &b) ) return 
19590 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
195a0 20 69 66 28 20 62 20 26 26 20 28 66 6c 61 67 73   if( b && (flags
195b0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   & SQLITE_OPEN_R
195c0 45 41 44 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20  EADONLY)==0 ){. 
195d0 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20         flags |= 
195e0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
195f0 54 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  TE;.      }else{
19600 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 26  .        flags &
19610 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  = ~SQLITE_OPEN_C
19620 52 45 41 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20  REATE;.      }. 
19630 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
19640 63 6d 70 28 7a 41 72 67 2c 20 22 2d 6e 6f 6d 75  cmp(zArg, "-nomu
19650 74 65 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  tex")==0 ){.    
19660 20 20 69 6e 74 20 62 3b 0a 20 20 20 20 20 20 69    int b;.      i
19670 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61  f( Tcl_GetBoolea
19680 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  nFromObj(interp,
19690 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 62 29 20   objv[i+1], &b) 
196a0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
196b0 4f 52 3b 0a 20 20 20 20 20 20 69 66 28 20 62 20  OR;.      if( b 
196c0 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  ){.        flags
196d0 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   |= SQLITE_OPEN_
196e0 4e 4f 4d 55 54 45 58 3b 0a 20 20 20 20 20 20 20  NOMUTEX;.       
196f0 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54   flags &= ~SQLIT
19700 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58  E_OPEN_FULLMUTEX
19710 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
19720 20 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20         flags &= 
19730 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d  ~SQLITE_OPEN_NOM
19740 55 54 45 58 3b 0a 20 20 20 20 20 20 7d 0a 20 20  UTEX;.      }.  
19750 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
19760 6d 70 28 7a 41 72 67 2c 20 22 2d 66 75 6c 6c 6d  mp(zArg, "-fullm
19770 75 74 65 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20  utex")==0 ){.   
19780 20 20 20 69 6e 74 20 62 3b 0a 20 20 20 20 20 20     int b;.      
19790 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  if( Tcl_GetBoole
197a0 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
197b0 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 62 29  , objv[i+1], &b)
197c0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
197d0 52 4f 52 3b 0a 20 20 20 20 20 20 69 66 28 20 62  ROR;.      if( b
197e0 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67   ){.        flag
197f0 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  s |= SQLITE_OPEN
19800 5f 46 55 4c 4c 4d 55 54 45 58 3b 0a 20 20 20 20  _FULLMUTEX;.    
19810 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51      flags &= ~SQ
19820 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45  LITE_OPEN_NOMUTE
19830 58 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  X;.      }else{.
19840 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d          flags &=
19850 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55   ~SQLITE_OPEN_FU
19860 4c 4c 4d 55 54 45 58 3b 0a 20 20 20 20 20 20 7d  LLMUTEX;.      }
19870 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
19880 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d 75 72  trcmp(zArg, "-ur
19890 69 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  i")==0 ){.      
198a0 69 6e 74 20 62 3b 0a 20 20 20 20 20 20 69 66 28  int b;.      if(
198b0 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46   Tcl_GetBooleanF
198c0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
198d0 62 6a 76 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20  bjv[i+1], &b) ) 
198e0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
198f0 3b 0a 20 20 20 20 20 20 69 66 28 20 62 20 29 7b  ;.      if( b ){
19900 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c  .        flags |
19910 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52  = SQLITE_OPEN_UR
19920 49 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  I;.      }else{.
19930 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d          flags &=
19940 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52   ~SQLITE_OPEN_UR
19950 49 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  I;.      }.    }
19960 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f  else{.      Tcl_
19970 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
19980 65 72 70 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70  erp, "unknown op
19990 74 69 6f 6e 3a 20 22 2c 20 7a 41 72 67 2c 20 28  tion: ", zArg, (
199a0 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
199b0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
199c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
199d0 28 20 6f 62 6a 63 3c 33 20 7c 7c 20 28 6f 62 6a  ( objc<3 || (obj
199e0 63 26 31 29 21 3d 31 20 29 7b 0a 20 20 20 20 54  c&1)!=1 ){.    T
199f0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
19a00 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
19a10 0a 20 20 20 20 20 20 22 48 41 4e 44 4c 45 20 46  .      "HANDLE F
19a20 49 4c 45 4e 41 4d 45 20 3f 2d 76 66 73 20 56 46  ILENAME ?-vfs VF
19a30 53 4e 41 4d 45 3f 20 3f 2d 72 65 61 64 6f 6e 6c  SNAME? ?-readonl
19a40 79 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d 63 72 65  y BOOLEAN? ?-cre
19a50 61 74 65 20 42 4f 4f 4c 45 41 4e 3f 22 0a 20 20  ate BOOLEAN?".  
19a60 20 20 20 20 22 20 3f 2d 6e 6f 6d 75 74 65 78 20      " ?-nomutex 
19a70 42 4f 4f 4c 45 41 4e 3f 20 3f 2d 66 75 6c 6c 6d  BOOLEAN? ?-fullm
19a80 75 74 65 78 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d  utex BOOLEAN? ?-
19a90 75 72 69 20 42 4f 4f 4c 45 41 4e 3f 22 0a 23 69  uri BOOLEAN?".#i
19aa0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
19ab0 5f 48 41 53 5f 43 4f 44 45 43 29 20 26 26 20 21  _HAS_CODEC) && !
19ac0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
19ad0 4d 49 54 5f 43 4f 44 45 43 5f 46 52 4f 4d 5f 54  MIT_CODEC_FROM_T
19ae0 43 4c 29 0a 20 20 20 20 20 20 22 20 3f 2d 6b 65  CL).      " ?-ke
19af0 79 20 43 4f 44 45 43 4b 45 59 3f 22 0a 23 65 6e  y CODECKEY?".#en
19b00 64 69 66 0a 20 20 20 20 29 3b 0a 20 20 20 20 72  dif.    );.    r
19b10 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
19b20 0a 20 20 7d 0a 20 20 7a 45 72 72 4d 73 67 20 3d  .  }.  zErrMsg =
19b30 20 30 3b 0a 20 20 70 20 3d 20 28 53 71 6c 69 74   0;.  p = (Sqlit
19b40 65 44 62 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20  eDb*)Tcl_Alloc( 
19b50 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20  sizeof(*p) );.  
19b60 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20  if( p==0 ){.    
19b70 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
19b80 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 22 6d  terp, (char *)"m
19b90 61 6c 6c 6f 63 20 66 61 69 6c 65 64 22 2c 20 54  alloc failed", T
19ba0 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  CL_STATIC);.    
19bb0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
19bc0 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70  ;.  }.  memset(p
19bd0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  , 0, sizeof(*p))
19be0 3b 0a 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f  ;.  zFile = Tcl_
19bf0 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
19c00 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20  (objv[2], 0);.  
19c10 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 54 72 61 6e  zFile = Tcl_Tran
19c20 73 6c 61 74 65 46 69 6c 65 4e 61 6d 65 28 69 6e  slateFileName(in
19c30 74 65 72 70 2c 20 7a 46 69 6c 65 2c 20 26 74 72  terp, zFile, &tr
19c40 61 6e 73 6c 61 74 65 64 46 69 6c 65 6e 61 6d 65  anslatedFilename
19c50 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
19c60 33 5f 6f 70 65 6e 5f 76 32 28 7a 46 69 6c 65 2c  3_open_v2(zFile,
19c70 20 26 70 2d 3e 64 62 2c 20 66 6c 61 67 73 2c 20   &p->db, flags, 
19c80 7a 56 66 73 29 3b 0a 20 20 54 63 6c 5f 44 53 74  zVfs);.  Tcl_DSt
19c90 72 69 6e 67 46 72 65 65 28 26 74 72 61 6e 73 6c  ringFree(&transl
19ca0 61 74 65 64 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  atedFilename);. 
19cb0 20 69 66 28 20 70 2d 3e 64 62 20 29 7b 0a 20 20   if( p->db ){.  
19cc0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
19cd0 3d 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65  =sqlite3_errcode
19ce0 28 70 2d 3e 64 62 29 20 29 7b 0a 20 20 20 20 20  (p->db) ){.     
19cf0 20 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74   zErrMsg = sqlit
19d00 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c  e3_mprintf("%s",
19d10 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
19d20 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 73  p->db));.      s
19d30 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e  qlite3_close(p->
19d40 64 62 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64 62  db);.      p->db
19d50 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 0;.    }.  }e
19d60 6c 73 65 7b 0a 20 20 20 20 7a 45 72 72 4d 73 67  lse{.    zErrMsg
19d70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
19d80 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33  tf("%s", sqlite3
19d90 5f 65 72 72 73 74 72 28 72 63 29 29 3b 0a 20 20  _errstr(rc));.  
19da0 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  }.#if defined(SQ
19db0 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 29 20  LITE_HAS_CODEC) 
19dc0 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
19dd0 54 45 5f 4f 4d 49 54 5f 43 4f 44 45 43 5f 46 52  TE_OMIT_CODEC_FR
19de0 4f 4d 5f 54 43 4c 29 0a 20 20 69 66 28 20 70 2d  OM_TCL).  if( p-
19df0 3e 64 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >db ){.    sqlit
19e00 65 33 5f 6b 65 79 28 70 2d 3e 64 62 2c 20 70 4b  e3_key(p->db, pK
19e10 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 7d 0a 23  ey, nKey);.  }.#
19e20 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 64  endif.  if( p->d
19e30 62 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f  b==0 ){.    Tcl_
19e40 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
19e50 2c 20 7a 45 72 72 4d 73 67 2c 20 54 43 4c 5f 56  , zErrMsg, TCL_V
19e60 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 54 63  OLATILE);.    Tc
19e70 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 29  l_Free((char*)p)
19e80 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
19e90 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ee(zErrMsg);.   
19ea0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
19eb0 52 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 78 53  R;.  }.  p->maxS
19ec0 74 6d 74 20 3d 20 4e 55 4d 5f 50 52 45 50 41 52  tmt = NUM_PREPAR
19ed0 45 44 5f 53 54 4d 54 53 3b 0a 20 20 70 2d 3e 6f  ED_STMTS;.  p->o
19ee0 70 65 6e 46 6c 61 67 73 20 3d 20 66 6c 61 67 73  penFlags = flags
19ef0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55   & SQLITE_OPEN_U
19f00 52 49 3b 0a 20 20 70 2d 3e 69 6e 74 65 72 70 20  RI;.  p->interp 
19f10 3d 20 69 6e 74 65 72 70 3b 0a 20 20 7a 41 72 67  = interp;.  zArg
19f20 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
19f30 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c  FromObj(objv[1],
19f40 20 30 29 3b 0a 20 20 69 66 28 20 44 62 55 73 65   0);.  if( DbUse
19f50 4e 72 65 28 29 20 29 7b 0a 20 20 20 20 54 63 6c  Nre() ){.    Tcl
19f60 5f 4e 52 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64  _NRCreateCommand
19f70 28 69 6e 74 65 72 70 2c 20 7a 41 72 67 2c 20 44  (interp, zArg, D
19f80 62 4f 62 6a 43 6d 64 41 64 61 70 74 6f 72 2c 20  bObjCmdAdaptor, 
19f90 44 62 4f 62 6a 43 6d 64 2c 0a 20 20 20 20 20 20  DbObjCmd,.      
19fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19fb0 20 20 28 63 68 61 72 2a 29 70 2c 20 44 62 44 65    (char*)p, DbDe
19fc0 6c 65 74 65 43 6d 64 29 3b 0a 20 20 7d 65 6c 73  leteCmd);.  }els
19fd0 65 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74  e{.    Tcl_Creat
19fe0 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
19ff0 72 70 2c 20 7a 41 72 67 2c 20 44 62 4f 62 6a 43  rp, zArg, DbObjC
1a000 6d 64 2c 20 28 63 68 61 72 2a 29 70 2c 20 44 62  md, (char*)p, Db
1a010 44 65 6c 65 74 65 43 6d 64 29 3b 0a 20 20 7d 0a  DeleteCmd);.  }.
1a020 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1a030 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64  .}../*.** Provid
1a040 65 20 61 20 64 75 6d 6d 79 20 54 63 6c 5f 49 6e  e a dummy Tcl_In
1a050 69 74 53 74 75 62 73 20 69 66 20 77 65 20 61 72  itStubs if we ar
1a060 65 20 75 73 69 6e 67 20 74 68 69 73 20 61 73 20  e using this as 
1a070 61 20 73 74 61 74 69 63 0a 2a 2a 20 6c 69 62 72  a static.** libr
1a080 61 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ary..*/.#ifndef 
1a090 55 53 45 5f 54 43 4c 5f 53 54 55 42 53 0a 23 20  USE_TCL_STUBS.# 
1a0a0 75 6e 64 65 66 20 20 54 63 6c 5f 49 6e 69 74 53  undef  Tcl_InitS
1a0b0 74 75 62 73 0a 23 20 64 65 66 69 6e 65 20 54 63  tubs.# define Tc
1a0c0 6c 5f 49 6e 69 74 53 74 75 62 73 28 61 2c 62 2c  l_InitStubs(a,b,
1a0d0 63 29 20 54 43 4c 5f 56 45 52 53 49 4f 4e 0a 23  c) TCL_VERSION.#
1a0e0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  endif../*.** Mak
1a0f0 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20 61  e sure we have a
1a100 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e   PACKAGE_VERSION
1a110 20 6d 61 63 72 6f 20 64 65 66 69 6e 65 64 2e 20   macro defined. 
1a120 20 54 68 69 73 20 77 69 6c 6c 20 62 65 0a 2a 2a   This will be.**
1a130 20 64 65 66 69 6e 65 64 20 61 75 74 6f 6d 61 74   defined automat
1a140 69 63 61 6c 6c 79 20 62 79 20 74 68 65 20 54 45  ically by the TE
1a150 41 20 6d 61 6b 65 66 69 6c 65 2e 20 20 42 75 74  A makefile.  But
1a160 20 6f 74 68 65 72 20 6d 61 6b 65 66 69 6c 65 73   other makefiles
1a170 0a 2a 2a 20 64 6f 20 6e 6f 74 20 64 65 66 69 6e  .** do not defin
1a180 65 20 69 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  e it..*/.#ifndef
1a190 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e   PACKAGE_VERSION
1a1a0 0a 23 20 64 65 66 69 6e 65 20 50 41 43 4b 41 47  .# define PACKAG
1a1b0 45 5f 56 45 52 53 49 4f 4e 20 53 51 4c 49 54 45  E_VERSION SQLITE
1a1c0 5f 56 45 52 53 49 4f 4e 0a 23 65 6e 64 69 66 0a  _VERSION.#endif.
1a1d0 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
1a1e0 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a  e this module..*
1a1f0 2a 0a 2a 2a 20 54 68 69 73 20 54 63 6c 20 6d 6f  *.** This Tcl mo
1a200 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  dule contains on
1a210 6c 79 20 61 20 73 69 6e 67 6c 65 20 6e 65 77 20  ly a single new 
1a220 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65  Tcl command name
1a230 64 20 22 73 71 6c 69 74 65 22 2e 0a 2a 2a 20 28  d "sqlite"..** (
1a240 48 65 6e 63 65 20 74 68 65 72 65 20 69 73 20 6e  Hence there is n
1a250 6f 20 6e 61 6d 65 73 70 61 63 65 2e 20 20 54 68  o namespace.  Th
1a260 65 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20  ere is no point 
1a270 69 6e 20 75 73 69 6e 67 20 61 20 6e 61 6d 65 73  in using a names
1a280 70 61 63 65 0a 2a 2a 20 69 66 20 74 68 65 20 65  pace.** if the e
1a290 78 74 65 6e 73 69 6f 6e 20 6f 6e 6c 79 20 73 75  xtension only su
1a2a0 70 70 6c 69 65 73 20 6f 6e 65 20 6e 65 77 20 6e  pplies one new n
1a2b0 61 6d 65 21 29 20 20 54 68 65 20 22 73 71 6c 69  ame!)  The "sqli
1a2c0 74 65 22 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a  te" command is.*
1a2d0 2a 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20 61  * used to open a
1a2e0 20 6e 65 77 20 53 51 4c 69 74 65 20 64 61 74 61   new SQLite data
1a2f0 62 61 73 65 2e 20 20 53 65 65 20 74 68 65 20 44  base.  See the D
1a300 62 4d 61 69 6e 28 29 20 72 6f 75 74 69 6e 65 20  bMain() routine 
1a310 61 62 6f 76 65 0a 2a 2a 20 66 6f 72 20 61 64 64  above.** for add
1a320 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
1a330 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45  ion..**.** The E
1a340 58 54 45 52 4e 20 6d 61 63 72 6f 73 20 61 72 65  XTERN macros are
1a350 20 72 65 71 75 69 72 65 64 20 62 79 20 54 43 4c   required by TCL
1a360 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 77 6f 72   in order to wor
1a370 6b 20 6f 6e 20 77 69 6e 64 6f 77 73 2e 0a 2a 2f  k on windows..*/
1a380 0a 45 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69  .EXTERN int Sqli
1a390 74 65 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  te3_Init(Tcl_Int
1a3a0 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20  erp *interp){.  
1a3b0 69 6e 74 20 72 63 20 3d 20 54 63 6c 5f 49 6e 69  int rc = Tcl_Ini
1a3c0 74 53 74 75 62 73 28 69 6e 74 65 72 70 2c 20 22  tStubs(interp, "
1a3d0 38 2e 34 22 2c 20 30 29 20 3f 20 54 43 4c 5f 4f  8.4", 0) ? TCL_O
1a3e0 4b 20 3a 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  K : TCL_ERROR;. 
1a3f0 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20   if( rc==TCL_OK 
1a400 29 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74  ){.    Tcl_Creat
1a410 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
1a420 72 70 2c 20 22 73 71 6c 69 74 65 33 22 2c 20 28  rp, "sqlite3", (
1a430 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 2a 29  Tcl_ObjCmdProc*)
1a440 44 62 4d 61 69 6e 2c 20 30 2c 20 30 29 3b 0a 23  DbMain, 0, 0);.#
1a450 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 33 5f  ifndef SQLITE_3_
1a460 53 55 46 46 49 58 5f 4f 4e 4c 59 0a 20 20 20 20  SUFFIX_ONLY.    
1a470 2f 2a 20 54 68 65 20 22 73 71 6c 69 74 65 22 20  /* The "sqlite" 
1a480 61 6c 69 61 73 20 69 73 20 75 6e 64 6f 63 75 6d  alias is undocum
1a490 65 6e 74 65 64 2e 20 20 49 74 20 69 73 20 68 65  ented.  It is he
1a4a0 72 65 20 6f 6e 6c 79 20 74 6f 20 73 75 70 70 6f  re only to suppo
1a4b0 72 74 0a 20 20 20 20 2a 2a 20 6c 65 67 61 63 79  rt.    ** legacy
1a4c0 20 73 63 72 69 70 74 73 2e 20 20 41 6c 6c 20 6e   scripts.  All n
1a4d0 65 77 20 73 63 72 69 70 74 73 20 73 68 6f 75 6c  ew scripts shoul
1a4e0 64 20 75 73 65 20 6f 6e 6c 79 20 74 68 65 20 22  d use only the "
1a4f0 73 71 6c 69 74 65 33 22 0a 20 20 20 20 2a 2a 20  sqlite3".    ** 
1a500 63 6f 6d 6d 61 6e 64 2e 20 2a 2f 0a 20 20 20 20  command. */.    
1a510 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
1a520 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 73 71  mand(interp, "sq
1a530 6c 69 74 65 22 2c 20 28 54 63 6c 5f 4f 62 6a 43  lite", (Tcl_ObjC
1a540 6d 64 50 72 6f 63 2a 29 44 62 4d 61 69 6e 2c 20  mdProc*)DbMain, 
1a550 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  0, 0);.#endif.  
1a560 20 20 72 63 20 3d 20 54 63 6c 5f 50 6b 67 50 72    rc = Tcl_PkgPr
1a570 6f 76 69 64 65 28 69 6e 74 65 72 70 2c 20 22 73  ovide(interp, "s
1a580 71 6c 69 74 65 33 22 2c 20 50 41 43 4b 41 47 45  qlite3", PACKAGE
1a590 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20 7d 0a 20  _VERSION);.  }. 
1a5a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 45 58   return rc;.}.EX
1a5b0 54 45 52 4e 20 69 6e 74 20 54 63 6c 73 71 6c 69  TERN int Tclsqli
1a5c0 74 65 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  te3_Init(Tcl_Int
1a5d0 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65  erp *interp){ re
1a5e0 74 75 72 6e 20 53 71 6c 69 74 65 33 5f 49 6e 69  turn Sqlite3_Ini
1a5f0 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a 45 58 54  t(interp); }.EXT
1a600 45 52 4e 20 69 6e 74 20 53 71 6c 69 74 65 33 5f  ERN int Sqlite3_
1a610 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72  Unload(Tcl_Inter
1a620 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66  p *interp, int f
1a630 6c 61 67 73 29 7b 20 72 65 74 75 72 6e 20 54 43  lags){ return TC
1a640 4c 5f 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e 20 69  L_OK; }.EXTERN i
1a650 6e 74 20 54 63 6c 73 71 6c 69 74 65 33 5f 55 6e  nt Tclsqlite3_Un
1a660 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72 70 20  load(Tcl_Interp 
1a670 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c 61  *interp, int fla
1a680 67 73 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f  gs){ return TCL_
1a690 4f 4b 3b 20 7d 0a 0a 2f 2a 20 42 65 63 61 75 73  OK; }../* Becaus
1a6a0 65 20 69 74 20 61 63 63 65 73 73 65 73 20 74 68  e it accesses th
1a6b0 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 61 6e  e file-system an
1a6c0 64 20 75 73 65 73 20 70 65 72 73 69 73 74 65 6e  d uses persisten
1a6d0 74 20 73 74 61 74 65 2c 20 53 51 4c 69 74 65 0a  t state, SQLite.
1a6e0 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64  ** is not consid
1a6f0 65 72 65 64 20 61 70 70 72 6f 70 72 69 61 74 65  ered appropriate
1a700 20 66 6f 72 20 73 61 66 65 20 69 6e 74 65 72 70   for safe interp
1a710 72 65 74 65 72 73 2e 20 20 48 65 6e 63 65 2c 20  reters.  Hence, 
1a720 77 65 20 63 61 75 73 65 0a 2a 2a 20 74 68 65 20  we cause.** the 
1a730 5f 53 61 66 65 49 6e 69 74 28 29 20 69 6e 74 65  _SafeInit() inte
1a740 72 66 61 63 65 73 20 72 65 74 75 72 6e 20 54 43  rfaces return TC
1a750 4c 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 45 58 54 45  L_ERROR..*/.EXTE
1a760 52 4e 20 69 6e 74 20 53 71 6c 69 74 65 33 5f 53  RN int Sqlite3_S
1a770 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  afeInit(Tcl_Inte
1a780 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74  rp *interp){ ret
1a790 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 20 7d  urn TCL_ERROR; }
1a7a0 0a 45 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69  .EXTERN int Sqli
1a7b0 74 65 33 5f 53 61 66 65 55 6e 6c 6f 61 64 28 54  te3_SafeUnload(T
1a7c0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1a7d0 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 72 65  p, int flags){re
1a7e0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 7d  turn TCL_ERROR;}
1a7f0 0a 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ....#ifndef SQLI
1a800 54 45 5f 33 5f 53 55 46 46 49 58 5f 4f 4e 4c 59  TE_3_SUFFIX_ONLY
1a810 0a 69 6e 74 20 53 71 6c 69 74 65 5f 49 6e 69 74  .int Sqlite_Init
1a820 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
1a830 65 72 70 29 7b 20 72 65 74 75 72 6e 20 53 71 6c  erp){ return Sql
1a840 69 74 65 33 5f 49 6e 69 74 28 69 6e 74 65 72 70  ite3_Init(interp
1a850 29 3b 20 7d 0a 69 6e 74 20 54 63 6c 73 71 6c 69  ); }.int Tclsqli
1a860 74 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  te_Init(Tcl_Inte
1a870 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74  rp *interp){ ret
1a880 75 72 6e 20 53 71 6c 69 74 65 33 5f 49 6e 69 74  urn Sqlite3_Init
1a890 28 69 6e 74 65 72 70 29 3b 20 7d 0a 69 6e 74 20  (interp); }.int 
1a8a0 53 71 6c 69 74 65 5f 55 6e 6c 6f 61 64 28 54 63  Sqlite_Unload(Tc
1a8b0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1a8c0 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 20 72 65  , int flags){ re
1a8d0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 69  turn TCL_OK; }.i
1a8e0 6e 74 20 54 63 6c 73 71 6c 69 74 65 5f 55 6e 6c  nt Tclsqlite_Unl
1a8f0 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  oad(Tcl_Interp *
1a900 69 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c 61 67  interp, int flag
1a910 73 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  s){ return TCL_O
1a920 4b 3b 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  K; }.#endif..#if
1a930 64 65 66 20 54 43 4c 53 48 0a 2f 2a 2a 2a 2a 2a  def TCLSH./*****
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 2a 2a  ****************
1a960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a980 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 41 6c 6c 20  ********.** All 
1a990 6f 66 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  of the code that
1a9a0 20 66 6f 6c 6c 6f 77 73 20 69 73 20 75 73 65 64   follows is used
1a9b0 20 74 6f 20 62 75 69 6c 64 20 73 74 61 6e 64 61   to build standa
1a9c0 6c 6f 6e 65 20 54 43 4c 20 69 6e 74 65 72 70 72  lone TCL interpr
1a9d0 65 74 65 72 73 0a 2a 2a 20 74 68 61 74 20 61 72  eters.** that ar
1a9e0 65 20 73 74 61 74 69 63 61 6c 6c 79 20 6c 69 6e  e statically lin
1a9f0 6b 65 64 20 77 69 74 68 20 53 51 4c 69 74 65 2e  ked with SQLite.
1aa00 20 20 45 6e 61 62 6c 65 20 74 68 65 73 65 20 62    Enable these b
1aa10 79 20 63 6f 6d 70 69 6c 69 6e 67 0a 2a 2a 20 77  y compiling.** w
1aa20 69 74 68 20 2d 44 54 43 4c 53 48 3d 6e 20 77 68  ith -DTCLSH=n wh
1aa30 65 72 65 20 6e 20 63 61 6e 20 62 65 20 31 20 6f  ere n can be 1 o
1aa40 72 20 32 2e 20 20 41 6e 20 6e 20 6f 66 20 31 20  r 2.  An n of 1 
1aa50 67 65 6e 65 72 61 74 65 73 20 61 20 73 74 61 6e  generates a stan
1aa60 64 61 72 64 0a 2a 2a 20 74 63 6c 73 68 20 62 75  dard.** tclsh bu
1aa70 74 20 77 69 74 68 20 53 51 4c 69 74 65 20 62 75  t with SQLite bu
1aa80 69 6c 74 20 69 6e 2e 20 20 41 6e 20 6e 20 6f 66  ilt in.  An n of
1aa90 20 32 20 67 65 6e 65 72 61 74 65 73 20 74 68 65   2 generates the
1aaa0 20 53 51 4c 69 74 65 20 73 70 61 63 65 0a 2a 2a   SQLite space.**
1aab0 20 61 6e 61 6c 79 73 69 73 20 70 72 6f 67 72 61   analysis progra
1aac0 6d 2e 0a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e  m..*/..#if defin
1aad0 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20  ed(SQLITE_TEST) 
1aae0 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
1aaf0 45 5f 54 43 4c 4d 44 35 29 0a 2f 2a 0a 20 2a 20  E_TCLMD5)./*. * 
1ab00 54 68 69 73 20 63 6f 64 65 20 69 6d 70 6c 65 6d  This code implem
1ab10 65 6e 74 73 20 74 68 65 20 4d 44 35 20 6d 65 73  ents the MD5 mes
1ab20 73 61 67 65 2d 64 69 67 65 73 74 20 61 6c 67 6f  sage-digest algo
1ab30 72 69 74 68 6d 2e 0a 20 2a 20 54 68 65 20 61 6c  rithm.. * The al
1ab40 67 6f 72 69 74 68 6d 20 69 73 20 64 75 65 20 74  gorithm is due t
1ab50 6f 20 52 6f 6e 20 52 69 76 65 73 74 2e 20 20 54  o Ron Rivest.  T
1ab60 68 69 73 20 63 6f 64 65 20 77 61 73 0a 20 2a 20  his code was. * 
1ab70 77 72 69 74 74 65 6e 20 62 79 20 43 6f 6c 69 6e  written by Colin
1ab80 20 50 6c 75 6d 62 20 69 6e 20 31 39 39 33 2c 20   Plumb in 1993, 
1ab90 6e 6f 20 63 6f 70 79 72 69 67 68 74 20 69 73 20  no copyright is 
1aba0 63 6c 61 69 6d 65 64 2e 0a 20 2a 20 54 68 69 73  claimed.. * This
1abb0 20 63 6f 64 65 20 69 73 20 69 6e 20 74 68 65 20   code is in the 
1abc0 70 75 62 6c 69 63 20 64 6f 6d 61 69 6e 3b 20 64  public domain; d
1abd0 6f 20 77 69 74 68 20 69 74 20 77 68 61 74 20 79  o with it what y
1abe0 6f 75 20 77 69 73 68 2e 0a 20 2a 0a 20 2a 20 45  ou wish.. *. * E
1abf0 71 75 69 76 61 6c 65 6e 74 20 63 6f 64 65 20 69  quivalent code i
1ac00 73 20 61 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d  s available from
1ac10 20 52 53 41 20 44 61 74 61 20 53 65 63 75 72 69   RSA Data Securi
1ac20 74 79 2c 20 49 6e 63 2e 0a 20 2a 20 54 68 69 73  ty, Inc.. * This
1ac30 20 63 6f 64 65 20 68 61 73 20 62 65 65 6e 20 74   code has been t
1ac40 65 73 74 65 64 20 61 67 61 69 6e 73 74 20 74 68  ested against th
1ac50 61 74 2c 20 61 6e 64 20 69 73 20 65 71 75 69 76  at, and is equiv
1ac60 61 6c 65 6e 74 2c 0a 20 2a 20 65 78 63 65 70 74  alent,. * except
1ac70 20 74 68 61 74 20 79 6f 75 20 64 6f 6e 27 74 20   that you don't 
1ac80 6e 65 65 64 20 74 6f 20 69 6e 63 6c 75 64 65 20  need to include 
1ac90 74 77 6f 20 70 61 67 65 73 20 6f 66 20 6c 65 67  two pages of leg
1aca0 61 6c 65 73 65 0a 20 2a 20 77 69 74 68 20 65 76  alese. * with ev
1acb0 65 72 79 20 63 6f 70 79 2e 0a 20 2a 0a 20 2a 20  ery copy.. *. * 
1acc0 54 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6d  To compute the m
1acd0 65 73 73 61 67 65 20 64 69 67 65 73 74 20 6f 66  essage digest of
1ace0 20 61 20 63 68 75 6e 6b 20 6f 66 20 62 79 74 65   a chunk of byte
1acf0 73 2c 20 64 65 63 6c 61 72 65 20 61 6e 0a 20 2a  s, declare an. *
1ad00 20 4d 44 35 43 6f 6e 74 65 78 74 20 73 74 72 75   MD5Context stru
1ad10 63 74 75 72 65 2c 20 70 61 73 73 20 69 74 20 74  cture, pass it t
1ad20 6f 20 4d 44 35 49 6e 69 74 2c 20 63 61 6c 6c 20  o MD5Init, call 
1ad30 4d 44 35 55 70 64 61 74 65 20 61 73 0a 20 2a 20  MD5Update as. * 
1ad40 6e 65 65 64 65 64 20 6f 6e 20 62 75 66 66 65 72  needed on buffer
1ad50 73 20 66 75 6c 6c 20 6f 66 20 62 79 74 65 73 2c  s full of bytes,
1ad60 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 4d   and then call M
1ad70 44 35 46 69 6e 61 6c 2c 20 77 68 69 63 68 0a 20  D5Final, which. 
1ad80 2a 20 77 69 6c 6c 20 66 69 6c 6c 20 61 20 73 75  * will fill a su
1ad90 70 70 6c 69 65 64 20 31 36 2d 62 79 74 65 20 61  pplied 16-byte a
1ada0 72 72 61 79 20 77 69 74 68 20 74 68 65 20 64 69  rray with the di
1adb0 67 65 73 74 2e 0a 20 2a 2f 0a 0a 2f 2a 0a 20 2a  gest.. */../*. *
1adc0 20 49 66 20 63 6f 6d 70 69 6c 65 64 20 6f 6e 20   If compiled on 
1add0 61 20 6d 61 63 68 69 6e 65 20 74 68 61 74 20 64  a machine that d
1ade0 6f 65 73 6e 27 74 20 68 61 76 65 20 61 20 33 32  oesn't have a 32
1adf0 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 0a 20 2a  -bit integer,. *
1ae00 20 79 6f 75 20 6a 75 73 74 20 73 65 74 20 22 75   you just set "u
1ae10 69 6e 74 33 32 22 20 74 6f 20 74 68 65 20 61 70  int32" to the ap
1ae20 70 72 6f 70 72 69 61 74 65 20 64 61 74 61 74 79  propriate dataty
1ae30 70 65 20 66 6f 72 20 61 6e 0a 20 2a 20 75 6e 73  pe for an. * uns
1ae40 69 67 6e 65 64 20 33 32 2d 62 69 74 20 69 6e 74  igned 32-bit int
1ae50 65 67 65 72 2e 20 20 46 6f 72 20 65 78 61 6d 70  eger.  For examp
1ae60 6c 65 3a 0a 20 2a 0a 20 2a 20 20 20 20 20 20 20  le:. *. *       
1ae70 63 63 20 2d 44 75 69 6e 74 33 32 3d 27 75 6e 73  cc -Duint32='uns
1ae80 69 67 6e 65 64 20 6c 6f 6e 67 27 20 6d 64 35 2e  igned long' md5.
1ae90 63 0a 20 2a 0a 20 2a 2f 0a 23 69 66 6e 64 65 66  c. *. */.#ifndef
1aea0 20 75 69 6e 74 33 32 0a 23 20 20 64 65 66 69 6e   uint32.#  defin
1aeb0 65 20 75 69 6e 74 33 32 20 75 6e 73 69 67 6e 65  e uint32 unsigne
1aec0 64 20 69 6e 74 0a 23 65 6e 64 69 66 0a 0a 73 74  d int.#endif..st
1aed0 72 75 63 74 20 4d 44 35 43 6f 6e 74 65 78 74 20  ruct MD5Context 
1aee0 7b 0a 20 20 69 6e 74 20 69 73 49 6e 69 74 3b 0a  {.  int isInit;.
1aef0 20 20 75 69 6e 74 33 32 20 62 75 66 5b 34 5d 3b    uint32 buf[4];
1af00 0a 20 20 75 69 6e 74 33 32 20 62 69 74 73 5b 32  .  uint32 bits[2
1af10 5d 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ];.  unsigned ch
1af20 61 72 20 69 6e 5b 36 34 5d 3b 0a 7d 3b 0a 74 79  ar in[64];.};.ty
1af30 70 65 64 65 66 20 73 74 72 75 63 74 20 4d 44 35  pedef struct MD5
1af40 43 6f 6e 74 65 78 74 20 4d 44 35 43 6f 6e 74 65  Context MD5Conte
1af50 78 74 3b 0a 0a 2f 2a 0a 20 2a 20 4e 6f 74 65 3a  xt;../*. * Note:
1af60 20 74 68 69 73 20 63 6f 64 65 20 69 73 20 68 61   this code is ha
1af70 72 6d 6c 65 73 73 20 6f 6e 20 6c 69 74 74 6c 65  rmless on little
1af80 2d 65 6e 64 69 61 6e 20 6d 61 63 68 69 6e 65 73  -endian machines
1af90 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  .. */.static voi
1afa0 64 20 62 79 74 65 52 65 76 65 72 73 65 20 28 75  d byteReverse (u
1afb0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75  nsigned char *bu
1afc0 66 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  f, unsigned long
1afd0 73 29 7b 0a 20 20 20 20 20 20 20 20 75 69 6e 74  s){.        uint
1afe0 33 32 20 74 3b 0a 20 20 20 20 20 20 20 20 64 6f  32 t;.        do
1aff0 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
1b000 20 20 20 74 20 3d 20 28 75 69 6e 74 33 32 29 28     t = (uint32)(
1b010 28 75 6e 73 69 67 6e 65 64 29 62 75 66 5b 33 5d  (unsigned)buf[3]
1b020 3c 3c 38 20 7c 20 62 75 66 5b 32 5d 29 20 3c 3c  <<8 | buf[2]) <<
1b030 20 31 36 20 7c 0a 20 20 20 20 20 20 20 20 20 20   16 |.          
1b040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b050 20 20 28 28 75 6e 73 69 67 6e 65 64 29 62 75 66    ((unsigned)buf
1b060 5b 31 5d 3c 3c 38 20 7c 20 62 75 66 5b 30 5d 29  [1]<<8 | buf[0])
1b070 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1b080 20 20 2a 28 75 69 6e 74 33 32 20 2a 29 62 75 66    *(uint32 *)buf
1b090 20 3d 20 74 3b 0a 20 20 20 20 20 20 20 20 20 20   = t;.          
1b0a0 20 20 20 20 20 20 62 75 66 20 2b 3d 20 34 3b 0a        buf += 4;.
1b0b0 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65 20          } while 
1b0c0 28 2d 2d 6c 6f 6e 67 73 29 3b 0a 7d 0a 2f 2a 20  (--longs);.}./* 
1b0d0 54 68 65 20 66 6f 75 72 20 63 6f 72 65 20 66 75  The four core fu
1b0e0 6e 63 74 69 6f 6e 73 20 2d 20 46 31 20 69 73 20  nctions - F1 is 
1b0f0 6f 70 74 69 6d 69 7a 65 64 20 73 6f 6d 65 77 68  optimized somewh
1b100 61 74 20 2a 2f 0a 0a 2f 2a 20 23 64 65 66 69 6e  at */../* #defin
1b110 65 20 46 31 28 78 2c 20 79 2c 20 7a 29 20 28 78  e F1(x, y, z) (x
1b120 20 26 20 79 20 7c 20 7e 78 20 26 20 7a 29 20 2a   & y | ~x & z) *
1b130 2f 0a 23 64 65 66 69 6e 65 20 46 31 28 78 2c 20  /.#define F1(x, 
1b140 79 2c 20 7a 29 20 28 7a 20 5e 20 28 78 20 26 20  y, z) (z ^ (x & 
1b150 28 79 20 5e 20 7a 29 29 29 0a 23 64 65 66 69 6e  (y ^ z))).#defin
1b160 65 20 46 32 28 78 2c 20 79 2c 20 7a 29 20 46 31  e F2(x, y, z) F1
1b170 28 7a 2c 20 78 2c 20 79 29 0a 23 64 65 66 69 6e  (z, x, y).#defin
1b180 65 20 46 33 28 78 2c 20 79 2c 20 7a 29 20 28 78  e F3(x, y, z) (x
1b190 20 5e 20 79 20 5e 20 7a 29 0a 23 64 65 66 69 6e   ^ y ^ z).#defin
1b1a0 65 20 46 34 28 78 2c 20 79 2c 20 7a 29 20 28 79  e F4(x, y, z) (y
1b1b0 20 5e 20 28 78 20 7c 20 7e 7a 29 29 0a 0a 2f 2a   ^ (x | ~z))../*
1b1c0 20 54 68 69 73 20 69 73 20 74 68 65 20 63 65 6e   This is the cen
1b1d0 74 72 61 6c 20 73 74 65 70 20 69 6e 20 74 68 65  tral step in the
1b1e0 20 4d 44 35 20 61 6c 67 6f 72 69 74 68 6d 2e 20   MD5 algorithm. 
1b1f0 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 44 35 53 54  */.#define MD5ST
1b200 45 50 28 66 2c 20 77 2c 20 78 2c 20 79 2c 20 7a  EP(f, w, x, y, z
1b210 2c 20 64 61 74 61 2c 20 73 29 20 5c 0a 20 20 20  , data, s) \.   
1b220 20 20 20 20 20 28 20 77 20 2b 3d 20 66 28 78 2c       ( w += f(x,
1b230 20 79 2c 20 7a 29 20 2b 20 64 61 74 61 2c 20 20   y, z) + data,  
1b240 77 20 3d 20 77 3c 3c 73 20 7c 20 77 3e 3e 28 33  w = w<<s | w>>(3
1b250 32 2d 73 29 2c 20 20 77 20 2b 3d 20 78 20 29 0a  2-s),  w += x ).
1b260 0a 2f 2a 0a 20 2a 20 54 68 65 20 63 6f 72 65 20  ./*. * The core 
1b270 6f 66 20 74 68 65 20 4d 44 35 20 61 6c 67 6f 72  of the MD5 algor
1b280 69 74 68 6d 2c 20 74 68 69 73 20 61 6c 74 65 72  ithm, this alter
1b290 73 20 61 6e 20 65 78 69 73 74 69 6e 67 20 4d 44  s an existing MD
1b2a0 35 20 68 61 73 68 20 74 6f 0a 20 2a 20 72 65 66  5 hash to. * ref
1b2b0 6c 65 63 74 20 74 68 65 20 61 64 64 69 74 69 6f  lect the additio
1b2c0 6e 20 6f 66 20 31 36 20 6c 6f 6e 67 77 6f 72 64  n of 16 longword
1b2d0 73 20 6f 66 20 6e 65 77 20 64 61 74 61 2e 20 20  s of new data.  
1b2e0 4d 44 35 55 70 64 61 74 65 20 62 6c 6f 63 6b 73  MD5Update blocks
1b2f0 0a 20 2a 20 74 68 65 20 64 61 74 61 20 61 6e 64  . * the data and
1b300 20 63 6f 6e 76 65 72 74 73 20 62 79 74 65 73 20   converts bytes 
1b310 69 6e 74 6f 20 6c 6f 6e 67 77 6f 72 64 73 20 66  into longwords f
1b320 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  or this routine.
1b330 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  . */.static void
1b340 20 4d 44 35 54 72 61 6e 73 66 6f 72 6d 28 75 69   MD5Transform(ui
1b350 6e 74 33 32 20 62 75 66 5b 34 5d 2c 20 63 6f 6e  nt32 buf[4], con
1b360 73 74 20 75 69 6e 74 33 32 20 69 6e 5b 31 36 5d  st uint32 in[16]
1b370 29 7b 0a 20 20 20 20 20 20 20 20 72 65 67 69 73  ){.        regis
1b380 74 65 72 20 75 69 6e 74 33 32 20 61 2c 20 62 2c  ter uint32 a, b,
1b390 20 63 2c 20 64 3b 0a 0a 20 20 20 20 20 20 20 20   c, d;..        
1b3a0 61 20 3d 20 62 75 66 5b 30 5d 3b 0a 20 20 20 20  a = buf[0];.    
1b3b0 20 20 20 20 62 20 3d 20 62 75 66 5b 31 5d 3b 0a      b = buf[1];.
1b3c0 20 20 20 20 20 20 20 20 63 20 3d 20 62 75 66 5b          c = buf[
1b3d0 32 5d 3b 0a 20 20 20 20 20 20 20 20 64 20 3d 20  2];.        d = 
1b3e0 62 75 66 5b 33 5d 3b 0a 0a 20 20 20 20 20 20 20  buf[3];..       
1b3f0 20 4d 44 35 53 54 45 50 28 46 31 2c 20 61 2c 20   MD5STEP(F1, a, 
1b400 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 30 5d 2b  b, c, d, in[ 0]+
1b410 30 78 64 37 36 61 61 34 37 38 2c 20 20 37 29 3b  0xd76aa478,  7);
1b420 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1b430 28 46 31 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c  (F1, d, a, b, c,
1b440 20 69 6e 5b 20 31 5d 2b 30 78 65 38 63 37 62 37   in[ 1]+0xe8c7b7
1b450 35 36 2c 20 31 32 29 3b 0a 20 20 20 20 20 20 20  56, 12);.       
1b460 20 4d 44 35 53 54 45 50 28 46 31 2c 20 63 2c 20   MD5STEP(F1, c, 
1b470 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 32 5d 2b  d, a, b, in[ 2]+
1b480 30 78 32 34 32 30 37 30 64 62 2c 20 31 37 29 3b  0x242070db, 17);
1b490 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1b4a0 28 46 31 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c  (F1, b, c, d, a,
1b4b0 20 69 6e 5b 20 33 5d 2b 30 78 63 31 62 64 63 65   in[ 3]+0xc1bdce
1b4c0 65 65 2c 20 32 32 29 3b 0a 20 20 20 20 20 20 20  ee, 22);.       
1b4d0 20 4d 44 35 53 54 45 50 28 46 31 2c 20 61 2c 20   MD5STEP(F1, a, 
1b4e0 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 34 5d 2b  b, c, d, in[ 4]+
1b4f0 30 78 66 35 37 63 30 66 61 66 2c 20 20 37 29 3b  0xf57c0faf,  7);
1b500 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1b510 28 46 31 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c  (F1, d, a, b, c,
1b520 20 69 6e 5b 20 35 5d 2b 30 78 34 37 38 37 63 36   in[ 5]+0x4787c6
1b530 32 61 2c 20 31 32 29 3b 0a 20 20 20 20 20 20 20  2a, 12);.       
1b540 20 4d 44 35 53 54 45 50 28 46 31 2c 20 63 2c 20   MD5STEP(F1, c, 
1b550 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 36 5d 2b  d, a, b, in[ 6]+
1b560 30 78 61 38 33 30 34 36 31 33 2c 20 31 37 29 3b  0xa8304613, 17);
1b570 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1b580 28 46 31 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c  (F1, b, c, d, a,
1b590 20 69 6e 5b 20 37 5d 2b 30 78 66 64 34 36 39 35   in[ 7]+0xfd4695
1b5a0 30 31 2c 20 32 32 29 3b 0a 20 20 20 20 20 20 20  01, 22);.       
1b5b0 20 4d 44 35 53 54 45 50 28 46 31 2c 20 61 2c 20   MD5STEP(F1, a, 
1b5c0 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 38 5d 2b  b, c, d, in[ 8]+
1b5d0 30 78 36 39 38 30 39 38 64 38 2c 20 20 37 29 3b  0x698098d8,  7);
1b5e0 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1b5f0 28 46 31 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c  (F1, d, a, b, c,
1b600 20 69 6e 5b 20 39 5d 2b 30 78 38 62 34 34 66 37   in[ 9]+0x8b44f7
1b610 61 66 2c 20 31 32 29 3b 0a 20 20 20 20 20 20 20  af, 12);.       
1b620 20 4d 44 35 53 54 45 50 28 46 31 2c 20 63 2c 20   MD5STEP(F1, c, 
1b630 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 30 5d 2b  d, a, b, in[10]+
1b640 30 78 66 66 66 66 35 62 62 31 2c 20 31 37 29 3b  0xffff5bb1, 17);
1b650 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1b660 28 46 31 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c  (F1, b, c, d, a,
1b670 20 69 6e 5b 31 31 5d 2b 30 78 38 39 35 63 64 37   in[11]+0x895cd7
1b680 62 65 2c 20 32 32 29 3b 0a 20 20 20 20 20 20 20  be, 22);.       
1b690 20 4d 44 35 53 54 45 50 28 46 31 2c 20 61 2c 20   MD5STEP(F1, a, 
1b6a0 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 31 32 5d 2b  b, c, d, in[12]+
1b6b0 30 78 36 62 39 30 31 31 32 32 2c 20 20 37 29 3b  0x6b901122,  7);
1b6c0 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1b6d0 28 46 31 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c  (F1, d, a, b, c,
1b6e0 20 69 6e 5b 31 33 5d 2b 30 78 66 64 39 38 37 31   in[13]+0xfd9871
1b6f0 39 33 2c 20 31 32 29 3b 0a 20 20 20 20 20 20 20  93, 12);.       
1b700 20 4d 44 35 53 54 45 50 28 46 31 2c 20 63 2c 20   MD5STEP(F1, c, 
1b710 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 34 5d 2b  d, a, b, in[14]+
1b720 30 78 61 36 37 39 34 33 38 65 2c 20 31 37 29 3b  0xa679438e, 17);
1b730 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1b740 28 46 31 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c  (F1, b, c, d, a,
1b750 20 69 6e 5b 31 35 5d 2b 30 78 34 39 62 34 30 38   in[15]+0x49b408
1b760 32 31 2c 20 32 32 29 3b 0a 0a 20 20 20 20 20 20  21, 22);..      
1b770 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20 61 2c    MD5STEP(F2, a,
1b780 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 31 5d   b, c, d, in[ 1]
1b790 2b 30 78 66 36 31 65 32 35 36 32 2c 20 20 35 29  +0xf61e2562,  5)
1b7a0 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
1b7b0 50 28 46 32 2c 20 64 2c 20 61 2c 20 62 2c 20 63  P(F2, d, a, b, c
1b7c0 2c 20 69 6e 5b 20 36 5d 2b 30 78 63 30 34 30 62  , in[ 6]+0xc040b
1b7d0 33 34 30 2c 20 20 39 29 3b 0a 20 20 20 20 20 20  340,  9);.      
1b7e0 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20 63 2c    MD5STEP(F2, c,
1b7f0 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 31 5d   d, a, b, in[11]
1b800 2b 30 78 32 36 35 65 35 61 35 31 2c 20 31 34 29  +0x265e5a51, 14)
1b810 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
1b820 50 28 46 32 2c 20 62 2c 20 63 2c 20 64 2c 20 61  P(F2, b, c, d, a
1b830 2c 20 69 6e 5b 20 30 5d 2b 30 78 65 39 62 36 63  , in[ 0]+0xe9b6c
1b840 37 61 61 2c 20 32 30 29 3b 0a 20 20 20 20 20 20  7aa, 20);.      
1b850 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20 61 2c    MD5STEP(F2, a,
1b860 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 35 5d   b, c, d, in[ 5]
1b870 2b 30 78 64 36 32 66 31 30 35 64 2c 20 20 35 29  +0xd62f105d,  5)
1b880 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
1b890 50 28 46 32 2c 20 64 2c 20 61 2c 20 62 2c 20 63  P(F2, d, a, b, c
1b8a0 2c 20 69 6e 5b 31 30 5d 2b 30 78 30 32 34 34 31  , in[10]+0x02441
1b8b0 34 35 33 2c 20 20 39 29 3b 0a 20 20 20 20 20 20  453,  9);.      
1b8c0 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20 63 2c    MD5STEP(F2, c,
1b8d0 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 35 5d   d, a, b, in[15]
1b8e0 2b 30 78 64 38 61 31 65 36 38 31 2c 20 31 34 29  +0xd8a1e681, 14)
1b8f0 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
1b900 50 28 46 32 2c 20 62 2c 20 63 2c 20 64 2c 20 61  P(F2, b, c, d, a
1b910 2c 20 69 6e 5b 20 34 5d 2b 30 78 65 37 64 33 66  , in[ 4]+0xe7d3f
1b920 62 63 38 2c 20 32 30 29 3b 0a 20 20 20 20 20 20  bc8, 20);.      
1b930 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20 61 2c    MD5STEP(F2, a,
1b940 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 39 5d   b, c, d, in[ 9]
1b950 2b 30 78 32 31 65 31 63 64 65 36 2c 20 20 35 29  +0x21e1cde6,  5)
1b960 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
1b970 50 28 46 32 2c 20 64 2c 20 61 2c 20 62 2c 20 63  P(F2, d, a, b, c
1b980 2c 20 69 6e 5b 31 34 5d 2b 30 78 63 33 33 37 30  , in[14]+0xc3370
1b990 37 64 36 2c 20 20 39 29 3b 0a 20 20 20 20 20 20  7d6,  9);.      
1b9a0 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20 63 2c    MD5STEP(F2, c,
1b9b0 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 33 5d   d, a, b, in[ 3]
1b9c0 2b 30 78 66 34 64 35 30 64 38 37 2c 20 31 34 29  +0xf4d50d87, 14)
1b9d0 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
1b9e0 50 28 46 32 2c 20 62 2c 20 63 2c 20 64 2c 20 61  P(F2, b, c, d, a
1b9f0 2c 20 69 6e 5b 20 38 5d 2b 30 78 34 35 35 61 31  , in[ 8]+0x455a1
1ba00 34 65 64 2c 20 32 30 29 3b 0a 20 20 20 20 20 20  4ed, 20);.      
1ba10 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20 61 2c    MD5STEP(F2, a,
1ba20 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 31 33 5d   b, c, d, in[13]
1ba30 2b 30 78 61 39 65 33 65 39 30 35 2c 20 20 35 29  +0xa9e3e905,  5)
1ba40 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
1ba50 50 28 46 32 2c 20 64 2c 20 61 2c 20 62 2c 20 63  P(F2, d, a, b, c
1ba60 2c 20 69 6e 5b 20 32 5d 2b 30 78 66 63 65 66 61  , in[ 2]+0xfcefa
1ba70 33 66 38 2c 20 20 39 29 3b 0a 20 20 20 20 20 20  3f8,  9);.      
1ba80 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20 63 2c    MD5STEP(F2, c,
1ba90 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 37 5d   d, a, b, in[ 7]
1baa0 2b 30 78 36 37 36 66 30 32 64 39 2c 20 31 34 29  +0x676f02d9, 14)
1bab0 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
1bac0 50 28 46 32 2c 20 62 2c 20 63 2c 20 64 2c 20 61  P(F2, b, c, d, a
1bad0 2c 20 69 6e 5b 31 32 5d 2b 30 78 38 64 32 61 34  , in[12]+0x8d2a4
1bae0 63 38 61 2c 20 32 30 29 3b 0a 0a 20 20 20 20 20  c8a, 20);..     
1baf0 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20 61     MD5STEP(F3, a
1bb00 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 35  , b, c, d, in[ 5
1bb10 5d 2b 30 78 66 66 66 61 33 39 34 32 2c 20 20 34  ]+0xfffa3942,  4
1bb20 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
1bb30 45 50 28 46 33 2c 20 64 2c 20 61 2c 20 62 2c 20  EP(F3, d, a, b, 
1bb40 63 2c 20 69 6e 5b 20 38 5d 2b 30 78 38 37 37 31  c, in[ 8]+0x8771
1bb50 66 36 38 31 2c 20 31 31 29 3b 0a 20 20 20 20 20  f681, 11);.     
1bb60 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20 63     MD5STEP(F3, c
1bb70 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 31  , d, a, b, in[11
1bb80 5d 2b 30 78 36 64 39 64 36 31 32 32 2c 20 31 36  ]+0x6d9d6122, 16
1bb90 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
1bba0 45 50 28 46 33 2c 20 62 2c 20 63 2c 20 64 2c 20  EP(F3, b, c, d, 
1bbb0 61 2c 20 69 6e 5b 31 34 5d 2b 30 78 66 64 65 35  a, in[14]+0xfde5
1bbc0 33 38 30 63 2c 20 32 33 29 3b 0a 20 20 20 20 20  380c, 23);.     
1bbd0 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20 61     MD5STEP(F3, a
1bbe0 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 31  , b, c, d, in[ 1
1bbf0 5d 2b 30 78 61 34 62 65 65 61 34 34 2c 20 20 34  ]+0xa4beea44,  4
1bc00 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
1bc10 45 50 28 46 33 2c 20 64 2c 20 61 2c 20 62 2c 20  EP(F3, d, a, b, 
1bc20 63 2c 20 69 6e 5b 20 34 5d 2b 30 78 34 62 64 65  c, in[ 4]+0x4bde
1bc30 63 66 61 39 2c 20 31 31 29 3b 0a 20 20 20 20 20  cfa9, 11);.     
1bc40 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20 63     MD5STEP(F3, c
1bc50 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 37  , d, a, b, in[ 7
1bc60 5d 2b 30 78 66 36 62 62 34 62 36 30 2c 20 31 36  ]+0xf6bb4b60, 16
1bc70 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
1bc80 45 50 28 46 33 2c 20 62 2c 20 63 2c 20 64 2c 20  EP(F3, b, c, d, 
1bc90 61 2c 20 69 6e 5b 31 30 5d 2b 30 78 62 65 62 66  a, in[10]+0xbebf
1bca0 62 63 37 30 2c 20 32 33 29 3b 0a 20 20 20 20 20  bc70, 23);.     
1bcb0 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20 61     MD5STEP(F3, a
1bcc0 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 31 33  , b, c, d, in[13
1bcd0 5d 2b 30 78 32 38 39 62 37 65 63 36 2c 20 20 34  ]+0x289b7ec6,  4
1bce0 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
1bcf0 45 50 28 46 33 2c 20 64 2c 20 61 2c 20 62 2c 20  EP(F3, d, a, b, 
1bd00 63 2c 20 69 6e 5b 20 30 5d 2b 30 78 65 61 61 31  c, in[ 0]+0xeaa1
1bd10 32 37 66 61 2c 20 31 31 29 3b 0a 20 20 20 20 20  27fa, 11);.     
1bd20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20 63     MD5STEP(F3, c
1bd30 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 33  , d, a, b, in[ 3
1bd40 5d 2b 30 78 64 34 65 66 33 30 38 35 2c 20 31 36  ]+0xd4ef3085, 16
1bd50 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
1bd60 45 50 28 46 33 2c 20 62 2c 20 63 2c 20 64 2c 20  EP(F3, b, c, d, 
1bd70 61 2c 20 69 6e 5b 20 36 5d 2b 30 78 30 34 38 38  a, in[ 6]+0x0488
1bd80 31 64 30 35 2c 20 32 33 29 3b 0a 20 20 20 20 20  1d05, 23);.     
1bd90 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20 61     MD5STEP(F3, a
1bda0 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 39  , b, c, d, in[ 9
1bdb0 5d 2b 30 78 64 39 64 34 64 30 33 39 2c 20 20 34  ]+0xd9d4d039,  4
1bdc0 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
1bdd0 45 50 28 46 33 2c 20 64 2c 20 61 2c 20 62 2c 20  EP(F3, d, a, b, 
1bde0 63 2c 20 69 6e 5b 31 32 5d 2b 30 78 65 36 64 62  c, in[12]+0xe6db
1bdf0 39 39 65 35 2c 20 31 31 29 3b 0a 20 20 20 20 20  99e5, 11);.     
1be00 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20 63     MD5STEP(F3, c
1be10 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 35  , d, a, b, in[15
1be20 5d 2b 30 78 31 66 61 32 37 63 66 38 2c 20 31 36  ]+0x1fa27cf8, 16
1be30 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
1be40 45 50 28 46 33 2c 20 62 2c 20 63 2c 20 64 2c 20  EP(F3, b, c, d, 
1be50 61 2c 20 69 6e 5b 20 32 5d 2b 30 78 63 34 61 63  a, in[ 2]+0xc4ac
1be60 35 36 36 35 2c 20 32 33 29 3b 0a 0a 20 20 20 20  5665, 23);..    
1be70 20 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20      MD5STEP(F4, 
1be80 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20  a, b, c, d, in[ 
1be90 30 5d 2b 30 78 66 34 32 39 32 32 34 34 2c 20 20  0]+0xf4292244,  
1bea0 36 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  6);.        MD5S
1beb0 54 45 50 28 46 34 2c 20 64 2c 20 61 2c 20 62 2c  TEP(F4, d, a, b,
1bec0 20 63 2c 20 69 6e 5b 20 37 5d 2b 30 78 34 33 32   c, in[ 7]+0x432
1bed0 61 66 66 39 37 2c 20 31 30 29 3b 0a 20 20 20 20  aff97, 10);.    
1bee0 20 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20      MD5STEP(F4, 
1bef0 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31  c, d, a, b, in[1
1bf00 34 5d 2b 30 78 61 62 39 34 32 33 61 37 2c 20 31  4]+0xab9423a7, 1
1bf10 35 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  5);.        MD5S
1bf20 54 45 50 28 46 34 2c 20 62 2c 20 63 2c 20 64 2c  TEP(F4, b, c, d,
1bf30 20 61 2c 20 69 6e 5b 20 35 5d 2b 30 78 66 63 39   a, in[ 5]+0xfc9
1bf40 33 61 30 33 39 2c 20 32 31 29 3b 0a 20 20 20 20  3a039, 21);.    
1bf50 20 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20      MD5STEP(F4, 
1bf60 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 31  a, b, c, d, in[1
1bf70 32 5d 2b 30 78 36 35 35 62 35 39 63 33 2c 20 20  2]+0x655b59c3,  
1bf80 36 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  6);.        MD5S
1bf90 54 45 50 28 46 34 2c 20 64 2c 20 61 2c 20 62 2c  TEP(F4, d, a, b,
1bfa0 20 63 2c 20 69 6e 5b 20 33 5d 2b 30 78 38 66 30   c, in[ 3]+0x8f0
1bfb0 63 63 63 39 32 2c 20 31 30 29 3b 0a 20 20 20 20  ccc92, 10);.    
1bfc0 20 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20      MD5STEP(F4, 
1bfd0 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31  c, d, a, b, in[1
1bfe0 30 5d 2b 30 78 66 66 65 66 66 34 37 64 2c 20 31  0]+0xffeff47d, 1
1bff0 35 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  5);.        MD5S
1c000 54 45 50 28 46 34 2c 20 62 2c 20 63 2c 20 64 2c  TEP(F4, b, c, d,
1c010 20 61 2c 20 69 6e 5b 20 31 5d 2b 30 78 38 35 38   a, in[ 1]+0x858
1c020 34 35 64 64 31 2c 20 32 31 29 3b 0a 20 20 20 20  45dd1, 21);.    
1c030 20 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20      MD5STEP(F4, 
1c040 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20  a, b, c, d, in[ 
1c050 38 5d 2b 30 78 36 66 61 38 37 65 34 66 2c 20 20  8]+0x6fa87e4f,  
1c060 36 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  6);.        MD5S
1c070 54 45 50 28 46 34 2c 20 64 2c 20 61 2c 20 62 2c  TEP(F4, d, a, b,
1c080 20 63 2c 20 69 6e 5b 31 35 5d 2b 30 78 66 65 32   c, in[15]+0xfe2
1c090 63 65 36 65 30 2c 20 31 30 29 3b 0a 20 20 20 20  ce6e0, 10);.    
1c0a0 20 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20      MD5STEP(F4, 
1c0b0 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20  c, d, a, b, in[ 
1c0c0 36 5d 2b 30 78 61 33 30 31 34 33 31 34 2c 20 31  6]+0xa3014314, 1
1c0d0 35 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  5);.        MD5S
1c0e0 54 45 50 28 46 34 2c 20 62 2c 20 63 2c 20 64 2c  TEP(F4, b, c, d,
1c0f0 20 61 2c 20 69 6e 5b 31 33 5d 2b 30 78 34 65 30   a, in[13]+0x4e0
1c100 38 31 31 61 31 2c 20 32 31 29 3b 0a 20 20 20 20  811a1, 21);.    
1c110 20 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20      MD5STEP(F4, 
1c120 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20  a, b, c, d, in[ 
1c130 34 5d 2b 30 78 66 37 35 33 37 65 38 32 2c 20 20  4]+0xf7537e82,  
1c140 36 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  6);.        MD5S
1c150 54 45 50 28 46 34 2c 20 64 2c 20 61 2c 20 62 2c  TEP(F4, d, a, b,
1c160 20 63 2c 20 69 6e 5b 31 31 5d 2b 30 78 62 64 33   c, in[11]+0xbd3
1c170 61 66 32 33 35 2c 20 31 30 29 3b 0a 20 20 20 20  af235, 10);.    
1c180 20 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20      MD5STEP(F4, 
1c190 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20  c, d, a, b, in[ 
1c1a0 32 5d 2b 30 78 32 61 64 37 64 32 62 62 2c 20 31  2]+0x2ad7d2bb, 1
1c1b0 35 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  5);.        MD5S
1c1c0 54 45 50 28 46 34 2c 20 62 2c 20 63 2c 20 64 2c  TEP(F4, b, c, d,
1c1d0 20 61 2c 20 69 6e 5b 20 39 5d 2b 30 78 65 62 38   a, in[ 9]+0xeb8
1c1e0 36 64 33 39 31 2c 20 32 31 29 3b 0a 0a 20 20 20  6d391, 21);..   
1c1f0 20 20 20 20 20 62 75 66 5b 30 5d 20 2b 3d 20 61       buf[0] += a
1c200 3b 0a 20 20 20 20 20 20 20 20 62 75 66 5b 31 5d  ;.        buf[1]
1c210 20 2b 3d 20 62 3b 0a 20 20 20 20 20 20 20 20 62   += b;.        b
1c220 75 66 5b 32 5d 20 2b 3d 20 63 3b 0a 20 20 20 20  uf[2] += c;.    
1c230 20 20 20 20 62 75 66 5b 33 5d 20 2b 3d 20 64 3b      buf[3] += d;
1c240 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 74 61 72 74 20  .}../*. * Start 
1c250 4d 44 35 20 61 63 63 75 6d 75 6c 61 74 69 6f 6e  MD5 accumulation
1c260 2e 20 20 53 65 74 20 62 69 74 20 63 6f 75 6e 74  .  Set bit count
1c270 20 74 6f 20 30 20 61 6e 64 20 62 75 66 66 65 72   to 0 and buffer
1c280 20 74 6f 20 6d 79 73 74 65 72 69 6f 75 73 0a 20   to mysterious. 
1c290 2a 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  * initialization
1c2a0 20 63 6f 6e 73 74 61 6e 74 73 2e 0a 20 2a 2f 0a   constants.. */.
1c2b0 73 74 61 74 69 63 20 76 6f 69 64 20 4d 44 35 49  static void MD5I
1c2c0 6e 69 74 28 4d 44 35 43 6f 6e 74 65 78 74 20 2a  nit(MD5Context *
1c2d0 63 74 78 29 7b 0a 20 20 20 20 20 20 20 20 63 74  ctx){.        ct
1c2e0 78 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20  x->isInit = 1;. 
1c2f0 20 20 20 20 20 20 20 63 74 78 2d 3e 62 75 66 5b         ctx->buf[
1c300 30 5d 20 3d 20 30 78 36 37 34 35 32 33 30 31 3b  0] = 0x67452301;
1c310 0a 20 20 20 20 20 20 20 20 63 74 78 2d 3e 62 75  .        ctx->bu
1c320 66 5b 31 5d 20 3d 20 30 78 65 66 63 64 61 62 38  f[1] = 0xefcdab8
1c330 39 3b 0a 20 20 20 20 20 20 20 20 63 74 78 2d 3e  9;.        ctx->
1c340 62 75 66 5b 32 5d 20 3d 20 30 78 39 38 62 61 64  buf[2] = 0x98bad
1c350 63 66 65 3b 0a 20 20 20 20 20 20 20 20 63 74 78  cfe;.        ctx
1c360 2d 3e 62 75 66 5b 33 5d 20 3d 20 30 78 31 30 33  ->buf[3] = 0x103
1c370 32 35 34 37 36 3b 0a 20 20 20 20 20 20 20 20 63  25476;.        c
1c380 74 78 2d 3e 62 69 74 73 5b 30 5d 20 3d 20 30 3b  tx->bits[0] = 0;
1c390 0a 20 20 20 20 20 20 20 20 63 74 78 2d 3e 62 69  .        ctx->bi
1c3a0 74 73 5b 31 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  ts[1] = 0;.}../*
1c3b0 0a 20 2a 20 55 70 64 61 74 65 20 63 6f 6e 74 65  . * Update conte
1c3c0 78 74 20 74 6f 20 72 65 66 6c 65 63 74 20 74 68  xt to reflect th
1c3d0 65 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 20  e concatenation 
1c3e0 6f 66 20 61 6e 6f 74 68 65 72 20 62 75 66 66 65  of another buffe
1c3f0 72 20 66 75 6c 6c 0a 20 2a 20 6f 66 20 62 79 74  r full. * of byt
1c400 65 73 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 0a 76  es.. */.static.v
1c410 6f 69 64 20 4d 44 35 55 70 64 61 74 65 28 4d 44  oid MD5Update(MD
1c420 35 43 6f 6e 74 65 78 74 20 2a 63 74 78 2c 20 63  5Context *ctx, c
1c430 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1c440 61 72 20 2a 62 75 66 2c 20 75 6e 73 69 67 6e 65  ar *buf, unsigne
1c450 64 20 69 6e 74 20 6c 65 6e 29 7b 0a 20 20 20 20  d int len){.    
1c460 20 20 20 20 75 69 6e 74 33 32 20 74 3b 0a 0a 20      uint32 t;.. 
1c470 20 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65         /* Update
1c480 20 62 69 74 63 6f 75 6e 74 20 2a 2f 0a 0a 20 20   bitcount */..  
1c490 20 20 20 20 20 20 74 20 3d 20 63 74 78 2d 3e 62        t = ctx->b
1c4a0 69 74 73 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20  its[0];.        
1c4b0 69 66 20 28 28 63 74 78 2d 3e 62 69 74 73 5b 30  if ((ctx->bits[0
1c4c0 5d 20 3d 20 74 20 2b 20 28 28 75 69 6e 74 33 32  ] = t + ((uint32
1c4d0 29 6c 65 6e 20 3c 3c 20 33 29 29 20 3c 20 74 29  )len << 3)) < t)
1c4e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c4f0 20 63 74 78 2d 3e 62 69 74 73 5b 31 5d 2b 2b 3b   ctx->bits[1]++;
1c500 20 2f 2a 20 43 61 72 72 79 20 66 72 6f 6d 20 6c   /* Carry from l
1c510 6f 77 20 74 6f 20 68 69 67 68 20 2a 2f 0a 20 20  ow to high */.  
1c520 20 20 20 20 20 20 63 74 78 2d 3e 62 69 74 73 5b        ctx->bits[
1c530 31 5d 20 2b 3d 20 6c 65 6e 20 3e 3e 20 32 39 3b  1] += len >> 29;
1c540 0a 0a 20 20 20 20 20 20 20 20 74 20 3d 20 28 74  ..        t = (t
1c550 20 3e 3e 20 33 29 20 26 20 30 78 33 66 3b 20 20   >> 3) & 0x3f;  
1c560 20 20 2f 2a 20 42 79 74 65 73 20 61 6c 72 65 61    /* Bytes alrea
1c570 64 79 20 69 6e 20 73 68 73 49 6e 66 6f 2d 3e 64  dy in shsInfo->d
1c580 61 74 61 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ata */..        
1c590 2f 2a 20 48 61 6e 64 6c 65 20 61 6e 79 20 6c 65  /* Handle any le
1c5a0 61 64 69 6e 67 20 6f 64 64 2d 73 69 7a 65 64 20  ading odd-sized 
1c5b0 63 68 75 6e 6b 73 20 2a 2f 0a 0a 20 20 20 20 20  chunks */..     
1c5c0 20 20 20 69 66 20 28 20 74 20 29 20 7b 0a 20 20     if ( t ) {.  
1c5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75 6e                un
1c5e0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 20 3d  signed char *p =
1c5f0 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
1c600 2a 29 63 74 78 2d 3e 69 6e 20 2b 20 74 3b 0a 0a  *)ctx->in + t;..
1c610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c620 74 20 3d 20 36 34 2d 74 3b 0a 20 20 20 20 20 20  t = 64-t;.      
1c630 20 20 20 20 20 20 20 20 20 20 69 66 20 28 6c 65            if (le
1c640 6e 20 3c 20 74 29 20 7b 0a 20 20 20 20 20 20 20  n < t) {.       
1c650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c660 20 6d 65 6d 63 70 79 28 70 2c 20 62 75 66 2c 20   memcpy(p, buf, 
1c670 6c 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  len);.          
1c680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
1c690 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  turn;.          
1c6a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1c6b0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
1c6c0 2c 20 62 75 66 2c 20 74 29 3b 0a 20 20 20 20 20  , buf, t);.     
1c6d0 20 20 20 20 20 20 20 20 20 20 20 62 79 74 65 52             byteR
1c6e0 65 76 65 72 73 65 28 63 74 78 2d 3e 69 6e 2c 20  everse(ctx->in, 
1c6f0 31 36 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  16);.           
1c700 20 20 20 20 20 4d 44 35 54 72 61 6e 73 66 6f 72       MD5Transfor
1c710 6d 28 63 74 78 2d 3e 62 75 66 2c 20 28 75 69 6e  m(ctx->buf, (uin
1c720 74 33 32 20 2a 29 63 74 78 2d 3e 69 6e 29 3b 0a  t32 *)ctx->in);.
1c730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c740 62 75 66 20 2b 3d 20 74 3b 0a 20 20 20 20 20 20  buf += t;.      
1c750 20 20 20 20 20 20 20 20 20 20 6c 65 6e 20 2d 3d            len -=
1c760 20 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20   t;.        }.. 
1c770 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 63 65 73         /* Proces
1c780 73 20 64 61 74 61 20 69 6e 20 36 34 2d 62 79 74  s data in 64-byt
1c790 65 20 63 68 75 6e 6b 73 20 2a 2f 0a 0a 20 20 20  e chunks */..   
1c7a0 20 20 20 20 20 77 68 69 6c 65 20 28 6c 65 6e 20       while (len 
1c7b0 3e 3d 20 36 34 29 20 7b 0a 20 20 20 20 20 20 20  >= 64) {.       
1c7c0 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
1c7d0 63 74 78 2d 3e 69 6e 2c 20 62 75 66 2c 20 36 34  ctx->in, buf, 64
1c7e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1c7f0 20 20 20 62 79 74 65 52 65 76 65 72 73 65 28 63     byteReverse(c
1c800 74 78 2d 3e 69 6e 2c 20 31 36 29 3b 0a 20 20 20  tx->in, 16);.   
1c810 20 20 20 20 20 20 20 20 20 20 20 20 20 4d 44 35               MD5
1c820 54 72 61 6e 73 66 6f 72 6d 28 63 74 78 2d 3e 62  Transform(ctx->b
1c830 75 66 2c 20 28 75 69 6e 74 33 32 20 2a 29 63 74  uf, (uint32 *)ct
1c840 78 2d 3e 69 6e 29 3b 0a 20 20 20 20 20 20 20 20  x->in);.        
1c850 20 20 20 20 20 20 20 20 62 75 66 20 2b 3d 20 36          buf += 6
1c860 34 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  4;.             
1c870 20 20 20 6c 65 6e 20 2d 3d 20 36 34 3b 0a 20 20     len -= 64;.  
1c880 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
1c890 20 2f 2a 20 48 61 6e 64 6c 65 20 61 6e 79 20 72   /* Handle any r
1c8a0 65 6d 61 69 6e 69 6e 67 20 62 79 74 65 73 20 6f  emaining bytes o
1c8b0 66 20 64 61 74 61 2e 20 2a 2f 0a 0a 20 20 20 20  f data. */..    
1c8c0 20 20 20 20 6d 65 6d 63 70 79 28 63 74 78 2d 3e      memcpy(ctx->
1c8d0 69 6e 2c 20 62 75 66 2c 20 6c 65 6e 29 3b 0a 7d  in, buf, len);.}
1c8e0 0a 0a 2f 2a 0a 20 2a 20 46 69 6e 61 6c 20 77 72  ../*. * Final wr
1c8f0 61 70 75 70 20 2d 20 70 61 64 20 74 6f 20 36 34  apup - pad to 64
1c900 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79 20 77  -byte boundary w
1c910 69 74 68 20 74 68 65 20 62 69 74 20 70 61 74 74  ith the bit patt
1c920 65 72 6e 0a 20 2a 20 31 20 30 2a 20 28 36 34 2d  ern. * 1 0* (64-
1c930 62 69 74 20 63 6f 75 6e 74 20 6f 66 20 62 69 74  bit count of bit
1c940 73 20 70 72 6f 63 65 73 73 65 64 2c 20 4d 53 42  s processed, MSB
1c950 2d 66 69 72 73 74 29 0a 20 2a 2f 0a 73 74 61 74  -first). */.stat
1c960 69 63 20 76 6f 69 64 20 4d 44 35 46 69 6e 61 6c  ic void MD5Final
1c970 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64  (unsigned char d
1c980 69 67 65 73 74 5b 31 36 5d 2c 20 4d 44 35 43 6f  igest[16], MD5Co
1c990 6e 74 65 78 74 20 2a 63 74 78 29 7b 0a 20 20 20  ntext *ctx){.   
1c9a0 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 6f       unsigned co
1c9b0 75 6e 74 3b 0a 20 20 20 20 20 20 20 20 75 6e 73  unt;.        uns
1c9c0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 3b 0a 0a  igned char *p;..
1c9d0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 75          /* Compu
1c9e0 74 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  te number of byt
1c9f0 65 73 20 6d 6f 64 20 36 34 20 2a 2f 0a 20 20 20  es mod 64 */.   
1ca00 20 20 20 20 20 63 6f 75 6e 74 20 3d 20 28 63 74       count = (ct
1ca10 78 2d 3e 62 69 74 73 5b 30 5d 20 3e 3e 20 33 29  x->bits[0] >> 3)
1ca20 20 26 20 30 78 33 46 3b 0a 0a 20 20 20 20 20 20   & 0x3F;..      
1ca30 20 20 2f 2a 20 53 65 74 20 74 68 65 20 66 69 72    /* Set the fir
1ca40 73 74 20 63 68 61 72 20 6f 66 20 70 61 64 64 69  st char of paddi
1ca50 6e 67 20 74 6f 20 30 78 38 30 2e 20 20 54 68 69  ng to 0x80.  Thi
1ca60 73 20 69 73 20 73 61 66 65 20 73 69 6e 63 65 20  s is safe since 
1ca70 74 68 65 72 65 20 69 73 0a 20 20 20 20 20 20 20  there is.       
1ca80 20 20 20 20 61 6c 77 61 79 73 20 61 74 20 6c 65      always at le
1ca90 61 73 74 20 6f 6e 65 20 62 79 74 65 20 66 72 65  ast one byte fre
1caa0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 20 3d  e */.        p =
1cab0 20 63 74 78 2d 3e 69 6e 20 2b 20 63 6f 75 6e 74   ctx->in + count
1cac0 3b 0a 20 20 20 20 20 20 20 20 2a 70 2b 2b 20 3d  ;.        *p++ =
1cad0 20 30 78 38 30 3b 0a 0a 20 20 20 20 20 20 20 20   0x80;..        
1cae0 2f 2a 20 42 79 74 65 73 20 6f 66 20 70 61 64 64  /* Bytes of padd
1caf0 69 6e 67 20 6e 65 65 64 65 64 20 74 6f 20 6d 61  ing needed to ma
1cb00 6b 65 20 36 34 20 62 79 74 65 73 20 2a 2f 0a 20  ke 64 bytes */. 
1cb10 20 20 20 20 20 20 20 63 6f 75 6e 74 20 3d 20 36         count = 6
1cb20 34 20 2d 20 31 20 2d 20 63 6f 75 6e 74 3b 0a 0a  4 - 1 - count;..
1cb30 20 20 20 20 20 20 20 20 2f 2a 20 50 61 64 20 6f          /* Pad o
1cb40 75 74 20 74 6f 20 35 36 20 6d 6f 64 20 36 34 20  ut to 56 mod 64 
1cb50 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 20 28 63  */.        if (c
1cb60 6f 75 6e 74 20 3c 20 38 29 20 7b 0a 20 20 20 20  ount < 8) {.    
1cb70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1cb80 77 6f 20 6c 6f 74 73 20 6f 66 20 70 61 64 64 69  wo lots of paddi
1cb90 6e 67 3a 20 20 50 61 64 20 74 68 65 20 66 69 72  ng:  Pad the fir
1cba0 73 74 20 62 6c 6f 63 6b 20 74 6f 20 36 34 20 62  st block to 64 b
1cbb0 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ytes */.        
1cbc0 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70          memset(p
1cbd0 2c 20 30 2c 20 63 6f 75 6e 74 29 3b 0a 20 20 20  , 0, count);.   
1cbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 62 79 74               byt
1cbf0 65 52 65 76 65 72 73 65 28 63 74 78 2d 3e 69 6e  eReverse(ctx->in
1cc00 2c 20 31 36 29 3b 0a 20 20 20 20 20 20 20 20 20  , 16);.         
1cc10 20 20 20 20 20 20 20 4d 44 35 54 72 61 6e 73 66         MD5Transf
1cc20 6f 72 6d 28 63 74 78 2d 3e 62 75 66 2c 20 28 75  orm(ctx->buf, (u
1cc30 69 6e 74 33 32 20 2a 29 63 74 78 2d 3e 69 6e 29  int32 *)ctx->in)
1cc40 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
1cc50 20 20 20 2f 2a 20 4e 6f 77 20 66 69 6c 6c 20 74     /* Now fill t
1cc60 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 77 69  he next block wi
1cc70 74 68 20 35 36 20 62 79 74 65 73 20 2a 2f 0a 20  th 56 bytes */. 
1cc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
1cc90 65 6d 73 65 74 28 63 74 78 2d 3e 69 6e 2c 20 30  emset(ctx->in, 0
1cca0 2c 20 35 36 29 3b 0a 20 20 20 20 20 20 20 20 7d  , 56);.        }
1ccb0 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
1ccc0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 64 20 62          /* Pad b
1ccd0 6c 6f 63 6b 20 74 6f 20 35 36 20 62 79 74 65 73  lock to 56 bytes
1cce0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
1ccf0 20 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c      memset(p, 0,
1cd00 20 63 6f 75 6e 74 2d 38 29 3b 0a 20 20 20 20 20   count-8);.     
1cd10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 79 74     }.        byt
1cd20 65 52 65 76 65 72 73 65 28 63 74 78 2d 3e 69 6e  eReverse(ctx->in
1cd30 2c 20 31 34 29 3b 0a 0a 20 20 20 20 20 20 20 20  , 14);..        
1cd40 2f 2a 20 41 70 70 65 6e 64 20 6c 65 6e 67 74 68  /* Append length
1cd50 20 69 6e 20 62 69 74 73 20 61 6e 64 20 74 72 61   in bits and tra
1cd60 6e 73 66 6f 72 6d 20 2a 2f 0a 20 20 20 20 20 20  nsform */.      
1cd70 20 20 6d 65 6d 63 70 79 28 63 74 78 2d 3e 69 6e    memcpy(ctx->in
1cd80 20 2b 20 31 34 2a 34 2c 20 63 74 78 2d 3e 62 69   + 14*4, ctx->bi
1cd90 74 73 2c 20 38 29 3b 0a 0a 20 20 20 20 20 20 20  ts, 8);..       
1cda0 20 4d 44 35 54 72 61 6e 73 66 6f 72 6d 28 63 74   MD5Transform(ct
1cdb0 78 2d 3e 62 75 66 2c 20 28 75 69 6e 74 33 32 20  x->buf, (uint32 
1cdc0 2a 29 63 74 78 2d 3e 69 6e 29 3b 0a 20 20 20 20  *)ctx->in);.    
1cdd0 20 20 20 20 62 79 74 65 52 65 76 65 72 73 65 28      byteReverse(
1cde0 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
1cdf0 29 63 74 78 2d 3e 62 75 66 2c 20 34 29 3b 0a 20  )ctx->buf, 4);. 
1ce00 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 64 69         memcpy(di
1ce10 67 65 73 74 2c 20 63 74 78 2d 3e 62 75 66 2c 20  gest, ctx->buf, 
1ce20 31 36 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  16);.}../*.** Co
1ce30 6e 76 65 72 74 20 61 20 31 32 38 2d 62 69 74 20  nvert a 128-bit 
1ce40 4d 44 35 20 64 69 67 65 73 74 20 69 6e 74 6f 20  MD5 digest into 
1ce50 61 20 33 32 2d 64 69 67 69 74 20 62 61 73 65 2d  a 32-digit base-
1ce60 31 36 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74  16 number..*/.st
1ce70 61 74 69 63 20 76 6f 69 64 20 4d 44 35 44 69 67  atic void MD5Dig
1ce80 65 73 74 54 6f 42 61 73 65 31 36 28 75 6e 73 69  estToBase16(unsi
1ce90 67 6e 65 64 20 63 68 61 72 20 2a 64 69 67 65 73  gned char *diges
1cea0 74 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  t, char *zBuf){.
1ceb0 20 20 73 74 61 74 69 63 20 63 68 61 72 20 63 6f    static char co
1cec0 6e 73 74 20 7a 45 6e 63 6f 64 65 5b 5d 20 3d 20  nst zEncode[] = 
1ced0 22 30 31 32 33 34 35 36 37 38 39 61 62 63 64 65  "0123456789abcde
1cee0 66 22 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  f";.  int i, j;.
1cef0 0a 20 20 66 6f 72 28 6a 3d 69 3d 30 3b 20 69 3c  .  for(j=i=0; i<
1cf00 31 36 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  16; i++){.    in
1cf10 74 20 61 20 3d 20 64 69 67 65 73 74 5b 69 5d 3b  t a = digest[i];
1cf20 0a 20 20 20 20 7a 42 75 66 5b 6a 2b 2b 5d 20 3d  .    zBuf[j++] =
1cf30 20 7a 45 6e 63 6f 64 65 5b 28 61 3e 3e 34 29 26   zEncode[(a>>4)&
1cf40 30 78 66 5d 3b 0a 20 20 20 20 7a 42 75 66 5b 6a  0xf];.    zBuf[j
1cf50 2b 2b 5d 20 3d 20 7a 45 6e 63 6f 64 65 5b 61 20  ++] = zEncode[a 
1cf60 26 20 30 78 66 5d 3b 0a 20 20 7d 0a 20 20 7a 42  & 0xf];.  }.  zB
1cf70 75 66 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f  uf[j] = 0;.}.../
1cf80 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 31  *.** Convert a 1
1cf90 32 38 2d 62 69 74 20 4d 44 35 20 64 69 67 65 73  28-bit MD5 diges
1cfa0 74 20 69 6e 74 6f 20 73 65 71 75 65 6e 63 79 20  t into sequency 
1cfb0 6f 66 20 65 69 67 68 74 20 35 2d 64 69 67 69 74  of eight 5-digit
1cfc0 20 69 6e 74 65 67 65 72 73 0a 2a 2a 20 65 61 63   integers.** eac
1cfd0 68 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 31  h representing 1
1cfe0 36 20 62 69 74 73 20 6f 66 20 74 68 65 20 64 69  6 bits of the di
1cff0 67 65 73 74 20 61 6e 64 20 73 65 70 61 72 61 74  gest and separat
1d000 65 64 20 66 72 6f 6d 20 65 61 63 68 0a 2a 2a 20  ed from each.** 
1d010 6f 74 68 65 72 20 62 79 20 61 20 22 2d 22 20 63  other by a "-" c
1d020 68 61 72 61 63 74 65 72 2e 0a 2a 2f 0a 73 74 61  haracter..*/.sta
1d030 74 69 63 20 76 6f 69 64 20 4d 44 35 44 69 67 65  tic void MD5Dige
1d040 73 74 54 6f 42 61 73 65 31 30 78 38 28 75 6e 73  stToBase10x8(uns
1d050 69 67 6e 65 64 20 63 68 61 72 20 64 69 67 65 73  igned char diges
1d060 74 5b 31 36 5d 2c 20 63 68 61 72 20 7a 44 69 67  t[16], char zDig
1d070 65 73 74 5b 35 30 5d 29 7b 0a 20 20 69 6e 74 20  est[50]){.  int 
1d080 69 2c 20 6a 3b 0a 20 20 75 6e 73 69 67 6e 65 64  i, j;.  unsigned
1d090 20 69 6e 74 20 78 3b 0a 20 20 66 6f 72 28 69 3d   int x;.  for(i=
1d0a0 6a 3d 30 3b 20 69 3c 31 36 3b 20 69 2b 3d 32 29  j=0; i<16; i+=2)
1d0b0 7b 0a 20 20 20 20 78 20 3d 20 64 69 67 65 73 74  {.    x = digest
1d0c0 5b 69 5d 2a 32 35 36 20 2b 20 64 69 67 65 73 74  [i]*256 + digest
1d0d0 5b 69 2b 31 5d 3b 0a 20 20 20 20 69 66 28 20 69  [i+1];.    if( i
1d0e0 3e 30 20 29 20 7a 44 69 67 65 73 74 5b 6a 2b 2b  >0 ) zDigest[j++
1d0f0 5d 20 3d 20 27 2d 27 3b 0a 20 20 20 20 73 71 6c  ] = '-';.    sql
1d100 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 35 30  ite3_snprintf(50
1d110 2d 6a 2c 20 26 7a 44 69 67 65 73 74 5b 6a 5d 2c  -j, &zDigest[j],
1d120 20 22 25 30 35 75 22 2c 20 78 29 3b 0a 20 20 20   "%05u", x);.   
1d130 20 6a 20 2b 3d 20 35 3b 0a 20 20 7d 0a 20 20 7a   j += 5;.  }.  z
1d140 44 69 67 65 73 74 5b 6a 5d 20 3d 20 30 3b 0a 7d  Digest[j] = 0;.}
1d150 0a 0a 2f 2a 0a 2a 2a 20 41 20 54 43 4c 20 63 6f  ../*.** A TCL co
1d160 6d 6d 61 6e 64 20 66 6f 72 20 6d 64 35 2e 20 20  mmand for md5.  
1d170 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  The argument is 
1d180 74 68 65 20 74 65 78 74 20 74 6f 20 62 65 20 68  the text to be h
1d190 61 73 68 65 64 2e 20 20 54 68 65 0a 2a 2a 20 52  ashed.  The.** R
1d1a0 65 73 75 6c 74 20 69 73 20 74 68 65 20 68 61 73  esult is the has
1d1b0 68 20 69 6e 20 62 61 73 65 36 34 2e 0a 2a 2f 0a  h in base64..*/.
1d1c0 73 74 61 74 69 63 20 69 6e 74 20 6d 64 35 5f 63  static int md5_c
1d1d0 6d 64 28 76 6f 69 64 2a 63 64 2c 20 54 63 6c 5f  md(void*cd, Tcl_
1d1e0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
1d1f0 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73 74 20  int argc, const 
1d200 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20  char **argv){.  
1d210 4d 44 35 43 6f 6e 74 65 78 74 20 63 74 78 3b 0a  MD5Context ctx;.
1d220 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1d230 64 69 67 65 73 74 5b 31 36 5d 3b 0a 20 20 63 68  digest[16];.  ch
1d240 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 76  ar zBuf[50];.  v
1d250 6f 69 64 20 28 2a 63 6f 6e 76 65 72 74 65 72 29  oid (*converter)
1d260 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 2c  (unsigned char*,
1d270 20 63 68 61 72 2a 29 3b 0a 0a 20 20 69 66 28 20   char*);..  if( 
1d280 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  argc!=2 ){.    T
1d290 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1d2a0 69 6e 74 65 72 70 2c 22 77 72 6f 6e 67 20 23 20  interp,"wrong # 
1d2b0 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1d2c0 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
1d2d0 20 20 20 20 20 20 22 20 54 45 58 54 5c 22 22 2c        " TEXT\"",
1d2e0 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
1d2f0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1d300 3b 0a 20 20 7d 0a 20 20 4d 44 35 49 6e 69 74 28  ;.  }.  MD5Init(
1d310 26 63 74 78 29 3b 0a 20 20 4d 44 35 55 70 64 61  &ctx);.  MD5Upda
1d320 74 65 28 26 63 74 78 2c 20 28 75 6e 73 69 67 6e  te(&ctx, (unsign
1d330 65 64 20 63 68 61 72 2a 29 61 72 67 76 5b 31 5d  ed char*)argv[1]
1d340 2c 20 28 75 6e 73 69 67 6e 65 64 29 73 74 72 6c  , (unsigned)strl
1d350 65 6e 28 61 72 67 76 5b 31 5d 29 29 3b 0a 20 20  en(argv[1]));.  
1d360 4d 44 35 46 69 6e 61 6c 28 64 69 67 65 73 74 2c  MD5Final(digest,
1d370 20 26 63 74 78 29 3b 0a 20 20 63 6f 6e 76 65 72   &ctx);.  conver
1d380 74 65 72 20 3d 20 28 76 6f 69 64 28 2a 29 28 75  ter = (void(*)(u
1d390 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 2c 63 68  nsigned char*,ch
1d3a0 61 72 2a 29 29 63 64 3b 0a 20 20 63 6f 6e 76 65  ar*))cd;.  conve
1d3b0 72 74 65 72 28 64 69 67 65 73 74 2c 20 7a 42 75  rter(digest, zBu
1d3c0 66 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  f);.  Tcl_Append
1d3d0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
1d3e0 42 75 66 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  Buf, (char*)0);.
1d3f0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1d400 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 54 43 4c 20  .}../*.** A TCL 
1d410 63 6f 6d 6d 61 6e 64 20 74 6f 20 74 61 6b 65 20  command to take 
1d420 74 68 65 20 6d 64 35 20 68 61 73 68 20 6f 66 20  the md5 hash of 
1d430 61 20 66 69 6c 65 2e 20 20 54 68 65 20 61 72 67  a file.  The arg
1d440 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20  ument is the.** 
1d450 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  name of the file
1d460 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d470 6d 64 35 66 69 6c 65 5f 63 6d 64 28 76 6f 69 64  md5file_cmd(void
1d480 2a 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70 2a  *cd, Tcl_Interp*
1d490 69 6e 74 65 72 70 2c 20 69 6e 74 20 61 72 67 63  interp, int argc
1d4a0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61  , const char **a
1d4b0 72 67 76 29 7b 0a 20 20 46 49 4c 45 20 2a 69 6e  rgv){.  FILE *in
1d4c0 3b 0a 20 20 4d 44 35 43 6f 6e 74 65 78 74 20 63  ;.  MD5Context c
1d4d0 74 78 3b 0a 20 20 76 6f 69 64 20 28 2a 63 6f 6e  tx;.  void (*con
1d4e0 76 65 72 74 65 72 29 28 75 6e 73 69 67 6e 65 64  verter)(unsigned
1d4f0 20 63 68 61 72 2a 2c 20 63 68 61 72 2a 29 3b 0a   char*, char*);.
1d500 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1d510 64 69 67 65 73 74 5b 31 36 5d 3b 0a 20 20 63 68  digest[16];.  ch
1d520 61 72 20 7a 42 75 66 5b 31 30 32 34 30 5d 3b 0a  ar zBuf[10240];.
1d530 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29  .  if( argc!=2 )
1d540 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1d550 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 77  Result(interp,"w
1d560 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
1d570 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
1d580 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20 22 20 46  [0],.        " F
1d590 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 28 63 68 61  ILENAME\"", (cha
1d5a0 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72  r*)0);.    retur
1d5b0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1d5c0 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 61 72  .  in = fopen(ar
1d5d0 67 76 5b 31 5d 2c 22 72 62 22 29 3b 0a 20 20 69  gv[1],"rb");.  i
1d5e0 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  f( in==0 ){.    
1d5f0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1d600 28 69 6e 74 65 72 70 2c 22 75 6e 61 62 6c 65 20  (interp,"unable 
1d610 74 6f 20 6f 70 65 6e 20 66 69 6c 65 20 5c 22 22  to open file \""
1d620 2c 20 61 72 67 76 5b 31 5d 2c 0a 20 20 20 20 20  , argv[1],.     
1d630 20 20 20 20 22 5c 22 20 66 6f 72 20 72 65 61 64      "\" for read
1d640 69 6e 67 22 2c 20 28 63 68 61 72 2a 29 30 29 3b  ing", (char*)0);
1d650 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1d660 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 4d 44 35  ERROR;.  }.  MD5
1d670 49 6e 69 74 28 26 63 74 78 29 3b 0a 20 20 66 6f  Init(&ctx);.  fo
1d680 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6e  r(;;){.    int n
1d690 3b 0a 20 20 20 20 6e 20 3d 20 28 69 6e 74 29 66  ;.    n = (int)f
1d6a0 72 65 61 64 28 7a 42 75 66 2c 20 31 2c 20 73 69  read(zBuf, 1, si
1d6b0 7a 65 6f 66 28 7a 42 75 66 29 2c 20 69 6e 29 3b  zeof(zBuf), in);
1d6c0 0a 20 20 20 20 69 66 28 20 6e 3c 3d 30 20 29 20  .    if( n<=0 ) 
1d6d0 62 72 65 61 6b 3b 0a 20 20 20 20 4d 44 35 55 70  break;.    MD5Up
1d6e0 64 61 74 65 28 26 63 74 78 2c 20 28 75 6e 73 69  date(&ctx, (unsi
1d6f0 67 6e 65 64 20 63 68 61 72 2a 29 7a 42 75 66 2c  gned char*)zBuf,
1d700 20 28 75 6e 73 69 67 6e 65 64 29 6e 29 3b 0a 20   (unsigned)n);. 
1d710 20 7d 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b   }.  fclose(in);
1d720 0a 20 20 4d 44 35 46 69 6e 61 6c 28 64 69 67 65  .  MD5Final(dige
1d730 73 74 2c 20 26 63 74 78 29 3b 0a 20 20 63 6f 6e  st, &ctx);.  con
1d740 76 65 72 74 65 72 20 3d 20 28 76 6f 69 64 28 2a  verter = (void(*
1d750 29 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a  )(unsigned char*
1d760 2c 63 68 61 72 2a 29 29 63 64 3b 0a 20 20 63 6f  ,char*))cd;.  co
1d770 6e 76 65 72 74 65 72 28 64 69 67 65 73 74 2c 20  nverter(digest, 
1d780 7a 42 75 66 29 3b 0a 20 20 54 63 6c 5f 41 70 70  zBuf);.  Tcl_App
1d790 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1d7a0 2c 20 7a 42 75 66 2c 20 28 63 68 61 72 2a 29 30  , zBuf, (char*)0
1d7b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
1d7c0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  OK;.}../*.** Reg
1d7d0 69 73 74 65 72 20 74 68 65 20 66 6f 75 72 20 6e  ister the four n
1d7e0 65 77 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 73 20  ew TCL commands 
1d7f0 66 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 4d  for generating M
1d800 44 35 20 63 68 65 63 6b 73 75 6d 73 0a 2a 2a 20  D5 checksums.** 
1d810 77 69 74 68 20 74 68 65 20 54 43 4c 20 69 6e 74  with the TCL int
1d820 65 72 70 72 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74  erpreter..*/.int
1d830 20 4d 64 35 5f 49 6e 69 74 28 54 63 6c 5f 49 6e   Md5_Init(Tcl_In
1d840 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20  terp *interp){. 
1d850 20 54 63 6c 5f 43 72 65 61 74 65 43 6f 6d 6d 61   Tcl_CreateComma
1d860 6e 64 28 69 6e 74 65 72 70 2c 20 22 6d 64 35 22  nd(interp, "md5"
1d870 2c 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29  , (Tcl_CmdProc*)
1d880 6d 64 35 5f 63 6d 64 2c 0a 20 20 20 20 20 20 20  md5_cmd,.       
1d890 20 20 20 20 20 20 20 20 20 20 20 20 20 4d 44 35               MD5
1d8a0 44 69 67 65 73 74 54 6f 42 61 73 65 31 36 2c 20  DigestToBase16, 
1d8b0 30 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65  0);.  Tcl_Create
1d8c0 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
1d8d0 22 6d 64 35 2d 31 30 78 38 22 2c 20 28 54 63 6c  "md5-10x8", (Tcl
1d8e0 5f 43 6d 64 50 72 6f 63 2a 29 6d 64 35 5f 63 6d  _CmdProc*)md5_cm
1d8f0 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
1d900 20 20 20 20 20 20 20 4d 44 35 44 69 67 65 73 74         MD5Digest
1d910 54 6f 42 61 73 65 31 30 78 38 2c 20 30 29 3b 0a  ToBase10x8, 0);.
1d920 20 20 54 63 6c 5f 43 72 65 61 74 65 43 6f 6d 6d    Tcl_CreateComm
1d930 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 6d 64 35  and(interp, "md5
1d940 66 69 6c 65 22 2c 20 28 54 63 6c 5f 43 6d 64 50  file", (Tcl_CmdP
1d950 72 6f 63 2a 29 6d 64 35 66 69 6c 65 5f 63 6d 64  roc*)md5file_cmd
1d960 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1d970 20 20 20 20 20 20 4d 44 35 44 69 67 65 73 74 54        MD5DigestT
1d980 6f 42 61 73 65 31 36 2c 20 30 29 3b 0a 20 20 54  oBase16, 0);.  T
1d990 63 6c 5f 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64  cl_CreateCommand
1d9a0 28 69 6e 74 65 72 70 2c 20 22 6d 64 35 66 69 6c  (interp, "md5fil
1d9b0 65 2d 31 30 78 38 22 2c 20 28 54 63 6c 5f 43 6d  e-10x8", (Tcl_Cm
1d9c0 64 50 72 6f 63 2a 29 6d 64 35 66 69 6c 65 5f 63  dProc*)md5file_c
1d9d0 6d 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  md,.            
1d9e0 20 20 20 20 20 20 20 20 4d 44 35 44 69 67 65 73          MD5Diges
1d9f0 74 54 6f 42 61 73 65 31 30 78 38 2c 20 30 29 3b  tToBase10x8, 0);
1da00 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1da10 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  ;.}.#endif /* de
1da20 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
1da30 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  T) || defined(SQ
1da40 4c 49 54 45 5f 54 43 4c 4d 44 35 29 20 2a 2f 0a  LITE_TCLMD5) */.
1da50 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
1da60 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20  ITE_TEST)./*.** 
1da70 44 75 72 69 6e 67 20 74 65 73 74 69 6e 67 2c 20  During testing, 
1da80 74 68 65 20 73 70 65 63 69 61 6c 20 6d 64 35 73  the special md5s
1da90 75 6d 28 29 20 61 67 67 72 65 67 61 74 65 20 66  um() aggregate f
1daa0 75 6e 63 74 69 6f 6e 20 69 73 20 61 76 61 69 6c  unction is avail
1dab0 61 62 6c 65 2e 0a 2a 2a 20 69 6e 73 69 64 65 20  able..** inside 
1dac0 53 51 4c 69 74 65 2e 20 20 54 68 65 20 66 6f 6c  SQLite.  The fol
1dad0 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20  lowing routines 
1dae0 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74 20 66  implement that f
1daf0 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
1db00 69 63 20 76 6f 69 64 20 6d 64 35 73 74 65 70 28  ic void md5step(
1db10 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
1db20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72  *context, int ar
1db30 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
1db40 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 4d 44 35  e **argv){.  MD5
1db50 43 6f 6e 74 65 78 74 20 2a 70 3b 0a 20 20 69 6e  Context *p;.  in
1db60 74 20 69 3b 0a 20 20 69 66 28 20 61 72 67 63 3c  t i;.  if( argc<
1db70 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 20  1 ) return;.  p 
1db80 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  = sqlite3_aggreg
1db90 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74  ate_context(cont
1dba0 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  ext, sizeof(*p))
1dbb0 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
1dbc0 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 70 2d  eturn;.  if( !p-
1dbd0 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 4d  >isInit ){.    M
1dbe0 44 35 49 6e 69 74 28 70 29 3b 0a 20 20 7d 0a 20  D5Init(p);.  }. 
1dbf0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63   for(i=0; i<argc
1dc00 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73  ; i++){.    cons
1dc10 74 20 63 68 61 72 20 2a 7a 44 61 74 61 20 3d 20  t char *zData = 
1dc20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76  (char*)sqlite3_v
1dc30 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 69  alue_text(argv[i
1dc40 5d 29 3b 0a 20 20 20 20 69 66 28 20 7a 44 61 74  ]);.    if( zDat
1dc50 61 20 29 7b 0a 20 20 20 20 20 20 4d 44 35 55 70  a ){.      MD5Up
1dc60 64 61 74 65 28 70 2c 20 28 75 6e 73 69 67 6e 65  date(p, (unsigne
1dc70 64 20 63 68 61 72 2a 29 7a 44 61 74 61 2c 20 28  d char*)zData, (
1dc80 69 6e 74 29 73 74 72 6c 65 6e 28 7a 44 61 74 61  int)strlen(zData
1dc90 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ));.    }.  }.}.
1dca0 73 74 61 74 69 63 20 76 6f 69 64 20 6d 64 35 66  static void md5f
1dcb0 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f  inalize(sqlite3_
1dcc0 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
1dcd0 29 7b 0a 20 20 4d 44 35 43 6f 6e 74 65 78 74 20  ){.  MD5Context 
1dce0 2a 70 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  *p;.  unsigned c
1dcf0 68 61 72 20 64 69 67 65 73 74 5b 31 36 5d 3b 0a  har digest[16];.
1dd00 20 20 63 68 61 72 20 7a 42 75 66 5b 33 33 5d 3b    char zBuf[33];
1dd10 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61  .  p = sqlite3_a
1dd20 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
1dd30 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66  (context, sizeof
1dd40 28 2a 70 29 29 3b 0a 20 20 4d 44 35 46 69 6e 61  (*p));.  MD5Fina
1dd50 6c 28 64 69 67 65 73 74 2c 70 29 3b 0a 20 20 4d  l(digest,p);.  M
1dd60 44 35 44 69 67 65 73 74 54 6f 42 61 73 65 31 36  D5DigestToBase16
1dd70 28 64 69 67 65 73 74 2c 20 7a 42 75 66 29 3b 0a  (digest, zBuf);.
1dd80 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
1dd90 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a  _text(context, z
1dda0 42 75 66 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  Buf, -1, SQLITE_
1ddb0 54 52 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a 69 6e  TRANSIENT);.}.in
1ddc0 74 20 4d 64 35 5f 52 65 67 69 73 74 65 72 28 73  t Md5_Register(s
1ddd0 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
1dde0 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  nt rc = sqlite3_
1ddf0 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
1de00 64 62 2c 20 22 6d 64 35 73 75 6d 22 2c 20 2d 31  db, "md5sum", -1
1de10 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
1de20 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
1de30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de40 20 20 20 20 20 20 6d 64 35 73 74 65 70 2c 20 6d        md5step, m
1de50 64 35 66 69 6e 61 6c 69 7a 65 29 3b 0a 20 20 73  d5finalize);.  s
1de60 71 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f  qlite3_overload_
1de70 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 6d 64  function(db, "md
1de80 35 73 75 6d 22 2c 20 2d 31 29 3b 20 20 2f 2a 20  5sum", -1);  /* 
1de90 54 6f 20 65 78 65 72 63 69 73 65 20 74 68 69 73  To exercise this
1dea0 20 41 50 49 20 2a 2f 0a 20 20 72 65 74 75 72 6e   API */.  return
1deb0 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
1dec0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1ded0 54 45 53 54 29 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a  TEST) */.../*.**
1dee0 20 49 66 20 74 68 65 20 6d 61 63 72 6f 20 54 43   If the macro TC
1def0 4c 53 48 20 69 73 20 6f 6e 65 2c 20 74 68 65 6e  LSH is one, then
1df00 20 70 75 74 20 69 6e 20 63 6f 64 65 20 74 68 69   put in code thi
1df10 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 22 6d 61  s for the.** "ma
1df20 69 6e 22 20 72 6f 75 74 69 6e 65 20 74 68 61 74  in" routine that
1df30 20 77 69 6c 6c 20 69 6e 69 74 69 61 6c 69 7a 65   will initialize
1df40 20 54 63 6c 20 61 6e 64 20 74 61 6b 65 20 69 6e   Tcl and take in
1df50 70 75 74 20 66 72 6f 6d 0a 2a 2a 20 73 74 61 6e  put from.** stan
1df60 64 61 72 64 20 69 6e 70 75 74 2c 20 6f 72 20 69  dard input, or i
1df70 66 20 61 20 66 69 6c 65 20 69 73 20 6e 61 6d 65  f a file is name
1df80 64 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64  d on the command
1df90 20 6c 69 6e 65 0a 2a 2a 20 74 68 65 20 54 43 4c   line.** the TCL
1dfa0 20 69 6e 74 65 72 70 72 65 74 65 72 20 72 65 61   interpreter rea
1dfb0 64 73 20 61 6e 64 20 65 76 61 6c 75 61 74 65 73  ds and evaluates
1dfc0 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2f 0a 23   that file..*/.#
1dfd0 69 66 20 54 43 4c 53 48 3d 3d 31 0a 73 74 61 74  if TCLSH==1.stat
1dfe0 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 74  ic const char *t
1dff0 63 6c 73 68 5f 6d 61 69 6e 5f 6c 6f 6f 70 28 76  clsh_main_loop(v
1e000 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 63  oid){.  static c
1e010 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 69 6e 6c  onst char zMainl
1e020 6f 6f 70 5b 5d 20 3d 0a 20 20 20 20 22 73 65 74  oop[] =.    "set
1e030 20 6c 69 6e 65 20 7b 7d 5c 6e 22 0a 20 20 20 20   line {}\n".    
1e040 22 77 68 69 6c 65 20 7b 21 5b 65 6f 66 20 73 74  "while {![eof st
1e050 64 69 6e 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 20  din]} {\n".     
1e060 20 22 69 66 20 7b 24 6c 69 6e 65 21 3d 5c 22 5c   "if {$line!=\"\
1e070 22 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20  "} {\n".        
1e080 22 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65  "puts -nonewline
1e090 20 5c 22 3e 20 5c 22 5c 6e 22 0a 20 20 20 20 20   \"> \"\n".     
1e0a0 20 22 7d 20 65 6c 73 65 20 7b 5c 6e 22 0a 20 20   "} else {\n".  
1e0b0 20 20 20 20 20 20 22 70 75 74 73 20 2d 6e 6f 6e        "puts -non
1e0c0 65 77 6c 69 6e 65 20 5c 22 25 20 5c 22 5c 6e 22  ewline \"% \"\n"
1e0d0 0a 20 20 20 20 20 20 22 7d 5c 6e 22 0a 20 20 20  .      "}\n".   
1e0e0 20 20 20 22 66 6c 75 73 68 20 73 74 64 6f 75 74     "flush stdout
1e0f0 5c 6e 22 0a 20 20 20 20 20 20 22 61 70 70 65 6e  \n".      "appen
1e100 64 20 6c 69 6e 65 20 5b 67 65 74 73 20 73 74 64  d line [gets std
1e110 69 6e 5d 5c 6e 22 0a 20 20 20 20 20 20 22 69 66  in]\n".      "if
1e120 20 7b 5b 69 6e 66 6f 20 63 6f 6d 70 6c 65 74 65   {[info complete
1e130 20 24 6c 69 6e 65 5d 7d 20 7b 5c 6e 22 0a 20 20   $line]} {\n".  
1e140 20 20 20 20 20 20 22 69 66 20 7b 5b 63 61 74 63        "if {[catc
1e150 68 20 7b 75 70 6c 65 76 65 6c 20 23 30 20 24 6c  h {uplevel #0 $l
1e160 69 6e 65 7d 20 72 65 73 75 6c 74 5d 7d 20 7b 5c  ine} result]} {\
1e170 6e 22 0a 20 20 20 20 20 20 20 20 20 20 22 70 75  n".          "pu
1e180 74 73 20 73 74 64 65 72 72 20 5c 22 45 72 72 6f  ts stderr \"Erro
1e190 72 3a 20 24 72 65 73 75 6c 74 5c 22 5c 6e 22 0a  r: $result\"\n".
1e1a0 20 20 20 20 20 20 20 20 22 7d 20 65 6c 73 65 69          "} elsei
1e1b0 66 20 7b 24 72 65 73 75 6c 74 21 3d 5c 22 5c 22  f {$result!=\"\"
1e1c0 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20 20  } {\n".         
1e1d0 20 22 70 75 74 73 20 24 72 65 73 75 6c 74 5c 6e   "puts $result\n
1e1e0 22 0a 20 20 20 20 20 20 20 20 22 7d 5c 6e 22 0a  ".        "}\n".
1e1f0 20 20 20 20 20 20 20 20 22 73 65 74 20 6c 69 6e          "set lin
1e200 65 20 7b 7d 5c 6e 22 0a 20 20 20 20 20 20 22 7d  e {}\n".      "}
1e210 20 65 6c 73 65 20 7b 5c 6e 22 0a 20 20 20 20 20   else {\n".     
1e220 20 20 20 22 61 70 70 65 6e 64 20 6c 69 6e 65 20     "append line 
1e230 5c 5c 6e 5c 6e 22 0a 20 20 20 20 20 20 22 7d 5c  \\n\n".      "}\
1e240 6e 22 0a 20 20 20 20 22 7d 5c 6e 22 0a 20 20 3b  n".    "}\n".  ;
1e250 0a 20 20 72 65 74 75 72 6e 20 7a 4d 61 69 6e 6c  .  return zMainl
1e260 6f 6f 70 3b 0a 7d 0a 23 65 6e 64 69 66 0a 23 69  oop;.}.#endif.#i
1e270 66 20 54 43 4c 53 48 3d 3d 32 0a 73 74 61 74 69  f TCLSH==2.stati
1e280 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 74 63  c const char *tc
1e290 6c 73 68 5f 6d 61 69 6e 5f 6c 6f 6f 70 28 76 6f  lsh_main_loop(vo
1e2a0 69 64 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  id);.#endif..#if
1e2b0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
1e2c0 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 69 74  static void init
1e2d0 5f 61 6c 6c 28 54 63 6c 5f 49 6e 74 65 72 70 20  _all(Tcl_Interp 
1e2e0 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 69  *);.static int i
1e2f0 6e 69 74 5f 61 6c 6c 5f 63 6d 64 28 0a 20 20 43  nit_all_cmd(.  C
1e300 6c 69 65 6e 74 44 61 74 61 20 63 64 2c 0a 20 20  lientData cd,.  
1e310 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1e320 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
1e330 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1e340 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 0a 20 20 54 63   objv[].){..  Tc
1e350 6c 5f 49 6e 74 65 72 70 20 2a 73 6c 61 76 65 3b  l_Interp *slave;
1e360 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
1e370 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
1e380 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
1e390 2c 20 6f 62 6a 76 2c 20 22 53 4c 41 56 45 22 29  , objv, "SLAVE")
1e3a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1e3b0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 73  _ERROR;.  }..  s
1e3c0 6c 61 76 65 20 3d 20 54 63 6c 5f 47 65 74 53 6c  lave = Tcl_GetSl
1e3d0 61 76 65 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ave(interp, Tcl_
1e3e0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
1e3f0 5d 29 29 3b 0a 20 20 69 66 28 20 21 73 6c 61 76  ]));.  if( !slav
1e400 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
1e410 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
1e420 20 20 69 6e 69 74 5f 61 6c 6c 28 73 6c 61 76 65    init_all(slave
1e430 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
1e440 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 63 6c  OK;.}../*.** Tcl
1e450 63 6d 64 3a 20 64 62 5f 75 73 65 5f 6c 65 67 61  cmd: db_use_lega
1e460 63 79 5f 70 72 65 70 61 72 65 20 44 42 20 42 4f  cy_prepare DB BO
1e470 4f 4c 45 41 4e 0a 2a 2a 0a 2a 2a 20 20 20 54 68  OLEAN.**.**   Th
1e480 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
1e490 20 74 6f 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64   to this command
1e4a0 20 6d 75 73 74 20 62 65 20 61 20 64 61 74 61 62   must be a datab
1e4b0 61 73 65 20 63 6f 6d 6d 61 6e 64 20 63 72 65 61  ase command crea
1e4c0 74 65 64 20 62 79 0a 2a 2a 20 20 20 5b 73 71 6c  ted by.**   [sql
1e4d0 69 74 65 33 5d 2e 20 49 66 20 74 68 65 20 73 65  ite3]. If the se
1e4e0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
1e4f0 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20   true, then the 
1e500 68 61 6e 64 6c 65 20 69 73 20 63 6f 6e 66 69 67  handle is config
1e510 75 72 65 64 0a 2a 2a 20 20 20 74 6f 20 75 73 65  ured.**   to use
1e520 20 74 68 65 20 73 71 6c 69 74 65 33 5f 70 72 65   the sqlite3_pre
1e530 70 61 72 65 5f 76 32 28 29 20 66 75 6e 63 74 69  pare_v2() functi
1e540 6f 6e 20 74 6f 20 70 72 65 70 61 72 65 20 73 74  on to prepare st
1e550 61 74 65 6d 65 6e 74 73 2e 20 49 66 20 69 74 0a  atements. If it.
1e560 2a 2a 20 20 20 69 73 20 66 61 6c 73 65 2c 20 73  **   is false, s
1e570 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 29  qlite3_prepare()
1e580 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e590 64 62 5f 75 73 65 5f 6c 65 67 61 63 79 5f 70 72  db_use_legacy_pr
1e5a0 65 70 61 72 65 5f 63 6d 64 28 0a 20 20 43 6c 69  epare_cmd(.  Cli
1e5b0 65 6e 74 44 61 74 61 20 63 64 2c 0a 20 20 54 63  entData cd,.  Tc
1e5c0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1e5d0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1e5e0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1e5f0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 54 63 6c 5f 43  bjv[].){.  Tcl_C
1e600 6d 64 49 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a  mdInfo cmdInfo;.
1e610 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 3b    SqliteDb *pDb;
1e620 0a 20 20 69 6e 74 20 62 50 72 65 70 61 72 65 3b  .  int bPrepare;
1e630 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ..  if( objc!=3 
1e640 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
1e650 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
1e660 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 42 4f 4f  1, objv, "DB BOO
1e670 4c 45 41 4e 22 29 3b 0a 20 20 20 20 72 65 74 75  LEAN");.    retu
1e680 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1e690 7d 0a 0a 20 20 69 66 28 20 21 54 63 6c 5f 47 65  }..  if( !Tcl_Ge
1e6a0 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74  tCommandInfo(int
1e6b0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
1e6c0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 63 6d  ng(objv[1]), &cm
1e6d0 64 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 54 63  dInfo) ){.    Tc
1e6e0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1e6f0 6e 74 65 72 70 2c 20 22 6e 6f 20 73 75 63 68 20  nterp, "no such 
1e700 64 62 3a 20 22 2c 20 54 63 6c 5f 47 65 74 53 74  db: ", Tcl_GetSt
1e710 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 28  ring(objv[1]), (
1e720 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65  char*)0);.    re
1e730 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1e740 20 20 7d 0a 20 20 70 44 62 20 3d 20 28 53 71 6c    }.  pDb = (Sql
1e750 69 74 65 44 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f  iteDb*)cmdInfo.o
1e760 62 6a 43 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20  bjClientData;.  
1e770 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  if( Tcl_GetBoole
1e780 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
1e790 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 62 50 72 65  , objv[2], &bPre
1e7a0 70 61 72 65 29 20 29 7b 0a 20 20 20 20 72 65 74  pare) ){.    ret
1e7b0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1e7c0 20 7d 0a 0a 20 20 70 44 62 2d 3e 62 4c 65 67 61   }..  pDb->bLega
1e7d0 63 79 50 72 65 70 61 72 65 20 3d 20 62 50 72 65  cyPrepare = bPre
1e7e0 70 61 72 65 3b 0a 0a 20 20 54 63 6c 5f 52 65 73  pare;..  Tcl_Res
1e7f0 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  etResult(interp)
1e800 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
1e810 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 63 6c 63  K;.}../*.** Tclc
1e820 6d 64 3a 20 64 62 5f 6c 61 73 74 5f 73 74 6d 74  md: db_last_stmt
1e830 5f 70 74 72 20 44 42 0a 2a 2a 0a 2a 2a 20 20 20  _ptr DB.**.**   
1e840 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  If the statement
1e850 20 63 61 63 68 65 20 61 73 73 6f 63 69 61 74 65   cache associate
1e860 64 20 77 69 74 68 20 64 61 74 61 62 61 73 65 20  d with database 
1e870 44 42 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 2c  DB is not empty,
1e880 0a 2a 2a 20 20 20 72 65 74 75 72 6e 20 74 68 65  .**   return the
1e890 20 74 65 78 74 20 72 65 70 72 65 73 65 6e 74 61   text representa
1e8a0 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74  tion of the most
1e8b0 20 72 65 63 65 6e 74 6c 79 20 75 73 65 64 20 73   recently used s
1e8c0 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 68 61  tatement.**   ha
1e8d0 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndle..*/.static 
1e8e0 69 6e 74 20 64 62 5f 6c 61 73 74 5f 73 74 6d 74  int db_last_stmt
1e8f0 5f 70 74 72 28 0a 20 20 43 6c 69 65 6e 74 44 61  _ptr(.  ClientDa
1e900 74 61 20 63 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  ta cd,.  Tcl_Int
1e910 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1e920 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1e930 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1e940 0a 29 7b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  .){.  extern int
1e950 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65   sqlite3TestMake
1e960 50 6f 69 6e 74 65 72 53 74 72 28 54 63 6c 5f 49  PointerStr(Tcl_I
1e970 6e 74 65 72 70 2a 2c 20 63 68 61 72 2a 2c 20 76  nterp*, char*, v
1e980 6f 69 64 2a 29 3b 0a 20 20 54 63 6c 5f 43 6d 64  oid*);.  Tcl_Cmd
1e990 49 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20 20  Info cmdInfo;.  
1e9a0 53 71 6c 69 74 65 44 62 20 2a 70 44 62 3b 0a 20  SqliteDb *pDb;. 
1e9b0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1e9c0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72  Stmt = 0;.  char
1e9d0 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 0a 20 20 69   zBuf[100];..  i
1e9e0 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
1e9f0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
1ea00 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
1ea10 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20 20 20 72  jv, "DB");.    r
1ea20 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1ea30 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 54 63 6c  .  }..  if( !Tcl
1ea40 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28  _GetCommandInfo(
1ea50 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
1ea60 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
1ea70 26 63 6d 64 49 6e 66 6f 29 20 29 7b 0a 20 20 20  &cmdInfo) ){.   
1ea80 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1ea90 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 73 75  t(interp, "no su
1eaa0 63 68 20 64 62 3a 20 22 2c 20 54 63 6c 5f 47 65  ch db: ", Tcl_Ge
1eab0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
1eac0 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
1ead0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1eae0 52 3b 0a 20 20 7d 0a 20 20 70 44 62 20 3d 20 28  R;.  }.  pDb = (
1eaf0 53 71 6c 69 74 65 44 62 2a 29 63 6d 64 49 6e 66  SqliteDb*)cmdInf
1eb00 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44 61 74 61 3b  o.objClientData;
1eb10 0a 0a 20 20 69 66 28 20 70 44 62 2d 3e 73 74 6d  ..  if( pDb->stm
1eb20 74 4c 69 73 74 20 29 20 70 53 74 6d 74 20 3d 20  tList ) pStmt = 
1eb30 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 2d 3e 70  pDb->stmtList->p
1eb40 53 74 6d 74 3b 0a 20 20 69 66 28 20 73 71 6c 69  Stmt;.  if( sqli
1eb50 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74  te3TestMakePoint
1eb60 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42  erStr(interp, zB
1eb70 75 66 2c 20 70 53 74 6d 74 29 20 29 7b 0a 20 20  uf, pStmt) ){.  
1eb80 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1eb90 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65  OR;.  }.  Tcl_Se
1eba0 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
1ebb0 7a 42 75 66 2c 20 54 43 4c 5f 56 4f 4c 41 54 49  zBuf, TCL_VOLATI
1ebc0 4c 45 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54  LE);..  return T
1ebd0 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  CL_OK;.}.#endif 
1ebe0 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 2a  /* SQLITE_TEST *
1ebf0 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75  /../*.** Configu
1ec00 72 65 20 74 68 65 20 69 6e 74 65 72 70 72 65 74  re the interpret
1ec10 65 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  er passed as the
1ec20 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
1ec30 74 6f 20 68 61 76 65 20 61 63 63 65 73 73 0a 2a  to have access.*
1ec40 2a 20 74 6f 20 74 68 65 20 63 6f 6d 6d 61 6e 64  * to the command
1ec50 73 20 61 6e 64 20 6c 69 6e 6b 65 64 20 76 61 72  s and linked var
1ec60 69 61 62 6c 65 73 20 74 68 61 74 20 6d 61 6b 65  iables that make
1ec70 20 75 70 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74   up:.**.**   * t
1ec80 68 65 20 5b 73 71 6c 69 74 65 33 5d 20 65 78 74  he [sqlite3] ext
1ec90 65 6e 73 69 6f 6e 20 69 74 73 65 6c 66 2c 0a 2a  ension itself,.*
1eca0 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 53 51 4c 49  *.**   * If SQLI
1ecb0 54 45 5f 54 43 4c 4d 44 35 20 6f 72 20 53 51 4c  TE_TCLMD5 or SQL
1ecc0 49 54 45 5f 54 45 53 54 20 69 73 20 64 65 66 69  ITE_TEST is defi
1ecd0 6e 65 64 2c 20 74 68 65 20 4d 64 35 20 63 6f 6d  ned, the Md5 com
1ece0 6d 61 6e 64 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a  mands, and.**.**
1ecf0 20 20 20 2a 20 49 66 20 53 51 4c 49 54 45 5f 54     * If SQLITE_T
1ed00 45 53 54 20 69 73 20 73 65 74 2c 20 74 68 65 20  EST is set, the 
1ed10 76 61 72 69 6f 75 73 20 74 65 73 74 20 69 6e 74  various test int
1ed20 65 72 66 61 63 65 73 20 75 73 65 64 20 62 79 20  erfaces used by 
1ed30 74 68 65 20 54 63 6c 0a 2a 2a 20 20 20 20 20 74  the Tcl.**     t
1ed40 65 73 74 20 73 75 69 74 65 2e 0a 2a 2f 0a 73 74  est suite..*/.st
1ed50 61 74 69 63 20 76 6f 69 64 20 69 6e 69 74 5f 61  atic void init_a
1ed60 6c 6c 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  ll(Tcl_Interp *i
1ed70 6e 74 65 72 70 29 7b 0a 20 20 53 71 6c 69 74 65  nterp){.  Sqlite
1ed80 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  3_Init(interp);.
1ed90 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
1eda0 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66  ITE_TEST) || def
1edb0 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 43 4c 4d  ined(SQLITE_TCLM
1edc0 44 35 29 0a 20 20 4d 64 35 5f 49 6e 69 74 28 69  D5).  Md5_Init(i
1edd0 6e 74 65 72 70 29 3b 0a 23 65 6e 64 69 66 0a 0a  nterp);.#endif..
1ede0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
1edf0 53 54 0a 20 20 7b 0a 20 20 20 20 65 78 74 65 72  ST.  {.    exter
1ee00 6e 20 69 6e 74 20 53 71 6c 69 74 65 63 6f 6e 66  n int Sqliteconf
1ee10 69 67 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  ig_Init(Tcl_Inte
1ee20 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
1ee30 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 31   int Sqlitetest1
1ee40 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1ee50 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1ee60 6e 74 20 53 71 6c 69 74 65 74 65 73 74 32 5f 49  nt Sqlitetest2_I
1ee70 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
1ee80 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
1ee90 20 53 71 6c 69 74 65 74 65 73 74 33 5f 49 6e 69   Sqlitetest3_Ini
1eea0 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
1eeb0 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1eec0 71 6c 69 74 65 74 65 73 74 34 5f 49 6e 69 74 28  qlitetest4_Init(
1eed0 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1eee0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1eef0 69 74 65 74 65 73 74 35 5f 49 6e 69 74 28 54 63  itetest5_Init(Tc
1ef00 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1ef10 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1ef20 65 74 65 73 74 36 5f 49 6e 69 74 28 54 63 6c 5f  etest6_Init(Tcl_
1ef30 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
1ef40 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1ef50 65 73 74 37 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  est7_Init(Tcl_In
1ef60 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
1ef70 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1ef80 74 38 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  t8_Init(Tcl_Inte
1ef90 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
1efa0 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 39   int Sqlitetest9
1efb0 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1efc0 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1efd0 6e 74 20 53 71 6c 69 74 65 74 65 73 74 61 73 79  nt Sqlitetestasy
1efe0 6e 63 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  nc_Init(Tcl_Inte
1eff0 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
1f000 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f   int Sqlitetest_
1f010 61 75 74 6f 65 78 74 5f 49 6e 69 74 28 54 63 6c  autoext_Init(Tcl
1f020 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1f030 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1f040 74 65 73 74 5f 62 6c 6f 62 5f 49 6e 69 74 28 54  test_blob_Init(T
1f050 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1f060 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1f070 74 65 74 65 73 74 5f 64 65 6d 6f 76 66 73 5f 49  tetest_demovfs_I
1f080 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nit(Tcl_Interp *
1f090 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
1f0a0 74 20 53 71 6c 69 74 65 74 65 73 74 5f 66 75 6e  t Sqlitetest_fun
1f0b0 63 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  c_Init(Tcl_Inter
1f0c0 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1f0d0 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f 68  int Sqlitetest_h
1f0e0 65 78 69 6f 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  exio_Init(Tcl_In
1f0f0 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
1f100 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1f110 74 5f 69 6e 69 74 5f 49 6e 69 74 28 54 63 6c 5f  t_init_Init(Tcl_
1f120 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
1f130 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1f140 65 73 74 5f 6d 61 6c 6c 6f 63 5f 49 6e 69 74 28  est_malloc_Init(
1f150 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1f160 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1f170 69 74 65 74 65 73 74 5f 6d 75 74 65 78 5f 49 6e  itetest_mutex_In
1f180 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1f190 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1f1a0 53 71 6c 69 74 65 74 65 73 74 73 63 68 65 6d 61  Sqlitetestschema
1f1b0 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1f1c0 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1f1d0 6e 74 20 53 71 6c 69 74 65 74 65 73 74 73 73 65  nt Sqlitetestsse
1f1e0 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1f1f0 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1f200 6e 74 20 53 71 6c 69 74 65 74 65 73 74 74 63 6c  nt Sqlitetesttcl
1f210 76 61 72 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  var_Init(Tcl_Int
1f220 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1f230 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1f240 66 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  fs_Init(Tcl_Inte
1f250 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
1f260 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 54   int SqlitetestT
1f270 68 72 65 61 64 5f 49 6e 69 74 28 54 63 6c 5f 49  hread_Init(Tcl_I
1f280 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1f290 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1f2a0 73 74 4f 6e 65 66 69 6c 65 5f 49 6e 69 74 28 29  stOnefile_Init()
1f2b0 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
1f2c0 20 53 71 6c 69 74 65 74 65 73 74 4f 73 69 6e 73   SqlitetestOsins
1f2d0 74 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  t_Init(Tcl_Inter
1f2e0 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1f2f0 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 62 61  int Sqlitetestba
1f300 63 6b 75 70 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  ckup_Init(Tcl_In
1f310 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
1f320 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1f330 74 69 6e 74 61 72 72 61 79 5f 49 6e 69 74 28 54  tintarray_Init(T
1f340 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1f350 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1f360 74 65 74 65 73 74 76 66 73 5f 49 6e 69 74 28 54  tetestvfs_Init(T
1f370 63 6c 5f 49 6e 74 65 72 70 20 2a 29 3b 0a 20 20  cl_Interp *);.  
1f380 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1f390 69 74 65 74 65 73 74 72 74 72 65 65 5f 49 6e 69  itetestrtree_Ini
1f3a0 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
1f3b0 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1f3c0 71 6c 69 74 65 71 75 6f 74 61 5f 49 6e 69 74 28  qlitequota_Init(
1f3d0 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1f3e0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1f3f0 69 74 65 6d 75 6c 74 69 70 6c 65 78 5f 49 6e 69  itemultiplex_Ini
1f400 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
1f410 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1f420 71 6c 69 74 65 53 75 70 65 72 6c 6f 63 6b 5f 49  qliteSuperlock_I
1f430 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
1f440 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
1f450 20 53 71 6c 69 74 65 74 65 73 74 53 79 73 63 61   SqlitetestSysca
1f460 6c 6c 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  ll_Init(Tcl_Inte
1f470 72 70 2a 29 3b 0a 23 69 66 20 64 65 66 69 6e 65  rp*);.#if define
1f480 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
1f490 53 45 53 53 49 4f 4e 29 20 26 26 20 64 65 66 69  SESSION) && defi
1f4a0 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
1f4b0 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b  E_PREUPDATE_HOOK
1f4c0 29 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ).    extern int
1f4d0 20 54 65 73 74 53 65 73 73 69 6f 6e 5f 49 6e 69   TestSession_Ini
1f4e0 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
1f4f0 23 65 6e 64 69 66 0a 20 20 20 20 65 78 74 65 72  #endif.    exter
1f500 6e 20 69 6e 74 20 46 74 73 35 74 63 6c 5f 49 6e  n int Fts5tcl_In
1f510 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29  it(Tcl_Interp *)
1f520 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
1f530 20 53 71 6c 69 74 65 52 62 75 5f 49 6e 69 74 28   SqliteRbu_Init(
1f540 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1f550 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1f560 69 74 65 74 65 73 74 74 63 6c 5f 49 6e 69 74 28  itetesttcl_Init(
1f570 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 23 69  Tcl_Interp*);.#i
1f580 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1f590 5f 45 4e 41 42 4c 45 5f 46 54 53 33 29 20 7c 7c  _ENABLE_FTS3) ||
1f5a0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1f5b0 45 4e 41 42 4c 45 5f 46 54 53 34 29 0a 20 20 20  ENABLE_FTS4).   
1f5c0 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1f5d0 74 65 74 65 73 74 66 74 73 33 5f 49 6e 69 74 28  tetestfts3_Init(
1f5e0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1f5f0 72 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  rp);.#endif..#if
1f600 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1f610 45 5f 5a 49 50 56 46 53 0a 20 20 20 20 65 78 74  E_ZIPVFS.    ext
1f620 65 72 6e 20 69 6e 74 20 5a 69 70 76 66 73 5f 49  ern int Zipvfs_I
1f630 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
1f640 3b 0a 20 20 20 20 5a 69 70 76 66 73 5f 49 6e 69  ;.    Zipvfs_Ini
1f650 74 28 69 6e 74 65 72 70 29 3b 0a 23 65 6e 64 69  t(interp);.#endi
1f660 66 0a 0a 20 20 20 20 53 71 6c 69 74 65 63 6f 6e  f..    Sqlitecon
1f670 66 69 67 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  fig_Init(interp)
1f680 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
1f690 31 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  1_Init(interp);.
1f6a0 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 32 5f      Sqlitetest2_
1f6b0 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
1f6c0 20 20 53 71 6c 69 74 65 74 65 73 74 33 5f 49 6e    Sqlitetest3_In
1f6d0 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1f6e0 53 71 6c 69 74 65 74 65 73 74 34 5f 49 6e 69 74  Sqlitetest4_Init
1f6f0 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1f700 6c 69 74 65 74 65 73 74 35 5f 49 6e 69 74 28 69  litetest5_Init(i
1f710 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1f720 74 65 74 65 73 74 36 5f 49 6e 69 74 28 69 6e 74  tetest6_Init(int
1f730 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1f740 74 65 73 74 37 5f 49 6e 69 74 28 69 6e 74 65 72  test7_Init(inter
1f750 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
1f760 73 74 38 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  st8_Init(interp)
1f770 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
1f780 39 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  9_Init(interp);.
1f790 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 61 73      Sqlitetestas
1f7a0 79 6e 63 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  ync_Init(interp)
1f7b0 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
1f7c0 5f 61 75 74 6f 65 78 74 5f 49 6e 69 74 28 69 6e  _autoext_Init(in
1f7d0 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
1f7e0 65 74 65 73 74 5f 62 6c 6f 62 5f 49 6e 69 74 28  etest_blob_Init(
1f7f0 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
1f800 69 74 65 74 65 73 74 5f 64 65 6d 6f 76 66 73 5f  itetest_demovfs_
1f810 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
1f820 20 20 53 71 6c 69 74 65 74 65 73 74 5f 66 75 6e    Sqlitetest_fun
1f830 63 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  c_Init(interp);.
1f840 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 5f 68      Sqlitetest_h
1f850 65 78 69 6f 5f 49 6e 69 74 28 69 6e 74 65 72 70  exio_Init(interp
1f860 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
1f870 74 5f 69 6e 69 74 5f 49 6e 69 74 28 69 6e 74 65  t_init_Init(inte
1f880 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
1f890 65 73 74 5f 6d 61 6c 6c 6f 63 5f 49 6e 69 74 28  est_malloc_Init(
1f8a0 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
1f8b0 69 74 65 74 65 73 74 5f 6d 75 74 65 78 5f 49 6e  itetest_mutex_In
1f8c0 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1f8d0 53 71 6c 69 74 65 74 65 73 74 73 63 68 65 6d 61  Sqlitetestschema
1f8e0 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
1f8f0 20 20 20 53 71 6c 69 74 65 74 65 73 74 74 63 6c     Sqlitetesttcl
1f900 76 61 72 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  var_Init(interp)
1f910 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
1f920 66 73 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  fs_Init(interp);
1f930 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 54  .    SqlitetestT
1f940 68 72 65 61 64 5f 49 6e 69 74 28 69 6e 74 65 72  hread_Init(inter
1f950 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
1f960 73 74 4f 6e 65 66 69 6c 65 5f 49 6e 69 74 28 69  stOnefile_Init(i
1f970 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1f980 74 65 74 65 73 74 4f 73 69 6e 73 74 5f 49 6e 69  tetestOsinst_Ini
1f990 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
1f9a0 71 6c 69 74 65 74 65 73 74 62 61 63 6b 75 70 5f  qlitetestbackup_
1f9b0 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
1f9c0 20 20 53 71 6c 69 74 65 74 65 73 74 69 6e 74 61    Sqlitetestinta
1f9d0 72 72 61 79 5f 49 6e 69 74 28 69 6e 74 65 72 70  rray_Init(interp
1f9e0 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
1f9f0 74 76 66 73 5f 49 6e 69 74 28 69 6e 74 65 72 70  tvfs_Init(interp
1fa00 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
1fa10 74 72 74 72 65 65 5f 49 6e 69 74 28 69 6e 74 65  trtree_Init(inte
1fa20 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 71  rp);.    Sqliteq
1fa30 75 6f 74 61 5f 49 6e 69 74 28 69 6e 74 65 72 70  uota_Init(interp
1fa40 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 6d 75 6c  );.    Sqlitemul
1fa50 74 69 70 6c 65 78 5f 49 6e 69 74 28 69 6e 74 65  tiplex_Init(inte
1fa60 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 53  rp);.    SqliteS
1fa70 75 70 65 72 6c 6f 63 6b 5f 49 6e 69 74 28 69 6e  uperlock_Init(in
1fa80 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
1fa90 65 74 65 73 74 53 79 73 63 61 6c 6c 5f 49 6e 69  etestSyscall_Ini
1faa0 74 28 69 6e 74 65 72 70 29 3b 0a 23 69 66 20 64  t(interp);.#if d
1fab0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
1fac0 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 20 26 26  ABLE_SESSION) &&
1fad0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1fae0 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45  ENABLE_PREUPDATE
1faf0 5f 48 4f 4f 4b 29 0a 20 20 20 20 54 65 73 74 53  _HOOK).    TestS
1fb00 65 73 73 69 6f 6e 5f 49 6e 69 74 28 69 6e 74 65  ession_Init(inte
1fb10 72 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  rp);.#endif.    
1fb20 46 74 73 35 74 63 6c 5f 49 6e 69 74 28 69 6e 74  Fts5tcl_Init(int
1fb30 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1fb40 52 62 75 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  Rbu_Init(interp)
1fb50 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
1fb60 74 63 6c 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  tcl_Init(interp)
1fb70 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  ;..#if defined(S
1fb80 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53  QLITE_ENABLE_FTS
1fb90 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  3) || defined(SQ
1fba0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 34  LITE_ENABLE_FTS4
1fbb0 29 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ).    Sqlitetest
1fbc0 66 74 73 33 5f 49 6e 69 74 28 69 6e 74 65 72 70  fts3_Init(interp
1fbd0 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 54  );.#endif..    T
1fbe0 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
1fbf0 61 6e 64 28 0a 20 20 20 20 20 20 20 20 69 6e 74  and(.        int
1fc00 65 72 70 2c 20 22 6c 6f 61 64 5f 74 65 73 74 66  erp, "load_testf
1fc10 69 78 74 75 72 65 5f 65 78 74 65 6e 73 69 6f 6e  ixture_extension
1fc20 73 22 2c 20 69 6e 69 74 5f 61 6c 6c 5f 63 6d 64  s", init_all_cmd
1fc30 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20  , 0, 0.    );.  
1fc40 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
1fc50 6f 6d 6d 61 6e 64 28 0a 20 20 20 20 20 20 20 20  ommand(.        
1fc60 69 6e 74 65 72 70 2c 20 22 64 62 5f 75 73 65 5f  interp, "db_use_
1fc70 6c 65 67 61 63 79 5f 70 72 65 70 61 72 65 22 2c  legacy_prepare",
1fc80 20 64 62 5f 75 73 65 5f 6c 65 67 61 63 79 5f 70   db_use_legacy_p
1fc90 72 65 70 61 72 65 5f 63 6d 64 2c 20 30 2c 20 30  repare_cmd, 0, 0
1fca0 0a 20 20 20 20 29 3b 0a 20 20 20 20 54 63 6c 5f  .    );.    Tcl_
1fcb0 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
1fcc0 28 0a 20 20 20 20 20 20 20 20 69 6e 74 65 72 70  (.        interp
1fcd0 2c 20 22 64 62 5f 6c 61 73 74 5f 73 74 6d 74 5f  , "db_last_stmt_
1fce0 70 74 72 22 2c 20 64 62 5f 6c 61 73 74 5f 73 74  ptr", db_last_st
1fcf0 6d 74 5f 70 74 72 2c 20 30 2c 20 30 0a 20 20 20  mt_ptr, 0, 0.   
1fd00 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   );..#ifdef SQLI
1fd10 54 45 5f 53 53 45 0a 20 20 20 20 53 71 6c 69 74  TE_SSE.    Sqlit
1fd20 65 74 65 73 74 73 73 65 5f 49 6e 69 74 28 69 6e  etestsse_Init(in
1fd30 74 65 72 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20  terp);.#endif.  
1fd40 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 20 4e  }.#endif.}../* N
1fd50 65 65 64 65 64 20 66 6f 72 20 74 68 65 20 73 65  eeded for the se
1fd60 74 72 6c 69 6d 69 74 28 29 20 73 79 73 74 65 6d  trlimit() system
1fd70 20 63 61 6c 6c 20 6f 6e 20 75 6e 69 78 20 2a 2f   call on unix */
1fd80 0a 23 69 66 20 64 65 66 69 6e 65 64 28 75 6e 69  .#if defined(uni
1fd90 78 29 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  x).#include <sys
1fda0 2f 72 65 73 6f 75 72 63 65 2e 68 3e 0a 23 65 6e  /resource.h>.#en
1fdb0 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 54 43 4c  dif..#define TCL
1fdc0 53 48 5f 4d 41 49 4e 20 6d 61 69 6e 20 20 20 2f  SH_MAIN main   /
1fdd0 2a 20 4e 65 65 64 65 64 20 74 6f 20 66 61 6b 65  * Needed to fake
1fde0 20 6f 75 74 20 6d 6b 74 63 6c 61 70 70 20 2a 2f   out mktclapp */
1fdf0 0a 69 6e 74 20 54 43 4c 53 48 5f 4d 41 49 4e 28  .int TCLSH_MAIN(
1fe00 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a  int argc, char *
1fe10 2a 61 72 67 76 29 7b 0a 20 20 54 63 6c 5f 49 6e  *argv){.  Tcl_In
1fe20 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 0a 23  terp *interp;..#
1fe30 69 66 20 21 64 65 66 69 6e 65 64 28 5f 57 49 4e  if !defined(_WIN
1fe40 33 32 5f 57 43 45 29 0a 20 20 69 66 28 20 67 65  32_WCE).  if( ge
1fe50 74 65 6e 76 28 22 42 52 45 41 4b 22 29 20 29 7b  tenv("BREAK") ){
1fe60 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
1fe70 65 72 72 2c 0a 20 20 20 20 20 20 20 20 22 61 74  err,.        "at
1fe80 74 61 63 68 20 64 65 62 75 67 67 65 72 20 74 6f  tach debugger to
1fe90 20 70 72 6f 63 65 73 73 20 25 64 20 61 6e 64 20   process %d and 
1fea0 70 72 65 73 73 20 61 6e 79 20 6b 65 79 20 74 6f  press any key to
1feb0 20 63 6f 6e 74 69 6e 75 65 2e 5c 6e 22 2c 0a 20   continue.\n",. 
1fec0 20 20 20 20 20 20 20 47 45 54 50 49 44 28 29 29         GETPID())
1fed0 3b 0a 20 20 20 20 66 67 65 74 63 28 73 74 64 69  ;.    fgetc(stdi
1fee0 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  n);.  }.#endif..
1fef0 20 20 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 70    /* Since the p
1ff00 72 69 6d 61 72 79 20 75 73 65 20 63 61 73 65 20  rimary use case 
1ff10 66 6f 72 20 74 68 69 73 20 62 69 6e 61 72 79 20  for this binary 
1ff20 69 73 20 74 65 73 74 69 6e 67 20 6f 66 20 53 51  is testing of SQ
1ff30 4c 69 74 65 2c 0a 20 20 2a 2a 20 62 65 20 73 75  Lite,.  ** be su
1ff40 72 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20 63  re to generate c
1ff50 6f 72 65 20 66 69 6c 65 73 20 69 66 20 77 65 20  ore files if we 
1ff60 63 72 61 73 68 20 2a 2f 0a 23 69 66 20 64 65 66  crash */.#if def
1ff70 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
1ff80 29 20 26 26 20 64 65 66 69 6e 65 64 28 75 6e 69  ) && defined(uni
1ff90 78 29 0a 20 20 7b 20 73 74 72 75 63 74 20 72 6c  x).  { struct rl
1ffa0 69 6d 69 74 20 78 3b 0a 20 20 20 20 67 65 74 72  imit x;.    getr
1ffb0 6c 69 6d 69 74 28 52 4c 49 4d 49 54 5f 43 4f 52  limit(RLIMIT_COR
1ffc0 45 2c 20 26 78 29 3b 0a 20 20 20 20 78 2e 72 6c  E, &x);.    x.rl
1ffd0 69 6d 5f 63 75 72 20 3d 20 78 2e 72 6c 69 6d 5f  im_cur = x.rlim_
1ffe0 6d 61 78 3b 0a 20 20 20 20 73 65 74 72 6c 69 6d  max;.    setrlim
1fff0 69 74 28 52 4c 49 4d 49 54 5f 43 4f 52 45 2c 20  it(RLIMIT_CORE, 
20000 26 78 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  &x);.  }.#endif 
20010 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 26  /* SQLITE_TEST &
20020 26 20 75 6e 69 78 20 2a 2f 0a 0a 0a 20 20 2f 2a  & unix */...  /*
20030 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 5f 73 68   Call sqlite3_sh
20040 75 74 64 6f 77 6e 28 29 20 6f 6e 63 65 20 62 65  utdown() once be
20050 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68  fore doing anyth
20060 69 6e 67 20 65 6c 73 65 2e 20 54 68 69 73 20 69  ing else. This i
20070 73 20 74 6f 0a 20 20 2a 2a 20 74 65 73 74 20 74  s to.  ** test t
20080 68 61 74 20 73 71 6c 69 74 65 33 5f 73 68 75 74  hat sqlite3_shut
20090 64 6f 77 6e 28 29 20 63 61 6e 20 62 65 20 73 61  down() can be sa
200a0 66 65 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 61  fely called by a
200b0 20 70 72 6f 63 65 73 73 20 62 65 66 6f 72 65 0a   process before.
200c0 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6e 69    ** sqlite3_ini
200d0 74 69 61 6c 69 7a 65 28 29 20 69 73 2e 20 2a 2f  tialize() is. */
200e0 0a 20 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64  .  sqlite3_shutd
200f0 6f 77 6e 28 29 3b 0a 0a 20 20 54 63 6c 5f 46 69  own();..  Tcl_Fi
20100 6e 64 45 78 65 63 75 74 61 62 6c 65 28 61 72 67  ndExecutable(arg
20110 76 5b 30 5d 29 3b 0a 20 20 54 63 6c 5f 53 65 74  v[0]);.  Tcl_Set
20120 53 79 73 74 65 6d 45 6e 63 6f 64 69 6e 67 28 4e  SystemEncoding(N
20130 55 4c 4c 2c 20 22 75 74 66 2d 38 22 29 3b 0a 20  ULL, "utf-8");. 
20140 20 69 6e 74 65 72 70 20 3d 20 54 63 6c 5f 43 72   interp = Tcl_Cr
20150 65 61 74 65 49 6e 74 65 72 70 28 29 3b 0a 0a 23  eateInterp();..#
20160 69 66 20 54 43 4c 53 48 3d 3d 32 0a 20 20 73 71  if TCLSH==2.  sq
20170 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c  lite3_config(SQL
20180 49 54 45 5f 43 4f 4e 46 49 47 5f 53 49 4e 47 4c  ITE_CONFIG_SINGL
20190 45 54 48 52 45 41 44 29 3b 0a 23 65 6e 64 69 66  ETHREAD);.#endif
201a0 0a 0a 20 20 69 6e 69 74 5f 61 6c 6c 28 69 6e 74  ..  init_all(int
201b0 65 72 70 29 3b 0a 20 20 69 66 28 20 61 72 67 63  erp);.  if( argc
201c0 3e 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  >=2 ){.    int i
201d0 3b 0a 20 20 20 20 63 68 61 72 20 7a 41 72 67 63  ;.    char zArgc
201e0 5b 33 32 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  [32];.    sqlite
201f0 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
20200 66 28 7a 41 72 67 63 29 2c 20 7a 41 72 67 63 2c  f(zArgc), zArgc,
20210 20 22 25 64 22 2c 20 61 72 67 63 2d 28 33 2d 54   "%d", argc-(3-T
20220 43 4c 53 48 29 29 3b 0a 20 20 20 20 54 63 6c 5f  CLSH));.    Tcl_
20230 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 22 61  SetVar(interp,"a
20240 72 67 63 22 2c 20 7a 41 72 67 63 2c 20 54 43 4c  rgc", zArgc, TCL
20250 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20  _GLOBAL_ONLY);. 
20260 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e     Tcl_SetVar(in
20270 74 65 72 70 2c 22 61 72 67 76 30 22 2c 61 72 67  terp,"argv0",arg
20280 76 5b 31 5d 2c 54 43 4c 5f 47 4c 4f 42 41 4c 5f  v[1],TCL_GLOBAL_
20290 4f 4e 4c 59 29 3b 0a 20 20 20 20 54 63 6c 5f 53  ONLY);.    Tcl_S
202a0 65 74 56 61 72 28 69 6e 74 65 72 70 2c 22 61 72  etVar(interp,"ar
202b0 67 76 22 2c 20 22 22 2c 20 54 43 4c 5f 47 4c 4f  gv", "", TCL_GLO
202c0 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 66  BAL_ONLY);.    f
202d0 6f 72 28 69 3d 33 2d 54 43 4c 53 48 3b 20 69 3c  or(i=3-TCLSH; i<
202e0 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  argc; i++){.    
202f0 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74    Tcl_SetVar(int
20300 65 72 70 2c 20 22 61 72 67 76 22 2c 20 61 72 67  erp, "argv", arg
20310 76 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  v[i],.          
20320 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 20  TCL_GLOBAL_ONLY 
20330 7c 20 54 43 4c 5f 4c 49 53 54 5f 45 4c 45 4d 45  | TCL_LIST_ELEME
20340 4e 54 20 7c 20 54 43 4c 5f 41 50 50 45 4e 44 5f  NT | TCL_APPEND_
20350 56 41 4c 55 45 29 3b 0a 20 20 20 20 7d 0a 20 20  VALUE);.    }.  
20360 20 20 69 66 28 20 54 43 4c 53 48 3d 3d 31 20 26    if( TCLSH==1 &
20370 26 20 54 63 6c 5f 45 76 61 6c 46 69 6c 65 28 69  & Tcl_EvalFile(i
20380 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 29 21  nterp, argv[1])!
20390 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  =TCL_OK ){.     
203a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e   const char *zIn
203b0 66 6f 20 3d 20 54 63 6c 5f 47 65 74 56 61 72 28  fo = Tcl_GetVar(
203c0 69 6e 74 65 72 70 2c 20 22 65 72 72 6f 72 49 6e  interp, "errorIn
203d0 66 6f 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f  fo", TCL_GLOBAL_
203e0 4f 4e 4c 59 29 3b 0a 20 20 20 20 20 20 69 66 28  ONLY);.      if(
203f0 20 7a 49 6e 66 6f 3d 3d 30 20 29 20 7a 49 6e 66   zInfo==0 ) zInf
20400 6f 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  o = Tcl_GetStrin
20410 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  gResult(interp);
20420 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
20430 74 64 65 72 72 2c 22 25 73 3a 20 25 73 5c 6e 22  tderr,"%s: %s\n"
20440 2c 20 2a 61 72 67 76 2c 20 7a 49 6e 66 6f 29 3b  , *argv, zInfo);
20450 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
20460 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
20470 20 54 43 4c 53 48 3d 3d 32 20 7c 7c 20 61 72 67   TCLSH==2 || arg
20480 63 3c 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c<=1 ){.    Tcl_
20490 47 6c 6f 62 61 6c 45 76 61 6c 28 69 6e 74 65 72  GlobalEval(inter
204a0 70 2c 20 74 63 6c 73 68 5f 6d 61 69 6e 5f 6c 6f  p, tclsh_main_lo
204b0 6f 70 28 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74  op());.  }.  ret
204c0 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 0;.}.#endif 
204d0 2f 2a 20 54 43 4c 53 48 20 2a 2f 0a              /* TCLSH */.