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

Artifact 9c4c4589d078de37813ded708d8838b338ffb060:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 41 20 54 43 4c 20  ******.** A TCL 
0180: 49 6e 74 65 72 66 61 63 65 20 74 6f 20 53 51 4c  Interface to SQL
0190: 69 74 65 2e 20 20 41 70 70 65 6e 64 20 74 68 69  ite.  Append thi
01a0: 73 20 66 69 6c 65 20 74 6f 20 73 71 6c 69 74 65  s file to sqlite
01b0: 33 2e 63 20 61 6e 64 0a 2a 2a 20 63 6f 6d 70 69  3.c and.** compi
01c0: 6c 65 20 74 68 65 20 77 68 6f 6c 65 20 74 68 69  le the whole thi
01d0: 6e 67 20 74 6f 20 62 75 69 6c 64 20 61 20 54 43  ng to build a TC
01e0: 4c 2d 65 6e 61 62 6c 65 64 20 76 65 72 73 69 6f  L-enabled versio
01f0: 6e 20 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2a 0a  n of SQLite..**.
0200: 2a 2a 20 43 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  ** Compile-time 
0210: 6f 70 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20  options:.**.**  
0220: 2d 44 54 43 4c 53 48 3d 31 20 20 20 20 20 20 20  -DTCLSH=1       
0230: 20 20 20 20 20 20 41 64 64 20 61 20 22 6d 61 69        Add a "mai
0240: 6e 28 29 22 20 72 6f 75 74 69 6e 65 20 74 68 61  n()" routine tha
0250: 74 20 77 6f 72 6b 73 20 61 73 20 61 20 74 63 6c  t works as a tcl
0260: 73 68 2e 0a 2a 2a 0a 2a 2a 20 20 2d 44 53 51 4c  sh..**.**  -DSQL
0270: 49 54 45 5f 54 43 4c 4d 44 35 20 20 20 20 20 20  ITE_TCLMD5      
0280: 20 57 68 65 6e 20 75 73 65 64 20 69 6e 20 63 6f   When used in co
0290: 6e 6a 75 63 74 69 6f 6e 20 77 69 74 68 20 2d 44  njuction with -D
02a0: 54 43 4c 53 48 3d 31 2c 20 61 64 64 0a 2a 2a 20  TCLSH=1, add.** 
02b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
02c0: 20 20 20 20 20 20 20 66 6f 75 72 20 6e 65 77 20         four new 
02d0: 63 6f 6d 6d 61 6e 64 73 20 74 6f 20 74 68 65 20  commands to the 
02e0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
02f0: 66 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  for.**          
0300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 65                ge
0310: 6e 65 72 61 74 69 6e 67 20 4d 44 35 20 63 68 65  nerating MD5 che
0320: 63 6b 73 75 6d 73 3a 20 20 6d 64 35 2c 20 6d 64  cksums:  md5, md
0330: 35 66 69 6c 65 2c 0a 2a 2a 20 20 20 20 20 20 20  5file,.**       
0340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0350: 20 6d 64 35 2d 31 30 78 38 2c 20 61 6e 64 20 6d   md5-10x8, and m
0360: 64 35 66 69 6c 65 2d 31 30 78 38 2e 0a 2a 2a 0a  d5file-10x8..**.
0370: 2a 2a 20 20 2d 44 53 51 4c 49 54 45 5f 54 45 53  **  -DSQLITE_TES
0380: 54 20 20 20 20 20 20 20 20 20 57 68 65 6e 20 75  T         When u
0390: 73 65 64 20 69 6e 20 63 6f 6e 6a 75 63 74 69 6f  sed in conjuctio
03a0: 6e 20 77 69 74 68 20 2d 44 54 43 4c 53 48 3d 31  n with -DTCLSH=1
03b0: 2c 20 61 64 64 0a 2a 2a 20 20 20 20 20 20 20 20  , add.**        
03c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
03d0: 68 75 6e 64 72 65 64 73 20 6f 66 20 6e 65 77 20  hundreds of new 
03e0: 63 6f 6d 6d 61 6e 64 73 20 75 73 65 64 20 66 6f  commands used fo
03f0: 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20 20 20 20  r testing.**    
0400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0410: 20 20 20 20 53 51 4c 69 74 65 2e 20 20 54 68 69      SQLite.  Thi
0420: 73 20 6f 70 74 69 6f 6e 20 69 6d 70 6c 69 65 73  s option implies
0430: 20 2d 44 53 51 4c 49 54 45 5f 54 43 4c 4d 44 35   -DSQLITE_TCLMD5
0440: 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 72  ..*/../*.** If r
0450: 65 71 75 65 73 74 65 64 2c 20 69 6e 63 6c 75 64  equested, includ
0460: 65 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 6d  e the SQLite com
0470: 70 69 6c 65 72 20 6f 70 74 69 6f 6e 73 20 66 69  piler options fi
0480: 6c 65 20 66 6f 72 20 4d 53 56 43 2e 0a 2a 2f 0a  le for MSVC..*/.
0490: 23 69 66 20 64 65 66 69 6e 65 64 28 49 4e 43 4c  #if defined(INCL
04a0: 55 44 45 5f 4d 53 56 43 5f 48 29 0a 23 69 6e 63  UDE_MSVC_H).#inc
04b0: 6c 75 64 65 20 22 6d 73 76 63 2e 68 22 0a 23 65  lude "msvc.h".#e
04c0: 6e 64 69 66 0a 0a 23 69 6e 63 6c 75 64 65 20 22  ndif..#include "
04d0: 74 63 6c 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  tcl.h".#include 
04e0: 3c 65 72 72 6e 6f 2e 68 3e 0a 0a 2f 2a 0a 2a 2a  <errno.h>../*.**
04f0: 20 53 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c   Some additional
0500: 20 69 6e 63 6c 75 64 65 20 66 69 6c 65 73 20 61   include files a
0510: 72 65 20 6e 65 65 64 65 64 20 69 66 20 74 68 69  re needed if thi
0520: 73 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a  s file is not.**
0530: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
0540: 20 61 6d 61 6c 67 61 6d 61 74 69 6f 6e 2e 0a 2a   amalgamation..*
0550: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
0560: 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 0a 23 20  _AMALGAMATION.# 
0570: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33  include "sqlite3
0580: 2e 68 22 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73  .h".# include <s
0590: 74 64 6c 69 62 2e 68 3e 0a 23 20 69 6e 63 6c 75  tdlib.h>.# inclu
05a0: 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 20  de <string.h>.# 
05b0: 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e  include <assert.
05c0: 68 3e 0a 20 20 74 79 70 65 64 65 66 20 75 6e 73  h>.  typedef uns
05d0: 69 67 6e 65 64 20 63 68 61 72 20 75 38 3b 0a 23  igned char u8;.#
05e0: 65 6e 64 69 66 0a 23 69 6e 63 6c 75 64 65 20 3c  endif.#include <
05f0: 63 74 79 70 65 2e 68 3e 0a 0a 2f 2a 20 55 73 65  ctype.h>../* Use
0600: 64 20 74 6f 20 67 65 74 20 74 68 65 20 63 75 72  d to get the cur
0610: 72 65 6e 74 20 70 72 6f 63 65 73 73 20 49 44 20  rent process ID 
0620: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
0630: 5f 57 49 4e 33 32 29 0a 23 20 69 6e 63 6c 75 64  _WIN32).# includ
0640: 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 20 64  e <unistd.h>.# d
0650: 65 66 69 6e 65 20 47 45 54 50 49 44 20 67 65 74  efine GETPID get
0660: 70 69 64 0a 23 65 6c 69 66 20 21 64 65 66 69 6e  pid.#elif !defin
0670: 65 64 28 5f 57 49 4e 33 32 5f 57 43 45 29 0a 23  ed(_WIN32_WCE).#
0680: 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 41   ifndef SQLITE_A
0690: 4d 41 4c 47 41 4d 41 54 49 4f 4e 0a 23 20 20 64  MALGAMATION.#  d
06a0: 65 66 69 6e 65 20 57 49 4e 33 32 5f 4c 45 41 4e  efine WIN32_LEAN
06b0: 5f 41 4e 44 5f 4d 45 41 4e 0a 23 20 20 69 6e 63  _AND_MEAN.#  inc
06c0: 6c 75 64 65 20 3c 77 69 6e 64 6f 77 73 2e 68 3e  lude <windows.h>
06d0: 0a 23 20 65 6e 64 69 66 0a 23 20 64 65 66 69 6e  .# endif.# defin
06e0: 65 20 47 45 54 50 49 44 20 28 69 6e 74 29 47 65  e GETPID (int)Ge
06f0: 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
0700: 64 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20  d.#endif../*. * 
0710: 57 69 6e 64 6f 77 73 20 6e 65 65 64 73 20 74 6f  Windows needs to
0720: 20 6b 6e 6f 77 20 77 68 69 63 68 20 73 79 6d 62   know which symb
0730: 6f 6c 73 20 74 6f 20 65 78 70 6f 72 74 2e 20 20  ols to export.  
0740: 55 6e 69 78 20 64 6f 65 73 20 6e 6f 74 2e 0a 20  Unix does not.. 
0750: 2a 20 42 55 49 4c 44 5f 73 71 6c 69 74 65 20 73  * BUILD_sqlite s
0760: 68 6f 75 6c 64 20 62 65 20 75 6e 64 65 66 69 6e  hould be undefin
0770: 65 64 20 66 6f 72 20 55 6e 69 78 2e 0a 20 2a 2f  ed for Unix.. */
0780: 0a 23 69 66 64 65 66 20 42 55 49 4c 44 5f 73 71  .#ifdef BUILD_sq
0790: 6c 69 74 65 0a 23 75 6e 64 65 66 20 54 43 4c 5f  lite.#undef TCL_
07a0: 53 54 4f 52 41 47 45 5f 43 4c 41 53 53 0a 23 64  STORAGE_CLASS.#d
07b0: 65 66 69 6e 65 20 54 43 4c 5f 53 54 4f 52 41 47  efine TCL_STORAG
07c0: 45 5f 43 4c 41 53 53 20 44 4c 4c 45 58 50 4f 52  E_CLASS DLLEXPOR
07d0: 54 0a 23 65 6e 64 69 66 20 2f 2a 20 42 55 49 4c  T.#endif /* BUIL
07e0: 44 5f 73 71 6c 69 74 65 20 2a 2f 0a 0a 23 64 65  D_sqlite */..#de
07f0: 66 69 6e 65 20 4e 55 4d 5f 50 52 45 50 41 52 45  fine NUM_PREPARE
0800: 44 5f 53 54 4d 54 53 20 31 30 0a 23 64 65 66 69  D_STMTS 10.#defi
0810: 6e 65 20 4d 41 58 5f 50 52 45 50 41 52 45 44 5f  ne MAX_PREPARED_
0820: 53 54 4d 54 53 20 31 30 30 0a 0a 2f 2a 20 46 6f  STMTS 100../* Fo
0830: 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
0840: 6e 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  n */.typedef str
0850: 75 63 74 20 53 71 6c 69 74 65 44 62 20 53 71 6c  uct SqliteDb Sql
0860: 69 74 65 44 62 3b 0a 0a 2f 2a 0a 2a 2a 20 4e 65  iteDb;../*.** Ne
0870: 77 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20  w SQL functions 
0880: 63 61 6e 20 62 65 20 63 72 65 61 74 65 64 20 61  can be created a
0890: 73 20 54 43 4c 20 73 63 72 69 70 74 73 2e 20 20  s TCL scripts.  
08a0: 45 61 63 68 20 73 75 63 68 20 66 75 6e 63 74 69  Each such functi
08b0: 6f 6e 0a 2a 2a 20 69 73 20 64 65 73 63 72 69 62  on.** is describ
08c0: 65 64 20 62 79 20 61 6e 20 69 6e 73 74 61 6e 63  ed by an instanc
08d0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
08e0: 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  ng structure..*/
08f0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0900: 53 71 6c 46 75 6e 63 20 53 71 6c 46 75 6e 63 3b  SqlFunc SqlFunc;
0910: 0a 73 74 72 75 63 74 20 53 71 6c 46 75 6e 63 20  .struct SqlFunc 
0920: 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  {.  Tcl_Interp *
0930: 69 6e 74 65 72 70 3b 20 20 20 2f 2a 20 54 68 65  interp;   /* The
0940: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 20 74   TCL interpret t
0950: 6f 20 65 78 65 63 75 74 65 20 74 68 65 20 66 75  o execute the fu
0960: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
0970: 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 20 20 20  Obj *pScript;   
0980: 20 20 2f 2a 20 54 68 65 20 54 63 6c 5f 4f 62 6a    /* The Tcl_Obj
0990: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
09a0: 6f 66 20 74 68 65 20 73 63 72 69 70 74 20 2a 2f  of the script */
09b0: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
09c0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  ;        /* Data
09d0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
09e0: 74 68 61 74 20 6f 77 6e 73 20 74 68 69 73 20 66  that owns this f
09f0: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  unction */.  int
0a00: 20 75 73 65 45 76 61 6c 4f 62 6a 76 3b 20 20 20   useEvalObjv;   
0a10: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 74     /* True if it
0a20: 20 69 73 20 73 61 66 65 20 74 6f 20 75 73 65 20   is safe to use 
0a30: 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 20 2a 2f 0a  Tcl_EvalObjv */.
0a40: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20    char *zName;  
0a50: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
0a60: 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
0a70: 20 2a 2f 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70   */.  SqlFunc *p
0a80: 4e 65 78 74 3b 20 20 20 20 20 20 20 2f 2a 20 4e  Next;       /* N
0a90: 65 78 74 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 20  ext function on 
0aa0: 74 68 65 20 6c 69 73 74 20 6f 66 20 74 68 65 6d  the list of them
0ab0: 20 61 6c 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a   all */.};../*.*
0ac0: 2a 20 4e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20  * New collation 
0ad0: 73 65 71 75 65 6e 63 65 73 20 66 75 6e 63 74 69  sequences functi
0ae0: 6f 6e 20 63 61 6e 20 62 65 20 63 72 65 61 74 65  on can be create
0af0: 64 20 61 73 20 54 43 4c 20 73 63 72 69 70 74 73  d as TCL scripts
0b00: 2e 20 20 45 61 63 68 20 73 75 63 68 0a 2a 2a 20  .  Each such.** 
0b10: 66 75 6e 63 74 69 6f 6e 20 69 73 20 64 65 73 63  function is desc
0b20: 72 69 62 65 64 20 62 79 20 61 6e 20 69 6e 73 74  ribed by an inst
0b30: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
0b40: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e  owing structure.
0b50: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
0b60: 63 74 20 53 71 6c 43 6f 6c 6c 61 74 65 20 53 71  ct SqlCollate Sq
0b70: 6c 43 6f 6c 6c 61 74 65 3b 0a 73 74 72 75 63 74  lCollate;.struct
0b80: 20 53 71 6c 43 6f 6c 6c 61 74 65 20 7b 0a 20 20   SqlCollate {.  
0b90: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
0ba0: 72 70 3b 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  rp;   /* The TCL
0bb0: 20 69 6e 74 65 72 70 72 65 74 20 74 6f 20 65 78   interpret to ex
0bc0: 65 63 75 74 65 20 74 68 65 20 66 75 6e 63 74 69  ecute the functi
0bd0: 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53  on */.  char *zS
0be0: 63 72 69 70 74 3b 20 20 20 20 20 20 20 20 2f 2a  cript;        /*
0bf0: 20 54 68 65 20 73 63 72 69 70 74 20 74 6f 20 62   The script to b
0c00: 65 20 72 75 6e 20 2a 2f 0a 20 20 53 71 6c 43 6f  e run */.  SqlCo
0c10: 6c 6c 61 74 65 20 2a 70 4e 65 78 74 3b 20 20 20  llate *pNext;   
0c20: 20 2f 2a 20 4e 65 78 74 20 66 75 6e 63 74 69 6f   /* Next functio
0c30: 6e 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 6f 66  n on the list of
0c40: 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 7d 3b 0a   them all */.};.
0c50: 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 64 20  ./*.** Prepared 
0c60: 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 63  statements are c
0c70: 61 63 68 65 64 20 66 6f 72 20 66 61 73 74 65 72  ached for faster
0c80: 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 45 61 63   execution.  Eac
0c90: 68 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73 74  h prepared.** st
0ca0: 61 74 65 6d 65 6e 74 20 69 73 20 64 65 73 63 72  atement is descr
0cb0: 69 62 65 64 20 62 79 20 61 6e 20 69 6e 73 74 61  ibed by an insta
0cc0: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
0cd0: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
0ce0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
0cf0: 74 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d  t SqlPreparedStm
0d00: 74 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d  t SqlPreparedStm
0d10: 74 3b 0a 73 74 72 75 63 74 20 53 71 6c 50 72 65  t;.struct SqlPre
0d20: 70 61 72 65 64 53 74 6d 74 20 7b 0a 20 20 53 71  paredStmt {.  Sq
0d30: 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70  lPreparedStmt *p
0d40: 4e 65 78 74 3b 20 20 2f 2a 20 4e 65 78 74 20 69  Next;  /* Next i
0d50: 6e 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 2a 2f  n linked list */
0d60: 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74  .  SqlPreparedSt
0d70: 6d 74 20 2a 70 50 72 65 76 3b 20 20 2f 2a 20 50  mt *pPrev;  /* P
0d80: 72 65 76 69 6f 75 73 20 6f 6e 20 74 68 65 20 6c  revious on the l
0d90: 69 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ist */.  sqlite3
0da0: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20  _stmt *pStmt;   
0db0: 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65    /* The prepare
0dc0: 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  d statement */. 
0dd0: 20 69 6e 74 20 6e 53 71 6c 3b 20 20 20 20 20 20   int nSql;      
0de0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 68 61            /* cha
0df0: 72 73 20 69 6e 20 7a 53 71 6c 5b 5d 20 2a 2f 0a  rs in zSql[] */.
0e00: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
0e10: 71 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 65  ql;        /* Te
0e20: 78 74 20 6f 66 20 74 68 65 20 53 51 4c 20 73 74  xt of the SQL st
0e30: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
0e40: 20 6e 50 61 72 6d 3b 20 20 20 20 20 20 20 20 20   nParm;         
0e50: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
0e60: 20 61 70 50 61 72 6d 20 61 72 72 61 79 20 2a 2f   apParm array */
0e70: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 50  .  Tcl_Obj **apP
0e80: 61 72 6d 3b 20 20 20 20 20 20 20 20 2f 2a 20 41  arm;        /* A
0e90: 72 72 61 79 20 6f 66 20 72 65 66 65 72 65 6e 63  rray of referenc
0ea0: 65 64 20 6f 62 6a 65 63 74 20 70 6f 69 6e 74 65  ed object pointe
0eb0: 72 73 20 2a 2f 0a 7d 3b 0a 0a 74 79 70 65 64 65  rs */.};..typede
0ec0: 66 20 73 74 72 75 63 74 20 49 6e 63 72 62 6c 6f  f struct Incrblo
0ed0: 62 43 68 61 6e 6e 65 6c 20 49 6e 63 72 62 6c 6f  bChannel Incrblo
0ee0: 62 43 68 61 6e 6e 65 6c 3b 0a 0a 2f 2a 0a 2a 2a  bChannel;../*.**
0ef0: 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e   There is one in
0f00: 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73  stance of this s
0f10: 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 61 63  tructure for eac
0f20: 68 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  h SQLite databas
0f30: 65 0a 2a 2a 20 74 68 61 74 20 68 61 73 20 62 65  e.** that has be
0f40: 65 6e 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65  en opened by the
0f50: 20 53 51 4c 69 74 65 20 54 43 4c 20 69 6e 74 65   SQLite TCL inte
0f60: 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rface..**.** If 
0f70: 74 68 69 73 20 6d 6f 64 75 6c 65 20 69 73 20 62  this module is b
0f80: 75 69 6c 74 20 77 69 74 68 20 53 51 4c 49 54 45  uilt with SQLITE
0f90: 5f 54 45 53 54 20 64 65 66 69 6e 65 64 20 28 74  _TEST defined (t
0fa0: 6f 20 63 72 65 61 74 65 20 74 68 65 20 53 51 4c  o create the SQL
0fb0: 69 74 65 0a 2a 2a 20 74 65 73 74 66 69 78 74 75  ite.** testfixtu
0fc0: 72 65 20 65 78 65 63 75 74 61 62 6c 65 29 2c 20  re executable), 
0fd0: 74 68 65 6e 20 69 74 20 6d 61 79 20 62 65 20 63  then it may be c
0fe0: 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73 65  onfigured to use
0ff0: 20 65 69 74 68 65 72 0a 2a 2a 20 73 71 6c 69 74   either.** sqlit
1000: 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 29 20  e3_prepare_v2() 
1010: 6f 72 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  or sqlite3_prepa
1020: 72 65 28 29 20 74 6f 20 70 72 65 70 61 72 65 20  re() to prepare 
1030: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  SQL statements..
1040: 2a 2a 20 49 66 20 53 71 6c 69 74 65 44 62 2e 62  ** If SqliteDb.b
1050: 4c 65 67 61 63 79 50 72 65 70 61 72 65 20 69 73  LegacyPrepare is
1060: 20 74 72 75 65 2c 20 73 71 6c 69 74 65 33 5f 70   true, sqlite3_p
1070: 72 65 70 61 72 65 28 29 20 69 73 20 75 73 65 64  repare() is used
1080: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53 71 6c 69  ..*/.struct Sqli
1090: 74 65 44 62 20 7b 0a 20 20 73 71 6c 69 74 65 33  teDb {.  sqlite3
10a0: 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
10b0: 20 20 20 20 2f 2a 20 54 68 65 20 22 72 65 61 6c      /* The "real
10c0: 22 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63  " database struc
10d0: 74 75 72 65 2e 20 4d 55 53 54 20 42 45 20 46 49  ture. MUST BE FI
10e0: 52 53 54 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  RST */.  Tcl_Int
10f0: 65 72 70 20 2a 69 6e 74 65 72 70 3b 20 20 20 20  erp *interp;    
1100: 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 74 65 72      /* The inter
1110: 70 72 65 74 65 72 20 75 73 65 64 20 66 6f 72 20  preter used for 
1120: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f  this database */
1130: 0a 20 20 63 68 61 72 20 2a 7a 42 75 73 79 3b 20  .  char *zBusy; 
1140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1150: 20 54 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   The busy callba
1160: 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  ck routine */.  
1170: 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 20 20  char *zCommit;  
1180: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1190: 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 63 61  e commit hook ca
11a0: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a  llback routine *
11b0: 2f 0a 20 20 63 68 61 72 20 2a 7a 54 72 61 63 65  /.  char *zTrace
11c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
11d0: 2a 20 54 68 65 20 74 72 61 63 65 20 63 61 6c 6c  * The trace call
11e0: 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a  back routine */.
11f0: 20 20 63 68 61 72 20 2a 7a 50 72 6f 66 69 6c 65    char *zProfile
1200: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1210: 54 68 65 20 70 72 6f 66 69 6c 65 20 63 61 6c 6c  The profile call
1220: 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a  back routine */.
1230: 20 20 63 68 61 72 20 2a 7a 50 72 6f 67 72 65 73    char *zProgres
1240: 73 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s;           /* 
1250: 54 68 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c  The progress cal
1260: 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f  lback routine */
1270: 0a 20 20 63 68 61 72 20 2a 7a 41 75 74 68 3b 20  .  char *zAuth; 
1280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1290: 20 54 68 65 20 61 75 74 68 6f 72 69 7a 61 74 69   The authorizati
12a0: 6f 6e 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74  on callback rout
12b0: 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73  ine */.  int dis
12c0: 61 62 6c 65 41 75 74 68 3b 20 20 20 20 20 20 20  ableAuth;       
12d0: 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 74      /* Disable t
12e0: 68 65 20 61 75 74 68 6f 72 69 7a 65 72 20 69 66  he authorizer if
12f0: 20 69 74 20 65 78 69 73 74 73 20 2a 2f 0a 20 20   it exists */.  
1300: 63 68 61 72 20 2a 7a 4e 75 6c 6c 3b 20 20 20 20  char *zNull;    
1310: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
1320: 78 74 20 74 6f 20 73 75 62 73 74 69 74 75 74 65  xt to substitute
1330: 20 66 6f 72 20 61 6e 20 53 51 4c 20 4e 55 4c 4c   for an SQL NULL
1340: 20 76 61 6c 75 65 20 2a 2f 0a 20 20 53 71 6c 46   value */.  SqlF
1350: 75 6e 63 20 2a 70 46 75 6e 63 3b 20 20 20 20 20  unc *pFunc;     
1360: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
1370: 66 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20  f SQL functions 
1380: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 55  */.  Tcl_Obj *pU
1390: 70 64 61 74 65 48 6f 6f 6b 3b 20 20 20 20 20 20  pdateHook;      
13a0: 2f 2a 20 55 70 64 61 74 65 20 68 6f 6f 6b 20 73  /* Update hook s
13b0: 63 72 69 70 74 20 28 69 66 20 61 6e 79 29 20 2a  cript (if any) *
13c0: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 50 72  /.  Tcl_Obj *pPr
13d0: 65 55 70 64 61 74 65 48 6f 6f 6b 3b 20 20 20 2f  eUpdateHook;   /
13e0: 2a 20 50 72 65 2d 75 70 64 61 74 65 20 68 6f 6f  * Pre-update hoo
13f0: 6b 20 73 63 72 69 70 74 20 28 69 66 20 61 6e 79  k script (if any
1400: 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  ) */.  Tcl_Obj *
1410: 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3b 20 20  pRollbackHook;  
1420: 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 68 6f    /* Rollback 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 57 61 6c 48 6f 6f 6b 3b 20 20 20 20 20 20  *pWalHook;      
1460: 20 20 20 2f 2a 20 57 41 4c 20 68 6f 6f 6b 20 73     /* WAL hook s
1470: 63 72 69 70 74 20 28 69 66 20 61 6e 79 29 20 2a  cript (if any) *
1480: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 55 6e  /.  Tcl_Obj *pUn
1490: 6c 6f 63 6b 4e 6f 74 69 66 79 3b 20 20 20 20 2f  lockNotify;    /
14a0: 2a 20 55 6e 6c 6f 63 6b 20 6e 6f 74 69 66 79 20  * Unlock notify 
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 53 71 6c 43 6f 6c 6c 61 74 65 20  */.  SqlCollate 
14d0: 2a 70 43 6f 6c 6c 61 74 65 3b 20 20 20 20 20 20  *pCollate;      
14e0: 2f 2a 20 4c 69 73 74 20 6f 66 20 53 51 4c 20 63  /* List of SQL c
14f0: 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f  ollation functio
1500: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ns */.  int rc; 
1510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1520: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
1530: 65 20 6f 66 20 6d 6f 73 74 20 72 65 63 65 6e 74  e of most recent
1540: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20   sqlite3_exec() 
1550: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43  */.  Tcl_Obj *pC
1560: 6f 6c 6c 61 74 65 4e 65 65 64 65 64 3b 20 20 20  ollateNeeded;   
1570: 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65  /* Collation nee
1580: 64 65 64 20 73 63 72 69 70 74 20 2a 2f 0a 20 20  ded script */.  
1590: 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20  SqlPreparedStmt 
15a0: 2a 73 74 6d 74 4c 69 73 74 3b 20 2f 2a 20 4c 69  *stmtList; /* Li
15b0: 73 74 20 6f 66 20 70 72 65 70 61 72 65 64 20 73  st of prepared s
15c0: 74 61 74 65 6d 65 6e 74 73 2a 2f 0a 20 20 53 71  tatements*/.  Sq
15d0: 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 73  lPreparedStmt *s
15e0: 74 6d 74 4c 61 73 74 3b 20 2f 2a 20 4c 61 73 74  tmtLast; /* Last
15f0: 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 74 68   statement in th
1600: 65 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  e list */.  int 
1610: 6d 61 78 53 74 6d 74 3b 20 20 20 20 20 20 20 20  maxStmt;        
1620: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65         /* The ne
1630: 78 74 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  xt maximum numbe
1640: 72 20 6f 66 20 73 74 6d 74 4c 69 73 74 20 2a 2f  r of stmtList */
1650: 0a 20 20 69 6e 74 20 6e 53 74 6d 74 3b 20 20 20  .  int nStmt;   
1660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1670: 20 4e 75 6d 62 65 72 20 6f 66 20 73 74 61 74 65   Number of state
1680: 6d 65 6e 74 73 20 69 6e 20 73 74 6d 74 4c 69 73  ments in stmtLis
1690: 74 20 2a 2f 0a 20 20 49 6e 63 72 62 6c 6f 62 43  t */.  IncrblobC
16a0: 68 61 6e 6e 65 6c 20 2a 70 49 6e 63 72 62 6c 6f  hannel *pIncrblo
16b0: 62 3b 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74  b;/* Linked list
16c0: 20 6f 66 20 6f 70 65 6e 20 69 6e 63 72 62 6c 6f   of open incrblo
16d0: 62 20 63 68 61 6e 6e 65 6c 73 20 2a 2f 0a 20 20  b channels */.  
16e0: 69 6e 74 20 6e 53 74 65 70 2c 20 6e 53 6f 72 74  int nStep, nSort
16f0: 2c 20 6e 49 6e 64 65 78 3b 20 20 2f 2a 20 53 74  , nIndex;  /* St
1700: 61 74 69 73 74 69 63 73 20 66 6f 72 20 6d 6f 73  atistics for mos
1710: 74 20 72 65 63 65 6e 74 20 6f 70 65 72 61 74 69  t recent operati
1720: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 72 61  on */.  int nTra
1730: 6e 73 61 63 74 69 6f 6e 3b 20 20 20 20 20 20 20  nsaction;       
1740: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1750: 6e 65 73 74 65 64 20 5b 74 72 61 6e 73 61 63 74  nested [transact
1760: 69 6f 6e 5d 20 6d 65 74 68 6f 64 73 20 2a 2f 0a  ion] methods */.
1770: 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 3b    int openFlags;
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1790: 46 6c 61 67 73 20 75 73 65 64 20 74 6f 20 6f 70  Flags used to op
17a0: 65 6e 2e 20 20 28 53 51 4c 49 54 45 5f 4f 50 45  en.  (SQLITE_OPE
17b0: 4e 5f 55 52 49 29 20 2a 2f 0a 23 69 66 64 65 66  N_URI) */.#ifdef
17c0: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
17d0: 6e 74 20 62 4c 65 67 61 63 79 50 72 65 70 61 72  nt bLegacyPrepar
17e0: 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  e;        /* Tru
17f0: 65 20 74 6f 20 75 73 65 20 73 71 6c 69 74 65 33  e to use sqlite3
1800: 5f 70 72 65 70 61 72 65 28 29 20 2a 2f 0a 23 65  _prepare() */.#e
1810: 6e 64 69 66 0a 7d 3b 0a 0a 73 74 72 75 63 74 20  ndif.};..struct 
1820: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20  IncrblobChannel 
1830: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  {.  sqlite3_blob
1840: 20 2a 70 42 6c 6f 62 3b 20 20 20 20 20 20 2f 2a   *pBlob;      /*
1850: 20 73 71 6c 69 74 65 33 20 62 6c 6f 62 20 68 61   sqlite3 blob ha
1860: 6e 64 6c 65 20 2a 2f 0a 20 20 53 71 6c 69 74 65  ndle */.  Sqlite
1870: 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20  Db *pDb;        
1880: 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65      /* Associate
1890: 64 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  d database conne
18a0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
18b0: 53 65 65 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Seek;           
18c0: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
18d0: 73 65 65 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20  seek offset */. 
18e0: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61   Tcl_Channel cha
18f0: 6e 6e 65 6c 3b 20 20 20 20 20 20 2f 2a 20 43 68  nnel;      /* Ch
1900: 61 6e 6e 65 6c 20 69 64 65 6e 74 69 66 69 65 72  annel identifier
1910: 20 2a 2f 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68   */.  IncrblobCh
1920: 61 6e 6e 65 6c 20 2a 70 4e 65 78 74 3b 20 20 20  annel *pNext;   
1930: 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f  /* Linked list o
1940: 66 20 61 6c 6c 20 6f 70 65 6e 20 69 6e 63 72 62  f all open incrb
1950: 6c 6f 62 20 63 68 61 6e 6e 65 6c 73 20 2a 2f 0a  lob channels */.
1960: 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65    IncrblobChanne
1970: 6c 20 2a 70 50 72 65 76 3b 20 20 20 2f 2a 20 4c  l *pPrev;   /* L
1980: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 61 6c  inked list of al
1990: 6c 20 6f 70 65 6e 20 69 6e 63 72 62 6c 6f 62 20  l open incrblob 
19a0: 63 68 61 6e 6e 65 6c 73 20 2a 2f 0a 7d 3b 0a 0a  channels */.};..
19b0: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20  /*.** Compute a 
19c0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 74 68  string length th
19d0: 61 74 20 69 73 20 6c 69 6d 69 74 65 64 20 74 6f  at is limited to
19e0: 20 77 68 61 74 20 63 61 6e 20 62 65 20 73 74 6f   what can be sto
19f0: 72 65 64 20 69 6e 0a 2a 2a 20 6c 6f 77 65 72 20  red in.** lower 
1a00: 33 30 20 62 69 74 73 20 6f 66 20 61 20 33 32 2d  30 bits of a 32-
1a10: 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74 65 67  bit signed integ
1a20: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
1a30: 74 20 73 74 72 6c 65 6e 33 30 28 63 6f 6e 73 74  t strlen30(const
1a40: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 63 6f 6e   char *z){.  con
1a50: 73 74 20 63 68 61 72 20 2a 7a 32 20 3d 20 7a 3b  st char *z2 = z;
1a60: 0a 20 20 77 68 69 6c 65 28 20 2a 7a 32 20 29 7b  .  while( *z2 ){
1a70: 20 7a 32 2b 2b 3b 20 7d 0a 20 20 72 65 74 75 72   z2++; }.  retur
1a80: 6e 20 30 78 33 66 66 66 66 66 66 66 20 26 20 28  n 0x3fffffff & (
1a90: 69 6e 74 29 28 7a 32 20 2d 20 7a 29 3b 0a 7d 0a  int)(z2 - z);.}.
1aa0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1ab0: 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f  _OMIT_INCRBLOB./
1ac0: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 69  *.** Close all i
1ad0: 6e 63 72 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 73  ncrblob channels
1ae0: 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 64 61   opened using da
1af0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1b00: 6e 20 70 44 62 2e 0a 2a 2a 20 54 68 69 73 20 69  n pDb..** This i
1b10: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 73 68  s called when sh
1b20: 75 74 74 69 6e 67 20 64 6f 77 6e 20 74 68 65 20  utting down the 
1b30: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1b40: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
1b50: 6f 69 64 20 63 6c 6f 73 65 49 6e 63 72 62 6c 6f  oid closeIncrblo
1b60: 62 43 68 61 6e 6e 65 6c 73 28 53 71 6c 69 74 65  bChannels(Sqlite
1b70: 44 62 20 2a 70 44 62 29 7b 0a 20 20 49 6e 63 72  Db *pDb){.  Incr
1b80: 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 3b 0a  blobChannel *p;.
1b90: 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65    IncrblobChanne
1ba0: 6c 20 2a 70 4e 65 78 74 3b 0a 0a 20 20 66 6f 72  l *pNext;..  for
1bb0: 28 70 3d 70 44 62 2d 3e 70 49 6e 63 72 62 6c 6f  (p=pDb->pIncrblo
1bc0: 62 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a  b; p; p=pNext){.
1bd0: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70      pNext = p->p
1be0: 4e 65 78 74 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f  Next;..    /* No
1bf0: 74 65 3a 20 43 61 6c 6c 69 6e 67 20 75 6e 72 65  te: Calling unre
1c00: 67 69 73 74 65 72 20 68 65 72 65 20 63 61 6c 6c  gister here call
1c10: 20 54 63 6c 5f 43 6c 6f 73 65 20 6f 6e 20 74 68   Tcl_Close on th
1c20: 65 20 69 6e 63 72 62 6c 6f 62 20 63 68 61 6e 6e  e incrblob chann
1c30: 65 6c 2c 20 0a 20 20 20 20 2a 2a 20 77 68 69 63  el, .    ** whic
1c40: 68 20 64 65 6c 65 74 65 73 20 74 68 65 20 49 6e  h deletes the In
1c50: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 73 74  crblobChannel st
1c60: 72 75 63 74 75 72 65 20 61 74 20 2a 70 2e 20 53  ructure at *p. S
1c70: 6f 20 64 6f 20 6e 6f 74 0a 20 20 20 20 2a 2a 20  o do not.    ** 
1c80: 63 61 6c 6c 20 54 63 6c 5f 46 72 65 65 28 29 20  call Tcl_Free() 
1c90: 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  here..    */.   
1ca0: 20 54 63 6c 5f 55 6e 72 65 67 69 73 74 65 72 43   Tcl_UnregisterC
1cb0: 68 61 6e 6e 65 6c 28 70 44 62 2d 3e 69 6e 74 65  hannel(pDb->inte
1cc0: 72 70 2c 20 70 2d 3e 63 68 61 6e 6e 65 6c 29 3b  rp, p->channel);
1cd0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  .  }.}../*.** Cl
1ce0: 6f 73 65 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74  ose an increment
1cf0: 61 6c 20 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e  al blob channel.
1d00: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
1d10: 6e 63 72 62 6c 6f 62 43 6c 6f 73 65 28 43 6c 69  ncrblobClose(Cli
1d20: 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65  entData instance
1d30: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70  Data, Tcl_Interp
1d40: 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 49 6e 63   *interp){.  Inc
1d50: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 20  rblobChannel *p 
1d60: 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  = (IncrblobChann
1d70: 65 6c 20 2a 29 69 6e 73 74 61 6e 63 65 44 61 74  el *)instanceDat
1d80: 61 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71  a;.  int rc = sq
1d90: 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65  lite3_blob_close
1da0: 28 70 2d 3e 70 42 6c 6f 62 29 3b 0a 20 20 73 71  (p->pBlob);.  sq
1db0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 70  lite3 *db = p->p
1dc0: 44 62 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 52 65  Db->db;..  /* Re
1dd0: 6d 6f 76 65 20 74 68 65 20 63 68 61 6e 6e 65 6c  move the channel
1de0: 20 66 72 6f 6d 20 74 68 65 20 53 71 6c 69 74 65   from the Sqlite
1df0: 44 62 2e 70 49 6e 63 72 62 6c 6f 62 20 6c 69 73  Db.pIncrblob lis
1e00: 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  t. */.  if( p->p
1e10: 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70  Next ){.    p->p
1e20: 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d  Next->pPrev = p-
1e30: 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 69 66  >pPrev;.  }.  if
1e40: 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  ( p->pPrev ){.  
1e50: 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78    p->pPrev->pNex
1e60: 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  t = p->pNext;.  
1e70: 7d 0a 20 20 69 66 28 20 70 2d 3e 70 44 62 2d 3e  }.  if( p->pDb->
1e80: 70 49 6e 63 72 62 6c 6f 62 3d 3d 70 20 29 7b 0a  pIncrblob==p ){.
1e90: 20 20 20 20 70 2d 3e 70 44 62 2d 3e 70 49 6e 63      p->pDb->pInc
1ea0: 72 62 6c 6f 62 20 3d 20 70 2d 3e 70 4e 65 78 74  rblob = p->pNext
1eb0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65  ;.  }..  /* Free
1ec0: 20 74 68 65 20 49 6e 63 72 62 6c 6f 62 43 68 61   the IncrblobCha
1ed0: 6e 6e 65 6c 20 73 74 72 75 63 74 75 72 65 20 2a  nnel structure *
1ee0: 2f 0a 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68  /.  Tcl_Free((ch
1ef0: 61 72 20 2a 29 70 29 3b 0a 0a 20 20 69 66 28 20  ar *)p);..  if( 
1f00: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1f10: 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
1f20: 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
1f30: 20 2a 29 73 71 6c 69 74 65 33 5f 65 72 72 6d 73   *)sqlite3_errms
1f40: 67 28 64 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54  g(db), TCL_VOLAT
1f50: 49 4c 45 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ILE);.    return
1f60: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1f70: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1f80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64  .}../*.** Read d
1f90: 61 74 61 20 66 72 6f 6d 20 61 6e 20 69 6e 63 72  ata from an incr
1fa0: 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 68 61  emental blob cha
1fb0: 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nnel..*/.static 
1fc0: 69 6e 74 20 69 6e 63 72 62 6c 6f 62 49 6e 70 75  int incrblobInpu
1fd0: 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  t(.  ClientData 
1fe0: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 0a 20  instanceData, . 
1ff0: 20 63 68 61 72 20 2a 62 75 66 2c 20 0a 20 20 69   char *buf, .  i
2000: 6e 74 20 62 75 66 53 69 7a 65 2c 0a 20 20 69 6e  nt bufSize,.  in
2010: 74 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 0a  t *errorCodePtr.
2020: 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61  ){.  IncrblobCha
2030: 6e 6e 65 6c 20 2a 70 20 3d 20 28 49 6e 63 72 62  nnel *p = (Incrb
2040: 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 69 6e 73  lobChannel *)ins
2050: 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 69 6e 74  tanceData;.  int
2060: 20 6e 52 65 61 64 20 3d 20 62 75 66 53 69 7a 65   nRead = bufSize
2070: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
2080: 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
2090: 72 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  read */.  int nB
20a0: 6c 6f 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  lob;            
20b0: 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
20c0: 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 62  size of the blob
20d0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
20e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f0: 20 20 20 2f 2a 20 73 71 6c 69 74 65 20 65 72 72     /* sqlite err
2100: 6f 72 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 6e 42  or code */..  nB
2110: 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c  lob = sqlite3_bl
2120: 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70 42 6c 6f  ob_bytes(p->pBlo
2130: 62 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 69 53  b);.  if( (p->iS
2140: 65 65 6b 2b 6e 52 65 61 64 29 3e 6e 42 6c 6f 62  eek+nRead)>nBlob
2150: 20 29 7b 0a 20 20 20 20 6e 52 65 61 64 20 3d 20   ){.    nRead = 
2160: 6e 42 6c 6f 62 2d 70 2d 3e 69 53 65 65 6b 3b 0a  nBlob-p->iSeek;.
2170: 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 61 64 3c    }.  if( nRead<
2180: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
2190: 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20   0;.  }..  rc = 
21a0: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61  sqlite3_blob_rea
21b0: 64 28 70 2d 3e 70 42 6c 6f 62 2c 20 28 76 6f 69  d(p->pBlob, (voi
21c0: 64 20 2a 29 62 75 66 2c 20 6e 52 65 61 64 2c 20  d *)buf, nRead, 
21d0: 70 2d 3e 69 53 65 65 6b 29 3b 0a 20 20 69 66 28  p->iSeek);.  if(
21e0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
21f0: 7b 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65  {.    *errorCode
2200: 50 74 72 20 3d 20 72 63 3b 0a 20 20 20 20 72 65  Ptr = rc;.    re
2210: 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20  turn -1;.  }..  
2220: 70 2d 3e 69 53 65 65 6b 20 2b 3d 20 6e 52 65 61  p->iSeek += nRea
2230: 64 3b 0a 20 20 72 65 74 75 72 6e 20 6e 52 65 61  d;.  return nRea
2240: 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  d;.}../*.** Writ
2250: 65 20 64 61 74 61 20 74 6f 20 61 6e 20 69 6e 63  e data to an inc
2260: 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 68  remental blob ch
2270: 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  annel..*/.static
2280: 20 69 6e 74 20 69 6e 63 72 62 6c 6f 62 4f 75 74   int incrblobOut
2290: 70 75 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  put(.  ClientDat
22a0: 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20  a instanceData, 
22b0: 0a 20 20 43 4f 4e 53 54 20 63 68 61 72 20 2a 62  .  CONST char *b
22c0: 75 66 2c 20 0a 20 20 69 6e 74 20 74 6f 57 72 69  uf, .  int toWri
22d0: 74 65 2c 0a 20 20 69 6e 74 20 2a 65 72 72 6f 72  te,.  int *error
22e0: 43 6f 64 65 50 74 72 0a 29 7b 0a 20 20 49 6e 63  CodePtr.){.  Inc
22f0: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 20  rblobChannel *p 
2300: 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  = (IncrblobChann
2310: 65 6c 20 2a 29 69 6e 73 74 61 6e 63 65 44 61 74  el *)instanceDat
2320: 61 3b 0a 20 20 69 6e 74 20 6e 57 72 69 74 65 20  a;.  int nWrite 
2330: 3d 20 74 6f 57 72 69 74 65 3b 20 20 20 20 20 20  = toWrite;      
2340: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
2350: 79 74 65 73 20 74 6f 20 77 72 69 74 65 20 2a 2f  ytes to write */
2360: 0a 20 20 69 6e 74 20 6e 42 6c 6f 62 3b 20 20 20  .  int nBlob;   
2370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2380: 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66  /* Total size of
2390: 20 74 68 65 20 62 6c 6f 62 20 2a 2f 0a 20 20 69   the blob */.  i
23a0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
23b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
23c0: 71 6c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  qlite error code
23d0: 20 2a 2f 0a 0a 20 20 6e 42 6c 6f 62 20 3d 20 73   */..  nBlob = s
23e0: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65  qlite3_blob_byte
23f0: 73 28 70 2d 3e 70 42 6c 6f 62 29 3b 0a 20 20 69  s(p->pBlob);.  i
2400: 66 28 20 28 70 2d 3e 69 53 65 65 6b 2b 6e 57 72  f( (p->iSeek+nWr
2410: 69 74 65 29 3e 6e 42 6c 6f 62 20 29 7b 0a 20 20  ite)>nBlob ){.  
2420: 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20    *errorCodePtr 
2430: 3d 20 45 49 4e 56 41 4c 3b 0a 20 20 20 20 72 65  = EINVAL;.    re
2440: 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 69  turn -1;.  }.  i
2450: 66 28 20 6e 57 72 69 74 65 3c 3d 30 20 29 7b 0a  f( nWrite<=0 ){.
2460: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
2470: 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  }..  rc = sqlite
2480: 33 5f 62 6c 6f 62 5f 77 72 69 74 65 28 70 2d 3e  3_blob_write(p->
2490: 70 42 6c 6f 62 2c 20 28 76 6f 69 64 20 2a 29 62  pBlob, (void *)b
24a0: 75 66 2c 20 6e 57 72 69 74 65 2c 20 70 2d 3e 69  uf, nWrite, p->i
24b0: 53 65 65 6b 29 3b 0a 20 20 69 66 28 20 72 63 21  Seek);.  if( rc!
24c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
24d0: 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20    *errorCodePtr 
24e0: 3d 20 45 49 4f 3b 0a 20 20 20 20 72 65 74 75 72  = EIO;.    retur
24f0: 6e 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e  n -1;.  }..  p->
2500: 69 53 65 65 6b 20 2b 3d 20 6e 57 72 69 74 65 3b  iSeek += nWrite;
2510: 0a 20 20 72 65 74 75 72 6e 20 6e 57 72 69 74 65  .  return nWrite
2520: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20  ;.}../*.** Seek 
2530: 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62  an incremental b
2540: 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a  lob channel..*/.
2550: 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 62  static int incrb
2560: 6c 6f 62 53 65 65 6b 28 0a 20 20 43 6c 69 65 6e  lobSeek(.  Clien
2570: 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61  tData instanceDa
2580: 74 61 2c 20 0a 20 20 6c 6f 6e 67 20 6f 66 66 73  ta, .  long offs
2590: 65 74 2c 0a 20 20 69 6e 74 20 73 65 65 6b 4d 6f  et,.  int seekMo
25a0: 64 65 2c 0a 20 20 69 6e 74 20 2a 65 72 72 6f 72  de,.  int *error
25b0: 43 6f 64 65 50 74 72 0a 29 7b 0a 20 20 49 6e 63  CodePtr.){.  Inc
25c0: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 20  rblobChannel *p 
25d0: 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  = (IncrblobChann
25e0: 65 6c 20 2a 29 69 6e 73 74 61 6e 63 65 44 61 74  el *)instanceDat
25f0: 61 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 73 65  a;..  switch( se
2600: 65 6b 4d 6f 64 65 20 29 7b 0a 20 20 20 20 63 61  ekMode ){.    ca
2610: 73 65 20 53 45 45 4b 5f 53 45 54 3a 0a 20 20 20  se SEEK_SET:.   
2620: 20 20 20 70 2d 3e 69 53 65 65 6b 20 3d 20 6f 66     p->iSeek = of
2630: 66 73 65 74 3b 0a 20 20 20 20 20 20 62 72 65 61  fset;.      brea
2640: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 45 45 4b  k;.    case SEEK
2650: 5f 43 55 52 3a 0a 20 20 20 20 20 20 70 2d 3e 69  _CUR:.      p->i
2660: 53 65 65 6b 20 2b 3d 20 6f 66 66 73 65 74 3b 0a  Seek += offset;.
2670: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2680: 20 63 61 73 65 20 53 45 45 4b 5f 45 4e 44 3a 0a   case SEEK_END:.
2690: 20 20 20 20 20 20 70 2d 3e 69 53 65 65 6b 20 3d        p->iSeek =
26a0: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79   sqlite3_blob_by
26b0: 74 65 73 28 70 2d 3e 70 42 6c 6f 62 29 20 2b 20  tes(p->pBlob) + 
26c0: 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 62 72  offset;.      br
26d0: 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c  eak;..    defaul
26e0: 74 3a 20 61 73 73 65 72 74 28 21 22 42 61 64 20  t: assert(!"Bad 
26f0: 73 65 65 6b 4d 6f 64 65 22 29 3b 0a 20 20 7d 0a  seekMode");.  }.
2700: 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 53 65  .  return p->iSe
2710: 65 6b 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 76  ek;.}...static v
2720: 6f 69 64 20 69 6e 63 72 62 6c 6f 62 57 61 74 63  oid incrblobWatc
2730: 68 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73  h(ClientData ins
2740: 74 61 6e 63 65 44 61 74 61 2c 20 69 6e 74 20 6d  tanceData, int m
2750: 6f 64 65 29 7b 20 0a 20 20 2f 2a 20 4e 4f 2d 4f  ode){ .  /* NO-O
2760: 50 20 2a 2f 20 0a 7d 0a 73 74 61 74 69 63 20 69  P */ .}.static i
2770: 6e 74 20 69 6e 63 72 62 6c 6f 62 48 61 6e 64 6c  nt incrblobHandl
2780: 65 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73  e(ClientData ins
2790: 74 61 6e 63 65 44 61 74 61 2c 20 69 6e 74 20 64  tanceData, int d
27a0: 69 72 2c 20 43 6c 69 65 6e 74 44 61 74 61 20 2a  ir, ClientData *
27b0: 68 50 74 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  hPtr){.  return 
27c0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 73 74  TCL_ERROR;.}..st
27d0: 61 74 69 63 20 54 63 6c 5f 43 68 61 6e 6e 65 6c  atic Tcl_Channel
27e0: 54 79 70 65 20 49 6e 63 72 62 6c 6f 62 43 68 61  Type IncrblobCha
27f0: 6e 6e 65 6c 54 79 70 65 20 3d 20 7b 0a 20 20 22  nnelType = {.  "
2800: 69 6e 63 72 62 6c 6f 62 22 2c 20 20 20 20 20 20  incrblob",      
2810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2820: 20 20 2f 2a 20 74 79 70 65 4e 61 6d 65 20 20 20    /* typeName   
2830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2840: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 54            */.  T
2850: 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 53 49  CL_CHANNEL_VERSI
2860: 4f 4e 5f 32 2c 20 20 20 20 20 20 20 20 20 20 20  ON_2,           
2870: 20 20 2f 2a 20 76 65 72 73 69 6f 6e 20 20 20 20    /* version    
2880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2890: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 69            */.  i
28a0: 6e 63 72 62 6c 6f 62 43 6c 6f 73 65 2c 20 20 20  ncrblobClose,   
28b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c0: 20 20 2f 2a 20 63 6c 6f 73 65 50 72 6f 63 20 20    /* closeProc  
28d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e0: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 69            */.  i
28f0: 6e 63 72 62 6c 6f 62 49 6e 70 75 74 2c 20 20 20  ncrblobInput,   
2900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2910: 20 20 2f 2a 20 69 6e 70 75 74 50 72 6f 63 20 20    /* inputProc  
2920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2930: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 69            */.  i
2940: 6e 63 72 62 6c 6f 62 4f 75 74 70 75 74 2c 20 20  ncrblobOutput,  
2950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2960: 20 20 2f 2a 20 6f 75 74 70 75 74 50 72 6f 63 20    /* outputProc 
2970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2980: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 69            */.  i
2990: 6e 63 72 62 6c 6f 62 53 65 65 6b 2c 20 20 20 20  ncrblobSeek,    
29a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b0: 20 20 2f 2a 20 73 65 65 6b 50 72 6f 63 20 20 20    /* seekProc   
29c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d0: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 30            */.  0
29e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a00: 20 20 2f 2a 20 73 65 74 4f 70 74 69 6f 6e 50 72    /* setOptionPr
2a10: 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  oc              
2a20: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 30            */.  0
2a30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a50: 20 20 2f 2a 20 67 65 74 4f 70 74 69 6f 6e 50 72    /* getOptionPr
2a60: 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  oc              
2a70: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 69            */.  i
2a80: 6e 63 72 62 6c 6f 62 57 61 74 63 68 2c 20 20 20  ncrblobWatch,   
2a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa0: 20 20 2f 2a 20 77 61 74 63 68 50 72 6f 63 20 28    /* watchProc (
2ab0: 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 29  this is a no-op)
2ac0: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 69            */.  i
2ad0: 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 2c 20 20  ncrblobHandle,  
2ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af0: 20 20 2f 2a 20 67 65 74 48 61 6e 64 6c 65 50 72    /* getHandlePr
2b00: 6f 63 20 28 61 6c 77 61 79 73 20 72 65 74 75 72  oc (always retur
2b10: 6e 73 20 65 72 72 6f 72 29 20 2a 2f 0a 20 20 30  ns error) */.  0
2b20: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b40: 20 20 2f 2a 20 63 6c 6f 73 65 32 50 72 6f 63 20    /* close2Proc 
2b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b60: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 30            */.  0
2b70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b90: 20 20 2f 2a 20 62 6c 6f 63 6b 4d 6f 64 65 50 72    /* blockModePr
2ba0: 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  oc              
2bb0: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 30            */.  0
2bc0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2be0: 20 20 2f 2a 20 66 6c 75 73 68 50 72 6f 63 20 20    /* flushProc  
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c00: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 30            */.  0
2c10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c30: 20 20 2f 2a 20 68 61 6e 64 6c 65 72 50 72 6f 63    /* handlerProc
2c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c50: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 30            */.  0
2c60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c80: 20 20 2f 2a 20 77 69 64 65 53 65 65 6b 50 72 6f    /* wideSeekPro
2c90: 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
2ca0: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 7d 3b 0a            */.};.
2cb0: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
2cc0: 6e 65 77 20 69 6e 63 72 62 6c 6f 62 20 63 68 61  new incrblob cha
2cd0: 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nnel..*/.static 
2ce0: 69 6e 74 20 63 72 65 61 74 65 49 6e 63 72 62 6c  int createIncrbl
2cf0: 6f 62 43 68 61 6e 6e 65 6c 28 0a 20 20 54 63 6c  obChannel(.  Tcl
2d00: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
2d10: 20 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44   .  SqliteDb *pD
2d20: 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  b, .  const char
2d30: 20 2a 7a 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63   *zDb,.  const c
2d40: 68 61 72 20 2a 7a 54 61 62 6c 65 2c 20 0a 20 20  har *zTable, .  
2d50: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
2d60: 75 6d 6e 2c 20 0a 20 20 73 71 6c 69 74 65 5f 69  umn, .  sqlite_i
2d70: 6e 74 36 34 20 69 52 6f 77 2c 0a 20 20 69 6e 74  nt64 iRow,.  int
2d80: 20 69 73 52 65 61 64 6f 6e 6c 79 0a 29 7b 0a 20   isReadonly.){. 
2d90: 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c   IncrblobChannel
2da0: 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   *p;.  sqlite3 *
2db0: 64 62 20 3d 20 70 44 62 2d 3e 64 62 3b 0a 20 20  db = pDb->db;.  
2dc0: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42  sqlite3_blob *pB
2dd0: 6c 6f 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  lob;.  int rc;. 
2de0: 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 54 43 4c   int flags = TCL
2df0: 5f 52 45 41 44 41 42 4c 45 7c 28 69 73 52 65 61  _READABLE|(isRea
2e00: 64 6f 6e 6c 79 20 3f 20 30 20 3a 20 54 43 4c 5f  donly ? 0 : TCL_
2e10: 57 52 49 54 41 42 4c 45 29 3b 0a 0a 20 20 2f 2a  WRITABLE);..  /*
2e20: 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69   This variable i
2e30: 73 20 75 73 65 64 20 74 6f 20 6e 61 6d 65 20 74  s used to name t
2e40: 68 65 20 63 68 61 6e 6e 65 6c 73 3a 20 22 69 6e  he channels: "in
2e50: 63 72 62 6c 6f 62 5f 5b 69 6e 63 72 20 63 6f 75  crblob_[incr cou
2e60: 6e 74 5d 22 20 2a 2f 0a 20 20 73 74 61 74 69 63  nt]" */.  static
2e70: 20 69 6e 74 20 63 6f 75 6e 74 20 3d 20 30 3b 0a   int count = 0;.
2e80: 20 20 63 68 61 72 20 7a 43 68 61 6e 6e 65 6c 5b    char zChannel[
2e90: 36 34 5d 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  64];..  rc = sql
2ea0: 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 64  ite3_blob_open(d
2eb0: 62 2c 20 7a 44 62 2c 20 7a 54 61 62 6c 65 2c 20  b, zDb, zTable, 
2ec0: 7a 43 6f 6c 75 6d 6e 2c 20 69 52 6f 77 2c 20 21  zColumn, iRow, !
2ed0: 69 73 52 65 61 64 6f 6e 6c 79 2c 20 26 70 42 6c  isReadonly, &pBl
2ee0: 6f 62 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ob);.  if( rc!=S
2ef0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2f00: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
2f10: 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71  terp, (char *)sq
2f20: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62  lite3_errmsg(pDb
2f30: 2d 3e 64 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54  ->db), TCL_VOLAT
2f40: 49 4c 45 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ILE);.    return
2f50: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2f60: 0a 20 20 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62  .  p = (Incrblob
2f70: 43 68 61 6e 6e 65 6c 20 2a 29 54 63 6c 5f 41 6c  Channel *)Tcl_Al
2f80: 6c 6f 63 28 73 69 7a 65 6f 66 28 49 6e 63 72 62  loc(sizeof(Incrb
2f90: 6c 6f 62 43 68 61 6e 6e 65 6c 29 29 3b 0a 20 20  lobChannel));.  
2fa0: 70 2d 3e 69 53 65 65 6b 20 3d 20 30 3b 0a 20 20  p->iSeek = 0;.  
2fb0: 70 2d 3e 70 42 6c 6f 62 20 3d 20 70 42 6c 6f 62  p->pBlob = pBlob
2fc0: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ;..  sqlite3_snp
2fd0: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 43 68  rintf(sizeof(zCh
2fe0: 61 6e 6e 65 6c 29 2c 20 7a 43 68 61 6e 6e 65 6c  annel), zChannel
2ff0: 2c 20 22 69 6e 63 72 62 6c 6f 62 5f 25 64 22 2c  , "incrblob_%d",
3000: 20 2b 2b 63 6f 75 6e 74 29 3b 0a 20 20 70 2d 3e   ++count);.  p->
3010: 63 68 61 6e 6e 65 6c 20 3d 20 54 63 6c 5f 43 72  channel = Tcl_Cr
3020: 65 61 74 65 43 68 61 6e 6e 65 6c 28 26 49 6e 63  eateChannel(&Inc
3030: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 54 79 70 65  rblobChannelType
3040: 2c 20 7a 43 68 61 6e 6e 65 6c 2c 20 70 2c 20 66  , zChannel, p, f
3050: 6c 61 67 73 29 3b 0a 20 20 54 63 6c 5f 52 65 67  lags);.  Tcl_Reg
3060: 69 73 74 65 72 43 68 61 6e 6e 65 6c 28 69 6e 74  isterChannel(int
3070: 65 72 70 2c 20 70 2d 3e 63 68 61 6e 6e 65 6c 29  erp, p->channel)
3080: 3b 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65  ;..  /* Link the
3090: 20 6e 65 77 20 63 68 61 6e 6e 65 6c 20 69 6e 74   new channel int
30a0: 6f 20 74 68 65 20 53 71 6c 69 74 65 44 62 2e 70  o the SqliteDb.p
30b0: 49 6e 63 72 62 6c 6f 62 20 6c 69 73 74 2e 20 2a  Incrblob list. *
30c0: 2f 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70  /.  p->pNext = p
30d0: 44 62 2d 3e 70 49 6e 63 72 62 6c 6f 62 3b 0a 20  Db->pIncrblob;. 
30e0: 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20   p->pPrev = 0;. 
30f0: 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b   if( p->pNext ){
3100: 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70  .    p->pNext->p
3110: 50 72 65 76 20 3d 20 70 3b 0a 20 20 7d 0a 20 20  Prev = p;.  }.  
3120: 70 44 62 2d 3e 70 49 6e 63 72 62 6c 6f 62 20 3d  pDb->pIncrblob =
3130: 20 70 3b 0a 20 20 70 2d 3e 70 44 62 20 3d 20 70   p;.  p->pDb = p
3140: 44 62 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 52 65  Db;..  Tcl_SetRe
3150: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
3160: 61 72 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e  ar *)Tcl_GetChan
3170: 6e 65 6c 4e 61 6d 65 28 70 2d 3e 63 68 61 6e 6e  nelName(p->chann
3180: 65 6c 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c  el), TCL_VOLATIL
3190: 45 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  E);.  return TCL
31a0: 5f 4f 4b 3b 0a 7d 0a 23 65 6c 73 65 20 20 2f 2a  _OK;.}.#else  /*
31b0: 20 65 6c 73 65 20 63 6c 61 75 73 65 20 66 6f 72   else clause for
31c0: 20 22 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45   "#ifndef SQLITE
31d0: 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 22 20  _OMIT_INCRBLOB" 
31e0: 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 63 6c 6f  */.  #define clo
31f0: 73 65 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65  seIncrblobChanne
3200: 6c 73 28 70 44 62 29 0a 23 65 6e 64 69 66 0a 0a  ls(pDb).#endif..
3210: 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 61 74 20 74 68  /*.** Look at th
3220: 65 20 73 63 72 69 70 74 20 70 72 65 66 69 78 20  e script prefix 
3230: 69 6e 20 70 43 6d 64 2e 20 20 57 65 20 77 69 6c  in pCmd.  We wil
3240: 6c 20 62 65 20 65 78 65 63 75 74 69 6e 67 20 74  l be executing t
3250: 68 69 73 20 73 63 72 69 70 74 0a 2a 2a 20 61 66  his script.** af
3260: 74 65 72 20 66 69 72 73 74 20 61 70 70 65 6e 64  ter first append
3270: 69 6e 67 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ing one or more 
3280: 61 72 67 75 6d 65 6e 74 73 2e 20 20 54 68 69 73  arguments.  This
3290: 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65   routine analyze
32a0: 73 0a 2a 2a 20 74 68 65 20 73 63 72 69 70 74 20  s.** the script 
32b0: 74 6f 20 73 65 65 20 69 66 20 69 74 20 69 73 20  to see if it is 
32c0: 73 61 66 65 20 74 6f 20 75 73 65 20 54 63 6c 5f  safe to use Tcl_
32d0: 45 76 61 6c 4f 62 6a 76 28 29 20 6f 6e 20 74 68  EvalObjv() on th
32e0: 65 20 73 63 72 69 70 74 0a 2a 2a 20 72 61 74 68  e script.** rath
32f0: 65 72 20 74 68 61 6e 20 74 68 65 20 6d 6f 72 65  er than the more
3300: 20 67 65 6e 65 72 61 6c 20 54 63 6c 5f 45 76 61   general Tcl_Eva
3310: 6c 45 78 28 29 2e 20 20 54 63 6c 5f 45 76 61 6c  lEx().  Tcl_Eval
3320: 4f 62 6a 76 28 29 20 69 73 20 6d 75 63 68 0a 2a  Objv() is much.*
3330: 2a 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  * faster..**.** 
3340: 53 63 72 69 70 74 73 20 74 68 61 74 20 61 72 65  Scripts that are
3350: 20 73 61 66 65 20 74 6f 20 75 73 65 20 77 69 74   safe to use wit
3360: 68 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29  h Tcl_EvalObjv()
3370: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a   consists of a.*
3380: 2a 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20 66  * command name f
3390: 6f 6c 6c 6f 77 65 64 20 62 79 20 7a 65 72 6f 20  ollowed by zero 
33a0: 6f 72 20 6d 6f 72 65 20 61 72 67 75 6d 65 6e 74  or more argument
33b0: 73 20 77 69 74 68 20 6e 6f 20 5b 2e 2e 2e 5d 20  s with no [...] 
33c0: 6f 72 20 24 0a 2a 2a 20 6f 72 20 7b 2e 2e 2e 7d  or $.** or {...}
33d0: 20 6f 72 20 3b 20 74 6f 20 62 65 20 73 65 65 6e   or ; to be seen
33e0: 20 61 6e 79 77 68 65 72 65 2e 20 20 4d 6f 73 74   anywhere.  Most
33f0: 20 63 61 6c 6c 62 61 63 6b 20 73 63 72 69 70 74   callback script
3400: 73 20 63 6f 6e 73 69 73 74 0a 2a 2a 20 6f 66 20  s consist.** of 
3410: 6a 75 73 74 20 61 20 73 69 6e 67 6c 65 20 70 72  just a single pr
3420: 6f 63 65 64 75 72 65 20 6e 61 6d 65 20 61 6e 64  ocedure name and
3430: 20 74 68 65 79 20 6d 65 65 74 20 74 68 69 73 20   they meet this 
3440: 72 65 71 75 69 72 65 6d 65 6e 74 2e 0a 2a 2f 0a  requirement..*/.
3450: 73 74 61 74 69 63 20 69 6e 74 20 73 61 66 65 54  static int safeT
3460: 6f 55 73 65 45 76 61 6c 4f 62 6a 76 28 54 63 6c  oUseEvalObjv(Tcl
3470: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
3480: 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 29 7b   Tcl_Obj *pCmd){
3490: 0a 20 20 2f 2a 20 57 65 20 63 6f 75 6c 64 20 74  .  /* We could t
34a0: 72 79 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69  ry to do somethi
34b0: 6e 67 20 77 69 74 68 20 54 63 6c 5f 50 61 72 73  ng with Tcl_Pars
34c0: 65 28 29 2e 20 20 42 75 74 20 77 65 20 77 69 6c  e().  But we wil
34d0: 6c 20 69 6e 73 74 65 61 64 0a 20 20 2a 2a 20 6a  l instead.  ** j
34e0: 75 73 74 20 64 6f 20 61 20 73 65 61 72 63 68 20  ust do a search 
34f0: 66 6f 72 20 66 6f 72 62 69 64 64 65 6e 20 63 68  for forbidden ch
3500: 61 72 61 63 74 65 72 73 2e 20 20 49 66 20 61 6e  aracters.  If an
3510: 79 20 6f 66 20 74 68 65 20 66 6f 72 62 69 64 64  y of the forbidd
3520: 65 6e 0a 20 20 2a 2a 20 63 68 61 72 61 63 74 65  en.  ** characte
3530: 72 73 20 61 70 70 65 61 72 20 69 6e 20 70 43 6d  rs appear in pCm
3540: 64 2c 20 77 65 20 77 69 6c 6c 20 72 65 70 6f 72  d, we will repor
3550: 74 20 74 68 65 20 73 74 72 69 6e 67 20 61 73 20  t the string as 
3560: 75 6e 73 61 66 65 2e 0a 20 20 2a 2f 0a 20 20 63  unsafe..  */.  c
3570: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
3580: 69 6e 74 20 6e 3b 0a 20 20 7a 20 3d 20 54 63 6c  int n;.  z = Tcl
3590: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
35a0: 6a 28 70 43 6d 64 2c 20 26 6e 29 3b 0a 20 20 77  j(pCmd, &n);.  w
35b0: 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b  hile( n-- > 0 ){
35c0: 0a 20 20 20 20 69 6e 74 20 63 20 3d 20 2a 28 7a  .    int c = *(z
35d0: 2b 2b 29 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d  ++);.    if( c==
35e0: 27 24 27 20 7c 7c 20 63 3d 3d 27 5b 27 20 7c 7c  '$' || c=='[' ||
35f0: 20 63 3d 3d 27 3b 27 20 29 20 72 65 74 75 72 6e   c==';' ) return
3600: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
3610: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e   1;.}../*.** Fin
3620: 64 20 61 6e 20 53 71 6c 46 75 6e 63 20 73 74 72  d an SqlFunc str
3630: 75 63 74 75 72 65 20 77 69 74 68 20 74 68 65 20  ucture with the 
3640: 67 69 76 65 6e 20 6e 61 6d 65 2e 20 20 4f 72 20  given name.  Or 
3650: 63 72 65 61 74 65 20 61 20 6e 65 77 0a 2a 2a 20  create a new.** 
3660: 6f 6e 65 20 69 66 20 61 6e 20 65 78 69 73 74 69  one if an existi
3670: 6e 67 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 62 65  ng one cannot be
3680: 20 66 6f 75 6e 64 2e 20 20 52 65 74 75 72 6e 20   found.  Return 
3690: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
36a0: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  .** structure..*
36b0: 2f 0a 73 74 61 74 69 63 20 53 71 6c 46 75 6e 63  /.static SqlFunc
36c0: 20 2a 66 69 6e 64 53 71 6c 46 75 6e 63 28 53 71   *findSqlFunc(Sq
36d0: 6c 69 74 65 44 62 20 2a 70 44 62 2c 20 63 6f 6e  liteDb *pDb, con
36e0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
36f0: 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70 2c 20 2a  .  SqlFunc *p, *
3700: 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d  pNew;.  int nNam
3710: 65 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 4e 61  e = strlen30(zNa
3720: 6d 65 29 3b 0a 20 20 70 4e 65 77 20 3d 20 28 53  me);.  pNew = (S
3730: 71 6c 46 75 6e 63 2a 29 54 63 6c 5f 41 6c 6c 6f  qlFunc*)Tcl_Allo
3740: 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  c( sizeof(*pNew)
3750: 20 2b 20 6e 4e 61 6d 65 20 2b 20 31 20 29 3b 0a   + nName + 1 );.
3760: 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20    pNew->zName = 
3770: 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b  (char*)&pNew[1];
3780: 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e  .  memcpy(pNew->
3790: 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e  zName, zName, nN
37a0: 61 6d 65 2b 31 29 3b 0a 20 20 66 6f 72 28 70 3d  ame+1);.  for(p=
37b0: 70 44 62 2d 3e 70 46 75 6e 63 3b 20 70 3b 20 70  pDb->pFunc; p; p
37c0: 3d 70 2d 3e 70 4e 65 78 74 29 7b 20 0a 20 20 20  =p->pNext){ .   
37d0: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
37e0: 69 63 6d 70 28 70 2d 3e 7a 4e 61 6d 65 2c 20 70  icmp(p->zName, p
37f0: 4e 65 77 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29  New->zName)==0 )
3800: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65  {.      Tcl_Free
3810: 28 28 63 68 61 72 2a 29 70 4e 65 77 29 3b 0a 20  ((char*)pNew);. 
3820: 20 20 20 20 20 72 65 74 75 72 6e 20 70 3b 0a 20       return p;. 
3830: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e 65 77 2d     }.  }.  pNew-
3840: 3e 69 6e 74 65 72 70 20 3d 20 70 44 62 2d 3e 69  >interp = pDb->i
3850: 6e 74 65 72 70 3b 0a 20 20 70 4e 65 77 2d 3e 70  nterp;.  pNew->p
3860: 44 62 20 3d 20 70 44 62 3b 0a 20 20 70 4e 65 77  Db = pDb;.  pNew
3870: 2d 3e 70 53 63 72 69 70 74 20 3d 20 30 3b 0a 20  ->pScript = 0;. 
3880: 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70   pNew->pNext = p
3890: 44 62 2d 3e 70 46 75 6e 63 3b 0a 20 20 70 44 62  Db->pFunc;.  pDb
38a0: 2d 3e 70 46 75 6e 63 20 3d 20 70 4e 65 77 3b 0a  ->pFunc = pNew;.
38b0: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
38c0: 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 73  ../*.** Free a s
38d0: 69 6e 67 6c 65 20 53 71 6c 50 72 65 70 61 72 65  ingle SqlPrepare
38e0: 64 53 74 6d 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f  dStmt object..*/
38f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 62 46  .static void dbF
3900: 72 65 65 53 74 6d 74 28 53 71 6c 50 72 65 70 61  reeStmt(SqlPrepa
3910: 72 65 64 53 74 6d 74 20 2a 70 53 74 6d 74 29 7b  redStmt *pStmt){
3920: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
3930: 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65  EST.  if( sqlite
3940: 33 5f 73 71 6c 28 70 53 74 6d 74 2d 3e 70 53 74  3_sql(pStmt->pSt
3950: 6d 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63  mt)==0 ){.    Tc
3960: 6c 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 70  l_Free((char *)p
3970: 53 74 6d 74 2d 3e 7a 53 71 6c 29 3b 0a 20 20 7d  Stmt->zSql);.  }
3980: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
3990: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
39a0: 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 54 63 6c 5f  ->pStmt);.  Tcl_
39b0: 46 72 65 65 28 28 63 68 61 72 20 2a 29 70 53 74  Free((char *)pSt
39c0: 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  mt);.}../*.** Fi
39d0: 6e 61 6c 69 7a 65 20 61 6e 64 20 66 72 65 65 20  nalize and free 
39e0: 61 20 6c 69 73 74 20 6f 66 20 70 72 65 70 61 72  a list of prepar
39f0: 65 64 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2f  ed statements.*/
3a00: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 6c 75  .static void flu
3a10: 73 68 53 74 6d 74 43 61 63 68 65 28 53 71 6c 69  shStmtCache(Sqli
3a20: 74 65 44 62 20 2a 70 44 62 29 7b 0a 20 20 53 71  teDb *pDb){.  Sq
3a30: 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70  lPreparedStmt *p
3a40: 50 72 65 53 74 6d 74 3b 0a 20 20 53 71 6c 50 72  PreStmt;.  SqlPr
3a50: 65 70 61 72 65 64 53 74 6d 74 20 2a 70 4e 65 78  eparedStmt *pNex
3a60: 74 3b 0a 0a 20 20 66 6f 72 28 70 50 72 65 53 74  t;..  for(pPreSt
3a70: 6d 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69  mt = pDb->stmtLi
3a80: 73 74 3b 20 70 50 72 65 53 74 6d 74 3b 20 70 50  st; pPreStmt; pP
3a90: 72 65 53 74 6d 74 3d 70 4e 65 78 74 29 7b 0a 20  reStmt=pNext){. 
3aa0: 20 20 20 70 4e 65 78 74 20 3d 20 70 50 72 65 53     pNext = pPreS
3ab0: 74 6d 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  tmt->pNext;.    
3ac0: 64 62 46 72 65 65 53 74 6d 74 28 70 50 72 65 53  dbFreeStmt(pPreS
3ad0: 74 6d 74 29 3b 0a 20 20 7d 0a 20 20 70 44 62 2d  tmt);.  }.  pDb-
3ae0: 3e 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70 44  >nStmt = 0;.  pD
3af0: 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20 30 3b  b->stmtLast = 0;
3b00: 0a 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74  .  pDb->stmtList
3b10: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   = 0;.}../*.** T
3b20: 43 4c 20 63 61 6c 6c 73 20 74 68 69 73 20 70 72  CL calls this pr
3b30: 6f 63 65 64 75 72 65 20 77 68 65 6e 20 61 6e 20  ocedure when an 
3b40: 73 71 6c 69 74 65 33 20 64 61 74 61 62 61 73 65  sqlite3 database
3b50: 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 64   command is.** d
3b60: 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  eleted..*/.stati
3b70: 63 20 76 6f 69 64 20 44 62 44 65 6c 65 74 65 43  c void DbDeleteC
3b80: 6d 64 28 76 6f 69 64 20 2a 64 62 29 7b 0a 20 20  md(void *db){.  
3b90: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20  SqliteDb *pDb = 
3ba0: 28 53 71 6c 69 74 65 44 62 2a 29 64 62 3b 0a 20  (SqliteDb*)db;. 
3bb0: 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28   flushStmtCache(
3bc0: 70 44 62 29 3b 0a 20 20 63 6c 6f 73 65 49 6e 63  pDb);.  closeInc
3bd0: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 73 28 70 44  rblobChannels(pD
3be0: 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6c  b);.  sqlite3_cl
3bf0: 6f 73 65 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20  ose(pDb->db);.  
3c00: 77 68 69 6c 65 28 20 70 44 62 2d 3e 70 46 75 6e  while( pDb->pFun
3c10: 63 20 29 7b 0a 20 20 20 20 53 71 6c 46 75 6e 63  c ){.    SqlFunc
3c20: 20 2a 70 46 75 6e 63 20 3d 20 70 44 62 2d 3e 70   *pFunc = pDb->p
3c30: 46 75 6e 63 3b 0a 20 20 20 20 70 44 62 2d 3e 70  Func;.    pDb->p
3c40: 46 75 6e 63 20 3d 20 70 46 75 6e 63 2d 3e 70 4e  Func = pFunc->pN
3c50: 65 78 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ext;.    assert(
3c60: 20 70 46 75 6e 63 2d 3e 70 44 62 3d 3d 70 44 62   pFunc->pDb==pDb
3c70: 20 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72   );.    Tcl_Decr
3c80: 52 65 66 43 6f 75 6e 74 28 70 46 75 6e 63 2d 3e  RefCount(pFunc->
3c90: 70 53 63 72 69 70 74 29 3b 0a 20 20 20 20 54 63  pScript);.    Tc
3ca0: 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 46  l_Free((char*)pF
3cb0: 75 6e 63 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  unc);.  }.  whil
3cc0: 65 28 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65  e( pDb->pCollate
3cd0: 20 29 7b 0a 20 20 20 20 53 71 6c 43 6f 6c 6c 61   ){.    SqlColla
3ce0: 74 65 20 2a 70 43 6f 6c 6c 61 74 65 20 3d 20 70  te *pCollate = p
3cf0: 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 3b 0a 20 20  Db->pCollate;.  
3d00: 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 20    pDb->pCollate 
3d10: 3d 20 70 43 6f 6c 6c 61 74 65 2d 3e 70 4e 65 78  = pCollate->pNex
3d20: 74 3b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28  t;.    Tcl_Free(
3d30: 28 63 68 61 72 2a 29 70 43 6f 6c 6c 61 74 65 29  (char*)pCollate)
3d40: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d  ;.  }.  if( pDb-
3d50: 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20 20 54 63  >zBusy ){.    Tc
3d60: 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 42 75 73  l_Free(pDb->zBus
3d70: 79 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44  y);.  }.  if( pD
3d80: 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20 20  b->zTrace ){.   
3d90: 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
3da0: 54 72 61 63 65 29 3b 0a 20 20 7d 0a 20 20 69 66  Trace);.  }.  if
3db0: 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20  ( pDb->zProfile 
3dc0: 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28  ){.    Tcl_Free(
3dd0: 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 29 3b 0a  pDb->zProfile);.
3de0: 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a    }.  if( pDb->z
3df0: 41 75 74 68 20 29 7b 0a 20 20 20 20 54 63 6c 5f  Auth ){.    Tcl_
3e00: 46 72 65 65 28 70 44 62 2d 3e 7a 41 75 74 68 29  Free(pDb->zAuth)
3e10: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d  ;.  }.  if( pDb-
3e20: 3e 7a 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 54 63  >zNull ){.    Tc
3e30: 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 4e 75 6c  l_Free(pDb->zNul
3e40: 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44  l);.  }.  if( pD
3e50: 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b 20 29  b->pUpdateHook )
3e60: 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  {.    Tcl_DecrRe
3e70: 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 55 70 64  fCount(pDb->pUpd
3e80: 61 74 65 48 6f 6f 6b 29 3b 0a 20 20 7d 0a 20 20  ateHook);.  }.  
3e90: 69 66 28 20 70 44 62 2d 3e 70 50 72 65 55 70 64  if( pDb->pPreUpd
3ea0: 61 74 65 48 6f 6f 6b 20 29 7b 0a 20 20 20 20 54  ateHook ){.    T
3eb0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
3ec0: 70 44 62 2d 3e 70 50 72 65 55 70 64 61 74 65 48  pDb->pPreUpdateH
3ed0: 6f 6f 6b 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ook);.  }.  if( 
3ee0: 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f  pDb->pRollbackHo
3ef0: 6f 6b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65  ok ){.    Tcl_De
3f00: 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e  crRefCount(pDb->
3f10: 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 29 3b 0a  pRollbackHook);.
3f20: 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 70    }.  if( pDb->p
3f30: 57 61 6c 48 6f 6f 6b 20 29 7b 0a 20 20 20 20 54  WalHook ){.    T
3f40: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
3f50: 70 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 29 3b 0a  pDb->pWalHook);.
3f60: 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 70    }.  if( pDb->p
3f70: 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 20 29 7b  CollateNeeded ){
3f80: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
3f90: 43 6f 75 6e 74 28 70 44 62 2d 3e 70 43 6f 6c 6c  Count(pDb->pColl
3fa0: 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 7d 0a  ateNeeded);.  }.
3fb0: 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72    Tcl_Free((char
3fc0: 2a 29 70 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  *)pDb);.}../*.**
3fd0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
3fe0: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 64   called when a d
3ff0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
4000: 6c 6f 63 6b 65 64 20 77 68 69 6c 65 20 74 72 79  locked while try
4010: 69 6e 67 0a 2a 2a 20 74 6f 20 65 78 65 63 75 74  ing.** to execut
4020: 65 20 53 51 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63  e SQL..*/.static
4030: 20 69 6e 74 20 44 62 42 75 73 79 48 61 6e 64 6c   int DbBusyHandl
4040: 65 72 28 76 6f 69 64 20 2a 63 64 2c 20 69 6e 74  er(void *cd, int
4050: 20 6e 54 72 69 65 73 29 7b 0a 20 20 53 71 6c 69   nTries){.  Sqli
4060: 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c  teDb *pDb = (Sql
4070: 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69 6e 74  iteDb*)cd;.  int
4080: 20 72 63 3b 0a 20 20 63 68 61 72 20 7a 56 61 6c   rc;.  char zVal
4090: 5b 33 30 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33  [30];..  sqlite3
40a0: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
40b0: 28 7a 56 61 6c 29 2c 20 7a 56 61 6c 2c 20 22 25  (zVal), zVal, "%
40c0: 64 22 2c 20 6e 54 72 69 65 73 29 3b 0a 20 20 72  d", nTries);.  r
40d0: 63 20 3d 20 54 63 6c 5f 56 61 72 45 76 61 6c 28  c = Tcl_VarEval(
40e0: 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62  pDb->interp, pDb
40f0: 2d 3e 7a 42 75 73 79 2c 20 22 20 22 2c 20 7a 56  ->zBusy, " ", zV
4100: 61 6c 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  al, (char*)0);. 
4110: 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20   if( rc!=TCL_OK 
4120: 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47 65 74 53  || atoi(Tcl_GetS
4130: 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44 62 2d  tringResult(pDb-
4140: 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a 20 20 20  >interp)) ){.   
4150: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
4160: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 23 69   return 1;.}..#i
4170: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
4180: 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42  T_PROGRESS_CALLB
4190: 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  ACK./*.** This r
41a0: 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65  outine is invoke
41b0: 64 20 61 73 20 74 68 65 20 27 70 72 6f 67 72 65  d as the 'progre
41c0: 73 73 20 63 61 6c 6c 62 61 63 6b 27 20 66 6f 72  ss callback' for
41d0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
41e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 50  /.static int DbP
41f0: 72 6f 67 72 65 73 73 48 61 6e 64 6c 65 72 28 76  rogressHandler(v
4200: 6f 69 64 20 2a 63 64 29 7b 0a 20 20 53 71 6c 69  oid *cd){.  Sqli
4210: 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c  teDb *pDb = (Sql
4220: 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69 6e 74  iteDb*)cd;.  int
4230: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
4240: 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29  pDb->zProgress )
4250: 3b 0a 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61  ;.  rc = Tcl_Eva
4260: 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70  l(pDb->interp, p
4270: 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 29 3b 0a  Db->zProgress);.
4280: 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b    if( rc!=TCL_OK
4290: 20 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47 65 74   || atoi(Tcl_Get
42a0: 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44 62  StringResult(pDb
42b0: 2d 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a 20 20  ->interp)) ){.  
42c0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
42d0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
42e0: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
42f0: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a  LITE_OMIT_TRACE.
4300: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
4310: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
4320: 74 68 65 20 53 51 4c 69 74 65 20 74 72 61 63 65  the SQLite trace
4330: 20 68 61 6e 64 6c 65 72 20 77 68 65 6e 65 76 65   handler wheneve
4340: 72 20 61 20 6e 65 77 0a 2a 2a 20 62 6c 6f 63 6b  r a new.** block
4350: 20 6f 66 20 53 51 4c 20 69 73 20 65 78 65 63 75   of SQL is execu
4360: 74 65 64 2e 20 20 54 68 65 20 54 43 4c 20 73 63  ted.  The TCL sc
4370: 72 69 70 74 20 69 6e 20 70 44 62 2d 3e 7a 54 72  ript in pDb->zTr
4380: 61 63 65 20 69 73 20 65 78 65 63 75 74 65 64 2e  ace is executed.
4390: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
43a0: 44 62 54 72 61 63 65 48 61 6e 64 6c 65 72 28 76  DbTraceHandler(v
43b0: 6f 69 64 20 2a 63 64 2c 20 63 6f 6e 73 74 20 63  oid *cd, const c
43c0: 68 61 72 20 2a 7a 53 71 6c 29 7b 0a 20 20 53 71  har *zSql){.  Sq
43d0: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53  liteDb *pDb = (S
43e0: 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 54  qliteDb*)cd;.  T
43f0: 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a  cl_DString str;.
4400: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e  .  Tcl_DStringIn
4410: 69 74 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f  it(&str);.  Tcl_
4420: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 73  DStringAppend(&s
4430: 74 72 2c 20 70 44 62 2d 3e 7a 54 72 61 63 65 2c  tr, pDb->zTrace,
4440: 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72   -1);.  Tcl_DStr
4450: 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ingAppendElement
4460: 28 26 73 74 72 2c 20 7a 53 71 6c 29 3b 0a 20 20  (&str, zSql);.  
4470: 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69 6e  Tcl_Eval(pDb->in
4480: 74 65 72 70 2c 20 54 63 6c 5f 44 53 74 72 69 6e  terp, Tcl_DStrin
4490: 67 56 61 6c 75 65 28 26 73 74 72 29 29 3b 0a 20  gValue(&str));. 
44a0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
44b0: 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f 52 65  (&str);.  Tcl_Re
44c0: 73 65 74 52 65 73 75 6c 74 28 70 44 62 2d 3e 69  setResult(pDb->i
44d0: 6e 74 65 72 70 29 3b 0a 7d 0a 23 65 6e 64 69 66  nterp);.}.#endif
44e0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
44f0: 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a  _OMIT_TRACE./*.*
4500: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
4510: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
4520: 53 51 4c 69 74 65 20 70 72 6f 66 69 6c 65 20 68  SQLite profile h
4530: 61 6e 64 6c 65 72 20 61 66 74 65 72 20 61 20 73  andler after a s
4540: 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 53 51 4c 20  tatement.** SQL 
4550: 68 61 73 20 65 78 65 63 75 74 65 64 2e 20 20 54  has executed.  T
4560: 68 65 20 54 43 4c 20 73 63 72 69 70 74 20 69 6e  he TCL script in
4570: 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 69   pDb->zProfile i
4580: 73 20 65 76 61 6c 75 61 74 65 64 2e 0a 2a 2f 0a  s evaluated..*/.
4590: 73 74 61 74 69 63 20 76 6f 69 64 20 44 62 50 72  static void DbPr
45a0: 6f 66 69 6c 65 48 61 6e 64 6c 65 72 28 76 6f 69  ofileHandler(voi
45b0: 64 20 2a 63 64 2c 20 63 6f 6e 73 74 20 63 68 61  d *cd, const cha
45c0: 72 20 2a 7a 53 71 6c 2c 20 73 71 6c 69 74 65 5f  r *zSql, sqlite_
45d0: 75 69 6e 74 36 34 20 74 6d 29 7b 0a 20 20 53 71  uint64 tm){.  Sq
45e0: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53  liteDb *pDb = (S
45f0: 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 54  qliteDb*)cd;.  T
4600: 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a  cl_DString str;.
4610: 20 20 63 68 61 72 20 7a 54 6d 5b 31 30 30 5d 3b    char zTm[100];
4620: 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ..  sqlite3_snpr
4630: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 54 6d 29  intf(sizeof(zTm)
4640: 2d 31 2c 20 7a 54 6d 2c 20 22 25 6c 6c 64 22 2c  -1, zTm, "%lld",
4650: 20 74 6d 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72   tm);.  Tcl_DStr
4660: 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20  ingInit(&str);. 
4670: 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65   Tcl_DStringAppe
4680: 6e 64 28 26 73 74 72 2c 20 70 44 62 2d 3e 7a 50  nd(&str, pDb->zP
4690: 72 6f 66 69 6c 65 2c 20 2d 31 29 3b 0a 20 20 54  rofile, -1);.  T
46a0: 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64  cl_DStringAppend
46b0: 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 53  Element(&str, zS
46c0: 71 6c 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  ql);.  Tcl_DStri
46d0: 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  ngAppendElement(
46e0: 26 73 74 72 2c 20 7a 54 6d 29 3b 0a 20 20 54 63  &str, zTm);.  Tc
46f0: 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65  l_Eval(pDb->inte
4700: 72 70 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56  rp, Tcl_DStringV
4710: 61 6c 75 65 28 26 73 74 72 29 29 3b 0a 20 20 54  alue(&str));.  T
4720: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
4730: 73 74 72 29 3b 0a 20 20 54 63 6c 5f 52 65 73 65  str);.  Tcl_Rese
4740: 74 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74  tResult(pDb->int
4750: 65 72 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  erp);.}.#endif..
4760: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
4770: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
4780: 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  n a transaction 
4790: 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 54  is committed.  T
47a0: 68 65 0a 2a 2a 20 54 43 4c 20 73 63 72 69 70 74  he.** TCL script
47b0: 20 69 6e 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74   in pDb->zCommit
47c0: 20 69 73 20 65 78 65 63 75 74 65 64 2e 20 20 49   is executed.  I
47d0: 66 20 69 74 20 72 65 74 75 72 6e 73 20 6e 6f 6e  f it returns non
47e0: 2d 7a 65 72 6f 20 6f 72 0a 2a 2a 20 69 66 20 69  -zero or.** if i
47f0: 74 20 74 68 72 6f 77 73 20 61 6e 20 65 78 63 65  t throws an exce
4800: 70 74 69 6f 6e 2c 20 74 68 65 20 74 72 61 6e 73  ption, the trans
4810: 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
4820: 20 62 61 63 6b 20 69 6e 73 74 65 61 64 0a 2a 2a   back instead.**
4830: 20 6f 66 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74   of being commit
4840: 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ted..*/.static i
4850: 6e 74 20 44 62 43 6f 6d 6d 69 74 48 61 6e 64 6c  nt DbCommitHandl
4860: 65 72 28 76 6f 69 64 20 2a 63 64 29 7b 0a 20 20  er(void *cd){.  
4870: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20  SqliteDb *pDb = 
4880: 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20  (SqliteDb*)cd;. 
4890: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d   int rc;..  rc =
48a0: 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69   Tcl_Eval(pDb->i
48b0: 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 43 6f 6d  nterp, pDb->zCom
48c0: 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  mit);.  if( rc!=
48d0: 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28 54  TCL_OK || atoi(T
48e0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
48f0: 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 29  lt(pDb->interp))
4900: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
4910: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
4920: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
4930: 20 44 62 52 6f 6c 6c 62 61 63 6b 48 61 6e 64 6c   DbRollbackHandl
4940: 65 72 28 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44  er(void *clientD
4950: 61 74 61 29 7b 0a 20 20 53 71 6c 69 74 65 44 62  ata){.  SqliteDb
4960: 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44   *pDb = (SqliteD
4970: 62 2a 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20  b*)clientData;. 
4980: 20 61 73 73 65 72 74 28 70 44 62 2d 3e 70 52 6f   assert(pDb->pRo
4990: 6c 6c 62 61 63 6b 48 6f 6f 6b 29 3b 0a 20 20 69  llbackHook);.  i
49a0: 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 45  f( TCL_OK!=Tcl_E
49b0: 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69 6e  valObjEx(pDb->in
49c0: 74 65 72 70 2c 20 70 44 62 2d 3e 70 52 6f 6c 6c  terp, pDb->pRoll
49d0: 62 61 63 6b 48 6f 6f 6b 2c 20 30 29 20 29 7b 0a  backHook, 0) ){.
49e0: 20 20 20 20 54 63 6c 5f 42 61 63 6b 67 72 6f 75      Tcl_Backgrou
49f0: 6e 64 45 72 72 6f 72 28 70 44 62 2d 3e 69 6e 74  ndError(pDb->int
4a00: 65 72 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  erp);.  }.}../*.
4a10: 2a 2a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72  ** This procedur
4a20: 65 20 68 61 6e 64 6c 65 73 20 77 61 6c 5f 68 6f  e handles wal_ho
4a30: 6f 6b 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 2a 2f  ok callbacks..*/
4a40: 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 57 61  .static int DbWa
4a50: 6c 48 61 6e 64 6c 65 72 28 0a 20 20 76 6f 69 64  lHandler(.  void
4a60: 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c 20 0a 20   *clientData, . 
4a70: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20   sqlite3 *db, . 
4a80: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
4a90: 2c 20 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79 0a  , .  int nEntry.
4aa0: 29 7b 0a 20 20 69 6e 74 20 72 65 74 20 3d 20 53  ){.  int ret = S
4ab0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 54 63 6c 5f  QLITE_OK;.  Tcl_
4ac0: 4f 62 6a 20 2a 70 3b 0a 20 20 53 71 6c 69 74 65  Obj *p;.  Sqlite
4ad0: 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74  Db *pDb = (Sqlit
4ae0: 65 44 62 2a 29 63 6c 69 65 6e 74 44 61 74 61 3b  eDb*)clientData;
4af0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
4b00: 6e 74 65 72 70 20 3d 20 70 44 62 2d 3e 69 6e 74  nterp = pDb->int
4b10: 65 72 70 3b 0a 20 20 61 73 73 65 72 74 28 70 44  erp;.  assert(pD
4b20: 62 2d 3e 70 57 61 6c 48 6f 6f 6b 29 3b 0a 0a 20  b->pWalHook);.. 
4b30: 20 61 73 73 65 72 74 28 20 64 62 3d 3d 70 44 62   assert( db==pDb
4b40: 2d 3e 64 62 20 29 3b 0a 20 20 70 20 3d 20 54 63  ->db );.  p = Tc
4b50: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 70  l_DuplicateObj(p
4b60: 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 29 3b 0a 20  Db->pWalHook);. 
4b70: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
4b80: 74 28 70 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  t(p);.  Tcl_List
4b90: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
4ba0: 28 69 6e 74 65 72 70 2c 20 70 2c 20 54 63 6c 5f  (interp, p, Tcl_
4bb0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 44 62  NewStringObj(zDb
4bc0: 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
4bd0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
4be0: 6e 74 28 69 6e 74 65 72 70 2c 20 70 2c 20 54 63  nt(interp, p, Tc
4bf0: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 45 6e 74  l_NewIntObj(nEnt
4c00: 72 79 29 29 3b 0a 20 20 69 66 28 20 54 43 4c 5f  ry));.  if( TCL_
4c10: 4f 4b 21 3d 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  OK!=Tcl_EvalObjE
4c20: 78 28 69 6e 74 65 72 70 2c 20 70 2c 20 30 29 20  x(interp, p, 0) 
4c30: 0a 20 20 20 7c 7c 20 54 43 4c 5f 4f 4b 21 3d 54  .   || TCL_OK!=T
4c40: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
4c50: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
4c60: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
4c70: 29 2c 20 26 72 65 74 29 0a 20 20 29 7b 0a 20 20  ), &ret).  ){.  
4c80: 20 20 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64    Tcl_Background
4c90: 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 20  Error(interp);. 
4ca0: 20 7d 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66   }.  Tcl_DecrRef
4cb0: 43 6f 75 6e 74 28 70 29 3b 0a 0a 20 20 72 65 74  Count(p);..  ret
4cc0: 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 23 69 66 20  urn ret;.}..#if 
4cd0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
4ce0: 45 53 54 29 20 26 26 20 64 65 66 69 6e 65 64 28  EST) && defined(
4cf0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e  SQLITE_ENABLE_UN
4d00: 4c 4f 43 4b 5f 4e 4f 54 49 46 59 29 0a 73 74 61  LOCK_NOTIFY).sta
4d10: 74 69 63 20 76 6f 69 64 20 73 65 74 54 65 73 74  tic void setTest
4d20: 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 56 61 72 73  UnlockNotifyVars
4d30: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
4d40: 65 72 70 2c 20 69 6e 74 20 69 41 72 67 2c 20 69  erp, int iArg, i
4d50: 6e 74 20 6e 41 72 67 29 7b 0a 20 20 63 68 61 72  nt nArg){.  char
4d60: 20 7a 42 75 66 5b 36 34 5d 3b 0a 20 20 73 71 6c   zBuf[64];.  sql
4d70: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
4d80: 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66  zeof(zBuf), zBuf
4d90: 2c 20 22 25 64 22 2c 20 69 41 72 67 29 3b 0a 20  , "%d", iArg);. 
4da0: 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65   Tcl_SetVar(inte
4db0: 72 70 2c 20 22 73 71 6c 69 74 65 5f 75 6e 6c 6f  rp, "sqlite_unlo
4dc0: 63 6b 5f 6e 6f 74 69 66 79 5f 61 72 67 22 2c 20  ck_notify_arg", 
4dd0: 7a 42 75 66 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c  zBuf, TCL_GLOBAL
4de0: 5f 4f 4e 4c 59 29 3b 0a 20 20 73 71 6c 69 74 65  _ONLY);.  sqlite
4df0: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
4e00: 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22  f(zBuf), zBuf, "
4e10: 25 64 22 2c 20 6e 41 72 67 29 3b 0a 20 20 54 63  %d", nArg);.  Tc
4e20: 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c  l_SetVar(interp,
4e30: 20 22 73 71 6c 69 74 65 5f 75 6e 6c 6f 63 6b 5f   "sqlite_unlock_
4e40: 6e 6f 74 69 66 79 5f 61 72 67 63 6f 75 6e 74 22  notify_argcount"
4e50: 2c 20 7a 42 75 66 2c 20 54 43 4c 5f 47 4c 4f 42  , zBuf, TCL_GLOB
4e60: 41 4c 5f 4f 4e 4c 59 29 3b 0a 7d 0a 23 65 6c 73  AL_ONLY);.}.#els
4e70: 65 0a 23 20 64 65 66 69 6e 65 20 73 65 74 54 65  e.# define setTe
4e80: 73 74 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 56 61  stUnlockNotifyVa
4e90: 72 73 28 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66  rs(x,y,z).#endif
4ea0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
4eb0: 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f  ENABLE_UNLOCK_NO
4ec0: 54 49 46 59 0a 73 74 61 74 69 63 20 76 6f 69 64  TIFY.static void
4ed0: 20 44 62 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 28   DbUnlockNotify(
4ee0: 76 6f 69 64 20 2a 2a 61 70 41 72 67 2c 20 69 6e  void **apArg, in
4ef0: 74 20 6e 41 72 67 29 7b 0a 20 20 69 6e 74 20 69  t nArg){.  int i
4f00: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
4f10: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  Arg; i++){.    c
4f20: 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d  onst int flags =
4f30: 20 28 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41   (TCL_EVAL_GLOBA
4f40: 4c 7c 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43  L|TCL_EVAL_DIREC
4f50: 54 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 44 62  T);.    SqliteDb
4f60: 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44   *pDb = (SqliteD
4f70: 62 20 2a 29 61 70 41 72 67 5b 69 5d 3b 0a 20 20  b *)apArg[i];.  
4f80: 20 20 73 65 74 54 65 73 74 55 6e 6c 6f 63 6b 4e    setTestUnlockN
4f90: 6f 74 69 66 79 56 61 72 73 28 70 44 62 2d 3e 69  otifyVars(pDb->i
4fa0: 6e 74 65 72 70 2c 20 69 2c 20 6e 41 72 67 29 3b  nterp, i, nArg);
4fb0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 44 62  .    assert( pDb
4fc0: 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 29  ->pUnlockNotify)
4fd0: 3b 0a 20 20 20 20 54 63 6c 5f 45 76 61 6c 4f 62  ;.    Tcl_EvalOb
4fe0: 6a 45 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c  jEx(pDb->interp,
4ff0: 20 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74   pDb->pUnlockNot
5000: 69 66 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  ify, flags);.   
5010: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
5020: 74 28 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f  t(pDb->pUnlockNo
5030: 74 69 66 79 29 3b 0a 20 20 20 20 70 44 62 2d 3e  tify);.    pDb->
5040: 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 20 3d 20  pUnlockNotify = 
5050: 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  0;.  }.}.#endif.
5060: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
5070: 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f  NABLE_PREUPDATE_
5080: 48 4f 4f 4b 0a 2f 2a 0a 2a 2a 20 50 72 65 2d 75  HOOK./*.** Pre-u
5090: 70 64 61 74 65 20 68 6f 6f 6b 20 63 61 6c 6c 62  pdate hook callb
50a0: 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ack..*/.static v
50b0: 6f 69 64 20 44 62 50 72 65 55 70 64 61 74 65 48  oid DbPreUpdateH
50c0: 61 6e 64 6c 65 72 28 0a 20 20 76 6f 69 64 20 2a  andler(.  void *
50d0: 70 2c 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  p, .  sqlite3 *d
50e0: 62 2c 0a 20 20 69 6e 74 20 6f 70 2c 0a 20 20 63  b,.  int op,.  c
50f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20  onst char *zDb, 
5100: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
5110: 54 62 6c 2c 20 0a 20 20 73 71 6c 69 74 65 5f 69  Tbl, .  sqlite_i
5120: 6e 74 36 34 20 69 4b 65 79 31 2c 0a 20 20 73 71  nt64 iKey1,.  sq
5130: 6c 69 74 65 5f 69 6e 74 36 34 20 69 4b 65 79 32  lite_int64 iKey2
5140: 0a 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  .){.  SqliteDb *
5150: 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 20  pDb = (SqliteDb 
5160: 2a 29 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  *)p;.  Tcl_Obj *
5170: 70 43 6d 64 3b 0a 20 20 73 74 61 74 69 63 20 63  pCmd;.  static c
5180: 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 53 74 72  onst char *azStr
5190: 5b 5d 20 3d 20 7b 22 44 45 4c 45 54 45 22 2c 20  [] = {"DELETE", 
51a0: 22 49 4e 53 45 52 54 22 2c 20 22 55 50 44 41 54  "INSERT", "UPDAT
51b0: 45 22 7d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  E"};..  assert( 
51c0: 28 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2d 31  (SQLITE_DELETE-1
51d0: 29 2f 39 20 3d 3d 20 30 20 29 3b 0a 20 20 61 73  )/9 == 0 );.  as
51e0: 73 65 72 74 28 20 28 53 51 4c 49 54 45 5f 49 4e  sert( (SQLITE_IN
51f0: 53 45 52 54 2d 31 29 2f 39 20 3d 3d 20 31 20 29  SERT-1)/9 == 1 )
5200: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 53 51 4c  ;.  assert( (SQL
5210: 49 54 45 5f 55 50 44 41 54 45 2d 31 29 2f 39 20  ITE_UPDATE-1)/9 
5220: 3d 3d 20 32 20 29 3b 0a 20 20 61 73 73 65 72 74  == 2 );.  assert
5230: 28 20 70 44 62 2d 3e 70 50 72 65 55 70 64 61 74  ( pDb->pPreUpdat
5240: 65 48 6f 6f 6b 20 29 3b 0a 20 20 61 73 73 65 72  eHook );.  asser
5250: 74 28 20 64 62 3d 3d 70 44 62 2d 3e 64 62 20 29  t( db==pDb->db )
5260: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d  ;.  assert( op==
5270: 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 20 7c 7c  SQLITE_INSERT ||
5280: 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41   op==SQLITE_UPDA
5290: 54 45 20 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54 45  TE || op==SQLITE
52a0: 5f 44 45 4c 45 54 45 20 29 3b 0a 0a 20 20 70 43  _DELETE );..  pC
52b0: 6d 64 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  md = Tcl_Duplica
52c0: 74 65 4f 62 6a 28 70 44 62 2d 3e 70 50 72 65 55  teObj(pDb->pPreU
52d0: 70 64 61 74 65 48 6f 6f 6b 29 3b 0a 20 20 54 63  pdateHook);.  Tc
52e0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
52f0: 43 6d 64 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  Cmd);.  Tcl_List
5300: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
5310: 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65  (0, pCmd, Tcl_Ne
5320: 77 53 74 72 69 6e 67 4f 62 6a 28 61 7a 53 74 72  wStringObj(azStr
5330: 5b 28 6f 70 2d 31 29 2f 39 5d 2c 20 2d 31 29 29  [(op-1)/9], -1))
5340: 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
5350: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20  ppendElement(0, 
5360: 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72  pCmd, Tcl_NewStr
5370: 69 6e 67 4f 62 6a 28 7a 44 62 2c 20 2d 31 29 29  ingObj(zDb, -1))
5380: 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
5390: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20  ppendElement(0, 
53a0: 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72  pCmd, Tcl_NewStr
53b0: 69 6e 67 4f 62 6a 28 7a 54 62 6c 2c 20 2d 31 29  ingObj(zTbl, -1)
53c0: 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
53d0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
53e0: 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 57 69   pCmd, Tcl_NewWi
53f0: 64 65 49 6e 74 4f 62 6a 28 69 4b 65 79 31 29 29  deIntObj(iKey1))
5400: 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
5410: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20  ppendElement(0, 
5420: 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 57 69 64  pCmd, Tcl_NewWid
5430: 65 49 6e 74 4f 62 6a 28 69 4b 65 79 32 29 29 3b  eIntObj(iKey2));
5440: 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78  .  Tcl_EvalObjEx
5450: 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 43  (pDb->interp, pC
5460: 6d 64 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52  md, TCL_EVAL_DIR
5470: 45 43 54 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72  ECT);.  Tcl_Decr
5480: 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a  RefCount(pCmd);.
5490: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
54a0: 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44  TE_ENABLE_PREUPD
54b0: 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a 0a 73 74 61  ATE_HOOK */..sta
54c0: 74 69 63 20 76 6f 69 64 20 44 62 55 70 64 61 74  tic void DbUpdat
54d0: 65 48 61 6e 64 6c 65 72 28 0a 20 20 76 6f 69 64  eHandler(.  void
54e0: 20 2a 70 2c 20 0a 20 20 69 6e 74 20 6f 70 2c 0a   *p, .  int op,.
54f0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
5500: 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  b, .  const char
5510: 20 2a 7a 54 62 6c 2c 20 0a 20 20 73 71 6c 69 74   *zTbl, .  sqlit
5520: 65 5f 69 6e 74 36 34 20 72 6f 77 69 64 0a 29 7b  e_int64 rowid.){
5530: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
5540: 20 3d 20 28 53 71 6c 69 74 65 44 62 20 2a 29 70   = (SqliteDb *)p
5550: 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d  ;.  Tcl_Obj *pCm
5560: 64 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  d;.  static cons
5570: 74 20 63 68 61 72 20 2a 61 7a 53 74 72 5b 5d 20  t char *azStr[] 
5580: 3d 20 7b 22 44 45 4c 45 54 45 22 2c 20 22 49 4e  = {"DELETE", "IN
5590: 53 45 52 54 22 2c 20 22 55 50 44 41 54 45 22 7d  SERT", "UPDATE"}
55a0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 53 51  ;..  assert( (SQ
55b0: 4c 49 54 45 5f 44 45 4c 45 54 45 2d 31 29 2f 39  LITE_DELETE-1)/9
55c0: 20 3d 3d 20 30 20 29 3b 0a 20 20 61 73 73 65 72   == 0 );.  asser
55d0: 74 28 20 28 53 51 4c 49 54 45 5f 49 4e 53 45 52  t( (SQLITE_INSER
55e0: 54 2d 31 29 2f 39 20 3d 3d 20 31 20 29 3b 0a 20  T-1)/9 == 1 );. 
55f0: 20 61 73 73 65 72 74 28 20 28 53 51 4c 49 54 45   assert( (SQLITE
5600: 5f 55 50 44 41 54 45 2d 31 29 2f 39 20 3d 3d 20  _UPDATE-1)/9 == 
5610: 32 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  2 );..  assert( 
5620: 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b  pDb->pUpdateHook
5630: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
5640: 3d 3d 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 20  ==SQLITE_INSERT 
5650: 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 55 50  || op==SQLITE_UP
5660: 44 41 54 45 20 7c 7c 20 6f 70 3d 3d 53 51 4c 49  DATE || op==SQLI
5670: 54 45 5f 44 45 4c 45 54 45 20 29 3b 0a 0a 20 20  TE_DELETE );..  
5680: 70 43 6d 64 20 3d 20 54 63 6c 5f 44 75 70 6c 69  pCmd = Tcl_Dupli
5690: 63 61 74 65 4f 62 6a 28 70 44 62 2d 3e 70 55 70  cateObj(pDb->pUp
56a0: 64 61 74 65 48 6f 6f 6b 29 3b 0a 20 20 54 63 6c  dateHook);.  Tcl
56b0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43  _IncrRefCount(pC
56c0: 6d 64 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  md);.  Tcl_ListO
56d0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
56e0: 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77  0, pCmd, Tcl_New
56f0: 53 74 72 69 6e 67 4f 62 6a 28 61 7a 53 74 72 5b  StringObj(azStr[
5700: 28 6f 70 2d 31 29 2f 39 5d 2c 20 2d 31 29 29 3b  (op-1)/9], -1));
5710: 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
5720: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
5730: 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Cmd, Tcl_NewStri
5740: 6e 67 4f 62 6a 28 7a 44 62 2c 20 2d 31 29 29 3b  ngObj(zDb, -1));
5750: 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
5760: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
5770: 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Cmd, Tcl_NewStri
5780: 6e 67 4f 62 6a 28 7a 54 62 6c 2c 20 2d 31 29 29  ngObj(zTbl, -1))
5790: 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
57a0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20  ppendElement(0, 
57b0: 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 57 69 64  pCmd, Tcl_NewWid
57c0: 65 49 6e 74 4f 62 6a 28 72 6f 77 69 64 29 29 3b  eIntObj(rowid));
57d0: 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78  .  Tcl_EvalObjEx
57e0: 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 43  (pDb->interp, pC
57f0: 6d 64 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52  md, TCL_EVAL_DIR
5800: 45 43 54 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72  ECT);.  Tcl_Decr
5810: 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a  RefCount(pCmd);.
5820: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  }..static void t
5830: 63 6c 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 28  clCollateNeeded(
5840: 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 0a 20  .  void *pCtx,. 
5850: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
5860: 69 6e 74 20 65 6e 63 2c 0a 20 20 63 6f 6e 73 74  int enc,.  const
5870: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a   char *zName.){.
5880: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
5890: 3d 20 28 53 71 6c 69 74 65 44 62 20 2a 29 70 43  = (SqliteDb *)pC
58a0: 74 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  tx;.  Tcl_Obj *p
58b0: 53 63 72 69 70 74 20 3d 20 54 63 6c 5f 44 75 70  Script = Tcl_Dup
58c0: 6c 69 63 61 74 65 4f 62 6a 28 70 44 62 2d 3e 70  licateObj(pDb->p
58d0: 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a  CollateNeeded);.
58e0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
58f0: 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 20 20 54  nt(pScript);.  T
5900: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
5910: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 53 63 72 69  Element(0, pScri
5920: 70 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  pt, Tcl_NewStrin
5930: 67 4f 62 6a 28 7a 4e 61 6d 65 2c 20 2d 31 29 29  gObj(zName, -1))
5940: 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  ;.  Tcl_EvalObjE
5950: 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70  x(pDb->interp, p
5960: 53 63 72 69 70 74 2c 20 30 29 3b 0a 20 20 54 63  Script, 0);.  Tc
5970: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
5980: 53 63 72 69 70 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Script);.}../*.*
5990: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
59a0: 73 20 63 61 6c 6c 65 64 20 74 6f 20 65 76 61 6c  s called to eval
59b0: 75 61 74 65 20 61 6e 20 53 51 4c 20 63 6f 6c 6c  uate an SQL coll
59c0: 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 69  ation function i
59d0: 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 75 73  mplemented.** us
59e0: 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74 2e 0a  ing TCL script..
59f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 63  */.static int tc
5a00: 6c 53 71 6c 43 6f 6c 6c 61 74 65 28 0a 20 20 76  lSqlCollate(.  v
5a10: 6f 69 64 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74  oid *pCtx,.  int
5a20: 20 6e 41 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69   nA,.  const voi
5a30: 64 20 2a 7a 41 2c 0a 20 20 69 6e 74 20 6e 42 2c  d *zA,.  int nB,
5a40: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
5a50: 42 0a 29 7b 0a 20 20 53 71 6c 43 6f 6c 6c 61 74  B.){.  SqlCollat
5a60: 65 20 2a 70 20 3d 20 28 53 71 6c 43 6f 6c 6c 61  e *p = (SqlColla
5a70: 74 65 20 2a 29 70 43 74 78 3b 0a 20 20 54 63 6c  te *)pCtx;.  Tcl
5a80: 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 0a 20 20 70  _Obj *pCmd;..  p
5a90: 43 6d 64 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72  Cmd = Tcl_NewStr
5aa0: 69 6e 67 4f 62 6a 28 70 2d 3e 7a 53 63 72 69 70  ingObj(p->zScrip
5ab0: 74 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e  t, -1);.  Tcl_In
5ac0: 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29  crRefCount(pCmd)
5ad0: 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
5ae0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70 2d 3e  ppendElement(p->
5af0: 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 63  interp, pCmd, Tc
5b00: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a  l_NewStringObj(z
5b10: 41 2c 20 6e 41 29 29 3b 0a 20 20 54 63 6c 5f 4c  A, nA));.  Tcl_L
5b20: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
5b30: 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70  ent(p->interp, p
5b40: 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Cmd, Tcl_NewStri
5b50: 6e 67 4f 62 6a 28 7a 42 2c 20 6e 42 29 29 3b 0a  ngObj(zB, nB));.
5b60: 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28    Tcl_EvalObjEx(
5b70: 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c  p->interp, pCmd,
5b80: 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54   TCL_EVAL_DIRECT
5b90: 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66  );.  Tcl_DecrRef
5ba0: 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 72  Count(pCmd);.  r
5bb0: 65 74 75 72 6e 20 28 61 74 6f 69 28 54 63 6c 5f  eturn (atoi(Tcl_
5bc0: 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28  GetStringResult(
5bd0: 70 2d 3e 69 6e 74 65 72 70 29 29 29 3b 0a 7d 0a  p->interp)));.}.
5be0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
5bf0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
5c00: 20 65 76 61 6c 75 61 74 65 20 61 6e 20 53 51 4c   evaluate an SQL
5c10: 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d   function implem
5c20: 65 6e 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20 54  ented.** using T
5c30: 43 4c 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 73 74  CL script..*/.st
5c40: 61 74 69 63 20 76 6f 69 64 20 74 63 6c 53 71 6c  atic void tclSql
5c50: 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e  Func(sqlite3_con
5c60: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69  text *context, i
5c70: 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
5c80: 5f 76 61 6c 75 65 2a 2a 61 72 67 76 29 7b 0a 20  _value**argv){. 
5c90: 20 53 71 6c 46 75 6e 63 20 2a 70 20 3d 20 73 71   SqlFunc *p = sq
5ca0: 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28  lite3_user_data(
5cb0: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 54 63 6c 5f  context);.  Tcl_
5cc0: 4f 62 6a 20 2a 70 43 6d 64 3b 0a 20 20 69 6e 74  Obj *pCmd;.  int
5cd0: 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   i;.  int rc;.. 
5ce0: 20 69 66 28 20 61 72 67 63 3d 3d 30 20 29 7b 0a   if( argc==0 ){.
5cf0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
5d00: 61 72 65 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73  are no arguments
5d10: 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   to the function
5d20: 2c 20 63 61 6c 6c 20 54 63 6c 5f 45 76 61 6c 4f  , call Tcl_EvalO
5d30: 62 6a 45 78 20 6f 6e 20 74 68 65 0a 20 20 20 20  bjEx on the.    
5d40: 2a 2a 20 73 63 72 69 70 74 20 6f 62 6a 65 63 74  ** script object
5d50: 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68 69 73   directly.  This
5d60: 20 61 6c 6c 6f 77 73 20 74 68 65 20 54 43 4c 20   allows the TCL 
5d70: 63 6f 6d 70 69 6c 65 72 20 74 6f 20 67 65 6e 65  compiler to gene
5d80: 72 61 74 65 0a 20 20 20 20 2a 2a 20 62 79 74 65  rate.    ** byte
5d90: 63 6f 64 65 20 66 6f 72 20 74 68 65 20 63 6f 6d  code for the com
5da0: 6d 61 6e 64 20 6f 6e 20 74 68 65 20 66 69 72 73  mand on the firs
5db0: 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20 61 6e 64  t invocation and
5dc0: 20 74 68 75 73 20 6d 61 6b 65 0a 20 20 20 20 2a   thus make.    *
5dd0: 2a 20 73 75 62 73 65 71 75 65 6e 74 20 69 6e 76  * subsequent inv
5de0: 6f 63 61 74 69 6f 6e 73 20 6d 75 63 68 20 66 61  ocations much fa
5df0: 73 74 65 72 2e 20 2a 2f 0a 20 20 20 20 70 43 6d  ster. */.    pCm
5e00: 64 20 3d 20 70 2d 3e 70 53 63 72 69 70 74 3b 0a  d = p->pScript;.
5e10: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
5e20: 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20 20  ount(pCmd);.    
5e30: 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  rc = Tcl_EvalObj
5e40: 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43  Ex(p->interp, pC
5e50: 6d 64 2c 20 30 29 3b 0a 20 20 20 20 54 63 6c 5f  md, 0);.    Tcl_
5e60: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d  DecrRefCount(pCm
5e70: 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  d);.  }else{.   
5e80: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
5e90: 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68   arguments to th
5ea0: 65 20 66 75 6e 63 74 69 6f 6e 2c 20 6d 61 6b 65  e function, make
5eb0: 20 61 20 73 68 61 6c 6c 6f 77 20 63 6f 70 79 20   a shallow copy 
5ec0: 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 63  of the.    ** sc
5ed0: 72 69 70 74 20 6f 62 6a 65 63 74 2c 20 6c 61 70  ript object, lap
5ee0: 70 65 6e 64 20 74 68 65 20 61 72 67 75 6d 65 6e  pend the argumen
5ef0: 74 73 2c 20 74 68 65 6e 20 65 76 61 6c 75 61 74  ts, then evaluat
5f00: 65 20 74 68 65 20 63 6f 70 79 2e 0a 20 20 20 20  e the copy..    
5f10: 2a 2a 0a 20 20 20 20 2a 2a 20 42 79 20 22 73 68  **.    ** By "sh
5f20: 61 6c 6c 6f 77 22 20 63 6f 70 79 2c 20 77 65 20  allow" copy, we 
5f30: 6d 65 61 6e 20 6f 6e 6c 79 20 74 68 65 20 6f 75  mean only the ou
5f40: 74 65 72 20 6c 69 73 74 20 54 63 6c 5f 4f 62 6a  ter list Tcl_Obj
5f50: 20 69 73 20 64 75 70 6c 69 63 61 74 65 64 2e 0a   is duplicated..
5f60: 20 20 20 20 2a 2a 20 54 68 65 20 6e 65 77 20 54      ** The new T
5f70: 63 6c 5f 4f 62 6a 20 63 6f 6e 74 61 69 6e 73 20  cl_Obj contains 
5f80: 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65 20  pointers to the 
5f90: 6f 72 69 67 69 6e 61 6c 20 6c 69 73 74 20 65 6c  original list el
5fa0: 65 6d 65 6e 74 73 2e 20 0a 20 20 20 20 2a 2a 20  ements. .    ** 
5fb0: 54 68 61 74 20 77 61 79 2c 20 77 68 65 6e 20 54  That way, when T
5fc0: 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20 69 73  cl_EvalObjv() is
5fd0: 20 72 75 6e 20 61 6e 64 20 73 68 69 6d 6d 65 72   run and shimmer
5fe0: 73 20 74 68 65 20 66 69 72 73 74 20 65 6c 65 6d  s the first elem
5ff0: 65 6e 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  ent.    ** of th
6000: 65 20 6c 69 73 74 20 74 6f 20 74 63 6c 43 6d 64  e list to tclCmd
6010: 4e 61 6d 65 54 79 70 65 2c 20 74 68 61 74 20 61  NameType, that a
6020: 6c 74 65 72 6e 61 74 65 20 72 65 70 72 65 73 65  lternate represe
6030: 6e 74 61 74 69 6f 6e 20 77 69 6c 6c 0a 20 20 20  ntation will.   
6040: 20 2a 2a 20 62 65 20 70 72 65 73 65 72 76 65 64   ** be preserved
6050: 20 61 6e 64 20 72 65 75 73 65 64 20 6f 6e 20 74   and reused on t
6060: 68 65 20 6e 65 78 74 20 69 6e 76 6f 63 61 74 69  he next invocati
6070: 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 54  on..    */.    T
6080: 63 6c 5f 4f 62 6a 20 2a 2a 61 41 72 67 3b 0a 20  cl_Obj **aArg;. 
6090: 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20     int nArg;.   
60a0: 20 69 66 28 20 54 63 6c 5f 4c 69 73 74 4f 62 6a   if( Tcl_ListObj
60b0: 47 65 74 45 6c 65 6d 65 6e 74 73 28 70 2d 3e 69  GetElements(p->i
60c0: 6e 74 65 72 70 2c 20 70 2d 3e 70 53 63 72 69 70  nterp, p->pScrip
60d0: 74 2c 20 26 6e 41 72 67 2c 20 26 61 41 72 67 29  t, &nArg, &aArg)
60e0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
60f0: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63  3_result_error(c
6100: 6f 6e 74 65 78 74 2c 20 54 63 6c 5f 47 65 74 53  ontext, Tcl_GetS
6110: 74 72 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69  tringResult(p->i
6120: 6e 74 65 72 70 29 2c 20 2d 31 29 3b 20 0a 20 20  nterp), -1); .  
6130: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
6140: 7d 20 20 20 20 20 0a 20 20 20 20 70 43 6d 64 20  }     .    pCmd 
6150: 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a  = Tcl_NewListObj
6160: 28 6e 41 72 67 2c 20 61 41 72 67 29 3b 0a 20 20  (nArg, aArg);.  
6170: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
6180: 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20 20 66 6f  nt(pCmd);.    fo
6190: 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69  r(i=0; i<argc; i
61a0: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
61b0: 65 33 5f 76 61 6c 75 65 20 2a 70 49 6e 20 3d 20  e3_value *pIn = 
61c0: 61 72 67 76 5b 69 5d 3b 0a 20 20 20 20 20 20 54  argv[i];.      T
61d0: 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c 3b 0a 20 20  cl_Obj *pVal;.  
61e0: 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20            .     
61f0: 20 2f 2a 20 53 65 74 20 70 56 61 6c 20 74 6f 20   /* Set pVal to 
6200: 63 6f 6e 74 61 69 6e 20 74 68 65 20 69 27 74 68  contain the i'th
6210: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 69 73 20   column of this 
6220: 72 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20 73 77  row. */.      sw
6230: 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f 76 61  itch( sqlite3_va
6240: 6c 75 65 5f 74 79 70 65 28 70 49 6e 29 20 29 7b  lue_type(pIn) ){
6250: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51  .        case SQ
6260: 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20  LITE_BLOB: {.   
6270: 20 20 20 20 20 20 20 69 6e 74 20 62 79 74 65 73         int bytes
6280: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
6290: 5f 62 79 74 65 73 28 70 49 6e 29 3b 0a 20 20 20  _bytes(pIn);.   
62a0: 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63         pVal = Tc
62b0: 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62  l_NewByteArrayOb
62c0: 6a 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  j(sqlite3_value_
62d0: 62 6c 6f 62 28 70 49 6e 29 2c 20 62 79 74 65 73  blob(pIn), bytes
62e0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
62f0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
6300: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
6310: 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20  E_INTEGER: {.   
6320: 20 20 20 20 20 20 20 73 71 6c 69 74 65 5f 69 6e         sqlite_in
6330: 74 36 34 20 76 20 3d 20 73 71 6c 69 74 65 33 5f  t64 v = sqlite3_
6340: 76 61 6c 75 65 5f 69 6e 74 36 34 28 70 49 6e 29  value_int64(pIn)
6350: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
6360: 76 3e 3d 2d 32 31 34 37 34 38 33 36 34 37 20 26  v>=-2147483647 &
6370: 26 20 76 3c 3d 32 31 34 37 34 38 33 36 34 37 20  & v<=2147483647 
6380: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
6390: 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 49 6e 74  Val = Tcl_NewInt
63a0: 4f 62 6a 28 28 69 6e 74 29 76 29 3b 0a 20 20 20  Obj((int)v);.   
63b0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
63c0: 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d            pVal =
63d0: 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f   Tcl_NewWideIntO
63e0: 62 6a 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  bj(v);.         
63f0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65   }.          bre
6400: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
6410: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
6420: 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20  E_FLOAT: {.     
6430: 20 20 20 20 20 64 6f 75 62 6c 65 20 72 20 3d 20       double r = 
6440: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f  sqlite3_value_do
6450: 75 62 6c 65 28 70 49 6e 29 3b 0a 20 20 20 20 20  uble(pIn);.     
6460: 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f       pVal = Tcl_
6470: 4e 65 77 44 6f 75 62 6c 65 4f 62 6a 28 72 29 3b  NewDoubleObj(r);
6480: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
6490: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
64a0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
64b0: 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20  NULL: {.        
64c0: 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77    pVal = Tcl_New
64d0: 53 74 72 69 6e 67 4f 62 6a 28 70 2d 3e 70 44 62  StringObj(p->pDb
64e0: 2d 3e 7a 4e 75 6c 6c 2c 20 2d 31 29 3b 0a 20 20  ->zNull, -1);.  
64f0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
6500: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6510: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
6520: 20 20 20 20 20 20 69 6e 74 20 62 79 74 65 73 20        int bytes 
6530: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
6540: 62 79 74 65 73 28 70 49 6e 29 3b 0a 20 20 20 20  bytes(pIn);.    
6550: 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c        pVal = Tcl
6560: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63  _NewStringObj((c
6570: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61  har *)sqlite3_va
6580: 6c 75 65 5f 74 65 78 74 28 70 49 6e 29 2c 20 62  lue_text(pIn), b
6590: 79 74 65 73 29 3b 0a 20 20 20 20 20 20 20 20 20  ytes);.         
65a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
65b0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
65c0: 72 63 20 3d 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  rc = Tcl_ListObj
65d0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70 2d  AppendElement(p-
65e0: 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 70  >interp, pCmd, p
65f0: 56 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Val);.      if( 
6600: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  rc ){.        Tc
6610: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
6620: 43 6d 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Cmd);.        sq
6630: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
6640: 6f 72 28 63 6f 6e 74 65 78 74 2c 20 54 63 6c 5f  or(context, Tcl_
6650: 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28  GetStringResult(
6660: 70 2d 3e 69 6e 74 65 72 70 29 2c 20 2d 31 29 3b  p->interp), -1);
6670: 20 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e   .        return
6680: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6690: 20 20 20 20 69 66 28 20 21 70 2d 3e 75 73 65 45      if( !p->useE
66a0: 76 61 6c 4f 62 6a 76 20 29 7b 0a 20 20 20 20 20  valObjv ){.     
66b0: 20 2f 2a 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45   /* Tcl_EvalObjE
66c0: 78 28 29 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74  x() will automat
66d0: 69 63 61 6c 6c 79 20 63 61 6c 6c 20 54 63 6c 5f  ically call Tcl_
66e0: 45 76 61 6c 4f 62 6a 76 28 29 20 69 66 20 70 43  EvalObjv() if pC
66f0: 6d 64 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61  md.      ** is a
6700: 20 6c 69 73 74 20 77 69 74 68 6f 75 74 20 61 20   list without a 
6710: 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74  string represent
6720: 61 74 69 6f 6e 2e 20 20 54 6f 20 70 72 65 76 65  ation.  To preve
6730: 6e 74 20 74 68 69 73 20 66 72 6f 6d 0a 20 20 20  nt this from.   
6740: 20 20 20 2a 2a 20 68 61 70 70 65 6e 69 6e 67 2c     ** happening,
6750: 20 6d 61 6b 65 20 73 75 72 65 20 70 43 6d 64 20   make sure pCmd 
6760: 68 61 73 20 61 20 76 61 6c 69 64 20 73 74 72 69  has a valid stri
6770: 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ng representatio
6780: 6e 20 2a 2f 0a 20 20 20 20 20 20 54 63 6c 5f 47  n */.      Tcl_G
6790: 65 74 53 74 72 69 6e 67 28 70 43 6d 64 29 3b 0a  etString(pCmd);.
67a0: 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 54      }.    rc = T
67b0: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e  cl_EvalObjEx(p->
67c0: 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 43  interp, pCmd, TC
67d0: 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a  L_EVAL_DIRECT);.
67e0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
67f0: 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 7d 0a  ount(pCmd);.  }.
6800: 0a 20 20 69 66 28 20 72 63 20 26 26 20 72 63 21  .  if( rc && rc!
6810: 3d 54 43 4c 5f 52 45 54 55 52 4e 20 29 7b 0a 20  =TCL_RETURN ){. 
6820: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
6830: 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
6840: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65   Tcl_GetStringRe
6850: 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c  sult(p->interp),
6860: 20 2d 31 29 3b 20 0a 20 20 7d 65 6c 73 65 7b 0a   -1); .  }else{.
6870: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61      Tcl_Obj *pVa
6880: 72 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65  r = Tcl_GetObjRe
6890: 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 3b  sult(p->interp);
68a0: 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20  .    int n;.    
68b0: 75 38 20 2a 64 61 74 61 3b 0a 20 20 20 20 63 6f  u8 *data;.    co
68c0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20  nst char *zType 
68d0: 3d 20 28 70 56 61 72 2d 3e 74 79 70 65 50 74 72  = (pVar->typePtr
68e0: 20 3f 20 70 56 61 72 2d 3e 74 79 70 65 50 74 72   ? pVar->typePtr
68f0: 2d 3e 6e 61 6d 65 20 3a 20 22 22 29 3b 0a 20 20  ->name : "");.  
6900: 20 20 63 68 61 72 20 63 20 3d 20 7a 54 79 70 65    char c = zType
6910: 5b 30 5d 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d  [0];.    if( c==
6920: 27 62 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54  'b' && strcmp(zT
6930: 79 70 65 2c 22 62 79 74 65 61 72 72 61 79 22 29  ype,"bytearray")
6940: 3d 3d 30 20 26 26 20 70 56 61 72 2d 3e 62 79 74  ==0 && pVar->byt
6950: 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  es==0 ){.      /
6960: 2a 20 4f 6e 6c 79 20 72 65 74 75 72 6e 20 61 20  * Only return a 
6970: 42 4c 4f 42 20 74 79 70 65 20 69 66 20 74 68 65  BLOB type if the
6980: 20 54 63 6c 20 76 61 72 69 61 62 6c 65 20 69 73   Tcl variable is
6990: 20 61 20 62 79 74 65 61 72 72 61 79 20 61 6e 64   a bytearray and
69a0: 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f  .      ** has no
69b0: 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e   string represen
69c0: 74 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20  tation. */.     
69d0: 20 64 61 74 61 20 3d 20 54 63 6c 5f 47 65 74 42   data = Tcl_GetB
69e0: 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28  yteArrayFromObj(
69f0: 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20  pVar, &n);.     
6a00: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
6a10: 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c 20 64 61  blob(context, da
6a20: 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 54 52  ta, n, SQLITE_TR
6a30: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d 65  ANSIENT);.    }e
6a40: 6c 73 65 20 69 66 28 20 63 3d 3d 27 62 27 20 26  lse if( c=='b' &
6a50: 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22  & strcmp(zType,"
6a60: 62 6f 6f 6c 65 61 6e 22 29 3d 3d 30 20 29 7b 0a  boolean")==0 ){.
6a70: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 49 6e 74        Tcl_GetInt
6a80: 46 72 6f 6d 4f 62 6a 28 30 2c 20 70 56 61 72 2c  FromObj(0, pVar,
6a90: 20 26 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   &n);.      sqli
6aa0: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63  te3_result_int(c
6ab0: 6f 6e 74 65 78 74 2c 20 6e 29 3b 0a 20 20 20 20  ontext, n);.    
6ac0: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 64 27  }else if( c=='d'
6ad0: 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65   && strcmp(zType
6ae0: 2c 22 64 6f 75 62 6c 65 22 29 3d 3d 30 20 29 7b  ,"double")==0 ){
6af0: 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 3b  .      double r;
6b00: 0a 20 20 20 20 20 20 54 63 6c 5f 47 65 74 44 6f  .      Tcl_GetDo
6b10: 75 62 6c 65 46 72 6f 6d 4f 62 6a 28 30 2c 20 70  ubleFromObj(0, p
6b20: 56 61 72 2c 20 26 72 29 3b 0a 20 20 20 20 20 20  Var, &r);.      
6b30: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64  sqlite3_result_d
6b40: 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 72  ouble(context, r
6b50: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
6b60: 20 28 63 3d 3d 27 77 27 20 26 26 20 73 74 72 63   (c=='w' && strc
6b70: 6d 70 28 7a 54 79 70 65 2c 22 77 69 64 65 49 6e  mp(zType,"wideIn
6b80: 74 22 29 3d 3d 30 29 20 7c 7c 0a 20 20 20 20 20  t")==0) ||.     
6b90: 20 20 20 20 20 28 63 3d 3d 27 69 27 20 26 26 20       (c=='i' && 
6ba0: 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 69 6e  strcmp(zType,"in
6bb0: 74 22 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20  t")==0) ){.     
6bc0: 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 76 3b 0a   Tcl_WideInt v;.
6bd0: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 57 69 64        Tcl_GetWid
6be0: 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 30 2c 20 70  eIntFromObj(0, p
6bf0: 56 61 72 2c 20 26 76 29 3b 0a 20 20 20 20 20 20  Var, &v);.      
6c00: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
6c10: 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 76 29  nt64(context, v)
6c20: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
6c30: 20 20 20 64 61 74 61 20 3d 20 28 75 6e 73 69 67     data = (unsig
6c40: 6e 65 64 20 63 68 61 72 20 2a 29 54 63 6c 5f 47  ned char *)Tcl_G
6c50: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
6c60: 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20  pVar, &n);.     
6c70: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
6c80: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 28 63  text(context, (c
6c90: 68 61 72 20 2a 29 64 61 74 61 2c 20 6e 2c 20 53  har *)data, n, S
6ca0: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
6cb0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23  ;.    }.  }.}..#
6cc0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
6cd0: 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
6ce0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  ./*.** This is t
6cf0: 68 65 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f  he authenticatio
6d00: 6e 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49 74 20  n function.  It 
6d10: 61 70 70 65 6e 64 73 20 74 68 65 20 61 75 74 68  appends the auth
6d20: 65 6e 74 69 63 61 74 69 6f 6e 0a 2a 2a 20 74 79  entication.** ty
6d30: 70 65 20 63 6f 64 65 20 61 6e 64 20 74 68 65 20  pe code and the 
6d40: 74 77 6f 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  two arguments to
6d50: 20 7a 43 6d 64 5b 5d 20 74 68 65 6e 20 69 6e 76   zCmd[] then inv
6d60: 6f 6b 65 73 20 74 68 65 20 72 65 73 75 6c 74 0a  okes the result.
6d70: 2a 2a 20 6f 6e 20 74 68 65 20 69 6e 74 65 72 70  ** on the interp
6d80: 72 65 74 65 72 2e 20 20 54 68 65 20 72 65 70 6c  reter.  The repl
6d90: 79 20 69 73 20 65 78 61 6d 69 6e 65 64 20 74 6f  y is examined to
6da0: 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
6db0: 65 0a 2a 2a 20 61 75 74 68 65 6e 74 69 63 61 74  e.** authenticat
6dc0: 69 6f 6e 20 66 61 69 6c 73 20 6f 72 20 73 75 63  ion fails or suc
6dd0: 63 65 65 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ceeds..*/.static
6de0: 20 69 6e 74 20 61 75 74 68 5f 63 61 6c 6c 62 61   int auth_callba
6df0: 63 6b 28 0a 20 20 76 6f 69 64 20 2a 70 41 72 67  ck(.  void *pArg
6e00: 2c 0a 20 20 69 6e 74 20 63 6f 64 65 2c 0a 20 20  ,.  int code,.  
6e10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
6e20: 31 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  1,.  const char 
6e30: 2a 7a 41 72 67 32 2c 0a 20 20 63 6f 6e 73 74 20  *zArg2,.  const 
6e40: 63 68 61 72 20 2a 7a 41 72 67 33 2c 0a 20 20 63  char *zArg3,.  c
6e50: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 34  onst char *zArg4
6e60: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55  .#ifdef SQLITE_U
6e70: 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49  SER_AUTHENTICATI
6e80: 4f 4e 0a 20 20 2c 63 6f 6e 73 74 20 63 68 61 72  ON.  ,const char
6e90: 20 2a 7a 41 72 67 35 0a 23 65 6e 64 69 66 0a 29   *zArg5.#endif.)
6ea0: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
6eb0: 7a 43 6f 64 65 3b 0a 20 20 54 63 6c 5f 44 53 74  zCode;.  Tcl_DSt
6ec0: 72 69 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74 20  ring str;.  int 
6ed0: 72 63 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  rc;.  const char
6ee0: 20 2a 7a 52 65 70 6c 79 3b 0a 20 20 53 71 6c 69   *zReply;.  Sqli
6ef0: 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c  teDb *pDb = (Sql
6f00: 69 74 65 44 62 2a 29 70 41 72 67 3b 0a 20 20 69  iteDb*)pArg;.  i
6f10: 66 28 20 70 44 62 2d 3e 64 69 73 61 62 6c 65 41  f( pDb->disableA
6f20: 75 74 68 20 29 20 72 65 74 75 72 6e 20 53 51 4c  uth ) return SQL
6f30: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 77 69 74 63  ITE_OK;..  switc
6f40: 68 28 20 63 6f 64 65 20 29 7b 0a 20 20 20 20 63  h( code ){.    c
6f50: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 50 59 20  ase SQLITE_COPY 
6f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a               : z
6f70: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 4f 50  Code="SQLITE_COP
6f80: 59 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  Y"; break;.    c
6f90: 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54  ase SQLITE_CREAT
6fa0: 45 5f 49 4e 44 45 58 20 20 20 20 20 20 3a 20 7a  E_INDEX      : z
6fb0: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45  Code="SQLITE_CRE
6fc0: 41 54 45 5f 49 4e 44 45 58 22 3b 20 62 72 65 61  ATE_INDEX"; brea
6fd0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
6fe0: 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 20  TE_CREATE_TABLE 
6ff0: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
7000: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c  LITE_CREATE_TABL
7010: 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  E"; break;.    c
7020: 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54  ase SQLITE_CREAT
7030: 45 5f 54 45 4d 50 5f 49 4e 44 45 58 20 3a 20 7a  E_TEMP_INDEX : z
7040: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45  Code="SQLITE_CRE
7050: 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 22 3b  ATE_TEMP_INDEX";
7060: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
7070: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
7080: 45 4d 50 5f 54 41 42 4c 45 20 3a 20 7a 43 6f 64  EMP_TABLE : zCod
7090: 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45  e="SQLITE_CREATE
70a0: 5f 54 45 4d 50 5f 54 41 42 4c 45 22 3b 20 62 72  _TEMP_TABLE"; br
70b0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
70c0: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50  LITE_CREATE_TEMP
70d0: 5f 54 52 49 47 47 45 52 3a 20 7a 43 6f 64 65 3d  _TRIGGER: zCode=
70e0: 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54  "SQLITE_CREATE_T
70f0: 45 4d 50 5f 54 52 49 47 47 45 52 22 3b 20 62 72  EMP_TRIGGER"; br
7100: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
7110: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50  LITE_CREATE_TEMP
7120: 5f 56 49 45 57 20 20 3a 20 7a 43 6f 64 65 3d 22  _VIEW  : zCode="
7130: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
7140: 4d 50 5f 56 49 45 57 22 3b 20 62 72 65 61 6b 3b  MP_VIEW"; break;
7150: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
7160: 5f 43 52 45 41 54 45 5f 54 52 49 47 47 45 52 20  _CREATE_TRIGGER 
7170: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
7180: 54 45 5f 43 52 45 41 54 45 5f 54 52 49 47 47 45  TE_CREATE_TRIGGE
7190: 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  R"; break;.    c
71a0: 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54  ase SQLITE_CREAT
71b0: 45 5f 56 49 45 57 20 20 20 20 20 20 20 3a 20 7a  E_VIEW       : z
71c0: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45  Code="SQLITE_CRE
71d0: 41 54 45 5f 56 49 45 57 22 3b 20 62 72 65 61 6b  ATE_VIEW"; break
71e0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
71f0: 45 5f 44 45 4c 45 54 45 20 20 20 20 20 20 20 20  E_DELETE        
7200: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
7210: 49 54 45 5f 44 45 4c 45 54 45 22 3b 20 62 72 65  ITE_DELETE"; bre
7220: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
7230: 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58 20 20  ITE_DROP_INDEX  
7240: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
7250: 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58  QLITE_DROP_INDEX
7260: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
7270: 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54  se SQLITE_DROP_T
7280: 41 42 4c 45 20 20 20 20 20 20 20 20 3a 20 7a 43  ABLE        : zC
7290: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50  ode="SQLITE_DROP
72a0: 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a  _TABLE"; break;.
72b0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
72c0: 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 20  DROP_TEMP_INDEX 
72d0: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
72e0: 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45  E_DROP_TEMP_INDE
72f0: 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  X"; break;.    c
7300: 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  ase SQLITE_DROP_
7310: 54 45 4d 50 5f 54 41 42 4c 45 20 20 20 3a 20 7a  TEMP_TABLE   : z
7320: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f  Code="SQLITE_DRO
7330: 50 5f 54 45 4d 50 5f 54 41 42 4c 45 22 3b 20 62  P_TEMP_TABLE"; b
7340: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
7350: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
7360: 54 52 49 47 47 45 52 20 3a 20 7a 43 6f 64 65 3d  TRIGGER : zCode=
7370: 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d  "SQLITE_DROP_TEM
7380: 50 5f 54 52 49 47 47 45 52 22 3b 20 62 72 65 61  P_TRIGGER"; brea
7390: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
73a0: 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45  TE_DROP_TEMP_VIE
73b0: 57 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51  W    : zCode="SQ
73c0: 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56  LITE_DROP_TEMP_V
73d0: 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  IEW"; break;.   
73e0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f   case SQLITE_DRO
73f0: 50 5f 54 52 49 47 47 45 52 20 20 20 20 20 20 3a  P_TRIGGER      :
7400: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44   zCode="SQLITE_D
7410: 52 4f 50 5f 54 52 49 47 47 45 52 22 3b 20 62 72  ROP_TRIGGER"; br
7420: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
7430: 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45 57 20 20  LITE_DROP_VIEW  
7440: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
7450: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45 57  SQLITE_DROP_VIEW
7460: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
7470: 73 65 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  se SQLITE_INSERT
7480: 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43              : zC
7490: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 49 4e 53 45  ode="SQLITE_INSE
74a0: 52 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  RT"; break;.    
74b0: 63 61 73 65 20 53 51 4c 49 54 45 5f 50 52 41 47  case SQLITE_PRAG
74c0: 4d 41 20 20 20 20 20 20 20 20 20 20 20 20 3a 20  MA            : 
74d0: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 50 52  zCode="SQLITE_PR
74e0: 41 47 4d 41 22 3b 20 62 72 65 61 6b 3b 0a 20 20  AGMA"; break;.  
74f0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45    case SQLITE_RE
7500: 41 44 20 20 20 20 20 20 20 20 20 20 20 20 20 20  AD              
7510: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
7520: 52 45 41 44 22 3b 20 62 72 65 61 6b 3b 0a 20 20  READ"; break;.  
7530: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53 45    case SQLITE_SE
7540: 4c 45 43 54 20 20 20 20 20 20 20 20 20 20 20 20  LECT            
7550: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
7560: 53 45 4c 45 43 54 22 3b 20 62 72 65 61 6b 3b 0a  SELECT"; break;.
7570: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
7580: 54 52 41 4e 53 41 43 54 49 4f 4e 20 20 20 20 20  TRANSACTION     
7590: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
75a0: 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 22 3b 20  E_TRANSACTION"; 
75b0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
75c0: 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20 20 20  SQLITE_UPDATE   
75d0: 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65           : zCode
75e0: 3d 22 53 51 4c 49 54 45 5f 55 50 44 41 54 45 22  ="SQLITE_UPDATE"
75f0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
7600: 65 20 53 51 4c 49 54 45 5f 41 54 54 41 43 48 20  e SQLITE_ATTACH 
7610: 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f             : zCo
7620: 64 65 3d 22 53 51 4c 49 54 45 5f 41 54 54 41 43  de="SQLITE_ATTAC
7630: 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  H"; break;.    c
7640: 61 73 65 20 53 51 4c 49 54 45 5f 44 45 54 41 43  ase SQLITE_DETAC
7650: 48 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a  H            : z
7660: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 45 54  Code="SQLITE_DET
7670: 41 43 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ACH"; break;.   
7680: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 4c 54   case SQLITE_ALT
7690: 45 52 5f 54 41 42 4c 45 20 20 20 20 20 20 20 3a  ER_TABLE       :
76a0: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 41   zCode="SQLITE_A
76b0: 4c 54 45 52 5f 54 41 42 4c 45 22 3b 20 62 72 65  LTER_TABLE"; bre
76c0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
76d0: 49 54 45 5f 52 45 49 4e 44 45 58 20 20 20 20 20  ITE_REINDEX     
76e0: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
76f0: 51 4c 49 54 45 5f 52 45 49 4e 44 45 58 22 3b 20  QLITE_REINDEX"; 
7700: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
7710: 53 51 4c 49 54 45 5f 41 4e 41 4c 59 5a 45 20 20  SQLITE_ANALYZE  
7720: 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65           : zCode
7730: 3d 22 53 51 4c 49 54 45 5f 41 4e 41 4c 59 5a 45  ="SQLITE_ANALYZE
7740: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
7750: 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45  se SQLITE_CREATE
7760: 5f 56 54 41 42 4c 45 20 20 20 20 20 3a 20 7a 43  _VTABLE     : zC
7770: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41  ode="SQLITE_CREA
7780: 54 45 5f 56 54 41 42 4c 45 22 3b 20 62 72 65 61  TE_VTABLE"; brea
7790: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
77a0: 54 45 5f 44 52 4f 50 5f 56 54 41 42 4c 45 20 20  TE_DROP_VTABLE  
77b0: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
77c0: 4c 49 54 45 5f 44 52 4f 50 5f 56 54 41 42 4c 45  LITE_DROP_VTABLE
77d0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
77e0: 73 65 20 53 51 4c 49 54 45 5f 46 55 4e 43 54 49  se SQLITE_FUNCTI
77f0: 4f 4e 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43  ON          : zC
7800: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 46 55 4e 43  ode="SQLITE_FUNC
7810: 54 49 4f 4e 22 3b 20 62 72 65 61 6b 3b 0a 20 20  TION"; break;.  
7820: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53 41    case SQLITE_SA
7830: 56 45 50 4f 49 4e 54 20 20 20 20 20 20 20 20 20  VEPOINT         
7840: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
7850: 53 41 56 45 50 4f 49 4e 54 22 3b 20 62 72 65 61  SAVEPOINT"; brea
7860: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
7870: 54 45 5f 52 45 43 55 52 53 49 56 45 20 20 20 20  TE_RECURSIVE    
7880: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
7890: 4c 49 54 45 5f 52 45 43 55 52 53 49 56 45 22 3b  LITE_RECURSIVE";
78a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
78b0: 75 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ult             
78c0: 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64            : zCod
78d0: 65 3d 22 3f 3f 3f 3f 22 3b 20 62 72 65 61 6b 3b  e="????"; break;
78e0: 0a 20 20 7d 0a 20 20 54 63 6c 5f 44 53 74 72 69  .  }.  Tcl_DStri
78f0: 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20  ngInit(&str);.  
7900: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
7910: 64 28 26 73 74 72 2c 20 70 44 62 2d 3e 7a 41 75  d(&str, pDb->zAu
7920: 74 68 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44  th, -1);.  Tcl_D
7930: 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d  StringAppendElem
7940: 65 6e 74 28 26 73 74 72 2c 20 7a 43 6f 64 65 29  ent(&str, zCode)
7950: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41  ;.  Tcl_DStringA
7960: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74  ppendElement(&st
7970: 72 2c 20 7a 41 72 67 31 20 3f 20 7a 41 72 67 31  r, zArg1 ? zArg1
7980: 20 3a 20 22 22 29 3b 0a 20 20 54 63 6c 5f 44 53   : "");.  Tcl_DS
7990: 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65  tringAppendEleme
79a0: 6e 74 28 26 73 74 72 2c 20 7a 41 72 67 32 20 3f  nt(&str, zArg2 ?
79b0: 20 7a 41 72 67 32 20 3a 20 22 22 29 3b 0a 20 20   zArg2 : "");.  
79c0: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
79d0: 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a  dElement(&str, z
79e0: 41 72 67 33 20 3f 20 7a 41 72 67 33 20 3a 20 22  Arg3 ? zArg3 : "
79f0: 22 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  ");.  Tcl_DStrin
7a00: 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26  gAppendElement(&
7a10: 73 74 72 2c 20 7a 41 72 67 34 20 3f 20 7a 41 72  str, zArg4 ? zAr
7a20: 67 34 20 3a 20 22 22 29 3b 0a 23 69 66 64 65 66  g4 : "");.#ifdef
7a30: 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54   SQLITE_USER_AUT
7a40: 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 54 63  HENTICATION.  Tc
7a50: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45  l_DStringAppendE
7a60: 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41 72  lement(&str, zAr
7a70: 67 35 20 3f 20 7a 41 72 67 35 20 3a 20 22 22 29  g5 ? zArg5 : "")
7a80: 3b 0a 23 65 6e 64 69 66 20 20 0a 20 20 72 63 20  ;.#endif  .  rc 
7a90: 3d 20 54 63 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c  = Tcl_GlobalEval
7aa0: 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 54 63  (pDb->interp, Tc
7ab0: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26  l_DStringValue(&
7ac0: 73 74 72 29 29 3b 0a 20 20 54 63 6c 5f 44 53 74  str));.  Tcl_DSt
7ad0: 72 69 6e 67 46 72 65 65 28 26 73 74 72 29 3b 0a  ringFree(&str);.
7ae0: 20 20 7a 52 65 70 6c 79 20 3d 20 72 63 3d 3d 54    zReply = rc==T
7af0: 43 4c 5f 4f 4b 20 3f 20 54 63 6c 5f 47 65 74 53  CL_OK ? Tcl_GetS
7b00: 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44 62 2d  tringResult(pDb-
7b10: 3e 69 6e 74 65 72 70 29 20 3a 20 22 53 51 4c 49  >interp) : "SQLI
7b20: 54 45 5f 44 45 4e 59 22 3b 0a 20 20 69 66 28 20  TE_DENY";.  if( 
7b30: 73 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22 53  strcmp(zReply,"S
7b40: 51 4c 49 54 45 5f 4f 4b 22 29 3d 3d 30 20 29 7b  QLITE_OK")==0 ){
7b50: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
7b60: 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  _OK;.  }else if(
7b70: 20 73 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22   strcmp(zReply,"
7b80: 53 51 4c 49 54 45 5f 44 45 4e 59 22 29 3d 3d 30  SQLITE_DENY")==0
7b90: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
7ba0: 49 54 45 5f 44 45 4e 59 3b 0a 20 20 7d 65 6c 73  ITE_DENY;.  }els
7bb0: 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 52 65  e if( strcmp(zRe
7bc0: 70 6c 79 2c 22 53 51 4c 49 54 45 5f 49 47 4e 4f  ply,"SQLITE_IGNO
7bd0: 52 45 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  RE")==0 ){.    r
7be0: 63 20 3d 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52  c = SQLITE_IGNOR
7bf0: 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  E;.  }else{.    
7c00: 72 63 20 3d 20 39 39 39 3b 0a 20 20 7d 0a 20 20  rc = 999;.  }.  
7c10: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
7c20: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
7c30: 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
7c40: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
7c50: 72 6f 75 74 69 6e 65 20 72 65 61 64 73 20 61 20  routine reads a 
7c60: 6c 69 6e 65 20 6f 66 20 74 65 78 74 20 66 72 6f  line of text fro
7c70: 6d 20 46 49 4c 45 20 69 6e 2c 20 73 74 6f 72 65  m FILE in, store
7c80: 73 0a 2a 2a 20 74 68 65 20 74 65 78 74 20 69 6e  s.** the text in
7c90: 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
7ca0: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20 61   from malloc() a
7cb0: 6e 64 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  nd returns a poi
7cc0: 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 74  nter.** to the t
7cd0: 65 78 74 2e 20 20 4e 55 4c 4c 20 69 73 20 72 65  ext.  NULL is re
7ce0: 74 75 72 6e 65 64 20 61 74 20 65 6e 64 20 6f 66  turned at end of
7cf0: 20 66 69 6c 65 2c 20 6f 72 20 69 66 20 6d 61 6c   file, or if mal
7d00: 6c 6f 63 28 29 0a 2a 2a 20 66 61 69 6c 73 2e 0a  loc().** fails..
7d10: 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66  **.** The interf
7d20: 61 63 65 20 69 73 20 6c 69 6b 65 20 22 72 65 61  ace is like "rea
7d30: 64 6c 69 6e 65 22 20 62 75 74 20 6e 6f 20 63 6f  dline" but no co
7d40: 6d 6d 61 6e 64 2d 6c 69 6e 65 20 65 64 69 74 69  mmand-line editi
7d50: 6e 67 0a 2a 2a 20 69 73 20 64 6f 6e 65 2e 0a 2a  ng.** is done..*
7d60: 2a 0a 2a 2a 20 63 6f 70 69 65 64 20 66 72 6f 6d  *.** copied from
7d70: 20 73 68 65 6c 6c 2e 63 20 66 72 6f 6d 20 27 2e   shell.c from '.
7d80: 69 6d 70 6f 72 74 27 20 63 6f 6d 6d 61 6e 64 0a  import' command.
7d90: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
7da0: 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28 63 68  local_getline(ch
7db0: 61 72 20 2a 7a 50 72 6f 6d 70 74 2c 20 46 49 4c  ar *zPrompt, FIL
7dc0: 45 20 2a 69 6e 29 7b 0a 20 20 63 68 61 72 20 2a  E *in){.  char *
7dd0: 7a 4c 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 4c 69  zLine;.  int nLi
7de0: 6e 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20  ne;.  int n;..  
7df0: 6e 4c 69 6e 65 20 3d 20 31 30 30 3b 0a 20 20 7a  nLine = 100;.  z
7e00: 4c 69 6e 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e  Line = malloc( n
7e10: 4c 69 6e 65 20 29 3b 0a 20 20 69 66 28 20 7a 4c  Line );.  if( zL
7e20: 69 6e 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ine==0 ) return 
7e30: 30 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 77 68  0;.  n = 0;.  wh
7e40: 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69 66  ile( 1 ){.    if
7e50: 28 20 6e 2b 31 30 30 3e 6e 4c 69 6e 65 20 29 7b  ( n+100>nLine ){
7e60: 0a 20 20 20 20 20 20 6e 4c 69 6e 65 20 3d 20 6e  .      nLine = n
7e70: 4c 69 6e 65 2a 32 20 2b 20 31 30 30 3b 0a 20 20  Line*2 + 100;.  
7e80: 20 20 20 20 7a 4c 69 6e 65 20 3d 20 72 65 61 6c      zLine = real
7e90: 6c 6f 63 28 7a 4c 69 6e 65 2c 20 6e 4c 69 6e 65  loc(zLine, nLine
7ea0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4c 69  );.      if( zLi
7eb0: 6e 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ne==0 ) return 0
7ec0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
7ed0: 66 67 65 74 73 28 26 7a 4c 69 6e 65 5b 6e 5d 2c  fgets(&zLine[n],
7ee0: 20 6e 4c 69 6e 65 20 2d 20 6e 2c 20 69 6e 29 3d   nLine - n, in)=
7ef0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
7f00: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
7f10: 66 72 65 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20  free(zLine);.   
7f20: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
7f30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4c 69       }.      zLi
7f40: 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20  ne[n] = 0;.     
7f50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
7f60: 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 6e    while( zLine[n
7f70: 5d 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 20 20  ] ){ n++; }.    
7f80: 69 66 28 20 6e 3e 30 20 26 26 20 7a 4c 69 6e 65  if( n>0 && zLine
7f90: 5b 6e 2d 31 5d 3d 3d 27 5c 6e 27 20 29 7b 0a 20  [n-1]=='\n' ){. 
7fa0: 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 20 20       n--;.      
7fb0: 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20  zLine[n] = 0;.  
7fc0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7fd0: 0a 20 20 7d 0a 20 20 7a 4c 69 6e 65 20 3d 20 72  .  }.  zLine = r
7fe0: 65 61 6c 6c 6f 63 28 20 7a 4c 69 6e 65 2c 20 6e  ealloc( zLine, n
7ff0: 2b 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  +1 );.  return z
8000: 4c 69 6e 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  Line;.}.../*.** 
8010: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
8020: 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6d 70   part of the imp
8030: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
8040: 68 65 20 63 6f 6d 6d 61 6e 64 3a 0a 2a 2a 0a 2a  he command:.**.*
8050: 2a 20 20 20 24 64 62 20 74 72 61 6e 73 61 63 74  *   $db transact
8060: 69 6f 6e 20 5b 2d 64 65 66 65 72 72 65 64 7c 2d  ion [-deferred|-
8070: 69 6d 6d 65 64 69 61 74 65 7c 2d 65 78 63 6c 75  immediate|-exclu
8080: 73 69 76 65 5d 20 53 43 52 49 50 54 0a 2a 2a 0a  sive] SCRIPT.**.
8090: 2a 2a 20 49 74 20 69 73 20 69 6e 76 6f 6b 65 64  ** It is invoked
80a0: 20 61 66 74 65 72 20 65 76 61 6c 75 61 74 69 6e   after evaluatin
80b0: 67 20 74 68 65 20 73 63 72 69 70 74 20 53 43 52  g the script SCR
80c0: 49 50 54 20 74 6f 20 63 6f 6d 6d 69 74 20 6f 72  IPT to commit or
80d0: 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 74 68 65   rollback.** the
80e0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20   transaction or 
80f0: 73 61 76 65 70 6f 69 6e 74 20 6f 70 65 6e 65 64  savepoint opened
8100: 20 62 79 20 74 68 65 20 5b 74 72 61 6e 73 61 63   by the [transac
8110: 74 69 6f 6e 5d 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  tion] command..*
8120: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 54  /.static int DbT
8130: 72 61 6e 73 50 6f 73 74 43 6d 64 28 0a 20 20 43  ransPostCmd(.  C
8140: 6c 69 65 6e 74 44 61 74 61 20 64 61 74 61 5b 5d  lientData data[]
8150: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
8160: 20 20 20 20 2f 2a 20 64 61 74 61 5b 30 5d 20 69      /* data[0] i
8170: 73 20 74 68 65 20 53 71 6c 69 74 65 33 44 62 2a  s the Sqlite3Db*
8180: 20 66 6f 72 20 24 64 62 20 2a 2f 0a 20 20 54 63   for $db */.  Tc
8190: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
81a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
81b0: 20 20 20 2f 2a 20 54 63 6c 20 69 6e 74 65 72 70     /* Tcl interp
81c0: 72 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  reter */.  int r
81d0: 65 73 75 6c 74 20 20 20 20 20 20 20 20 20 20 20  esult           
81e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81f0: 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 65 76 61  /* Result of eva
8200: 6c 75 61 74 69 6e 67 20 53 43 52 49 50 54 20 2a  luating SCRIPT *
8210: 2f 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  /.){.  static co
8220: 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 20  nst char *const 
8230: 61 7a 45 6e 64 5b 5d 20 3d 20 7b 0a 20 20 20 20  azEnd[] = {.    
8240: 22 52 45 4c 45 41 53 45 20 5f 74 63 6c 5f 74 72  "RELEASE _tcl_tr
8250: 61 6e 73 61 63 74 69 6f 6e 22 2c 20 20 20 20 20  ansaction",     
8260: 20 20 20 2f 2a 20 72 63 3d 3d 54 43 4c 5f 45 52     /* rc==TCL_ER
8270: 52 4f 52 2c 20 6e 54 72 61 6e 73 61 63 74 69 6f  ROR, nTransactio
8280: 6e 21 3d 30 20 2a 2f 0a 20 20 20 20 22 43 4f 4d  n!=0 */.    "COM
8290: 4d 49 54 22 2c 20 20 20 20 20 20 20 20 20 20 20  MIT",           
82a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
82b0: 2a 20 72 63 21 3d 54 43 4c 5f 45 52 52 4f 52 2c  * rc!=TCL_ERROR,
82c0: 20 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 30   nTransaction==0
82d0: 20 2a 2f 0a 20 20 20 20 22 52 4f 4c 4c 42 41 43   */.    "ROLLBAC
82e0: 4b 20 54 4f 20 5f 74 63 6c 5f 74 72 61 6e 73 61  K TO _tcl_transa
82f0: 63 74 69 6f 6e 20 3b 20 52 45 4c 45 41 53 45 20  ction ; RELEASE 
8300: 5f 74 63 6c 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _tcl_transaction
8310: 22 2c 0a 20 20 20 20 22 52 4f 4c 4c 42 41 43 4b  ",.    "ROLLBACK
8320: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
8330: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 63 3d            /* rc=
8340: 3d 54 43 4c 5f 45 52 52 4f 52 2c 20 6e 54 72 61  =TCL_ERROR, nTra
8350: 6e 73 61 63 74 69 6f 6e 3d 3d 30 20 2a 2f 0a 20  nsaction==0 */. 
8360: 20 7d 3b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a   };.  SqliteDb *
8370: 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a  pDb = (SqliteDb*
8380: 29 64 61 74 61 5b 30 5d 3b 0a 20 20 69 6e 74 20  )data[0];.  int 
8390: 72 63 20 3d 20 72 65 73 75 6c 74 3b 0a 20 20 63  rc = result;.  c
83a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e 64 3b  onst char *zEnd;
83b0: 0a 0a 20 20 70 44 62 2d 3e 6e 54 72 61 6e 73 61  ..  pDb->nTransa
83c0: 63 74 69 6f 6e 2d 2d 3b 0a 20 20 7a 45 6e 64 20  ction--;.  zEnd 
83d0: 3d 20 61 7a 45 6e 64 5b 28 72 63 3d 3d 54 43 4c  = azEnd[(rc==TCL
83e0: 5f 45 52 52 4f 52 29 2a 32 20 2b 20 28 70 44 62  _ERROR)*2 + (pDb
83f0: 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  ->nTransaction==
8400: 30 29 5d 3b 0a 0a 20 20 70 44 62 2d 3e 64 69 73  0)];..  pDb->dis
8410: 61 62 6c 65 41 75 74 68 2b 2b 3b 0a 20 20 69 66  ableAuth++;.  if
8420: 28 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70  ( sqlite3_exec(p
8430: 44 62 2d 3e 64 62 2c 20 7a 45 6e 64 2c 20 30 2c  Db->db, zEnd, 0,
8440: 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20   0, 0) ){.      
8450: 2f 2a 20 54 68 69 73 20 69 73 20 61 20 74 72 69  /* This is a tri
8460: 63 6b 79 20 73 63 65 6e 61 72 69 6f 20 74 6f 20  cky scenario to 
8470: 68 61 6e 64 6c 65 2e 20 54 68 65 20 6d 6f 73 74  handle. The most
8480: 20 6c 69 6b 65 6c 79 20 63 61 75 73 65 20 6f 66   likely cause of
8490: 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 65 72 72   an.      ** err
84a0: 6f 72 20 69 73 20 74 68 61 74 20 74 68 65 20 65  or is that the e
84b0: 78 65 63 28 29 20 61 62 6f 76 65 20 77 61 73 20  xec() above was 
84c0: 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 63 6f  an attempt to co
84d0: 6d 6d 69 74 20 74 68 65 20 0a 20 20 20 20 20 20  mmit the .      
84e0: 2a 2a 20 74 6f 70 2d 6c 65 76 65 6c 20 74 72 61  ** top-level tra
84f0: 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20 72 65  nsaction that re
8500: 74 75 72 6e 65 64 20 53 51 4c 49 54 45 5f 42 55  turned SQLITE_BU
8510: 53 59 2e 20 4f 72 2c 20 6c 65 73 73 20 6c 69 6b  SY. Or, less lik
8520: 65 6c 79 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68  ely,.      ** th
8530: 61 74 20 61 6e 20 49 4f 2d 65 72 72 6f 72 20 68  at an IO-error h
8540: 61 73 20 6f 63 63 75 72 72 65 64 2e 20 49 6e 20  as occurred. In 
8550: 65 69 74 68 65 72 20 63 61 73 65 2c 20 74 68 72  either case, thr
8560: 6f 77 20 61 20 54 63 6c 20 65 78 63 65 70 74 69  ow a Tcl excepti
8570: 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  on.      ** and 
8580: 74 72 79 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  try to rollback 
8590: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
85a0: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
85b0: 2a 2a 20 42 75 74 20 69 74 20 63 6f 75 6c 64 20  ** But it could 
85c0: 61 6c 73 6f 20 62 65 20 74 68 61 74 20 74 68 65  also be that the
85d0: 20 75 73 65 72 20 65 78 65 63 75 74 65 64 20 6f   user executed o
85e0: 6e 65 20 6f 72 20 6d 6f 72 65 20 42 45 47 49 4e  ne or more BEGIN
85f0: 2c 20 0a 20 20 20 20 20 20 2a 2a 20 43 4f 4d 4d  , .      ** COMM
8600: 49 54 2c 20 53 41 56 45 50 4f 49 4e 54 2c 20 52  IT, SAVEPOINT, R
8610: 45 4c 45 41 53 45 20 6f 72 20 52 4f 4c 4c 42 41  ELEASE or ROLLBA
8620: 43 4b 20 63 6f 6d 6d 61 6e 64 73 20 74 68 61 74  CK commands that
8630: 20 61 72 65 20 63 6f 6e 66 75 73 69 6e 67 0a 20   are confusing. 
8640: 20 20 20 20 20 2a 2a 20 74 68 69 73 20 6d 65 74       ** this met
8650: 68 6f 64 27 73 20 6c 6f 67 69 63 2e 20 4e 6f 74  hod's logic. Not
8660: 20 63 6c 65 61 72 20 68 6f 77 20 74 68 69 73 20   clear how this 
8670: 77 6f 75 6c 64 20 62 65 20 62 65 73 74 20 68 61  would be best ha
8680: 6e 64 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  ndled..      */.
8690: 20 20 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f      if( rc!=TCL_
86a0: 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 54  ERROR ){.      T
86b0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
86c0: 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 5f  interp, sqlite3_
86d0: 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c  errmsg(pDb->db),
86e0: 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
86f0: 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52    rc = TCL_ERROR
8700: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
8710: 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62  te3_exec(pDb->db
8720: 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c  , "ROLLBACK", 0,
8730: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 70 44   0, 0);.  }.  pD
8740: 62 2d 3e 64 69 73 61 62 6c 65 41 75 74 68 2d 2d  b->disableAuth--
8750: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  ;..  return rc;.
8760: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20  }../*.** Unless 
8770: 53 51 4c 49 54 45 5f 54 45 53 54 20 69 73 20 64  SQLITE_TEST is d
8780: 65 66 69 6e 65 64 2c 20 74 68 69 73 20 66 75 6e  efined, this fun
8790: 63 74 69 6f 6e 20 69 73 20 61 20 73 69 6d 70 6c  ction is a simpl
87a0: 65 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64  e wrapper around
87b0: 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 70 72 65 70  .** sqlite3_prep
87c0: 61 72 65 5f 76 32 28 29 2e 20 49 66 20 53 51 4c  are_v2(). If SQL
87d0: 49 54 45 5f 54 45 53 54 20 69 73 20 64 65 66 69  ITE_TEST is defi
87e0: 6e 65 64 2c 20 74 68 65 6e 20 69 74 20 75 73 65  ned, then it use
87f0: 73 20 65 69 74 68 65 72 0a 2a 2a 20 73 71 6c 69  s either.** sqli
8800: 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 29  te3_prepare_v2()
8810: 20 6f 72 20 6c 65 67 61 63 79 20 69 6e 74 65 72   or legacy inter
8820: 66 61 63 65 20 73 71 6c 69 74 65 33 5f 70 72 65  face sqlite3_pre
8830: 70 61 72 65 28 29 2c 20 64 65 70 65 6e 64 69 6e  pare(), dependin
8840: 67 0a 2a 2a 20 6f 6e 20 77 68 65 74 68 65 72 20  g.** on whether 
8850: 6f 72 20 6e 6f 74 20 74 68 65 20 5b 64 62 5f 75  or not the [db_u
8860: 73 65 5f 6c 65 67 61 63 79 5f 70 72 65 70 61 72  se_legacy_prepar
8870: 65 5d 20 63 6f 6d 6d 61 6e 64 20 68 61 73 20 62  e] command has b
8880: 65 65 6e 20 75 73 65 64 20 74 6f 20 0a 2a 2a 20  een used to .** 
8890: 63 6f 6e 66 69 67 75 72 65 20 74 68 65 20 63 6f  configure the co
88a0: 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nnection..*/.sta
88b0: 74 69 63 20 69 6e 74 20 64 62 50 72 65 70 61 72  tic int dbPrepar
88c0: 65 28 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  e(.  SqliteDb *p
88d0: 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Db,             
88e0: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
88f0: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e   object */.  con
8900: 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 20  st char *zSql,  
8910: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8920: 53 51 4c 20 74 6f 20 63 6f 6d 70 69 6c 65 20 2a  SQL to compile *
8930: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
8940: 20 2a 2a 70 70 53 74 6d 74 2c 20 20 20 20 20 20   **ppStmt,      
8950: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 72 65 70      /* OUT: Prep
8960: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a  ared statement *
8970: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
8980: 2a 70 7a 4f 75 74 20 20 20 20 20 20 20 20 20 20  *pzOut          
8990: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f 69 6e      /* OUT: Poin
89a0: 74 65 72 20 74 6f 20 6e 65 78 74 20 53 51 4c 20  ter to next SQL 
89b0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a  statement */.){.
89c0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
89d0: 53 54 0a 20 20 69 66 28 20 70 44 62 2d 3e 62 4c  ST.  if( pDb->bL
89e0: 65 67 61 63 79 50 72 65 70 61 72 65 20 29 7b 0a  egacyPrepare ){.
89f0: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
8a00: 65 33 5f 70 72 65 70 61 72 65 28 70 44 62 2d 3e  e3_prepare(pDb->
8a10: 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 70 70  db, zSql, -1, pp
8a20: 53 74 6d 74 2c 20 70 7a 4f 75 74 29 3b 0a 20 20  Stmt, pzOut);.  
8a30: 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
8a40: 6e 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  n sqlite3_prepar
8a50: 65 5f 76 32 28 70 44 62 2d 3e 64 62 2c 20 7a 53  e_v2(pDb->db, zS
8a60: 71 6c 2c 20 2d 31 2c 20 70 70 53 74 6d 74 2c 20  ql, -1, ppStmt, 
8a70: 70 7a 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pzOut);.}../*.**
8a80: 20 53 65 61 72 63 68 20 74 68 65 20 63 61 63 68   Search the cach
8a90: 65 20 66 6f 72 20 61 20 70 72 65 70 61 72 65 64  e for a prepared
8aa0: 2d 73 74 61 74 65 6d 65 6e 74 20 6f 62 6a 65 63  -statement objec
8ab0: 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74  t that implement
8ac0: 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 53  s the.** first S
8ad0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  QL statement in 
8ae0: 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74  the buffer point
8af0: 65 64 20 74 6f 20 62 79 20 70 61 72 61 6d 65 74  ed to by paramet
8b00: 65 72 20 7a 49 6e 2e 20 49 66 0a 2a 2a 20 6e 6f  er zIn. If.** no
8b10: 20 73 75 63 68 20 70 72 65 70 61 72 65 64 2d 73   such prepared-s
8b20: 74 61 74 65 6d 65 6e 74 20 63 61 6e 20 62 65 20  tatement can be 
8b30: 66 6f 75 6e 64 2c 20 61 6c 6c 6f 63 61 74 65 20  found, allocate 
8b40: 61 6e 64 20 70 72 65 70 61 72 65 20 61 20 6e 65  and prepare a ne
8b50: 77 0a 2a 2a 20 6f 6e 65 2e 20 49 6e 20 65 69 74  w.** one. In eit
8b60: 68 65 72 20 63 61 73 65 2c 20 62 69 6e 64 20 74  her case, bind t
8b70: 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
8b80: 73 20 6f 66 20 74 68 65 20 72 65 6c 65 76 61 6e  s of the relevan
8b90: 74 20 54 63 6c 0a 2a 2a 20 76 61 72 69 61 62 6c  t Tcl.** variabl
8ba0: 65 73 20 74 6f 20 61 6e 79 20 24 76 61 72 2c 20  es to any $var, 
8bb0: 3a 76 61 72 20 6f 72 20 40 76 61 72 20 76 61 72  :var or @var var
8bc0: 69 61 62 6c 65 73 20 69 6e 20 74 68 65 20 73 74  iables in the st
8bd0: 61 74 65 6d 65 6e 74 2e 20 42 65 66 6f 72 65 0a  atement. Before.
8be0: 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2c 20 73 65  ** returning, se
8bf0: 74 20 2a 70 70 50 72 65 53 74 6d 74 20 74 6f 20  t *ppPreStmt to 
8c00: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 72 65  point to the pre
8c10: 70 61 72 65 64 2d 73 74 61 74 65 6d 65 6e 74 20  pared-statement 
8c20: 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 4f 75  object..**.** Ou
8c30: 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 20 2a  tput parameter *
8c40: 70 7a 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  pzOut is set to 
8c50: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 78  point to the nex
8c60: 74 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  t SQL statement 
8c70: 69 6e 0a 2a 2a 20 62 75 66 66 65 72 20 7a 49 6e  in.** buffer zIn
8c80: 2c 20 6f 72 20 74 6f 20 74 68 65 20 27 5c 30 27  , or to the '\0'
8c90: 20 62 79 74 65 20 61 74 20 74 68 65 20 65 6e 64   byte at the end
8ca0: 20 6f 66 20 7a 49 6e 20 69 66 20 74 68 65 72 65   of zIn if there
8cb0: 20 69 73 20 6e 6f 0a 2a 2a 20 6e 65 78 74 20 73   is no.** next s
8cc0: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
8cd0: 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 54  If successful, T
8ce0: 43 4c 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  CL_OK is returne
8cf0: 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 54 43  d. Otherwise, TC
8d00: 4c 5f 45 52 52 4f 52 20 69 73 20 72 65 74 75 72  L_ERROR is retur
8d10: 6e 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72  ned.** and an er
8d20: 72 6f 72 20 6d 65 73 73 61 67 65 20 6c 6f 61 64  ror message load
8d30: 65 64 20 69 6e 74 6f 20 69 6e 74 65 72 70 72 65  ed into interpre
8d40: 74 65 72 20 70 44 62 2d 3e 69 6e 74 65 72 70 2e  ter pDb->interp.
8d50: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
8d60: 62 50 72 65 70 61 72 65 41 6e 64 42 69 6e 64 28  bPrepareAndBind(
8d70: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
8d80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
8d90: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6f     /* Database o
8da0: 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20  bject */.  char 
8db0: 63 6f 6e 73 74 20 2a 7a 49 6e 2c 20 20 20 20 20  const *zIn,     
8dc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51             /* SQ
8dd0: 4c 20 74 6f 20 63 6f 6d 70 69 6c 65 20 2a 2f 0a  L to compile */.
8de0: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70    char const **p
8df0: 7a 4f 75 74 2c 20 20 20 20 20 20 20 20 20 20 20  zOut,           
8e00: 20 20 2f 2a 20 4f 55 54 3a 20 50 6f 69 6e 74 65    /* OUT: Pointe
8e10: 72 20 74 6f 20 6e 65 78 74 20 53 51 4c 20 73 74  r to next SQL st
8e20: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 71 6c  atement */.  Sql
8e30: 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 2a 70  PreparedStmt **p
8e40: 70 50 72 65 53 74 6d 74 20 20 20 20 20 2f 2a 20  pPreStmt     /* 
8e50: 4f 55 54 3a 20 4f 62 6a 65 63 74 20 75 73 65 64  OUT: Object used
8e60: 20 74 6f 20 63 61 63 68 65 20 73 74 61 74 65 6d   to cache statem
8e70: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  ent */.){.  cons
8e80: 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 7a  t char *zSql = z
8e90: 49 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50  In;         /* P
8ea0: 6f 69 6e 74 65 72 20 74 6f 20 66 69 72 73 74 20  ointer to first 
8eb0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  SQL statement in
8ec0: 20 7a 49 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65   zIn */.  sqlite
8ed0: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
8ee0: 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65  0;        /* Pre
8ef0: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
8f00: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 53 71 6c 50  object */.  SqlP
8f10: 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70 50 72  reparedStmt *pPr
8f20: 65 53 74 6d 74 3b 20 20 20 20 20 20 2f 2a 20 50  eStmt;      /* P
8f30: 6f 69 6e 74 65 72 20 74 6f 20 63 61 63 68 65 64  ointer to cached
8f40: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
8f50: 69 6e 74 20 6e 53 71 6c 3b 20 20 20 20 20 20 20  int nSql;       
8f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f70: 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 53 71  /* Length of zSq
8f80: 6c 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  l in bytes */.  
8f90: 69 6e 74 20 6e 56 61 72 20 3d 20 30 3b 20 20 20  int nVar = 0;   
8fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fb0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61 72  /* Number of var
8fc0: 69 61 62 6c 65 73 20 69 6e 20 73 74 61 74 65 6d  iables in statem
8fd0: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  ent */.  int iPa
8fe0: 72 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  rm = 0;         
8ff0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
9000: 20 66 72 65 65 20 65 6e 74 72 79 20 69 6e 20 61   free entry in a
9010: 70 50 61 72 6d 20 2a 2f 0a 20 20 63 68 61 72 20  pParm */.  char 
9020: 63 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 54 63  c;.  int i;.  Tc
9030: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
9040: 20 3d 20 70 44 62 2d 3e 69 6e 74 65 72 70 3b 0a   = pDb->interp;.
9050: 0a 20 20 2a 70 70 50 72 65 53 74 6d 74 20 3d 20  .  *ppPreStmt = 
9060: 30 3b 0a 0a 20 20 2f 2a 20 54 72 69 6d 20 73 70  0;..  /* Trim sp
9070: 61 63 65 73 20 66 72 6f 6d 20 74 68 65 20 73 74  aces from the st
9080: 61 72 74 20 6f 66 20 7a 53 71 6c 20 61 6e 64 20  art of zSql and 
9090: 63 61 6c 63 75 6c 61 74 65 20 74 68 65 20 72 65  calculate the re
90a0: 6d 61 69 6e 69 6e 67 20 6c 65 6e 67 74 68 2e 20  maining length. 
90b0: 2a 2f 0a 20 20 77 68 69 6c 65 28 20 28 63 20 3d  */.  while( (c =
90c0: 20 7a 53 71 6c 5b 30 5d 29 3d 3d 27 20 27 20 7c   zSql[0])==' ' |
90d0: 7c 20 63 3d 3d 27 5c 74 27 20 7c 7c 20 63 3d 3d  | c=='\t' || c==
90e0: 27 5c 72 27 20 7c 7c 20 63 3d 3d 27 5c 6e 27 20  '\r' || c=='\n' 
90f0: 29 7b 20 7a 53 71 6c 2b 2b 3b 20 7d 0a 20 20 6e  ){ zSql++; }.  n
9100: 53 71 6c 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a  Sql = strlen30(z
9110: 53 71 6c 29 3b 0a 0a 20 20 66 6f 72 28 70 50 72  Sql);..  for(pPr
9120: 65 53 74 6d 74 20 3d 20 70 44 62 2d 3e 73 74 6d  eStmt = pDb->stm
9130: 74 4c 69 73 74 3b 20 70 50 72 65 53 74 6d 74 3b  tList; pPreStmt;
9140: 20 70 50 72 65 53 74 6d 74 3d 70 50 72 65 53 74   pPreStmt=pPreSt
9150: 6d 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  mt->pNext){.    
9160: 69 6e 74 20 6e 20 3d 20 70 50 72 65 53 74 6d 74  int n = pPreStmt
9170: 2d 3e 6e 53 71 6c 3b 0a 20 20 20 20 69 66 28 20  ->nSql;.    if( 
9180: 6e 53 71 6c 3e 3d 6e 20 0a 20 20 20 20 20 20 20  nSql>=n .       
9190: 20 26 26 20 6d 65 6d 63 6d 70 28 70 50 72 65 53   && memcmp(pPreS
91a0: 74 6d 74 2d 3e 7a 53 71 6c 2c 20 7a 53 71 6c 2c  tmt->zSql, zSql,
91b0: 20 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 26   n)==0.        &
91c0: 26 20 28 7a 53 71 6c 5b 6e 5d 3d 3d 30 20 7c 7c  & (zSql[n]==0 ||
91d0: 20 7a 53 71 6c 5b 6e 2d 31 5d 3d 3d 27 3b 27 29   zSql[n-1]==';')
91e0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 53  .    ){.      pS
91f0: 74 6d 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e  tmt = pPreStmt->
9200: 70 53 74 6d 74 3b 0a 20 20 20 20 20 20 2a 70 7a  pStmt;.      *pz
9210: 4f 75 74 20 3d 20 26 7a 53 71 6c 5b 70 50 72 65  Out = &zSql[pPre
9220: 53 74 6d 74 2d 3e 6e 53 71 6c 5d 3b 0a 0a 20 20  Stmt->nSql];..  
9230: 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 20 70 72      /* When a pr
9240: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
9250: 20 69 73 20 66 6f 75 6e 64 2c 20 75 6e 6c 69 6e   is found, unlin
9260: 6b 20 69 74 20 66 72 6f 6d 20 74 68 65 0a 20 20  k it from the.  
9270: 20 20 20 20 2a 2a 20 63 61 63 68 65 20 6c 69 73      ** cache lis
9280: 74 2e 20 20 49 74 20 77 69 6c 6c 20 6c 61 74 65  t.  It will late
9290: 72 20 62 65 20 61 64 64 65 64 20 62 61 63 6b 20  r be added back 
92a0: 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
92b0: 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  .      ** of the
92c0: 20 63 61 63 68 65 20 6c 69 73 74 20 69 6e 20 6f   cache list in o
92d0: 72 64 65 72 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  rder to implemen
92e0: 74 20 4c 52 55 20 72 65 70 6c 61 63 65 6d 65 6e  t LRU replacemen
92f0: 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
9300: 20 20 69 66 28 20 70 50 72 65 53 74 6d 74 2d 3e    if( pPreStmt->
9310: 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20  pPrev ){.       
9320: 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76   pPreStmt->pPrev
9330: 2d 3e 70 4e 65 78 74 20 3d 20 70 50 72 65 53 74  ->pNext = pPreSt
9340: 6d 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  mt->pNext;.     
9350: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
9360: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 3d 20  pDb->stmtList = 
9370: 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 3b  pPreStmt->pNext;
9380: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
9390: 66 28 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65  f( pPreStmt->pNe
93a0: 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  xt ){.        pP
93b0: 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 2d 3e 70  reStmt->pNext->p
93c0: 50 72 65 76 20 3d 20 70 50 72 65 53 74 6d 74 2d  Prev = pPreStmt-
93d0: 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20 7d 65  >pPrev;.      }e
93e0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62  lse{.        pDb
93f0: 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20 70 50 72  ->stmtLast = pPr
9400: 65 53 74 6d 74 2d 3e 70 50 72 65 76 3b 0a 20 20  eStmt->pPrev;.  
9410: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 44 62 2d      }.      pDb-
9420: 3e 6e 53 74 6d 74 2d 2d 3b 0a 20 20 20 20 20 20  >nStmt--;.      
9430: 6e 56 61 72 20 3d 20 73 71 6c 69 74 65 33 5f 62  nVar = sqlite3_b
9440: 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f  ind_parameter_co
9450: 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  unt(pStmt);.    
9460: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
9470: 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 6e 6f   }.  .  /* If no
9480: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
9490: 65 6e 74 20 77 61 73 20 66 6f 75 6e 64 2e 20 43  ent was found. C
94a0: 6f 6d 70 69 6c 65 20 74 68 65 20 53 51 4c 20 74  ompile the SQL t
94b0: 65 78 74 2e 20 41 6c 73 6f 20 61 6c 6c 6f 63 61  ext. Also alloca
94c0: 74 65 0a 20 20 2a 2a 20 61 20 6e 65 77 20 53 71  te.  ** a new Sq
94d0: 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 73 74  lPreparedStmt st
94e0: 72 75 63 74 75 72 65 2e 20 20 2a 2f 0a 20 20 69  ructure.  */.  i
94f0: 66 28 20 70 50 72 65 53 74 6d 74 3d 3d 30 20 29  f( pPreStmt==0 )
9500: 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b  {.    int nByte;
9510: 0a 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  ..    if( SQLITE
9520: 5f 4f 4b 21 3d 64 62 50 72 65 70 61 72 65 28 70  _OK!=dbPrepare(p
9530: 44 62 2c 20 7a 53 71 6c 2c 20 26 70 53 74 6d 74  Db, zSql, &pStmt
9540: 2c 20 70 7a 4f 75 74 29 20 29 7b 0a 20 20 20 20  , pzOut) ){.    
9550: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
9560: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
9570: 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69  ewStringObj(sqli
9580: 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e  te3_errmsg(pDb->
9590: 64 62 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 20  db), -1));.     
95a0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
95b0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  R;.    }.    if(
95c0: 20 70 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20   pStmt==0 ){.   
95d0: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
95e0: 21 3d 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  !=sqlite3_errcod
95f0: 65 28 70 44 62 2d 3e 64 62 29 20 29 7b 0a 20 20  e(pDb->db) ){.  
9600: 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 6d 70 69        /* A compi
9610: 6c 65 2d 74 69 6d 65 20 65 72 72 6f 72 20 69 6e  le-time error in
9620: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20   the statement. 
9630: 2a 2f 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 53  */.        Tcl_S
9640: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
9650: 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  rp, Tcl_NewStrin
9660: 67 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65 72 72  gObj(sqlite3_err
9670: 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 2d 31  msg(pDb->db), -1
9680: 29 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ));.        retu
9690: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
96a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
96b0: 20 20 20 2f 2a 20 54 68 65 20 73 74 61 74 65 6d     /* The statem
96c0: 65 6e 74 20 77 61 73 20 61 20 6e 6f 2d 6f 70 2e  ent was a no-op.
96d0: 20 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20 74 68    Continue to th
96e0: 65 20 6e 65 78 74 20 73 74 61 74 65 6d 65 6e 74  e next statement
96f0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74  .        ** in t
9700: 68 65 20 53 51 4c 20 73 74 72 69 6e 67 2e 0a 20  he SQL string.. 
9710: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
9720: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
9730: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
9740: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 65      assert( pPre
9750: 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 6e  Stmt==0 );.    n
9760: 56 61 72 20 3d 20 73 71 6c 69 74 65 33 5f 62 69  Var = sqlite3_bi
9770: 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75  nd_parameter_cou
9780: 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 6e  nt(pStmt);.    n
9790: 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 53 71  Byte = sizeof(Sq
97a0: 6c 50 72 65 70 61 72 65 64 53 74 6d 74 29 20 2b  lPreparedStmt) +
97b0: 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 54 63 6c   nVar*sizeof(Tcl
97c0: 5f 4f 62 6a 20 2a 29 3b 0a 20 20 20 20 70 50 72  _Obj *);.    pPr
97d0: 65 53 74 6d 74 20 3d 20 28 53 71 6c 50 72 65 70  eStmt = (SqlPrep
97e0: 61 72 65 64 53 74 6d 74 2a 29 54 63 6c 5f 41 6c  aredStmt*)Tcl_Al
97f0: 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20 20 20  loc(nByte);.    
9800: 6d 65 6d 73 65 74 28 70 50 72 65 53 74 6d 74 2c  memset(pPreStmt,
9810: 20 30 2c 20 6e 42 79 74 65 29 3b 0a 0a 20 20 20   0, nByte);..   
9820: 20 70 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74   pPreStmt->pStmt
9830: 20 3d 20 70 53 74 6d 74 3b 0a 20 20 20 20 70 50   = pStmt;.    pP
9840: 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 20 3d 20 28  reStmt->nSql = (
9850: 69 6e 74 29 28 2a 70 7a 4f 75 74 20 2d 20 7a 53  int)(*pzOut - zS
9860: 71 6c 29 3b 0a 20 20 20 20 70 50 72 65 53 74 6d  ql);.    pPreStm
9870: 74 2d 3e 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65  t->zSql = sqlite
9880: 33 5f 73 71 6c 28 70 53 74 6d 74 29 3b 0a 20 20  3_sql(pStmt);.  
9890: 20 20 70 50 72 65 53 74 6d 74 2d 3e 61 70 50 61    pPreStmt->apPa
98a0: 72 6d 20 3d 20 28 54 63 6c 5f 4f 62 6a 20 2a 2a  rm = (Tcl_Obj **
98b0: 29 26 70 50 72 65 53 74 6d 74 5b 31 5d 3b 0a 23  )&pPreStmt[1];.#
98c0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
98d0: 54 0a 20 20 20 20 69 66 28 20 70 50 72 65 53 74  T.    if( pPreSt
98e0: 6d 74 2d 3e 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20  mt->zSql==0 ){. 
98f0: 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 70 79       char *zCopy
9900: 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 70 50 72   = Tcl_Alloc(pPr
9910: 65 53 74 6d 74 2d 3e 6e 53 71 6c 20 2b 20 31 29  eStmt->nSql + 1)
9920: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a  ;.      memcpy(z
9930: 43 6f 70 79 2c 20 7a 53 71 6c 2c 20 70 50 72 65  Copy, zSql, pPre
9940: 53 74 6d 74 2d 3e 6e 53 71 6c 29 3b 0a 20 20 20  Stmt->nSql);.   
9950: 20 20 20 7a 43 6f 70 79 5b 70 50 72 65 53 74 6d     zCopy[pPreStm
9960: 74 2d 3e 6e 53 71 6c 5d 20 3d 20 27 5c 30 27 3b  t->nSql] = '\0';
9970: 0a 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d  .      pPreStmt-
9980: 3e 7a 53 71 6c 20 3d 20 7a 43 6f 70 79 3b 0a 20  >zSql = zCopy;. 
9990: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
99a0: 20 20 61 73 73 65 72 74 28 20 70 50 72 65 53 74    assert( pPreSt
99b0: 6d 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  mt );.  assert( 
99c0: 73 74 72 6c 65 6e 33 30 28 70 50 72 65 53 74 6d  strlen30(pPreStm
99d0: 74 2d 3e 7a 53 71 6c 29 3d 3d 70 50 72 65 53 74  t->zSql)==pPreSt
99e0: 6d 74 2d 3e 6e 53 71 6c 20 29 3b 0a 20 20 61 73  mt->nSql );.  as
99f0: 73 65 72 74 28 20 30 3d 3d 6d 65 6d 63 6d 70 28  sert( 0==memcmp(
9a00: 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 2c 20  pPreStmt->zSql, 
9a10: 7a 53 71 6c 2c 20 70 50 72 65 53 74 6d 74 2d 3e  zSql, pPreStmt->
9a20: 6e 53 71 6c 29 20 29 3b 0a 0a 20 20 2f 2a 20 42  nSql) );..  /* B
9a30: 69 6e 64 20 76 61 6c 75 65 73 20 74 6f 20 70 61  ind values to pa
9a40: 72 61 6d 65 74 65 72 73 20 74 68 61 74 20 62 65  rameters that be
9a50: 67 69 6e 20 77 69 74 68 20 24 20 6f 72 20 3a 20  gin with $ or : 
9a60: 2a 2f 20 20 0a 20 20 66 6f 72 28 69 3d 31 3b 20  */  .  for(i=1; 
9a70: 69 3c 3d 6e 56 61 72 3b 20 69 2b 2b 29 7b 0a 20  i<=nVar; i++){. 
9a80: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
9a90: 56 61 72 20 3d 20 73 71 6c 69 74 65 33 5f 62 69  Var = sqlite3_bi
9aa0: 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d  nd_parameter_nam
9ab0: 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20  e(pStmt, i);.   
9ac0: 20 69 66 28 20 7a 56 61 72 21 3d 30 20 26 26 20   if( zVar!=0 && 
9ad0: 28 7a 56 61 72 5b 30 5d 3d 3d 27 24 27 20 7c 7c  (zVar[0]=='$' ||
9ae0: 20 7a 56 61 72 5b 30 5d 3d 3d 27 3a 27 20 7c 7c   zVar[0]==':' ||
9af0: 20 7a 56 61 72 5b 30 5d 3d 3d 27 40 27 29 20 29   zVar[0]=='@') )
9b00: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20  {.      Tcl_Obj 
9b10: 2a 70 56 61 72 20 3d 20 54 63 6c 5f 47 65 74 56  *pVar = Tcl_GetV
9b20: 61 72 32 45 78 28 69 6e 74 65 72 70 2c 20 26 7a  ar2Ex(interp, &z
9b30: 56 61 72 5b 31 5d 2c 20 30 2c 20 30 29 3b 0a 20  Var[1], 0, 0);. 
9b40: 20 20 20 20 20 69 66 28 20 70 56 61 72 20 29 7b       if( pVar ){
9b50: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a  .        int n;.
9b60: 20 20 20 20 20 20 20 20 75 38 20 2a 64 61 74 61          u8 *data
9b70: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  ;.        const 
9b80: 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 28 70  char *zType = (p
9b90: 56 61 72 2d 3e 74 79 70 65 50 74 72 20 3f 20 70  Var->typePtr ? p
9ba0: 56 61 72 2d 3e 74 79 70 65 50 74 72 2d 3e 6e 61  Var->typePtr->na
9bb0: 6d 65 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20  me : "");.      
9bc0: 20 20 63 20 3d 20 7a 54 79 70 65 5b 30 5d 3b 0a    c = zType[0];.
9bd0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 56 61 72          if( zVar
9be0: 5b 30 5d 3d 3d 27 40 27 20 7c 7c 0a 20 20 20 20  [0]=='@' ||.    
9bf0: 20 20 20 20 20 20 20 28 63 3d 3d 27 62 27 20 26         (c=='b' &
9c00: 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22  & strcmp(zType,"
9c10: 62 79 74 65 61 72 72 61 79 22 29 3d 3d 30 20 26  bytearray")==0 &
9c20: 26 20 70 56 61 72 2d 3e 62 79 74 65 73 3d 3d 30  & pVar->bytes==0
9c30: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  ) ){.          /
9c40: 2a 20 4c 6f 61 64 20 61 20 42 4c 4f 42 20 74 79  * Load a BLOB ty
9c50: 70 65 20 69 66 20 74 68 65 20 54 63 6c 20 76 61  pe if the Tcl va
9c60: 72 69 61 62 6c 65 20 69 73 20 61 20 62 79 74 65  riable is a byte
9c70: 61 72 72 61 79 20 61 6e 64 0a 20 20 20 20 20 20  array and.      
9c80: 20 20 20 20 2a 2a 20 69 74 20 68 61 73 20 6e 6f      ** it has no
9c90: 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e   string represen
9ca0: 74 61 74 69 6f 6e 20 6f 72 20 74 68 65 20 68 6f  tation or the ho
9cb0: 73 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  st.          ** 
9cc0: 70 61 72 61 6d 65 74 65 72 20 6e 61 6d 65 20 62  parameter name b
9cd0: 65 67 69 6e 73 20 77 69 74 68 20 22 40 22 2e 20  egins with "@". 
9ce0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 64 61 74  */.          dat
9cf0: 61 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41  a = Tcl_GetByteA
9d00: 72 72 61 79 46 72 6f 6d 4f 62 6a 28 70 56 61 72  rrayFromObj(pVar
9d10: 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  , &n);.         
9d20: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c   sqlite3_bind_bl
9d30: 6f 62 28 70 53 74 6d 74 2c 20 69 2c 20 64 61 74  ob(pStmt, i, dat
9d40: 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41  a, n, SQLITE_STA
9d50: 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20  TIC);.          
9d60: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
9d70: 28 70 56 61 72 29 3b 0a 20 20 20 20 20 20 20 20  (pVar);.        
9d80: 20 20 70 50 72 65 53 74 6d 74 2d 3e 61 70 50 61    pPreStmt->apPa
9d90: 72 6d 5b 69 50 61 72 6d 2b 2b 5d 20 3d 20 70 56  rm[iParm++] = pV
9da0: 61 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ar;.        }els
9db0: 65 20 69 66 28 20 63 3d 3d 27 62 27 20 26 26 20  e if( c=='b' && 
9dc0: 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 62 6f  strcmp(zType,"bo
9dd0: 6f 6c 65 61 6e 22 29 3d 3d 30 20 29 7b 0a 20 20  olean")==0 ){.  
9de0: 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 49          Tcl_GetI
9df0: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
9e00: 2c 20 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20  , pVar, &n);.   
9e10: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
9e20: 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20 69  ind_int(pStmt, i
9e30: 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  , n);.        }e
9e40: 6c 73 65 20 69 66 28 20 63 3d 3d 27 64 27 20 26  lse if( c=='d' &
9e50: 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22  & strcmp(zType,"
9e60: 64 6f 75 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20  double")==0 ){. 
9e70: 20 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20           double 
9e80: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  r;.          Tcl
9e90: 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62  _GetDoubleFromOb
9ea0: 6a 28 69 6e 74 65 72 70 2c 20 70 56 61 72 2c 20  j(interp, pVar, 
9eb0: 26 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  &r);.          s
9ec0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62  qlite3_bind_doub
9ed0: 6c 65 28 70 53 74 6d 74 2c 20 69 2c 20 72 29 3b  le(pStmt, i, r);
9ee0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
9ef0: 66 28 20 28 63 3d 3d 27 77 27 20 26 26 20 73 74  f( (c=='w' && st
9f00: 72 63 6d 70 28 7a 54 79 70 65 2c 22 77 69 64 65  rcmp(zType,"wide
9f10: 49 6e 74 22 29 3d 3d 30 29 20 7c 7c 0a 20 20 20  Int")==0) ||.   
9f20: 20 20 20 20 20 20 20 20 20 20 20 28 63 3d 3d 27             (c=='
9f30: 69 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79  i' && strcmp(zTy
9f40: 70 65 2c 22 69 6e 74 22 29 3d 3d 30 29 20 29 7b  pe,"int")==0) ){
9f50: 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 57  .          Tcl_W
9f60: 69 64 65 49 6e 74 20 76 3b 0a 20 20 20 20 20 20  ideInt v;.      
9f70: 20 20 20 20 54 63 6c 5f 47 65 74 57 69 64 65 49      Tcl_GetWideI
9f80: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
9f90: 2c 20 70 56 61 72 2c 20 26 76 29 3b 0a 20 20 20  , pVar, &v);.   
9fa0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
9fb0: 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c  ind_int64(pStmt,
9fc0: 20 69 2c 20 76 29 3b 0a 20 20 20 20 20 20 20 20   i, v);.        
9fd0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
9fe0: 20 64 61 74 61 20 3d 20 28 75 6e 73 69 67 6e 65   data = (unsigne
9ff0: 64 20 63 68 61 72 20 2a 29 54 63 6c 5f 47 65 74  d char *)Tcl_Get
a000: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 56  StringFromObj(pV
a010: 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20  ar, &n);.       
a020: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
a030: 74 65 78 74 28 70 53 74 6d 74 2c 20 69 2c 20 28  text(pStmt, i, (
a040: 63 68 61 72 20 2a 29 64 61 74 61 2c 20 6e 2c 20  char *)data, n, 
a050: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
a060: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e            Tcl_In
a070: 63 72 52 65 66 43 6f 75 6e 74 28 70 56 61 72 29  crRefCount(pVar)
a080: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 72 65  ;.          pPre
a090: 53 74 6d 74 2d 3e 61 70 50 61 72 6d 5b 69 50 61  Stmt->apParm[iPa
a0a0: 72 6d 2b 2b 5d 20 3d 20 70 56 61 72 3b 0a 20 20  rm++] = pVar;.  
a0b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
a0c0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
a0d0: 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70  ite3_bind_null(p
a0e0: 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Stmt, i);.      
a0f0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50  }.    }.  }.  pP
a100: 72 65 53 74 6d 74 2d 3e 6e 50 61 72 6d 20 3d 20  reStmt->nParm = 
a110: 69 50 61 72 6d 3b 0a 20 20 2a 70 70 50 72 65 53  iParm;.  *ppPreS
a120: 74 6d 74 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a  tmt = pPreStmt;.
a130: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
a140: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
a150: 73 65 20 61 20 73 74 61 74 65 6d 65 6e 74 20 72  se a statement r
a160: 65 66 65 72 65 6e 63 65 20 6f 62 74 61 69 6e 65  eference obtaine
a170: 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 64 62 50  d by calling dbP
a180: 72 65 70 61 72 65 41 6e 64 42 69 6e 64 28 29 2e  repareAndBind().
a190: 0a 2a 2a 20 54 68 65 72 65 20 73 68 6f 75 6c 64  .** There should
a1a0: 20 62 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20   be exactly one 
a1b0: 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 66 75 6e  call to this fun
a1c0: 63 74 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 63  ction for each c
a1d0: 61 6c 6c 20 74 6f 0a 2a 2a 20 64 62 50 72 65 70  all to.** dbPrep
a1e0: 61 72 65 41 6e 64 42 69 6e 64 28 29 2e 0a 2a 2a  areAndBind()..**
a1f0: 0a 2a 2a 20 49 66 20 74 68 65 20 64 69 73 63 61  .** If the disca
a200: 72 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  rd parameter is 
a210: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74  non-zero, then t
a220: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  he statement is 
a230: 64 65 6c 65 74 65 64 0a 2a 2a 20 69 6d 6d 65 64  deleted.** immed
a240: 69 61 74 65 6c 79 2e 20 4f 74 68 65 72 77 69 73  iately. Otherwis
a250: 65 20 69 74 20 69 73 20 61 64 64 65 64 20 74 6f  e it is added to
a260: 20 74 68 65 20 4c 52 55 20 6c 69 73 74 20 61 6e   the LRU list an
a270: 64 20 6d 61 79 20 62 65 20 72 65 74 75 72 6e 65  d may be returne
a280: 64 0a 2a 2a 20 62 79 20 61 20 73 75 62 73 65 71  d.** by a subseq
a290: 75 65 6e 74 20 63 61 6c 6c 20 74 6f 20 64 62 50  uent call to dbP
a2a0: 72 65 70 61 72 65 41 6e 64 42 69 6e 64 28 29 2e  repareAndBind().
a2b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
a2c0: 64 62 52 65 6c 65 61 73 65 53 74 6d 74 28 0a 20  dbReleaseStmt(. 
a2d0: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 2c 20   SqliteDb *pDb, 
a2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2f0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e   /* Database han
a300: 64 6c 65 20 2a 2f 0a 20 20 53 71 6c 50 72 65 70  dle */.  SqlPrep
a310: 61 72 65 64 53 74 6d 74 20 2a 70 50 72 65 53 74  aredStmt *pPreSt
a320: 6d 74 2c 20 20 20 20 20 20 2f 2a 20 50 72 65 70  mt,      /* Prep
a330: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 68  ared statement h
a340: 61 6e 64 6c 65 20 74 6f 20 72 65 6c 65 61 73 65  andle to release
a350: 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 63 61 72   */.  int discar
a360: 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
a370: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
a380: 20 64 65 6c 65 74 65 20 28 6e 6f 74 20 63 61 63   delete (not cac
a390: 68 65 29 20 74 68 65 20 70 50 72 65 53 74 6d 74  he) the pPreStmt
a3a0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
a3b0: 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20 62  .  /* Free the b
a3c0: 6f 75 6e 64 20 73 74 72 69 6e 67 20 61 6e 64 20  ound string and 
a3d0: 62 6c 6f 62 20 70 61 72 61 6d 65 74 65 72 73 20  blob parameters 
a3e0: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
a3f0: 70 50 72 65 53 74 6d 74 2d 3e 6e 50 61 72 6d 3b  pPreStmt->nParm;
a400: 20 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 44   i++){.    Tcl_D
a410: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 50 72 65  ecrRefCount(pPre
a420: 53 74 6d 74 2d 3e 61 70 50 61 72 6d 5b 69 5d 29  Stmt->apParm[i])
a430: 3b 0a 20 20 7d 0a 20 20 70 50 72 65 53 74 6d 74  ;.  }.  pPreStmt
a440: 2d 3e 6e 50 61 72 6d 20 3d 20 30 3b 0a 0a 20 20  ->nParm = 0;..  
a450: 69 66 28 20 70 44 62 2d 3e 6d 61 78 53 74 6d 74  if( pDb->maxStmt
a460: 3c 3d 30 20 7c 7c 20 64 69 73 63 61 72 64 20 29  <=0 || discard )
a470: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
a480: 63 61 63 68 65 20 69 73 20 74 75 72 6e 65 64 20  cache is turned 
a490: 6f 66 66 2c 20 64 65 61 6c 6c 6f 63 61 74 65 64  off, deallocated
a4a0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a   the statement *
a4b0: 2f 0a 20 20 20 20 64 62 46 72 65 65 53 74 6d 74  /.    dbFreeStmt
a4c0: 28 70 50 72 65 53 74 6d 74 29 3b 0a 20 20 7d 65  (pPreStmt);.  }e
a4d0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 41 64 64 20  lse{.    /* Add 
a4e0: 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
a4f0: 74 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 62 65  tement to the be
a500: 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 63  ginning of the c
a510: 61 63 68 65 20 6c 69 73 74 2e 20 2a 2f 0a 20 20  ache list. */.  
a520: 20 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78    pPreStmt->pNex
a530: 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73  t = pDb->stmtLis
a540: 74 3b 0a 20 20 20 20 70 50 72 65 53 74 6d 74 2d  t;.    pPreStmt-
a550: 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20  >pPrev = 0;.    
a560: 69 66 28 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73  if( pDb->stmtLis
a570: 74 20 29 7b 0a 20 20 20 20 20 70 44 62 2d 3e 73  t ){.     pDb->s
a580: 74 6d 74 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d  tmtList->pPrev =
a590: 20 70 50 72 65 53 74 6d 74 3b 0a 20 20 20 20 7d   pPreStmt;.    }
a5a0: 0a 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69  .    pDb->stmtLi
a5b0: 73 74 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a 20  st = pPreStmt;. 
a5c0: 20 20 20 69 66 28 20 70 44 62 2d 3e 73 74 6d 74     if( pDb->stmt
a5d0: 4c 61 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Last==0 ){.     
a5e0: 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 6e 53   assert( pDb->nS
a5f0: 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  tmt==0 );.      
a600: 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20  pDb->stmtLast = 
a610: 70 50 72 65 53 74 6d 74 3b 0a 20 20 20 20 7d 65  pPreStmt;.    }e
a620: 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
a630: 74 28 20 70 44 62 2d 3e 6e 53 74 6d 74 3e 30 20  t( pDb->nStmt>0 
a640: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 62  );.    }.    pDb
a650: 2d 3e 6e 53 74 6d 74 2b 2b 3b 0a 20 20 20 0a 20  ->nStmt++;.   . 
a660: 20 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65     /* If we have
a670: 20 74 6f 6f 20 6d 61 6e 79 20 73 74 61 74 65 6d   too many statem
a680: 65 6e 74 20 69 6e 20 63 61 63 68 65 2c 20 72 65  ent in cache, re
a690: 6d 6f 76 65 20 74 68 65 20 73 75 72 70 6c 75 73  move the surplus
a6a0: 20 66 72 6f 6d 20 0a 20 20 20 20 2a 2a 20 74 68   from .    ** th
a6b0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 63 61 63  e end of the cac
a6c0: 68 65 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 20  he list.  */.   
a6d0: 20 77 68 69 6c 65 28 20 70 44 62 2d 3e 6e 53 74   while( pDb->nSt
a6e0: 6d 74 3e 70 44 62 2d 3e 6d 61 78 53 74 6d 74 20  mt>pDb->maxStmt 
a6f0: 29 7b 0a 20 20 20 20 20 20 53 71 6c 50 72 65 70  ){.      SqlPrep
a700: 61 72 65 64 53 74 6d 74 20 2a 70 4c 61 73 74 20  aredStmt *pLast 
a710: 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 3b  = pDb->stmtLast;
a720: 0a 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74  .      pDb->stmt
a730: 4c 61 73 74 20 3d 20 70 4c 61 73 74 2d 3e 70 50  Last = pLast->pP
a740: 72 65 76 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e  rev;.      pDb->
a750: 73 74 6d 74 4c 61 73 74 2d 3e 70 4e 65 78 74 20  stmtLast->pNext 
a760: 3d 20 30 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e  = 0;.      pDb->
a770: 6e 53 74 6d 74 2d 2d 3b 0a 20 20 20 20 20 20 64  nStmt--;.      d
a780: 62 46 72 65 65 53 74 6d 74 28 70 4c 61 73 74 29  bFreeStmt(pLast)
a790: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
a7a0: 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20 75  *.** Structure u
a7b0: 73 65 64 20 77 69 74 68 20 64 62 45 76 61 6c 58  sed with dbEvalX
a7c0: 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 3a 0a  XX() functions:.
a7d0: 2a 2a 0a 2a 2a 20 20 20 64 62 45 76 61 6c 49 6e  **.**   dbEvalIn
a7e0: 69 74 28 29 0a 2a 2a 20 20 20 64 62 45 76 61 6c  it().**   dbEval
a7f0: 53 74 65 70 28 29 0a 2a 2a 20 20 20 64 62 45 76  Step().**   dbEv
a800: 61 6c 46 69 6e 61 6c 69 7a 65 28 29 0a 2a 2a 20  alFinalize().** 
a810: 20 20 64 62 45 76 61 6c 52 6f 77 49 6e 66 6f 28    dbEvalRowInfo(
a820: 29 0a 2a 2a 20 20 20 64 62 45 76 61 6c 43 6f 6c  ).**   dbEvalCol
a830: 75 6d 6e 56 61 6c 75 65 28 29 0a 2a 2f 0a 74 79  umnValue().*/.ty
a840: 70 65 64 65 66 20 73 74 72 75 63 74 20 44 62 45  pedef struct DbE
a850: 76 61 6c 43 6f 6e 74 65 78 74 20 44 62 45 76 61  valContext DbEva
a860: 6c 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74  lContext;.struct
a870: 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 7b   DbEvalContext {
a880: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
a890: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a8a0: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
a8b0: 61 6e 64 6c 65 20 2a 2f 0a 20 20 54 63 6c 5f 4f  andle */.  Tcl_O
a8c0: 62 6a 20 2a 70 53 71 6c 3b 20 20 20 20 20 20 20  bj *pSql;       
a8d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62             /* Ob
a8e0: 6a 65 63 74 20 68 6f 6c 64 69 6e 67 20 73 74 72  ject holding str
a8f0: 69 6e 67 20 7a 53 71 6c 20 2a 2f 0a 20 20 63 6f  ing zSql */.  co
a900: 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20  nst char *zSql; 
a910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a920: 20 52 65 6d 61 69 6e 69 6e 67 20 53 51 4c 20 74   Remaining SQL t
a930: 6f 20 65 78 65 63 75 74 65 20 2a 2f 0a 20 20 53  o execute */.  S
a940: 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a  qlPreparedStmt *
a950: 70 50 72 65 53 74 6d 74 3b 20 20 20 20 20 20 2f  pPreStmt;      /
a960: 2a 20 43 75 72 72 65 6e 74 20 73 74 61 74 65 6d  * Current statem
a970: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  ent */.  int nCo
a980: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
a990: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
a9a0: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 72 65  er of columns re
a9b0: 74 75 72 6e 65 64 20 62 79 20 70 53 74 6d 74 20  turned by pStmt 
a9c0: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 41  */.  Tcl_Obj *pA
a9d0: 72 72 61 79 3b 20 20 20 20 20 20 20 20 20 20 20  rray;           
a9e0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
a9f0: 61 72 72 61 79 20 76 61 72 69 61 62 6c 65 20 2a  array variable *
aa00: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70  /.  Tcl_Obj **ap
aa10: 43 6f 6c 4e 61 6d 65 3b 20 20 20 20 20 20 20 20  ColName;        
aa20: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
aa30: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a  column names */.
aa40: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  };../*.** Releas
aa50: 65 20 61 6e 79 20 63 61 63 68 65 20 6f 66 20 63  e any cache of c
aa60: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 63 75 72 72  olumn names curr
aa70: 65 6e 74 6c 79 20 68 65 6c 64 20 61 73 20 70 61  ently held as pa
aa80: 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 44 62 45  rt of.** the DbE
aa90: 76 61 6c 43 6f 6e 74 65 78 74 20 73 74 72 75 63  valContext struc
aaa0: 74 75 72 65 20 70 61 73 73 65 64 20 61 73 20 74  ture passed as t
aab0: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
aac0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
aad0: 64 20 64 62 52 65 6c 65 61 73 65 43 6f 6c 75 6d  d dbReleaseColum
aae0: 6e 4e 61 6d 65 73 28 44 62 45 76 61 6c 43 6f 6e  nNames(DbEvalCon
aaf0: 74 65 78 74 20 2a 70 29 7b 0a 20 20 69 66 28 20  text *p){.  if( 
ab00: 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65 20 29 7b 0a  p->apColName ){.
ab10: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
ab20: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
ab30: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54  l; i++){.      T
ab40: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
ab50: 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29  p->apColName[i])
ab60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f  ;.    }.    Tcl_
ab70: 46 72 65 65 28 28 63 68 61 72 20 2a 29 70 2d 3e  Free((char *)p->
ab80: 61 70 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20 20  apColName);.    
ab90: 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 30  p->apColName = 0
aba0: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 43 6f 6c 20  ;.  }.  p->nCol 
abb0: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  = 0;.}../*.** In
abc0: 69 74 69 61 6c 69 7a 65 20 61 20 44 62 45 76 61  itialize a DbEva
abd0: 6c 43 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75  lContext structu
abe0: 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 41 72  re..**.** If pAr
abf0: 72 61 79 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  ray is not NULL,
ac00: 20 74 68 65 6e 20 69 74 20 63 6f 6e 74 61 69 6e   then it contain
ac10: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
ac20: 54 63 6c 20 61 72 72 61 79 0a 2a 2a 20 76 61 72  Tcl array.** var
ac30: 69 61 62 6c 65 2e 20 54 68 65 20 22 2a 22 20 6d  iable. The "*" m
ac40: 65 6d 62 65 72 20 6f 66 20 74 68 69 73 20 61 72  ember of this ar
ac50: 72 61 79 20 69 73 20 73 65 74 20 74 6f 20 61 20  ray is set to a 
ac60: 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 0a  list containing.
ac70: 2a 2a 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  ** the names of 
ac80: 74 68 65 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75  the columns retu
ac90: 72 6e 65 64 20 62 79 20 74 68 65 20 73 74 61 74  rned by the stat
aca0: 65 6d 65 6e 74 20 61 73 20 70 61 72 74 20 6f 66  ement as part of
acb0: 20 65 61 63 68 0a 2a 2a 20 63 61 6c 6c 20 74 6f   each.** call to
acc0: 20 64 62 45 76 61 6c 53 74 65 70 28 29 2c 20 69   dbEvalStep(), i
acd0: 6e 20 6f 72 64 65 72 20 66 72 6f 6d 20 6c 65 66  n order from lef
ace0: 74 20 74 6f 20 72 69 67 68 74 2e 20 65 2e 67 2e  t to right. e.g.
acf0: 20 69 66 20 74 68 65 20 6e 61 6d 65 73 20 0a 2a   if the names .*
ad00: 2a 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65  * of the returne
ad10: 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 61 2c  d columns are a,
ad20: 20 62 20 61 6e 64 20 63 2c 20 69 74 20 64 6f 65   b and c, it doe
ad30: 73 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74  s the equivalent
ad40: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 74 63 6c 20   of the .** tcl 
ad50: 63 6f 6d 6d 61 6e 64 3a 0a 2a 2a 0a 2a 2a 20 20  command:.**.**  
ad60: 20 20 20 73 65 74 20 24 7b 70 41 72 72 61 79 7d     set ${pArray}
ad70: 28 2a 29 20 7b 61 20 62 20 63 7d 0a 2a 2f 0a 73  (*) {a b c}.*/.s
ad80: 74 61 74 69 63 20 76 6f 69 64 20 64 62 45 76 61  tatic void dbEva
ad90: 6c 49 6e 69 74 28 0a 20 20 44 62 45 76 61 6c 43  lInit(.  DbEvalC
ada0: 6f 6e 74 65 78 74 20 2a 70 2c 20 20 20 20 20 20  ontext *p,      
adb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
adc0: 74 65 72 20 74 6f 20 73 74 72 75 63 74 75 72 65  ter to structure
add0: 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 2a   to initialize *
ade0: 2f 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  /.  SqliteDb *pD
adf0: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
ae00: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
ae10: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 54 63 6c 5f  handle */.  Tcl_
ae20: 4f 62 6a 20 2a 70 53 71 6c 2c 20 20 20 20 20 20  Obj *pSql,      
ae30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
ae40: 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 69 6e 67  bject containing
ae50: 20 53 51 4c 20 73 63 72 69 70 74 20 2a 2f 0a 20   SQL script */. 
ae60: 20 54 63 6c 5f 4f 62 6a 20 2a 70 41 72 72 61 79   Tcl_Obj *pArray
ae70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae80: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 54 63 6c 20   /* Name of Tcl 
ae90: 61 72 72 61 79 20 74 6f 20 73 65 74 20 28 2a 29  array to set (*)
aea0: 20 65 6c 65 6d 65 6e 74 20 6f 66 20 2a 2f 0a 29   element of */.)
aeb0: 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  {.  memset(p, 0,
aec0: 20 73 69 7a 65 6f 66 28 44 62 45 76 61 6c 43 6f   sizeof(DbEvalCo
aed0: 6e 74 65 78 74 29 29 3b 0a 20 20 70 2d 3e 70 44  ntext));.  p->pD
aee0: 62 20 3d 20 70 44 62 3b 0a 20 20 70 2d 3e 7a 53  b = pDb;.  p->zS
aef0: 71 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  ql = Tcl_GetStri
af00: 6e 67 28 70 53 71 6c 29 3b 0a 20 20 70 2d 3e 70  ng(pSql);.  p->p
af10: 53 71 6c 20 3d 20 70 53 71 6c 3b 0a 20 20 54 63  Sql = pSql;.  Tc
af20: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
af30: 53 71 6c 29 3b 0a 20 20 69 66 28 20 70 41 72 72  Sql);.  if( pArr
af40: 61 79 20 29 7b 0a 20 20 20 20 70 2d 3e 70 41 72  ay ){.    p->pAr
af50: 72 61 79 20 3d 20 70 41 72 72 61 79 3b 0a 20 20  ray = pArray;.  
af60: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
af70: 6e 74 28 70 41 72 72 61 79 29 3b 0a 20 20 7d 0a  nt(pArray);.  }.
af80: 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20  }../*.** Obtain 
af90: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
afa0: 74 20 74 68 65 20 72 6f 77 20 74 68 61 74 20 74  t the row that t
afb0: 68 65 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74  he DbEvalContext
afc0: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 0a 2a   passed as the.*
afd0: 2a 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * first argument
afe0: 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
aff0: 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  s to..*/.static 
b000: 76 6f 69 64 20 64 62 45 76 61 6c 52 6f 77 49 6e  void dbEvalRowIn
b010: 66 6f 28 0a 20 20 44 62 45 76 61 6c 43 6f 6e 74  fo(.  DbEvalCont
b020: 65 78 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ext *p,         
b030: 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74        /* Evaluat
b040: 69 6f 6e 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ion context */. 
b050: 20 69 6e 74 20 2a 70 6e 43 6f 6c 2c 20 20 20 20   int *pnCol,    
b060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b070: 20 2f 2a 20 4f 55 54 3a 20 4e 75 6d 62 65 72 20   /* OUT: Number 
b080: 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  of column names 
b090: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 2a  */.  Tcl_Obj ***
b0a0: 70 61 70 43 6f 6c 4e 61 6d 65 20 20 20 20 20 20  papColName      
b0b0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 72 72       /* OUT: Arr
b0c0: 61 79 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ay of column nam
b0d0: 65 73 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 43 6f  es */.){.  /* Co
b0e0: 6d 70 75 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  mpute column nam
b0f0: 65 73 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 70  es */.  if( 0==p
b100: 2d 3e 61 70 43 6f 6c 4e 61 6d 65 20 29 7b 0a 20  ->apColName ){. 
b110: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
b120: 2a 70 53 74 6d 74 20 3d 20 70 2d 3e 70 50 72 65  *pStmt = p->pPre
b130: 53 74 6d 74 2d 3e 70 53 74 6d 74 3b 0a 20 20 20  Stmt->pStmt;.   
b140: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
b150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b160: 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61  * Iterator varia
b170: 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ble */.    int n
b180: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
b190: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
b1a0: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 72 65  er of columns re
b1b0: 74 75 72 6e 65 64 20 62 79 20 70 53 74 6d 74 20  turned by pStmt 
b1c0: 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  */.    Tcl_Obj *
b1d0: 2a 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 30 3b 20  *apColName = 0; 
b1e0: 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
b1f0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f   column names */
b200: 0a 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20  ..    p->nCol = 
b210: 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63  nCol = sqlite3_c
b220: 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d  olumn_count(pStm
b230: 74 29 3b 0a 20 20 20 20 69 66 28 20 6e 43 6f 6c  t);.    if( nCol
b240: 3e 30 20 26 26 20 28 70 61 70 43 6f 6c 4e 61 6d  >0 && (papColNam
b250: 65 20 7c 7c 20 70 2d 3e 70 41 72 72 61 79 29 20  e || p->pArray) 
b260: 29 7b 0a 20 20 20 20 20 20 61 70 43 6f 6c 4e 61  ){.      apColNa
b270: 6d 65 20 3d 20 28 54 63 6c 5f 4f 62 6a 2a 2a 29  me = (Tcl_Obj**)
b280: 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f  Tcl_Alloc( sizeo
b290: 66 28 54 63 6c 5f 4f 62 6a 2a 29 2a 6e 43 6f 6c  f(Tcl_Obj*)*nCol
b2a0: 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   );.      for(i=
b2b0: 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
b2c0: 0a 20 20 20 20 20 20 20 20 61 70 43 6f 6c 4e 61  .        apColNa
b2d0: 6d 65 5b 69 5d 20 3d 20 54 63 6c 5f 4e 65 77 53  me[i] = Tcl_NewS
b2e0: 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33  tringObj(sqlite3
b2f0: 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74  _column_name(pSt
b300: 6d 74 2c 69 29 2c 20 2d 31 29 3b 0a 20 20 20 20  mt,i), -1);.    
b310: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
b320: 6f 75 6e 74 28 61 70 43 6f 6c 4e 61 6d 65 5b 69  ount(apColName[i
b330: 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
b340: 20 20 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65 20 3d    p->apColName =
b350: 20 61 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 20 20   apColName;.    
b360: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 72 65 73  }..    /* If res
b370: 75 6c 74 73 20 61 72 65 20 62 65 69 6e 67 20 73  ults are being s
b380: 74 6f 72 65 64 20 69 6e 20 61 6e 20 61 72 72 61  tored in an arra
b390: 79 20 76 61 72 69 61 62 6c 65 2c 20 74 68 65 6e  y variable, then
b3a0: 20 63 72 65 61 74 65 0a 20 20 20 20 2a 2a 20 74   create.    ** t
b3b0: 68 65 20 61 72 72 61 79 28 2a 29 20 65 6e 74 72  he array(*) entr
b3c0: 79 20 66 6f 72 20 74 68 61 74 20 61 72 72 61 79  y for that array
b3d0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
b3e0: 70 2d 3e 70 41 72 72 61 79 20 29 7b 0a 20 20 20  p->pArray ){.   
b3f0: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69     Tcl_Interp *i
b400: 6e 74 65 72 70 20 3d 20 70 2d 3e 70 44 62 2d 3e  nterp = p->pDb->
b410: 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 54 63  interp;.      Tc
b420: 6c 5f 4f 62 6a 20 2a 70 43 6f 6c 4c 69 73 74 20  l_Obj *pColList 
b430: 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a  = Tcl_NewObj();.
b440: 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70        Tcl_Obj *p
b450: 53 74 61 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74  Star = Tcl_NewSt
b460: 72 69 6e 67 4f 62 6a 28 22 2a 22 2c 20 2d 31 29  ringObj("*", -1)
b470: 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  ;..      for(i=0
b480: 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
b490: 20 20 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74          Tcl_List
b4a0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
b4b0: 28 69 6e 74 65 72 70 2c 20 70 43 6f 6c 4c 69 73  (interp, pColLis
b4c0: 74 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29  t, apColName[i])
b4d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b4e0: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
b4f0: 28 70 53 74 61 72 29 3b 0a 20 20 20 20 20 20 54  (pStar);.      T
b500: 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e  cl_ObjSetVar2(in
b510: 74 65 72 70 2c 20 70 2d 3e 70 41 72 72 61 79 2c  terp, p->pArray,
b520: 20 70 53 74 61 72 2c 20 70 43 6f 6c 4c 69 73 74   pStar, pColList
b530: 2c 20 30 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f  , 0);.      Tcl_
b540: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 53 74  DecrRefCount(pSt
b550: 61 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ar);.    }.  }..
b560: 20 20 69 66 28 20 70 61 70 43 6f 6c 4e 61 6d 65    if( papColName
b570: 20 29 7b 0a 20 20 20 20 2a 70 61 70 43 6f 6c 4e   ){.    *papColN
b580: 61 6d 65 20 3d 20 70 2d 3e 61 70 43 6f 6c 4e 61  ame = p->apColNa
b590: 6d 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 6e  me;.  }.  if( pn
b5a0: 43 6f 6c 20 29 7b 0a 20 20 20 20 2a 70 6e 43 6f  Col ){.    *pnCo
b5b0: 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7d  l = p->nCol;.  }
b5c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
b5d0: 20 6f 6e 65 20 6f 66 20 54 43 4c 5f 4f 4b 2c 20   one of TCL_OK, 
b5e0: 54 43 4c 5f 42 52 45 41 4b 20 6f 72 20 54 43 4c  TCL_BREAK or TCL
b5f0: 5f 45 52 52 4f 52 2e 20 49 66 20 54 43 4c 5f 45  _ERROR. If TCL_E
b600: 52 52 4f 52 20 69 73 0a 2a 2a 20 72 65 74 75 72  RROR is.** retur
b610: 6e 65 64 2c 20 74 68 65 6e 20 61 6e 20 65 72 72  ned, then an err
b620: 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 73 74  or message is st
b630: 6f 72 65 64 20 69 6e 20 74 68 65 20 69 6e 74 65  ored in the inte
b640: 72 70 72 65 74 65 72 20 62 65 66 6f 72 65 0a 2a  rpreter before.*
b650: 2a 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  * returning..**.
b660: 2a 2a 20 41 20 72 65 74 75 72 6e 20 76 61 6c 75  ** A return valu
b670: 65 20 6f 66 20 54 43 4c 5f 4f 4b 20 6d 65 61 6e  e of TCL_OK mean
b680: 73 20 74 68 65 72 65 20 69 73 20 61 20 72 6f 77  s there is a row
b690: 20 6f 66 20 64 61 74 61 20 61 76 61 69 6c 61 62   of data availab
b6a0: 6c 65 2e 20 54 68 65 0a 2a 2a 20 64 61 74 61 20  le. The.** data 
b6b0: 6d 61 79 20 62 65 20 61 63 63 65 73 73 65 64 20  may be accessed 
b6c0: 75 73 69 6e 67 20 64 62 45 76 61 6c 52 6f 77 49  using dbEvalRowI
b6d0: 6e 66 6f 28 29 20 61 6e 64 20 64 62 45 76 61 6c  nfo() and dbEval
b6e0: 43 6f 6c 75 6d 6e 56 61 6c 75 65 28 29 2e 20 54  ColumnValue(). T
b6f0: 68 69 73 0a 2a 2a 20 69 73 20 61 6e 61 6c 6f 67  his.** is analog
b700: 6f 75 73 20 74 6f 20 61 20 72 65 74 75 72 6e 20  ous to a return 
b710: 6f 66 20 53 51 4c 49 54 45 5f 52 4f 57 20 66 72  of SQLITE_ROW fr
b720: 6f 6d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  om sqlite3_step(
b730: 29 2e 20 49 66 20 54 43 4c 5f 42 52 45 41 4b 0a  ). If TCL_BREAK.
b740: 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  ** is returned, 
b750: 74 68 65 6e 20 74 68 65 20 53 51 4c 20 73 63 72  then the SQL scr
b760: 69 70 74 20 68 61 73 20 66 69 6e 69 73 68 65 64  ipt has finished
b770: 20 65 78 65 63 75 74 69 6e 67 20 61 6e 64 20 74   executing and t
b780: 68 65 72 65 20 61 72 65 0a 2a 2a 20 6e 6f 20 66  here are.** no f
b790: 75 72 74 68 65 72 20 72 6f 77 73 20 61 76 61 69  urther rows avai
b7a0: 6c 61 62 6c 65 2e 20 54 68 69 73 20 69 73 20 73  lable. This is s
b7b0: 69 6d 69 6c 61 72 20 74 6f 20 53 51 4c 49 54 45  imilar to SQLITE
b7c0: 5f 44 4f 4e 45 2e 0a 2a 2f 0a 73 74 61 74 69 63  _DONE..*/.static
b7d0: 20 69 6e 74 20 64 62 45 76 61 6c 53 74 65 70 28   int dbEvalStep(
b7e0: 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 70  DbEvalContext *p
b7f0: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
b800: 2a 7a 50 72 65 76 53 71 6c 20 3d 20 30 3b 20 20  *zPrevSql = 0;  
b810: 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73       /* Previous
b820: 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 7a 53 71   value of p->zSq
b830: 6c 20 2a 2f 0a 0a 20 20 77 68 69 6c 65 28 20 70  l */..  while( p
b840: 2d 3e 7a 53 71 6c 5b 30 5d 20 7c 7c 20 70 2d 3e  ->zSql[0] || p->
b850: 70 50 72 65 53 74 6d 74 20 29 7b 0a 20 20 20 20  pPreStmt ){.    
b860: 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 66 28 20  int rc;.    if( 
b870: 70 2d 3e 70 50 72 65 53 74 6d 74 3d 3d 30 20 29  p->pPreStmt==0 )
b880: 7b 0a 20 20 20 20 20 20 7a 50 72 65 76 53 71 6c  {.      zPrevSql
b890: 20 3d 20 28 70 2d 3e 7a 53 71 6c 3d 3d 7a 50 72   = (p->zSql==zPr
b8a0: 65 76 53 71 6c 20 3f 20 30 20 3a 20 70 2d 3e 7a  evSql ? 0 : p->z
b8b0: 53 71 6c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  Sql);.      rc =
b8c0: 20 64 62 50 72 65 70 61 72 65 41 6e 64 42 69 6e   dbPrepareAndBin
b8d0: 64 28 70 2d 3e 70 44 62 2c 20 70 2d 3e 7a 53 71  d(p->pDb, p->zSq
b8e0: 6c 2c 20 26 70 2d 3e 7a 53 71 6c 2c 20 26 70 2d  l, &p->zSql, &p-
b8f0: 3e 70 50 72 65 53 74 6d 74 29 3b 0a 20 20 20 20  >pPreStmt);.    
b900: 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b    if( rc!=TCL_OK
b910: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
b920: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
b930: 6e 74 20 72 63 73 3b 0a 20 20 20 20 20 20 53 71  nt rcs;.      Sq
b940: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 70 2d  liteDb *pDb = p-
b950: 3e 70 44 62 3b 0a 20 20 20 20 20 20 53 71 6c 50  >pDb;.      SqlP
b960: 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70 50 72  reparedStmt *pPr
b970: 65 53 74 6d 74 20 3d 20 70 2d 3e 70 50 72 65 53  eStmt = p->pPreS
b980: 74 6d 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  tmt;.      sqlit
b990: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
b9a0: 20 70 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74   pPreStmt->pStmt
b9b0: 3b 0a 0a 20 20 20 20 20 20 72 63 73 20 3d 20 73  ;..      rcs = s
b9c0: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
b9d0: 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
b9e0: 73 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  s==SQLITE_ROW ){
b9f0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
ba00: 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  TCL_OK;.      }.
ba10: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 41 72        if( p->pAr
ba20: 72 61 79 20 29 7b 0a 20 20 20 20 20 20 20 20 64  ray ){.        d
ba30: 62 45 76 61 6c 52 6f 77 49 6e 66 6f 28 70 2c 20  bEvalRowInfo(p, 
ba40: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  0, 0);.      }. 
ba50: 20 20 20 20 20 72 63 73 20 3d 20 73 71 6c 69 74       rcs = sqlit
ba60: 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b  e3_reset(pStmt);
ba70: 0a 0a 20 20 20 20 20 20 70 44 62 2d 3e 6e 53 74  ..      pDb->nSt
ba80: 65 70 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d  ep = sqlite3_stm
ba90: 74 5f 73 74 61 74 75 73 28 70 53 74 6d 74 2c 53  t_status(pStmt,S
baa0: 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
bab0: 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 2c 31  _FULLSCAN_STEP,1
bac0: 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 6e 53  );.      pDb->nS
bad0: 6f 72 74 20 3d 20 73 71 6c 69 74 65 33 5f 73 74  ort = sqlite3_st
bae0: 6d 74 5f 73 74 61 74 75 73 28 70 53 74 6d 74 2c  mt_status(pStmt,
baf0: 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
bb00: 53 5f 53 4f 52 54 2c 31 29 3b 0a 20 20 20 20 20  S_SORT,1);.     
bb10: 20 70 44 62 2d 3e 6e 49 6e 64 65 78 20 3d 20 73   pDb->nIndex = s
bb20: 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74  qlite3_stmt_stat
bb30: 75 73 28 70 53 74 6d 74 2c 53 51 4c 49 54 45 5f  us(pStmt,SQLITE_
bb40: 53 54 4d 54 53 54 41 54 55 53 5f 41 55 54 4f 49  STMTSTATUS_AUTOI
bb50: 4e 44 45 58 2c 31 29 3b 0a 20 20 20 20 20 20 64  NDEX,1);.      d
bb60: 62 52 65 6c 65 61 73 65 43 6f 6c 75 6d 6e 4e 61  bReleaseColumnNa
bb70: 6d 65 73 28 70 29 3b 0a 20 20 20 20 20 20 70 2d  mes(p);.      p-
bb80: 3e 70 50 72 65 53 74 6d 74 20 3d 20 30 3b 0a 0a  >pPreStmt = 0;..
bb90: 20 20 20 20 20 20 69 66 28 20 72 63 73 21 3d 53        if( rcs!=S
bba0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
bbb0: 20 20 20 20 2f 2a 20 49 66 20 61 20 72 75 6e 2d      /* If a run-
bbc0: 74 69 6d 65 20 65 72 72 6f 72 20 6f 63 63 75 72  time error occur
bbd0: 73 2c 20 72 65 70 6f 72 74 20 74 68 65 20 65 72  s, report the er
bbe0: 72 6f 72 20 61 6e 64 20 73 74 6f 70 20 72 65 61  ror and stop rea
bbf0: 64 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20  ding.        ** 
bc00: 74 68 65 20 53 51 4c 2e 20 20 2a 2f 0a 20 20 20  the SQL.  */.   
bc10: 20 20 20 20 20 64 62 52 65 6c 65 61 73 65 53 74       dbReleaseSt
bc20: 6d 74 28 70 44 62 2c 20 70 50 72 65 53 74 6d 74  mt(pDb, pPreStmt
bc30: 2c 20 31 29 3b 0a 23 69 66 20 53 51 4c 49 54 45  , 1);.#if SQLITE
bc40: 5f 54 45 53 54 0a 20 20 20 20 20 20 20 20 69 66  _TEST.        if
bc50: 28 20 70 2d 3e 70 44 62 2d 3e 62 4c 65 67 61 63  ( p->pDb->bLegac
bc60: 79 50 72 65 70 61 72 65 20 26 26 20 72 63 73 3d  yPrepare && rcs=
bc70: 3d 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 20 26  =SQLITE_SCHEMA &
bc80: 26 20 7a 50 72 65 76 53 71 6c 20 29 7b 0a 20 20  & zPrevSql ){.  
bc90: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
bca0: 65 20 72 75 6e 74 69 6d 65 20 65 72 72 6f 72 20  e runtime error 
bcb0: 77 61 73 20 61 6e 20 53 51 4c 49 54 45 5f 53 43  was an SQLITE_SC
bcc0: 48 45 4d 41 2c 20 61 6e 64 20 74 68 65 20 64 61  HEMA, and the da
bcd0: 74 61 62 61 73 65 0a 20 20 20 20 20 20 20 20 20  tabase.         
bce0: 20 2a 2a 20 68 61 6e 64 6c 65 20 69 73 20 63 6f   ** handle is co
bcf0: 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73 65 20  nfigured to use 
bd00: 74 68 65 20 6c 65 67 61 63 79 20 73 71 6c 69 74  the legacy sqlit
bd10: 65 33 5f 70 72 65 70 61 72 65 28 29 20 0a 20 20  e3_prepare() .  
bd20: 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 72          ** inter
bd30: 66 61 63 65 2c 20 72 65 74 72 79 20 70 72 65 70  face, retry prep
bd40: 61 72 65 28 29 2f 73 74 65 70 28 29 20 6f 6e 20  are()/step() on 
bd50: 74 68 65 20 73 61 6d 65 20 53 51 4c 20 73 74 61  the same SQL sta
bd60: 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 20 20  tement..        
bd70: 20 20 2a 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68    ** This only h
bd80: 61 70 70 65 6e 73 20 6f 6e 63 65 2e 20 49 66 20  appens once. If 
bd90: 74 68 65 72 65 20 69 73 20 61 20 73 65 63 6f 6e  there is a secon
bda0: 64 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 0a  d SQLITE_SCHEMA.
bdb0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 72 72            ** err
bdc0: 6f 72 2c 20 74 68 65 20 65 72 72 6f 72 20 77 69  or, the error wi
bdd0: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 74  ll be returned t
bde0: 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 2a 2f  o the caller. */
bdf0: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 53  .          p->zS
be00: 71 6c 20 3d 20 7a 50 72 65 76 53 71 6c 3b 0a 20  ql = zPrevSql;. 
be10: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
be20: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  e;.        }.#en
be30: 64 69 66 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  dif.        Tcl_
be40: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 70 44 62  SetObjResult(pDb
be50: 2d 3e 69 6e 74 65 72 70 2c 0a 20 20 20 20 20 20  ->interp,.      
be60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be70: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67     Tcl_NewString
be80: 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65 72 72 6d  Obj(sqlite3_errm
be90: 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 2d 31 29  sg(pDb->db), -1)
bea0: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
beb0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
bec0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
bed0: 20 20 64 62 52 65 6c 65 61 73 65 53 74 6d 74 28    dbReleaseStmt(
bee0: 70 44 62 2c 20 70 50 72 65 53 74 6d 74 2c 20 30  pDb, pPreStmt, 0
bef0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
bf00: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 73  .  }..  /* Finis
bf10: 68 65 64 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  hed */.  return 
bf20: 54 43 4c 5f 42 52 45 41 4b 3b 0a 7d 0a 0a 2f 2a  TCL_BREAK;.}../*
bf30: 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 72 65 73  .** Free all res
bf40: 6f 75 72 63 65 73 20 63 75 72 72 65 6e 74 6c 79  ources currently
bf50: 20 68 65 6c 64 20 62 79 20 74 68 65 20 44 62 45   held by the DbE
bf60: 76 61 6c 43 6f 6e 74 65 78 74 20 73 74 72 75 63  valContext struc
bf70: 74 75 72 65 20 70 61 73 73 65 64 0a 2a 2a 20 61  ture passed.** a
bf80: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
bf90: 6d 65 6e 74 2e 20 54 68 65 72 65 20 73 68 6f 75  ment. There shou
bfa0: 6c 64 20 62 65 20 65 78 61 63 74 6c 79 20 6f 6e  ld be exactly on
bfb0: 65 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 66  e call to this f
bfc0: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 65  unction.** for e
bfd0: 61 63 68 20 63 61 6c 6c 20 74 6f 20 64 62 45 76  ach call to dbEv
bfe0: 61 6c 49 6e 69 74 28 29 2e 0a 2a 2f 0a 73 74 61  alInit()..*/.sta
bff0: 74 69 63 20 76 6f 69 64 20 64 62 45 76 61 6c 46  tic void dbEvalF
c000: 69 6e 61 6c 69 7a 65 28 44 62 45 76 61 6c 43 6f  inalize(DbEvalCo
c010: 6e 74 65 78 74 20 2a 70 29 7b 0a 20 20 69 66 28  ntext *p){.  if(
c020: 20 70 2d 3e 70 50 72 65 53 74 6d 74 20 29 7b 0a   p->pPreStmt ){.
c030: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65      sqlite3_rese
c040: 74 28 70 2d 3e 70 50 72 65 53 74 6d 74 2d 3e 70  t(p->pPreStmt->p
c050: 53 74 6d 74 29 3b 0a 20 20 20 20 64 62 52 65 6c  Stmt);.    dbRel
c060: 65 61 73 65 53 74 6d 74 28 70 2d 3e 70 44 62 2c  easeStmt(p->pDb,
c070: 20 70 2d 3e 70 50 72 65 53 74 6d 74 2c 20 30 29   p->pPreStmt, 0)
c080: 3b 0a 20 20 20 20 70 2d 3e 70 50 72 65 53 74 6d  ;.    p->pPreStm
c090: 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  t = 0;.  }.  if(
c0a0: 20 70 2d 3e 70 41 72 72 61 79 20 29 7b 0a 20 20   p->pArray ){.  
c0b0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
c0c0: 6e 74 28 70 2d 3e 70 41 72 72 61 79 29 3b 0a 20  nt(p->pArray);. 
c0d0: 20 20 20 70 2d 3e 70 41 72 72 61 79 20 3d 20 30     p->pArray = 0
c0e0: 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 44 65 63 72  ;.  }.  Tcl_Decr
c0f0: 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 53 71 6c  RefCount(p->pSql
c100: 29 3b 0a 20 20 64 62 52 65 6c 65 61 73 65 43 6f  );.  dbReleaseCo
c110: 6c 75 6d 6e 4e 61 6d 65 73 28 70 29 3b 0a 7d 0a  lumnNames(p);.}.
c120: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
c130: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 54 63 6c  pointer to a Tcl
c140: 5f 4f 62 6a 20 73 74 72 75 63 74 75 72 65 20 77  _Obj structure w
c150: 69 74 68 20 72 65 66 2d 63 6f 75 6e 74 20 30 20  ith ref-count 0 
c160: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  that contains.**
c170: 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20 74   the value for t
c180: 68 65 20 69 43 6f 6c 27 74 68 20 63 6f 6c 75 6d  he iCol'th colum
c190: 6e 20 6f 66 20 74 68 65 20 72 6f 77 20 63 75 72  n of the row cur
c1a0: 72 65 6e 74 6c 79 20 70 6f 69 6e 74 65 64 20 74  rently pointed t
c1b0: 6f 20 62 79 0a 2a 2a 20 74 68 65 20 44 62 45 76  o by.** the DbEv
c1c0: 61 6c 43 6f 6e 74 65 78 74 20 73 74 72 75 63 74  alContext struct
c1d0: 75 72 65 20 70 61 73 73 65 64 20 61 73 20 74 68  ure passed as th
c1e0: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
c1f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 63 6c 5f  ..*/.static Tcl_
c200: 4f 62 6a 20 2a 64 62 45 76 61 6c 43 6f 6c 75 6d  Obj *dbEvalColum
c210: 6e 56 61 6c 75 65 28 44 62 45 76 61 6c 43 6f 6e  nValue(DbEvalCon
c220: 74 65 78 74 20 2a 70 2c 20 69 6e 74 20 69 43 6f  text *p, int iCo
c230: 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  l){.  sqlite3_st
c240: 6d 74 20 2a 70 53 74 6d 74 20 3d 20 70 2d 3e 70  mt *pStmt = p->p
c250: 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74 3b 0a  PreStmt->pStmt;.
c260: 20 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65    switch( sqlite
c270: 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53  3_column_type(pS
c280: 74 6d 74 2c 20 69 43 6f 6c 29 20 29 7b 0a 20 20  tmt, iCol) ){.  
c290: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 4c    case SQLITE_BL
c2a0: 4f 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  OB: {.      int 
c2b0: 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f  bytes = sqlite3_
c2c0: 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74  column_bytes(pSt
c2d0: 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20  mt, iCol);.     
c2e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 6c   const char *zBl
c2f0: 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ob = sqlite3_col
c300: 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20  umn_blob(pStmt, 
c310: 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  iCol);.      if(
c320: 20 21 7a 42 6c 6f 62 20 29 20 62 79 74 65 73 20   !zBlob ) bytes 
c330: 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 0;.      retur
c340: 6e 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72  n Tcl_NewByteArr
c350: 61 79 4f 62 6a 28 28 75 38 2a 29 7a 42 6c 6f 62  ayObj((u8*)zBlob
c360: 2c 20 62 79 74 65 73 29 3b 0a 20 20 20 20 7d 0a  , bytes);.    }.
c370: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
c380: 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20  INTEGER: {.     
c390: 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 76 20   sqlite_int64 v 
c3a0: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
c3b0: 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 69 43  _int64(pStmt, iC
c3c0: 6f 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 76  ol);.      if( v
c3d0: 3e 3d 2d 32 31 34 37 34 38 33 36 34 37 20 26 26  >=-2147483647 &&
c3e0: 20 76 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29   v<=2147483647 )
c3f0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
c400: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 28   Tcl_NewIntObj((
c410: 69 6e 74 29 76 29 3b 0a 20 20 20 20 20 20 7d 65  int)v);.      }e
c420: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74  lse{.        ret
c430: 75 72 6e 20 54 63 6c 5f 4e 65 77 57 69 64 65 49  urn Tcl_NewWideI
c440: 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20 20 20 20  ntObj(v);.      
c450: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  }.    }.    case
c460: 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b   SQLITE_FLOAT: {
c470: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 63  .      return Tc
c480: 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f 62 6a 28 73  l_NewDoubleObj(s
c490: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f  qlite3_column_do
c4a0: 75 62 6c 65 28 70 53 74 6d 74 2c 20 69 43 6f 6c  uble(pStmt, iCol
c4b0: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ));.    }.    ca
c4c0: 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20  se SQLITE_NULL: 
c4d0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  {.      return T
c4e0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
c4f0: 70 2d 3e 70 44 62 2d 3e 7a 4e 75 6c 6c 2c 20 2d  p->pDb->zNull, -
c500: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  1);.    }.  }.. 
c510: 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e 65 77 53   return Tcl_NewS
c520: 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29  tringObj((char*)
c530: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
c540: 65 78 74 28 70 53 74 6d 74 2c 20 69 43 6f 6c 29  ext(pStmt, iCol)
c550: 2c 20 2d 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  , -1);.}../*.** 
c560: 49 66 20 75 73 69 6e 67 20 54 63 6c 20 76 65 72  If using Tcl ver
c570: 73 69 6f 6e 20 38 2e 36 20 6f 72 20 67 72 65 61  sion 8.6 or grea
c580: 74 65 72 2c 20 75 73 65 20 74 68 65 20 4e 52 20  ter, use the NR 
c590: 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 61 76 6f  functions to avo
c5a0: 69 64 0a 2a 2a 20 72 65 63 75 72 73 69 76 65 20  id.** recursive 
c5b0: 65 76 61 6c 75 74 69 6f 6e 20 6f 66 20 73 63 72  evalution of scr
c5c0: 69 70 74 73 20 62 79 20 74 68 65 20 5b 64 62 20  ipts by the [db 
c5d0: 65 76 61 6c 5d 20 61 6e 64 20 5b 64 62 20 74 72  eval] and [db tr
c5e0: 61 6e 73 5d 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 73  ans].** commands
c5f0: 2e 20 45 76 65 6e 20 69 66 20 74 68 65 20 68 65  . Even if the he
c600: 61 64 65 72 73 20 75 73 65 64 20 77 68 69 6c 65  aders used while
c610: 20 63 6f 6d 70 69 6c 69 6e 67 20 74 68 65 20 65   compiling the e
c620: 78 74 65 6e 73 69 6f 6e 0a 2a 2a 20 61 72 65 20  xtension.** are 
c630: 38 2e 36 20 6f 72 20 6e 65 77 65 72 2c 20 74 68  8.6 or newer, th
c640: 65 20 63 6f 64 65 20 73 74 69 6c 6c 20 74 65 73  e code still tes
c650: 74 73 20 74 68 65 20 54 63 6c 20 76 65 72 73 69  ts the Tcl versi
c660: 6f 6e 20 61 74 20 72 75 6e 74 69 6d 65 2e 0a 2a  on at runtime..*
c670: 2a 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 73 74  * This allows st
c680: 75 62 73 2d 65 6e 61 62 6c 65 64 20 62 75 69 6c  ubs-enabled buil
c690: 64 73 20 74 6f 20 62 65 20 75 73 65 64 20 77 69  ds to be used wi
c6a0: 74 68 20 6f 6c 64 65 72 20 54 63 6c 20 6c 69 62  th older Tcl lib
c6b0: 72 61 72 69 65 73 2e 0a 2a 2f 0a 23 69 66 20 54  raries..*/.#if T
c6c0: 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e  CL_MAJOR_VERSION
c6d0: 3e 38 20 7c 7c 20 28 54 43 4c 5f 4d 41 4a 4f 52  >8 || (TCL_MAJOR
c6e0: 5f 56 45 52 53 49 4f 4e 3d 3d 38 20 26 26 20 54  _VERSION==8 && T
c6f0: 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e  CL_MINOR_VERSION
c700: 3e 3d 36 29 0a 23 20 64 65 66 69 6e 65 20 53 51  >=6).# define SQ
c710: 4c 49 54 45 5f 54 43 4c 5f 4e 52 45 20 31 0a 73  LITE_TCL_NRE 1.s
c720: 74 61 74 69 63 20 69 6e 74 20 44 62 55 73 65 4e  tatic int DbUseN
c730: 72 65 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20  re(void){.  int 
c740: 6d 61 6a 6f 72 2c 20 6d 69 6e 6f 72 3b 0a 20 20  major, minor;.  
c750: 54 63 6c 5f 47 65 74 56 65 72 73 69 6f 6e 28 26  Tcl_GetVersion(&
c760: 6d 61 6a 6f 72 2c 20 26 6d 69 6e 6f 72 2c 20 30  major, &minor, 0
c770: 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 28 20  , 0);.  return( 
c780: 28 6d 61 6a 6f 72 3d 3d 38 20 26 26 20 6d 69 6e  (major==8 && min
c790: 6f 72 3e 3d 36 29 20 7c 7c 20 6d 61 6a 6f 72 3e  or>=6) || major>
c7a0: 38 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 2f 2a 20  8 );.}.#else./* 
c7b0: 0a 2a 2a 20 43 6f 6d 70 69 6c 69 6e 67 20 75 73  .** Compiling us
c7c0: 69 6e 67 20 68 65 61 64 65 72 73 20 65 61 72 6c  ing headers earl
c7d0: 69 65 72 20 74 68 61 6e 20 38 2e 36 2e 20 49 6e  ier than 8.6. In
c7e0: 20 74 68 69 73 20 63 61 73 65 20 4e 52 20 63 61   this case NR ca
c7f0: 6e 6e 6f 74 20 62 65 0a 2a 2a 20 75 73 65 64 2c  nnot be.** used,
c800: 20 73 6f 20 44 62 55 73 65 4e 72 65 28 29 20 74   so DbUseNre() t
c810: 6f 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 20  o always return 
c820: 7a 65 72 6f 2e 20 41 64 64 20 23 64 65 66 69 6e  zero. Add #defin
c830: 65 73 20 66 6f 72 20 74 68 65 20 6f 74 68 65 72  es for the other
c840: 0a 2a 2a 20 54 63 6c 5f 4e 52 78 78 78 28 29 20  .** Tcl_NRxxx() 
c850: 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 70 72 65  functions to pre
c860: 76 65 6e 74 20 74 68 65 6d 20 66 72 6f 6d 20 63  vent them from c
c870: 61 75 73 69 6e 67 20 63 6f 6d 70 69 6c 61 74 69  ausing compilati
c880: 6f 6e 20 65 72 72 6f 72 73 2c 0a 2a 2a 20 65 76  on errors,.** ev
c890: 65 6e 20 74 68 6f 75 67 68 20 74 68 65 20 6f 6e  en though the on
c8a0: 6c 79 20 69 6e 76 6f 63 61 74 69 6f 6e 73 20 6f  ly invocations o
c8b0: 66 20 74 68 65 6d 20 61 72 65 20 77 69 74 68 69  f them are withi
c8c0: 6e 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 62 6c  n conditional bl
c8d0: 6f 63 6b 73 20 0a 2a 2a 20 6f 66 20 74 68 65 20  ocks .** of the 
c8e0: 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66  form:.**.**   if
c8f0: 28 20 44 62 55 73 65 4e 72 65 28 29 20 29 20 7b  ( DbUseNre() ) {
c900: 20 2e 2e 2e 20 7d 0a 2a 2f 0a 23 20 64 65 66 69   ... }.*/.# defi
c910: 6e 65 20 53 51 4c 49 54 45 5f 54 43 4c 5f 4e 52  ne SQLITE_TCL_NR
c920: 45 20 30 0a 23 20 64 65 66 69 6e 65 20 44 62 55  E 0.# define DbU
c930: 73 65 4e 72 65 28 29 20 30 0a 23 20 64 65 66 69  seNre() 0.# defi
c940: 6e 65 20 54 63 6c 5f 4e 52 41 64 64 43 61 6c 6c  ne Tcl_NRAddCall
c950: 62 61 63 6b 28 61 2c 62 2c 63 2c 64 2c 65 2c 66  back(a,b,c,d,e,f
c960: 29 20 28 76 6f 69 64 29 30 0a 23 20 64 65 66 69  ) (void)0.# defi
c970: 6e 65 20 54 63 6c 5f 4e 52 45 76 61 6c 4f 62 6a  ne Tcl_NREvalObj
c980: 28 61 2c 62 2c 63 29 20 30 0a 23 20 64 65 66 69  (a,b,c) 0.# defi
c990: 6e 65 20 54 63 6c 5f 4e 52 43 72 65 61 74 65 43  ne Tcl_NRCreateC
c9a0: 6f 6d 6d 61 6e 64 28 61 2c 62 2c 63 2c 64 2c 65  ommand(a,b,c,d,e
c9b0: 2c 66 29 20 28 76 6f 69 64 29 30 0a 23 65 6e 64  ,f) (void)0.#end
c9c0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  if../*.** This f
c9d0: 75 6e 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20  unction is part 
c9e0: 6f 66 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  of the implement
c9f0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6d  ation of the com
ca00: 6d 61 6e 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 24 64  mand:.**.**   $d
ca10: 62 20 65 76 61 6c 20 53 51 4c 20 3f 41 52 52 41  b eval SQL ?ARRA
ca20: 59 4e 41 4d 45 3f 20 53 43 52 49 50 54 0a 2a 2f  YNAME? SCRIPT.*/
ca30: 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 45 76  .static int DbEv
ca40: 61 6c 4e 65 78 74 43 6d 64 28 0a 20 20 43 6c 69  alNextCmd(.  Cli
ca50: 65 6e 74 44 61 74 61 20 64 61 74 61 5b 5d 2c 20  entData data[], 
ca60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca70: 20 20 2f 2a 20 64 61 74 61 5b 30 5d 20 69 73 20    /* data[0] is 
ca80: 74 68 65 20 28 44 62 45 76 61 6c 43 6f 6e 74 65  the (DbEvalConte
ca90: 78 74 2a 29 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  xt*) */.  Tcl_In
caa0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
cab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cac0: 2a 20 54 63 6c 20 69 6e 74 65 72 70 72 65 74 65  * Tcl interprete
cad0: 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 75 6c  r */.  int resul
cae0: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
caf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
cb00: 65 73 75 6c 74 20 73 6f 20 66 61 72 20 2a 2f 0a  esult so far */.
cb10: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 72 65  ){.  int rc = re
cb20: 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20  sult;           
cb30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
cb40: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f  urn code */..  /
cb50: 2a 20 54 68 65 20 66 69 72 73 74 20 65 6c 65 6d  * The first elem
cb60: 65 6e 74 20 6f 66 20 74 68 65 20 64 61 74 61 5b  ent of the data[
cb70: 5d 20 61 72 72 61 79 20 69 73 20 61 20 70 6f 69  ] array is a poi
cb80: 6e 74 65 72 20 74 6f 20 61 20 44 62 45 76 61 6c  nter to a DbEval
cb90: 43 6f 6e 74 65 78 74 0a 20 20 2a 2a 20 73 74 72  Context.  ** str
cba0: 75 63 74 75 72 65 20 61 6c 6c 6f 63 61 74 65 64  ucture allocated
cbb0: 20 75 73 69 6e 67 20 54 63 6c 5f 41 6c 6c 6f 63   using Tcl_Alloc
cbc0: 28 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 65  (). The second e
cbd0: 6c 65 6d 65 6e 74 20 6f 66 20 64 61 74 61 5b 5d  lement of data[]
cbe0: 0a 20 20 2a 2a 20 69 73 20 61 20 70 6f 69 6e 74  .  ** is a point
cbf0: 65 72 20 74 6f 20 61 20 54 63 6c 5f 4f 62 6a 20  er to a Tcl_Obj 
cc00: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73  containing the s
cc10: 63 72 69 70 74 20 74 6f 20 72 75 6e 20 66 6f 72  cript to run for
cc20: 20 65 61 63 68 20 72 6f 77 0a 20 20 2a 2a 20 72   each row.  ** r
cc30: 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 71  eturned by the q
cc40: 75 65 72 69 65 73 20 65 6e 63 61 70 73 75 6c 61  ueries encapsula
cc50: 74 65 64 20 69 6e 20 64 61 74 61 5b 30 5d 2e 20  ted in data[0]. 
cc60: 2a 2f 0a 20 20 44 62 45 76 61 6c 43 6f 6e 74 65  */.  DbEvalConte
cc70: 78 74 20 2a 70 20 3d 20 28 44 62 45 76 61 6c 43  xt *p = (DbEvalC
cc80: 6f 6e 74 65 78 74 20 2a 29 64 61 74 61 5b 30 5d  ontext *)data[0]
cc90: 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63  ;.  Tcl_Obj *pSc
cca0: 72 69 70 74 20 3d 20 28 54 63 6c 5f 4f 62 6a 20  ript = (Tcl_Obj 
ccb0: 2a 29 64 61 74 61 5b 31 5d 3b 0a 20 20 54 63 6c  *)data[1];.  Tcl
ccc0: 5f 4f 62 6a 20 2a 70 41 72 72 61 79 20 3d 20 70  _Obj *pArray = p
ccd0: 2d 3e 70 41 72 72 61 79 3b 0a 0a 20 20 77 68 69  ->pArray;..  whi
cce0: 6c 65 28 20 28 72 63 3d 3d 54 43 4c 5f 4f 4b 20  le( (rc==TCL_OK 
ccf0: 7c 7c 20 72 63 3d 3d 54 43 4c 5f 43 4f 4e 54 49  || rc==TCL_CONTI
cd00: 4e 55 45 29 20 26 26 20 54 43 4c 5f 4f 4b 3d 3d  NUE) && TCL_OK==
cd10: 28 72 63 20 3d 20 64 62 45 76 61 6c 53 74 65 70  (rc = dbEvalStep
cd20: 28 70 29 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  (p)) ){.    int 
cd30: 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b  i;.    int nCol;
cd40: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61  .    Tcl_Obj **a
cd50: 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 20 20 64 62  pColName;.    db
cd60: 45 76 61 6c 52 6f 77 49 6e 66 6f 28 70 2c 20 26  EvalRowInfo(p, &
cd70: 6e 43 6f 6c 2c 20 26 61 70 43 6f 6c 4e 61 6d 65  nCol, &apColName
cd80: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
cd90: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
cda0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61      Tcl_Obj *pVa
cdb0: 6c 20 3d 20 64 62 45 76 61 6c 43 6f 6c 75 6d 6e  l = dbEvalColumn
cdc0: 56 61 6c 75 65 28 70 2c 20 69 29 3b 0a 20 20 20  Value(p, i);.   
cdd0: 20 20 20 69 66 28 20 70 41 72 72 61 79 3d 3d 30     if( pArray==0
cde0: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
cdf0: 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72  ObjSetVar2(inter
ce00: 70 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 2c  p, apColName[i],
ce10: 20 30 2c 20 70 56 61 6c 2c 20 30 29 3b 0a 20 20   0, pVal, 0);.  
ce20: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ce30: 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72     Tcl_ObjSetVar
ce40: 32 28 69 6e 74 65 72 70 2c 20 70 41 72 72 61 79  2(interp, pArray
ce50: 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20  , apColName[i], 
ce60: 70 56 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  pVal, 0);.      
ce70: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
ce80: 54 68 65 20 72 65 71 75 69 72 65 64 20 69 6e 74  The required int
ce90: 65 72 70 72 65 74 65 72 20 76 61 72 69 61 62 6c  erpreter variabl
cea0: 65 73 20 61 72 65 20 6e 6f 77 20 70 6f 70 75 6c  es are now popul
ceb0: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 64 61  ated with the da
cec0: 74 61 20 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20  ta .    ** from 
ced0: 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 2e  the current row.
cee0: 20 49 66 20 75 73 69 6e 67 20 4e 52 45 2c 20 73   If using NRE, s
cef0: 63 68 65 64 75 6c 65 20 63 61 6c 6c 62 61 63 6b  chedule callback
cf00: 73 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 20 20  s to evaluate.  
cf10: 20 20 2a 2a 20 73 63 72 69 70 74 20 70 53 63 72    ** script pScr
cf20: 69 70 74 2c 20 74 68 65 6e 20 74 6f 20 69 6e 76  ipt, then to inv
cf30: 6f 6b 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  oke this functio
cf40: 6e 20 61 67 61 69 6e 20 74 6f 20 66 65 74 63 68  n again to fetch
cf50: 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a   the next.    **
cf60: 20 72 6f 77 20 28 6f 72 20 63 6c 65 61 6e 20 75   row (or clean u
cf70: 70 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  p if there is no
cf80: 20 6e 65 78 74 20 72 6f 77 20 6f 72 20 74 68 65   next row or the
cf90: 20 73 63 72 69 70 74 20 74 68 72 6f 77 73 20 61   script throws a
cfa0: 6e 0a 20 20 20 20 2a 2a 20 65 78 63 65 70 74 69  n.    ** excepti
cfb0: 6f 6e 29 2e 20 41 66 74 65 72 20 73 63 68 65 64  on). After sched
cfc0: 75 6c 69 6e 67 20 74 68 65 20 63 61 6c 6c 62 61  uling the callba
cfd0: 63 6b 73 2c 20 72 65 74 75 72 6e 20 63 6f 6e 74  cks, return cont
cfe0: 72 6f 6c 20 74 6f 20 74 68 65 20 0a 20 20 20 20  rol to the .    
cff0: 2a 2a 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 2a  ** caller..    *
d000: 2a 0a 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74 20  *.    ** If not 
d010: 75 73 69 6e 67 20 4e 52 45 2c 20 65 76 61 6c 75  using NRE, evalu
d020: 61 74 65 20 70 53 63 72 69 70 74 20 64 69 72 65  ate pScript dire
d030: 63 74 6c 79 20 61 6e 64 20 63 6f 6e 74 69 6e 75  ctly and continu
d040: 65 20 77 69 74 68 20 74 68 65 0a 20 20 20 20 2a  e with the.    *
d050: 2a 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e  * next iteration
d060: 20 6f 66 20 74 68 69 73 20 77 68 69 6c 65 28 2e   of this while(.
d070: 2e 2e 29 20 6c 6f 6f 70 2e 20 20 2a 2f 0a 20 20  ..) loop.  */.  
d080: 20 20 69 66 28 20 44 62 55 73 65 4e 72 65 28 29    if( DbUseNre()
d090: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 4e 52   ){.      Tcl_NR
d0a0: 41 64 64 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65  AddCallback(inte
d0b0: 72 70 2c 20 44 62 45 76 61 6c 4e 65 78 74 43 6d  rp, DbEvalNextCm
d0c0: 64 2c 20 28 76 6f 69 64 2a 29 70 2c 20 28 76 6f  d, (void*)p, (vo
d0d0: 69 64 2a 29 70 53 63 72 69 70 74 2c 20 30 2c 20  id*)pScript, 0, 
d0e0: 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
d0f0: 20 54 63 6c 5f 4e 52 45 76 61 6c 4f 62 6a 28 69   Tcl_NREvalObj(i
d100: 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20  nterp, pScript, 
d110: 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
d120: 20 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 45 76       rc = Tcl_Ev
d130: 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20  alObjEx(interp, 
d140: 70 53 63 72 69 70 74 2c 20 30 29 3b 0a 20 20 20  pScript, 0);.   
d150: 20 7d 0a 20 20 7d 0a 0a 20 20 54 63 6c 5f 44 65   }.  }..  Tcl_De
d160: 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69  crRefCount(pScri
d170: 70 74 29 3b 0a 20 20 64 62 45 76 61 6c 46 69 6e  pt);.  dbEvalFin
d180: 61 6c 69 7a 65 28 70 29 3b 0a 20 20 54 63 6c 5f  alize(p);.  Tcl_
d190: 46 72 65 65 28 28 63 68 61 72 20 2a 29 70 29 3b  Free((char *)p);
d1a0: 0a 0a 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f  ..  if( rc==TCL_
d1b0: 4f 4b 20 7c 7c 20 72 63 3d 3d 54 43 4c 5f 42 52  OK || rc==TCL_BR
d1c0: 45 41 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 52  EAK ){.    Tcl_R
d1d0: 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  esetResult(inter
d1e0: 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 54 43 4c  p);.    rc = TCL
d1f0: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  _OK;.  }.  retur
d200: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
d210: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
d220: 75 73 65 64 20 62 79 20 74 68 65 20 69 6d 70 6c  used by the impl
d230: 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74  ementations of t
d240: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 61 74  he following dat
d250: 61 62 61 73 65 20 0a 2a 2a 20 68 61 6e 64 6c 65  abase .** handle
d260: 20 73 75 62 2d 63 6f 6d 6d 61 6e 64 73 3a 0a 2a   sub-commands:.*
d270: 2a 0a 2a 2a 20 20 20 24 64 62 20 75 70 64 61 74  *.**   $db updat
d280: 65 5f 68 6f 6f 6b 20 3f 53 43 52 49 50 54 3f 0a  e_hook ?SCRIPT?.
d290: 2a 2a 20 20 20 24 64 62 20 77 61 6c 5f 68 6f 6f  **   $db wal_hoo
d2a0: 6b 20 3f 53 43 52 49 50 54 3f 0a 2a 2a 20 20 20  k ?SCRIPT?.**   
d2b0: 24 64 62 20 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 20  $db commit_hook 
d2c0: 3f 53 43 52 49 50 54 3f 0a 2a 2a 20 20 20 24 64  ?SCRIPT?.**   $d
d2d0: 62 20 70 72 65 75 70 64 61 74 65 20 68 6f 6f 6b  b preupdate hook
d2e0: 20 3f 53 43 52 49 50 54 3f 0a 2a 2f 0a 73 74 61   ?SCRIPT?.*/.sta
d2f0: 74 69 63 20 76 6f 69 64 20 44 62 48 6f 6f 6b 43  tic void DbHookC
d300: 6d 64 28 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  md(.  Tcl_Interp
d310: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 20 20 20   *interp,       
d320: 20 20 20 20 20 20 2f 2a 20 54 63 6c 20 69 6e 74        /* Tcl int
d330: 65 72 70 72 65 74 65 72 20 2a 2f 0a 20 20 53 71  erpreter */.  Sq
d340: 6c 69 74 65 44 62 20 2a 70 44 62 2c 20 20 20 20  liteDb *pDb,    
d350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d360: 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   Database handle
d370: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70   */.  Tcl_Obj *p
d380: 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  Arg,            
d390: 20 20 20 20 20 20 2f 2a 20 53 43 52 49 50 54 20        /* SCRIPT 
d3a0: 61 72 67 75 6d 65 6e 74 20 28 6f 72 20 4e 55 4c  argument (or NUL
d3b0: 4c 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  L) */.  Tcl_Obj 
d3c0: 2a 2a 70 70 48 6f 6f 6b 20 20 20 20 20 20 20 20  **ppHook        
d3d0: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
d3e0: 65 72 20 74 6f 20 6d 65 6d 62 65 72 20 6f 66 20  er to member of 
d3f0: 53 71 6c 69 74 65 44 62 20 2a 2f 0a 29 7b 0a 20  SqliteDb */.){. 
d400: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
d410: 44 62 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 2a  Db->db;..  if( *
d420: 70 70 48 6f 6f 6b 20 29 7b 0a 20 20 20 20 54 63  ppHook ){.    Tc
d430: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
d440: 6e 74 65 72 70 2c 20 2a 70 70 48 6f 6f 6b 29 3b  nterp, *ppHook);
d450: 0a 20 20 20 20 69 66 28 20 70 41 72 67 20 29 7b  .    if( pArg ){
d460: 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52  .      Tcl_DecrR
d470: 65 66 43 6f 75 6e 74 28 2a 70 70 48 6f 6f 6b 29  efCount(*ppHook)
d480: 3b 0a 20 20 20 20 20 20 2a 70 70 48 6f 6f 6b 20  ;.      *ppHook 
d490: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
d4a0: 20 69 66 28 20 70 41 72 67 20 29 7b 0a 20 20 20   if( pArg ){.   
d4b0: 20 61 73 73 65 72 74 28 20 21 28 2a 70 70 48 6f   assert( !(*ppHo
d4c0: 6f 6b 29 20 29 3b 0a 20 20 20 20 69 66 28 20 54  ok) );.    if( T
d4d0: 63 6c 5f 47 65 74 43 68 61 72 4c 65 6e 67 74 68  cl_GetCharLength
d4e0: 28 70 41 72 67 29 3e 30 20 29 7b 0a 20 20 20 20  (pArg)>0 ){.    
d4f0: 20 20 2a 70 70 48 6f 6f 6b 20 3d 20 70 41 72 67    *ppHook = pArg
d500: 3b 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72  ;.      Tcl_Incr
d510: 52 65 66 43 6f 75 6e 74 28 2a 70 70 48 6f 6f 6b  RefCount(*ppHook
d520: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69  );.    }.  }..#i
d530: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
d540: 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f  LE_PREUPDATE_HOO
d550: 4b 0a 20 20 73 71 6c 69 74 65 33 5f 70 72 65 75  K.  sqlite3_preu
d560: 70 64 61 74 65 5f 68 6f 6f 6b 28 64 62 2c 20 28  pdate_hook(db, (
d570: 70 44 62 2d 3e 70 50 72 65 55 70 64 61 74 65 48  pDb->pPreUpdateH
d580: 6f 6f 6b 3f 44 62 50 72 65 55 70 64 61 74 65 48  ook?DbPreUpdateH
d590: 61 6e 64 6c 65 72 3a 30 29 2c 20 70 44 62 29 3b  andler:0), pDb);
d5a0: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
d5b0: 33 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28 64 62  3_update_hook(db
d5c0: 2c 20 28 70 44 62 2d 3e 70 55 70 64 61 74 65 48  , (pDb->pUpdateH
d5d0: 6f 6f 6b 3f 44 62 55 70 64 61 74 65 48 61 6e 64  ook?DbUpdateHand
d5e0: 6c 65 72 3a 30 29 2c 20 70 44 62 29 3b 0a 20 20  ler:0), pDb);.  
d5f0: 73 71 6c 69 74 65 33 5f 72 6f 6c 6c 62 61 63 6b  sqlite3_rollback
d600: 5f 68 6f 6f 6b 28 64 62 2c 20 28 70 44 62 2d 3e  _hook(db, (pDb->
d610: 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3f 44 62  pRollbackHook?Db
d620: 52 6f 6c 6c 62 61 63 6b 48 61 6e 64 6c 65 72 3a  RollbackHandler:
d630: 30 29 2c 20 70 44 62 29 3b 0a 20 20 73 71 6c 69  0), pDb);.  sqli
d640: 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c  te3_wal_hook(db,
d650: 20 28 70 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 3f   (pDb->pWalHook?
d660: 44 62 57 61 6c 48 61 6e 64 6c 65 72 3a 30 29 2c  DbWalHandler:0),
d670: 20 70 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pDb);.}../*.** 
d680: 54 68 65 20 22 73 71 6c 69 74 65 22 20 63 6f 6d  The "sqlite" com
d690: 6d 61 6e 64 20 62 65 6c 6f 77 20 63 72 65 61 74  mand below creat
d6a0: 65 73 20 61 20 6e 65 77 20 54 63 6c 20 63 6f 6d  es a new Tcl com
d6b0: 6d 61 6e 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a  mand for each.**
d6c0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 74 20 6f   connection it o
d6d0: 70 65 6e 73 20 74 6f 20 61 6e 20 53 51 4c 69 74  pens to an SQLit
d6e0: 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69  e database.  Thi
d6f0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76  s routine is inv
d700: 6f 6b 65 64 0a 2a 2a 20 77 68 65 6e 65 76 65 72  oked.** whenever
d710: 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 63 6f   one of those co
d720: 6e 6e 65 63 74 69 6f 6e 2d 73 70 65 63 69 66 69  nnection-specifi
d730: 63 20 63 6f 6d 6d 61 6e 64 73 20 69 73 20 65 78  c commands is ex
d740: 65 63 75 74 65 64 0a 2a 2a 20 69 6e 20 54 63 6c  ecuted.** in Tcl
d750: 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  .  For example, 
d760: 69 66 20 79 6f 75 20 72 75 6e 20 54 63 6c 20 63  if you run Tcl c
d770: 6f 64 65 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  ode like this:.*
d780: 2a 0a 2a 2a 20 20 20 20 20 20 20 73 71 6c 69 74  *.**       sqlit
d790: 65 33 20 64 62 31 20 20 22 6d 79 5f 64 61 74 61  e3 db1  "my_data
d7a0: 62 61 73 65 22 0a 2a 2a 20 20 20 20 20 20 20 64  base".**       d
d7b0: 62 31 20 63 6c 6f 73 65 0a 2a 2a 0a 2a 2a 20 54  b1 close.**.** T
d7c0: 68 65 20 66 69 72 73 74 20 63 6f 6d 6d 61 6e 64  he first command
d7d0: 20 6f 70 65 6e 73 20 61 20 63 6f 6e 6e 65 63 74   opens a connect
d7e0: 69 6f 6e 20 74 6f 20 74 68 65 20 22 6d 79 5f 64  ion to the "my_d
d7f0: 61 74 61 62 61 73 65 22 20 64 61 74 61 62 61 73  atabase" databas
d800: 65 0a 2a 2a 20 61 6e 64 20 63 61 6c 6c 73 20 74  e.** and calls t
d810: 68 61 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 22  hat connection "
d820: 64 62 31 22 2e 20 20 54 68 65 20 73 65 63 6f 6e  db1".  The secon
d830: 64 20 63 6f 6d 6d 61 6e 64 20 63 61 75 73 65 73  d command causes
d840: 20 74 68 69 73 0a 2a 2a 20 73 75 62 72 6f 75 74   this.** subrout
d850: 69 6e 65 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65  ine to be invoke
d860: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
d870: 20 44 62 4f 62 6a 43 6d 64 28 76 6f 69 64 20 2a   DbObjCmd(void *
d880: 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  cd, Tcl_Interp *
d890: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63  interp, int objc
d8a0: 2c 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a  ,Tcl_Obj *const*
d8b0: 6f 62 6a 76 29 7b 0a 20 20 53 71 6c 69 74 65 44  objv){.  SqliteD
d8c0: 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65  b *pDb = (Sqlite
d8d0: 44 62 2a 29 63 64 3b 0a 20 20 69 6e 74 20 63 68  Db*)cd;.  int ch
d8e0: 6f 69 63 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d  oice;.  int rc =
d8f0: 20 54 43 4c 5f 4f 4b 3b 0a 20 20 73 74 61 74 69   TCL_OK;.  stati
d900: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 44 42  c const char *DB
d910: 5f 73 74 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  _strs[] = {.    
d920: 22 61 75 74 68 6f 72 69 7a 65 72 22 2c 20 20 20  "authorizer",   
d930: 20 20 20 20 20 20 22 62 61 63 6b 75 70 22 2c 20        "backup", 
d940: 20 20 20 20 20 20 20 20 20 20 20 22 62 75 73 79             "busy
d950: 22 2c 0a 20 20 20 20 22 63 61 63 68 65 22 2c 20  ",.    "cache", 
d960: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63 68               "ch
d970: 61 6e 67 65 73 22 2c 20 20 20 20 20 20 20 20 20  anges",         
d980: 20 20 22 63 6c 6f 73 65 22 2c 0a 20 20 20 20 22    "close",.    "
d990: 63 6f 6c 6c 61 74 65 22 2c 20 20 20 20 20 20 20  collate",       
d9a0: 20 20 20 20 20 22 63 6f 6c 6c 61 74 69 6f 6e 5f       "collation_
d9b0: 6e 65 65 64 65 64 22 2c 20 20 22 63 6f 6d 6d 69  needed",  "commi
d9c0: 74 5f 68 6f 6f 6b 22 2c 0a 20 20 20 20 22 63 6f  t_hook",.    "co
d9d0: 6d 70 6c 65 74 65 22 2c 20 20 20 20 20 20 20 20  mplete",        
d9e0: 20 20 20 22 63 6f 70 79 22 2c 20 20 20 20 20 20     "copy",      
d9f0: 20 20 20 20 20 20 20 20 22 65 6e 61 62 6c 65 5f          "enable_
da00: 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 22 2c  load_extension",
da10: 0a 20 20 20 20 22 65 72 72 6f 72 63 6f 64 65 22  .    "errorcode"
da20: 2c 20 20 20 20 20 20 20 20 20 20 22 65 76 61 6c  ,          "eval
da30: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
da40: 22 65 78 69 73 74 73 22 2c 0a 20 20 20 20 22 66  "exists",.    "f
da50: 75 6e 63 74 69 6f 6e 22 2c 20 20 20 20 20 20 20  unction",       
da60: 20 20 20 20 22 69 6e 63 72 62 6c 6f 62 22 2c 20      "incrblob", 
da70: 20 20 20 20 20 20 20 20 20 22 69 6e 74 65 72 72           "interr
da80: 75 70 74 22 2c 0a 20 20 20 20 22 6c 61 73 74 5f  upt",.    "last_
da90: 69 6e 73 65 72 74 5f 72 6f 77 69 64 22 2c 20 20  insert_rowid",  
daa0: 22 6e 75 6c 6c 76 61 6c 75 65 22 2c 20 20 20 20  "nullvalue",    
dab0: 20 20 20 20 20 22 6f 6e 65 63 6f 6c 75 6d 6e 22       "onecolumn"
dac0: 2c 0a 20 20 20 20 22 70 72 65 75 70 64 61 74 65  ,.    "preupdate
dad0: 22 2c 20 20 20 20 20 20 20 20 20 20 22 70 72 6f  ",          "pro
dae0: 66 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  file",          
daf0: 20 22 70 72 6f 67 72 65 73 73 22 2c 0a 20 20 20   "progress",.   
db00: 20 22 72 65 6b 65 79 22 2c 20 20 20 20 20 20 20   "rekey",       
db10: 20 20 20 20 20 20 20 22 72 65 73 74 6f 72 65 22         "restore"
db20: 2c 20 20 20 20 20 20 20 20 20 20 20 22 72 6f 6c  ,           "rol
db30: 6c 62 61 63 6b 5f 68 6f 6f 6b 22 2c 0a 20 20 20  lback_hook",.   
db40: 20 22 73 74 61 74 75 73 22 2c 20 20 20 20 20 20   "status",      
db50: 20 20 20 20 20 20 20 22 74 69 6d 65 6f 75 74 22         "timeout"
db60: 2c 20 20 20 20 20 20 20 20 20 20 20 22 74 6f 74  ,           "tot
db70: 61 6c 5f 63 68 61 6e 67 65 73 22 2c 0a 20 20 20  al_changes",.   
db80: 20 22 74 72 61 63 65 22 2c 20 20 20 20 20 20 20   "trace",       
db90: 20 20 20 20 20 20 20 22 74 72 61 6e 73 61 63 74         "transact
dba0: 69 6f 6e 22 2c 20 20 20 20 20 20 20 22 75 6e 6c  ion",       "unl
dbb0: 6f 63 6b 5f 6e 6f 74 69 66 79 22 2c 0a 20 20 20  ock_notify",.   
dbc0: 20 22 75 70 64 61 74 65 5f 68 6f 6f 6b 22 2c 20   "update_hook", 
dbd0: 20 20 20 20 20 20 20 22 76 65 72 73 69 6f 6e 22         "version"
dbe0: 2c 20 20 20 20 20 20 20 20 20 20 20 22 77 61 6c  ,           "wal
dbf0: 5f 68 6f 6f 6b 22 2c 0a 20 20 20 20 30 20 20 20  _hook",.    0   
dc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc10: 20 0a 20 20 7d 3b 0a 20 20 65 6e 75 6d 20 44 42   .  };.  enum DB
dc20: 5f 65 6e 75 6d 20 7b 0a 20 20 20 20 44 42 5f 41  _enum {.    DB_A
dc30: 55 54 48 4f 52 49 5a 45 52 2c 20 20 20 20 20 20  UTHORIZER,      
dc40: 20 20 44 42 5f 42 41 43 4b 55 50 2c 20 20 20 20    DB_BACKUP,    
dc50: 20 20 20 20 20 20 20 44 42 5f 42 55 53 59 2c 0a         DB_BUSY,.
dc60: 20 20 20 20 44 42 5f 43 41 43 48 45 2c 20 20 20      DB_CACHE,   
dc70: 20 20 20 20 20 20 20 20 20 20 44 42 5f 43 48 41            DB_CHA
dc80: 4e 47 45 53 2c 20 20 20 20 20 20 20 20 20 20 44  NGES,          D
dc90: 42 5f 43 4c 4f 53 45 2c 0a 20 20 20 20 44 42 5f  B_CLOSE,.    DB_
dca0: 43 4f 4c 4c 41 54 45 2c 20 20 20 20 20 20 20 20  COLLATE,        
dcb0: 20 20 20 44 42 5f 43 4f 4c 4c 41 54 49 4f 4e 5f     DB_COLLATION_
dcc0: 4e 45 45 44 45 44 2c 20 44 42 5f 43 4f 4d 4d 49  NEEDED, DB_COMMI
dcd0: 54 5f 48 4f 4f 4b 2c 0a 20 20 20 20 44 42 5f 43  T_HOOK,.    DB_C
dce0: 4f 4d 50 4c 45 54 45 2c 20 20 20 20 20 20 20 20  OMPLETE,        
dcf0: 20 20 44 42 5f 43 4f 50 59 2c 20 20 20 20 20 20    DB_COPY,      
dd00: 20 20 20 20 20 20 20 44 42 5f 45 4e 41 42 4c 45         DB_ENABLE
dd10: 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 2c  _LOAD_EXTENSION,
dd20: 0a 20 20 20 20 44 42 5f 45 52 52 4f 52 43 4f 44  .    DB_ERRORCOD
dd30: 45 2c 20 20 20 20 20 20 20 20 20 44 42 5f 45 56  E,         DB_EV
dd40: 41 4c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  AL,             
dd50: 44 42 5f 45 58 49 53 54 53 2c 0a 20 20 20 20 44  DB_EXISTS,.    D
dd60: 42 5f 46 55 4e 43 54 49 4f 4e 2c 20 20 20 20 20  B_FUNCTION,     
dd70: 20 20 20 20 20 44 42 5f 49 4e 43 52 42 4c 4f 42       DB_INCRBLOB
dd80: 2c 20 20 20 20 20 20 20 20 20 44 42 5f 49 4e 54  ,         DB_INT
dd90: 45 52 52 55 50 54 2c 0a 20 20 20 20 44 42 5f 4c  ERRUPT,.    DB_L
dda0: 41 53 54 5f 49 4e 53 45 52 54 5f 52 4f 57 49 44  AST_INSERT_ROWID
ddb0: 2c 20 44 42 5f 4e 55 4c 4c 56 41 4c 55 45 2c 20  , DB_NULLVALUE, 
ddc0: 20 20 20 20 20 20 20 44 42 5f 4f 4e 45 43 4f 4c         DB_ONECOL
ddd0: 55 4d 4e 2c 0a 20 20 20 20 44 42 5f 50 52 45 55  UMN,.    DB_PREU
dde0: 50 44 41 54 45 2c 20 20 20 20 20 20 20 20 20 44  PDATE,         D
ddf0: 42 5f 50 52 4f 46 49 4c 45 2c 20 20 20 20 20 20  B_PROFILE,      
de00: 20 20 20 20 44 42 5f 50 52 4f 47 52 45 53 53 2c      DB_PROGRESS,
de10: 0a 20 20 20 20 44 42 5f 52 45 4b 45 59 2c 20 20  .    DB_REKEY,  
de20: 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 52 45             DB_RE
de30: 53 54 4f 52 45 2c 20 20 20 20 20 20 20 20 20 20  STORE,          
de40: 44 42 5f 52 4f 4c 4c 42 41 43 4b 5f 48 4f 4f 4b  DB_ROLLBACK_HOOK
de50: 2c 0a 20 20 20 20 44 42 5f 53 54 41 54 55 53 2c  ,.    DB_STATUS,
de60: 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 54              DB_T
de70: 49 4d 45 4f 55 54 2c 20 20 20 20 20 20 20 20 20  IMEOUT,         
de80: 20 44 42 5f 54 4f 54 41 4c 5f 43 48 41 4e 47 45   DB_TOTAL_CHANGE
de90: 53 2c 0a 20 20 20 20 44 42 5f 54 52 41 43 45 2c  S,.    DB_TRACE,
dea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f               DB_
deb0: 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 20 20 20  TRANSACTION,    
dec0: 20 20 44 42 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49    DB_UNLOCK_NOTI
ded0: 46 59 2c 0a 20 20 20 20 44 42 5f 55 50 44 41 54  FY,.    DB_UPDAT
dee0: 45 5f 48 4f 4f 4b 2c 20 20 20 20 20 20 20 44 42  E_HOOK,       DB
def0: 5f 56 45 52 53 49 4f 4e 2c 20 20 20 20 20 20 20  _VERSION,       
df00: 20 20 20 44 42 5f 57 41 4c 5f 48 4f 4f 4b 2c 0a     DB_WAL_HOOK,.
df10: 20 20 7d 3b 0a 20 20 2f 2a 20 64 6f 6e 27 74 20    };.  /* don't 
df20: 6c 65 61 76 65 20 74 72 61 69 6c 69 6e 67 20 63  leave trailing c
df30: 6f 6d 6d 61 73 20 6f 6e 20 44 42 5f 65 6e 75 6d  ommas on DB_enum
df40: 2c 20 69 74 20 63 6f 6e 66 75 73 65 73 20 74 68  , it confuses th
df50: 65 20 41 49 58 20 78 6c 63 20 63 6f 6d 70 69 6c  e AIX xlc compil
df60: 65 72 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62 6a  er */..  if( obj
df70: 63 3c 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  c<2 ){.    Tcl_W
df80: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
df90: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 55  rp, 1, objv, "SU
dfa0: 42 43 4f 4d 4d 41 4e 44 20 2e 2e 2e 22 29 3b 0a  BCOMMAND ...");.
dfb0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
dfc0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
dfd0: 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d  Tcl_GetIndexFrom
dfe0: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
dff0: 5b 31 5d 2c 20 44 42 5f 73 74 72 73 2c 20 22 6f  [1], DB_strs, "o
e000: 70 74 69 6f 6e 22 2c 20 30 2c 20 26 63 68 6f 69  ption", 0, &choi
e010: 63 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ce) ){.    retur
e020: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
e030: 0a 0a 20 20 73 77 69 74 63 68 28 20 28 65 6e 75  ..  switch( (enu
e040: 6d 20 44 42 5f 65 6e 75 6d 29 63 68 6f 69 63 65  m DB_enum)choice
e050: 20 29 7b 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62   ){..  /*    $db
e060: 20 61 75 74 68 6f 72 69 7a 65 72 20 3f 43 41 4c   authorizer ?CAL
e070: 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a  LBACK?.  **.  **
e080: 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65   Invoke the give
e090: 6e 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61 75  n callback to au
e0a0: 74 68 6f 72 69 7a 65 20 65 61 63 68 20 53 51 4c  thorize each SQL
e0b0: 20 6f 70 65 72 61 74 69 6f 6e 20 61 73 20 69 74   operation as it
e0c0: 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 69 6c 65   is.  ** compile
e0d0: 64 2e 20 20 35 20 61 72 67 75 6d 65 6e 74 73 20  d.  5 arguments 
e0e0: 61 72 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20  are appended to 
e0f0: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 62 65 66  the callback bef
e100: 6f 72 65 20 69 74 20 69 73 0a 20 20 2a 2a 20 69  ore it is.  ** i
e110: 6e 76 6f 6b 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  nvoked:.  **.  *
e120: 2a 20 20 20 28 31 29 20 54 68 65 20 61 75 74 68  *   (1) The auth
e130: 6f 72 69 7a 61 74 69 6f 6e 20 74 79 70 65 20 28  orization type (
e140: 65 78 3a 20 53 51 4c 49 54 45 5f 43 52 45 41 54  ex: SQLITE_CREAT
e150: 45 5f 54 41 42 4c 45 2c 20 53 51 4c 49 54 45 5f  E_TABLE, SQLITE_
e160: 49 4e 53 45 52 54 2c 20 2e 2e 2e 29 0a 20 20 2a  INSERT, ...).  *
e170: 2a 20 20 20 28 32 29 20 46 69 72 73 74 20 64 65  *   (2) First de
e180: 73 63 72 69 70 74 69 76 65 20 6e 61 6d 65 20 28  scriptive name (
e190: 64 65 70 65 6e 64 73 20 6f 6e 20 61 75 74 68 6f  depends on autho
e1a0: 72 69 7a 61 74 69 6f 6e 20 74 79 70 65 29 0a 20  rization type). 
e1b0: 20 2a 2a 20 20 20 28 33 29 20 53 65 63 6f 6e 64   **   (3) Second
e1c0: 20 64 65 73 63 72 69 70 74 69 76 65 20 6e 61 6d   descriptive nam
e1d0: 65 0a 20 20 2a 2a 20 20 20 28 34 29 20 4e 61 6d  e.  **   (4) Nam
e1e0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
e1f0: 65 20 28 65 78 3a 20 22 6d 61 69 6e 22 2c 20 22  e (ex: "main", "
e200: 74 65 6d 70 22 29 0a 20 20 2a 2a 20 20 20 28 35  temp").  **   (5
e210: 29 20 4e 61 6d 65 20 6f 66 20 74 72 69 67 67 65  ) Name of trigge
e220: 72 20 74 68 61 74 20 69 73 20 64 6f 69 6e 67 20  r that is doing 
e230: 74 68 65 20 61 63 63 65 73 73 0a 20 20 2a 2a 0a  the access.  **.
e240: 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61 63    ** The callbac
e250: 6b 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20  k should return 
e260: 6f 6e 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  on of the follow
e270: 69 6e 67 20 73 74 72 69 6e 67 73 3a 20 53 51 4c  ing strings: SQL
e280: 49 54 45 5f 4f 4b 2c 0a 20 20 2a 2a 20 53 51 4c  ITE_OK,.  ** SQL
e290: 49 54 45 5f 49 47 4e 4f 52 45 2c 20 6f 72 20 53  ITE_IGNORE, or S
e2a0: 51 4c 49 54 45 5f 44 45 4e 59 2e 20 20 41 6e 79  QLITE_DENY.  Any
e2b0: 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76 61   other return va
e2c0: 6c 75 65 20 69 73 20 61 6e 20 65 72 72 6f 72 2e  lue is an error.
e2d0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
e2e0: 69 73 20 6d 65 74 68 6f 64 20 69 73 20 69 6e 76  is method is inv
e2f0: 6f 6b 65 64 20 77 69 74 68 20 6e 6f 20 61 72 67  oked with no arg
e300: 75 6d 65 6e 74 73 2c 20 74 68 65 20 63 75 72 72  uments, the curr
e310: 65 6e 74 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  ent authorizatio
e320: 6e 0a 20 20 2a 2a 20 63 61 6c 6c 62 61 63 6b 20  n.  ** callback 
e330: 73 74 72 69 6e 67 20 69 73 20 72 65 74 75 72 6e  string is return
e340: 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ed..  */.  case 
e350: 44 42 5f 41 55 54 48 4f 52 49 5a 45 52 3a 20 7b  DB_AUTHORIZER: {
e360: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
e370: 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
e380: 4e 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  N.    Tcl_Append
e390: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
e3a0: 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 6e 6f  authorization no
e3b0: 74 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74  t available in t
e3c0: 68 69 73 20 62 75 69 6c 64 22 2c 0a 20 20 20 20  his build",.    
e3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3e0: 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
e3f0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
e400: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20  ;.#else.    if( 
e410: 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20  objc>3 ){.      
e420: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
e430: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
e440: 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b  , "?CALLBACK?");
e450: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
e460: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c  L_ERROR;.    }el
e470: 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29  se if( objc==2 )
e480: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  {.      if( pDb-
e490: 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 20 20  >zAuth ){.      
e4a0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
e4b0: 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e  lt(interp, pDb->
e4c0: 7a 41 75 74 68 2c 20 28 63 68 61 72 2a 29 30 29  zAuth, (char*)0)
e4d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
e4e0: 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20  lse{.      char 
e4f0: 2a 7a 41 75 74 68 3b 0a 20 20 20 20 20 20 69 6e  *zAuth;.      in
e500: 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28  t len;.      if(
e510: 20 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20   pDb->zAuth ){. 
e520: 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28         Tcl_Free(
e530: 70 44 62 2d 3e 7a 41 75 74 68 29 3b 0a 20 20 20  pDb->zAuth);.   
e540: 20 20 20 7d 0a 20 20 20 20 20 20 7a 41 75 74 68     }.      zAuth
e550: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
e560: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
e570: 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66   &len);.      if
e580: 28 20 7a 41 75 74 68 20 26 26 20 6c 65 6e 3e 30  ( zAuth && len>0
e590: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
e5a0: 3e 7a 41 75 74 68 20 3d 20 54 63 6c 5f 41 6c 6c  >zAuth = Tcl_All
e5b0: 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20  oc( len + 1 );. 
e5c0: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44         memcpy(pD
e5d0: 62 2d 3e 7a 41 75 74 68 2c 20 7a 41 75 74 68 2c  b->zAuth, zAuth,
e5e0: 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d   len+1);.      }
e5f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44  else{.        pD
e600: 62 2d 3e 7a 41 75 74 68 20 3d 20 30 3b 0a 20 20  b->zAuth = 0;.  
e610: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
e620: 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20  pDb->zAuth ){.  
e630: 20 20 20 20 20 20 74 79 70 65 64 65 66 20 69 6e        typedef in
e640: 74 20 28 2a 73 71 6c 69 74 65 33 5f 61 75 74 68  t (*sqlite3_auth
e650: 5f 63 62 29 28 0a 20 20 20 20 20 20 20 20 20 20  _cb)(.          
e660: 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74   void*,int,const
e670: 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61   char*,const cha
e680: 72 2a 2c 0a 20 20 20 20 20 20 20 20 20 20 20 63  r*,.           c
e690: 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74  onst char*,const
e6a0: 20 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20 20   char*);.       
e6b0: 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69   pDb->interp = i
e6c0: 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73  nterp;.        s
e6d0: 71 6c 69 74 65 33 5f 73 65 74 5f 61 75 74 68 6f  qlite3_set_autho
e6e0: 72 69 7a 65 72 28 70 44 62 2d 3e 64 62 2c 28 73  rizer(pDb->db,(s
e6f0: 71 6c 69 74 65 33 5f 61 75 74 68 5f 63 62 29 61  qlite3_auth_cb)a
e700: 75 74 68 5f 63 61 6c 6c 62 61 63 6b 2c 70 44 62  uth_callback,pDb
e710: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
e720: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
e730: 73 65 74 5f 61 75 74 68 6f 72 69 7a 65 72 28 70  set_authorizer(p
e740: 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20  Db->db, 0, 0);. 
e750: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
e760: 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  dif.    break;. 
e770: 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20   }..  /*    $db 
e780: 62 61 63 6b 75 70 20 3f 44 41 54 41 42 41 53 45  backup ?DATABASE
e790: 3f 20 46 49 4c 45 4e 41 4d 45 0a 20 20 2a 2a 0a  ? FILENAME.  **.
e7a0: 20 20 2a 2a 20 4f 70 65 6e 20 6f 72 20 63 72 65    ** Open or cre
e7b0: 61 74 65 20 61 20 64 61 74 61 62 61 73 65 20 66  ate a database f
e7c0: 69 6c 65 20 6e 61 6d 65 64 20 46 49 4c 45 4e 41  ile named FILENA
e7d0: 4d 45 2e 20 20 54 72 61 6e 73 66 65 72 20 74 68  ME.  Transfer th
e7e0: 65 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f  e.  ** content o
e7f0: 66 20 6c 6f 63 61 6c 20 64 61 74 61 62 61 73 65  f local database
e800: 20 44 41 54 41 42 41 53 45 20 28 64 65 66 61 75   DATABASE (defau
e810: 6c 74 3a 20 22 6d 61 69 6e 22 29 20 69 6e 74 6f  lt: "main") into
e820: 20 74 68 65 0a 20 20 2a 2a 20 46 49 4c 45 4e 41   the.  ** FILENA
e830: 4d 45 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  ME database..  *
e840: 2f 0a 20 20 63 61 73 65 20 44 42 5f 42 41 43 4b  /.  case DB_BACK
e850: 55 50 3a 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  UP: {.    const 
e860: 63 68 61 72 20 2a 7a 44 65 73 74 46 69 6c 65 3b  char *zDestFile;
e870: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
e880: 2a 7a 53 72 63 44 62 3b 0a 20 20 20 20 73 71 6c  *zSrcDb;.    sql
e890: 69 74 65 33 20 2a 70 44 65 73 74 3b 0a 20 20 20  ite3 *pDest;.   
e8a0: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20   sqlite3_backup 
e8b0: 2a 70 42 61 63 6b 75 70 3b 0a 0a 20 20 20 20 69  *pBackup;..    i
e8c0: 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20  f( objc==3 ){.  
e8d0: 20 20 20 20 7a 53 72 63 44 62 20 3d 20 22 6d 61      zSrcDb = "ma
e8e0: 69 6e 22 3b 0a 20 20 20 20 20 20 7a 44 65 73 74  in";.      zDest
e8f0: 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  File = Tcl_GetSt
e900: 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
e910: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a     }else if( obj
e920: 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 7a 53  c==4 ){.      zS
e930: 72 63 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74  rcDb = Tcl_GetSt
e940: 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
e950: 20 20 20 20 20 7a 44 65 73 74 46 69 6c 65 20 3d       zDestFile =
e960: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
e970: 62 6a 76 5b 33 5d 29 3b 0a 20 20 20 20 7d 65 6c  bjv[3]);.    }el
e980: 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72  se{.      Tcl_Wr
e990: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
e9a0: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 44 41  p, 2, objv, "?DA
e9b0: 54 41 42 41 53 45 3f 20 46 49 4c 45 4e 41 4d 45  TABASE? FILENAME
e9c0: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
e9d0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
e9e0: 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
e9f0: 65 33 5f 6f 70 65 6e 5f 76 32 28 7a 44 65 73 74  e3_open_v2(zDest
ea00: 46 69 6c 65 2c 20 26 70 44 65 73 74 2c 0a 20 20  File, &pDest,.  
ea10: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
ea20: 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
ea30: 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
ea40: 5f 43 52 45 41 54 45 7c 20 70 44 62 2d 3e 6f 70  _CREATE| pDb->op
ea50: 65 6e 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20  enFlags, 0);.   
ea60: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
ea70: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  OK ){.      Tcl_
ea80: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
ea90: 65 72 70 2c 20 22 63 61 6e 6e 6f 74 20 6f 70 65  erp, "cannot ope
eaa0: 6e 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73  n target databas
eab0: 65 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20  e: ",.          
eac0: 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
ead0: 70 44 65 73 74 29 2c 20 28 63 68 61 72 2a 29 30  pDest), (char*)0
eae0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
eaf0: 5f 63 6c 6f 73 65 28 70 44 65 73 74 29 3b 0a 20  _close(pDest);. 
eb00: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
eb10: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
eb20: 20 70 42 61 63 6b 75 70 20 3d 20 73 71 6c 69 74   pBackup = sqlit
eb30: 65 33 5f 62 61 63 6b 75 70 5f 69 6e 69 74 28 70  e3_backup_init(p
eb40: 44 65 73 74 2c 20 22 6d 61 69 6e 22 2c 20 70 44  Dest, "main", pD
eb50: 62 2d 3e 64 62 2c 20 7a 53 72 63 44 62 29 3b 0a  b->db, zSrcDb);.
eb60: 20 20 20 20 69 66 28 20 70 42 61 63 6b 75 70 3d      if( pBackup=
eb70: 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =0 ){.      Tcl_
eb80: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
eb90: 65 72 70 2c 20 22 62 61 63 6b 75 70 20 66 61 69  erp, "backup fai
eba0: 6c 65 64 3a 20 22 2c 0a 20 20 20 20 20 20 20 20  led: ",.        
ebb0: 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73     sqlite3_errms
ebc0: 67 28 70 44 65 73 74 29 2c 20 28 63 68 61 72 2a  g(pDest), (char*
ebd0: 29 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  )0);.      sqlit
ebe0: 65 33 5f 63 6c 6f 73 65 28 70 44 65 73 74 29 3b  e3_close(pDest);
ebf0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
ec00: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
ec10: 20 20 20 77 68 69 6c 65 28 20 20 28 72 63 20 3d     while(  (rc =
ec20: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f   sqlite3_backup_
ec30: 73 74 65 70 28 70 42 61 63 6b 75 70 2c 31 30 30  step(pBackup,100
ec40: 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  ))==SQLITE_OK ){
ec50: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61  }.    sqlite3_ba
ec60: 63 6b 75 70 5f 66 69 6e 69 73 68 28 70 42 61 63  ckup_finish(pBac
ec70: 6b 75 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63  kup);.    if( rc
ec80: 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
ec90: 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f  .      rc = TCL_
eca0: 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  OK;.    }else{. 
ecb0: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
ecc0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62  esult(interp, "b
ecd0: 61 63 6b 75 70 20 66 61 69 6c 65 64 3a 20 22 2c  ackup failed: ",
ece0: 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  .           sqli
ecf0: 74 65 33 5f 65 72 72 6d 73 67 28 70 44 65 73 74  te3_errmsg(pDest
ed00: 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ), (char*)0);.  
ed10: 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52      rc = TCL_ERR
ed20: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  OR;.    }.    sq
ed30: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 44 65 73  lite3_close(pDes
ed40: 74 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  t);.    break;. 
ed50: 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20   }..  /*    $db 
ed60: 62 75 73 79 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a  busy ?CALLBACK?.
ed70: 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65    **.  ** Invoke
ed80: 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62   the given callb
ed90: 61 63 6b 20 69 66 20 61 6e 20 53 51 4c 20 73 74  ack if an SQL st
eda0: 61 74 65 6d 65 6e 74 20 61 74 74 65 6d 70 74 73  atement attempts
edb0: 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20   to open.  ** a 
edc0: 6c 6f 63 6b 65 64 20 64 61 74 61 62 61 73 65 20  locked database 
edd0: 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  file..  */.  cas
ede0: 65 20 44 42 5f 42 55 53 59 3a 20 7b 0a 20 20 20  e DB_BUSY: {.   
edf0: 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20   if( objc>3 ){. 
ee00: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
ee10: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
ee20: 20 6f 62 6a 76 2c 20 22 43 41 4c 4c 42 41 43 4b   objv, "CALLBACK
ee30: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
ee40: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
ee50: 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d  }else if( objc==
ee60: 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  2 ){.      if( p
ee70: 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20  Db->zBusy ){.   
ee80: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
ee90: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44  esult(interp, pD
eea0: 62 2d 3e 7a 42 75 73 79 2c 20 28 63 68 61 72 2a  b->zBusy, (char*
eeb0: 29 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  )0);.      }.   
eec0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
eed0: 61 72 20 2a 7a 42 75 73 79 3b 0a 20 20 20 20 20  ar *zBusy;.     
eee0: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20   int len;.      
eef0: 69 66 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29  if( pDb->zBusy )
ef00: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72  {.        Tcl_Fr
ef10: 65 65 28 70 44 62 2d 3e 7a 42 75 73 79 29 3b 0a  ee(pDb->zBusy);.
ef20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 42        }.      zB
ef30: 75 73 79 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  usy = Tcl_GetStr
ef40: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
ef50: 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20  2], &len);.     
ef60: 20 69 66 28 20 7a 42 75 73 79 20 26 26 20 6c 65   if( zBusy && le
ef70: 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  n>0 ){.        p
ef80: 44 62 2d 3e 7a 42 75 73 79 20 3d 20 54 63 6c 5f  Db->zBusy = Tcl_
ef90: 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29  Alloc( len + 1 )
efa0: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
efb0: 28 70 44 62 2d 3e 7a 42 75 73 79 2c 20 7a 42 75  (pDb->zBusy, zBu
efc0: 73 79 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20  sy, len+1);.    
efd0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
efe0: 20 70 44 62 2d 3e 7a 42 75 73 79 20 3d 20 30 3b   pDb->zBusy = 0;
eff0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
f000: 66 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b  f( pDb->zBusy ){
f010: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e  .        pDb->in
f020: 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20  terp = interp;. 
f030: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
f040: 75 73 79 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d  usy_handler(pDb-
f050: 3e 64 62 2c 20 44 62 42 75 73 79 48 61 6e 64 6c  >db, DbBusyHandl
f060: 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20  er, pDb);.      
f070: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
f080: 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64  qlite3_busy_hand
f090: 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20  ler(pDb->db, 0, 
f0a0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
f0b0: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
f0c0: 0a 0a 20 20 2f 2a 20 20 20 20 20 24 64 62 20 63  ..  /*     $db c
f0d0: 61 63 68 65 20 66 6c 75 73 68 0a 20 20 2a 2a 20  ache flush.  ** 
f0e0: 20 20 20 20 24 64 62 20 63 61 63 68 65 20 73 69      $db cache si
f0f0: 7a 65 20 6e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46  ze n.  **.  ** F
f100: 6c 75 73 68 20 74 68 65 20 70 72 65 70 61 72 65  lush the prepare
f110: 64 20 73 74 61 74 65 6d 65 6e 74 20 63 61 63 68  d statement cach
f120: 65 2c 20 6f 72 20 73 65 74 20 74 68 65 20 6d 61  e, or set the ma
f130: 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 0a  ximum number of.
f140: 20 20 2a 2a 20 63 61 63 68 65 64 20 73 74 61 74    ** cached stat
f150: 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 63  ements..  */.  c
f160: 61 73 65 20 44 42 5f 43 41 43 48 45 3a 20 7b 0a  ase DB_CACHE: {.
f170: 20 20 20 20 63 68 61 72 20 2a 73 75 62 43 6d 64      char *subCmd
f180: 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 0a 20 20  ;.    int n;..  
f190: 20 20 69 66 28 20 6f 62 6a 63 3c 3d 32 20 29 7b    if( objc<=2 ){
f1a0: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
f1b0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
f1c0: 31 2c 20 6f 62 6a 76 2c 20 22 63 61 63 68 65 20  1, objv, "cache 
f1d0: 6f 70 74 69 6f 6e 20 3f 61 72 67 3f 22 29 3b 0a  option ?arg?");.
f1e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
f1f0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
f200: 20 20 73 75 62 43 6d 64 20 3d 20 54 63 6c 5f 47    subCmd = Tcl_G
f210: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
f220: 20 6f 62 6a 76 5b 32 5d 2c 20 30 20 29 3b 0a 20   objv[2], 0 );. 
f230: 20 20 20 69 66 28 20 2a 73 75 62 43 6d 64 3d 3d     if( *subCmd==
f240: 27 66 27 20 26 26 20 73 74 72 63 6d 70 28 73 75  'f' && strcmp(su
f250: 62 43 6d 64 2c 22 66 6c 75 73 68 22 29 3d 3d 30  bCmd,"flush")==0
f260: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f 62   ){.      if( ob
f270: 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 20  jc!=3 ){.       
f280: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
f290: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
f2a0: 76 2c 20 22 66 6c 75 73 68 22 29 3b 0a 20 20 20  v, "flush");.   
f2b0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
f2c0: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c  ERROR;.      }el
f2d0: 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 75 73  se{.        flus
f2e0: 68 53 74 6d 74 43 61 63 68 65 28 20 70 44 62 20  hStmtCache( pDb 
f2f0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
f300: 65 6c 73 65 20 69 66 28 20 2a 73 75 62 43 6d 64  else if( *subCmd
f310: 3d 3d 27 73 27 20 26 26 20 73 74 72 63 6d 70 28  =='s' && strcmp(
f320: 73 75 62 43 6d 64 2c 22 73 69 7a 65 22 29 3d 3d  subCmd,"size")==
f330: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f  0 ){.      if( o
f340: 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20  bjc!=4 ){.      
f350: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
f360: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
f370: 6a 76 2c 20 22 73 69 7a 65 20 6e 22 29 3b 0a 20  jv, "size n");. 
f380: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
f390: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  L_ERROR;.      }
f3a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66  else{.        if
f3b0: 28 20 54 43 4c 5f 45 52 52 4f 52 3d 3d 54 63 6c  ( TCL_ERROR==Tcl
f3c0: 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
f3d0: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20  nterp, objv[3], 
f3e0: 26 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  &n) ){.         
f3f0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
f400: 74 28 20 69 6e 74 65 72 70 2c 20 22 63 61 6e 6e  t( interp, "cann
f410: 6f 74 20 63 6f 6e 76 65 72 74 20 5c 22 22 2c 20  ot convert \"", 
f420: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f430: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
f440: 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 30 29 2c  mObj(objv[3],0),
f450: 20 22 5c 22 20 74 6f 20 69 6e 74 65 67 65 72 22   "\" to integer"
f460: 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
f470: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
f480: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  L_ERROR;.       
f490: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
f4a0: 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20    if( n<0 ){.   
f4b0: 20 20 20 20 20 20 20 20 20 66 6c 75 73 68 53 74           flushSt
f4c0: 6d 74 43 61 63 68 65 28 20 70 44 62 20 29 3b 0a  mtCache( pDb );.
f4d0: 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20              n = 
f4e0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  0;.          }el
f4f0: 73 65 20 69 66 28 20 6e 3e 4d 41 58 5f 50 52 45  se if( n>MAX_PRE
f500: 50 41 52 45 44 5f 53 54 4d 54 53 20 29 7b 0a 20  PARED_STMTS ){. 
f510: 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 4d             n = M
f520: 41 58 5f 50 52 45 50 41 52 45 44 5f 53 54 4d 54  AX_PREPARED_STMT
f530: 53 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  S;.          }. 
f540: 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 6d 61           pDb->ma
f550: 78 53 74 6d 74 20 3d 20 6e 3b 0a 20 20 20 20 20  xStmt = n;.     
f560: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
f570: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63   }else{.      Tc
f580: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 20  l_AppendResult( 
f590: 69 6e 74 65 72 70 2c 20 22 62 61 64 20 6f 70 74  interp, "bad opt
f5a0: 69 6f 6e 20 5c 22 22 2c 20 0a 20 20 20 20 20 20  ion \"", .      
f5b0: 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
f5c0: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
f5d0: 2c 30 29 2c 20 22 5c 22 3a 20 6d 75 73 74 20 62  ,0), "\": must b
f5e0: 65 20 66 6c 75 73 68 20 6f 72 20 73 69 7a 65 22  e flush or size"
f5f0: 2c 0a 20 20 20 20 20 20 20 20 20 20 28 63 68 61  ,.          (cha
f600: 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 65 74  r*)0);.      ret
f610: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
f620: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
f630: 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 20 24 64    }..  /*     $d
f640: 62 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 0a 20  b changes.  **. 
f650: 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e   ** Return the n
f660: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68  umber of rows th
f670: 61 74 20 77 65 72 65 20 6d 6f 64 69 66 69 65 64  at were modified
f680: 2c 20 69 6e 73 65 72 74 65 64 2c 20 6f 72 20 64  , inserted, or d
f690: 65 6c 65 74 65 64 20 62 79 0a 20 20 2a 2a 20 74  eleted by.  ** t
f6a0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 49  he most recent I
f6b0: 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72  NSERT, UPDATE or
f6c0: 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e   DELETE statemen
f6d0: 74 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67  t, not including
f6e0: 20 0a 20 20 2a 2a 20 61 6e 79 20 63 68 61 6e 67   .  ** any chang
f6f0: 65 73 20 6d 61 64 65 20 62 79 20 74 72 69 67 67  es made by trigg
f700: 65 72 20 70 72 6f 67 72 61 6d 73 2e 0a 20 20 2a  er programs..  *
f710: 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 48 41 4e  /.  case DB_CHAN
f720: 47 45 53 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f  GES: {.    Tcl_O
f730: 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20  bj *pResult;.   
f740: 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
f750: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
f760: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
f770: 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20  , objv, "");.   
f780: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
f790: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ROR;.    }.    p
f7a0: 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74  Result = Tcl_Get
f7b0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
f7c0: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 49 6e  );.    Tcl_SetIn
f7d0: 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 73 71  tObj(pResult, sq
f7e0: 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 70 44  lite3_changes(pD
f7f0: 62 2d 3e 64 62 29 29 3b 0a 20 20 20 20 62 72 65  b->db));.    bre
f800: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
f810: 20 24 64 62 20 63 6c 6f 73 65 0a 20 20 2a 2a 0a   $db close.  **.
f820: 20 20 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68    ** Shutdown th
f830: 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2f 0a  e database.  */.
f840: 20 20 63 61 73 65 20 44 42 5f 43 4c 4f 53 45 3a    case DB_CLOSE:
f850: 20 7b 0a 20 20 20 20 54 63 6c 5f 44 65 6c 65 74   {.    Tcl_Delet
f860: 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  eCommand(interp,
f870: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
f880: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
f890: 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  ));.    break;. 
f8a0: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
f8b0: 20 20 24 64 62 20 63 6f 6c 6c 61 74 65 20 4e 41    $db collate NA
f8c0: 4d 45 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20  ME SCRIPT.  **. 
f8d0: 20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77   ** Create a new
f8e0: 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   SQL collation f
f8f0: 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e  unction called N
f900: 41 4d 45 2e 20 20 57 68 65 6e 65 76 65 72 0a 20  AME.  Whenever. 
f910: 20 2a 2a 20 74 68 61 74 20 66 75 6e 63 74 69 6f   ** that functio
f920: 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 6e 76  n is called, inv
f930: 6f 6b 65 20 53 43 52 49 50 54 20 74 6f 20 65 76  oke SCRIPT to ev
f940: 61 6c 75 61 74 65 20 74 68 65 20 66 75 6e 63 74  aluate the funct
f950: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ion..  */.  case
f960: 20 44 42 5f 43 4f 4c 4c 41 54 45 3a 20 7b 0a 20   DB_COLLATE: {. 
f970: 20 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70     SqlCollate *p
f980: 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 63 68 61  Collate;.    cha
f990: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 68  r *zName;.    ch
f9a0: 61 72 20 2a 7a 53 63 72 69 70 74 3b 0a 20 20 20  ar *zScript;.   
f9b0: 20 69 6e 74 20 6e 53 63 72 69 70 74 3b 0a 20 20   int nScript;.  
f9c0: 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b    if( objc!=4 ){
f9d0: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
f9e0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
f9f0: 32 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 20 53  2, objv, "NAME S
fa00: 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72  CRIPT");.      r
fa10: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
fa20: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65  .    }.    zName
fa30: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
fa40: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
fa50: 20 30 29 3b 0a 20 20 20 20 7a 53 63 72 69 70 74   0);.    zScript
fa60: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
fa70: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c  FromObj(objv[3],
fa80: 20 26 6e 53 63 72 69 70 74 29 3b 0a 20 20 20 20   &nScript);.    
fa90: 70 43 6f 6c 6c 61 74 65 20 3d 20 28 53 71 6c 43  pCollate = (SqlC
faa0: 6f 6c 6c 61 74 65 2a 29 54 63 6c 5f 41 6c 6c 6f  ollate*)Tcl_Allo
fab0: 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 6f 6c 6c  c( sizeof(*pColl
fac0: 61 74 65 29 20 2b 20 6e 53 63 72 69 70 74 20 2b  ate) + nScript +
fad0: 20 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43   1 );.    if( pC
fae0: 6f 6c 6c 61 74 65 3d 3d 30 20 29 20 72 65 74 75  ollate==0 ) retu
faf0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
fb00: 20 20 70 43 6f 6c 6c 61 74 65 2d 3e 69 6e 74 65    pCollate->inte
fb10: 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20  rp = interp;.   
fb20: 20 70 43 6f 6c 6c 61 74 65 2d 3e 70 4e 65 78 74   pCollate->pNext
fb30: 20 3d 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65   = pDb->pCollate
fb40: 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65 2d 3e  ;.    pCollate->
fb50: 7a 53 63 72 69 70 74 20 3d 20 28 63 68 61 72 2a  zScript = (char*
fb60: 29 26 70 43 6f 6c 6c 61 74 65 5b 31 5d 3b 0a 20  )&pCollate[1];. 
fb70: 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65     pDb->pCollate
fb80: 20 3d 20 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20   = pCollate;.   
fb90: 20 6d 65 6d 63 70 79 28 70 43 6f 6c 6c 61 74 65   memcpy(pCollate
fba0: 2d 3e 7a 53 63 72 69 70 74 2c 20 7a 53 63 72 69  ->zScript, zScri
fbb0: 70 74 2c 20 6e 53 63 72 69 70 74 2b 31 29 3b 0a  pt, nScript+1);.
fbc0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
fbd0: 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
fbe0: 28 70 44 62 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c  (pDb->db, zName,
fbf0: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20   SQLITE_UTF8, . 
fc00: 20 20 20 20 20 20 20 70 43 6f 6c 6c 61 74 65 2c         pCollate,
fc10: 20 74 63 6c 53 71 6c 43 6f 6c 6c 61 74 65 29 20   tclSqlCollate) 
fc20: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  ){.      Tcl_Set
fc30: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
fc40: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 65  char *)sqlite3_e
fc50: 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20  rrmsg(pDb->db), 
fc60: 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20  TCL_VOLATILE);. 
fc70: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
fc80: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
fc90: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
fca0: 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 63  *.  **     $db c
fcb0: 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 20  ollation_needed 
fcc0: 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a  SCRIPT.  **.  **
fcd0: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 51   Create a new SQ
fce0: 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63  L collation func
fcf0: 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45  tion called NAME
fd00: 2e 20 20 57 68 65 6e 65 76 65 72 0a 20 20 2a 2a  .  Whenever.  **
fd10: 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 69   that function i
fd20: 73 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65  s called, invoke
fd30: 20 53 43 52 49 50 54 20 74 6f 20 65 76 61 6c 75   SCRIPT to evalu
fd40: 61 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  ate the function
fd50: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
fd60: 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4e 45 45 44 45  _COLLATION_NEEDE
fd70: 44 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a  D: {.    if( obj
fd80: 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=3 ){.      Tc
fd90: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
fda0: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
fdb0: 22 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20  "SCRIPT");.     
fdc0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
fdd0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  R;.    }.    if(
fde0: 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65   pDb->pCollateNe
fdf0: 65 64 65 64 20 29 7b 0a 20 20 20 20 20 20 54 63  eded ){.      Tc
fe00: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
fe10: 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64  Db->pCollateNeed
fe20: 65 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ed);.    }.    p
fe30: 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64  Db->pCollateNeed
fe40: 65 64 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  ed = Tcl_Duplica
fe50: 74 65 4f 62 6a 28 6f 62 6a 76 5b 32 5d 29 3b 0a  teObj(objv[2]);.
fe60: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
fe70: 6f 75 6e 74 28 70 44 62 2d 3e 70 43 6f 6c 6c 61  ount(pDb->pColla
fe80: 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 73  teNeeded);.    s
fe90: 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e  qlite3_collation
fea0: 5f 6e 65 65 64 65 64 28 70 44 62 2d 3e 64 62 2c  _needed(pDb->db,
feb0: 20 70 44 62 2c 20 74 63 6c 43 6f 6c 6c 61 74 65   pDb, tclCollate
fec0: 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 62 72 65  Needed);.    bre
fed0: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
fee0: 20 24 64 62 20 63 6f 6d 6d 69 74 5f 68 6f 6f 6b   $db commit_hook
fef0: 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a   ?CALLBACK?.  **
ff00: 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  .  ** Invoke the
ff10: 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20   given callback 
ff20: 6a 75 73 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d  just before comm
ff30: 69 74 74 69 6e 67 20 65 76 65 72 79 20 53 51 4c  itting every SQL
ff40: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
ff50: 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 62 61  ** If the callba
ff60: 63 6b 20 74 68 72 6f 77 73 20 61 6e 20 65 78 63  ck throws an exc
ff70: 65 70 74 69 6f 6e 20 6f 72 20 72 65 74 75 72 6e  eption or return
ff80: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
ff90: 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61   the.  ** transa
ffa0: 63 74 69 6f 6e 20 69 73 20 61 62 6f 72 74 65 64  ction is aborted
ffb0: 2e 20 20 49 66 20 43 41 4c 4c 42 41 43 4b 20 69  .  If CALLBACK i
ffc0: 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  s an empty strin
ffd0: 67 2c 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 0a  g, the callback.
ffe0: 20 20 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64    ** is disabled
fff0: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
10000 5f 43 4f 4d 4d 49 54 5f 48 4f 4f 4b 3a 20 7b 0a  _COMMIT_HOOK: {.
10010 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29      if( objc>3 )
10020 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
10030 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
10040 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c   2, objv, "?CALL
10050 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72  BACK?");.      r
10060 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
10070 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
10080 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  bjc==2 ){.      
10090 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74  if( pDb->zCommit
100a0 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
100b0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
100c0 65 72 70 2c 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69  erp, pDb->zCommi
100d0 74 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  t, (char*)0);.  
100e0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
100f0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
10100 72 20 2a 7a 43 6f 6d 6d 69 74 3b 0a 20 20 20 20  r *zCommit;.    
10110 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20    int len;.     
10120 20 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69   if( pDb->zCommi
10130 74 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  t ){.        Tcl
10140 5f 46 72 65 65 28 70 44 62 2d 3e 7a 43 6f 6d 6d  _Free(pDb->zComm
10150 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  it);.      }.   
10160 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 54 63 6c     zCommit = Tcl
10170 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
10180 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29  j(objv[2], &len)
10190 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 43 6f 6d  ;.      if( zCom
101a0 6d 69 74 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a  mit && len>0 ){.
101b0 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 43 6f          pDb->zCo
101c0 6d 6d 69 74 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63  mmit = Tcl_Alloc
101d0 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20  ( len + 1 );.   
101e0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d       memcpy(pDb-
101f0 3e 7a 43 6f 6d 6d 69 74 2c 20 7a 43 6f 6d 6d 69  >zCommit, zCommi
10200 74 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20  t, len+1);.     
10210 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
10220 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20 30  pDb->zCommit = 0
10230 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10240 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74  if( pDb->zCommit
10250 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
10260 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  >interp = interp
10270 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
10280 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 70 44  3_commit_hook(pD
10290 62 2d 3e 64 62 2c 20 44 62 43 6f 6d 6d 69 74 48  b->db, DbCommitH
102a0 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20  andler, pDb);.  
102b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
102c0 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69     sqlite3_commi
102d0 74 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 20  t_hook(pDb->db, 
102e0 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  0, 0);.      }. 
102f0 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
10300 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62    }..  /*    $db
10310 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c 0a 20 20   complete SQL.  
10320 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 54  **.  ** Return T
10330 52 55 45 20 69 66 20 53 51 4c 20 69 73 20 61 20  RUE if SQL is a 
10340 63 6f 6d 70 6c 65 74 65 20 53 51 4c 20 73 74 61  complete SQL sta
10350 74 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20  tement.  Return 
10360 46 41 4c 53 45 20 69 66 0a 20 20 2a 2a 20 61 64  FALSE if.  ** ad
10370 64 69 74 69 6f 6e 61 6c 20 6c 69 6e 65 73 20 6f  ditional lines o
10380 66 20 69 6e 70 75 74 20 61 72 65 20 6e 65 65 64  f input are need
10390 65 64 2e 20 20 54 68 69 73 20 69 73 20 73 69 6d  ed.  This is sim
103a0 69 6c 61 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a  ilar to the.  **
103b0 20 62 75 69 6c 74 2d 69 6e 20 22 69 6e 66 6f 20   built-in "info 
103c0 63 6f 6d 70 6c 65 74 65 22 20 63 6f 6d 6d 61 6e  complete" comman
103d0 64 20 6f 66 20 54 63 6c 2e 0a 20 20 2a 2f 0a 20  d of Tcl..  */. 
103e0 20 63 61 73 65 20 44 42 5f 43 4f 4d 50 4c 45 54   case DB_COMPLET
103f0 45 3a 20 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  E: {.#ifndef SQL
10400 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4c 45 54  ITE_OMIT_COMPLET
10410 45 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  E.    Tcl_Obj *p
10420 52 65 73 75 6c 74 3b 0a 20 20 20 20 69 6e 74 20  Result;.    int 
10430 69 73 43 6f 6d 70 6c 65 74 65 3b 0a 20 20 20 20  isComplete;.    
10440 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
10450 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
10460 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
10470 20 6f 62 6a 76 2c 20 22 53 51 4c 22 29 3b 0a 20   objv, "SQL");. 
10480 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
10490 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
104a0 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 73 71   isComplete = sq
104b0 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 28 20  lite3_complete( 
104c0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
104d0 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29  mObj(objv[2], 0)
104e0 20 29 3b 0a 20 20 20 20 70 52 65 73 75 6c 74 20   );.    pResult 
104f0 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75  = Tcl_GetObjResu
10500 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  lt(interp);.    
10510 54 63 6c 5f 53 65 74 42 6f 6f 6c 65 61 6e 4f 62  Tcl_SetBooleanOb
10520 6a 28 70 52 65 73 75 6c 74 2c 20 69 73 43 6f 6d  j(pResult, isCom
10530 70 6c 65 74 65 29 3b 0a 23 65 6e 64 69 66 0a 20  plete);.#endif. 
10540 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
10550 20 2f 2a 20 20 20 20 24 64 62 20 63 6f 70 79 20   /*    $db copy 
10560 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74  conflict-algorit
10570 68 6d 20 74 61 62 6c 65 20 66 69 6c 65 6e 61 6d  hm table filenam
10580 65 20 3f 53 45 50 41 52 41 54 4f 52 3f 20 3f 4e  e ?SEPARATOR? ?N
10590 55 4c 4c 49 4e 44 49 43 41 54 4f 52 3f 0a 20 20  ULLINDICATOR?.  
105a0 2a 2a 0a 20 20 2a 2a 20 43 6f 70 79 20 64 61 74  **.  ** Copy dat
105b0 61 20 69 6e 74 6f 20 74 61 62 6c 65 20 66 72 6f  a into table fro
105c0 6d 20 66 69 6c 65 6e 61 6d 65 2c 20 6f 70 74 69  m filename, opti
105d0 6f 6e 61 6c 6c 79 20 75 73 69 6e 67 20 53 45 50  onally using SEP
105e0 41 52 41 54 4f 52 0a 20 20 2a 2a 20 61 73 20 63  ARATOR.  ** as c
105f0 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 73  olumn separators
10600 2e 20 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 63  .  If a column c
10610 6f 6e 74 61 69 6e 73 20 61 20 6e 75 6c 6c 20 73  ontains a null s
10620 74 72 69 6e 67 2c 20 6f 72 20 74 68 65 0a 20 20  tring, or the.  
10630 2a 2a 20 76 61 6c 75 65 20 6f 66 20 4e 55 4c 4c  ** value of NULL
10640 49 4e 44 49 43 41 54 4f 52 2c 20 61 20 4e 55 4c  INDICATOR, a NUL
10650 4c 20 69 73 20 69 6e 73 65 72 74 65 64 20 66 6f  L is inserted fo
10660 72 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20  r the column..  
10670 2a 2a 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f  ** conflict-algo
10680 72 69 74 68 6d 20 69 73 20 6f 6e 65 20 6f 66 20  rithm is one of 
10690 74 68 65 20 73 71 6c 69 74 65 20 63 6f 6e 66 6c  the sqlite confl
106a0 69 63 74 20 61 6c 67 6f 72 69 74 68 6d 73 3a 0a  ict algorithms:.
106b0 20 20 2a 2a 20 20 20 20 72 6f 6c 6c 62 61 63 6b    **    rollback
106c0 2c 20 61 62 6f 72 74 2c 20 66 61 69 6c 2c 20 69  , abort, fail, i
106d0 67 6e 6f 72 65 2c 20 72 65 70 6c 61 63 65 0a 20  gnore, replace. 
106e0 20 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20   ** On success, 
106f0 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  return the numbe
10700 72 20 6f 66 20 6c 69 6e 65 73 20 70 72 6f 63 65  r of lines proce
10710 73 73 65 64 2c 20 6e 6f 74 20 6e 65 63 65 73 73  ssed, not necess
10720 61 72 69 6c 79 20 73 61 6d 65 0a 20 20 2a 2a 20  arily same.  ** 
10730 61 73 20 27 64 62 20 63 68 61 6e 67 65 73 27 20  as 'db changes' 
10740 64 75 65 20 74 6f 20 63 6f 6e 66 6c 69 63 74 2d  due to conflict-
10750 61 6c 67 6f 72 69 74 68 6d 20 73 65 6c 65 63 74  algorithm select
10760 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ed..  **.  ** Th
10770 69 73 20 63 6f 64 65 20 69 73 20 62 61 73 69 63  is code is basic
10780 61 6c 6c 79 20 61 6e 20 69 6d 70 6c 65 6d 65 6e  ally an implemen
10790 74 61 74 69 6f 6e 2f 65 6e 68 61 6e 63 65 6d 65  tation/enhanceme
107a0 6e 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73  nt of.  ** the s
107b0 71 6c 69 74 65 33 20 73 68 65 6c 6c 2e 63 20 22  qlite3 shell.c "
107c0 2e 69 6d 70 6f 72 74 22 20 63 6f 6d 6d 61 6e 64  .import" command
107d0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
107e0 20 63 6f 6d 6d 61 6e 64 20 75 73 61 67 65 20 69   command usage i
107f0 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
10800 74 68 65 20 73 71 6c 69 74 65 32 2e 78 20 43 4f  the sqlite2.x CO
10810 50 59 20 73 74 61 74 65 6d 65 6e 74 2c 0a 20 20  PY statement,.  
10820 2a 2a 20 77 68 69 63 68 20 69 6d 70 6f 72 74 73  ** which imports
10830 20 66 69 6c 65 20 64 61 74 61 20 69 6e 74 6f 20   file data into 
10840 61 20 74 61 62 6c 65 20 75 73 69 6e 67 20 74 68  a table using th
10850 65 20 50 6f 73 74 67 72 65 53 51 4c 20 43 4f 50  e PostgreSQL COP
10860 59 20 66 69 6c 65 20 66 6f 72 6d 61 74 3a 0a 20  Y file format:. 
10870 20 2a 2a 20 20 20 24 64 62 20 63 6f 70 79 20 24   **   $db copy $
10880 63 6f 6e 66 6c 69 74 5f 61 6c 67 6f 20 24 74 61  conflit_algo $ta
10890 62 6c 65 5f 6e 61 6d 65 20 24 66 69 6c 65 6e 61  ble_name $filena
108a0 6d 65 20 5c 74 20 5c 5c 4e 0a 20 20 2a 2f 0a 20  me \t \\N.  */. 
108b0 20 63 61 73 65 20 44 42 5f 43 4f 50 59 3a 20 7b   case DB_COPY: {
108c0 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 6c  .    char *zTabl
108d0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
108e0 20 2f 2a 20 49 6e 73 65 72 74 20 64 61 74 61 20   /* Insert data 
108f0 69 6e 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20  into this table 
10900 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 46 69  */.    char *zFi
10910 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
10920 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 66     /* The file f
10930 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 65 78 74  rom which to ext
10940 72 61 63 74 20 64 61 74 61 20 2a 2f 0a 20 20 20  ract data */.   
10950 20 63 68 61 72 20 2a 7a 43 6f 6e 66 6c 69 63 74   char *zConflict
10960 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
10970 54 68 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c 67  The conflict alg
10980 6f 72 69 74 68 6d 20 74 6f 20 75 73 65 20 2a 2f  orithm to use */
10990 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
109a0 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20  t *pStmt;       
109b0 20 2f 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20   /* A statement 
109c0 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b  */.    int nCol;
109d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109e0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
109f0 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74  columns in the t
10a00 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  able */.    int 
10a10 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20  nByte;          
10a20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
10a30 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61 6e  r of bytes in an
10a40 20 53 51 4c 20 73 74 72 69 6e 67 20 2a 2f 0a 20   SQL string */. 
10a50 20 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20     int i, j;    
10a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10a70 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
10a80 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 70 3b  */.    int nSep;
10a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10aa0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
10ab0 62 79 74 65 73 20 69 6e 20 7a 53 65 70 5b 5d 20  bytes in zSep[] 
10ac0 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4e 75 6c 6c  */.    int nNull
10ad0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10ae0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
10af0 62 79 74 65 73 20 69 6e 20 7a 4e 75 6c 6c 5b 5d  bytes in zNull[]
10b00 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53   */.    char *zS
10b10 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ql;             
10b20 20 20 20 20 2f 2a 20 41 6e 20 53 51 4c 20 73 74      /* An SQL st
10b30 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 63  atement */.    c
10b40 68 61 72 20 2a 7a 4c 69 6e 65 3b 20 20 20 20 20  har *zLine;     
10b50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
10b60 73 69 6e 67 6c 65 20 6c 69 6e 65 20 6f 66 20 69  single line of i
10b70 6e 70 75 74 20 66 72 6f 6d 20 74 68 65 20 66 69  nput from the fi
10b80 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  le */.    char *
10b90 2a 61 7a 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  *azCol;         
10ba0 20 20 20 20 20 20 2f 2a 20 7a 4c 69 6e 65 5b 5d        /* zLine[]
10bb0 20 62 72 6f 6b 65 6e 20 75 70 20 69 6e 74 6f 20   broken up into 
10bc0 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 63  columns */.    c
10bd0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6d 6d  onst char *zComm
10be0 69 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 48 6f  it;        /* Ho
10bf0 77 20 74 6f 20 63 6f 6d 6d 69 74 20 63 68 61 6e  w to commit chan
10c00 67 65 73 20 2a 2f 0a 20 20 20 20 46 49 4c 45 20  ges */.    FILE 
10c10 2a 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  *in;            
10c20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
10c30 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  put file */.    
10c40 69 6e 74 20 6c 69 6e 65 6e 6f 20 3d 20 30 3b 20  int lineno = 0; 
10c50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
10c60 69 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  ine number of in
10c70 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  put file */.    
10c80 63 68 61 72 20 7a 4c 69 6e 65 4e 75 6d 5b 38 30  char zLineNum[80
10c90 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ];          /* L
10ca0 69 6e 65 20 6e 75 6d 62 65 72 20 70 72 69 6e 74  ine number print
10cb0 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 54   buffer */.    T
10cc0 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b  cl_Obj *pResult;
10cd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e             /* in
10ce0 74 65 72 70 20 72 65 73 75 6c 74 20 2a 2f 0a 0a  terp result */..
10cf0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
10d00 7a 53 65 70 3b 0a 20 20 20 20 63 6f 6e 73 74 20  zSep;.    const 
10d10 63 68 61 72 20 2a 7a 4e 75 6c 6c 3b 0a 20 20 20  char *zNull;.   
10d20 20 69 66 28 20 6f 62 6a 63 3c 35 20 7c 7c 20 6f   if( objc<5 || o
10d30 62 6a 63 3e 37 20 29 7b 0a 20 20 20 20 20 20 54  bjc>7 ){.      T
10d40 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
10d50 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
10d60 20 0a 20 20 20 20 20 20 20 20 20 22 43 4f 4e 46   .         "CONF
10d70 4c 49 43 54 2d 41 4c 47 4f 52 49 54 48 4d 20 54  LICT-ALGORITHM T
10d80 41 42 4c 45 20 46 49 4c 45 4e 41 4d 45 20 3f 53  ABLE FILENAME ?S
10d90 45 50 41 52 41 54 4f 52 3f 20 3f 4e 55 4c 4c 49  EPARATOR? ?NULLI
10da0 4e 44 49 43 41 54 4f 52 3f 22 29 3b 0a 20 20 20  NDICATOR?");.   
10db0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
10dc0 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
10dd0 66 28 20 6f 62 6a 63 3e 3d 36 20 29 7b 0a 20 20  f( objc>=6 ){.  
10de0 20 20 20 20 7a 53 65 70 20 3d 20 54 63 6c 5f 47      zSep = Tcl_G
10df0 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
10e00 6f 62 6a 76 5b 35 5d 2c 20 30 29 3b 0a 20 20 20  objv[5], 0);.   
10e10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 53   }else{.      zS
10e20 65 70 20 3d 20 22 5c 74 22 3b 0a 20 20 20 20 7d  ep = "\t";.    }
10e30 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 3d 37  .    if( objc>=7
10e40 20 29 7b 0a 20 20 20 20 20 20 7a 4e 75 6c 6c 20   ){.      zNull 
10e50 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
10e60 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 36 5d 2c 20  romObj(objv[6], 
10e70 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
10e80 20 20 20 20 20 7a 4e 75 6c 6c 20 3d 20 22 22 3b       zNull = "";
10e90 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43 6f 6e 66  .    }.    zConf
10ea0 6c 69 63 74 20 3d 20 54 63 6c 5f 47 65 74 53 74  lict = Tcl_GetSt
10eb0 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
10ec0 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20 7a 54 61  [2], 0);.    zTa
10ed0 62 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ble = Tcl_GetStr
10ee0 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
10ef0 33 5d 2c 20 30 29 3b 0a 20 20 20 20 7a 46 69 6c  3], 0);.    zFil
10f00 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
10f10 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 34 5d  gFromObj(objv[4]
10f20 2c 20 30 29 3b 0a 20 20 20 20 6e 53 65 70 20 3d  , 0);.    nSep =
10f30 20 73 74 72 6c 65 6e 33 30 28 7a 53 65 70 29 3b   strlen30(zSep);
10f40 0a 20 20 20 20 6e 4e 75 6c 6c 20 3d 20 73 74 72  .    nNull = str
10f50 6c 65 6e 33 30 28 7a 4e 75 6c 6c 29 3b 0a 20 20  len30(zNull);.  
10f60 20 20 69 66 28 20 6e 53 65 70 3d 3d 30 20 29 7b    if( nSep==0 ){
10f70 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
10f80 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22  dResult(interp,"
10f90 45 72 72 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c 20  Error: non-null 
10fa0 73 65 70 61 72 61 74 6f 72 20 72 65 71 75 69 72  separator requir
10fb0 65 64 20 66 6f 72 20 63 6f 70 79 22 2c 0a 20 20  ed for copy",.  
10fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fd0 20 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b 0a       (char*)0);.
10fe0 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
10ff0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
11000 20 20 69 66 28 73 74 72 63 6d 70 28 7a 43 6f 6e    if(strcmp(zCon
11010 66 6c 69 63 74 2c 20 22 72 6f 6c 6c 62 61 63 6b  flict, "rollback
11020 22 29 20 21 3d 20 30 20 26 26 0a 20 20 20 20 20  ") != 0 &&.     
11030 20 20 73 74 72 63 6d 70 28 7a 43 6f 6e 66 6c 69    strcmp(zConfli
11040 63 74 2c 20 22 61 62 6f 72 74 22 20 20 20 29 20  ct, "abort"   ) 
11050 21 3d 20 30 20 26 26 0a 20 20 20 20 20 20 20 73  != 0 &&.       s
11060 74 72 63 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c  trcmp(zConflict,
11070 20 22 66 61 69 6c 22 20 20 20 20 29 20 21 3d 20   "fail"    ) != 
11080 30 20 26 26 0a 20 20 20 20 20 20 20 73 74 72 63  0 &&.       strc
11090 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 69  mp(zConflict, "i
110a0 67 6e 6f 72 65 22 20 20 29 20 21 3d 20 30 20 26  gnore"  ) != 0 &
110b0 26 0a 20 20 20 20 20 20 20 73 74 72 63 6d 70 28  &.       strcmp(
110c0 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 72 65 70 6c  zConflict, "repl
110d0 61 63 65 22 20 29 20 21 3d 20 30 20 29 20 7b 0a  ace" ) != 0 ) {.
110e0 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
110f0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
11100 45 72 72 6f 72 3a 20 5c 22 22 2c 20 7a 43 6f 6e  Error: \"", zCon
11110 66 6c 69 63 74 2c 20 0a 20 20 20 20 20 20 20 20  flict, .        
11120 20 20 20 20 22 5c 22 2c 20 63 6f 6e 66 6c 69 63      "\", conflic
11130 74 2d 61 6c 67 6f 72 69 74 68 6d 20 6d 75 73 74  t-algorithm must
11140 20 62 65 20 6f 6e 65 20 6f 66 3a 20 72 6f 6c 6c   be one of: roll
11150 62 61 63 6b 2c 20 22 0a 20 20 20 20 20 20 20 20  back, ".        
11160 20 20 20 20 22 61 62 6f 72 74 2c 20 66 61 69 6c      "abort, fail
11170 2c 20 69 67 6e 6f 72 65 2c 20 6f 72 20 72 65 70  , ignore, or rep
11180 6c 61 63 65 22 2c 20 28 63 68 61 72 2a 29 30 29  lace", (char*)0)
11190 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
111a0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
111b0 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
111c0 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45  e3_mprintf("SELE
111d0 43 54 20 2a 20 46 52 4f 4d 20 27 25 71 27 22 2c  CT * FROM '%q'",
111e0 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 69 66   zTable);.    if
111f0 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20  ( zSql==0 ){.   
11200 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
11210 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72  ult(interp, "Err
11220 6f 72 3a 20 6e 6f 20 73 75 63 68 20 74 61 62 6c  or: no such tabl
11230 65 3a 20 22 2c 20 7a 54 61 62 6c 65 2c 20 28 63  e: ", zTable, (c
11240 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72  har*)0);.      r
11250 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
11260 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65  .    }.    nByte
11270 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 53 71 6c   = strlen30(zSql
11280 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
11290 74 65 33 5f 70 72 65 70 61 72 65 28 70 44 62 2d  te3_prepare(pDb-
112a0 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  >db, zSql, -1, &
112b0 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73  pStmt, 0);.    s
112c0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
112d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
112e0 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
112f0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
11300 22 45 72 72 6f 72 3a 20 22 2c 20 73 71 6c 69 74  "Error: ", sqlit
11310 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64  e3_errmsg(pDb->d
11320 62 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  b), (char*)0);. 
11330 20 20 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20       nCol = 0;. 
11340 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11350 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63  nCol = sqlite3_c
11360 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d  olumn_count(pStm
11370 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  t);.    }.    sq
11380 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
11390 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 6e  Stmt);.    if( n
113a0 43 6f 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20  Col==0 ) {.     
113b0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
113c0 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71  R;.    }.    zSq
113d0 6c 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42 79 74  l = malloc( nByt
113e0 65 20 2b 20 35 30 20 2b 20 6e 43 6f 6c 2a 32 20  e + 50 + nCol*2 
113f0 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d  );.    if( zSql=
11400 3d 30 20 29 20 7b 0a 20 20 20 20 20 20 54 63 6c  =0 ) {.      Tcl
11410 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
11420 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 63 61  terp, "Error: ca
11430 6e 27 74 20 6d 61 6c 6c 6f 63 28 29 22 2c 20 28  n't malloc()", (
11440 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
11450 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
11460 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
11470 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 79  te3_snprintf(nBy
11480 74 65 2b 35 30 2c 20 7a 53 71 6c 2c 20 22 49 4e  te+50, zSql, "IN
11490 53 45 52 54 20 4f 52 20 25 71 20 49 4e 54 4f 20  SERT OR %q INTO 
114a0 27 25 71 27 20 56 41 4c 55 45 53 28 3f 22 2c 0a  '%q' VALUES(?",.
114b0 20 20 20 20 20 20 20 20 20 7a 43 6f 6e 66 6c 69           zConfli
114c0 63 74 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20  ct, zTable);.   
114d0 20 6a 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 53   j = strlen30(zS
114e0 71 6c 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31  ql);.    for(i=1
114f0 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
11500 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20        zSql[j++] 
11510 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 7a 53 71  = ',';.      zSq
11520 6c 5b 6a 2b 2b 5d 20 3d 20 27 3f 27 3b 0a 20 20  l[j++] = '?';.  
11530 20 20 7d 0a 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b    }.    zSql[j++
11540 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20 7a 53 71  ] = ')';.    zSq
11550 6c 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 72 63  l[j] = 0;.    rc
11560 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
11570 72 65 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c  re(pDb->db, zSql
11580 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29  , -1, &pStmt, 0)
11590 3b 0a 20 20 20 20 66 72 65 65 28 7a 53 71 6c 29  ;.    free(zSql)
115a0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
115b0 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
115c0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
115d0 45 72 72 6f 72 3a 20 22 2c 20 73 71 6c 69 74 65  Error: ", sqlite
115e0 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62  3_errmsg(pDb->db
115f0 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ), (char*)0);.  
11600 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
11610 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
11620 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
11630 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
11640 6e 20 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c  n = fopen(zFile,
11650 20 22 72 62 22 29 3b 0a 20 20 20 20 69 66 28 20   "rb");.    if( 
11660 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54  in==0 ){.      T
11670 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
11680 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20  interp, "Error: 
11690 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65  cannot open file
116a0 3a 20 22 2c 20 7a 46 69 6c 65 2c 20 4e 55 4c 4c  : ", zFile, NULL
116b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
116c0 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
116d0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
116e0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
116f0 20 20 20 20 61 7a 43 6f 6c 20 3d 20 6d 61 6c 6c      azCol = mall
11700 6f 63 28 20 73 69 7a 65 6f 66 28 61 7a 43 6f 6c  oc( sizeof(azCol
11710 5b 30 5d 29 2a 28 6e 43 6f 6c 2b 31 29 20 29 3b  [0])*(nCol+1) );
11720 0a 20 20 20 20 69 66 28 20 61 7a 43 6f 6c 3d 3d  .    if( azCol==
11730 30 20 29 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f  0 ) {.      Tcl_
11740 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
11750 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e  erp, "Error: can
11760 27 74 20 6d 61 6c 6c 6f 63 28 29 22 2c 20 28 63  't malloc()", (c
11770 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 66  har*)0);.      f
11780 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 20  close(in);.     
11790 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
117a0 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28 76 6f  R;.    }.    (vo
117b0 69 64 29 73 71 6c 69 74 65 33 5f 65 78 65 63 28  id)sqlite3_exec(
117c0 70 44 62 2d 3e 64 62 2c 20 22 42 45 47 49 4e 22  pDb->db, "BEGIN"
117d0 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
117e0 7a 43 6f 6d 6d 69 74 20 3d 20 22 43 4f 4d 4d 49  zCommit = "COMMI
117f0 54 22 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  T";.    while( (
11800 7a 4c 69 6e 65 20 3d 20 6c 6f 63 61 6c 5f 67 65  zLine = local_ge
11810 74 6c 69 6e 65 28 30 2c 20 69 6e 29 29 21 3d 30  tline(0, in))!=0
11820 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
11830 7a 3b 0a 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2b  z;.      lineno+
11840 2b 3b 0a 20 20 20 20 20 20 61 7a 43 6f 6c 5b 30  +;.      azCol[0
11850 5d 20 3d 20 7a 4c 69 6e 65 3b 0a 20 20 20 20 20  ] = zLine;.     
11860 20 66 6f 72 28 69 3d 30 2c 20 7a 3d 7a 4c 69 6e   for(i=0, z=zLin
11870 65 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20 20 20  e; *z; z++){.   
11880 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d 7a 53 65       if( *z==zSe
11890 70 5b 30 5d 20 26 26 20 73 74 72 6e 63 6d 70 28  p[0] && strncmp(
118a0 7a 2c 20 7a 53 65 70 2c 20 6e 53 65 70 29 3d 3d  z, zSep, nSep)==
118b0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a  0 ){.          *
118c0 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  z = 0;.         
118d0 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20   i++;.          
118e0 69 66 28 20 69 3c 6e 43 6f 6c 20 29 7b 0a 20 20  if( i<nCol ){.  
118f0 20 20 20 20 20 20 20 20 20 20 61 7a 43 6f 6c 5b            azCol[
11900 69 5d 20 3d 20 26 7a 5b 6e 53 65 70 5d 3b 0a 20  i] = &z[nSep];. 
11910 20 20 20 20 20 20 20 20 20 20 20 7a 20 2b 3d 20             z += 
11920 6e 53 65 70 2d 31 3b 0a 20 20 20 20 20 20 20 20  nSep-1;.        
11930 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
11940 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
11950 69 2b 31 21 3d 6e 43 6f 6c 20 29 7b 0a 20 20 20  i+1!=nCol ){.   
11960 20 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 3b       char *zErr;
11970 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 45 72  .        int nEr
11980 72 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 46 69  r = strlen30(zFi
11990 6c 65 29 20 2b 20 32 30 30 3b 0a 20 20 20 20 20  le) + 200;.     
119a0 20 20 20 7a 45 72 72 20 3d 20 6d 61 6c 6c 6f 63     zErr = malloc
119b0 28 6e 45 72 72 29 3b 0a 20 20 20 20 20 20 20 20  (nErr);.        
119c0 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20  if( zErr ){.    
119d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
119e0 70 72 69 6e 74 66 28 6e 45 72 72 2c 20 7a 45 72  printf(nErr, zEr
119f0 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
11a00 22 45 72 72 6f 72 3a 20 25 73 20 6c 69 6e 65 20  "Error: %s line 
11a10 25 64 3a 20 65 78 70 65 63 74 65 64 20 25 64 20  %d: expected %d 
11a20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20  columns of data 
11a30 62 75 74 20 66 6f 75 6e 64 20 25 64 22 2c 0a 20  but found %d",. 
11a40 20 20 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c              zFil
11a50 65 2c 20 6c 69 6e 65 6e 6f 2c 20 6e 43 6f 6c 2c  e, lineno, nCol,
11a60 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20   i+1);.         
11a70 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
11a80 74 28 69 6e 74 65 72 70 2c 20 7a 45 72 72 2c 20  t(interp, zErr, 
11a90 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
11aa0 20 20 20 20 20 66 72 65 65 28 7a 45 72 72 29 3b       free(zErr);
11ab0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
11ac0 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22 52 4f     zCommit = "RO
11ad0 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20 20 20  LLBACK";.       
11ae0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
11af0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
11b00 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
11b10 20 20 20 20 20 2f 2a 20 63 68 65 63 6b 20 66 6f       /* check fo
11b20 72 20 6e 75 6c 6c 20 64 61 74 61 2c 20 69 66 20  r null data, if 
11b30 73 6f 2c 20 62 69 6e 64 20 61 73 20 6e 75 6c 6c  so, bind as null
11b40 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
11b50 28 6e 4e 75 6c 6c 3e 30 20 26 26 20 73 74 72 63  (nNull>0 && strc
11b60 6d 70 28 61 7a 43 6f 6c 5b 69 5d 2c 20 7a 4e 75  mp(azCol[i], zNu
11b70 6c 6c 29 3d 3d 30 29 0a 20 20 20 20 20 20 20 20  ll)==0).        
11b80 20 20 7c 7c 20 73 74 72 6c 65 6e 33 30 28 61 7a    || strlen30(az
11b90 43 6f 6c 5b 69 5d 29 3d 3d 30 20 0a 20 20 20 20  Col[i])==0 .    
11ba0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
11bb0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75   sqlite3_bind_nu
11bc0 6c 6c 28 70 53 74 6d 74 2c 20 69 2b 31 29 3b 0a  ll(pStmt, i+1);.
11bd0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
11be0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
11bf0 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74  _bind_text(pStmt
11c00 2c 20 69 2b 31 2c 20 61 7a 43 6f 6c 5b 69 5d 2c  , i+1, azCol[i],
11c10 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54   -1, SQLITE_STAT
11c20 49 43 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  IC);.        }. 
11c30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
11c40 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
11c50 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
11c60 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74  ite3_reset(pStmt
11c70 29 3b 0a 20 20 20 20 20 20 66 72 65 65 28 7a 4c  );.      free(zL
11c80 69 6e 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ine);.      if( 
11c90 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
11ca0 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70  .        Tcl_App
11cb0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
11cc0 2c 22 45 72 72 6f 72 3a 20 22 2c 20 73 71 6c 69  ,"Error: ", sqli
11cd0 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e  te3_errmsg(pDb->
11ce0 64 62 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  db), (char*)0);.
11cf0 20 20 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20          zCommit 
11d00 3d 20 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20  = "ROLLBACK";.  
11d10 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11d20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66     }.    }.    f
11d30 72 65 65 28 61 7a 43 6f 6c 29 3b 0a 20 20 20 20  ree(azCol);.    
11d40 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20  fclose(in);.    
11d50 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
11d60 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 28 76 6f  (pStmt);.    (vo
11d70 69 64 29 73 71 6c 69 74 65 33 5f 65 78 65 63 28  id)sqlite3_exec(
11d80 70 44 62 2d 3e 64 62 2c 20 7a 43 6f 6d 6d 69 74  pDb->db, zCommit
11d90 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20  , 0, 0, 0);..   
11da0 20 69 66 28 20 7a 43 6f 6d 6d 69 74 5b 30 5d 20   if( zCommit[0] 
11db0 3d 3d 20 27 43 27 20 29 7b 0a 20 20 20 20 20 20  == 'C' ){.      
11dc0 2f 2a 20 73 75 63 63 65 73 73 2c 20 73 65 74 20  /* success, set 
11dd0 72 65 73 75 6c 74 20 61 73 20 6e 75 6d 62 65 72  result as number
11de0 20 6f 66 20 6c 69 6e 65 73 20 70 72 6f 63 65 73   of lines proces
11df0 73 65 64 20 2a 2f 0a 20 20 20 20 20 20 70 52 65  sed */.      pRe
11e00 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62  sult = Tcl_GetOb
11e10 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  jResult(interp);
11e20 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 49 6e  .      Tcl_SetIn
11e30 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 6c 69  tObj(pResult, li
11e40 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63 20  neno);.      rc 
11e50 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 65  = TCL_OK;.    }e
11e60 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 66 61  lse{.      /* fa
11e70 69 6c 75 72 65 2c 20 61 70 70 65 6e 64 20 6c 69  ilure, append li
11e80 6e 65 6e 6f 20 77 68 65 72 65 20 66 61 69 6c 65  neno where faile
11e90 64 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  d */.      sqlit
11ea0 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
11eb0 6f 66 28 7a 4c 69 6e 65 4e 75 6d 29 2c 20 7a 4c  of(zLineNum), zL
11ec0 69 6e 65 4e 75 6d 2c 22 25 64 22 2c 6c 69 6e 65  ineNum,"%d",line
11ed0 6e 6f 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 41  no);.      Tcl_A
11ee0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
11ef0 72 70 2c 22 2c 20 66 61 69 6c 65 64 20 77 68 69  rp,", failed whi
11f00 6c 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 69  le processing li
11f10 6e 65 3a 20 22 2c 7a 4c 69 6e 65 4e 75 6d 2c 0a  ne: ",zLineNum,.
11f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f30 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 30 29         (char*)0)
11f40 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c  ;.      rc = TCL
11f50 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
11f60 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
11f70 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 65  /*.  **    $db e
11f80 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e  nable_load_exten
11f90 73 69 6f 6e 20 42 4f 4f 4c 45 41 4e 0a 20 20 2a  sion BOOLEAN.  *
11fa0 2a 0a 20 20 2a 2a 20 54 75 72 6e 20 74 68 65 20  *.  ** Turn the 
11fb0 65 78 74 65 6e 73 69 6f 6e 20 6c 6f 61 64 69 6e  extension loadin
11fc0 67 20 66 65 61 74 75 72 65 20 6f 6e 20 6f 72 20  g feature on or 
11fd0 6f 66 66 2e 20 20 49 74 20 69 66 20 6f 66 66 20  off.  It if off 
11fe0 62 79 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74 2e  by.  ** default.
11ff0 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
12000 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45  ENABLE_LOAD_EXTE
12010 4e 53 49 4f 4e 3a 20 7b 0a 23 69 66 6e 64 65 66  NSION: {.#ifndef
12020 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
12030 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20  D_EXTENSION.    
12040 69 6e 74 20 6f 6e 6f 66 66 3b 0a 20 20 20 20 69  int onoff;.    i
12050 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
12060 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
12070 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
12080 6f 62 6a 76 2c 20 22 42 4f 4f 4c 45 41 4e 22 29  objv, "BOOLEAN")
12090 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
120a0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
120b0 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42      if( Tcl_GetB
120c0 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
120d0 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
120e0 6f 6e 6f 66 66 29 20 29 7b 0a 20 20 20 20 20 20  onoff) ){.      
120f0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
12100 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
12110 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f  te3_enable_load_
12120 65 78 74 65 6e 73 69 6f 6e 28 70 44 62 2d 3e 64  extension(pDb->d
12130 62 2c 20 6f 6e 6f 66 66 29 3b 0a 20 20 20 20 62  b, onoff);.    b
12140 72 65 61 6b 3b 0a 23 65 6c 73 65 0a 20 20 20 20  reak;.#else.    
12150 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
12160 28 69 6e 74 65 72 70 2c 20 22 65 78 74 65 6e 73  (interp, "extens
12170 69 6f 6e 20 6c 6f 61 64 69 6e 67 20 69 73 20 74  ion loading is t
12180 75 72 6e 65 64 20 6f 66 66 20 61 74 20 63 6f 6d  urned off at com
12190 70 69 6c 65 2d 74 69 6d 65 22 2c 0a 20 20 20 20  pile-time",.    
121a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121b0 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
121c0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
121d0 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  ;.#endif.  }..  
121e0 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 65  /*.  **    $db e
121f0 72 72 6f 72 63 6f 64 65 0a 20 20 2a 2a 0a 20 20  rrorcode.  **.  
12200 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
12210 6d 65 72 69 63 20 65 72 72 6f 72 20 63 6f 64 65  meric error code
12220 20 74 68 61 74 20 77 61 73 20 72 65 74 75 72 6e   that was return
12230 65 64 20 62 79 20 74 68 65 20 6d 6f 73 74 20 72  ed by the most r
12240 65 63 65 6e 74 0a 20 20 2a 2a 20 63 61 6c 6c 20  ecent.  ** call 
12250 74 6f 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  to sqlite3_exec(
12260 29 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  )..  */.  case D
12270 42 5f 45 52 52 4f 52 43 4f 44 45 3a 20 7b 0a 20  B_ERRORCODE: {. 
12280 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
12290 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
122a0 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65  NewIntObj(sqlite
122b0 33 5f 65 72 72 63 6f 64 65 28 70 44 62 2d 3e 64  3_errcode(pDb->d
122c0 62 29 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  b)));.    break;
122d0 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
122e0 20 20 20 24 64 62 20 65 78 69 73 74 73 20 24 73     $db exists $s
122f0 71 6c 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 6f  ql.  **    $db o
12300 6e 65 63 6f 6c 75 6d 6e 20 24 73 71 6c 0a 20 20  necolumn $sql.  
12310 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 65 63  **.  ** The onec
12320 6f 6c 75 6d 6e 20 6d 65 74 68 6f 64 20 69 73 20  olumn method is 
12330 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6f  the equivalent o
12340 66 3a 0a 20 20 2a 2a 20 20 20 20 20 6c 69 6e 64  f:.  **     lind
12350 65 78 20 5b 24 64 62 20 65 76 61 6c 20 24 73 71  ex [$db eval $sq
12360 6c 5d 20 30 0a 20 20 2a 2f 0a 20 20 63 61 73 65  l] 0.  */.  case
12370 20 44 42 5f 45 58 49 53 54 53 3a 20 0a 20 20 63   DB_EXISTS: .  c
12380 61 73 65 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e  ase DB_ONECOLUMN
12390 3a 20 7b 0a 20 20 20 20 44 62 45 76 61 6c 43 6f  : {.    DbEvalCo
123a0 6e 74 65 78 74 20 73 45 76 61 6c 3b 0a 20 20 20  ntext sEval;.   
123b0 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
123c0 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
123d0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
123e0 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 22 29 3b 0a  , objv, "SQL");.
123f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
12400 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
12410 20 20 20 64 62 45 76 61 6c 49 6e 69 74 28 26 73     dbEvalInit(&s
12420 45 76 61 6c 2c 20 70 44 62 2c 20 6f 62 6a 76 5b  Eval, pDb, objv[
12430 32 5d 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d  2], 0);.    rc =
12440 20 64 62 45 76 61 6c 53 74 65 70 28 26 73 45 76   dbEvalStep(&sEv
12450 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 63 68 6f  al);.    if( cho
12460 69 63 65 3d 3d 44 42 5f 4f 4e 45 43 4f 4c 55 4d  ice==DB_ONECOLUM
12470 4e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72  N ){.      if( r
12480 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20  c==TCL_OK ){.   
12490 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52       Tcl_SetObjR
124a0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 64 62  esult(interp, db
124b0 45 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65 28  EvalColumnValue(
124c0 26 73 45 76 61 6c 2c 20 30 29 29 3b 0a 20 20 20  &sEval, 0));.   
124d0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d     }else if( rc=
124e0 3d 54 43 4c 5f 42 52 45 41 4b 20 29 7b 0a 20 20  =TCL_BREAK ){.  
124f0 20 20 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52        Tcl_ResetR
12500 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
12510 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
12520 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 42 52 45   if( rc==TCL_BRE
12530 41 4b 20 7c 7c 20 72 63 3d 3d 54 43 4c 5f 4f 4b  AK || rc==TCL_OK
12540 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65   ){.      Tcl_Se
12550 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
12560 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61  p, Tcl_NewBoolea
12570 6e 4f 62 6a 28 72 63 3d 3d 54 43 4c 5f 4f 4b 29  nObj(rc==TCL_OK)
12580 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 45  );.    }.    dbE
12590 76 61 6c 46 69 6e 61 6c 69 7a 65 28 26 73 45 76  valFinalize(&sEv
125a0 61 6c 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63  al);..    if( rc
125b0 3d 3d 54 43 4c 5f 42 52 45 41 4b 20 29 7b 0a 20  ==TCL_BREAK ){. 
125c0 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b       rc = TCL_OK
125d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  ;.    }.    brea
125e0 6b 3b 0a 20 20 7d 0a 20 20 20 0a 20 20 2f 2a 0a  k;.  }.   .  /*.
125f0 20 20 2a 2a 20 20 20 20 24 64 62 20 65 76 61 6c    **    $db eval
12600 20 24 73 71 6c 20 3f 61 72 72 61 79 3f 20 3f 7b   $sql ?array? ?{
12610 20 20 2e 2e 2e 63 6f 64 65 2e 2e 2e 20 7d 3f 0a    ...code... }?.
12620 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 53 51    **.  ** The SQ
12630 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 24  L statement in $
12640 73 71 6c 20 69 73 20 65 76 61 6c 75 61 74 65 64  sql is evaluated
12650 2e 20 20 46 6f 72 20 65 61 63 68 20 72 6f 77 2c  .  For each row,
12660 20 74 68 65 20 76 61 6c 75 65 73 20 61 72 65 0a   the values are.
12670 20 20 2a 2a 20 70 6c 61 63 65 64 20 69 6e 20 65    ** placed in e
12680 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 61  lements of the a
12690 72 72 61 79 20 6e 61 6d 65 64 20 22 61 72 72 61  rray named "arra
126a0 79 22 20 61 6e 64 20 2e 2e 2e 63 6f 64 65 2e 2e  y" and ...code..
126b0 2e 20 69 73 20 65 78 65 63 75 74 65 64 2e 0a 20  . is executed.. 
126c0 20 2a 2a 20 49 66 20 22 61 72 72 61 79 22 20 61   ** If "array" a
126d0 6e 64 20 22 63 6f 64 65 22 20 61 72 65 20 6f 6d  nd "code" are om
126e0 69 74 74 65 64 2c 20 74 68 65 6e 20 6e 6f 20 63  itted, then no c
126f0 61 6c 6c 62 61 63 6b 20 69 73 20 65 76 65 72 79  allback is every
12700 20 69 6e 76 6f 6b 65 64 2e 0a 20 20 2a 2a 20 49   invoked..  ** I
12710 66 20 22 61 72 72 61 79 22 20 69 73 20 61 6e 20  f "array" is an 
12720 65 6d 70 74 79 20 73 74 72 69 6e 67 2c 20 74 68  empty string, th
12730 65 6e 20 74 68 65 20 76 61 6c 75 65 73 20 61 72  en the values ar
12740 65 20 70 6c 61 63 65 64 20 69 6e 20 76 61 72 69  e placed in vari
12750 61 62 6c 65 73 0a 20 20 2a 2a 20 74 68 61 74 20  ables.  ** that 
12760 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 61  have the same na
12770 6d 65 20 61 73 20 74 68 65 20 66 69 65 6c 64 73  me as the fields
12780 20 65 78 74 72 61 63 74 65 64 20 62 79 20 74 68   extracted by th
12790 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  e query..  */.  
127a0 63 61 73 65 20 44 42 5f 45 56 41 4c 3a 20 7b 0a  case DB_EVAL: {.
127b0 20 20 20 20 69 66 28 20 6f 62 6a 63 3c 33 20 7c      if( objc<3 |
127c0 7c 20 6f 62 6a 63 3e 35 20 29 7b 0a 20 20 20 20  | objc>5 ){.    
127d0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
127e0 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
127f0 6a 76 2c 20 22 53 51 4c 20 3f 41 52 52 41 59 2d  jv, "SQL ?ARRAY-
12800 4e 41 4d 45 3f 20 3f 53 43 52 49 50 54 3f 22 29  NAME? ?SCRIPT?")
12810 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
12820 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
12830 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33  .    if( objc==3
12840 20 29 7b 0a 20 20 20 20 20 20 44 62 45 76 61 6c   ){.      DbEval
12850 43 6f 6e 74 65 78 74 20 73 45 76 61 6c 3b 0a 20  Context sEval;. 
12860 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52       Tcl_Obj *pR
12870 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28  et = Tcl_NewObj(
12880 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 63  );.      Tcl_Inc
12890 72 52 65 66 43 6f 75 6e 74 28 70 52 65 74 29 3b  rRefCount(pRet);
128a0 0a 20 20 20 20 20 20 64 62 45 76 61 6c 49 6e 69  .      dbEvalIni
128b0 74 28 26 73 45 76 61 6c 2c 20 70 44 62 2c 20 6f  t(&sEval, pDb, o
128c0 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20  bjv[2], 0);.    
128d0 20 20 77 68 69 6c 65 28 20 54 43 4c 5f 4f 4b 3d    while( TCL_OK=
128e0 3d 28 72 63 20 3d 20 64 62 45 76 61 6c 53 74 65  =(rc = dbEvalSte
128f0 70 28 26 73 45 76 61 6c 29 29 20 29 7b 0a 20 20  p(&sEval)) ){.  
12900 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
12910 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20       int nCol;. 
12920 20 20 20 20 20 20 20 64 62 45 76 61 6c 52 6f 77         dbEvalRow
12930 49 6e 66 6f 28 26 73 45 76 61 6c 2c 20 26 6e 43  Info(&sEval, &nC
12940 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ol, 0);.        
12950 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
12960 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
12970 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
12980 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
12990 2c 20 70 52 65 74 2c 20 64 62 45 76 61 6c 43 6f  , pRet, dbEvalCo
129a0 6c 75 6d 6e 56 61 6c 75 65 28 26 73 45 76 61 6c  lumnValue(&sEval
129b0 2c 20 69 29 29 3b 0a 20 20 20 20 20 20 20 20 7d  , i));.        }
129c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64  .      }.      d
129d0 62 45 76 61 6c 46 69 6e 61 6c 69 7a 65 28 26 73  bEvalFinalize(&s
129e0 45 76 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  Eval);.      if(
129f0 20 72 63 3d 3d 54 43 4c 5f 42 52 45 41 4b 20 29   rc==TCL_BREAK )
12a00 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65  {.        Tcl_Se
12a10 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
12a20 70 2c 20 70 52 65 74 29 3b 0a 20 20 20 20 20 20  p, pRet);.      
12a30 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20    rc = TCL_OK;. 
12a40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 63 6c       }.      Tcl
12a50 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 52  _DecrRefCount(pR
12a60 65 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  et);.    }else{.
12a70 20 20 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61        ClientData
12a80 20 63 64 32 5b 32 5d 3b 0a 20 20 20 20 20 20 44   cd2[2];.      D
12a90 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 70 3b  bEvalContext *p;
12aa0 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  .      Tcl_Obj *
12ab0 70 41 72 72 61 79 20 3d 20 30 3b 0a 20 20 20 20  pArray = 0;.    
12ac0 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69    Tcl_Obj *pScri
12ad0 70 74 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6f  pt;..      if( o
12ae0 62 6a 63 3d 3d 35 20 26 26 20 2a 28 63 68 61 72  bjc==5 && *(char
12af0 20 2a 29 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   *)Tcl_GetString
12b00 28 6f 62 6a 76 5b 33 5d 29 20 29 7b 0a 20 20 20  (objv[3]) ){.   
12b10 20 20 20 20 20 70 41 72 72 61 79 20 3d 20 6f 62       pArray = ob
12b20 6a 76 5b 33 5d 3b 0a 20 20 20 20 20 20 7d 0a 20  jv[3];.      }. 
12b30 20 20 20 20 20 70 53 63 72 69 70 74 20 3d 20 6f       pScript = o
12b40 62 6a 76 5b 6f 62 6a 63 2d 31 5d 3b 0a 20 20 20  bjv[objc-1];.   
12b50 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
12b60 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 20 20  unt(pScript);.  
12b70 20 20 20 20 0a 20 20 20 20 20 20 70 20 3d 20 28      .      p = (
12b80 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 29  DbEvalContext *)
12b90 54 63 6c 5f 41 6c 6c 6f 63 28 73 69 7a 65 6f 66  Tcl_Alloc(sizeof
12ba0 28 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 29 29  (DbEvalContext))
12bb0 3b 0a 20 20 20 20 20 20 64 62 45 76 61 6c 49 6e  ;.      dbEvalIn
12bc0 69 74 28 70 2c 20 70 44 62 2c 20 6f 62 6a 76 5b  it(p, pDb, objv[
12bd0 32 5d 2c 20 70 41 72 72 61 79 29 3b 0a 0a 20 20  2], pArray);..  
12be0 20 20 20 20 63 64 32 5b 30 5d 20 3d 20 28 76 6f      cd2[0] = (vo
12bf0 69 64 20 2a 29 70 3b 0a 20 20 20 20 20 20 63 64  id *)p;.      cd
12c00 32 5b 31 5d 20 3d 20 28 76 6f 69 64 20 2a 29 70  2[1] = (void *)p
12c10 53 63 72 69 70 74 3b 0a 20 20 20 20 20 20 72 63  Script;.      rc
12c20 20 3d 20 44 62 45 76 61 6c 4e 65 78 74 43 6d 64   = DbEvalNextCmd
12c30 28 63 64 32 2c 20 69 6e 74 65 72 70 2c 20 54 43  (cd2, interp, TC
12c40 4c 5f 4f 4b 29 3b 0a 20 20 20 20 7d 0a 20 20 20  L_OK);.    }.   
12c50 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
12c60 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 66  *.  **     $db f
12c70 75 6e 63 74 69 6f 6e 20 4e 41 4d 45 20 5b 2d 61  unction NAME [-a
12c80 72 67 63 6f 75 6e 74 20 4e 5d 20 5b 2d 64 65 74  rgcount N] [-det
12c90 65 72 6d 69 6e 69 73 74 69 63 5d 20 53 43 52 49  erministic] SCRI
12ca0 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 72 65  PT.  **.  ** Cre
12cb0 61 74 65 20 61 20 6e 65 77 20 53 51 4c 20 66 75  ate a new SQL fu
12cc0 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41  nction called NA
12cd0 4d 45 2e 20 20 57 68 65 6e 65 76 65 72 20 74 68  ME.  Whenever th
12ce0 61 74 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 20  at function is. 
12cf0 20 2a 2a 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f   ** called, invo
12d00 6b 65 20 53 43 52 49 50 54 20 74 6f 20 65 76 61  ke SCRIPT to eva
12d10 6c 75 61 74 65 20 74 68 65 20 66 75 6e 63 74 69  luate the functi
12d20 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  on..  */.  case 
12d30 44 42 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  DB_FUNCTION: {. 
12d40 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 53     int flags = S
12d50 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20  QLITE_UTF8;.    
12d60 53 71 6c 46 75 6e 63 20 2a 70 46 75 6e 63 3b 0a  SqlFunc *pFunc;.
12d70 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63      Tcl_Obj *pSc
12d80 72 69 70 74 3b 0a 20 20 20 20 63 68 61 72 20 2a  ript;.    char *
12d90 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20 6e  zName;.    int n
12da0 41 72 67 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e  Arg = -1;.    in
12db0 74 20 69 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a  t i;.    if( obj
12dc0 63 3c 34 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  c<4 ){.      Tcl
12dd0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
12de0 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
12df0 4e 41 4d 45 20 3f 53 57 49 54 43 48 45 53 3f 20  NAME ?SWITCHES? 
12e00 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20  SCRIPT");.      
12e10 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
12e20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
12e30 69 3d 33 3b 20 69 3c 28 6f 62 6a 63 2d 31 29 3b  i=3; i<(objc-1);
12e40 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e   i++){.      con
12e50 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 54 63 6c  st char *z = Tcl
12e60 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
12e70 69 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  i]);.      int n
12e80 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 29 3b 0a   = strlen30(z);.
12e90 20 20 20 20 20 20 69 66 28 20 6e 3e 32 20 26 26        if( n>2 &&
12ea0 20 73 74 72 6e 63 6d 70 28 7a 2c 20 22 2d 61 72   strncmp(z, "-ar
12eb0 67 63 6f 75 6e 74 22 2c 6e 29 3d 3d 30 20 29 7b  gcount",n)==0 ){
12ec0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d  .        if( i==
12ed0 28 6f 62 6a 63 2d 32 29 20 29 7b 0a 20 20 20 20  (objc-2) ){.    
12ee0 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
12ef0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
12f00 6f 70 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20  option requires 
12f10 61 6e 20 61 72 67 75 6d 65 6e 74 3a 20 22 2c 20  an argument: ", 
12f20 7a 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  z, 0);.         
12f30 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
12f40 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  R;.        }.   
12f50 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74       if( Tcl_Get
12f60 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
12f70 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 6e  p, objv[i+1], &n
12f80 41 72 67 29 20 29 20 72 65 74 75 72 6e 20 54 43  Arg) ) return TC
12f90 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  L_ERROR;.       
12fa0 20 69 66 28 20 6e 41 72 67 3c 30 20 29 7b 0a 20   if( nArg<0 ){. 
12fb0 20 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70           Tcl_App
12fc0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
12fd0 2c 20 22 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  , "number of arg
12fe0 75 6d 65 6e 74 73 20 6d 75 73 74 20 62 65 20 6e  uments must be n
12ff0 6f 6e 2d 6e 65 67 61 74 69 76 65 22 2c 0a 20 20  on-negative",.  
13000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13010 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
13020 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  0);.          re
13030 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
13040 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13050 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c    i++;.      }el
13060 73 65 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 32  se.      if( n>2
13070 20 26 26 20 73 74 72 6e 63 6d 70 28 7a 2c 20 22   && strncmp(z, "
13080 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63 22 2c  -deterministic",
13090 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  n)==0 ){.       
130a0 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45   flags |= SQLITE
130b0 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 3b 0a  _DETERMINISTIC;.
130c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
130d0 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
130e0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62  esult(interp, "b
130f0 61 64 20 6f 70 74 69 6f 6e 20 5c 22 22 2c 20 7a  ad option \"", z
13100 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  , .            "
13110 5c 22 3a 20 6d 75 73 74 20 62 65 20 2d 61 72 67  \": must be -arg
13120 63 6f 75 6e 74 20 6f 72 20 2d 64 65 74 65 72 6d  count or -determ
13130 69 6e 69 73 74 69 63 22 2c 20 30 0a 20 20 20 20  inistic", 0.    
13140 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 72      );.        r
13150 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
13160 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
13170 20 20 20 20 70 53 63 72 69 70 74 20 3d 20 6f 62      pScript = ob
13180 6a 76 5b 6f 62 6a 63 2d 31 5d 3b 0a 20 20 20 20  jv[objc-1];.    
13190 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53  zName = Tcl_GetS
131a0 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
131b0 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20 70 46  v[2], 0);.    pF
131c0 75 6e 63 20 3d 20 66 69 6e 64 53 71 6c 46 75 6e  unc = findSqlFun
131d0 63 28 70 44 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  c(pDb, zName);. 
131e0 20 20 20 69 66 28 20 70 46 75 6e 63 3d 3d 30 20     if( pFunc==0 
131f0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
13200 4f 52 3b 0a 20 20 20 20 69 66 28 20 70 46 75 6e  OR;.    if( pFun
13210 63 2d 3e 70 53 63 72 69 70 74 20 29 7b 0a 20 20  c->pScript ){.  
13220 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
13230 6f 75 6e 74 28 70 46 75 6e 63 2d 3e 70 53 63 72  ount(pFunc->pScr
13240 69 70 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ipt);.    }.    
13250 70 46 75 6e 63 2d 3e 70 53 63 72 69 70 74 20 3d  pFunc->pScript =
13260 20 70 53 63 72 69 70 74 3b 0a 20 20 20 20 54 63   pScript;.    Tc
13270 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
13280 53 63 72 69 70 74 29 3b 0a 20 20 20 20 70 46 75  Script);.    pFu
13290 6e 63 2d 3e 75 73 65 45 76 61 6c 4f 62 6a 76 20  nc->useEvalObjv 
132a0 3d 20 73 61 66 65 54 6f 55 73 65 45 76 61 6c 4f  = safeToUseEvalO
132b0 62 6a 76 28 69 6e 74 65 72 70 2c 20 70 53 63 72  bjv(interp, pScr
132c0 69 70 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  ipt);.    rc = s
132d0 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
132e0 6e 63 74 69 6f 6e 28 70 44 62 2d 3e 64 62 2c 20  nction(pDb->db, 
132f0 7a 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 66 6c 61  zName, nArg, fla
13300 67 73 2c 0a 20 20 20 20 20 20 20 20 70 46 75 6e  gs,.        pFun
13310 63 2c 20 74 63 6c 53 71 6c 46 75 6e 63 2c 20 30  c, tclSqlFunc, 0
13320 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
13330 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
13340 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52       rc = TCL_ER
13350 52 4f 52 3b 0a 20 20 20 20 20 20 54 63 6c 5f 53  ROR;.      Tcl_S
13360 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
13370 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
13380 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29  _errmsg(pDb->db)
13390 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b  , TCL_VOLATILE);
133a0 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
133b0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
133c0 20 20 20 20 20 24 64 62 20 69 6e 63 72 62 6c 6f       $db incrblo
133d0 62 20 3f 2d 72 65 61 64 6f 6e 6c 79 3f 20 3f 44  b ?-readonly? ?D
133e0 42 3f 20 54 41 42 4c 45 20 43 4f 4c 55 4d 4e 20  B? TABLE COLUMN 
133f0 52 4f 57 49 44 0a 20 20 2a 2f 0a 20 20 63 61 73  ROWID.  */.  cas
13400 65 20 44 42 5f 49 4e 43 52 42 4c 4f 42 3a 20 7b  e DB_INCRBLOB: {
13410 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
13420 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20  MIT_INCRBLOB.   
13430 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
13440 74 28 69 6e 74 65 72 70 2c 20 22 69 6e 63 72 62  t(interp, "incrb
13450 6c 6f 62 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  lob not availabl
13460 65 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64 22  e in this build"
13470 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
13480 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
13490 52 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69 6e 74  R;.#else.    int
134a0 20 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20 30 3b   isReadonly = 0;
134b0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
134c0 2a 7a 44 62 20 3d 20 22 6d 61 69 6e 22 3b 0a 20  *zDb = "main";. 
134d0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
134e0 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74  Table;.    const
134f0 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 3b 0a   char *zColumn;.
13500 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20      Tcl_WideInt 
13510 69 52 6f 77 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  iRow;..    /* Ch
13520 65 63 6b 20 66 6f 72 20 74 68 65 20 2d 72 65 61  eck for the -rea
13530 64 6f 6e 6c 79 20 6f 70 74 69 6f 6e 20 2a 2f 0a  donly option */.
13540 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 26      if( objc>3 &
13550 26 20 73 74 72 63 6d 70 28 54 63 6c 5f 47 65 74  & strcmp(Tcl_Get
13560 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c  String(objv[2]),
13570 20 22 2d 72 65 61 64 6f 6e 6c 79 22 29 3d 3d 30   "-readonly")==0
13580 20 29 7b 0a 20 20 20 20 20 20 69 73 52 65 61 64   ){.      isRead
13590 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  only = 1;.    }.
135a0 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 28  .    if( objc!=(
135b0 35 2b 69 73 52 65 61 64 6f 6e 6c 79 29 20 26 26  5+isReadonly) &&
135c0 20 6f 62 6a 63 21 3d 28 36 2b 69 73 52 65 61 64   objc!=(6+isRead
135d0 6f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 54  only) ){.      T
135e0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
135f0 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
13600 20 22 3f 2d 72 65 61 64 6f 6e 6c 79 3f 20 3f 44   "?-readonly? ?D
13610 42 3f 20 54 41 42 4c 45 20 43 4f 4c 55 4d 4e 20  B? TABLE COLUMN 
13620 52 4f 57 49 44 22 29 3b 0a 20 20 20 20 20 20 72  ROWID");.      r
13630 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
13640 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
13650 6f 62 6a 63 3d 3d 28 36 2b 69 73 52 65 61 64 6f  objc==(6+isReado
13660 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 7a 44  nly) ){.      zD
13670 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  b = Tcl_GetStrin
13680 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20  g(objv[2]);.    
13690 7d 0a 20 20 20 20 7a 54 61 62 6c 65 20 3d 20 54  }.    zTable = T
136a0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
136b0 76 5b 6f 62 6a 63 2d 33 5d 29 3b 0a 20 20 20 20  v[objc-3]);.    
136c0 7a 43 6f 6c 75 6d 6e 20 3d 20 54 63 6c 5f 47 65  zColumn = Tcl_Ge
136d0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 6f 62 6a  tString(objv[obj
136e0 63 2d 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20  c-2]);.    rc = 
136f0 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72  Tcl_GetWideIntFr
13700 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
13710 6a 76 5b 6f 62 6a 63 2d 31 5d 2c 20 26 69 52 6f  jv[objc-1], &iRo
13720 77 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d  w);..    if( rc=
13730 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  =TCL_OK ){.     
13740 20 72 63 20 3d 20 63 72 65 61 74 65 49 6e 63 72   rc = createIncr
13750 62 6c 6f 62 43 68 61 6e 6e 65 6c 28 0a 20 20 20  blobChannel(.   
13760 20 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20 70         interp, p
13770 44 62 2c 20 7a 44 62 2c 20 7a 54 61 62 6c 65 2c  Db, zDb, zTable,
13780 20 7a 43 6f 6c 75 6d 6e 2c 20 28 73 71 6c 69 74   zColumn, (sqlit
13790 65 33 5f 69 6e 74 36 34 29 69 52 6f 77 2c 20 69  e3_int64)iRow, i
137a0 73 52 65 61 64 6f 6e 6c 79 0a 20 20 20 20 20 20  sReadonly.      
137b0 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
137c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
137d0 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64    /*.  **     $d
137e0 62 20 69 6e 74 65 72 72 75 70 74 0a 20 20 2a 2a  b interrupt.  **
137f0 0a 20 20 2a 2a 20 49 6e 74 65 72 72 75 70 74 20  .  ** Interrupt 
13800 74 68 65 20 65 78 65 63 75 74 69 6f 6e 20 6f 66  the execution of
13810 20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74 20   the inner-most 
13820 53 51 4c 20 69 6e 74 65 72 70 72 65 74 65 72 2e  SQL interpreter.
13830 20 20 54 68 69 73 0a 20 20 2a 2a 20 63 61 75 73    This.  ** caus
13840 65 73 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  es the SQL state
13850 6d 65 6e 74 20 74 6f 20 72 65 74 75 72 6e 20 61  ment to return a
13860 6e 20 65 72 72 6f 72 20 6f 66 20 53 51 4c 49 54  n error of SQLIT
13870 45 5f 49 4e 54 45 52 52 55 50 54 2e 0a 20 20 2a  E_INTERRUPT..  *
13880 2f 0a 20 20 63 61 73 65 20 44 42 5f 49 4e 54 45  /.  case DB_INTE
13890 52 52 55 50 54 3a 20 7b 0a 20 20 20 20 73 71 6c  RRUPT: {.    sql
138a0 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28 70  ite3_interrupt(p
138b0 44 62 2d 3e 64 62 29 3b 0a 20 20 20 20 62 72 65  Db->db);.    bre
138c0 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
138d0 2a 2a 20 20 20 20 20 24 64 62 20 6e 75 6c 6c 76  **     $db nullv
138e0 61 6c 75 65 20 3f 53 54 52 49 4e 47 3f 0a 20 20  alue ?STRING?.  
138f0 2a 2a 0a 20 20 2a 2a 20 43 68 61 6e 67 65 20 74  **.  ** Change t
13900 65 78 74 20 75 73 65 64 20 77 68 65 6e 20 61 20  ext used when a 
13910 4e 55 4c 4c 20 63 6f 6d 65 73 20 62 61 63 6b 20  NULL comes back 
13920 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
13930 65 2e 20 49 66 20 3f 53 54 52 49 4e 47 3f 0a 20  e. If ?STRING?. 
13940 20 2a 2a 20 69 73 20 6e 6f 74 20 70 72 65 73 65   ** is not prese
13950 6e 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  nt, then the cur
13960 72 65 6e 74 20 73 74 72 69 6e 67 20 75 73 65 64  rent string used
13970 20 66 6f 72 20 4e 55 4c 4c 20 69 73 20 72 65 74   for NULL is ret
13980 75 72 6e 65 64 2e 0a 20 20 2a 2a 20 49 66 20 53  urned..  ** If S
13990 54 52 49 4e 47 20 69 73 20 70 72 65 73 65 6e 74  TRING is present
139a0 2c 20 74 68 65 6e 20 53 54 52 49 4e 47 20 69 73  , then STRING is
139b0 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2a 0a   returned..  **.
139c0 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 4e    */.  case DB_N
139d0 55 4c 4c 56 41 4c 55 45 3a 20 7b 0a 20 20 20 20  ULLVALUE: {.    
139e0 69 66 28 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f  if( objc!=2 && o
139f0 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc!=3 ){.      
13a00 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
13a10 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
13a20 2c 20 22 4e 55 4c 4c 56 41 4c 55 45 22 29 3b 0a  , "NULLVALUE");.
13a30 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
13a40 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
13a50 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b    if( objc==3 ){
13a60 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a  .      int len;.
13a70 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 75 6c        char *zNul
13a80 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  l = Tcl_GetStrin
13a90 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
13aa0 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69  , &len);.      i
13ab0 66 28 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 29 7b  f( pDb->zNull ){
13ac0 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65  .        Tcl_Fre
13ad0 65 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20  e(pDb->zNull);. 
13ae0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
13af0 20 7a 4e 75 6c 6c 20 26 26 20 6c 65 6e 3e 30 20   zNull && len>0 
13b00 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
13b10 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f 41 6c 6c 6f  zNull = Tcl_Allo
13b20 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20  c( len + 1 );.  
13b30 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62        memcpy(pDb
13b40 2d 3e 7a 4e 75 6c 6c 2c 20 7a 4e 75 6c 6c 2c 20  ->zNull, zNull, 
13b50 6c 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 44  len);.        pD
13b60 62 2d 3e 7a 4e 75 6c 6c 5b 6c 65 6e 5d 20 3d 20  b->zNull[len] = 
13b70 27 5c 30 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73  '\0';.      }els
13b80 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  e{.        pDb->
13b90 7a 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20  zNull = 0;.     
13ba0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c   }.    }.    Tcl
13bb0 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
13bc0 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72  terp, Tcl_NewStr
13bd0 69 6e 67 4f 62 6a 28 70 44 62 2d 3e 7a 4e 75 6c  ingObj(pDb->zNul
13be0 6c 2c 20 2d 31 29 29 3b 0a 20 20 20 20 62 72 65  l, -1));.    bre
13bf0 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
13c00 2a 2a 20 20 20 20 20 24 64 62 20 6c 61 73 74 5f  **     $db last_
13c10 69 6e 73 65 72 74 5f 72 6f 77 69 64 20 0a 20 20  insert_rowid .  
13c20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 61  **.  ** Return a
13c30 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
13c40 69 73 20 74 68 65 20 52 4f 57 49 44 20 66 6f 72  is the ROWID for
13c50 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
13c60 20 69 6e 73 65 72 74 2e 0a 20 20 2a 2f 0a 20 20   insert..  */.  
13c70 63 61 73 65 20 44 42 5f 4c 41 53 54 5f 49 4e 53  case DB_LAST_INS
13c80 45 52 54 5f 52 4f 57 49 44 3a 20 7b 0a 20 20 20  ERT_ROWID: {.   
13c90 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c   Tcl_Obj *pResul
13ca0 74 3b 0a 20 20 20 20 54 63 6c 5f 57 69 64 65 49  t;.    Tcl_WideI
13cb0 6e 74 20 72 6f 77 69 64 3b 0a 20 20 20 20 69 66  nt rowid;.    if
13cc0 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
13cd0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
13ce0 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
13cf0 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 20 20  bjv, "");.      
13d00 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
13d10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 6f 77 69  ;.    }.    rowi
13d20 64 20 3d 20 73 71 6c 69 74 65 33 5f 6c 61 73 74  d = sqlite3_last
13d30 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 70 44  _insert_rowid(pD
13d40 62 2d 3e 64 62 29 3b 0a 20 20 20 20 70 52 65 73  b->db);.    pRes
13d50 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a  ult = Tcl_GetObj
13d60 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
13d70 20 20 20 20 54 63 6c 5f 53 65 74 57 69 64 65 49      Tcl_SetWideI
13d80 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 72  ntObj(pResult, r
13d90 6f 77 69 64 29 3b 0a 20 20 20 20 62 72 65 61 6b  owid);.    break
13da0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
13db0 20 54 68 65 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d   The DB_ONECOLUM
13dc0 4e 20 6d 65 74 68 6f 64 20 69 73 20 69 6d 70 6c  N method is impl
13dd0 65 6d 65 6e 74 65 64 20 74 6f 67 65 74 68 65 72  emented together
13de0 20 77 69 74 68 20 44 42 5f 45 58 49 53 54 53 2e   with DB_EXISTS.
13df0 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 20 20 20 24  .  */..  /*    $
13e00 64 62 20 70 72 6f 67 72 65 73 73 20 3f 4e 20 43  db progress ?N C
13e10 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 20 0a 20  ALLBACK?.  ** . 
13e20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67   ** Invoke the g
13e30 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 65 76  iven callback ev
13e40 65 72 79 20 4e 20 76 69 72 74 75 61 6c 20 6d 61  ery N virtual ma
13e50 63 68 69 6e 65 20 6f 70 63 6f 64 65 73 20 77 68  chine opcodes wh
13e60 69 6c 65 20 65 78 65 63 75 74 69 6e 67 0a 20 20  ile executing.  
13e70 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f  ** queries..  */
13e80 0a 20 20 63 61 73 65 20 44 42 5f 50 52 4f 47 52  .  case DB_PROGR
13e90 45 53 53 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f  ESS: {.    if( o
13ea0 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  bjc==2 ){.      
13eb0 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65  if( pDb->zProgre
13ec0 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  ss ){.        Tc
13ed0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
13ee0 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 50 72 6f  nterp, pDb->zPro
13ef0 67 72 65 73 73 2c 20 28 63 68 61 72 2a 29 30 29  gress, (char*)0)
13f00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
13f10 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20  lse if( objc==4 
13f20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
13f30 50 72 6f 67 72 65 73 73 3b 0a 20 20 20 20 20 20  Progress;.      
13f40 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69  int len;.      i
13f50 6e 74 20 4e 3b 0a 20 20 20 20 20 20 69 66 28 20  nt N;.      if( 
13f60 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49  TCL_OK!=Tcl_GetI
13f70 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
13f80 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 4e 29 20 29  , objv[2], &N) )
13f90 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
13fa0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
13fb0 20 20 7d 3b 0a 20 20 20 20 20 20 69 66 28 20 70    };.      if( p
13fc0 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29 7b  Db->zProgress ){
13fd0 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65  .        Tcl_Fre
13fe0 65 28 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73  e(pDb->zProgress
13ff0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
14000 20 7a 50 72 6f 67 72 65 73 73 20 3d 20 54 63 6c   zProgress = Tcl
14010 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
14020 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6c 65 6e 29  j(objv[3], &len)
14030 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 72 6f  ;.      if( zPro
14040 67 72 65 73 73 20 26 26 20 6c 65 6e 3e 30 20 29  gress && len>0 )
14050 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
14060 50 72 6f 67 72 65 73 73 20 3d 20 54 63 6c 5f 41  Progress = Tcl_A
14070 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b  lloc( len + 1 );
14080 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
14090 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 2c 20  pDb->zProgress, 
140a0 7a 50 72 6f 67 72 65 73 73 2c 20 6c 65 6e 2b 31  zProgress, len+1
140b0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
140c0 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 50 72          pDb->zPr
140d0 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20  ogress = 0;.    
140e0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
140f0 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53  TE_OMIT_PROGRESS
14100 5f 43 41 4c 4c 42 41 43 4b 0a 20 20 20 20 20 20  _CALLBACK.      
14110 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65  if( pDb->zProgre
14120 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  ss ){.        pD
14130 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65  b->interp = inte
14140 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  rp;.        sqli
14150 74 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e  te3_progress_han
14160 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20 4e 2c  dler(pDb->db, N,
14170 20 44 62 50 72 6f 67 72 65 73 73 48 61 6e 64 6c   DbProgressHandl
14180 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20  er, pDb);.      
14190 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
141a0 71 6c 69 74 65 33 5f 70 72 6f 67 72 65 73 73 5f  qlite3_progress_
141b0 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c  handler(pDb->db,
141c0 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
141d0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65   }.#endif.    }e
141e0 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  lse{.      Tcl_W
141f0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
14200 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 20  rp, 2, objv, "N 
14210 43 41 4c 4c 42 41 43 4b 22 29 3b 0a 20 20 20 20  CALLBACK");.    
14220 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
14230 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72  OR;.    }.    br
14240 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
14250 20 20 24 64 62 20 70 72 6f 66 69 6c 65 20 3f 43    $db profile ?C
14260 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20  ALLBACK?.  **.  
14270 2a 2a 20 4d 61 6b 65 20 61 72 72 61 6e 67 65 6d  ** Make arrangem
14280 65 6e 74 73 20 74 6f 20 69 6e 76 6f 6b 65 20 74  ents to invoke t
14290 68 65 20 43 41 4c 4c 42 41 43 4b 20 72 6f 75 74  he CALLBACK rout
142a0 69 6e 65 20 61 66 74 65 72 20 65 61 63 68 20 53  ine after each S
142b0 51 4c 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a  QL statement.  *
142c0 2a 20 74 68 61 74 20 68 61 73 20 72 75 6e 2e 20  * that has run. 
142d0 20 54 68 65 20 74 65 78 74 20 6f 66 20 74 68 65   The text of the
142e0 20 53 51 4c 20 61 6e 64 20 74 68 65 20 61 6d 6f   SQL and the amo
142f0 75 6e 74 20 6f 66 20 65 6c 61 70 73 65 20 74 69  unt of elapse ti
14300 6d 65 20 61 72 65 0a 20 20 2a 2a 20 61 70 70 65  me are.  ** appe
14310 6e 64 65 64 20 74 6f 20 43 41 4c 4c 42 41 43 4b  nded to CALLBACK
14320 20 62 65 66 6f 72 65 20 74 68 65 20 73 63 72 69   before the scri
14330 70 74 20 69 73 20 72 75 6e 2e 0a 20 20 2a 2f 0a  pt is run..  */.
14340 20 20 63 61 73 65 20 44 42 5f 50 52 4f 46 49 4c    case DB_PROFIL
14350 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a  E: {.    if( obj
14360 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  c>3 ){.      Tcl
14370 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
14380 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
14390 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20  ?CALLBACK?");.  
143a0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
143b0 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20  RROR;.    }else 
143c0 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20  if( objc==2 ){. 
143d0 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50       if( pDb->zP
143e0 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  rofile ){.      
143f0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
14400 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e  lt(interp, pDb->
14410 7a 50 72 6f 66 69 6c 65 2c 20 28 63 68 61 72 2a  zProfile, (char*
14420 29 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  )0);.      }.   
14430 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
14440 61 72 20 2a 7a 50 72 6f 66 69 6c 65 3b 0a 20 20  ar *zProfile;.  
14450 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
14460 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f     if( pDb->zPro
14470 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  file ){.        
14480 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 50  Tcl_Free(pDb->zP
14490 72 6f 66 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d  rofile);.      }
144a0 0a 20 20 20 20 20 20 7a 50 72 6f 66 69 6c 65 20  .      zProfile 
144b0 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
144c0 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
144d0 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  &len);.      if(
144e0 20 7a 50 72 6f 66 69 6c 65 20 26 26 20 6c 65 6e   zProfile && len
144f0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  >0 ){.        pD
14500 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 3d 20 54 63  b->zProfile = Tc
14510 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31  l_Alloc( len + 1
14520 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   );.        memc
14530 70 79 28 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65  py(pDb->zProfile
14540 2c 20 7a 50 72 6f 66 69 6c 65 2c 20 6c 65 6e 2b  , zProfile, len+
14550 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
14560 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 50  .        pDb->zP
14570 72 6f 66 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20  rofile = 0;.    
14580 20 20 7d 0a 23 69 66 20 21 64 65 66 69 6e 65 64    }.#if !defined
14590 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41  (SQLITE_OMIT_TRA
145a0 43 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  CE) && !defined(
145b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
145c0 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20  TING_POINT).    
145d0 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66    if( pDb->zProf
145e0 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ile ){.        p
145f0 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74  Db->interp = int
14600 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  erp;.        sql
14610 69 74 65 33 5f 70 72 6f 66 69 6c 65 28 70 44 62  ite3_profile(pDb
14620 2d 3e 64 62 2c 20 44 62 50 72 6f 66 69 6c 65 48  ->db, DbProfileH
14630 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20  andler, pDb);.  
14640 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14650 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 66 69     sqlite3_profi
14660 6c 65 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30  le(pDb->db, 0, 0
14670 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
14680 66 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  f.    }.    brea
14690 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
146a0 2a 20 20 20 20 20 24 64 62 20 72 65 6b 65 79 20  *     $db rekey 
146b0 4b 45 59 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 68  KEY.  **.  ** Ch
146c0 61 6e 67 65 20 74 68 65 20 65 6e 63 72 79 70 74  ange the encrypt
146d0 69 6f 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 63  ion key on the c
146e0 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20 64 61  urrently open da
146f0 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63  tabase..  */.  c
14700 61 73 65 20 44 42 5f 52 45 4b 45 59 3a 20 7b 0a  ase DB_REKEY: {.
14710 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
14720 54 45 5f 48 41 53 5f 43 4f 44 45 43 29 20 26 26  TE_HAS_CODEC) &&
14730 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
14740 5f 4f 4d 49 54 5f 43 4f 44 45 43 5f 46 52 4f 4d  _OMIT_CODEC_FROM
14750 5f 54 43 4c 29 0a 20 20 20 20 69 6e 74 20 6e 4b  _TCL).    int nK
14760 65 79 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b  ey;.    void *pK
14770 65 79 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  ey;.#endif.    i
14780 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
14790 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
147a0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
147b0 6f 62 6a 76 2c 20 22 4b 45 59 22 29 3b 0a 20 20  objv, "KEY");.  
147c0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
147d0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 69 66 20  RROR;.    }.#if 
147e0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48  defined(SQLITE_H
147f0 41 53 5f 43 4f 44 45 43 29 20 26 26 20 21 64 65  AS_CODEC) && !de
14800 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
14810 54 5f 43 4f 44 45 43 5f 46 52 4f 4d 5f 54 43 4c  T_CODEC_FROM_TCL
14820 29 0a 20 20 20 20 70 4b 65 79 20 3d 20 54 63 6c  ).    pKey = Tcl
14830 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f  _GetByteArrayFro
14840 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6e  mObj(objv[2], &n
14850 4b 65 79 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  Key);.    rc = s
14860 71 6c 69 74 65 33 5f 72 65 6b 65 79 28 70 44 62  qlite3_rekey(pDb
14870 2d 3e 64 62 2c 20 70 4b 65 79 2c 20 6e 4b 65 79  ->db, pKey, nKey
14880 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
14890 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
148a0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
148b0 73 71 6c 69 74 65 33 5f 65 72 72 73 74 72 28 72  sqlite3_errstr(r
148c0 63 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  c), (char*)0);. 
148d0 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52       rc = TCL_ER
148e0 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ROR;.    }.#endi
148f0 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  f.    break;.  }
14900 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 72 65  ..  /*    $db re
14910 73 74 6f 72 65 20 3f 44 41 54 41 42 41 53 45 3f  store ?DATABASE?
14920 20 46 49 4c 45 4e 41 4d 45 0a 20 20 2a 2a 0a 20   FILENAME.  **. 
14930 20 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62   ** Open a datab
14940 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 64 20 46  ase file named F
14950 49 4c 45 4e 41 4d 45 2e 20 20 54 72 61 6e 73 66  ILENAME.  Transf
14960 65 72 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 0a  er the content .
14970 20 20 2a 2a 20 6f 66 20 46 49 4c 45 4e 41 4d 45    ** of FILENAME
14980 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20   into the local 
14990 64 61 74 61 62 61 73 65 20 44 41 54 41 42 41 53  database DATABAS
149a0 45 20 28 64 65 66 61 75 6c 74 3a 20 22 6d 61 69  E (default: "mai
149b0 6e 22 29 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  n")..  */.  case
149c0 20 44 42 5f 52 45 53 54 4f 52 45 3a 20 7b 0a 20   DB_RESTORE: {. 
149d0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
149e0 53 72 63 46 69 6c 65 3b 0a 20 20 20 20 63 6f 6e  SrcFile;.    con
149f0 73 74 20 63 68 61 72 20 2a 7a 44 65 73 74 44 62  st char *zDestDb
14a00 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 70  ;.    sqlite3 *p
14a10 53 72 63 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Src;.    sqlite3
14a20 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b 75 70  _backup *pBackup
14a30 3b 0a 20 20 20 20 69 6e 74 20 6e 54 69 6d 65 6f  ;.    int nTimeo
14a40 75 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  ut = 0;..    if(
14a50 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20   objc==3 ){.    
14a60 20 20 7a 44 65 73 74 44 62 20 3d 20 22 6d 61 69    zDestDb = "mai
14a70 6e 22 3b 0a 20 20 20 20 20 20 7a 53 72 63 46 69  n";.      zSrcFi
14a80 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  le = Tcl_GetStri
14a90 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20  ng(objv[2]);.   
14aa0 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d   }else if( objc=
14ab0 3d 34 20 29 7b 0a 20 20 20 20 20 20 7a 44 65 73  =4 ){.      zDes
14ac0 74 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  tDb = Tcl_GetStr
14ad0 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
14ae0 20 20 20 20 7a 53 72 63 46 69 6c 65 20 3d 20 54      zSrcFile = T
14af0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
14b00 76 5b 33 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  v[3]);.    }else
14b10 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
14b20 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
14b30 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 44 41 54 41   2, objv, "?DATA
14b40 42 41 53 45 3f 20 46 49 4c 45 4e 41 4d 45 22 29  BASE? FILENAME")
14b50 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
14b60 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
14b70 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
14b80 5f 6f 70 65 6e 5f 76 32 28 7a 53 72 63 46 69 6c  _open_v2(zSrcFil
14b90 65 2c 20 26 70 53 72 63 2c 0a 20 20 20 20 20 20  e, &pSrc,.      
14ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14bb0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
14bc0 45 41 44 4f 4e 4c 59 20 7c 20 70 44 62 2d 3e 6f  EADONLY | pDb->o
14bd0 70 65 6e 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20  penFlags, 0);.  
14be0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
14bf0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  _OK ){.      Tcl
14c00 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
14c10 74 65 72 70 2c 20 22 63 61 6e 6e 6f 74 20 6f 70  terp, "cannot op
14c20 65 6e 20 73 6f 75 72 63 65 20 64 61 74 61 62 61  en source databa
14c30 73 65 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20  se: ",.         
14c40 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67    sqlite3_errmsg
14c50 28 70 53 72 63 29 2c 20 28 63 68 61 72 2a 29 30  (pSrc), (char*)0
14c60 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14c70 5f 63 6c 6f 73 65 28 70 53 72 63 29 3b 0a 20 20  _close(pSrc);.  
14c80 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
14c90 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
14ca0 70 42 61 63 6b 75 70 20 3d 20 73 71 6c 69 74 65  pBackup = sqlite
14cb0 33 5f 62 61 63 6b 75 70 5f 69 6e 69 74 28 70 44  3_backup_init(pD
14cc0 62 2d 3e 64 62 2c 20 7a 44 65 73 74 44 62 2c 20  b->db, zDestDb, 
14cd0 70 53 72 63 2c 20 22 6d 61 69 6e 22 29 3b 0a 20  pSrc, "main");. 
14ce0 20 20 20 69 66 28 20 70 42 61 63 6b 75 70 3d 3d     if( pBackup==
14cf0 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  0 ){.      Tcl_A
14d00 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
14d10 72 70 2c 20 22 72 65 73 74 6f 72 65 20 66 61 69  rp, "restore fai
14d20 6c 65 64 3a 20 22 2c 0a 20 20 20 20 20 20 20 20  led: ",.        
14d30 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73     sqlite3_errms
14d40 67 28 70 44 62 2d 3e 64 62 29 2c 20 28 63 68 61  g(pDb->db), (cha
14d50 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  r*)0);.      sql
14d60 69 74 65 33 5f 63 6c 6f 73 65 28 70 53 72 63 29  ite3_close(pSrc)
14d70 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
14d80 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
14d90 20 20 20 20 77 68 69 6c 65 28 20 28 72 63 20 3d      while( (rc =
14da0 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f   sqlite3_backup_
14db0 73 74 65 70 28 70 42 61 63 6b 75 70 2c 31 30 30  step(pBackup,100
14dc0 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  ))==SQLITE_OK.  
14dd0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 72              || r
14de0 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  c==SQLITE_BUSY )
14df0 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  {.      if( rc==
14e00 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20  SQLITE_BUSY ){. 
14e10 20 20 20 20 20 20 20 69 66 28 20 6e 54 69 6d 65         if( nTime
14e20 6f 75 74 2b 2b 20 3e 3d 20 33 20 29 20 62 72 65  out++ >= 3 ) bre
14e30 61 6b 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ak;.        sqli
14e40 74 65 33 5f 73 6c 65 65 70 28 31 30 30 29 3b 0a  te3_sleep(100);.
14e50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
14e60 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70    sqlite3_backup
14e70 5f 66 69 6e 69 73 68 28 70 42 61 63 6b 75 70 29  _finish(pBackup)
14e80 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
14e90 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
14ea0 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a     rc = TCL_OK;.
14eb0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
14ec0 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c  ==SQLITE_BUSY ||
14ed0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b   rc==SQLITE_LOCK
14ee0 45 44 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  ED ){.      Tcl_
14ef0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
14f00 65 72 70 2c 20 22 72 65 73 74 6f 72 65 20 66 61  erp, "restore fa
14f10 69 6c 65 64 3a 20 73 6f 75 72 63 65 20 64 61 74  iled: source dat
14f20 61 62 61 73 65 20 62 75 73 79 22 2c 0a 20 20 20  abase busy",.   
14f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f40 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b 0a 20      (char*)0);. 
14f50 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52       rc = TCL_ER
14f60 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ROR;.    }else{.
14f70 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
14f80 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
14f90 72 65 73 74 6f 72 65 20 66 61 69 6c 65 64 3a 20  restore failed: 
14fa0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71  ",.           sq
14fb0 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62  lite3_errmsg(pDb
14fc0 2d 3e 64 62 29 2c 20 28 63 68 61 72 2a 29 30 29  ->db), (char*)0)
14fd0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c  ;.      rc = TCL
14fe0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
14ff0 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28    sqlite3_close(
15000 70 53 72 63 29 3b 0a 20 20 20 20 62 72 65 61 6b  pSrc);.    break
15010 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
15020 20 20 20 20 20 24 64 62 20 73 74 61 74 75 73 20       $db status 
15030 28 73 74 65 70 7c 73 6f 72 74 7c 61 75 74 6f 69  (step|sort|autoi
15040 6e 64 65 78 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ndex).  **.  ** 
15050 44 69 73 70 6c 61 79 20 53 51 4c 49 54 45 5f 53  Display SQLITE_S
15060 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43  TMTSTATUS_FULLSC
15070 41 4e 5f 53 54 45 50 20 6f 72 20 0a 20 20 2a 2a  AN_STEP or .  **
15080 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
15090 55 53 5f 53 4f 52 54 20 66 6f 72 20 74 68 65 20  US_SORT for the 
150a0 6d 6f 73 74 20 72 65 63 65 6e 74 20 65 76 61 6c  most recent eval
150b0 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
150c0 5f 53 54 41 54 55 53 3a 20 7b 0a 20 20 20 20 69  _STATUS: {.    i
150d0 6e 74 20 76 3b 0a 20 20 20 20 63 6f 6e 73 74 20  nt v;.    const 
150e0 63 68 61 72 20 2a 7a 4f 70 3b 0a 20 20 20 20 69  char *zOp;.    i
150f0 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
15100 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
15110 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
15120 6f 62 6a 76 2c 20 22 28 73 74 65 70 7c 73 6f 72  objv, "(step|sor
15130 74 7c 61 75 74 6f 69 6e 64 65 78 29 22 29 3b 0a  t|autoindex)");.
15140 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
15150 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
15160 20 20 7a 4f 70 20 3d 20 54 63 6c 5f 47 65 74 53    zOp = Tcl_GetS
15170 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
15180 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
15190 4f 70 2c 20 22 73 74 65 70 22 29 3d 3d 30 20 29  Op, "step")==0 )
151a0 7b 0a 20 20 20 20 20 20 76 20 3d 20 70 44 62 2d  {.      v = pDb-
151b0 3e 6e 53 74 65 70 3b 0a 20 20 20 20 7d 65 6c 73  >nStep;.    }els
151c0 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4f 70  e if( strcmp(zOp
151d0 2c 20 22 73 6f 72 74 22 29 3d 3d 30 20 29 7b 0a  , "sort")==0 ){.
151e0 20 20 20 20 20 20 76 20 3d 20 70 44 62 2d 3e 6e        v = pDb->n
151f0 53 6f 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Sort;.    }else 
15200 69 66 28 20 73 74 72 63 6d 70 28 7a 4f 70 2c 20  if( strcmp(zOp, 
15210 22 61 75 74 6f 69 6e 64 65 78 22 29 3d 3d 30 20  "autoindex")==0 
15220 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 70 44 62  ){.      v = pDb
15230 2d 3e 6e 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65  ->nIndex;.    }e
15240 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  lse{.      Tcl_A
15250 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
15260 72 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  rp, .           
15270 20 22 62 61 64 20 61 72 67 75 6d 65 6e 74 3a 20   "bad argument: 
15280 73 68 6f 75 6c 64 20 62 65 20 61 75 74 6f 69 6e  should be autoin
15290 64 65 78 2c 20 73 74 65 70 2c 20 6f 72 20 73 6f  dex, step, or so
152a0 72 74 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rt", .          
152b0 20 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20    (char*)0);.   
152c0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
152d0 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  ROR;.    }.    T
152e0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
152f0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
15300 6e 74 4f 62 6a 28 76 29 29 3b 0a 20 20 20 20 62  ntObj(v));.    b
15310 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  reak;.  }.  .  /
15320 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 74  *.  **     $db t
15330 69 6d 65 6f 75 74 20 4d 49 4c 4c 45 53 45 43 4f  imeout MILLESECO
15340 4e 44 53 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 65  NDS.  **.  ** De
15350 6c 61 79 20 66 6f 72 20 74 68 65 20 6e 75 6d 62  lay for the numb
15360 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e  er of millisecon
15370 64 73 20 73 70 65 63 69 66 69 65 64 20 77 68 65  ds specified whe
15380 6e 20 61 20 66 69 6c 65 20 69 73 20 6c 6f 63 6b  n a file is lock
15390 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ed..  */.  case 
153a0 44 42 5f 54 49 4d 45 4f 55 54 3a 20 7b 0a 20 20  DB_TIMEOUT: {.  
153b0 20 20 69 6e 74 20 6d 73 3b 0a 20 20 20 20 69 66    int ms;.    if
153c0 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
153d0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
153e0 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
153f0 62 6a 76 2c 20 22 4d 49 4c 4c 49 53 45 43 4f 4e  bjv, "MILLISECON
15400 44 53 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  DS");.      retu
15410 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
15420 20 20 7d 0a 20 20 20 20 69 66 28 20 54 63 6c 5f    }.    if( Tcl_
15430 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
15440 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
15450 6d 73 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ms) ) return TCL
15460 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69  _ERROR;.    sqli
15470 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74  te3_busy_timeout
15480 28 70 44 62 2d 3e 64 62 2c 20 6d 73 29 3b 0a 20  (pDb->db, ms);. 
15490 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20     break;.  }.  
154a0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24  .  /*.  **     $
154b0 64 62 20 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73  db total_changes
154c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72  .  **.  ** Retur
154d0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
154e0 72 6f 77 73 20 74 68 61 74 20 77 65 72 65 20 6d  rows that were m
154f0 6f 64 69 66 69 65 64 2c 20 69 6e 73 65 72 74 65  odified, inserte
15500 64 2c 20 6f 72 20 64 65 6c 65 74 65 64 20 0a 20  d, or deleted . 
15510 20 2a 2a 20 73 69 6e 63 65 20 74 68 65 20 64 61   ** since the da
15520 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 77 61  tabase handle wa
15530 73 20 63 72 65 61 74 65 64 2e 0a 20 20 2a 2f 0a  s created..  */.
15540 20 20 63 61 73 65 20 44 42 5f 54 4f 54 41 4c 5f    case DB_TOTAL_
15550 43 48 41 4e 47 45 53 3a 20 7b 0a 20 20 20 20 54  CHANGES: {.    T
15560 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b  cl_Obj *pResult;
15570 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  .    if( objc!=2
15580 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
15590 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
155a0 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 22 29 3b  p, 2, objv, "");
155b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
155c0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
155d0 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c     pResult = Tcl
155e0 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _GetObjResult(in
155f0 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53  terp);.    Tcl_S
15600 65 74 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74  etIntObj(pResult
15610 2c 20 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f  , sqlite3_total_
15620 63 68 61 6e 67 65 73 28 70 44 62 2d 3e 64 62 29  changes(pDb->db)
15630 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
15640 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 74  }..  /*    $db t
15650 72 61 63 65 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a  race ?CALLBACK?.
15660 20 20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20 61    **.  ** Make a
15670 72 72 61 6e 67 65 6d 65 6e 74 73 20 74 6f 20 69  rrangements to i
15680 6e 76 6f 6b 65 20 74 68 65 20 43 41 4c 4c 42 41  nvoke the CALLBA
15690 43 4b 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 65  CK routine for e
156a0 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ach SQL statemen
156b0 74 0a 20 20 2a 2a 20 74 68 61 74 20 69 73 20 65  t.  ** that is e
156c0 78 65 63 75 74 65 64 2e 20 20 54 68 65 20 74 65  xecuted.  The te
156d0 78 74 20 6f 66 20 74 68 65 20 53 51 4c 20 69 73  xt of the SQL is
156e0 20 61 70 70 65 6e 64 65 64 20 74 6f 20 43 41 4c   appended to CAL
156f0 4c 42 41 43 4b 20 62 65 66 6f 72 65 0a 20 20 2a  LBACK before.  *
15700 2a 20 69 74 20 69 73 20 65 78 65 63 75 74 65 64  * it is executed
15710 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
15720 5f 54 52 41 43 45 3a 20 7b 0a 20 20 20 20 69 66  _TRACE: {.    if
15730 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20  ( objc>3 ){.    
15740 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
15750 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
15760 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22  jv, "?CALLBACK?"
15770 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
15780 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
15790 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32  else if( objc==2
157a0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44   ){.      if( pD
157b0 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20 20  b->zTrace ){.   
157c0 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
157d0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44  esult(interp, pD
157e0 62 2d 3e 7a 54 72 61 63 65 2c 20 28 63 68 61 72  b->zTrace, (char
157f0 2a 29 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  *)0);.      }.  
15800 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
15810 68 61 72 20 2a 7a 54 72 61 63 65 3b 0a 20 20 20  har *zTrace;.   
15820 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
15830 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63    if( pDb->zTrac
15840 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  e ){.        Tcl
15850 5f 46 72 65 65 28 70 44 62 2d 3e 7a 54 72 61 63  _Free(pDb->zTrac
15860 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
15870 20 20 7a 54 72 61 63 65 20 3d 20 54 63 6c 5f 47    zTrace = Tcl_G
15880 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
15890 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a  objv[2], &len);.
158a0 20 20 20 20 20 20 69 66 28 20 7a 54 72 61 63 65        if( zTrace
158b0 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20   && len>0 ){.   
158c0 20 20 20 20 20 70 44 62 2d 3e 7a 54 72 61 63 65       pDb->zTrace
158d0 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65   = Tcl_Alloc( le
158e0 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20  n + 1 );.       
158f0 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 54 72   memcpy(pDb->zTr
15900 61 63 65 2c 20 7a 54 72 61 63 65 2c 20 6c 65 6e  ace, zTrace, len
15910 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  +1);.      }else
15920 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
15930 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 20 20 20  Trace = 0;.     
15940 20 7d 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28   }.#if !defined(
15950 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
15960 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
15970 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
15980 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20 20  ING_POINT).     
15990 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65   if( pDb->zTrace
159a0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
159b0 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  >interp = interp
159c0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
159d0 33 5f 74 72 61 63 65 28 70 44 62 2d 3e 64 62 2c  3_trace(pDb->db,
159e0 20 44 62 54 72 61 63 65 48 61 6e 64 6c 65 72 2c   DbTraceHandler,
159f0 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c   pDb);.      }el
15a00 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
15a10 74 65 33 5f 74 72 61 63 65 28 70 44 62 2d 3e 64  te3_trace(pDb->d
15a20 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  b, 0, 0);.      
15a30 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  }.#endif.    }. 
15a40 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
15a50 20 2f 2a 20 20 20 20 24 64 62 20 74 72 61 6e 73   /*    $db trans
15a60 61 63 74 69 6f 6e 20 5b 2d 64 65 66 65 72 72 65  action [-deferre
15a70 64 7c 2d 69 6d 6d 65 64 69 61 74 65 7c 2d 65 78  d|-immediate|-ex
15a80 63 6c 75 73 69 76 65 5d 20 53 43 52 49 50 54 0a  clusive] SCRIPT.
15a90 20 20 2a 2a 0a 20 20 2a 2a 20 53 74 61 72 74 20    **.  ** Start 
15aa0 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f  a new transactio
15ab0 6e 20 28 69 66 20 77 65 20 61 72 65 20 6e 6f 74  n (if we are not
15ac0 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
15ad0 6d 69 64 73 74 20 6f 66 20 61 0a 20 20 2a 2a 20  midst of a.  ** 
15ae0 74 72 61 6e 73 61 63 74 69 6f 6e 29 20 61 6e 64  transaction) and
15af0 20 65 78 65 63 75 74 65 20 74 68 65 20 54 43 4c   execute the TCL
15b00 20 73 63 72 69 70 74 20 53 43 52 49 50 54 2e 20   script SCRIPT. 
15b10 20 41 66 74 65 72 20 53 43 52 49 50 54 0a 20 20   After SCRIPT.  
15b20 2a 2a 20 63 6f 6d 70 6c 65 74 65 73 2c 20 65 69  ** completes, ei
15b30 74 68 65 72 20 63 6f 6d 6d 69 74 20 74 68 65 20  ther commit the 
15b40 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 72  transaction or r
15b50 6f 6c 6c 20 69 74 20 62 61 63 6b 20 69 66 20 53  oll it back if S
15b60 43 52 49 50 54 0a 20 20 2a 2a 20 74 68 72 6f 77  CRIPT.  ** throw
15b70 73 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 2e 20  s an exception. 
15b80 20 4f 72 20 69 66 20 6e 6f 20 6e 65 77 20 74 72   Or if no new tr
15b90 61 6e 73 61 74 69 6f 6e 20 77 61 73 20 73 74 61  ansation was sta
15ba0 72 74 65 64 2c 20 64 6f 20 6e 6f 74 68 69 6e 67  rted, do nothing
15bb0 2e 0a 20 20 2a 2a 20 70 61 73 73 20 74 68 65 20  ..  ** pass the 
15bc0 65 78 63 65 70 74 69 6f 6e 20 6f 6e 20 75 70 20  exception on up 
15bd0 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a  the stack..  **.
15be0 20 20 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e    ** This comman
15bf0 64 20 77 61 73 20 69 6e 73 70 69 72 65 64 20 62  d was inspired b
15c00 79 20 44 61 76 65 20 54 68 6f 6d 61 73 27 73 20  y Dave Thomas's 
15c10 74 61 6c 6b 20 6f 6e 20 52 75 62 79 20 61 74 20  talk on Ruby at 
15c20 74 68 65 0a 20 20 2a 2a 20 32 30 30 35 20 4f 27  the.  ** 2005 O'
15c30 52 65 69 6c 6c 79 20 4f 70 65 6e 20 53 6f 75 72  Reilly Open Sour
15c40 63 65 20 43 6f 6e 76 65 6e 74 69 6f 6e 20 28 4f  ce Convention (O
15c50 53 43 4f 4e 29 2e 0a 20 20 2a 2f 0a 20 20 63 61  SCON)..  */.  ca
15c60 73 65 20 44 42 5f 54 52 41 4e 53 41 43 54 49 4f  se DB_TRANSACTIO
15c70 4e 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  N: {.    Tcl_Obj
15c80 20 2a 70 53 63 72 69 70 74 3b 0a 20 20 20 20 63   *pScript;.    c
15c90 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 65 67 69  onst char *zBegi
15ca0 6e 20 3d 20 22 53 41 56 45 50 4f 49 4e 54 20 5f  n = "SAVEPOINT _
15cb0 74 63 6c 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22  tcl_transaction"
15cc0 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ;.    if( objc!=
15cd0 33 20 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a  3 && objc!=4 ){.
15ce0 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
15cf0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
15d00 2c 20 6f 62 6a 76 2c 20 22 5b 54 59 50 45 5d 20  , objv, "[TYPE] 
15d10 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20  SCRIPT");.      
15d20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
15d30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
15d40 20 70 44 62 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pDb->nTransacti
15d50 6f 6e 3d 3d 30 20 26 26 20 6f 62 6a 63 3d 3d 34  on==0 && objc==4
15d60 20 29 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63   ){.      static
15d70 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 54 54 59   const char *TTY
15d80 50 45 5f 73 74 72 73 5b 5d 20 3d 20 7b 0a 20 20  PE_strs[] = {.  
15d90 20 20 20 20 20 20 22 64 65 66 65 72 72 65 64 22        "deferred"
15da0 2c 20 20 20 22 65 78 63 6c 75 73 69 76 65 22 2c  ,   "exclusive",
15db0 20 20 22 69 6d 6d 65 64 69 61 74 65 22 2c 20 30    "immediate", 0
15dc0 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20  .      };.      
15dd0 65 6e 75 6d 20 54 54 59 50 45 5f 65 6e 75 6d 20  enum TTYPE_enum 
15de0 7b 0a 20 20 20 20 20 20 20 20 54 54 59 50 45 5f  {.        TTYPE_
15df0 44 45 46 45 52 52 45 44 2c 20 54 54 59 50 45 5f  DEFERRED, TTYPE_
15e00 45 58 43 4c 55 53 49 56 45 2c 20 54 54 59 50 45  EXCLUSIVE, TTYPE
15e10 5f 49 4d 4d 45 44 49 41 54 45 0a 20 20 20 20 20  _IMMEDIATE.     
15e20 20 7d 3b 0a 20 20 20 20 20 20 69 6e 74 20 74 74   };.      int tt
15e30 79 70 65 3b 0a 20 20 20 20 20 20 69 66 28 20 54  ype;.      if( T
15e40 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f  cl_GetIndexFromO
15e50 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
15e60 32 5d 2c 20 54 54 59 50 45 5f 73 74 72 73 2c 20  2], TTYPE_strs, 
15e70 22 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 79 70  "transaction typ
15e80 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e",.            
15e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ea0 20 20 30 2c 20 26 74 74 79 70 65 29 20 29 7b 0a    0, &ttype) ){.
15eb0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
15ec0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
15ed0 7d 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20  }.      switch( 
15ee0 28 65 6e 75 6d 20 54 54 59 50 45 5f 65 6e 75 6d  (enum TTYPE_enum
15ef0 29 74 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20  )ttype ){.      
15f00 20 20 63 61 73 65 20 54 54 59 50 45 5f 44 45 46    case TTYPE_DEF
15f10 45 52 52 45 44 3a 20 20 20 20 2f 2a 20 6e 6f 2d  ERRED:    /* no-
15f20 6f 70 20 2a 2f 3b 20 20 20 20 20 20 20 20 20 20  op */;          
15f30 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
15f40 20 20 20 20 20 20 63 61 73 65 20 54 54 59 50 45        case TTYPE
15f50 5f 45 58 43 4c 55 53 49 56 45 3a 20 20 20 7a 42  _EXCLUSIVE:   zB
15f60 65 67 69 6e 20 3d 20 22 42 45 47 49 4e 20 45 58  egin = "BEGIN EX
15f70 43 4c 55 53 49 56 45 22 3b 20 20 62 72 65 61 6b  CLUSIVE";  break
15f80 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 54  ;.        case T
15f90 54 59 50 45 5f 49 4d 4d 45 44 49 41 54 45 3a 20  TYPE_IMMEDIATE: 
15fa0 20 20 7a 42 65 67 69 6e 20 3d 20 22 42 45 47 49    zBegin = "BEGI
15fb0 4e 20 49 4d 4d 45 44 49 41 54 45 22 3b 20 20 62  N IMMEDIATE";  b
15fc0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
15fd0 20 20 7d 0a 20 20 20 20 70 53 63 72 69 70 74 20    }.    pScript 
15fe0 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 3b 0a  = objv[objc-1];.
15ff0 0a 20 20 20 20 2f 2a 20 52 75 6e 20 74 68 65 20  .    /* Run the 
16000 53 51 4c 69 74 65 20 42 45 47 49 4e 20 63 6f 6d  SQLite BEGIN com
16010 6d 61 6e 64 20 74 6f 20 6f 70 65 6e 20 61 20 74  mand to open a t
16020 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 73 61  ransaction or sa
16030 76 65 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20 20 20  vepoint. */.    
16040 70 44 62 2d 3e 64 69 73 61 62 6c 65 41 75 74 68  pDb->disableAuth
16050 2b 2b 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ++;.    rc = sql
16060 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64  ite3_exec(pDb->d
16070 62 2c 20 7a 42 65 67 69 6e 2c 20 30 2c 20 30 2c  b, zBegin, 0, 0,
16080 20 30 29 3b 0a 20 20 20 20 70 44 62 2d 3e 64 69   0);.    pDb->di
16090 73 61 62 6c 65 41 75 74 68 2d 2d 3b 0a 20 20 20  sableAuth--;.   
160a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
160b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  OK ){.      Tcl_
160c0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
160d0 65 72 70 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  erp, sqlite3_err
160e0 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 28 63  msg(pDb->db), (c
160f0 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72  har*)0);.      r
16100 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
16110 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 62 2d 3e  .    }.    pDb->
16120 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a  nTransaction++;.
16130 0a 20 20 20 20 2f 2a 20 49 66 20 75 73 69 6e 67  .    /* If using
16140 20 4e 52 45 2c 20 73 63 68 65 64 75 6c 65 20 61   NRE, schedule a
16150 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 69 6e 76   callback to inv
16160 6f 6b 65 20 74 68 65 20 73 63 72 69 70 74 20 70  oke the script p
16170 53 63 72 69 70 74 2c 20 74 68 65 6e 0a 20 20 20  Script, then.   
16180 20 2a 2a 20 61 20 73 65 63 6f 6e 64 20 63 61 6c   ** a second cal
16190 6c 62 61 63 6b 20 74 6f 20 63 6f 6d 6d 69 74 20  lback to commit 
161a0 28 6f 72 20 72 6f 6c 6c 62 61 63 6b 29 20 74 68  (or rollback) th
161b0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72  e transaction or
161c0 20 73 61 76 65 70 6f 69 6e 74 0a 20 20 20 20 2a   savepoint.    *
161d0 2a 20 6f 70 65 6e 65 64 20 61 62 6f 76 65 2e 20  * opened above. 
161e0 49 66 20 6e 6f 74 20 75 73 69 6e 67 20 4e 52 45  If not using NRE
161f0 2c 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 73  , evaluate the s
16200 63 72 69 70 74 20 64 69 72 65 63 74 6c 79 2c 20  cript directly, 
16210 74 68 65 6e 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  then.    ** call
16220 20 66 75 6e 63 74 69 6f 6e 20 44 62 54 72 61 6e   function DbTran
16230 73 50 6f 73 74 43 6d 64 28 29 20 74 6f 20 63 6f  sPostCmd() to co
16240 6d 6d 69 74 20 28 6f 72 20 72 6f 6c 6c 62 61 63  mmit (or rollbac
16250 6b 29 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  k) the transacti
16260 6f 6e 20 0a 20 20 20 20 2a 2a 20 6f 72 20 73 61  on .    ** or sa
16270 76 65 70 6f 69 6e 74 2e 20 20 2a 2f 0a 20 20 20  vepoint.  */.   
16280 20 69 66 28 20 44 62 55 73 65 4e 72 65 28 29 20   if( DbUseNre() 
16290 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 4e 52 41  ){.      Tcl_NRA
162a0 64 64 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72  ddCallback(inter
162b0 70 2c 20 44 62 54 72 61 6e 73 50 6f 73 74 43 6d  p, DbTransPostCm
162c0 64 2c 20 63 64 2c 20 30 2c 20 30 2c 20 30 29 3b  d, cd, 0, 0, 0);
162d0 0a 20 20 20 20 20 20 28 76 6f 69 64 29 54 63 6c  .      (void)Tcl
162e0 5f 4e 52 45 76 61 6c 4f 62 6a 28 69 6e 74 65 72  _NREvalObj(inter
162f0 70 2c 20 70 53 63 72 69 70 74 2c 20 30 29 3b 0a  p, pScript, 0);.
16300 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16310 20 72 63 20 3d 20 44 62 54 72 61 6e 73 50 6f 73   rc = DbTransPos
16320 74 43 6d 64 28 26 63 64 2c 20 69 6e 74 65 72 70  tCmd(&cd, interp
16330 2c 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28  , Tcl_EvalObjEx(
16340 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c  interp, pScript,
16350 20 30 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20   0));.    }.    
16360 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
16370 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 75 6e 6c  .  **    $db unl
16380 6f 63 6b 5f 6e 6f 74 69 66 79 20 3f 73 63 72 69  ock_notify ?scri
16390 70 74 3f 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  pt?.  */.  case 
163a0 44 42 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59  DB_UNLOCK_NOTIFY
163b0 3a 20 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  : {.#ifndef SQLI
163c0 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b  TE_ENABLE_UNLOCK
163d0 5f 4e 4f 54 49 46 59 0a 20 20 20 20 54 63 6c 5f  _NOTIFY.    Tcl_
163e0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
163f0 65 72 70 2c 20 22 75 6e 6c 6f 63 6b 5f 6e 6f 74  erp, "unlock_not
16400 69 66 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  ify not availabl
16410 65 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64 22  e in this build"
16420 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16430 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 30 29         (char*)0)
16440 3b 0a 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45  ;.    rc = TCL_E
16450 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 20 20  RROR;.#else.    
16460 69 66 28 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f  if( objc!=2 && o
16470 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc!=3 ){.      
16480 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
16490 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
164a0 2c 20 22 3f 53 43 52 49 50 54 3f 22 29 3b 0a 20  , "?SCRIPT?");. 
164b0 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52       rc = TCL_ER
164c0 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ROR;.    }else{.
164d0 20 20 20 20 20 20 76 6f 69 64 20 28 2a 78 4e 6f        void (*xNo
164e0 74 69 66 79 29 28 76 6f 69 64 20 2a 2a 2c 20 69  tify)(void **, i
164f0 6e 74 29 20 3d 20 30 3b 0a 20 20 20 20 20 20 76  nt) = 0;.      v
16500 6f 69 64 20 2a 70 4e 6f 74 69 66 79 41 72 67 20  oid *pNotifyArg 
16510 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  = 0;..      if( 
16520 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69  pDb->pUnlockNoti
16530 66 79 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  fy ){.        Tc
16540 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
16550 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66  Db->pUnlockNotif
16560 79 29 3b 0a 20 20 20 20 20 20 20 20 70 44 62 2d  y);.        pDb-
16570 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 20 3d  >pUnlockNotify =
16580 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20   0;.      }.  . 
16590 20 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33       if( objc==3
165a0 20 29 7b 0a 20 20 20 20 20 20 20 20 78 4e 6f 74   ){.        xNot
165b0 69 66 79 20 3d 20 44 62 55 6e 6c 6f 63 6b 4e 6f  ify = DbUnlockNo
165c0 74 69 66 79 3b 0a 20 20 20 20 20 20 20 20 70 4e  tify;.        pN
165d0 6f 74 69 66 79 41 72 67 20 3d 20 28 76 6f 69 64  otifyArg = (void
165e0 20 2a 29 70 44 62 3b 0a 20 20 20 20 20 20 20 20   *)pDb;.        
165f0 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69  pDb->pUnlockNoti
16600 66 79 20 3d 20 6f 62 6a 76 5b 32 5d 3b 0a 20 20  fy = objv[2];.  
16610 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65        Tcl_IncrRe
16620 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 55 6e 6c  fCount(pDb->pUnl
16630 6f 63 6b 4e 6f 74 69 66 79 29 3b 0a 20 20 20 20  ockNotify);.    
16640 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 69 66 28    }.  .      if(
16650 20 73 71 6c 69 74 65 33 5f 75 6e 6c 6f 63 6b 5f   sqlite3_unlock_
16660 6e 6f 74 69 66 79 28 70 44 62 2d 3e 64 62 2c 20  notify(pDb->db, 
16670 78 4e 6f 74 69 66 79 2c 20 70 4e 6f 74 69 66 79  xNotify, pNotify
16680 41 72 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Arg) ){.        
16690 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
166a0 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33  (interp, sqlite3
166b0 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29  _errmsg(pDb->db)
166c0 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
166d0 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52       rc = TCL_ER
166e0 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
166f0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72   }.#endif.    br
16700 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
16710 20 2a 2a 20 20 20 20 24 64 62 20 70 72 65 75 70   **    $db preup
16720 64 61 74 65 5f 68 6f 6f 6b 20 63 6f 75 6e 74 0a  date_hook count.
16730 20 20 2a 2a 20 20 20 20 24 64 62 20 70 72 65 75    **    $db preu
16740 70 64 61 74 65 5f 68 6f 6f 6b 20 68 6f 6f 6b 20  pdate_hook hook 
16750 3f 53 43 52 49 50 54 3f 0a 20 20 2a 2a 20 20 20  ?SCRIPT?.  **   
16760 20 24 64 62 20 70 72 65 75 70 64 61 74 65 5f 68   $db preupdate_h
16770 6f 6f 6b 20 6e 65 77 20 49 4e 44 45 58 0a 20 20  ook new INDEX.  
16780 2a 2a 20 20 20 20 24 64 62 20 70 72 65 75 70 64  **    $db preupd
16790 61 74 65 5f 68 6f 6f 6b 20 6f 6c 64 20 49 4e 44  ate_hook old IND
167a0 45 58 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  EX.  */.  case D
167b0 42 5f 50 52 45 55 50 44 41 54 45 3a 20 7b 0a 23  B_PREUPDATE: {.#
167c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  ifndef SQLITE_EN
167d0 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48  ABLE_PREUPDATE_H
167e0 4f 4f 4b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65  OOK.    Tcl_Appe
167f0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
16800 20 22 70 72 65 75 70 64 61 74 65 5f 68 6f 6f 6b   "preupdate_hook
16810 20 77 61 73 20 6f 6d 69 74 74 65 64 20 61 74 20   was omitted at 
16820 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 22 29 3b 0a  compile-time");.
16830 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52      rc = TCL_ERR
16840 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 20 20 73 74  OR;.#else.    st
16850 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
16860 2a 61 7a 53 75 62 5b 5d 20 3d 20 7b 22 63 6f 75  *azSub[] = {"cou
16870 6e 74 22 2c 20 22 64 65 70 74 68 22 2c 20 22 68  nt", "depth", "h
16880 6f 6f 6b 22 2c 20 22 6e 65 77 22 2c 20 22 6f 6c  ook", "new", "ol
16890 64 22 2c 20 30 7d 3b 0a 20 20 20 20 65 6e 75 6d  d", 0};.    enum
168a0 20 44 62 50 72 65 75 70 64 61 74 65 53 75 62 43   DbPreupdateSubC
168b0 6d 64 20 7b 0a 20 20 20 20 20 20 50 52 45 5f 43  md {.      PRE_C
168c0 4f 55 4e 54 2c 20 50 52 45 5f 44 45 50 54 48 2c  OUNT, PRE_DEPTH,
168d0 20 50 52 45 5f 48 4f 4f 4b 2c 20 50 52 45 5f 4e   PRE_HOOK, PRE_N
168e0 45 57 2c 20 50 52 45 5f 4f 4c 44 0a 20 20 20 20  EW, PRE_OLD.    
168f0 7d 3b 0a 20 20 20 20 69 6e 74 20 69 53 75 62 3b  };.    int iSub;
16900 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3c 33  ..    if( objc<3
16910 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
16920 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
16930 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 55 42  p, 2, objv, "SUB
16940 2d 43 4f 4d 4d 41 4e 44 20 3f 41 52 47 53 3f 22  -COMMAND ?ARGS?"
16950 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
16960 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f   Tcl_GetIndexFro
16970 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
16980 76 5b 32 5d 2c 20 61 7a 53 75 62 2c 20 22 73 75  v[2], azSub, "su
16990 62 2d 63 6f 6d 6d 61 6e 64 22 2c 20 30 2c 20 26  b-command", 0, &
169a0 69 53 75 62 29 20 29 7b 0a 20 20 20 20 20 20 72  iSub) ){.      r
169b0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
169c0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 74  .    }..    swit
169d0 63 68 28 20 28 65 6e 75 6d 20 44 62 50 72 65 75  ch( (enum DbPreu
169e0 70 64 61 74 65 53 75 62 43 6d 64 29 69 53 75 62  pdateSubCmd)iSub
169f0 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 50   ){.      case P
16a00 52 45 5f 43 4f 55 4e 54 3a 20 7b 0a 20 20 20 20  RE_COUNT: {.    
16a10 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 73      int nCol = s
16a20 71 6c 69 74 65 33 5f 70 72 65 75 70 64 61 74 65  qlite3_preupdate
16a30 5f 63 6f 75 6e 74 28 70 44 62 2d 3e 64 62 29 3b  _count(pDb->db);
16a40 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74  .        Tcl_Set
16a50 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
16a60 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
16a70 6e 43 6f 6c 29 29 3b 0a 20 20 20 20 20 20 20 20  nCol));.        
16a80 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
16a90 20 20 20 20 20 20 63 61 73 65 20 50 52 45 5f 48        case PRE_H
16aa0 4f 4f 4b 3a 20 7b 0a 20 20 20 20 20 20 20 20 69  OOK: {.        i
16ab0 66 28 20 6f 62 6a 63 3e 34 20 29 7b 0a 20 20 20  f( objc>4 ){.   
16ac0 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67         Tcl_Wrong
16ad0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
16ae0 32 2c 20 6f 62 6a 76 2c 20 22 68 6f 6f 6b 20 3f  2, objv, "hook ?
16af0 53 43 52 49 50 54 3f 22 29 3b 0a 20 20 20 20 20  SCRIPT?");.     
16b00 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
16b10 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d  ERROR;.        }
16b20 0a 20 20 20 20 20 20 20 20 44 62 48 6f 6f 6b 43  .        DbHookC
16b30 6d 64 28 69 6e 74 65 72 70 2c 20 70 44 62 2c 20  md(interp, pDb, 
16b40 28 6f 62 6a 63 3d 3d 34 20 3f 20 6f 62 6a 76 5b  (objc==4 ? objv[
16b50 33 5d 20 3a 20 30 29 2c 20 26 70 44 62 2d 3e 70  3] : 0), &pDb->p
16b60 50 72 65 55 70 64 61 74 65 48 6f 6f 6b 29 3b 0a  PreUpdateHook);.
16b70 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
16b80 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 61       }..      ca
16b90 73 65 20 50 52 45 5f 44 45 50 54 48 3a 20 7b 0a  se PRE_DEPTH: {.
16ba0 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20          Tcl_Obj 
16bb0 2a 70 52 65 74 3b 0a 20 20 20 20 20 20 20 20 69  *pRet;.        i
16bc0 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
16bd0 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e          Tcl_Wron
16be0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
16bf0 20 33 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20   3, objv, "");. 
16c00 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
16c10 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
16c20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 52 65     }.        pRe
16c30 74 20 3d 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  t = Tcl_NewIntOb
16c40 6a 28 73 71 6c 69 74 65 33 5f 70 72 65 75 70 64  j(sqlite3_preupd
16c50 61 74 65 5f 64 65 70 74 68 28 70 44 62 2d 3e 64  ate_depth(pDb->d
16c60 62 29 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c  b));.        Tcl
16c70 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
16c80 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 20 20 20  terp, pRet);.   
16c90 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
16ca0 20 20 7d 0a 0a 20 20 20 20 20 20 63 61 73 65 20    }..      case 
16cb0 50 52 45 5f 4e 45 57 3a 0a 20 20 20 20 20 20 63  PRE_NEW:.      c
16cc0 61 73 65 20 50 52 45 5f 4f 4c 44 3a 20 7b 0a 20  ase PRE_OLD: {. 
16cd0 20 20 20 20 20 20 20 69 6e 74 20 69 49 64 78 3b         int iIdx;
16ce0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
16cf0 5f 76 61 6c 75 65 20 2a 70 56 61 6c 75 65 3b 0a  _value *pValue;.
16d00 20 20 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63          if( objc
16d10 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=4 ){.         
16d20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
16d30 73 28 69 6e 74 65 72 70 2c 20 33 2c 20 6f 62 6a  s(interp, 3, obj
16d40 76 2c 20 22 49 4e 44 45 58 22 29 3b 0a 20 20 20  v, "INDEX");.   
16d50 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
16d60 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  L_ERROR;.       
16d70 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 54   }.        if( T
16d80 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
16d90 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
16da0 2c 20 26 69 49 64 78 29 20 29 7b 0a 20 20 20 20  , &iIdx) ){.    
16db0 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
16dc0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
16dd0 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  }..        if( i
16de0 53 75 62 3d 3d 50 52 45 5f 4f 4c 44 20 29 7b 0a  Sub==PRE_OLD ){.
16df0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
16e00 71 6c 69 74 65 33 5f 70 72 65 75 70 64 61 74 65  qlite3_preupdate
16e10 5f 6f 6c 64 28 70 44 62 2d 3e 64 62 2c 20 69 49  _old(pDb->db, iI
16e20 64 78 2c 20 26 70 56 61 6c 75 65 29 3b 0a 20 20  dx, &pValue);.  
16e30 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
16e40 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
16e50 53 75 62 3d 3d 50 52 45 5f 4e 45 57 20 29 3b 0a  Sub==PRE_NEW );.
16e60 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
16e70 71 6c 69 74 65 33 5f 70 72 65 75 70 64 61 74 65  qlite3_preupdate
16e80 5f 6e 65 77 28 70 44 62 2d 3e 64 62 2c 20 69 49  _new(pDb->db, iI
16e90 64 78 2c 20 26 70 56 61 6c 75 65 29 3b 0a 20 20  dx, &pValue);.  
16ea0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
16eb0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
16ec0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
16ed0 54 63 6c 5f 4f 62 6a 20 2a 70 4f 62 6a 3b 0a 20  Tcl_Obj *pObj;. 
16ee0 20 20 20 20 20 20 20 20 20 70 4f 62 6a 20 3d 20           pObj = 
16ef0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
16f00 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  ((char*)sqlite3_
16f10 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 75  value_text(pValu
16f20 65 29 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20  e), -1);.       
16f30 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
16f40 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 4f 62 6a  ult(interp, pObj
16f50 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
16f60 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  {.          Tcl_
16f70 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
16f80 65 72 70 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  erp, sqlite3_err
16f90 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 30 29  msg(pDb->db), 0)
16fa0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
16fb0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
16fc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
16fd0 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
16fe0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52  SQLITE_ENABLE_PR
16ff0 45 55 50 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a  EUPDATE_HOOK */.
17000 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
17010 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62    /*.  **    $db
17020 20 77 61 6c 5f 68 6f 6f 6b 20 3f 73 63 72 69 70   wal_hook ?scrip
17030 74 3f 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 75  t?.  **    $db u
17040 70 64 61 74 65 5f 68 6f 6f 6b 20 3f 73 63 72 69  pdate_hook ?scri
17050 70 74 3f 0a 20 20 2a 2a 20 20 20 20 24 64 62 20  pt?.  **    $db 
17060 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 20 3f 73  rollback_hook ?s
17070 63 72 69 70 74 3f 0a 20 20 2a 2f 0a 20 20 63 61  cript?.  */.  ca
17080 73 65 20 44 42 5f 57 41 4c 5f 48 4f 4f 4b 3a 20  se DB_WAL_HOOK: 
17090 0a 20 20 63 61 73 65 20 44 42 5f 55 50 44 41 54  .  case DB_UPDAT
170a0 45 5f 48 4f 4f 4b 3a 20 0a 20 20 63 61 73 65 20  E_HOOK: .  case 
170b0 44 42 5f 52 4f 4c 4c 42 41 43 4b 5f 48 4f 4f 4b  DB_ROLLBACK_HOOK
170c0 3a 20 7b 0a 20 20 20 20 2f 2a 20 73 65 74 20 70  : {.    /* set p
170d0 70 48 6f 6f 6b 20 74 6f 20 70 6f 69 6e 74 20 61  pHook to point a
170e0 74 20 70 55 70 64 61 74 65 48 6f 6f 6b 20 6f 72  t pUpdateHook or
170f0 20 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 2c 20   pRollbackHook, 
17100 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 0a 20 20  depending on .  
17110 20 20 2a 2a 20 77 68 65 74 68 65 72 20 5b 24 64    ** whether [$d
17120 62 20 75 70 64 61 74 65 5f 68 6f 6f 6b 5d 20 6f  b update_hook] o
17130 72 20 5b 24 64 62 20 72 6f 6c 6c 62 61 63 6b 5f  r [$db rollback_
17140 68 6f 6f 6b 5d 20 77 61 73 20 69 6e 76 6f 6b 65  hook] was invoke
17150 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 54 63  d..    */.    Tc
17160 6c 5f 4f 62 6a 20 2a 2a 70 70 48 6f 6f 6b 20 3d  l_Obj **ppHook =
17170 20 30 3b 20 0a 20 20 20 20 69 66 28 20 63 68 6f   0; .    if( cho
17180 69 63 65 3d 3d 44 42 5f 57 41 4c 5f 48 4f 4f 4b  ice==DB_WAL_HOOK
17190 20 29 20 70 70 48 6f 6f 6b 20 3d 20 26 70 44 62   ) ppHook = &pDb
171a0 2d 3e 70 57 61 6c 48 6f 6f 6b 3b 0a 20 20 20 20  ->pWalHook;.    
171b0 69 66 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f 55  if( choice==DB_U
171c0 50 44 41 54 45 5f 48 4f 4f 4b 20 29 20 70 70 48  PDATE_HOOK ) ppH
171d0 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e 70 55 70 64  ook = &pDb->pUpd
171e0 61 74 65 48 6f 6f 6b 3b 0a 20 20 20 20 69 66 28  ateHook;.    if(
171f0 20 63 68 6f 69 63 65 3d 3d 44 42 5f 52 4f 4c 4c   choice==DB_ROLL
17200 42 41 43 4b 5f 48 4f 4f 4b 20 29 20 70 70 48 6f  BACK_HOOK ) ppHo
17210 6f 6b 20 3d 20 26 70 44 62 2d 3e 70 52 6f 6c 6c  ok = &pDb->pRoll
17220 62 61 63 6b 48 6f 6f 6b 3b 0a 20 20 20 20 69 66  backHook;.    if
17230 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20  ( objc>3 ){.    
17240 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
17250 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
17260 62 6a 76 2c 20 22 3f 53 43 52 49 50 54 3f 22 29  bjv, "?SCRIPT?")
17270 3b 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  ;.       return 
17280 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
17290 0a 0a 20 20 20 20 44 62 48 6f 6f 6b 43 6d 64 28  ..    DbHookCmd(
172a0 69 6e 74 65 72 70 2c 20 70 44 62 2c 20 28 6f 62  interp, pDb, (ob
172b0 6a 63 3d 3d 33 20 3f 20 6f 62 6a 76 5b 32 5d 20  jc==3 ? objv[2] 
172c0 3a 20 30 29 2c 20 70 70 48 6f 6f 6b 29 3b 0a 20  : 0), ppHook);. 
172d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
172e0 20 2f 2a 20 20 20 20 24 64 62 20 76 65 72 73 69   /*    $db versi
172f0 6f 6e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74  on.  **.  ** Ret
17300 75 72 6e 20 74 68 65 20 76 65 72 73 69 6f 6e 20  urn the version 
17310 73 74 72 69 6e 67 20 66 6f 72 20 74 68 69 73 20  string for this 
17320 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20  database..  */. 
17330 20 63 61 73 65 20 44 42 5f 56 45 52 53 49 4f 4e   case DB_VERSION
17340 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52  : {.    Tcl_SetR
17350 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
17360 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6c 69  har *)sqlite3_li
17370 62 76 65 72 73 69 6f 6e 28 29 2c 20 54 43 4c 5f  bversion(), TCL_
17380 53 54 41 54 49 43 29 3b 0a 20 20 20 20 62 72 65  STATIC);.    bre
17390 61 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 7d 20 2f 2a  ak;.  }...  } /*
173a0 20 45 6e 64 20 6f 66 20 74 68 65 20 53 57 49 54   End of the SWIT
173b0 43 48 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CH statement */.
173c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
173d0 23 69 66 20 53 51 4c 49 54 45 5f 54 43 4c 5f 4e  #if SQLITE_TCL_N
173e0 52 45 0a 2f 2a 0a 2a 2a 20 41 64 61 70 74 6f 72  RE./*.** Adaptor
173f0 20 74 68 61 74 20 70 72 6f 76 69 64 65 73 20 61   that provides a
17400 6e 20 6f 62 6a 43 6d 64 20 69 6e 74 65 72 66 61  n objCmd interfa
17410 63 65 20 74 6f 20 74 68 65 20 4e 52 45 2d 65 6e  ce to the NRE-en
17420 61 62 6c 65 64 0a 2a 2a 20 69 6e 74 65 72 66 61  abled.** interfa
17430 63 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ce implementatio
17440 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
17450 20 44 62 4f 62 6a 43 6d 64 41 64 61 70 74 6f 72   DbObjCmdAdaptor
17460 28 0a 20 20 76 6f 69 64 20 2a 63 64 2c 0a 20 20  (.  void *cd,.  
17470 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
17480 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
17490 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74    Tcl_Obj *const
174a0 2a 6f 62 6a 76 0a 29 7b 0a 20 20 72 65 74 75 72  *objv.){.  retur
174b0 6e 20 54 63 6c 5f 4e 52 43 61 6c 6c 4f 62 6a 50  n Tcl_NRCallObjP
174c0 72 6f 63 28 69 6e 74 65 72 70 2c 20 44 62 4f 62  roc(interp, DbOb
174d0 6a 43 6d 64 2c 20 63 64 2c 20 6f 62 6a 63 2c 20  jCmd, cd, objc, 
174e0 6f 62 6a 76 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  objv);.}.#endif 
174f0 2f 2a 20 53 51 4c 49 54 45 5f 54 43 4c 5f 4e 52  /* SQLITE_TCL_NR
17500 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 20 20 73 71  E */../*.**   sq
17510 6c 69 74 65 33 20 44 42 4e 41 4d 45 20 46 49 4c  lite3 DBNAME FIL
17520 45 4e 41 4d 45 20 3f 2d 76 66 73 20 56 46 53 4e  ENAME ?-vfs VFSN
17530 41 4d 45 3f 20 3f 2d 6b 65 79 20 4b 45 59 3f 20  AME? ?-key KEY? 
17540 3f 2d 72 65 61 64 6f 6e 6c 79 20 42 4f 4f 4c 45  ?-readonly BOOLE
17550 41 4e 3f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  AN?.**          
17560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17570 20 3f 2d 63 72 65 61 74 65 20 42 4f 4f 4c 45 41   ?-create BOOLEA
17580 4e 3f 20 3f 2d 6e 6f 6d 75 74 65 78 20 42 4f 4f  N? ?-nomutex BOO
17590 4c 45 41 4e 3f 0a 2a 2a 0a 2a 2a 20 54 68 69 73  LEAN?.**.** This
175a0 20 69 73 20 74 68 65 20 6d 61 69 6e 20 54 63 6c   is the main Tcl
175b0 20 63 6f 6d 6d 61 6e 64 2e 20 20 57 68 65 6e 20   command.  When 
175c0 74 68 65 20 22 73 71 6c 69 74 65 22 20 54 63 6c  the "sqlite" Tcl
175d0 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 69   command is.** i
175e0 6e 76 6f 6b 65 64 2c 20 74 68 69 73 20 72 6f 75  nvoked, this rou
175f0 74 69 6e 65 20 72 75 6e 73 20 74 6f 20 70 72 6f  tine runs to pro
17600 63 65 73 73 20 74 68 61 74 20 63 6f 6d 6d 61 6e  cess that comman
17610 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  d..**.** The fir
17620 73 74 20 61 72 67 75 6d 65 6e 74 2c 20 44 42 4e  st argument, DBN
17630 41 4d 45 2c 20 69 73 20 61 6e 20 61 72 62 69 74  AME, is an arbit
17640 72 61 72 79 20 6e 61 6d 65 20 66 6f 72 20 61 20  rary name for a 
17650 6e 65 77 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  new.** database 
17660 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 54 68 69  connection.  Thi
17670 73 20 63 6f 6d 6d 61 6e 64 20 63 72 65 61 74 65  s command create
17680 73 20 61 20 6e 65 77 20 63 6f 6d 6d 61 6e 64 20  s a new command 
17690 6e 61 6d 65 64 0a 2a 2a 20 44 42 4e 41 4d 45 20  named.** DBNAME 
176a0 74 68 61 74 20 69 73 20 75 73 65 64 20 74 6f 20  that is used to 
176b0 63 6f 6e 74 72 6f 6c 20 74 68 61 74 20 63 6f 6e  control that con
176c0 6e 65 63 74 69 6f 6e 2e 20 20 54 68 65 20 64 61  nection.  The da
176d0 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63  tabase.** connec
176e0 74 69 6f 6e 20 69 73 20 64 65 6c 65 74 65 64 20  tion is deleted 
176f0 77 68 65 6e 20 74 68 65 20 44 42 4e 41 4d 45 20  when the DBNAME 
17700 63 6f 6d 6d 61 6e 64 20 69 73 20 64 65 6c 65 74  command is delet
17710 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65  ed..**.** The se
17720 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
17730 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
17740 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
17750 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  **.*/.static int
17760 20 44 62 4d 61 69 6e 28 76 6f 69 64 20 2a 63 64   DbMain(void *cd
17770 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
17780 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 54  terp, int objc,T
17790 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62  cl_Obj *const*ob
177a0 6a 76 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20  jv){.  SqliteDb 
177b0 2a 70 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  *p;.  const char
177c0 20 2a 7a 41 72 67 3b 0a 20 20 63 68 61 72 20 2a   *zArg;.  char *
177d0 7a 45 72 72 4d 73 67 3b 0a 20 20 69 6e 74 20 69  zErrMsg;.  int i
177e0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
177f0 7a 46 69 6c 65 3b 0a 20 20 63 6f 6e 73 74 20 63  zFile;.  const c
17800 68 61 72 20 2a 7a 56 66 73 20 3d 20 30 3b 0a 20  har *zVfs = 0;. 
17810 20 69 6e 74 20 66 6c 61 67 73 3b 0a 20 20 54 63   int flags;.  Tc
17820 6c 5f 44 53 74 72 69 6e 67 20 74 72 61 6e 73 6c  l_DString transl
17830 61 74 65 64 46 69 6c 65 6e 61 6d 65 3b 0a 23 69  atedFilename;.#i
17840 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
17850 5f 48 41 53 5f 43 4f 44 45 43 29 20 26 26 20 21  _HAS_CODEC) && !
17860 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
17870 4d 49 54 5f 43 4f 44 45 43 5f 46 52 4f 4d 5f 54  MIT_CODEC_FROM_T
17880 43 4c 29 0a 20 20 76 6f 69 64 20 2a 70 4b 65 79  CL).  void *pKey
17890 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4b 65 79   = 0;.  int nKey
178a0 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 69   = 0;.#endif.  i
178b0 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 49 6e 20  nt rc;..  /* In 
178c0 6e 6f 72 6d 61 6c 20 75 73 65 2c 20 65 61 63 68  normal use, each
178d0 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
178e0 20 72 75 6e 73 20 69 6e 20 61 20 73 69 6e 67 6c   runs in a singl
178f0 65 20 74 68 72 65 61 64 2e 20 20 53 6f 0a 20 20  e thread.  So.  
17900 2a 2a 20 62 79 20 64 65 66 61 75 6c 74 2c 20 77  ** by default, w
17910 65 20 63 61 6e 20 74 75 72 6e 20 6f 66 20 6d 75  e can turn of mu
17920 74 65 78 69 6e 67 20 6f 6e 20 53 51 4c 69 74 65  texing on SQLite
17930 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
17940 74 69 6f 6e 73 2e 0a 20 20 2a 2a 20 48 6f 77 65  tions..  ** Howe
17950 76 65 72 2c 20 66 6f 72 20 74 65 73 74 69 6e 67  ver, for testing
17960 20 70 75 72 70 6f 73 65 73 20 69 74 20 69 73 20   purposes it is 
17970 75 73 65 66 75 6c 20 74 6f 20 68 61 76 65 20 6d  useful to have m
17980 75 74 65 78 65 73 20 74 75 72 6e 65 64 0a 20 20  utexes turned.  
17990 2a 2a 20 6f 6e 2e 20 20 53 6f 2c 20 62 79 20 64  ** on.  So, by d
179a0 65 66 61 75 6c 74 2c 20 6d 75 74 65 78 65 73 20  efault, mutexes 
179b0 64 65 66 61 75 6c 74 20 6f 66 66 2e 20 20 42 75  default off.  Bu
179c0 74 20 69 66 20 63 6f 6d 70 69 6c 65 64 20 77 69  t if compiled wi
179d0 74 68 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 54  th.  ** SQLITE_T
179e0 43 4c 5f 44 45 46 41 55 4c 54 5f 46 55 4c 4c 4d  CL_DEFAULT_FULLM
179f0 55 54 45 58 20 74 68 65 6e 20 6d 75 74 65 78 65  UTEX then mutexe
17a00 73 20 64 65 66 61 75 6c 74 20 6f 6e 2e 0a 20 20  s default on..  
17a10 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
17a20 5f 54 43 4c 5f 44 45 46 41 55 4c 54 5f 46 55 4c  _TCL_DEFAULT_FUL
17a30 4c 4d 55 54 45 58 0a 20 20 66 6c 61 67 73 20 3d  LMUTEX.  flags =
17a40 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
17a50 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f  DWRITE | SQLITE_
17a60 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 20 53 51  OPEN_CREATE | SQ
17a70 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55  LITE_OPEN_FULLMU
17a80 54 45 58 3b 0a 23 65 6c 73 65 0a 20 20 66 6c 61  TEX;.#else.  fla
17a90 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs = SQLITE_OPEN
17aa0 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c  _READWRITE | SQL
17ab0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20  ITE_OPEN_CREATE 
17ac0 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f  | SQLITE_OPEN_NO
17ad0 4d 55 54 45 58 3b 0a 23 65 6e 64 69 66 0a 0a 20  MUTEX;.#endif.. 
17ae0 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a   if( objc==2 ){.
17af0 20 20 20 20 7a 41 72 67 20 3d 20 54 63 6c 5f 47      zArg = Tcl_G
17b00 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
17b10 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 20  objv[1], 0);.   
17b20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67   if( strcmp(zArg
17b30 2c 22 2d 76 65 72 73 69 6f 6e 22 29 3d 3d 30 20  ,"-version")==0 
17b40 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
17b50 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
17b60 2c 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73  ,sqlite3_libvers
17b70 69 6f 6e 28 29 2c 20 28 63 68 61 72 2a 29 30 29  ion(), (char*)0)
17b80 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
17b90 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  CL_OK;.    }.   
17ba0 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67   if( strcmp(zArg
17bb0 2c 22 2d 73 6f 75 72 63 65 69 64 22 29 3d 3d 30  ,"-sourceid")==0
17bc0 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
17bd0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
17be0 70 2c 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65  p,sqlite3_source
17bf0 69 64 28 29 2c 20 28 63 68 61 72 2a 29 30 29 3b  id(), (char*)0);
17c00 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
17c10 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  L_OK;.    }.    
17c20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c  if( strcmp(zArg,
17c30 22 2d 68 61 73 2d 63 6f 64 65 63 22 29 3d 3d 30  "-has-codec")==0
17c40 20 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28   ){.#if defined(
17c50 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
17c60 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
17c70 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 44 45 43 5f  LITE_OMIT_CODEC_
17c80 46 52 4f 4d 5f 54 43 4c 29 0a 20 20 20 20 20 20  FROM_TCL).      
17c90 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
17ca0 28 69 6e 74 65 72 70 2c 22 31 22 2c 28 63 68 61  (interp,"1",(cha
17cb0 72 2a 29 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20  r*)0);.#else.   
17cc0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
17cd0 75 6c 74 28 69 6e 74 65 72 70 2c 22 30 22 2c 28  ult(interp,"0",(
17ce0 63 68 61 72 2a 29 30 29 3b 0a 23 65 6e 64 69 66  char*)0);.#endif
17cf0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
17d00 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  L_OK;.    }.  }.
17d10 20 20 66 6f 72 28 69 3d 33 3b 20 69 2b 31 3c 6f    for(i=3; i+1<o
17d20 62 6a 63 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20  bjc; i+=2){.    
17d30 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65 74 53 74  zArg = Tcl_GetSt
17d40 72 69 6e 67 28 6f 62 6a 76 5b 69 5d 29 3b 0a 20  ring(objv[i]);. 
17d50 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41     if( strcmp(zA
17d60 72 67 2c 22 2d 6b 65 79 22 29 3d 3d 30 20 29 7b  rg,"-key")==0 ){
17d70 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
17d80 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 29 20 26  ITE_HAS_CODEC) &
17d90 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
17da0 45 5f 4f 4d 49 54 5f 43 4f 44 45 43 5f 46 52 4f  E_OMIT_CODEC_FRO
17db0 4d 5f 54 43 4c 29 0a 20 20 20 20 20 20 70 4b 65  M_TCL).      pKe
17dc0 79 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41  y = Tcl_GetByteA
17dd0 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  rrayFromObj(objv
17de0 5b 69 2b 31 5d 2c 20 26 6e 4b 65 79 29 3b 0a 23  [i+1], &nKey);.#
17df0 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 20  endif.    }else 
17e00 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c  if( strcmp(zArg,
17e10 20 22 2d 76 66 73 22 29 3d 3d 30 20 29 7b 0a 20   "-vfs")==0 ){. 
17e20 20 20 20 20 20 7a 56 66 73 20 3d 20 54 63 6c 5f       zVfs = Tcl_
17e30 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69  GetString(objv[i
17e40 2b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  +1]);.    }else 
17e50 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c  if( strcmp(zArg,
17e60 20 22 2d 72 65 61 64 6f 6e 6c 79 22 29 3d 3d 30   "-readonly")==0
17e70 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 3b   ){.      int b;
17e80 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47  .      if( Tcl_G
17e90 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
17ea0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 2b  (interp, objv[i+
17eb0 31 5d 2c 20 26 62 29 20 29 20 72 65 74 75 72 6e  1], &b) ) return
17ec0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
17ed0 20 20 69 66 28 20 62 20 29 7b 0a 20 20 20 20 20    if( b ){.     
17ee0 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 28 53 51     flags &= ~(SQ
17ef0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
17f00 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
17f10 43 52 45 41 54 45 29 3b 0a 20 20 20 20 20 20 20  CREATE);.       
17f20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45   flags |= SQLITE
17f30 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a  _OPEN_READONLY;.
17f40 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
17f50 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53       flags &= ~S
17f60 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
17f70 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 66 6c 61  NLY;.        fla
17f80 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45  gs |= SQLITE_OPE
17f90 4e 5f 52 45 41 44 57 52 49 54 45 3b 0a 20 20 20  N_READWRITE;.   
17fa0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
17fb0 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20  f( strcmp(zArg, 
17fc0 22 2d 63 72 65 61 74 65 22 29 3d 3d 30 20 29 7b  "-create")==0 ){
17fd0 0a 20 20 20 20 20 20 69 6e 74 20 62 3b 0a 20 20  .      int b;.  
17fe0 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42      if( Tcl_GetB
17ff0 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
18000 74 65 72 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c  terp, objv[i+1],
18010 20 26 62 29 20 29 20 72 65 74 75 72 6e 20 54 43   &b) ) return TC
18020 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 69  L_ERROR;.      i
18030 66 28 20 62 20 26 26 20 28 66 6c 61 67 73 20 26  f( b && (flags &
18040 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
18050 44 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20  DONLY)==0 ){.   
18060 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51       flags |= SQ
18070 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
18080 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
18090 20 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20         flags &= 
180a0 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  ~SQLITE_OPEN_CRE
180b0 41 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ATE;.      }.   
180c0 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
180d0 70 28 7a 41 72 67 2c 20 22 2d 6e 6f 6d 75 74 65  p(zArg, "-nomute
180e0 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  x")==0 ){.      
180f0 69 6e 74 20 62 3b 0a 20 20 20 20 20 20 69 66 28  int b;.      if(
18100 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46   Tcl_GetBooleanF
18110 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
18120 62 6a 76 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20  bjv[i+1], &b) ) 
18130 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
18140 3b 0a 20 20 20 20 20 20 69 66 28 20 62 20 29 7b  ;.      if( b ){
18150 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c  .        flags |
18160 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f  = SQLITE_OPEN_NO
18170 4d 55 54 45 58 3b 0a 20 20 20 20 20 20 20 20 66  MUTEX;.        f
18180 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
18190 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 3b 0a  OPEN_FULLMUTEX;.
181a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
181b0 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53       flags &= ~S
181c0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54  QLITE_OPEN_NOMUT
181d0 45 58 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EX;.      }.    
181e0 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
181f0 28 7a 41 72 67 2c 20 22 2d 66 75 6c 6c 6d 75 74  (zArg, "-fullmut
18200 65 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ex")==0 ){.     
18210 20 69 6e 74 20 62 3b 0a 20 20 20 20 20 20 69 66   int b;.      if
18220 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e  ( Tcl_GetBoolean
18230 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
18240 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 62 29 20 29  objv[i+1], &b) )
18250 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
18260 52 3b 0a 20 20 20 20 20 20 69 66 28 20 62 20 29  R;.      if( b )
18270 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  {.        flags 
18280 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46  |= SQLITE_OPEN_F
18290 55 4c 4c 4d 55 54 45 58 3b 0a 20 20 20 20 20 20  ULLMUTEX;.      
182a0 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49    flags &= ~SQLI
182b0 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 3b  TE_OPEN_NOMUTEX;
182c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
182d0 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e        flags &= ~
182e0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c  SQLITE_OPEN_FULL
182f0 4d 55 54 45 58 3b 0a 20 20 20 20 20 20 7d 0a 20  MUTEX;.      }. 
18300 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
18310 63 6d 70 28 7a 41 72 67 2c 20 22 2d 75 72 69 22  cmp(zArg, "-uri"
18320 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
18330 74 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20 54  t b;.      if( T
18340 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f  cl_GetBooleanFro
18350 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
18360 76 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20 72 65  v[i+1], &b) ) re
18370 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
18380 20 20 20 20 20 20 69 66 28 20 62 20 29 7b 0a 20        if( b ){. 
18390 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20         flags |= 
183a0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b  SQLITE_OPEN_URI;
183b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
183c0 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e        flags &= ~
183d0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b  SQLITE_OPEN_URI;
183e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
183f0 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  se{.      Tcl_Ap
18400 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
18410 70 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69  p, "unknown opti
18420 6f 6e 3a 20 22 2c 20 7a 41 72 67 2c 20 28 63 68  on: ", zArg, (ch
18430 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 65  ar*)0);.      re
18440 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
18450 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
18460 6f 62 6a 63 3c 33 20 7c 7c 20 28 6f 62 6a 63 26  objc<3 || (objc&
18470 31 29 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c  1)!=1 ){.    Tcl
18480 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
18490 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 0a  terp, 1, objv, .
184a0 20 20 20 20 20 20 22 48 41 4e 44 4c 45 20 46 49        "HANDLE FI
184b0 4c 45 4e 41 4d 45 20 3f 2d 76 66 73 20 56 46 53  LENAME ?-vfs VFS
184c0 4e 41 4d 45 3f 20 3f 2d 72 65 61 64 6f 6e 6c 79  NAME? ?-readonly
184d0 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d 63 72 65 61   BOOLEAN? ?-crea
184e0 74 65 20 42 4f 4f 4c 45 41 4e 3f 22 0a 20 20 20  te BOOLEAN?".   
184f0 20 20 20 22 20 3f 2d 6e 6f 6d 75 74 65 78 20 42     " ?-nomutex B
18500 4f 4f 4c 45 41 4e 3f 20 3f 2d 66 75 6c 6c 6d 75  OOLEAN? ?-fullmu
18510 74 65 78 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d 75  tex BOOLEAN? ?-u
18520 72 69 20 42 4f 4f 4c 45 41 4e 3f 22 0a 23 69 66  ri BOOLEAN?".#if
18530 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
18540 48 41 53 5f 43 4f 44 45 43 29 20 26 26 20 21 64  HAS_CODEC) && !d
18550 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
18560 49 54 5f 43 4f 44 45 43 5f 46 52 4f 4d 5f 54 43  IT_CODEC_FROM_TC
18570 4c 29 0a 20 20 20 20 20 20 22 20 3f 2d 6b 65 79  L).      " ?-key
18580 20 43 4f 44 45 43 4b 45 59 3f 22 0a 23 65 6e 64   CODECKEY?".#end
18590 69 66 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 65  if.    );.    re
185a0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
185b0 20 20 7d 0a 20 20 7a 45 72 72 4d 73 67 20 3d 20    }.  zErrMsg = 
185c0 30 3b 0a 20 20 70 20 3d 20 28 53 71 6c 69 74 65  0;.  p = (Sqlite
185d0 44 62 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73  Db*)Tcl_Alloc( s
185e0 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69  izeof(*p) );.  i
185f0 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 54  f( p==0 ){.    T
18600 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
18610 65 72 70 2c 20 28 63 68 61 72 20 2a 29 22 6d 61  erp, (char *)"ma
18620 6c 6c 6f 63 20 66 61 69 6c 65 64 22 2c 20 54 43  lloc failed", TC
18630 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72  L_STATIC);.    r
18640 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
18650 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 2c  .  }.  memset(p,
18660 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b   0, sizeof(*p));
18670 0a 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47  .  zFile = Tcl_G
18680 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
18690 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 7a  objv[2], 0);.  z
186a0 46 69 6c 65 20 3d 20 54 63 6c 5f 54 72 61 6e 73  File = Tcl_Trans
186b0 6c 61 74 65 46 69 6c 65 4e 61 6d 65 28 69 6e 74  lateFileName(int
186c0 65 72 70 2c 20 7a 46 69 6c 65 2c 20 26 74 72 61  erp, zFile, &tra
186d0 6e 73 6c 61 74 65 64 46 69 6c 65 6e 61 6d 65 29  nslatedFilename)
186e0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
186f0 5f 6f 70 65 6e 5f 76 32 28 7a 46 69 6c 65 2c 20  _open_v2(zFile, 
18700 26 70 2d 3e 64 62 2c 20 66 6c 61 67 73 2c 20 7a  &p->db, flags, z
18710 56 66 73 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72  Vfs);.  Tcl_DStr
18720 69 6e 67 46 72 65 65 28 26 74 72 61 6e 73 6c 61  ingFree(&transla
18730 74 65 64 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  tedFilename);.  
18740 69 66 28 20 70 2d 3e 64 62 20 29 7b 0a 20 20 20  if( p->db ){.   
18750 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
18760 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
18770 70 2d 3e 64 62 29 20 29 7b 0a 20 20 20 20 20 20  p->db) ){.      
18780 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
18790 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20  3_mprintf("%s", 
187a0 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
187b0 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 73 71  ->db));.      sq
187c0 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64  lite3_close(p->d
187d0 62 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64 62 20  b);.      p->db 
187e0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 0;.    }.  }el
187f0 73 65 7b 0a 20 20 20 20 7a 45 72 72 4d 73 67 20  se{.    zErrMsg 
18800 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
18810 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f  f("%s", sqlite3_
18820 65 72 72 73 74 72 28 72 63 29 29 3b 0a 20 20 7d  errstr(rc));.  }
18830 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
18840 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 29 20 26  ITE_HAS_CODEC) &
18850 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
18860 45 5f 4f 4d 49 54 5f 43 4f 44 45 43 5f 46 52 4f  E_OMIT_CODEC_FRO
18870 4d 5f 54 43 4c 29 0a 20 20 69 66 28 20 70 2d 3e  M_TCL).  if( p->
18880 64 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  db ){.    sqlite
18890 33 5f 6b 65 79 28 70 2d 3e 64 62 2c 20 70 4b 65  3_key(p->db, pKe
188a0 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 7d 0a 23 65  y, nKey);.  }.#e
188b0 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 64 62  ndif.  if( p->db
188c0 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53  ==0 ){.    Tcl_S
188d0 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
188e0 20 7a 45 72 72 4d 73 67 2c 20 54 43 4c 5f 56 4f   zErrMsg, TCL_VO
188f0 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 54 63 6c  LATILE);.    Tcl
18900 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 29 3b  _Free((char*)p);
18910 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
18920 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  e(zErrMsg);.    
18930 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
18940 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 78 53 74  ;.  }.  p->maxSt
18950 6d 74 20 3d 20 4e 55 4d 5f 50 52 45 50 41 52 45  mt = NUM_PREPARE
18960 44 5f 53 54 4d 54 53 3b 0a 20 20 70 2d 3e 6f 70  D_STMTS;.  p->op
18970 65 6e 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 20  enFlags = flags 
18980 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52  & SQLITE_OPEN_UR
18990 49 3b 0a 20 20 70 2d 3e 69 6e 74 65 72 70 20 3d  I;.  p->interp =
189a0 20 69 6e 74 65 72 70 3b 0a 20 20 7a 41 72 67 20   interp;.  zArg 
189b0 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
189c0 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20  romObj(objv[1], 
189d0 30 29 3b 0a 20 20 69 66 28 20 44 62 55 73 65 4e  0);.  if( DbUseN
189e0 72 65 28 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f  re() ){.    Tcl_
189f0 4e 52 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28  NRCreateCommand(
18a00 69 6e 74 65 72 70 2c 20 7a 41 72 67 2c 20 44 62  interp, zArg, Db
18a10 4f 62 6a 43 6d 64 41 64 61 70 74 6f 72 2c 20 44  ObjCmdAdaptor, D
18a20 62 4f 62 6a 43 6d 64 2c 0a 20 20 20 20 20 20 20  bObjCmd,.       
18a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a40 20 28 63 68 61 72 2a 29 70 2c 20 44 62 44 65 6c   (char*)p, DbDel
18a50 65 74 65 43 6d 64 29 3b 0a 20 20 7d 65 6c 73 65  eteCmd);.  }else
18a60 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  {.    Tcl_Create
18a70 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
18a80 70 2c 20 7a 41 72 67 2c 20 44 62 4f 62 6a 43 6d  p, zArg, DbObjCm
18a90 64 2c 20 28 63 68 61 72 2a 29 70 2c 20 44 62 44  d, (char*)p, DbD
18aa0 65 6c 65 74 65 43 6d 64 29 3b 0a 20 20 7d 0a 20  eleteCmd);.  }. 
18ab0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
18ac0 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65  }../*.** Provide
18ad0 20 61 20 64 75 6d 6d 79 20 54 63 6c 5f 49 6e 69   a dummy Tcl_Ini
18ae0 74 53 74 75 62 73 20 69 66 20 77 65 20 61 72 65  tStubs if we are
18af0 20 75 73 69 6e 67 20 74 68 69 73 20 61 73 20 61   using this as a
18b00 20 73 74 61 74 69 63 0a 2a 2a 20 6c 69 62 72 61   static.** libra
18b10 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 55  ry..*/.#ifndef U
18b20 53 45 5f 54 43 4c 5f 53 54 55 42 53 0a 23 20 75  SE_TCL_STUBS.# u
18b30 6e 64 65 66 20 20 54 63 6c 5f 49 6e 69 74 53 74  ndef  Tcl_InitSt
18b40 75 62 73 0a 23 20 64 65 66 69 6e 65 20 54 63 6c  ubs.# define Tcl
18b50 5f 49 6e 69 74 53 74 75 62 73 28 61 2c 62 2c 63  _InitStubs(a,b,c
18b60 29 20 54 43 4c 5f 56 45 52 53 49 4f 4e 0a 23 65  ) TCL_VERSION.#e
18b70 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  ndif../*.** Make
18b80 20 73 75 72 65 20 77 65 20 68 61 76 65 20 61 20   sure we have a 
18b90 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 20  PACKAGE_VERSION 
18ba0 6d 61 63 72 6f 20 64 65 66 69 6e 65 64 2e 20 20  macro defined.  
18bb0 54 68 69 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  This will be.** 
18bc0 64 65 66 69 6e 65 64 20 61 75 74 6f 6d 61 74 69  defined automati
18bd0 63 61 6c 6c 79 20 62 79 20 74 68 65 20 54 45 41  cally by the TEA
18be0 20 6d 61 6b 65 66 69 6c 65 2e 20 20 42 75 74 20   makefile.  But 
18bf0 6f 74 68 65 72 20 6d 61 6b 65 66 69 6c 65 73 0a  other makefiles.
18c00 2a 2a 20 64 6f 20 6e 6f 74 20 64 65 66 69 6e 65  ** do not define
18c10 20 69 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20   it..*/.#ifndef 
18c20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 0a  PACKAGE_VERSION.
18c30 23 20 64 65 66 69 6e 65 20 50 41 43 4b 41 47 45  # define PACKAGE
18c40 5f 56 45 52 53 49 4f 4e 20 53 51 4c 49 54 45 5f  _VERSION SQLITE_
18c50 56 45 52 53 49 4f 4e 0a 23 65 6e 64 69 66 0a 0a  VERSION.#endif..
18c60 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
18c70 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2a   this module..**
18c80 0a 2a 2a 20 54 68 69 73 20 54 63 6c 20 6d 6f 64  .** This Tcl mod
18c90 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c  ule contains onl
18ca0 79 20 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 54  y a single new T
18cb0 63 6c 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 64  cl command named
18cc0 20 22 73 71 6c 69 74 65 22 2e 0a 2a 2a 20 28 48   "sqlite"..** (H
18cd0 65 6e 63 65 20 74 68 65 72 65 20 69 73 20 6e 6f  ence there is no
18ce0 20 6e 61 6d 65 73 70 61 63 65 2e 20 20 54 68 65   namespace.  The
18cf0 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69  re is no point i
18d00 6e 20 75 73 69 6e 67 20 61 20 6e 61 6d 65 73 70  n using a namesp
18d10 61 63 65 0a 2a 2a 20 69 66 20 74 68 65 20 65 78  ace.** if the ex
18d20 74 65 6e 73 69 6f 6e 20 6f 6e 6c 79 20 73 75 70  tension only sup
18d30 70 6c 69 65 73 20 6f 6e 65 20 6e 65 77 20 6e 61  plies one new na
18d40 6d 65 21 29 20 20 54 68 65 20 22 73 71 6c 69 74  me!)  The "sqlit
18d50 65 22 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a  e" command is.**
18d60 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20 61 20   used to open a 
18d70 6e 65 77 20 53 51 4c 69 74 65 20 64 61 74 61 62  new SQLite datab
18d80 61 73 65 2e 20 20 53 65 65 20 74 68 65 20 44 62  ase.  See the Db
18d90 4d 61 69 6e 28 29 20 72 6f 75 74 69 6e 65 20 61  Main() routine a
18da0 62 6f 76 65 0a 2a 2a 20 66 6f 72 20 61 64 64 69  bove.** for addi
18db0 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
18dc0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 58  on..**.** The EX
18dd0 54 45 52 4e 20 6d 61 63 72 6f 73 20 61 72 65 20  TERN macros are 
18de0 72 65 71 75 69 72 65 64 20 62 79 20 54 43 4c 20  required by TCL 
18df0 69 6e 20 6f 72 64 65 72 20 74 6f 20 77 6f 72 6b  in order to work
18e00 20 6f 6e 20 77 69 6e 64 6f 77 73 2e 0a 2a 2f 0a   on windows..*/.
18e10 45 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74  EXTERN int Sqlit
18e20 65 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  e3_Init(Tcl_Inte
18e30 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 69  rp *interp){.  i
18e40 6e 74 20 72 63 20 3d 20 54 63 6c 5f 49 6e 69 74  nt rc = Tcl_Init
18e50 53 74 75 62 73 28 69 6e 74 65 72 70 2c 20 22 38  Stubs(interp, "8
18e60 2e 34 22 2c 20 30 29 20 3f 20 54 43 4c 5f 4f 4b  .4", 0) ? TCL_OK
18e70 20 3a 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20   : TCL_ERROR;.  
18e80 69 66 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29  if( rc==TCL_OK )
18e90 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  {.    Tcl_Create
18ea0 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
18eb0 70 2c 20 22 73 71 6c 69 74 65 33 22 2c 20 28 54  p, "sqlite3", (T
18ec0 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 2a 29 44  cl_ObjCmdProc*)D
18ed0 62 4d 61 69 6e 2c 20 30 2c 20 30 29 3b 0a 23 69  bMain, 0, 0);.#i
18ee0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 33 5f 53  fndef SQLITE_3_S
18ef0 55 46 46 49 58 5f 4f 4e 4c 59 0a 20 20 20 20 2f  UFFIX_ONLY.    /
18f00 2a 20 54 68 65 20 22 73 71 6c 69 74 65 22 20 61  * The "sqlite" a
18f10 6c 69 61 73 20 69 73 20 75 6e 64 6f 63 75 6d 65  lias is undocume
18f20 6e 74 65 64 2e 20 20 49 74 20 69 73 20 68 65 72  nted.  It is her
18f30 65 20 6f 6e 6c 79 20 74 6f 20 73 75 70 70 6f 72  e only to suppor
18f40 74 0a 20 20 20 20 2a 2a 20 6c 65 67 61 63 79 20  t.    ** legacy 
18f50 73 63 72 69 70 74 73 2e 20 20 41 6c 6c 20 6e 65  scripts.  All ne
18f60 77 20 73 63 72 69 70 74 73 20 73 68 6f 75 6c 64  w scripts should
18f70 20 75 73 65 20 6f 6e 6c 79 20 74 68 65 20 22 73   use only the "s
18f80 71 6c 69 74 65 33 22 0a 20 20 20 20 2a 2a 20 63  qlite3".    ** c
18f90 6f 6d 6d 61 6e 64 2e 20 2a 2f 0a 20 20 20 20 54  ommand. */.    T
18fa0 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
18fb0 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  and(interp, "sql
18fc0 69 74 65 22 2c 20 28 54 63 6c 5f 4f 62 6a 43 6d  ite", (Tcl_ObjCm
18fd0 64 50 72 6f 63 2a 29 44 62 4d 61 69 6e 2c 20 30  dProc*)DbMain, 0
18fe0 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  , 0);.#endif.   
18ff0 20 72 63 20 3d 20 54 63 6c 5f 50 6b 67 50 72 6f   rc = Tcl_PkgPro
19000 76 69 64 65 28 69 6e 74 65 72 70 2c 20 22 73 71  vide(interp, "sq
19010 6c 69 74 65 33 22 2c 20 50 41 43 4b 41 47 45 5f  lite3", PACKAGE_
19020 56 45 52 53 49 4f 4e 29 3b 0a 20 20 7d 0a 20 20  VERSION);.  }.  
19030 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 45 58 54  return rc;.}.EXT
19040 45 52 4e 20 69 6e 74 20 54 63 6c 73 71 6c 69 74  ERN int Tclsqlit
19050 65 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  e3_Init(Tcl_Inte
19060 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74  rp *interp){ ret
19070 75 72 6e 20 53 71 6c 69 74 65 33 5f 49 6e 69 74  urn Sqlite3_Init
19080 28 69 6e 74 65 72 70 29 3b 20 7d 0a 45 58 54 45  (interp); }.EXTE
19090 52 4e 20 69 6e 74 20 53 71 6c 69 74 65 33 5f 55  RN int Sqlite3_U
190a0 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72 70  nload(Tcl_Interp
190b0 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c   *interp, int fl
190c0 61 67 73 29 7b 20 72 65 74 75 72 6e 20 54 43 4c  ags){ return TCL
190d0 5f 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e  _OK; }.EXTERN in
190e0 74 20 54 63 6c 73 71 6c 69 74 65 33 5f 55 6e 6c  t Tclsqlite3_Unl
190f0 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  oad(Tcl_Interp *
19100 69 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c 61 67  interp, int flag
19110 73 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  s){ return TCL_O
19120 4b 3b 20 7d 0a 0a 2f 2a 20 42 65 63 61 75 73 65  K; }../* Because
19130 20 69 74 20 61 63 63 65 73 73 65 73 20 74 68 65   it accesses the
19140 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 61 6e 64   file-system and
19150 20 75 73 65 73 20 70 65 72 73 69 73 74 65 6e 74   uses persistent
19160 20 73 74 61 74 65 2c 20 53 51 4c 69 74 65 0a 2a   state, SQLite.*
19170 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65  * is not conside
19180 72 65 64 20 61 70 70 72 6f 70 72 69 61 74 65 20  red appropriate 
19190 66 6f 72 20 73 61 66 65 20 69 6e 74 65 72 70 72  for safe interpr
191a0 65 74 65 72 73 2e 20 20 48 65 6e 63 65 2c 20 77  eters.  Hence, w
191b0 65 20 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 5f  e cause.** the _
191c0 53 61 66 65 49 6e 69 74 28 29 20 69 6e 74 65 72  SafeInit() inter
191d0 66 61 63 65 73 20 72 65 74 75 72 6e 20 54 43 4c  faces return TCL
191e0 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 45 58 54 45 52  _ERROR..*/.EXTER
191f0 4e 20 69 6e 74 20 53 71 6c 69 74 65 33 5f 53 61  N int Sqlite3_Sa
19200 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  feInit(Tcl_Inter
19210 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75  p *interp){ retu
19220 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 20 7d 0a  rn TCL_ERROR; }.
19230 45 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74  EXTERN int Sqlit
19240 65 33 5f 53 61 66 65 55 6e 6c 6f 61 64 28 54 63  e3_SafeUnload(Tc
19250 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
19260 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 72 65 74  , int flags){ret
19270 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 7d 0a  urn TCL_ERROR;}.
19280 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
19290 45 5f 33 5f 53 55 46 46 49 58 5f 4f 4e 4c 59 0a  E_3_SUFFIX_ONLY.
192a0 69 6e 74 20 53 71 6c 69 74 65 5f 49 6e 69 74 28  int Sqlite_Init(
192b0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
192c0 72 70 29 7b 20 72 65 74 75 72 6e 20 53 71 6c 69  rp){ return Sqli
192d0 74 65 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  te3_Init(interp)
192e0 3b 20 7d 0a 69 6e 74 20 54 63 6c 73 71 6c 69 74  ; }.int Tclsqlit
192f0 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  e_Init(Tcl_Inter
19300 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75  p *interp){ retu
19310 72 6e 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28  rn Sqlite3_Init(
19320 69 6e 74 65 72 70 29 3b 20 7d 0a 69 6e 74 20 53  interp); }.int S
19330 71 6c 69 74 65 5f 55 6e 6c 6f 61 64 28 54 63 6c  qlite_Unload(Tcl
19340 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
19350 20 69 6e 74 20 66 6c 61 67 73 29 7b 20 72 65 74   int flags){ ret
19360 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 69 6e  urn TCL_OK; }.in
19370 74 20 54 63 6c 73 71 6c 69 74 65 5f 55 6e 6c 6f  t Tclsqlite_Unlo
19380 61 64 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  ad(Tcl_Interp *i
19390 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c 61 67 73  nterp, int flags
193a0 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  ){ return TCL_OK
193b0 3b 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  ; }.#endif..#ifd
193c0 65 66 20 54 43 4c 53 48 0a 2f 2a 2a 2a 2a 2a 2a  ef TCLSH./******
193d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
193e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
193f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19410 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f  *******.** All o
19420 66 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  f the code that 
19430 66 6f 6c 6c 6f 77 73 20 69 73 20 75 73 65 64 20  follows is used 
19440 74 6f 20 62 75 69 6c 64 20 73 74 61 6e 64 61 6c  to build standal
19450 6f 6e 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  one TCL interpre
19460 74 65 72 73 0a 2a 2a 20 74 68 61 74 20 61 72 65  ters.** that are
19470 20 73 74 61 74 69 63 61 6c 6c 79 20 6c 69 6e 6b   statically link
19480 65 64 20 77 69 74 68 20 53 51 4c 69 74 65 2e 20  ed with SQLite. 
19490 20 45 6e 61 62 6c 65 20 74 68 65 73 65 20 62 79   Enable these by
194a0 20 63 6f 6d 70 69 6c 69 6e 67 0a 2a 2a 20 77 69   compiling.** wi
194b0 74 68 20 2d 44 54 43 4c 53 48 3d 6e 20 77 68 65  th -DTCLSH=n whe
194c0 72 65 20 6e 20 63 61 6e 20 62 65 20 31 20 6f 72  re n can be 1 or
194d0 20 32 2e 20 20 41 6e 20 6e 20 6f 66 20 31 20 67   2.  An n of 1 g
194e0 65 6e 65 72 61 74 65 73 20 61 20 73 74 61 6e 64  enerates a stand
194f0 61 72 64 0a 2a 2a 20 74 63 6c 73 68 20 62 75 74  ard.** tclsh but
19500 20 77 69 74 68 20 53 51 4c 69 74 65 20 62 75 69   with SQLite bui
19510 6c 74 20 69 6e 2e 20 20 41 6e 20 6e 20 6f 66 20  lt in.  An n of 
19520 32 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20  2 generates the 
19530 53 51 4c 69 74 65 20 73 70 61 63 65 0a 2a 2a 20  SQLite space.** 
19540 61 6e 61 6c 79 73 69 73 20 70 72 6f 67 72 61 6d  analysis program
19550 2e 0a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65  ..*/..#if define
19560 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 7c  d(SQLITE_TEST) |
19570 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
19580 5f 54 43 4c 4d 44 35 29 0a 2f 2a 0a 20 2a 20 54  _TCLMD5)./*. * T
19590 68 69 73 20 63 6f 64 65 20 69 6d 70 6c 65 6d 65  his code impleme
195a0 6e 74 73 20 74 68 65 20 4d 44 35 20 6d 65 73 73  nts the MD5 mess
195b0 61 67 65 2d 64 69 67 65 73 74 20 61 6c 67 6f 72  age-digest algor
195c0 69 74 68 6d 2e 0a 20 2a 20 54 68 65 20 61 6c 67  ithm.. * The alg
195d0 6f 72 69 74 68 6d 20 69 73 20 64 75 65 20 74 6f  orithm is due to
195e0 20 52 6f 6e 20 52 69 76 65 73 74 2e 20 20 54 68   Ron Rivest.  Th
195f0 69 73 20 63 6f 64 65 20 77 61 73 0a 20 2a 20 77  is code was. * w
19600 72 69 74 74 65 6e 20 62 79 20 43 6f 6c 69 6e 20  ritten by Colin 
19610 50 6c 75 6d 62 20 69 6e 20 31 39 39 33 2c 20 6e  Plumb in 1993, n
19620 6f 20 63 6f 70 79 72 69 67 68 74 20 69 73 20 63  o copyright is c
19630 6c 61 69 6d 65 64 2e 0a 20 2a 20 54 68 69 73 20  laimed.. * This 
19640 63 6f 64 65 20 69 73 20 69 6e 20 74 68 65 20 70  code is in the p
19650 75 62 6c 69 63 20 64 6f 6d 61 69 6e 3b 20 64 6f  ublic domain; do
19660 20 77 69 74 68 20 69 74 20 77 68 61 74 20 79 6f   with it what yo
19670 75 20 77 69 73 68 2e 0a 20 2a 0a 20 2a 20 45 71  u wish.. *. * Eq
19680 75 69 76 61 6c 65 6e 74 20 63 6f 64 65 20 69 73  uivalent code is
19690 20 61 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20   available from 
196a0 52 53 41 20 44 61 74 61 20 53 65 63 75 72 69 74  RSA Data Securit
196b0 79 2c 20 49 6e 63 2e 0a 20 2a 20 54 68 69 73 20  y, Inc.. * This 
196c0 63 6f 64 65 20 68 61 73 20 62 65 65 6e 20 74 65  code has been te
196d0 73 74 65 64 20 61 67 61 69 6e 73 74 20 74 68 61  sted against tha
196e0 74 2c 20 61 6e 64 20 69 73 20 65 71 75 69 76 61  t, and is equiva
196f0 6c 65 6e 74 2c 0a 20 2a 20 65 78 63 65 70 74 20  lent,. * except 
19700 74 68 61 74 20 79 6f 75 20 64 6f 6e 27 74 20 6e  that you don't n
19710 65 65 64 20 74 6f 20 69 6e 63 6c 75 64 65 20 74  eed to include t
19720 77 6f 20 70 61 67 65 73 20 6f 66 20 6c 65 67 61  wo pages of lega
19730 6c 65 73 65 0a 20 2a 20 77 69 74 68 20 65 76 65  lese. * with eve
19740 72 79 20 63 6f 70 79 2e 0a 20 2a 0a 20 2a 20 54  ry copy.. *. * T
19750 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6d 65  o compute the me
19760 73 73 61 67 65 20 64 69 67 65 73 74 20 6f 66 20  ssage digest of 
19770 61 20 63 68 75 6e 6b 20 6f 66 20 62 79 74 65 73  a chunk of bytes
19780 2c 20 64 65 63 6c 61 72 65 20 61 6e 0a 20 2a 20  , declare an. * 
19790 4d 44 35 43 6f 6e 74 65 78 74 20 73 74 72 75 63  MD5Context struc
197a0 74 75 72 65 2c 20 70 61 73 73 20 69 74 20 74 6f  ture, pass it to
197b0 20 4d 44 35 49 6e 69 74 2c 20 63 61 6c 6c 20 4d   MD5Init, call M
197c0 44 35 55 70 64 61 74 65 20 61 73 0a 20 2a 20 6e  D5Update as. * n
197d0 65 65 64 65 64 20 6f 6e 20 62 75 66 66 65 72 73  eeded on buffers
197e0 20 66 75 6c 6c 20 6f 66 20 62 79 74 65 73 2c 20   full of bytes, 
197f0 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 4d 44  and then call MD
19800 35 46 69 6e 61 6c 2c 20 77 68 69 63 68 0a 20 2a  5Final, which. *
19810 20 77 69 6c 6c 20 66 69 6c 6c 20 61 20 73 75 70   will fill a sup
19820 70 6c 69 65 64 20 31 36 2d 62 79 74 65 20 61 72  plied 16-byte ar
19830 72 61 79 20 77 69 74 68 20 74 68 65 20 64 69 67  ray with the dig
19840 65 73 74 2e 0a 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20  est.. */../*. * 
19850 49 66 20 63 6f 6d 70 69 6c 65 64 20 6f 6e 20 61  If compiled on a
19860 20 6d 61 63 68 69 6e 65 20 74 68 61 74 20 64 6f   machine that do
19870 65 73 6e 27 74 20 68 61 76 65 20 61 20 33 32 2d  esn't have a 32-
19880 62 69 74 20 69 6e 74 65 67 65 72 2c 0a 20 2a 20  bit integer,. * 
19890 79 6f 75 20 6a 75 73 74 20 73 65 74 20 22 75 69  you just set "ui
198a0 6e 74 33 32 22 20 74 6f 20 74 68 65 20 61 70 70  nt32" to the app
198b0 72 6f 70 72 69 61 74 65 20 64 61 74 61 74 79 70  ropriate datatyp
198c0 65 20 66 6f 72 20 61 6e 0a 20 2a 20 75 6e 73 69  e for an. * unsi
198d0 67 6e 65 64 20 33 32 2d 62 69 74 20 69 6e 74 65  gned 32-bit inte
198e0 67 65 72 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  ger.  For exampl
198f0 65 3a 0a 20 2a 0a 20 2a 20 20 20 20 20 20 20 63  e:. *. *       c
19900 63 20 2d 44 75 69 6e 74 33 32 3d 27 75 6e 73 69  c -Duint32='unsi
19910 67 6e 65 64 20 6c 6f 6e 67 27 20 6d 64 35 2e 63  gned long' md5.c
19920 0a 20 2a 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20  . *. */.#ifndef 
19930 75 69 6e 74 33 32 0a 23 20 20 64 65 66 69 6e 65  uint32.#  define
19940 20 75 69 6e 74 33 32 20 75 6e 73 69 67 6e 65 64   uint32 unsigned
19950 20 69 6e 74 0a 23 65 6e 64 69 66 0a 0a 73 74 72   int.#endif..str
19960 75 63 74 20 4d 44 35 43 6f 6e 74 65 78 74 20 7b  uct MD5Context {
19970 0a 20 20 69 6e 74 20 69 73 49 6e 69 74 3b 0a 20  .  int isInit;. 
19980 20 75 69 6e 74 33 32 20 62 75 66 5b 34 5d 3b 0a   uint32 buf[4];.
19990 20 20 75 69 6e 74 33 32 20 62 69 74 73 5b 32 5d    uint32 bits[2]
199a0 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
199b0 72 20 69 6e 5b 36 34 5d 3b 0a 7d 3b 0a 74 79 70  r in[64];.};.typ
199c0 65 64 65 66 20 73 74 72 75 63 74 20 4d 44 35 43  edef struct MD5C
199d0 6f 6e 74 65 78 74 20 4d 44 35 43 6f 6e 74 65 78  ontext MD5Contex
199e0 74 3b 0a 0a 2f 2a 0a 20 2a 20 4e 6f 74 65 3a 20  t;../*. * Note: 
199f0 74 68 69 73 20 63 6f 64 65 20 69 73 20 68 61 72  this code is har
19a00 6d 6c 65 73 73 20 6f 6e 20 6c 69 74 74 6c 65 2d  mless on little-
19a10 65 6e 64 69 61 6e 20 6d 61 63 68 69 6e 65 73 2e  endian machines.
19a20 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  . */.static void
19a30 20 62 79 74 65 52 65 76 65 72 73 65 20 28 75 6e   byteReverse (un
19a40 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66  signed char *buf
19a50 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 73  , unsigned longs
19a60 29 7b 0a 20 20 20 20 20 20 20 20 75 69 6e 74 33  ){.        uint3
19a70 32 20 74 3b 0a 20 20 20 20 20 20 20 20 64 6f 20  2 t;.        do 
19a80 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
19a90 20 20 74 20 3d 20 28 75 69 6e 74 33 32 29 28 28    t = (uint32)((
19aa0 75 6e 73 69 67 6e 65 64 29 62 75 66 5b 33 5d 3c  unsigned)buf[3]<
19ab0 3c 38 20 7c 20 62 75 66 5b 32 5d 29 20 3c 3c 20  <8 | buf[2]) << 
19ac0 31 36 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  16 |.           
19ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ae0 20 28 28 75 6e 73 69 67 6e 65 64 29 62 75 66 5b   ((unsigned)buf[
19af0 31 5d 3c 3c 38 20 7c 20 62 75 66 5b 30 5d 29 3b  1]<<8 | buf[0]);
19b00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19b10 20 2a 28 75 69 6e 74 33 32 20 2a 29 62 75 66 20   *(uint32 *)buf 
19b20 3d 20 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = t;.           
19b30 20 20 20 20 20 62 75 66 20 2b 3d 20 34 3b 0a 20       buf += 4;. 
19b40 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65 20 28         } while (
19b50 2d 2d 6c 6f 6e 67 73 29 3b 0a 7d 0a 2f 2a 20 54  --longs);.}./* T
19b60 68 65 20 66 6f 75 72 20 63 6f 72 65 20 66 75 6e  he four core fun
19b70 63 74 69 6f 6e 73 20 2d 20 46 31 20 69 73 20 6f  ctions - F1 is o
19b80 70 74 69 6d 69 7a 65 64 20 73 6f 6d 65 77 68 61  ptimized somewha
19b90 74 20 2a 2f 0a 0a 2f 2a 20 23 64 65 66 69 6e 65  t */../* #define
19ba0 20 46 31 28 78 2c 20 79 2c 20 7a 29 20 28 78 20   F1(x, y, z) (x 
19bb0 26 20 79 20 7c 20 7e 78 20 26 20 7a 29 20 2a 2f  & y | ~x & z) */
19bc0 0a 23 64 65 66 69 6e 65 20 46 31 28 78 2c 20 79  .#define F1(x, y
19bd0 2c 20 7a 29 20 28 7a 20 5e 20 28 78 20 26 20 28  , z) (z ^ (x & (
19be0 79 20 5e 20 7a 29 29 29 0a 23 64 65 66 69 6e 65  y ^ z))).#define
19bf0 20 46 32 28 78 2c 20 79 2c 20 7a 29 20 46 31 28   F2(x, y, z) F1(
19c00 7a 2c 20 78 2c 20 79 29 0a 23 64 65 66 69 6e 65  z, x, y).#define
19c10 20 46 33 28 78 2c 20 79 2c 20 7a 29 20 28 78 20   F3(x, y, z) (x 
19c20 5e 20 79 20 5e 20 7a 29 0a 23 64 65 66 69 6e 65  ^ y ^ z).#define
19c30 20 46 34 28 78 2c 20 79 2c 20 7a 29 20 28 79 20   F4(x, y, z) (y 
19c40 5e 20 28 78 20 7c 20 7e 7a 29 29 0a 0a 2f 2a 20  ^ (x | ~z))../* 
19c50 54 68 69 73 20 69 73 20 74 68 65 20 63 65 6e 74  This is the cent
19c60 72 61 6c 20 73 74 65 70 20 69 6e 20 74 68 65 20  ral step in the 
19c70 4d 44 35 20 61 6c 67 6f 72 69 74 68 6d 2e 20 2a  MD5 algorithm. *
19c80 2f 0a 23 64 65 66 69 6e 65 20 4d 44 35 53 54 45  /.#define MD5STE
19c90 50 28 66 2c 20 77 2c 20 78 2c 20 79 2c 20 7a 2c  P(f, w, x, y, z,
19ca0 20 64 61 74 61 2c 20 73 29 20 5c 0a 20 20 20 20   data, s) \.    
19cb0 20 20 20 20 28 20 77 20 2b 3d 20 66 28 78 2c 20      ( w += f(x, 
19cc0 79 2c 20 7a 29 20 2b 20 64 61 74 61 2c 20 20 77  y, z) + data,  w
19cd0 20 3d 20 77 3c 3c 73 20 7c 20 77 3e 3e 28 33 32   = w<<s | w>>(32
19ce0 2d 73 29 2c 20 20 77 20 2b 3d 20 78 20 29 0a 0a  -s),  w += x )..
19cf0 2f 2a 0a 20 2a 20 54 68 65 20 63 6f 72 65 20 6f  /*. * The core o
19d00 66 20 74 68 65 20 4d 44 35 20 61 6c 67 6f 72 69  f the MD5 algori
19d10 74 68 6d 2c 20 74 68 69 73 20 61 6c 74 65 72 73  thm, this alters
19d20 20 61 6e 20 65 78 69 73 74 69 6e 67 20 4d 44 35   an existing MD5
19d30 20 68 61 73 68 20 74 6f 0a 20 2a 20 72 65 66 6c   hash to. * refl
19d40 65 63 74 20 74 68 65 20 61 64 64 69 74 69 6f 6e  ect the addition
19d50 20 6f 66 20 31 36 20 6c 6f 6e 67 77 6f 72 64 73   of 16 longwords
19d60 20 6f 66 20 6e 65 77 20 64 61 74 61 2e 20 20 4d   of new data.  M
19d70 44 35 55 70 64 61 74 65 20 62 6c 6f 63 6b 73 0a  D5Update blocks.
19d80 20 2a 20 74 68 65 20 64 61 74 61 20 61 6e 64 20   * the data and 
19d90 63 6f 6e 76 65 72 74 73 20 62 79 74 65 73 20 69  converts bytes i
19da0 6e 74 6f 20 6c 6f 6e 67 77 6f 72 64 73 20 66 6f  nto longwords fo
19db0 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  r this routine..
19dc0 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
19dd0 4d 44 35 54 72 61 6e 73 66 6f 72 6d 28 75 69 6e  MD5Transform(uin
19de0 74 33 32 20 62 75 66 5b 34 5d 2c 20 63 6f 6e 73  t32 buf[4], cons
19df0 74 20 75 69 6e 74 33 32 20 69 6e 5b 31 36 5d 29  t uint32 in[16])
19e00 7b 0a 20 20 20 20 20 20 20 20 72 65 67 69 73 74  {.        regist
19e10 65 72 20 75 69 6e 74 33 32 20 61 2c 20 62 2c 20  er uint32 a, b, 
19e20 63 2c 20 64 3b 0a 0a 20 20 20 20 20 20 20 20 61  c, d;..        a
19e30 20 3d 20 62 75 66 5b 30 5d 3b 0a 20 20 20 20 20   = buf[0];.     
19e40 20 20 20 62 20 3d 20 62 75 66 5b 31 5d 3b 0a 20     b = buf[1];. 
19e50 20 20 20 20 20 20 20 63 20 3d 20 62 75 66 5b 32         c = buf[2
19e60 5d 3b 0a 20 20 20 20 20 20 20 20 64 20 3d 20 62  ];.        d = b
19e70 75 66 5b 33 5d 3b 0a 0a 20 20 20 20 20 20 20 20  uf[3];..        
19e80 4d 44 35 53 54 45 50 28 46 31 2c 20 61 2c 20 62  MD5STEP(F1, a, b
19e90 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 30 5d 2b 30  , c, d, in[ 0]+0
19ea0 78 64 37 36 61 61 34 37 38 2c 20 20 37 29 3b 0a  xd76aa478,  7);.
19eb0 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
19ec0 46 31 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20  F1, d, a, b, c, 
19ed0 69 6e 5b 20 31 5d 2b 30 78 65 38 63 37 62 37 35  in[ 1]+0xe8c7b75
19ee0 36 2c 20 31 32 29 3b 0a 20 20 20 20 20 20 20 20  6, 12);.        
19ef0 4d 44 35 53 54 45 50 28 46 31 2c 20 63 2c 20 64  MD5STEP(F1, c, d
19f00 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 32 5d 2b 30  , a, b, in[ 2]+0
19f10 78 32 34 32 30 37 30 64 62 2c 20 31 37 29 3b 0a  x242070db, 17);.
19f20 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
19f30 46 31 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20  F1, b, c, d, a, 
19f40 69 6e 5b 20 33 5d 2b 30 78 63 31 62 64 63 65 65  in[ 3]+0xc1bdcee
19f50 65 2c 20 32 32 29 3b 0a 20 20 20 20 20 20 20 20  e, 22);.        
19f60 4d 44 35 53 54 45 50 28 46 31 2c 20 61 2c 20 62  MD5STEP(F1, a, b
19f70 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 34 5d 2b 30  , c, d, in[ 4]+0
19f80 78 66 35 37 63 30 66 61 66 2c 20 20 37 29 3b 0a  xf57c0faf,  7);.
19f90 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
19fa0 46 31 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20  F1, d, a, b, c, 
19fb0 69 6e 5b 20 35 5d 2b 30 78 34 37 38 37 63 36 32  in[ 5]+0x4787c62
19fc0 61 2c 20 31 32 29 3b 0a 20 20 20 20 20 20 20 20  a, 12);.        
19fd0 4d 44 35 53 54 45 50 28 46 31 2c 20 63 2c 20 64  MD5STEP(F1, c, d
19fe0 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 36 5d 2b 30  , a, b, in[ 6]+0
19ff0 78 61 38 33 30 34 36 31 33 2c 20 31 37 29 3b 0a  xa8304613, 17);.
1a000 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
1a010 46 31 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20  F1, b, c, d, a, 
1a020 69 6e 5b 20 37 5d 2b 30 78 66 64 34 36 39 35 30  in[ 7]+0xfd46950
1a030 31 2c 20 32 32 29 3b 0a 20 20 20 20 20 20 20 20  1, 22);.        
1a040 4d 44 35 53 54 45 50 28 46 31 2c 20 61 2c 20 62  MD5STEP(F1, a, b
1a050 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 38 5d 2b 30  , c, d, in[ 8]+0
1a060 78 36 39 38 30 39 38 64 38 2c 20 20 37 29 3b 0a  x698098d8,  7);.
1a070 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
1a080 46 31 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20  F1, d, a, b, c, 
1a090 69 6e 5b 20 39 5d 2b 30 78 38 62 34 34 66 37 61  in[ 9]+0x8b44f7a
1a0a0 66 2c 20 31 32 29 3b 0a 20 20 20 20 20 20 20 20  f, 12);.        
1a0b0 4d 44 35 53 54 45 50 28 46 31 2c 20 63 2c 20 64  MD5STEP(F1, c, d
1a0c0 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 30 5d 2b 30  , a, b, in[10]+0
1a0d0 78 66 66 66 66 35 62 62 31 2c 20 31 37 29 3b 0a  xffff5bb1, 17);.
1a0e0 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
1a0f0 46 31 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20  F1, b, c, d, a, 
1a100 69 6e 5b 31 31 5d 2b 30 78 38 39 35 63 64 37 62  in[11]+0x895cd7b
1a110 65 2c 20 32 32 29 3b 0a 20 20 20 20 20 20 20 20  e, 22);.        
1a120 4d 44 35 53 54 45 50 28 46 31 2c 20 61 2c 20 62  MD5STEP(F1, a, b
1a130 2c 20 63 2c 20 64 2c 20 69 6e 5b 31 32 5d 2b 30  , c, d, in[12]+0
1a140 78 36 62 39 30 31 31 32 32 2c 20 20 37 29 3b 0a  x6b901122,  7);.
1a150 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
1a160 46 31 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20  F1, d, a, b, c, 
1a170 69 6e 5b 31 33 5d 2b 30 78 66 64 39 38 37 31 39  in[13]+0xfd98719
1a180 33 2c 20 31 32 29 3b 0a 20 20 20 20 20 20 20 20  3, 12);.        
1a190 4d 44 35 53 54 45 50 28 46 31 2c 20 63 2c 20 64  MD5STEP(F1, c, d
1a1a0 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 34 5d 2b 30  , a, b, in[14]+0
1a1b0 78 61 36 37 39 34 33 38 65 2c 20 31 37 29 3b 0a  xa679438e, 17);.
1a1c0 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
1a1d0 46 31 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20  F1, b, c, d, a, 
1a1e0 69 6e 5b 31 35 5d 2b 30 78 34 39 62 34 30 38 32  in[15]+0x49b4082
1a1f0 31 2c 20 32 32 29 3b 0a 0a 20 20 20 20 20 20 20  1, 22);..       
1a200 20 4d 44 35 53 54 45 50 28 46 32 2c 20 61 2c 20   MD5STEP(F2, a, 
1a210 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 31 5d 2b  b, c, d, in[ 1]+
1a220 30 78 66 36 31 65 32 35 36 32 2c 20 20 35 29 3b  0xf61e2562,  5);
1a230 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1a240 28 46 32 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c  (F2, d, a, b, c,
1a250 20 69 6e 5b 20 36 5d 2b 30 78 63 30 34 30 62 33   in[ 6]+0xc040b3
1a260 34 30 2c 20 20 39 29 3b 0a 20 20 20 20 20 20 20  40,  9);.       
1a270 20 4d 44 35 53 54 45 50 28 46 32 2c 20 63 2c 20   MD5STEP(F2, c, 
1a280 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 31 5d 2b  d, a, b, in[11]+
1a290 30 78 32 36 35 65 35 61 35 31 2c 20 31 34 29 3b  0x265e5a51, 14);
1a2a0 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1a2b0 28 46 32 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c  (F2, b, c, d, a,
1a2c0 20 69 6e 5b 20 30 5d 2b 30 78 65 39 62 36 63 37   in[ 0]+0xe9b6c7
1a2d0 61 61 2c 20 32 30 29 3b 0a 20 20 20 20 20 20 20  aa, 20);.       
1a2e0 20 4d 44 35 53 54 45 50 28 46 32 2c 20 61 2c 20   MD5STEP(F2, a, 
1a2f0 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 35 5d 2b  b, c, d, in[ 5]+
1a300 30 78 64 36 32 66 31 30 35 64 2c 20 20 35 29 3b  0xd62f105d,  5);
1a310 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1a320 28 46 32 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c  (F2, d, a, b, c,
1a330 20 69 6e 5b 31 30 5d 2b 30 78 30 32 34 34 31 34   in[10]+0x024414
1a340 35 33 2c 20 20 39 29 3b 0a 20 20 20 20 20 20 20  53,  9);.       
1a350 20 4d 44 35 53 54 45 50 28 46 32 2c 20 63 2c 20   MD5STEP(F2, c, 
1a360 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 35 5d 2b  d, a, b, in[15]+
1a370 30 78 64 38 61 31 65 36 38 31 2c 20 31 34 29 3b  0xd8a1e681, 14);
1a380 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1a390 28 46 32 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c  (F2, b, c, d, a,
1a3a0 20 69 6e 5b 20 34 5d 2b 30 78 65 37 64 33 66 62   in[ 4]+0xe7d3fb
1a3b0 63 38 2c 20 32 30 29 3b 0a 20 20 20 20 20 20 20  c8, 20);.       
1a3c0 20 4d 44 35 53 54 45 50 28 46 32 2c 20 61 2c 20   MD5STEP(F2, a, 
1a3d0 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 39 5d 2b  b, c, d, in[ 9]+
1a3e0 30 78 32 31 65 31 63 64 65 36 2c 20 20 35 29 3b  0x21e1cde6,  5);
1a3f0 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1a400 28 46 32 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c  (F2, d, a, b, c,
1a410 20 69 6e 5b 31 34 5d 2b 30 78 63 33 33 37 30 37   in[14]+0xc33707
1a420 64 36 2c 20 20 39 29 3b 0a 20 20 20 20 20 20 20  d6,  9);.       
1a430 20 4d 44 35 53 54 45 50 28 46 32 2c 20 63 2c 20   MD5STEP(F2, c, 
1a440 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 33 5d 2b  d, a, b, in[ 3]+
1a450 30 78 66 34 64 35 30 64 38 37 2c 20 31 34 29 3b  0xf4d50d87, 14);
1a460 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1a470 28 46 32 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c  (F2, b, c, d, a,
1a480 20 69 6e 5b 20 38 5d 2b 30 78 34 35 35 61 31 34   in[ 8]+0x455a14
1a490 65 64 2c 20 32 30 29 3b 0a 20 20 20 20 20 20 20  ed, 20);.       
1a4a0 20 4d 44 35 53 54 45 50 28 46 32 2c 20 61 2c 20   MD5STEP(F2, a, 
1a4b0 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 31 33 5d 2b  b, c, d, in[13]+
1a4c0 30 78 61 39 65 33 65 39 30 35 2c 20 20 35 29 3b  0xa9e3e905,  5);
1a4d0 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1a4e0 28 46 32 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c  (F2, d, a, b, c,
1a4f0 20 69 6e 5b 20 32 5d 2b 30 78 66 63 65 66 61 33   in[ 2]+0xfcefa3
1a500 66 38 2c 20 20 39 29 3b 0a 20 20 20 20 20 20 20  f8,  9);.       
1a510 20 4d 44 35 53 54 45 50 28 46 32 2c 20 63 2c 20   MD5STEP(F2, c, 
1a520 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 37 5d 2b  d, a, b, in[ 7]+
1a530 30 78 36 37 36 66 30 32 64 39 2c 20 31 34 29 3b  0x676f02d9, 14);
1a540 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1a550 28 46 32 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c  (F2, b, c, d, a,
1a560 20 69 6e 5b 31 32 5d 2b 30 78 38 64 32 61 34 63   in[12]+0x8d2a4c
1a570 38 61 2c 20 32 30 29 3b 0a 0a 20 20 20 20 20 20  8a, 20);..      
1a580 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20 61 2c    MD5STEP(F3, a,
1a590 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 35 5d   b, c, d, in[ 5]
1a5a0 2b 30 78 66 66 66 61 33 39 34 32 2c 20 20 34 29  +0xfffa3942,  4)
1a5b0 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
1a5c0 50 28 46 33 2c 20 64 2c 20 61 2c 20 62 2c 20 63  P(F3, d, a, b, c
1a5d0 2c 20 69 6e 5b 20 38 5d 2b 30 78 38 37 37 31 66  , in[ 8]+0x8771f
1a5e0 36 38 31 2c 20 31 31 29 3b 0a 20 20 20 20 20 20  681, 11);.      
1a5f0 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20 63 2c    MD5STEP(F3, c,
1a600 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 31 5d   d, a, b, in[11]
1a610 2b 30 78 36 64 39 64 36 31 32 32 2c 20 31 36 29  +0x6d9d6122, 16)
1a620 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
1a630 50 28 46 33 2c 20 62 2c 20 63 2c 20 64 2c 20 61  P(F3, b, c, d, a
1a640 2c 20 69 6e 5b 31 34 5d 2b 30 78 66 64 65 35 33  , in[14]+0xfde53
1a650 38 30 63 2c 20 32 33 29 3b 0a 20 20 20 20 20 20  80c, 23);.      
1a660 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20 61 2c    MD5STEP(F3, a,
1a670 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 31 5d   b, c, d, in[ 1]
1a680 2b 30 78 61 34 62 65 65 61 34 34 2c 20 20 34 29  +0xa4beea44,  4)
1a690 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
1a6a0 50 28 46 33 2c 20 64 2c 20 61 2c 20 62 2c 20 63  P(F3, d, a, b, c
1a6b0 2c 20 69 6e 5b 20 34 5d 2b 30 78 34 62 64 65 63  , in[ 4]+0x4bdec
1a6c0 66 61 39 2c 20 31 31 29 3b 0a 20 20 20 20 20 20  fa9, 11);.      
1a6d0 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20 63 2c    MD5STEP(F3, c,
1a6e0 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 37 5d   d, a, b, in[ 7]
1a6f0 2b 30 78 66 36 62 62 34 62 36 30 2c 20 31 36 29  +0xf6bb4b60, 16)
1a700 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
1a710 50 28 46 33 2c 20 62 2c 20 63 2c 20 64 2c 20 61  P(F3, b, c, d, a
1a720 2c 20 69 6e 5b 31 30 5d 2b 30 78 62 65 62 66 62  , in[10]+0xbebfb
1a730 63 37 30 2c 20 32 33 29 3b 0a 20 20 20 20 20 20  c70, 23);.      
1a740 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20 61 2c    MD5STEP(F3, a,
1a750 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 31 33 5d   b, c, d, in[13]
1a760 2b 30 78 32 38 39 62 37 65 63 36 2c 20 20 34 29  +0x289b7ec6,  4)
1a770 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
1a780 50 28 46 33 2c 20 64 2c 20 61 2c 20 62 2c 20 63  P(F3, d, a, b, c
1a790 2c 20 69 6e 5b 20 30 5d 2b 30 78 65 61 61 31 32  , in[ 0]+0xeaa12
1a7a0 37 66 61 2c 20 31 31 29 3b 0a 20 20 20 20 20 20  7fa, 11);.      
1a7b0 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20 63 2c    MD5STEP(F3, c,
1a7c0 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 33 5d   d, a, b, in[ 3]
1a7d0 2b 30 78 64 34 65 66 33 30 38 35 2c 20 31 36 29  +0xd4ef3085, 16)
1a7e0 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
1a7f0 50 28 46 33 2c 20 62 2c 20 63 2c 20 64 2c 20 61  P(F3, b, c, d, a
1a800 2c 20 69 6e 5b 20 36 5d 2b 30 78 30 34 38 38 31  , in[ 6]+0x04881
1a810 64 30 35 2c 20 32 33 29 3b 0a 20 20 20 20 20 20  d05, 23);.      
1a820 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20 61 2c    MD5STEP(F3, a,
1a830 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 39 5d   b, c, d, in[ 9]
1a840 2b 30 78 64 39 64 34 64 30 33 39 2c 20 20 34 29  +0xd9d4d039,  4)
1a850 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
1a860 50 28 46 33 2c 20 64 2c 20 61 2c 20 62 2c 20 63  P(F3, d, a, b, c
1a870 2c 20 69 6e 5b 31 32 5d 2b 30 78 65 36 64 62 39  , in[12]+0xe6db9
1a880 39 65 35 2c 20 31 31 29 3b 0a 20 20 20 20 20 20  9e5, 11);.      
1a890 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20 63 2c    MD5STEP(F3, c,
1a8a0 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 35 5d   d, a, b, in[15]
1a8b0 2b 30 78 31 66 61 32 37 63 66 38 2c 20 31 36 29  +0x1fa27cf8, 16)
1a8c0 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
1a8d0 50 28 46 33 2c 20 62 2c 20 63 2c 20 64 2c 20 61  P(F3, b, c, d, a
1a8e0 2c 20 69 6e 5b 20 32 5d 2b 30 78 63 34 61 63 35  , in[ 2]+0xc4ac5
1a8f0 36 36 35 2c 20 32 33 29 3b 0a 0a 20 20 20 20 20  665, 23);..     
1a900 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 61     MD5STEP(F4, a
1a910 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 30  , b, c, d, in[ 0
1a920 5d 2b 30 78 66 34 32 39 32 32 34 34 2c 20 20 36  ]+0xf4292244,  6
1a930 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
1a940 45 50 28 46 34 2c 20 64 2c 20 61 2c 20 62 2c 20  EP(F4, d, a, b, 
1a950 63 2c 20 69 6e 5b 20 37 5d 2b 30 78 34 33 32 61  c, in[ 7]+0x432a
1a960 66 66 39 37 2c 20 31 30 29 3b 0a 20 20 20 20 20  ff97, 10);.     
1a970 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 63     MD5STEP(F4, c
1a980 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 34  , d, a, b, in[14
1a990 5d 2b 30 78 61 62 39 34 32 33 61 37 2c 20 31 35  ]+0xab9423a7, 15
1a9a0 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
1a9b0 45 50 28 46 34 2c 20 62 2c 20 63 2c 20 64 2c 20  EP(F4, b, c, d, 
1a9c0 61 2c 20 69 6e 5b 20 35 5d 2b 30 78 66 63 39 33  a, in[ 5]+0xfc93
1a9d0 61 30 33 39 2c 20 32 31 29 3b 0a 20 20 20 20 20  a039, 21);.     
1a9e0 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 61     MD5STEP(F4, a
1a9f0 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 31 32  , b, c, d, in[12
1aa00 5d 2b 30 78 36 35 35 62 35 39 63 33 2c 20 20 36  ]+0x655b59c3,  6
1aa10 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
1aa20 45 50 28 46 34 2c 20 64 2c 20 61 2c 20 62 2c 20  EP(F4, d, a, b, 
1aa30 63 2c 20 69 6e 5b 20 33 5d 2b 30 78 38 66 30 63  c, in[ 3]+0x8f0c
1aa40 63 63 39 32 2c 20 31 30 29 3b 0a 20 20 20 20 20  cc92, 10);.     
1aa50 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 63     MD5STEP(F4, c
1aa60 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 30  , d, a, b, in[10
1aa70 5d 2b 30 78 66 66 65 66 66 34 37 64 2c 20 31 35  ]+0xffeff47d, 15
1aa80 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
1aa90 45 50 28 46 34 2c 20 62 2c 20 63 2c 20 64 2c 20  EP(F4, b, c, d, 
1aaa0 61 2c 20 69 6e 5b 20 31 5d 2b 30 78 38 35 38 34  a, in[ 1]+0x8584
1aab0 35 64 64 31 2c 20 32 31 29 3b 0a 20 20 20 20 20  5dd1, 21);.     
1aac0 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 61     MD5STEP(F4, a
1aad0 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 38  , b, c, d, in[ 8
1aae0 5d 2b 30 78 36 66 61 38 37 65 34 66 2c 20 20 36  ]+0x6fa87e4f,  6
1aaf0 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
1ab00 45 50 28 46 34 2c 20 64 2c 20 61 2c 20 62 2c 20  EP(F4, d, a, b, 
1ab10 63 2c 20 69 6e 5b 31 35 5d 2b 30 78 66 65 32 63  c, in[15]+0xfe2c
1ab20 65 36 65 30 2c 20 31 30 29 3b 0a 20 20 20 20 20  e6e0, 10);.     
1ab30 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 63     MD5STEP(F4, c
1ab40 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 36  , d, a, b, in[ 6
1ab50 5d 2b 30 78 61 33 30 31 34 33 31 34 2c 20 31 35  ]+0xa3014314, 15
1ab60 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
1ab70 45 50 28 46 34 2c 20 62 2c 20 63 2c 20 64 2c 20  EP(F4, b, c, d, 
1ab80 61 2c 20 69 6e 5b 31 33 5d 2b 30 78 34 65 30 38  a, in[13]+0x4e08
1ab90 31 31 61 31 2c 20 32 31 29 3b 0a 20 20 20 20 20  11a1, 21);.     
1aba0 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 61     MD5STEP(F4, a
1abb0 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 34  , b, c, d, in[ 4
1abc0 5d 2b 30 78 66 37 35 33 37 65 38 32 2c 20 20 36  ]+0xf7537e82,  6
1abd0 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
1abe0 45 50 28 46 34 2c 20 64 2c 20 61 2c 20 62 2c 20  EP(F4, d, a, b, 
1abf0 63 2c 20 69 6e 5b 31 31 5d 2b 30 78 62 64 33 61  c, in[11]+0xbd3a
1ac00 66 32 33 35 2c 20 31 30 29 3b 0a 20 20 20 20 20  f235, 10);.     
1ac10 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 63     MD5STEP(F4, c
1ac20 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 32  , d, a, b, in[ 2
1ac30 5d 2b 30 78 32 61 64 37 64 32 62 62 2c 20 31 35  ]+0x2ad7d2bb, 15
1ac40 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
1ac50 45 50 28 46 34 2c 20 62 2c 20 63 2c 20 64 2c 20  EP(F4, b, c, d, 
1ac60 61 2c 20 69 6e 5b 20 39 5d 2b 30 78 65 62 38 36  a, in[ 9]+0xeb86
1ac70 64 33 39 31 2c 20 32 31 29 3b 0a 0a 20 20 20 20  d391, 21);..    
1ac80 20 20 20 20 62 75 66 5b 30 5d 20 2b 3d 20 61 3b      buf[0] += a;
1ac90 0a 20 20 20 20 20 20 20 20 62 75 66 5b 31 5d 20  .        buf[1] 
1aca0 2b 3d 20 62 3b 0a 20 20 20 20 20 20 20 20 62 75  += b;.        bu
1acb0 66 5b 32 5d 20 2b 3d 20 63 3b 0a 20 20 20 20 20  f[2] += c;.     
1acc0 20 20 20 62 75 66 5b 33 5d 20 2b 3d 20 64 3b 0a     buf[3] += d;.
1acd0 7d 0a 0a 2f 2a 0a 20 2a 20 53 74 61 72 74 20 4d  }../*. * Start M
1ace0 44 35 20 61 63 63 75 6d 75 6c 61 74 69 6f 6e 2e  D5 accumulation.
1acf0 20 20 53 65 74 20 62 69 74 20 63 6f 75 6e 74 20    Set bit count 
1ad00 74 6f 20 30 20 61 6e 64 20 62 75 66 66 65 72 20  to 0 and buffer 
1ad10 74 6f 20 6d 79 73 74 65 72 69 6f 75 73 0a 20 2a  to mysterious. *
1ad20 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
1ad30 63 6f 6e 73 74 61 6e 74 73 2e 0a 20 2a 2f 0a 73  constants.. */.s
1ad40 74 61 74 69 63 20 76 6f 69 64 20 4d 44 35 49 6e  tatic void MD5In
1ad50 69 74 28 4d 44 35 43 6f 6e 74 65 78 74 20 2a 63  it(MD5Context *c
1ad60 74 78 29 7b 0a 20 20 20 20 20 20 20 20 63 74 78  tx){.        ctx
1ad70 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20  ->isInit = 1;.  
1ad80 20 20 20 20 20 20 63 74 78 2d 3e 62 75 66 5b 30        ctx->buf[0
1ad90 5d 20 3d 20 30 78 36 37 34 35 32 33 30 31 3b 0a  ] = 0x67452301;.
1ada0 20 20 20 20 20 20 20 20 63 74 78 2d 3e 62 75 66          ctx->buf
1adb0 5b 31 5d 20 3d 20 30 78 65 66 63 64 61 62 38 39  [1] = 0xefcdab89
1adc0 3b 0a 20 20 20 20 20 20 20 20 63 74 78 2d 3e 62  ;.        ctx->b
1add0 75 66 5b 32 5d 20 3d 20 30 78 39 38 62 61 64 63  uf[2] = 0x98badc
1ade0 66 65 3b 0a 20 20 20 20 20 20 20 20 63 74 78 2d  fe;.        ctx-
1adf0 3e 62 75 66 5b 33 5d 20 3d 20 30 78 31 30 33 32  >buf[3] = 0x1032
1ae00 35 34 37 36 3b 0a 20 20 20 20 20 20 20 20 63 74  5476;.        ct
1ae10 78 2d 3e 62 69 74 73 5b 30 5d 20 3d 20 30 3b 0a  x->bits[0] = 0;.
1ae20 20 20 20 20 20 20 20 20 63 74 78 2d 3e 62 69 74          ctx->bit
1ae30 73 5b 31 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  s[1] = 0;.}../*.
1ae40 20 2a 20 55 70 64 61 74 65 20 63 6f 6e 74 65 78   * Update contex
1ae50 74 20 74 6f 20 72 65 66 6c 65 63 74 20 74 68 65  t to reflect the
1ae60 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 20 6f   concatenation o
1ae70 66 20 61 6e 6f 74 68 65 72 20 62 75 66 66 65 72  f another buffer
1ae80 20 66 75 6c 6c 0a 20 2a 20 6f 66 20 62 79 74 65   full. * of byte
1ae90 73 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 0a 76  s.. */.static .v
1aea0 6f 69 64 20 4d 44 35 55 70 64 61 74 65 28 4d 44  oid MD5Update(MD
1aeb0 35 43 6f 6e 74 65 78 74 20 2a 63 74 78 2c 20 63  5Context *ctx, c
1aec0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1aed0 61 72 20 2a 62 75 66 2c 20 75 6e 73 69 67 6e 65  ar *buf, unsigne
1aee0 64 20 69 6e 74 20 6c 65 6e 29 7b 0a 20 20 20 20  d int len){.    
1aef0 20 20 20 20 75 69 6e 74 33 32 20 74 3b 0a 0a 20      uint32 t;.. 
1af00 20 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65         /* Update
1af10 20 62 69 74 63 6f 75 6e 74 20 2a 2f 0a 0a 20 20   bitcount */..  
1af20 20 20 20 20 20 20 74 20 3d 20 63 74 78 2d 3e 62        t = ctx->b
1af30 69 74 73 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20  its[0];.        
1af40 69 66 20 28 28 63 74 78 2d 3e 62 69 74 73 5b 30  if ((ctx->bits[0
1af50 5d 20 3d 20 74 20 2b 20 28 28 75 69 6e 74 33 32  ] = t + ((uint32
1af60 29 6c 65 6e 20 3c 3c 20 33 29 29 20 3c 20 74 29  )len << 3)) < t)
1af70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1af80 20 63 74 78 2d 3e 62 69 74 73 5b 31 5d 2b 2b 3b   ctx->bits[1]++;
1af90 20 2f 2a 20 43 61 72 72 79 20 66 72 6f 6d 20 6c   /* Carry from l
1afa0 6f 77 20 74 6f 20 68 69 67 68 20 2a 2f 0a 20 20  ow to high */.  
1afb0 20 20 20 20 20 20 63 74 78 2d 3e 62 69 74 73 5b        ctx->bits[
1afc0 31 5d 20 2b 3d 20 6c 65 6e 20 3e 3e 20 32 39 3b  1] += len >> 29;
1afd0 0a 0a 20 20 20 20 20 20 20 20 74 20 3d 20 28 74  ..        t = (t
1afe0 20 3e 3e 20 33 29 20 26 20 30 78 33 66 3b 20 20   >> 3) & 0x3f;  
1aff0 20 20 2f 2a 20 42 79 74 65 73 20 61 6c 72 65 61    /* Bytes alrea
1b000 64 79 20 69 6e 20 73 68 73 49 6e 66 6f 2d 3e 64  dy in shsInfo->d
1b010 61 74 61 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ata */..        
1b020 2f 2a 20 48 61 6e 64 6c 65 20 61 6e 79 20 6c 65  /* Handle any le
1b030 61 64 69 6e 67 20 6f 64 64 2d 73 69 7a 65 64 20  ading odd-sized 
1b040 63 68 75 6e 6b 73 20 2a 2f 0a 0a 20 20 20 20 20  chunks */..     
1b050 20 20 20 69 66 20 28 20 74 20 29 20 7b 0a 20 20     if ( t ) {.  
1b060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75 6e                un
1b070 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 20 3d  signed char *p =
1b080 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
1b090 2a 29 63 74 78 2d 3e 69 6e 20 2b 20 74 3b 0a 0a  *)ctx->in + t;..
1b0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b0b0 74 20 3d 20 36 34 2d 74 3b 0a 20 20 20 20 20 20  t = 64-t;.      
1b0c0 20 20 20 20 20 20 20 20 20 20 69 66 20 28 6c 65            if (le
1b0d0 6e 20 3c 20 74 29 20 7b 0a 20 20 20 20 20 20 20  n < t) {.       
1b0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b0f0 20 6d 65 6d 63 70 79 28 70 2c 20 62 75 66 2c 20   memcpy(p, buf, 
1b100 6c 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  len);.          
1b110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
1b120 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  turn;.          
1b130 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1b140 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
1b150 2c 20 62 75 66 2c 20 74 29 3b 0a 20 20 20 20 20  , buf, t);.     
1b160 20 20 20 20 20 20 20 20 20 20 20 62 79 74 65 52             byteR
1b170 65 76 65 72 73 65 28 63 74 78 2d 3e 69 6e 2c 20  everse(ctx->in, 
1b180 31 36 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  16);.           
1b190 20 20 20 20 20 4d 44 35 54 72 61 6e 73 66 6f 72       MD5Transfor
1b1a0 6d 28 63 74 78 2d 3e 62 75 66 2c 20 28 75 69 6e  m(ctx->buf, (uin
1b1b0 74 33 32 20 2a 29 63 74 78 2d 3e 69 6e 29 3b 0a  t32 *)ctx->in);.
1b1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b1d0 62 75 66 20 2b 3d 20 74 3b 0a 20 20 20 20 20 20  buf += t;.      
1b1e0 20 20 20 20 20 20 20 20 20 20 6c 65 6e 20 2d 3d            len -=
1b1f0 20 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20   t;.        }.. 
1b200 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 63 65 73         /* Proces
1b210 73 20 64 61 74 61 20 69 6e 20 36 34 2d 62 79 74  s data in 64-byt
1b220 65 20 63 68 75 6e 6b 73 20 2a 2f 0a 0a 20 20 20  e chunks */..   
1b230 20 20 20 20 20 77 68 69 6c 65 20 28 6c 65 6e 20       while (len 
1b240 3e 3d 20 36 34 29 20 7b 0a 20 20 20 20 20 20 20  >= 64) {.       
1b250 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
1b260 63 74 78 2d 3e 69 6e 2c 20 62 75 66 2c 20 36 34  ctx->in, buf, 64
1b270 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1b280 20 20 20 62 79 74 65 52 65 76 65 72 73 65 28 63     byteReverse(c
1b290 74 78 2d 3e 69 6e 2c 20 31 36 29 3b 0a 20 20 20  tx->in, 16);.   
1b2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 4d 44 35               MD5
1b2b0 54 72 61 6e 73 66 6f 72 6d 28 63 74 78 2d 3e 62  Transform(ctx->b
1b2c0 75 66 2c 20 28 75 69 6e 74 33 32 20 2a 29 63 74  uf, (uint32 *)ct
1b2d0 78 2d 3e 69 6e 29 3b 0a 20 20 20 20 20 20 20 20  x->in);.        
1b2e0 20 20 20 20 20 20 20 20 62 75 66 20 2b 3d 20 36          buf += 6
1b2f0 34 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  4;.             
1b300 20 20 20 6c 65 6e 20 2d 3d 20 36 34 3b 0a 20 20     len -= 64;.  
1b310 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
1b320 20 2f 2a 20 48 61 6e 64 6c 65 20 61 6e 79 20 72   /* Handle any r
1b330 65 6d 61 69 6e 69 6e 67 20 62 79 74 65 73 20 6f  emaining bytes o
1b340 66 20 64 61 74 61 2e 20 2a 2f 0a 0a 20 20 20 20  f data. */..    
1b350 20 20 20 20 6d 65 6d 63 70 79 28 63 74 78 2d 3e      memcpy(ctx->
1b360 69 6e 2c 20 62 75 66 2c 20 6c 65 6e 29 3b 0a 7d  in, buf, len);.}
1b370 0a 0a 2f 2a 0a 20 2a 20 46 69 6e 61 6c 20 77 72  ../*. * Final wr
1b380 61 70 75 70 20 2d 20 70 61 64 20 74 6f 20 36 34  apup - pad to 64
1b390 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79 20 77  -byte boundary w
1b3a0 69 74 68 20 74 68 65 20 62 69 74 20 70 61 74 74  ith the bit patt
1b3b0 65 72 6e 20 0a 20 2a 20 31 20 30 2a 20 28 36 34  ern . * 1 0* (64
1b3c0 2d 62 69 74 20 63 6f 75 6e 74 20 6f 66 20 62 69  -bit count of bi
1b3d0 74 73 20 70 72 6f 63 65 73 73 65 64 2c 20 4d 53  ts processed, MS
1b3e0 42 2d 66 69 72 73 74 29 0a 20 2a 2f 0a 73 74 61  B-first). */.sta
1b3f0 74 69 63 20 76 6f 69 64 20 4d 44 35 46 69 6e 61  tic void MD5Fina
1b400 6c 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  l(unsigned char 
1b410 64 69 67 65 73 74 5b 31 36 5d 2c 20 4d 44 35 43  digest[16], MD5C
1b420 6f 6e 74 65 78 74 20 2a 63 74 78 29 7b 0a 20 20  ontext *ctx){.  
1b430 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63        unsigned c
1b440 6f 75 6e 74 3b 0a 20 20 20 20 20 20 20 20 75 6e  ount;.        un
1b450 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 3b 0a  signed char *p;.
1b460 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70  .        /* Comp
1b470 75 74 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  ute number of by
1b480 74 65 73 20 6d 6f 64 20 36 34 20 2a 2f 0a 20 20  tes mod 64 */.  
1b490 20 20 20 20 20 20 63 6f 75 6e 74 20 3d 20 28 63        count = (c
1b4a0 74 78 2d 3e 62 69 74 73 5b 30 5d 20 3e 3e 20 33  tx->bits[0] >> 3
1b4b0 29 20 26 20 30 78 33 46 3b 0a 0a 20 20 20 20 20  ) & 0x3F;..     
1b4c0 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 66 69     /* Set the fi
1b4d0 72 73 74 20 63 68 61 72 20 6f 66 20 70 61 64 64  rst char of padd
1b4e0 69 6e 67 20 74 6f 20 30 78 38 30 2e 20 20 54 68  ing to 0x80.  Th
1b4f0 69 73 20 69 73 20 73 61 66 65 20 73 69 6e 63 65  is is safe since
1b500 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 20 20   there is.      
1b510 20 20 20 20 20 61 6c 77 61 79 73 20 61 74 20 6c       always at l
1b520 65 61 73 74 20 6f 6e 65 20 62 79 74 65 20 66 72  east one byte fr
1b530 65 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 20  ee */.        p 
1b540 3d 20 63 74 78 2d 3e 69 6e 20 2b 20 63 6f 75 6e  = ctx->in + coun
1b550 74 3b 0a 20 20 20 20 20 20 20 20 2a 70 2b 2b 20  t;.        *p++ 
1b560 3d 20 30 78 38 30 3b 0a 0a 20 20 20 20 20 20 20  = 0x80;..       
1b570 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 70 61 64   /* Bytes of pad
1b580 64 69 6e 67 20 6e 65 65 64 65 64 20 74 6f 20 6d  ding needed to m
1b590 61 6b 65 20 36 34 20 62 79 74 65 73 20 2a 2f 0a  ake 64 bytes */.
1b5a0 20 20 20 20 20 20 20 20 63 6f 75 6e 74 20 3d 20          count = 
1b5b0 36 34 20 2d 20 31 20 2d 20 63 6f 75 6e 74 3b 0a  64 - 1 - count;.
1b5c0 0a 20 20 20 20 20 20 20 20 2f 2a 20 50 61 64 20  .        /* Pad 
1b5d0 6f 75 74 20 74 6f 20 35 36 20 6d 6f 64 20 36 34  out to 56 mod 64
1b5e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 20 28   */.        if (
1b5f0 63 6f 75 6e 74 20 3c 20 38 29 20 7b 0a 20 20 20  count < 8) {.   
1b600 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b610 54 77 6f 20 6c 6f 74 73 20 6f 66 20 70 61 64 64  Two lots of padd
1b620 69 6e 67 3a 20 20 50 61 64 20 74 68 65 20 66 69  ing:  Pad the fi
1b630 72 73 74 20 62 6c 6f 63 6b 20 74 6f 20 36 34 20  rst block to 64 
1b640 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  bytes */.       
1b650 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28           memset(
1b660 70 2c 20 30 2c 20 63 6f 75 6e 74 29 3b 0a 20 20  p, 0, count);.  
1b670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 79                by
1b680 74 65 52 65 76 65 72 73 65 28 63 74 78 2d 3e 69  teReverse(ctx->i
1b690 6e 2c 20 31 36 29 3b 0a 20 20 20 20 20 20 20 20  n, 16);.        
1b6a0 20 20 20 20 20 20 20 20 4d 44 35 54 72 61 6e 73          MD5Trans
1b6b0 66 6f 72 6d 28 63 74 78 2d 3e 62 75 66 2c 20 28  form(ctx->buf, (
1b6c0 75 69 6e 74 33 32 20 2a 29 63 74 78 2d 3e 69 6e  uint32 *)ctx->in
1b6d0 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  );..            
1b6e0 20 20 20 20 2f 2a 20 4e 6f 77 20 66 69 6c 6c 20      /* Now fill 
1b6f0 74 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 77  the next block w
1b700 69 74 68 20 35 36 20 62 79 74 65 73 20 2a 2f 0a  ith 56 bytes */.
1b710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b720 6d 65 6d 73 65 74 28 63 74 78 2d 3e 69 6e 2c 20  memset(ctx->in, 
1b730 30 2c 20 35 36 29 3b 0a 20 20 20 20 20 20 20 20  0, 56);.        
1b740 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
1b750 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 64 20           /* Pad 
1b760 62 6c 6f 63 6b 20 74 6f 20 35 36 20 62 79 74 65  block to 56 byte
1b770 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  s */.           
1b780 20 20 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30       memset(p, 0
1b790 2c 20 63 6f 75 6e 74 2d 38 29 3b 0a 20 20 20 20  , count-8);.    
1b7a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 79      }.        by
1b7b0 74 65 52 65 76 65 72 73 65 28 63 74 78 2d 3e 69  teReverse(ctx->i
1b7c0 6e 2c 20 31 34 29 3b 0a 0a 20 20 20 20 20 20 20  n, 14);..       
1b7d0 20 2f 2a 20 41 70 70 65 6e 64 20 6c 65 6e 67 74   /* Append lengt
1b7e0 68 20 69 6e 20 62 69 74 73 20 61 6e 64 20 74 72  h in bits and tr
1b7f0 61 6e 73 66 6f 72 6d 20 2a 2f 0a 20 20 20 20 20  ansform */.     
1b800 20 20 20 6d 65 6d 63 70 79 28 63 74 78 2d 3e 69     memcpy(ctx->i
1b810 6e 20 2b 20 31 34 2a 34 2c 20 63 74 78 2d 3e 62  n + 14*4, ctx->b
1b820 69 74 73 2c 20 38 29 3b 0a 0a 20 20 20 20 20 20  its, 8);..      
1b830 20 20 4d 44 35 54 72 61 6e 73 66 6f 72 6d 28 63    MD5Transform(c
1b840 74 78 2d 3e 62 75 66 2c 20 28 75 69 6e 74 33 32  tx->buf, (uint32
1b850 20 2a 29 63 74 78 2d 3e 69 6e 29 3b 0a 20 20 20   *)ctx->in);.   
1b860 20 20 20 20 20 62 79 74 65 52 65 76 65 72 73 65       byteReverse
1b870 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ((unsigned char 
1b880 2a 29 63 74 78 2d 3e 62 75 66 2c 20 34 29 3b 0a  *)ctx->buf, 4);.
1b890 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 64          memcpy(d
1b8a0 69 67 65 73 74 2c 20 63 74 78 2d 3e 62 75 66 2c  igest, ctx->buf,
1b8b0 20 31 36 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   16);.}../*.** C
1b8c0 6f 6e 76 65 72 74 20 61 20 31 32 38 2d 62 69 74  onvert a 128-bit
1b8d0 20 4d 44 35 20 64 69 67 65 73 74 20 69 6e 74 6f   MD5 digest into
1b8e0 20 61 20 33 32 2d 64 69 67 69 74 20 62 61 73 65   a 32-digit base
1b8f0 2d 31 36 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73  -16 number..*/.s
1b900 74 61 74 69 63 20 76 6f 69 64 20 4d 44 35 44 69  tatic void MD5Di
1b910 67 65 73 74 54 6f 42 61 73 65 31 36 28 75 6e 73  gestToBase16(uns
1b920 69 67 6e 65 64 20 63 68 61 72 20 2a 64 69 67 65  igned char *dige
1b930 73 74 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  st, char *zBuf){
1b940 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20 63  .  static char c
1b950 6f 6e 73 74 20 7a 45 6e 63 6f 64 65 5b 5d 20 3d  onst zEncode[] =
1b960 20 22 30 31 32 33 34 35 36 37 38 39 61 62 63 64   "0123456789abcd
1b970 65 66 22 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  ef";.  int i, j;
1b980 0a 0a 20 20 66 6f 72 28 6a 3d 69 3d 30 3b 20 69  ..  for(j=i=0; i
1b990 3c 31 36 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  <16; i++){.    i
1b9a0 6e 74 20 61 20 3d 20 64 69 67 65 73 74 5b 69 5d  nt a = digest[i]
1b9b0 3b 0a 20 20 20 20 7a 42 75 66 5b 6a 2b 2b 5d 20  ;.    zBuf[j++] 
1b9c0 3d 20 7a 45 6e 63 6f 64 65 5b 28 61 3e 3e 34 29  = zEncode[(a>>4)
1b9d0 26 30 78 66 5d 3b 0a 20 20 20 20 7a 42 75 66 5b  &0xf];.    zBuf[
1b9e0 6a 2b 2b 5d 20 3d 20 7a 45 6e 63 6f 64 65 5b 61  j++] = zEncode[a
1b9f0 20 26 20 30 78 66 5d 3b 0a 20 20 7d 0a 20 20 7a   & 0xf];.  }.  z
1ba00 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a 0a  Buf[j] = 0;.}...
1ba10 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
1ba20 31 32 38 2d 62 69 74 20 4d 44 35 20 64 69 67 65  128-bit MD5 dige
1ba30 73 74 20 69 6e 74 6f 20 73 65 71 75 65 6e 63 79  st into sequency
1ba40 20 6f 66 20 65 69 67 68 74 20 35 2d 64 69 67 69   of eight 5-digi
1ba50 74 20 69 6e 74 65 67 65 72 73 0a 2a 2a 20 65 61  t integers.** ea
1ba60 63 68 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20  ch representing 
1ba70 31 36 20 62 69 74 73 20 6f 66 20 74 68 65 20 64  16 bits of the d
1ba80 69 67 65 73 74 20 61 6e 64 20 73 65 70 61 72 61  igest and separa
1ba90 74 65 64 20 66 72 6f 6d 20 65 61 63 68 0a 2a 2a  ted from each.**
1baa0 20 6f 74 68 65 72 20 62 79 20 61 20 22 2d 22 20   other by a "-" 
1bab0 63 68 61 72 61 63 74 65 72 2e 0a 2a 2f 0a 73 74  character..*/.st
1bac0 61 74 69 63 20 76 6f 69 64 20 4d 44 35 44 69 67  atic void MD5Dig
1bad0 65 73 74 54 6f 42 61 73 65 31 30 78 38 28 75 6e  estToBase10x8(un
1bae0 73 69 67 6e 65 64 20 63 68 61 72 20 64 69 67 65  signed char dige
1baf0 73 74 5b 31 36 5d 2c 20 63 68 61 72 20 7a 44 69  st[16], char zDi
1bb00 67 65 73 74 5b 35 30 5d 29 7b 0a 20 20 69 6e 74  gest[50]){.  int
1bb10 20 69 2c 20 6a 3b 0a 20 20 75 6e 73 69 67 6e 65   i, j;.  unsigne
1bb20 64 20 69 6e 74 20 78 3b 0a 20 20 66 6f 72 28 69  d int x;.  for(i
1bb30 3d 6a 3d 30 3b 20 69 3c 31 36 3b 20 69 2b 3d 32  =j=0; i<16; i+=2
1bb40 29 7b 0a 20 20 20 20 78 20 3d 20 64 69 67 65 73  ){.    x = diges
1bb50 74 5b 69 5d 2a 32 35 36 20 2b 20 64 69 67 65 73  t[i]*256 + diges
1bb60 74 5b 69 2b 31 5d 3b 0a 20 20 20 20 69 66 28 20  t[i+1];.    if( 
1bb70 69 3e 30 20 29 20 7a 44 69 67 65 73 74 5b 6a 2b  i>0 ) zDigest[j+
1bb80 2b 5d 20 3d 20 27 2d 27 3b 0a 20 20 20 20 73 71  +] = '-';.    sq
1bb90 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 35  lite3_snprintf(5
1bba0 30 2d 6a 2c 20 26 7a 44 69 67 65 73 74 5b 6a 5d  0-j, &zDigest[j]
1bbb0 2c 20 22 25 30 35 75 22 2c 20 78 29 3b 0a 20 20  , "%05u", x);.  
1bbc0 20 20 6a 20 2b 3d 20 35 3b 0a 20 20 7d 0a 20 20    j += 5;.  }.  
1bbd0 7a 44 69 67 65 73 74 5b 6a 5d 20 3d 20 30 3b 0a  zDigest[j] = 0;.
1bbe0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 54 43 4c 20 63  }../*.** A TCL c
1bbf0 6f 6d 6d 61 6e 64 20 66 6f 72 20 6d 64 35 2e 20  ommand for md5. 
1bc00 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73   The argument is
1bc10 20 74 68 65 20 74 65 78 74 20 74 6f 20 62 65 20   the text to be 
1bc20 68 61 73 68 65 64 2e 20 20 54 68 65 0a 2a 2a 20  hashed.  The.** 
1bc30 52 65 73 75 6c 74 20 69 73 20 74 68 65 20 68 61  Result is the ha
1bc40 73 68 20 69 6e 20 62 61 73 65 36 34 2e 20 20 0a  sh in base64.  .
1bc50 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 64  */.static int md
1bc60 35 5f 63 6d 64 28 76 6f 69 64 2a 63 64 2c 20 54  5_cmd(void*cd, T
1bc70 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1bc80 70 2c 20 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e  p, int argc, con
1bc90 73 74 20 63 68 61 72 20 2a 2a 61 72 67 76 29 7b  st char **argv){
1bca0 0a 20 20 4d 44 35 43 6f 6e 74 65 78 74 20 63 74  .  MD5Context ct
1bcb0 78 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  x;.  unsigned ch
1bcc0 61 72 20 64 69 67 65 73 74 5b 31 36 5d 3b 0a 20  ar digest[16];. 
1bcd0 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a   char zBuf[50];.
1bce0 20 20 76 6f 69 64 20 28 2a 63 6f 6e 76 65 72 74    void (*convert
1bcf0 65 72 29 28 75 6e 73 69 67 6e 65 64 20 63 68 61  er)(unsigned cha
1bd00 72 2a 2c 20 63 68 61 72 2a 29 3b 0a 0a 20 20 69  r*, char*);..  i
1bd10 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20  f( argc!=2 ){.  
1bd20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1bd30 6c 74 28 69 6e 74 65 72 70 2c 22 77 72 6f 6e 67  lt(interp,"wrong
1bd40 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1bd50 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
1bd60 20 0a 20 20 20 20 20 20 20 20 22 20 54 45 58 54   .        " TEXT
1bd70 5c 22 22 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  \"", (char*)0);.
1bd80 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1bd90 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 4d 44 35 49  RROR;.  }.  MD5I
1bda0 6e 69 74 28 26 63 74 78 29 3b 0a 20 20 4d 44 35  nit(&ctx);.  MD5
1bdb0 55 70 64 61 74 65 28 26 63 74 78 2c 20 28 75 6e  Update(&ctx, (un
1bdc0 73 69 67 6e 65 64 20 63 68 61 72 2a 29 61 72 67  signed char*)arg
1bdd0 76 5b 31 5d 2c 20 28 75 6e 73 69 67 6e 65 64 29  v[1], (unsigned)
1bde0 73 74 72 6c 65 6e 28 61 72 67 76 5b 31 5d 29 29  strlen(argv[1]))
1bdf0 3b 0a 20 20 4d 44 35 46 69 6e 61 6c 28 64 69 67  ;.  MD5Final(dig
1be00 65 73 74 2c 20 26 63 74 78 29 3b 0a 20 20 63 6f  est, &ctx);.  co
1be10 6e 76 65 72 74 65 72 20 3d 20 28 76 6f 69 64 28  nverter = (void(
1be20 2a 29 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  *)(unsigned char
1be30 2a 2c 63 68 61 72 2a 29 29 63 64 3b 0a 20 20 63  *,char*))cd;.  c
1be40 6f 6e 76 65 72 74 65 72 28 64 69 67 65 73 74 2c  onverter(digest,
1be50 20 7a 42 75 66 29 3b 0a 20 20 54 63 6c 5f 41 70   zBuf);.  Tcl_Ap
1be60 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1be70 70 2c 20 7a 42 75 66 2c 20 28 63 68 61 72 2a 29  p, zBuf, (char*)
1be80 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
1be90 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20  _OK;.}../*.** A 
1bea0 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 74  TCL command to t
1beb0 61 6b 65 20 74 68 65 20 6d 64 35 20 68 61 73 68  ake the md5 hash
1bec0 20 6f 66 20 61 20 66 69 6c 65 2e 20 20 54 68 65   of a file.  The
1bed0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
1bee0 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  .** name of the 
1bef0 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
1bf00 69 6e 74 20 6d 64 35 66 69 6c 65 5f 63 6d 64 28  int md5file_cmd(
1bf10 76 6f 69 64 2a 63 64 2c 20 54 63 6c 5f 49 6e 74  void*cd, Tcl_Int
1bf20 65 72 70 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  erp*interp, int 
1bf30 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72  argc, const char
1bf40 20 2a 2a 61 72 67 76 29 7b 0a 20 20 46 49 4c 45   **argv){.  FILE
1bf50 20 2a 69 6e 3b 0a 20 20 4d 44 35 43 6f 6e 74 65   *in;.  MD5Conte
1bf60 78 74 20 63 74 78 3b 0a 20 20 76 6f 69 64 20 28  xt ctx;.  void (
1bf70 2a 63 6f 6e 76 65 72 74 65 72 29 28 75 6e 73 69  *converter)(unsi
1bf80 67 6e 65 64 20 63 68 61 72 2a 2c 20 63 68 61 72  gned char*, char
1bf90 2a 29 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  *);.  unsigned c
1bfa0 68 61 72 20 64 69 67 65 73 74 5b 31 36 5d 3b 0a  har digest[16];.
1bfb0 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 32 34    char zBuf[1024
1bfc0 30 5d 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 21  0];..  if( argc!
1bfd0 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
1bfe0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1bff0 70 2c 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  p,"wrong # args:
1c000 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1c010 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20  argv[0], .      
1c020 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c    " FILENAME\"",
1c030 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
1c040 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1c050 3b 0a 20 20 7d 0a 20 20 69 6e 20 3d 20 66 6f 70  ;.  }.  in = fop
1c060 65 6e 28 61 72 67 76 5b 31 5d 2c 22 72 62 22 29  en(argv[1],"rb")
1c070 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b  ;.  if( in==0 ){
1c080 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1c090 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 75 6e  esult(interp,"un
1c0a0 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 66 69 6c  able to open fil
1c0b0 65 20 5c 22 22 2c 20 61 72 67 76 5b 31 5d 2c 20  e \"", argv[1], 
1c0c0 0a 20 20 20 20 20 20 20 20 20 22 5c 22 20 66 6f  .         "\" fo
1c0d0 72 20 72 65 61 64 69 6e 67 22 2c 20 28 63 68 61  r reading", (cha
1c0e0 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72  r*)0);.    retur
1c0f0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1c100 0a 20 20 4d 44 35 49 6e 69 74 28 26 63 74 78 29  .  MD5Init(&ctx)
1c110 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20  ;.  for(;;){.   
1c120 20 69 6e 74 20 6e 3b 0a 20 20 20 20 6e 20 3d 20   int n;.    n = 
1c130 28 69 6e 74 29 66 72 65 61 64 28 7a 42 75 66 2c  (int)fread(zBuf,
1c140 20 31 2c 20 73 69 7a 65 6f 66 28 7a 42 75 66 29   1, sizeof(zBuf)
1c150 2c 20 69 6e 29 3b 0a 20 20 20 20 69 66 28 20 6e  , in);.    if( n
1c160 3c 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  <=0 ) break;.   
1c170 20 4d 44 35 55 70 64 61 74 65 28 26 63 74 78 2c   MD5Update(&ctx,
1c180 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
1c190 29 7a 42 75 66 2c 20 28 75 6e 73 69 67 6e 65 64  )zBuf, (unsigned
1c1a0 29 6e 29 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73  )n);.  }.  fclos
1c1b0 65 28 69 6e 29 3b 0a 20 20 4d 44 35 46 69 6e 61  e(in);.  MD5Fina
1c1c0 6c 28 64 69 67 65 73 74 2c 20 26 63 74 78 29 3b  l(digest, &ctx);
1c1d0 0a 20 20 63 6f 6e 76 65 72 74 65 72 20 3d 20 28  .  converter = (
1c1e0 76 6f 69 64 28 2a 29 28 75 6e 73 69 67 6e 65 64  void(*)(unsigned
1c1f0 20 63 68 61 72 2a 2c 63 68 61 72 2a 29 29 63 64   char*,char*))cd
1c200 3b 0a 20 20 63 6f 6e 76 65 72 74 65 72 28 64 69  ;.  converter(di
1c210 67 65 73 74 2c 20 7a 42 75 66 29 3b 0a 20 20 54  gest, zBuf);.  T
1c220 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1c230 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 28 63  interp, zBuf, (c
1c240 68 61 72 2a 29 30 29 3b 0a 20 20 72 65 74 75 72  har*)0);.  retur
1c250 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1c260 2a 2a 20 52 65 67 69 73 74 65 72 20 74 68 65 20  ** Register the 
1c270 66 6f 75 72 20 6e 65 77 20 54 43 4c 20 63 6f 6d  four new TCL com
1c280 6d 61 6e 64 73 20 66 6f 72 20 67 65 6e 65 72 61  mands for genera
1c290 74 69 6e 67 20 4d 44 35 20 63 68 65 63 6b 73 75  ting MD5 checksu
1c2a0 6d 73 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 54  ms.** with the T
1c2b0 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a  CL interpreter..
1c2c0 2a 2f 0a 69 6e 74 20 4d 64 35 5f 49 6e 69 74 28  */.int Md5_Init(
1c2d0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1c2e0 72 70 29 7b 0a 20 20 54 63 6c 5f 43 72 65 61 74  rp){.  Tcl_Creat
1c2f0 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  eCommand(interp,
1c300 20 22 6d 64 35 22 2c 20 28 54 63 6c 5f 43 6d 64   "md5", (Tcl_Cmd
1c310 50 72 6f 63 2a 29 6d 64 35 5f 63 6d 64 2c 0a 20  Proc*)md5_cmd,. 
1c320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c330 20 20 20 4d 44 35 44 69 67 65 73 74 54 6f 42 61     MD5DigestToBa
1c340 73 65 31 36 2c 20 30 29 3b 0a 20 20 54 63 6c 5f  se16, 0);.  Tcl_
1c350 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e  CreateCommand(in
1c360 74 65 72 70 2c 20 22 6d 64 35 2d 31 30 78 38 22  terp, "md5-10x8"
1c370 2c 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29  , (Tcl_CmdProc*)
1c380 6d 64 35 5f 63 6d 64 2c 0a 20 20 20 20 20 20 20  md5_cmd,.       
1c390 20 20 20 20 20 20 20 20 20 20 20 20 20 4d 44 35               MD5
1c3a0 44 69 67 65 73 74 54 6f 42 61 73 65 31 30 78 38  DigestToBase10x8
1c3b0 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61  , 0);.  Tcl_Crea
1c3c0 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  teCommand(interp
1c3d0 2c 20 22 6d 64 35 66 69 6c 65 22 2c 20 28 54 63  , "md5file", (Tc
1c3e0 6c 5f 43 6d 64 50 72 6f 63 2a 29 6d 64 35 66 69  l_CmdProc*)md5fi
1c3f0 6c 65 5f 63 6d 64 2c 0a 20 20 20 20 20 20 20 20  le_cmd,.        
1c400 20 20 20 20 20 20 20 20 20 20 20 20 4d 44 35 44              MD5D
1c410 69 67 65 73 74 54 6f 42 61 73 65 31 36 2c 20 30  igestToBase16, 0
1c420 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 43  );.  Tcl_CreateC
1c430 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
1c440 6d 64 35 66 69 6c 65 2d 31 30 78 38 22 2c 20 28  md5file-10x8", (
1c450 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 6d 64 35  Tcl_CmdProc*)md5
1c460 66 69 6c 65 5f 63 6d 64 2c 0a 20 20 20 20 20 20  file_cmd,.      
1c470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4d 44                MD
1c480 35 44 69 67 65 73 74 54 6f 42 61 73 65 31 30 78  5DigestToBase10x
1c490 38 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  8, 0);.  return 
1c4a0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  TCL_OK;.}.#endif
1c4b0 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49   /* defined(SQLI
1c4c0 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69  TE_TEST) || defi
1c4d0 6e 65 64 28 53 51 4c 49 54 45 5f 54 43 4c 4d 44  ned(SQLITE_TCLMD
1c4e0 35 29 20 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e  5) */..#if defin
1c4f0 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a  ed(SQLITE_TEST).
1c500 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 74 65 73  /*.** During tes
1c510 74 69 6e 67 2c 20 74 68 65 20 73 70 65 63 69 61  ting, the specia
1c520 6c 20 6d 64 35 73 75 6d 28 29 20 61 67 67 72 65  l md5sum() aggre
1c530 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 69 73  gate function is
1c540 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 20 69   available..** i
1c550 6e 73 69 64 65 20 53 51 4c 69 74 65 2e 20 20 54  nside SQLite.  T
1c560 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
1c570 74 69 6e 65 73 20 69 6d 70 6c 65 6d 65 6e 74 20  tines implement 
1c580 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  that function..*
1c590 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 64  /.static void md
1c5a0 35 73 74 65 70 28 73 71 6c 69 74 65 33 5f 63 6f  5step(sqlite3_co
1c5b0 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20  ntext *context, 
1c5c0 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
1c5d0 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b  3_value **argv){
1c5e0 0a 20 20 4d 44 35 43 6f 6e 74 65 78 74 20 2a 70  .  MD5Context *p
1c5f0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
1c600 20 61 72 67 63 3c 31 20 29 20 72 65 74 75 72 6e   argc<1 ) return
1c610 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f  ;.  p = sqlite3_
1c620 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78  aggregate_contex
1c630 74 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f  t(context, sizeo
1c640 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 3d  f(*p));.  if( p=
1c650 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
1c660 66 28 20 21 70 2d 3e 69 73 49 6e 69 74 20 29 7b  f( !p->isInit ){
1c670 0a 20 20 20 20 4d 44 35 49 6e 69 74 28 70 29 3b  .    MD5Init(p);
1c680 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
1c690 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20  i<argc; i++){.  
1c6a0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
1c6b0 61 74 61 20 3d 20 28 63 68 61 72 2a 29 73 71 6c  ata = (char*)sql
1c6c0 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
1c6d0 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 69 66  argv[i]);.    if
1c6e0 28 20 7a 44 61 74 61 20 29 7b 0a 20 20 20 20 20  ( zData ){.     
1c6f0 20 4d 44 35 55 70 64 61 74 65 28 70 2c 20 28 75   MD5Update(p, (u
1c700 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 44  nsigned char*)zD
1c710 61 74 61 2c 20 28 69 6e 74 29 73 74 72 6c 65 6e  ata, (int)strlen
1c720 28 7a 44 61 74 61 29 29 3b 0a 20 20 20 20 7d 0a  (zData));.    }.
1c730 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
1c740 64 20 6d 64 35 66 69 6e 61 6c 69 7a 65 28 73 71  d md5finalize(sq
1c750 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
1c760 6f 6e 74 65 78 74 29 7b 0a 20 20 4d 44 35 43 6f  ontext){.  MD5Co
1c770 6e 74 65 78 74 20 2a 70 3b 0a 20 20 75 6e 73 69  ntext *p;.  unsi
1c780 67 6e 65 64 20 63 68 61 72 20 64 69 67 65 73 74  gned char digest
1c790 5b 31 36 5d 3b 0a 20 20 63 68 61 72 20 7a 42 75  [16];.  char zBu
1c7a0 66 5b 33 33 5d 3b 0a 20 20 70 20 3d 20 73 71 6c  f[33];.  p = sql
1c7b0 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
1c7c0 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  ontext(context, 
1c7d0 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 4d  sizeof(*p));.  M
1c7e0 44 35 46 69 6e 61 6c 28 64 69 67 65 73 74 2c 70  D5Final(digest,p
1c7f0 29 3b 0a 20 20 4d 44 35 44 69 67 65 73 74 54 6f  );.  MD5DigestTo
1c800 42 61 73 65 31 36 28 64 69 67 65 73 74 2c 20 7a  Base16(digest, z
1c810 42 75 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Buf);.  sqlite3_
1c820 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
1c830 65 78 74 2c 20 7a 42 75 66 2c 20 2d 31 2c 20 53  ext, zBuf, -1, S
1c840 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
1c850 3b 0a 7d 0a 69 6e 74 20 4d 64 35 5f 52 65 67 69  ;.}.int Md5_Regi
1c860 73 74 65 72 28 73 71 6c 69 74 65 33 20 2a 64 62  ster(sqlite3 *db
1c870 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71  ){.  int rc = sq
1c880 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
1c890 63 74 69 6f 6e 28 64 62 2c 20 22 6d 64 35 73 75  ction(db, "md5su
1c8a0 6d 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55  m", -1, SQLITE_U
1c8b0 54 46 38 2c 20 30 2c 20 30 2c 20 0a 20 20 20 20  TF8, 0, 0, .    
1c8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 64 35               md5
1c8e0 73 74 65 70 2c 20 6d 64 35 66 69 6e 61 6c 69 7a  step, md5finaliz
1c8f0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6f 76  e);.  sqlite3_ov
1c900 65 72 6c 6f 61 64 5f 66 75 6e 63 74 69 6f 6e 28  erload_function(
1c910 64 62 2c 20 22 6d 64 35 73 75 6d 22 2c 20 2d 31  db, "md5sum", -1
1c920 29 3b 20 20 2f 2a 20 54 6f 20 65 78 65 72 63 69  );  /* To exerci
1c930 73 65 20 74 68 69 73 20 41 50 49 20 2a 2f 0a 20  se this API */. 
1c940 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
1c950 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28  ndif /* defined(
1c960 53 51 4c 49 54 45 5f 54 45 53 54 29 20 2a 2f 0a  SQLITE_TEST) */.
1c970 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d  ../*.** If the m
1c980 61 63 72 6f 20 54 43 4c 53 48 20 69 73 20 6f 6e  acro TCLSH is on
1c990 65 2c 20 74 68 65 6e 20 70 75 74 20 69 6e 20 63  e, then put in c
1c9a0 6f 64 65 20 74 68 69 73 20 66 6f 72 20 74 68 65  ode this for the
1c9b0 0a 2a 2a 20 22 6d 61 69 6e 22 20 72 6f 75 74 69  .** "main" routi
1c9c0 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 69  ne that will ini
1c9d0 74 69 61 6c 69 7a 65 20 54 63 6c 20 61 6e 64 20  tialize Tcl and 
1c9e0 74 61 6b 65 20 69 6e 70 75 74 20 66 72 6f 6d 0a  take input from.
1c9f0 2a 2a 20 73 74 61 6e 64 61 72 64 20 69 6e 70 75  ** standard inpu
1ca00 74 2c 20 6f 72 20 69 66 20 61 20 66 69 6c 65 20  t, or if a file 
1ca10 69 73 20 6e 61 6d 65 64 20 6f 6e 20 74 68 65 20  is named on the 
1ca20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 0a 2a 2a 20  command line.** 
1ca30 74 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  the TCL interpre
1ca40 74 65 72 20 72 65 61 64 73 20 61 6e 64 20 65 76  ter reads and ev
1ca50 61 6c 75 61 74 65 73 20 74 68 61 74 20 66 69 6c  aluates that fil
1ca60 65 2e 0a 2a 2f 0a 23 69 66 20 54 43 4c 53 48 3d  e..*/.#if TCLSH=
1ca70 3d 31 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  =1.static const 
1ca80 63 68 61 72 20 2a 74 63 6c 73 68 5f 6d 61 69 6e  char *tclsh_main
1ca90 5f 6c 6f 6f 70 28 76 6f 69 64 29 7b 0a 20 20 73  _loop(void){.  s
1caa0 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
1cab0 20 7a 4d 61 69 6e 6c 6f 6f 70 5b 5d 20 3d 0a 20   zMainloop[] =. 
1cac0 20 20 20 22 73 65 74 20 6c 69 6e 65 20 7b 7d 5c     "set line {}\
1cad0 6e 22 0a 20 20 20 20 22 77 68 69 6c 65 20 7b 21  n".    "while {!
1cae0 5b 65 6f 66 20 73 74 64 69 6e 5d 7d 20 7b 5c 6e  [eof stdin]} {\n
1caf0 22 0a 20 20 20 20 20 20 22 69 66 20 7b 24 6c 69  ".      "if {$li
1cb00 6e 65 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22 0a 20  ne!=\"\"} {\n". 
1cb10 20 20 20 20 20 20 20 22 70 75 74 73 20 2d 6e 6f         "puts -no
1cb20 6e 65 77 6c 69 6e 65 20 5c 22 3e 20 5c 22 5c 6e  newline \"> \"\n
1cb30 22 0a 20 20 20 20 20 20 22 7d 20 65 6c 73 65 20  ".      "} else 
1cb40 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 70 75  {\n".        "pu
1cb50 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 5c 22  ts -nonewline \"
1cb60 25 20 5c 22 5c 6e 22 0a 20 20 20 20 20 20 22 7d  % \"\n".      "}
1cb70 5c 6e 22 0a 20 20 20 20 20 20 22 66 6c 75 73 68  \n".      "flush
1cb80 20 73 74 64 6f 75 74 5c 6e 22 0a 20 20 20 20 20   stdout\n".     
1cb90 20 22 61 70 70 65 6e 64 20 6c 69 6e 65 20 5b 67   "append line [g
1cba0 65 74 73 20 73 74 64 69 6e 5d 5c 6e 22 0a 20 20  ets stdin]\n".  
1cbb0 20 20 20 20 22 69 66 20 7b 5b 69 6e 66 6f 20 63      "if {[info c
1cbc0 6f 6d 70 6c 65 74 65 20 24 6c 69 6e 65 5d 7d 20  omplete $line]} 
1cbd0 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 69 66  {\n".        "if
1cbe0 20 7b 5b 63 61 74 63 68 20 7b 75 70 6c 65 76 65   {[catch {upleve
1cbf0 6c 20 23 30 20 24 6c 69 6e 65 7d 20 72 65 73 75  l #0 $line} resu
1cc00 6c 74 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20  lt]} {\n".      
1cc10 20 20 20 20 22 70 75 74 73 20 73 74 64 65 72 72      "puts stderr
1cc20 20 5c 22 45 72 72 6f 72 3a 20 24 72 65 73 75 6c   \"Error: $resul
1cc30 74 5c 22 5c 6e 22 0a 20 20 20 20 20 20 20 20 22  t\"\n".        "
1cc40 7d 20 65 6c 73 65 69 66 20 7b 24 72 65 73 75 6c  } elseif {$resul
1cc50 74 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20  t!=\"\"} {\n".  
1cc60 20 20 20 20 20 20 20 20 22 70 75 74 73 20 24 72          "puts $r
1cc70 65 73 75 6c 74 5c 6e 22 0a 20 20 20 20 20 20 20  esult\n".       
1cc80 20 22 7d 5c 6e 22 0a 20 20 20 20 20 20 20 20 22   "}\n".        "
1cc90 73 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e 22 0a 20  set line {}\n". 
1cca0 20 20 20 20 20 22 7d 20 65 6c 73 65 20 7b 5c 6e       "} else {\n
1ccb0 22 0a 20 20 20 20 20 20 20 20 22 61 70 70 65 6e  ".        "appen
1ccc0 64 20 6c 69 6e 65 20 5c 5c 6e 5c 6e 22 0a 20 20  d line \\n\n".  
1ccd0 20 20 20 20 22 7d 5c 6e 22 0a 20 20 20 20 22 7d      "}\n".    "}
1cce0 5c 6e 22 0a 20 20 3b 0a 20 20 72 65 74 75 72 6e  \n".  ;.  return
1ccf0 20 7a 4d 61 69 6e 6c 6f 6f 70 3b 0a 7d 0a 23 65   zMainloop;.}.#e
1cd00 6e 64 69 66 0a 23 69 66 20 54 43 4c 53 48 3d 3d  ndif.#if TCLSH==
1cd10 32 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  2.static const c
1cd20 68 61 72 20 2a 74 63 6c 73 68 5f 6d 61 69 6e 5f  har *tclsh_main_
1cd30 6c 6f 6f 70 28 76 6f 69 64 29 3b 0a 23 65 6e 64  loop(void);.#end
1cd40 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
1cd50 45 5f 54 45 53 54 0a 73 74 61 74 69 63 20 76 6f  E_TEST.static vo
1cd60 69 64 20 69 6e 69 74 5f 61 6c 6c 28 54 63 6c 5f  id init_all(Tcl_
1cd70 49 6e 74 65 72 70 20 2a 29 3b 0a 73 74 61 74 69  Interp *);.stati
1cd80 63 20 69 6e 74 20 69 6e 69 74 5f 61 6c 6c 5f 63  c int init_all_c
1cd90 6d 64 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  md(.  ClientData
1cda0 20 63 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72   cd,.  Tcl_Inter
1cdb0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1cdc0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1cdd0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1cde0 7b 0a 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  {..  Tcl_Interp 
1cdf0 2a 73 6c 61 76 65 3b 0a 20 20 69 66 28 20 6f 62  *slave;.  if( ob
1ce00 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
1ce10 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
1ce20 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
1ce30 53 4c 41 56 45 22 29 3b 0a 20 20 20 20 72 65 74  SLAVE");.    ret
1ce40 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1ce50 20 7d 0a 0a 20 20 73 6c 61 76 65 20 3d 20 54 63   }..  slave = Tc
1ce60 6c 5f 47 65 74 53 6c 61 76 65 28 69 6e 74 65 72  l_GetSlave(inter
1ce70 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
1ce80 28 6f 62 6a 76 5b 31 5d 29 29 3b 0a 20 20 69 66  (objv[1]));.  if
1ce90 28 20 21 73 6c 61 76 65 20 29 7b 0a 20 20 20 20  ( !slave ){.    
1cea0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1ceb0 3b 0a 20 20 7d 0a 0a 20 20 69 6e 69 74 5f 61 6c  ;.  }..  init_al
1cec0 6c 28 73 6c 61 76 65 29 3b 0a 20 20 72 65 74 75  l(slave);.  retu
1ced0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1cee0 0a 2a 2a 20 54 63 6c 63 6d 64 3a 20 64 62 5f 75  .** Tclcmd: db_u
1cef0 73 65 5f 6c 65 67 61 63 79 5f 70 72 65 70 61 72  se_legacy_prepar
1cf00 65 20 44 42 20 42 4f 4f 4c 45 41 4e 0a 2a 2a 0a  e DB BOOLEAN.**.
1cf10 2a 2a 20 20 20 54 68 65 20 66 69 72 73 74 20 61  **   The first a
1cf20 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
1cf30 63 6f 6d 6d 61 6e 64 20 6d 75 73 74 20 62 65 20  command must be 
1cf40 61 20 64 61 74 61 62 61 73 65 20 63 6f 6d 6d 61  a database comma
1cf50 6e 64 20 63 72 65 61 74 65 64 20 62 79 0a 2a 2a  nd created by.**
1cf60 20 20 20 5b 73 71 6c 69 74 65 33 5d 2e 20 49 66     [sqlite3]. If
1cf70 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
1cf80 6d 65 6e 74 20 69 73 20 74 72 75 65 2c 20 74 68  ment is true, th
1cf90 65 6e 20 74 68 65 20 68 61 6e 64 6c 65 20 69 73  en the handle is
1cfa0 20 63 6f 6e 66 69 67 75 72 65 64 0a 2a 2a 20 20   configured.**  
1cfb0 20 74 6f 20 75 73 65 20 74 68 65 20 73 71 6c 69   to use the sqli
1cfc0 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 29  te3_prepare_v2()
1cfd0 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 70 72 65   function to pre
1cfe0 70 61 72 65 20 73 74 61 74 65 6d 65 6e 74 73 2e  pare statements.
1cff0 20 49 66 20 69 74 0a 2a 2a 20 20 20 69 73 20 66   If it.**   is f
1d000 61 6c 73 65 2c 20 73 71 6c 69 74 65 33 5f 70 72  alse, sqlite3_pr
1d010 65 70 61 72 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  epare()..*/.stat
1d020 69 63 20 69 6e 74 20 64 62 5f 75 73 65 5f 6c 65  ic int db_use_le
1d030 67 61 63 79 5f 70 72 65 70 61 72 65 5f 63 6d 64  gacy_prepare_cmd
1d040 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
1d050 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
1d060 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
1d070 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
1d080 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
1d090 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d    Tcl_CmdInfo cm
1d0a0 64 49 6e 66 6f 3b 0a 20 20 53 71 6c 69 74 65 44  dInfo;.  SqliteD
1d0b0 62 20 2a 70 44 62 3b 0a 20 20 69 6e 74 20 62 50  b *pDb;.  int bP
1d0c0 72 65 70 61 72 65 3b 0a 0a 20 20 69 66 28 20 6f  repare;..  if( o
1d0d0 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
1d0e0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
1d0f0 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
1d100 22 44 42 20 42 4f 4f 4c 45 41 4e 22 29 3b 0a 20  "DB BOOLEAN");. 
1d110 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1d120 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
1d130 21 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49  !Tcl_GetCommandI
1d140 6e 66 6f 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  nfo(interp, Tcl_
1d150 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
1d160 5d 29 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29 7b  ]), &cmdInfo) ){
1d170 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1d180 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e  esult(interp, "n
1d190 6f 20 73 75 63 68 20 64 62 3a 20 22 2c 20 54 63  o such db: ", Tc
1d1a0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1d1b0 5b 31 5d 29 2c 20 28 63 68 61 72 2a 29 30 29 3b  [1]), (char*)0);
1d1c0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1d1d0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 44 62  ERROR;.  }.  pDb
1d1e0 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 6d   = (SqliteDb*)cm
1d1f0 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44  dInfo.objClientD
1d200 61 74 61 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ata;.  if( Tcl_G
1d210 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
1d220 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
1d230 2c 20 26 62 50 72 65 70 61 72 65 29 20 29 7b 0a  , &bPrepare) ){.
1d240 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1d250 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 70 44 62  RROR;.  }..  pDb
1d260 2d 3e 62 4c 65 67 61 63 79 50 72 65 70 61 72 65  ->bLegacyPrepare
1d270 20 3d 20 62 50 72 65 70 61 72 65 3b 0a 0a 20 20   = bPrepare;..  
1d280 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28  Tcl_ResetResult(
1d290 69 6e 74 65 72 70 29 3b 0a 20 20 72 65 74 75 72  interp);.  retur
1d2a0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1d2b0 2a 2a 20 54 63 6c 63 6d 64 3a 20 64 62 5f 6c 61  ** Tclcmd: db_la
1d2c0 73 74 5f 73 74 6d 74 5f 70 74 72 20 44 42 0a 2a  st_stmt_ptr DB.*
1d2d0 2a 0a 2a 2a 20 20 20 49 66 20 74 68 65 20 73 74  *.**   If the st
1d2e0 61 74 65 6d 65 6e 74 20 63 61 63 68 65 20 61 73  atement cache as
1d2f0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 64 61  sociated with da
1d300 74 61 62 61 73 65 20 44 42 20 69 73 20 6e 6f 74  tabase DB is not
1d310 20 65 6d 70 74 79 2c 0a 2a 2a 20 20 20 72 65 74   empty,.**   ret
1d320 75 72 6e 20 74 68 65 20 74 65 78 74 20 72 65 70  urn the text rep
1d330 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
1d340 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
1d350 20 75 73 65 64 20 73 74 61 74 65 6d 65 6e 74 0a   used statement.
1d360 2a 2a 20 20 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a  **   handle..*/.
1d370 73 74 61 74 69 63 20 69 6e 74 20 64 62 5f 6c 61  static int db_la
1d380 73 74 5f 73 74 6d 74 5f 70 74 72 28 0a 20 20 43  st_stmt_ptr(.  C
1d390 6c 69 65 6e 74 44 61 74 61 20 63 64 2c 0a 20 20  lientData cd,.  
1d3a0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1d3b0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
1d3c0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1d3d0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 65 78 74   objv[].){.  ext
1d3e0 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 54  ern int sqlite3T
1d3f0 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74  estMakePointerSt
1d400 72 28 54 63 6c 5f 49 6e 74 65 72 70 2a 2c 20 63  r(Tcl_Interp*, c
1d410 68 61 72 2a 2c 20 76 6f 69 64 2a 29 3b 0a 20 20  har*, void*);.  
1d420 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49  Tcl_CmdInfo cmdI
1d430 6e 66 6f 3b 0a 20 20 53 71 6c 69 74 65 44 62 20  nfo;.  SqliteDb 
1d440 2a 70 44 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f  *pDb;.  sqlite3_
1d450 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b  stmt *pStmt = 0;
1d460 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30  .  char zBuf[100
1d470 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  ];..  if( objc!=
1d480 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
1d490 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
1d4a0 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 22 29  , 1, objv, "DB")
1d4b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1d4c0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
1d4d0 66 28 20 21 54 63 6c 5f 47 65 74 43 6f 6d 6d 61  f( !Tcl_GetComma
1d4e0 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 54  ndInfo(interp, T
1d4f0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1d500 76 5b 31 5d 29 2c 20 26 63 6d 64 49 6e 66 6f 29  v[1]), &cmdInfo)
1d510 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1d520 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1d530 20 22 6e 6f 20 73 75 63 68 20 64 62 3a 20 22 2c   "no such db: ",
1d540 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1d550 62 6a 76 5b 31 5d 29 2c 20 28 63 68 61 72 2a 29  bjv[1]), (char*)
1d560 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1d570 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1d580 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a  pDb = (SqliteDb*
1d590 29 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65  )cmdInfo.objClie
1d5a0 6e 74 44 61 74 61 3b 0a 0a 20 20 69 66 28 20 70  ntData;..  if( p
1d5b0 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 29 20 70  Db->stmtList ) p
1d5c0 53 74 6d 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74  Stmt = pDb->stmt
1d5d0 4c 69 73 74 2d 3e 70 53 74 6d 74 3b 0a 20 20 69  List->pStmt;.  i
1d5e0 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61  f( sqlite3TestMa
1d5f0 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74  kePointerStr(int
1d600 65 72 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74  erp, zBuf, pStmt
1d610 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
1d620 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1d630 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
1d640 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 54 43 4c  nterp, zBuf, TCL
1d650 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 0a 20 20 72  _VOLATILE);..  r
1d660 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1d670 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1d680 5f 54 45 53 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  _TEST */../*.** 
1d690 43 6f 6e 66 69 67 75 72 65 20 74 68 65 20 69 6e  Configure the in
1d6a0 74 65 72 70 72 65 74 65 72 20 70 61 73 73 65 64  terpreter passed
1d6b0 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
1d6c0 67 75 6d 65 6e 74 20 74 6f 20 68 61 76 65 20 61  gument to have a
1d6d0 63 63 65 73 73 0a 2a 2a 20 74 6f 20 74 68 65 20  ccess.** to the 
1d6e0 63 6f 6d 6d 61 6e 64 73 20 61 6e 64 20 6c 69 6e  commands and lin
1d6f0 6b 65 64 20 76 61 72 69 61 62 6c 65 73 20 74 68  ked variables th
1d700 61 74 20 6d 61 6b 65 20 75 70 3a 0a 2a 2a 0a 2a  at make up:.**.*
1d710 2a 20 20 20 2a 20 74 68 65 20 5b 73 71 6c 69 74  *   * the [sqlit
1d720 65 33 5d 20 65 78 74 65 6e 73 69 6f 6e 20 69 74  e3] extension it
1d730 73 65 6c 66 2c 20 0a 2a 2a 0a 2a 2a 20 20 20 2a  self, .**.**   *
1d740 20 49 66 20 53 51 4c 49 54 45 5f 54 43 4c 4d 44   If SQLITE_TCLMD
1d750 35 20 6f 72 20 53 51 4c 49 54 45 5f 54 45 53 54  5 or SQLITE_TEST
1d760 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65   is defined, the
1d770 20 4d 64 35 20 63 6f 6d 6d 61 6e 64 73 2c 20 61   Md5 commands, a
1d780 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20  nd.**.**   * If 
1d790 53 51 4c 49 54 45 5f 54 45 53 54 20 69 73 20 73  SQLITE_TEST is s
1d7a0 65 74 2c 20 74 68 65 20 76 61 72 69 6f 75 73 20  et, the various 
1d7b0 74 65 73 74 20 69 6e 74 65 72 66 61 63 65 73 20  test interfaces 
1d7c0 75 73 65 64 20 62 79 20 74 68 65 20 54 63 6c 0a  used by the Tcl.
1d7d0 2a 2a 20 20 20 20 20 74 65 73 74 20 73 75 69 74  **     test suit
1d7e0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
1d7f0 64 20 69 6e 69 74 5f 61 6c 6c 28 54 63 6c 5f 49  d init_all(Tcl_I
1d800 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a  nterp *interp){.
1d810 20 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69    Sqlite3_Init(i
1d820 6e 74 65 72 70 29 3b 0a 0a 23 69 66 20 64 65 66  nterp);..#if def
1d830 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
1d840 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
1d850 49 54 45 5f 54 43 4c 4d 44 35 29 0a 20 20 4d 64  ITE_TCLMD5).  Md
1d860 35 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  5_Init(interp);.
1d870 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
1d880 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 7b 0a 20  QLITE_TEST.  {. 
1d890 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1d8a0 6c 69 74 65 63 6f 6e 66 69 67 5f 49 6e 69 74 28  liteconfig_Init(
1d8b0 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1d8c0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1d8d0 69 74 65 74 65 73 74 31 5f 49 6e 69 74 28 54 63  itetest1_Init(Tc
1d8e0 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1d8f0 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1d900 65 74 65 73 74 32 5f 49 6e 69 74 28 54 63 6c 5f  etest2_Init(Tcl_
1d910 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
1d920 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1d930 65 73 74 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  est3_Init(Tcl_In
1d940 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
1d950 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1d960 74 34 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  t4_Init(Tcl_Inte
1d970 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
1d980 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 35   int Sqlitetest5
1d990 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1d9a0 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1d9b0 6e 74 20 53 71 6c 69 74 65 74 65 73 74 36 5f 49  nt Sqlitetest6_I
1d9c0 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
1d9d0 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
1d9e0 20 53 71 6c 69 74 65 74 65 73 74 37 5f 49 6e 69   Sqlitetest7_Ini
1d9f0 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
1da00 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1da10 71 6c 69 74 65 74 65 73 74 38 5f 49 6e 69 74 28  qlitetest8_Init(
1da20 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1da30 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1da40 69 74 65 74 65 73 74 39 5f 49 6e 69 74 28 54 63  itetest9_Init(Tc
1da50 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1da60 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1da70 65 74 65 73 74 61 73 79 6e 63 5f 49 6e 69 74 28  etestasync_Init(
1da80 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1da90 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1daa0 69 74 65 74 65 73 74 5f 61 75 74 6f 65 78 74 5f  itetest_autoext_
1dab0 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1dac0 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
1dad0 74 20 53 71 6c 69 74 65 74 65 73 74 5f 62 6c 6f  t Sqlitetest_blo
1dae0 62 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  b_Init(Tcl_Inter
1daf0 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1db00 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f 64  int Sqlitetest_d
1db10 65 6d 6f 76 66 73 5f 49 6e 69 74 28 54 63 6c 5f  emovfs_Init(Tcl_
1db20 49 6e 74 65 72 70 20 2a 29 3b 0a 20 20 20 20 65  Interp *);.    e
1db30 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1db40 74 65 73 74 5f 66 75 6e 63 5f 49 6e 69 74 28 54  test_func_Init(T
1db50 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1db60 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1db70 74 65 74 65 73 74 5f 68 65 78 69 6f 5f 49 6e 69  tetest_hexio_Ini
1db80 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
1db90 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1dba0 71 6c 69 74 65 74 65 73 74 5f 69 6e 69 74 5f 49  qlitetest_init_I
1dbb0 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
1dbc0 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
1dbd0 20 53 71 6c 69 74 65 74 65 73 74 5f 6d 61 6c 6c   Sqlitetest_mall
1dbe0 6f 63 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  oc_Init(Tcl_Inte
1dbf0 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
1dc00 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f   int Sqlitetest_
1dc10 6d 75 74 65 78 5f 49 6e 69 74 28 54 63 6c 5f 49  mutex_Init(Tcl_I
1dc20 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1dc30 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1dc40 73 74 73 63 68 65 6d 61 5f 49 6e 69 74 28 54 63  stschema_Init(Tc
1dc50 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1dc60 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1dc70 65 74 65 73 74 73 73 65 5f 49 6e 69 74 28 54 63  etestsse_Init(Tc
1dc80 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1dc90 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1dca0 65 74 65 73 74 74 63 6c 76 61 72 5f 49 6e 69 74  etesttclvar_Init
1dcb0 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1dcc0 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1dcd0 6c 69 74 65 74 65 73 74 66 73 5f 49 6e 69 74 28  litetestfs_Init(
1dce0 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1dcf0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1dd00 69 74 65 74 65 73 74 54 68 72 65 61 64 5f 49 6e  itetestThread_In
1dd10 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1dd20 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1dd30 53 71 6c 69 74 65 74 65 73 74 4f 6e 65 66 69 6c  SqlitetestOnefil
1dd40 65 5f 49 6e 69 74 28 29 3b 0a 20 20 20 20 65 78  e_Init();.    ex
1dd50 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1dd60 65 73 74 4f 73 69 6e 73 74 5f 49 6e 69 74 28 54  estOsinst_Init(T
1dd70 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1dd80 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1dd90 74 65 74 65 73 74 62 61 63 6b 75 70 5f 49 6e 69  tetestbackup_Ini
1dda0 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
1ddb0 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1ddc0 71 6c 69 74 65 74 65 73 74 69 6e 74 61 72 72 61  qlitetestintarra
1ddd0 79 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  y_Init(Tcl_Inter
1dde0 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1ddf0 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 76 66  int Sqlitetestvf
1de00 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  s_Init(Tcl_Inter
1de10 70 20 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  p *);.    extern
1de20 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 72   int Sqlitetestr
1de30 74 72 65 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  tree_Init(Tcl_In
1de40 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
1de50 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 71 75 6f  rn int Sqlitequo
1de60 74 61 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  ta_Init(Tcl_Inte
1de70 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
1de80 20 69 6e 74 20 53 71 6c 69 74 65 6d 75 6c 74 69   int Sqlitemulti
1de90 70 6c 65 78 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  plex_Init(Tcl_In
1dea0 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
1deb0 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 53 75 70  rn int SqliteSup
1dec0 65 72 6c 6f 63 6b 5f 49 6e 69 74 28 54 63 6c 5f  erlock_Init(Tcl_
1ded0 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
1dee0 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1def0 65 73 74 53 79 73 63 61 6c 6c 5f 49 6e 69 74 28  estSyscall_Init(
1df00 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 23 69  Tcl_Interp*);.#i
1df10 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1df20 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29  _ENABLE_SESSION)
1df30 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
1df40 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44  TE_ENABLE_PREUPD
1df50 41 54 45 5f 48 4f 4f 4b 29 0a 20 20 20 20 65 78  ATE_HOOK).    ex
1df60 74 65 72 6e 20 69 6e 74 20 54 65 73 74 53 65 73  tern int TestSes
1df70 73 69 6f 6e 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  sion_Init(Tcl_In
1df80 74 65 72 70 2a 29 3b 0a 23 65 6e 64 69 66 0a 20  terp*);.#endif. 
1df90 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 46 74     extern int Ft
1dfa0 73 35 74 63 6c 5f 49 6e 69 74 28 54 63 6c 5f 49  s5tcl_Init(Tcl_I
1dfb0 6e 74 65 72 70 20 2a 29 3b 0a 20 20 20 20 65 78  nterp *);.    ex
1dfc0 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 52  tern int SqliteR
1dfd0 62 75 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  bu_Init(Tcl_Inte
1dfe0 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
1dff0 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 74   int Sqlitetestt
1e000 63 6c 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  cl_Init(Tcl_Inte
1e010 72 70 2a 29 3b 0a 23 69 66 20 64 65 66 69 6e 65  rp*);.#if define
1e020 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
1e030 46 54 53 33 29 20 7c 7c 20 64 65 66 69 6e 65 64  FTS3) || defined
1e040 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46  (SQLITE_ENABLE_F
1e050 54 53 34 29 0a 20 20 20 20 65 78 74 65 72 6e 20  TS4).    extern 
1e060 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 66 74  int Sqlitetestft
1e070 73 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  s3_Init(Tcl_Inte
1e080 72 70 20 2a 69 6e 74 65 72 70 29 3b 0a 23 65 6e  rp *interp);.#en
1e090 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
1e0a0 54 45 5f 45 4e 41 42 4c 45 5f 5a 49 50 56 46 53  TE_ENABLE_ZIPVFS
1e0b0 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1e0c0 5a 69 70 76 66 73 5f 49 6e 69 74 28 54 63 6c 5f  Zipvfs_Init(Tcl_
1e0d0 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 5a 69  Interp*);.    Zi
1e0e0 70 76 66 73 5f 49 6e 69 74 28 69 6e 74 65 72 70  pvfs_Init(interp
1e0f0 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 53  );.#endif..    S
1e100 71 6c 69 74 65 63 6f 6e 66 69 67 5f 49 6e 69 74  qliteconfig_Init
1e110 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1e120 6c 69 74 65 74 65 73 74 31 5f 49 6e 69 74 28 69  litetest1_Init(i
1e130 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1e140 74 65 74 65 73 74 32 5f 49 6e 69 74 28 69 6e 74  tetest2_Init(int
1e150 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1e160 74 65 73 74 33 5f 49 6e 69 74 28 69 6e 74 65 72  test3_Init(inter
1e170 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
1e180 73 74 34 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  st4_Init(interp)
1e190 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
1e1a0 35 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  5_Init(interp);.
1e1b0 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 36 5f      Sqlitetest6_
1e1c0 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
1e1d0 20 20 53 71 6c 69 74 65 74 65 73 74 37 5f 49 6e    Sqlitetest7_In
1e1e0 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1e1f0 53 71 6c 69 74 65 74 65 73 74 38 5f 49 6e 69 74  Sqlitetest8_Init
1e200 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1e210 6c 69 74 65 74 65 73 74 39 5f 49 6e 69 74 28 69  litetest9_Init(i
1e220 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1e230 74 65 74 65 73 74 61 73 79 6e 63 5f 49 6e 69 74  tetestasync_Init
1e240 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1e250 6c 69 74 65 74 65 73 74 5f 61 75 74 6f 65 78 74  litetest_autoext
1e260 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
1e270 20 20 20 53 71 6c 69 74 65 74 65 73 74 5f 62 6c     Sqlitetest_bl
1e280 6f 62 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  ob_Init(interp);
1e290 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 5f  .    Sqlitetest_
1e2a0 64 65 6d 6f 76 66 73 5f 49 6e 69 74 28 69 6e 74  demovfs_Init(int
1e2b0 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1e2c0 74 65 73 74 5f 66 75 6e 63 5f 49 6e 69 74 28 69  test_func_Init(i
1e2d0 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1e2e0 74 65 74 65 73 74 5f 68 65 78 69 6f 5f 49 6e 69  tetest_hexio_Ini
1e2f0 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
1e300 71 6c 69 74 65 74 65 73 74 5f 69 6e 69 74 5f 49  qlitetest_init_I
1e310 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1e320 20 53 71 6c 69 74 65 74 65 73 74 5f 6d 61 6c 6c   Sqlitetest_mall
1e330 6f 63 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  oc_Init(interp);
1e340 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 5f  .    Sqlitetest_
1e350 6d 75 74 65 78 5f 49 6e 69 74 28 69 6e 74 65 72  mutex_Init(inter
1e360 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
1e370 73 74 73 63 68 65 6d 61 5f 49 6e 69 74 28 69 6e  stschema_Init(in
1e380 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
1e390 65 74 65 73 74 74 63 6c 76 61 72 5f 49 6e 69 74  etesttclvar_Init
1e3a0 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1e3b0 6c 69 74 65 74 65 73 74 66 73 5f 49 6e 69 74 28  litetestfs_Init(
1e3c0 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
1e3d0 69 74 65 74 65 73 74 54 68 72 65 61 64 5f 49 6e  itetestThread_In
1e3e0 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1e3f0 53 71 6c 69 74 65 74 65 73 74 4f 6e 65 66 69 6c  SqlitetestOnefil
1e400 65 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  e_Init(interp);.
1e410 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 4f 73      SqlitetestOs
1e420 69 6e 73 74 5f 49 6e 69 74 28 69 6e 74 65 72 70  inst_Init(interp
1e430 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
1e440 74 62 61 63 6b 75 70 5f 49 6e 69 74 28 69 6e 74  tbackup_Init(int
1e450 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1e460 74 65 73 74 69 6e 74 61 72 72 61 79 5f 49 6e 69  testintarray_Ini
1e470 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
1e480 71 6c 69 74 65 74 65 73 74 76 66 73 5f 49 6e 69  qlitetestvfs_Ini
1e490 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
1e4a0 71 6c 69 74 65 74 65 73 74 72 74 72 65 65 5f 49  qlitetestrtree_I
1e4b0 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1e4c0 20 53 71 6c 69 74 65 71 75 6f 74 61 5f 49 6e 69   Sqlitequota_Ini
1e4d0 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
1e4e0 71 6c 69 74 65 6d 75 6c 74 69 70 6c 65 78 5f 49  qlitemultiplex_I
1e4f0 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1e500 20 53 71 6c 69 74 65 53 75 70 65 72 6c 6f 63 6b   SqliteSuperlock
1e510 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
1e520 20 20 20 53 71 6c 69 74 65 74 65 73 74 53 79 73     SqlitetestSys
1e530 63 61 6c 6c 5f 49 6e 69 74 28 69 6e 74 65 72 70  call_Init(interp
1e540 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  );.#if defined(S
1e550 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53  QLITE_ENABLE_SES
1e560 53 49 4f 4e 29 20 26 26 20 64 65 66 69 6e 65 64  SION) && defined
1e570 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50  (SQLITE_ENABLE_P
1e580 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 29 0a 20  REUPDATE_HOOK). 
1e590 20 20 20 54 65 73 74 53 65 73 73 69 6f 6e 5f 49     TestSession_I
1e5a0 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 23 65 6e  nit(interp);.#en
1e5b0 64 69 66 0a 20 20 20 20 46 74 73 35 74 63 6c 5f  dif.    Fts5tcl_
1e5c0 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
1e5d0 20 20 53 71 6c 69 74 65 52 62 75 5f 49 6e 69 74    SqliteRbu_Init
1e5e0 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1e5f0 6c 69 74 65 74 65 73 74 74 63 6c 5f 49 6e 69 74  litetesttcl_Init
1e600 28 69 6e 74 65 72 70 29 3b 0a 0a 23 69 66 20 64  (interp);..#if d
1e610 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
1e620 41 42 4c 45 5f 46 54 53 33 29 20 7c 7c 20 64 65  ABLE_FTS3) || de
1e630 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
1e640 42 4c 45 5f 46 54 53 34 29 0a 20 20 20 20 53 71  BLE_FTS4).    Sq
1e650 6c 69 74 65 74 65 73 74 66 74 73 33 5f 49 6e 69  litetestfts3_Ini
1e660 74 28 69 6e 74 65 72 70 29 3b 0a 23 65 6e 64 69  t(interp);.#endi
1e670 66 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74  f..    Tcl_Creat
1e680 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 0a 20 20 20  eObjCommand(.   
1e690 20 20 20 20 20 69 6e 74 65 72 70 2c 20 22 6c 6f       interp, "lo
1e6a0 61 64 5f 74 65 73 74 66 69 78 74 75 72 65 5f 65  ad_testfixture_e
1e6b0 78 74 65 6e 73 69 6f 6e 73 22 2c 20 69 6e 69 74  xtensions", init
1e6c0 5f 61 6c 6c 5f 63 6d 64 2c 20 30 2c 20 30 0a 20  _all_cmd, 0, 0. 
1e6d0 20 20 20 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72     );.    Tcl_Cr
1e6e0 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 0a  eateObjCommand(.
1e6f0 20 20 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20          interp, 
1e700 22 64 62 5f 75 73 65 5f 6c 65 67 61 63 79 5f 70  "db_use_legacy_p
1e710 72 65 70 61 72 65 22 2c 20 64 62 5f 75 73 65 5f  repare", db_use_
1e720 6c 65 67 61 63 79 5f 70 72 65 70 61 72 65 5f 63  legacy_prepare_c
1e730 6d 64 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a  md, 0, 0.    );.
1e740 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
1e750 6a 43 6f 6d 6d 61 6e 64 28 0a 20 20 20 20 20 20  jCommand(.      
1e760 20 20 69 6e 74 65 72 70 2c 20 22 64 62 5f 6c 61    interp, "db_la
1e770 73 74 5f 73 74 6d 74 5f 70 74 72 22 2c 20 64 62  st_stmt_ptr", db
1e780 5f 6c 61 73 74 5f 73 74 6d 74 5f 70 74 72 2c 20  _last_stmt_ptr, 
1e790 30 2c 20 30 0a 20 20 20 20 29 3b 0a 0a 23 69 66  0, 0.    );..#if
1e7a0 64 65 66 20 53 51 4c 49 54 45 5f 53 53 45 0a 20  def SQLITE_SSE. 
1e7b0 20 20 20 53 71 6c 69 74 65 74 65 73 74 73 73 65     Sqlitetestsse
1e7c0 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 23  _Init(interp);.#
1e7d0 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66  endif.  }.#endif
1e7e0 0a 7d 0a 0a 2f 2a 20 4e 65 65 64 65 64 20 66 6f  .}../* Needed fo
1e7f0 72 20 74 68 65 20 73 65 74 72 6c 69 6d 69 74 28  r the setrlimit(
1e800 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6f 6e  ) system call on
1e810 20 75 6e 69 78 20 2a 2f 0a 23 69 66 20 64 65 66   unix */.#if def
1e820 69 6e 65 64 28 75 6e 69 78 29 0a 23 69 6e 63 6c  ined(unix).#incl
1e830 75 64 65 20 3c 73 79 73 2f 72 65 73 6f 75 72 63  ude <sys/resourc
1e840 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 64 65  e.h>.#endif..#de
1e850 66 69 6e 65 20 54 43 4c 53 48 5f 4d 41 49 4e 20  fine TCLSH_MAIN 
1e860 6d 61 69 6e 20 20 20 2f 2a 20 4e 65 65 64 65 64  main   /* Needed
1e870 20 74 6f 20 66 61 6b 65 20 6f 75 74 20 6d 6b 74   to fake out mkt
1e880 63 6c 61 70 70 20 2a 2f 0a 69 6e 74 20 54 43 4c  clapp */.int TCL
1e890 53 48 5f 4d 41 49 4e 28 69 6e 74 20 61 72 67 63  SH_MAIN(int argc
1e8a0 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a  , char **argv){.
1e8b0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1e8c0 74 65 72 70 3b 0a 0a 23 69 66 20 21 64 65 66 69  terp;..#if !defi
1e8d0 6e 65 64 28 5f 57 49 4e 33 32 5f 57 43 45 29 0a  ned(_WIN32_WCE).
1e8e0 20 20 69 66 28 20 67 65 74 65 6e 76 28 22 42 52    if( getenv("BR
1e8f0 45 41 4b 22 29 20 29 7b 0a 20 20 20 20 66 70 72  EAK") ){.    fpr
1e900 69 6e 74 66 28 73 74 64 65 72 72 2c 0a 20 20 20  intf(stderr,.   
1e910 20 20 20 20 20 22 61 74 74 61 63 68 20 64 65 62       "attach deb
1e920 75 67 67 65 72 20 74 6f 20 70 72 6f 63 65 73 73  ugger to process
1e930 20 25 64 20 61 6e 64 20 70 72 65 73 73 20 61 6e   %d and press an
1e940 79 20 6b 65 79 20 74 6f 20 63 6f 6e 74 69 6e 75  y key to continu
1e950 65 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 47  e.\n",.        G
1e960 45 54 50 49 44 28 29 29 3b 0a 20 20 20 20 66 67  ETPID());.    fg
1e970 65 74 63 28 73 74 64 69 6e 29 3b 0a 20 20 7d 0a  etc(stdin);.  }.
1e980 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 69 6e  #endif..  /* Sin
1e990 63 65 20 74 68 65 20 70 72 69 6d 61 72 79 20 75  ce the primary u
1e9a0 73 65 20 63 61 73 65 20 66 6f 72 20 74 68 69 73  se case for this
1e9b0 20 62 69 6e 61 72 79 20 69 73 20 74 65 73 74 69   binary is testi
1e9c0 6e 67 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20 20  ng of SQLite,.  
1e9d0 2a 2a 20 62 65 20 73 75 72 65 20 74 6f 20 67 65  ** be sure to ge
1e9e0 6e 65 72 61 74 65 20 63 6f 72 65 20 66 69 6c 65  nerate core file
1e9f0 73 20 69 66 20 77 65 20 63 72 61 73 68 20 2a 2f  s if we crash */
1ea00 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
1ea10 49 54 45 5f 54 45 53 54 29 20 26 26 20 64 65 66  ITE_TEST) && def
1ea20 69 6e 65 64 28 75 6e 69 78 29 0a 20 20 7b 20 73  ined(unix).  { s
1ea30 74 72 75 63 74 20 72 6c 69 6d 69 74 20 78 3b 0a  truct rlimit x;.
1ea40 20 20 20 20 67 65 74 72 6c 69 6d 69 74 28 52 4c      getrlimit(RL
1ea50 49 4d 49 54 5f 43 4f 52 45 2c 20 26 78 29 3b 0a  IMIT_CORE, &x);.
1ea60 20 20 20 20 78 2e 72 6c 69 6d 5f 63 75 72 20 3d      x.rlim_cur =
1ea70 20 78 2e 72 6c 69 6d 5f 6d 61 78 3b 0a 20 20 20   x.rlim_max;.   
1ea80 20 73 65 74 72 6c 69 6d 69 74 28 52 4c 49 4d 49   setrlimit(RLIMI
1ea90 54 5f 43 4f 52 45 2c 20 26 78 29 3b 0a 20 20 7d  T_CORE, &x);.  }
1eaa0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1eab0 45 5f 54 45 53 54 20 26 26 20 75 6e 69 78 20 2a  E_TEST && unix *
1eac0 2f 0a 0a 0a 20 20 2f 2a 20 43 61 6c 6c 20 73 71  /...  /* Call sq
1ead0 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 29  lite3_shutdown()
1eae0 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 64 6f 69   once before doi
1eaf0 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65  ng anything else
1eb00 2e 20 54 68 69 73 20 69 73 20 74 6f 0a 20 20 2a  . This is to.  *
1eb10 2a 20 74 65 73 74 20 74 68 61 74 20 73 71 6c 69  * test that sqli
1eb20 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 29 20 63  te3_shutdown() c
1eb30 61 6e 20 62 65 20 73 61 66 65 6c 79 20 63 61 6c  an be safely cal
1eb40 6c 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  led by a process
1eb50 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 73 71 6c   before.  ** sql
1eb60 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
1eb70 29 20 69 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  ) is. */.  sqlit
1eb80 65 33 5f 73 68 75 74 64 6f 77 6e 28 29 3b 0a 0a  e3_shutdown();..
1eb90 20 20 54 63 6c 5f 46 69 6e 64 45 78 65 63 75 74    Tcl_FindExecut
1eba0 61 62 6c 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20  able(argv[0]);. 
1ebb0 20 54 63 6c 5f 53 65 74 53 79 73 74 65 6d 45 6e   Tcl_SetSystemEn
1ebc0 63 6f 64 69 6e 67 28 4e 55 4c 4c 2c 20 22 75 74  coding(NULL, "ut
1ebd0 66 2d 38 22 29 3b 0a 20 20 69 6e 74 65 72 70 20  f-8");.  interp 
1ebe0 3d 20 54 63 6c 5f 43 72 65 61 74 65 49 6e 74 65  = Tcl_CreateInte
1ebf0 72 70 28 29 3b 0a 0a 23 69 66 20 54 43 4c 53 48  rp();..#if TCLSH
1ec00 3d 3d 32 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  ==2.  sqlite3_co
1ec10 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46  nfig(SQLITE_CONF
1ec20 49 47 5f 53 49 4e 47 4c 45 54 48 52 45 41 44 29  IG_SINGLETHREAD)
1ec30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 6e 69 74  ;.#endif..  init
1ec40 5f 61 6c 6c 28 69 6e 74 65 72 70 29 3b 0a 20 20  _all(interp);.  
1ec50 69 66 28 20 61 72 67 63 3e 3d 32 20 29 7b 0a 20  if( argc>=2 ){. 
1ec60 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 68     int i;.    ch
1ec70 61 72 20 7a 41 72 67 63 5b 33 32 5d 3b 0a 20 20  ar zArgc[32];.  
1ec80 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
1ec90 74 66 28 73 69 7a 65 6f 66 28 7a 41 72 67 63 29  tf(sizeof(zArgc)
1eca0 2c 20 7a 41 72 67 63 2c 20 22 25 64 22 2c 20 61  , zArgc, "%d", a
1ecb0 72 67 63 2d 28 33 2d 54 43 4c 53 48 29 29 3b 0a  rgc-(3-TCLSH));.
1ecc0 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69      Tcl_SetVar(i
1ecd0 6e 74 65 72 70 2c 22 61 72 67 63 22 2c 20 7a 41  nterp,"argc", zA
1ece0 72 67 63 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f  rgc, TCL_GLOBAL_
1ecf0 4f 4e 4c 59 29 3b 0a 20 20 20 20 54 63 6c 5f 53  ONLY);.    Tcl_S
1ed00 65 74 56 61 72 28 69 6e 74 65 72 70 2c 22 61 72  etVar(interp,"ar
1ed10 67 76 30 22 2c 61 72 67 76 5b 31 5d 2c 54 43 4c  gv0",argv[1],TCL
1ed20 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20  _GLOBAL_ONLY);. 
1ed30 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e     Tcl_SetVar(in
1ed40 74 65 72 70 2c 22 61 72 67 76 22 2c 20 22 22 2c  terp,"argv", "",
1ed50 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59   TCL_GLOBAL_ONLY
1ed60 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 33 2d 54  );.    for(i=3-T
1ed70 43 4c 53 48 3b 20 69 3c 61 72 67 63 3b 20 69 2b  CLSH; i<argc; i+
1ed80 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65  +){.      Tcl_Se
1ed90 74 56 61 72 28 69 6e 74 65 72 70 2c 20 22 61 72  tVar(interp, "ar
1eda0 67 76 22 2c 20 61 72 67 76 5b 69 5d 2c 0a 20 20  gv", argv[i],.  
1edb0 20 20 20 20 20 20 20 20 54 43 4c 5f 47 4c 4f 42          TCL_GLOB
1edc0 41 4c 5f 4f 4e 4c 59 20 7c 20 54 43 4c 5f 4c 49  AL_ONLY | TCL_LI
1edd0 53 54 5f 45 4c 45 4d 45 4e 54 20 7c 20 54 43 4c  ST_ELEMENT | TCL
1ede0 5f 41 50 50 45 4e 44 5f 56 41 4c 55 45 29 3b 0a  _APPEND_VALUE);.
1edf0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 54 43      }.    if( TC
1ee00 4c 53 48 3d 3d 31 20 26 26 20 54 63 6c 5f 45 76  LSH==1 && Tcl_Ev
1ee10 61 6c 46 69 6c 65 28 69 6e 74 65 72 70 2c 20 61  alFile(interp, a
1ee20 72 67 76 5b 31 5d 29 21 3d 54 43 4c 5f 4f 4b 20  rgv[1])!=TCL_OK 
1ee30 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
1ee40 68 61 72 20 2a 7a 49 6e 66 6f 20 3d 20 54 63 6c  har *zInfo = Tcl
1ee50 5f 47 65 74 56 61 72 28 69 6e 74 65 72 70 2c 20  _GetVar(interp, 
1ee60 22 65 72 72 6f 72 49 6e 66 6f 22 2c 20 54 43 4c  "errorInfo", TCL
1ee70 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20  _GLOBAL_ONLY);. 
1ee80 20 20 20 20 20 69 66 28 20 7a 49 6e 66 6f 3d 3d       if( zInfo==
1ee90 30 20 29 20 7a 49 6e 66 6f 20 3d 20 54 63 6c 5f  0 ) zInfo = Tcl_
1eea0 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28  GetStringResult(
1eeb0 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 20 20 66  interp);.      f
1eec0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25  printf(stderr,"%
1eed0 73 3a 20 25 73 5c 6e 22 2c 20 2a 61 72 67 76 2c  s: %s\n", *argv,
1eee0 20 7a 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 72   zInfo);.      r
1eef0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
1ef00 20 7d 0a 20 20 69 66 28 20 54 43 4c 53 48 3d 3d   }.  if( TCLSH==
1ef10 32 20 7c 7c 20 61 72 67 63 3c 3d 31 20 29 7b 0a  2 || argc<=1 ){.
1ef20 20 20 20 20 54 63 6c 5f 47 6c 6f 62 61 6c 45 76      Tcl_GlobalEv
1ef30 61 6c 28 69 6e 74 65 72 70 2c 20 74 63 6c 73 68  al(interp, tclsh
1ef40 5f 6d 61 69 6e 5f 6c 6f 6f 70 28 29 29 3b 0a 20  _main_loop());. 
1ef50 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
1ef60 0a 23 65 6e 64 69 66 20 2f 2a 20 54 43 4c 53 48  .#endif /* TCLSH
1ef70 20 2a 2f 0a                                       */.