/ Hex Artifact Content
Login

Artifact b2fa693e57720dc87c18183dd5c0399bf7038ebd:


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: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
1780: 53 54 0a 20 20 69 6e 74 20 62 4c 65 67 61 63 79  ST.  int bLegacy
1790: 50 72 65 70 61 72 65 3b 20 20 20 20 20 20 20 20  Prepare;        
17a0: 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 73  /* True to use s
17b0: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 29  qlite3_prepare()
17c0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 73   */.#endif.};..s
17d0: 74 72 75 63 74 20 49 6e 63 72 62 6c 6f 62 43 68  truct IncrblobCh
17e0: 61 6e 6e 65 6c 20 7b 0a 20 20 73 71 6c 69 74 65  annel {.  sqlite
17f0: 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 3b 20 20  3_blob *pBlob;  
1800: 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 20 62      /* sqlite3 b
1810: 6c 6f 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  lob handle */.  
1820: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 3b 20 20  SqliteDb *pDb;  
1830: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73            /* Ass
1840: 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65  ociated database
1850: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
1860: 20 69 6e 74 20 69 53 65 65 6b 3b 20 20 20 20 20   int iSeek;     
1870: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
1880: 72 72 65 6e 74 20 73 65 65 6b 20 6f 66 66 73 65  rrent seek offse
1890: 74 20 2a 2f 0a 20 20 54 63 6c 5f 43 68 61 6e 6e  t */.  Tcl_Chann
18a0: 65 6c 20 63 68 61 6e 6e 65 6c 3b 20 20 20 20 20  el channel;     
18b0: 20 2f 2a 20 43 68 61 6e 6e 65 6c 20 69 64 65 6e   /* Channel iden
18c0: 74 69 66 69 65 72 20 2a 2f 0a 20 20 49 6e 63 72  tifier */.  Incr
18d0: 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 4e 65  blobChannel *pNe
18e0: 78 74 3b 20 20 20 2f 2a 20 4c 69 6e 6b 65 64 20  xt;   /* Linked 
18f0: 6c 69 73 74 20 6f 66 20 61 6c 6c 20 6f 70 65 6e  list of all open
1900: 20 69 6e 63 72 62 6c 6f 62 20 63 68 61 6e 6e 65   incrblob channe
1910: 6c 73 20 2a 2f 0a 20 20 49 6e 63 72 62 6c 6f 62  ls */.  Incrblob
1920: 43 68 61 6e 6e 65 6c 20 2a 70 50 72 65 76 3b 20  Channel *pPrev; 
1930: 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74    /* Linked list
1940: 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 69 6e 63   of all open inc
1950: 72 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 73 20 2a  rblob channels *
1960: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  /.};../*.** Comp
1970: 75 74 65 20 61 20 73 74 72 69 6e 67 20 6c 65 6e  ute a string len
1980: 67 74 68 20 74 68 61 74 20 69 73 20 6c 69 6d 69  gth that is limi
1990: 74 65 64 20 74 6f 20 77 68 61 74 20 63 61 6e 20  ted to what can 
19a0: 62 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20  be stored in.** 
19b0: 6c 6f 77 65 72 20 33 30 20 62 69 74 73 20 6f 66  lower 30 bits of
19c0: 20 61 20 33 32 2d 62 69 74 20 73 69 67 6e 65 64   a 32-bit signed
19d0: 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74 61   integer..*/.sta
19e0: 74 69 63 20 69 6e 74 20 73 74 72 6c 65 6e 33 30  tic int strlen30
19f0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
1a00: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1a10: 32 20 3d 20 7a 3b 0a 20 20 77 68 69 6c 65 28 20  2 = z;.  while( 
1a20: 2a 7a 32 20 29 7b 20 7a 32 2b 2b 3b 20 7d 0a 20  *z2 ){ z2++; }. 
1a30: 20 72 65 74 75 72 6e 20 30 78 33 66 66 66 66 66   return 0x3fffff
1a40: 66 66 20 26 20 28 69 6e 74 29 28 7a 32 20 2d 20  ff & (int)(z2 - 
1a50: 7a 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20  z);.}...#ifndef 
1a60: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
1a70: 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  BLOB./*.** Close
1a80: 20 61 6c 6c 20 69 6e 63 72 62 6c 6f 62 20 63 68   all incrblob ch
1a90: 61 6e 6e 65 6c 73 20 6f 70 65 6e 65 64 20 75 73  annels opened us
1aa0: 69 6e 67 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ing database con
1ab0: 6e 65 63 74 69 6f 6e 20 70 44 62 2e 0a 2a 2a 20  nection pDb..** 
1ac0: 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 77  This is called w
1ad0: 68 65 6e 20 73 68 75 74 74 69 6e 67 20 64 6f 77  hen shutting dow
1ae0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  n the database c
1af0: 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  onnection..*/.st
1b00: 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 49  atic void closeI
1b10: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 73 28  ncrblobChannels(
1b20: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 29 7b 0a  SqliteDb *pDb){.
1b30: 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65    IncrblobChanne
1b40: 6c 20 2a 70 3b 0a 20 20 49 6e 63 72 62 6c 6f 62  l *p;.  Incrblob
1b50: 43 68 61 6e 6e 65 6c 20 2a 70 4e 65 78 74 3b 0a  Channel *pNext;.
1b60: 0a 20 20 66 6f 72 28 70 3d 70 44 62 2d 3e 70 49  .  for(p=pDb->pI
1b70: 6e 63 72 62 6c 6f 62 3b 20 70 3b 20 70 3d 70 4e  ncrblob; p; p=pN
1b80: 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20  ext){.    pNext 
1b90: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 20  = p->pNext;..   
1ba0: 20 2f 2a 20 4e 6f 74 65 3a 20 43 61 6c 6c 69 6e   /* Note: Callin
1bb0: 67 20 75 6e 72 65 67 69 73 74 65 72 20 68 65 72  g unregister her
1bc0: 65 20 63 61 6c 6c 20 54 63 6c 5f 43 6c 6f 73 65  e call Tcl_Close
1bd0: 20 6f 6e 20 74 68 65 20 69 6e 63 72 62 6c 6f 62   on the incrblob
1be0: 20 63 68 61 6e 6e 65 6c 2c 20 0a 20 20 20 20 2a   channel, .    *
1bf0: 2a 20 77 68 69 63 68 20 64 65 6c 65 74 65 73 20  * which deletes 
1c00: 74 68 65 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e  the IncrblobChan
1c10: 6e 65 6c 20 73 74 72 75 63 74 75 72 65 20 61 74  nel structure at
1c20: 20 2a 70 2e 20 53 6f 20 64 6f 20 6e 6f 74 0a 20   *p. So do not. 
1c30: 20 20 20 2a 2a 20 63 61 6c 6c 20 54 63 6c 5f 46     ** call Tcl_F
1c40: 72 65 65 28 29 20 68 65 72 65 2e 0a 20 20 20 20  ree() here..    
1c50: 2a 2f 0a 20 20 20 20 54 63 6c 5f 55 6e 72 65 67  */.    Tcl_Unreg
1c60: 69 73 74 65 72 43 68 61 6e 6e 65 6c 28 70 44 62  isterChannel(pDb
1c70: 2d 3e 69 6e 74 65 72 70 2c 20 70 2d 3e 63 68 61  ->interp, p->cha
1c80: 6e 6e 65 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  nnel);.  }.}../*
1c90: 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 69 6e 63  .** Close an inc
1ca0: 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 68  remental blob ch
1cb0: 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  annel..*/.static
1cc0: 20 69 6e 74 20 69 6e 63 72 62 6c 6f 62 43 6c 6f   int incrblobClo
1cd0: 73 65 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e  se(ClientData in
1ce0: 73 74 61 6e 63 65 44 61 74 61 2c 20 54 63 6c 5f  stanceData, Tcl_
1cf0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b  Interp *interp){
1d00: 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  .  IncrblobChann
1d10: 65 6c 20 2a 70 20 3d 20 28 49 6e 63 72 62 6c 6f  el *p = (Incrblo
1d20: 62 43 68 61 6e 6e 65 6c 20 2a 29 69 6e 73 74 61  bChannel *)insta
1d30: 6e 63 65 44 61 74 61 3b 0a 20 20 69 6e 74 20 72  nceData;.  int r
1d40: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  c = sqlite3_blob
1d50: 5f 63 6c 6f 73 65 28 70 2d 3e 70 42 6c 6f 62 29  _close(p->pBlob)
1d60: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
1d70: 3d 20 70 2d 3e 70 44 62 2d 3e 64 62 3b 0a 0a 20  = p->pDb->db;.. 
1d80: 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 63   /* Remove the c
1d90: 68 61 6e 6e 65 6c 20 66 72 6f 6d 20 74 68 65 20  hannel from the 
1da0: 53 71 6c 69 74 65 44 62 2e 70 49 6e 63 72 62 6c  SqliteDb.pIncrbl
1db0: 6f 62 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 69 66  ob list. */.  if
1dc0: 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  ( p->pNext ){.  
1dd0: 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65    p->pNext->pPre
1de0: 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20  v = p->pPrev;.  
1df0: 7d 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76  }.  if( p->pPrev
1e00: 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76   ){.    p->pPrev
1e10: 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65  ->pNext = p->pNe
1e20: 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  xt;.  }.  if( p-
1e30: 3e 70 44 62 2d 3e 70 49 6e 63 72 62 6c 6f 62 3d  >pDb->pIncrblob=
1e40: 3d 70 20 29 7b 0a 20 20 20 20 70 2d 3e 70 44 62  =p ){.    p->pDb
1e50: 2d 3e 70 49 6e 63 72 62 6c 6f 62 20 3d 20 70 2d  ->pIncrblob = p-
1e60: 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 2f  >pNext;.  }..  /
1e70: 2a 20 46 72 65 65 20 74 68 65 20 49 6e 63 72 62  * Free the Incrb
1e80: 6c 6f 62 43 68 61 6e 6e 65 6c 20 73 74 72 75 63  lobChannel struc
1e90: 74 75 72 65 20 2a 2f 0a 20 20 54 63 6c 5f 46 72  ture */.  Tcl_Fr
1ea0: 65 65 28 28 63 68 61 72 20 2a 29 70 29 3b 0a 0a  ee((char *)p);..
1eb0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1ec0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53  _OK ){.    Tcl_S
1ed0: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
1ee0: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
1ef0: 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 54 43 4c  _errmsg(db), TCL
1f00: 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20  _VOLATILE);.    
1f10: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1f20: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
1f30: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1f40: 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61  Read data from a
1f50: 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c  n incremental bl
1f60: 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73  ob channel..*/.s
1f70: 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 62 6c  tatic int incrbl
1f80: 6f 62 49 6e 70 75 74 28 0a 20 20 43 6c 69 65 6e  obInput(.  Clien
1f90: 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61  tData instanceDa
1fa0: 74 61 2c 20 0a 20 20 63 68 61 72 20 2a 62 75 66  ta, .  char *buf
1fb0: 2c 20 0a 20 20 69 6e 74 20 62 75 66 53 69 7a 65  , .  int bufSize
1fc0: 2c 0a 20 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f  ,.  int *errorCo
1fd0: 64 65 50 74 72 0a 29 7b 0a 20 20 49 6e 63 72 62  dePtr.){.  Incrb
1fe0: 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 20 3d 20  lobChannel *p = 
1ff0: 28 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c  (IncrblobChannel
2000: 20 2a 29 69 6e 73 74 61 6e 63 65 44 61 74 61 3b   *)instanceData;
2010: 0a 20 20 69 6e 74 20 6e 52 65 61 64 20 3d 20 62  .  int nRead = b
2020: 75 66 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  ufSize;         
2030: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
2040: 65 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20  es to read */.  
2050: 69 6e 74 20 6e 42 6c 6f 62 3b 20 20 20 20 20 20  int nBlob;      
2060: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2070: 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68  Total size of th
2080: 65 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 6e 74 20  e blob */.  int 
2090: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
20a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
20b0: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f  te error code */
20c0: 0a 0a 20 20 6e 42 6c 6f 62 20 3d 20 73 71 6c 69  ..  nBlob = sqli
20d0: 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70  te3_blob_bytes(p
20e0: 2d 3e 70 42 6c 6f 62 29 3b 0a 20 20 69 66 28 20  ->pBlob);.  if( 
20f0: 28 70 2d 3e 69 53 65 65 6b 2b 6e 52 65 61 64 29  (p->iSeek+nRead)
2100: 3e 6e 42 6c 6f 62 20 29 7b 0a 20 20 20 20 6e 52  >nBlob ){.    nR
2110: 65 61 64 20 3d 20 6e 42 6c 6f 62 2d 70 2d 3e 69  ead = nBlob-p->i
2120: 53 65 65 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Seek;.  }.  if( 
2130: 6e 52 65 61 64 3c 3d 30 20 29 7b 0a 20 20 20 20  nRead<=0 ){.    
2140: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
2150: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c   rc = sqlite3_bl
2160: 6f 62 5f 72 65 61 64 28 70 2d 3e 70 42 6c 6f 62  ob_read(p->pBlob
2170: 2c 20 28 76 6f 69 64 20 2a 29 62 75 66 2c 20 6e  , (void *)buf, n
2180: 52 65 61 64 2c 20 70 2d 3e 69 53 65 65 6b 29 3b  Read, p->iSeek);
2190: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
21a0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 65 72 72  E_OK ){.    *err
21b0: 6f 72 43 6f 64 65 50 74 72 20 3d 20 72 63 3b 0a  orCodePtr = rc;.
21c0: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
21d0: 20 7d 0a 0a 20 20 70 2d 3e 69 53 65 65 6b 20 2b   }..  p->iSeek +
21e0: 3d 20 6e 52 65 61 64 3b 0a 20 20 72 65 74 75 72  = nRead;.  retur
21f0: 6e 20 6e 52 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  n nRead;.}../*.*
2200: 2a 20 57 72 69 74 65 20 64 61 74 61 20 74 6f 20  * Write data to 
2210: 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62  an incremental b
2220: 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a  lob channel..*/.
2230: 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 62  static int incrb
2240: 6c 6f 62 4f 75 74 70 75 74 28 0a 20 20 43 6c 69  lobOutput(.  Cli
2250: 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65  entData instance
2260: 44 61 74 61 2c 20 0a 20 20 43 4f 4e 53 54 20 63  Data, .  CONST c
2270: 68 61 72 20 2a 62 75 66 2c 20 0a 20 20 69 6e 74  har *buf, .  int
2280: 20 74 6f 57 72 69 74 65 2c 0a 20 20 69 6e 74 20   toWrite,.  int 
2290: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 0a 29 7b  *errorCodePtr.){
22a0: 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  .  IncrblobChann
22b0: 65 6c 20 2a 70 20 3d 20 28 49 6e 63 72 62 6c 6f  el *p = (Incrblo
22c0: 62 43 68 61 6e 6e 65 6c 20 2a 29 69 6e 73 74 61  bChannel *)insta
22d0: 6e 63 65 44 61 74 61 3b 0a 20 20 69 6e 74 20 6e  nceData;.  int n
22e0: 57 72 69 74 65 20 3d 20 74 6f 57 72 69 74 65 3b  Write = toWrite;
22f0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2300: 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 77 72  r of bytes to wr
2310: 69 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 6c  ite */.  int nBl
2320: 6f 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ob;             
2330: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73        /* Total s
2340: 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 62 20  ize of the blob 
2350: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
2360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2370: 20 20 2f 2a 20 73 71 6c 69 74 65 20 65 72 72 6f    /* sqlite erro
2380: 72 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 6e 42 6c  r code */..  nBl
2390: 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f  ob = sqlite3_blo
23a0: 62 5f 62 79 74 65 73 28 70 2d 3e 70 42 6c 6f 62  b_bytes(p->pBlob
23b0: 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 69 53 65  );.  if( (p->iSe
23c0: 65 6b 2b 6e 57 72 69 74 65 29 3e 6e 42 6c 6f 62  ek+nWrite)>nBlob
23d0: 20 29 7b 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f   ){.    *errorCo
23e0: 64 65 50 74 72 20 3d 20 45 49 4e 56 41 4c 3b 0a  dePtr = EINVAL;.
23f0: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
2400: 20 7d 0a 20 20 69 66 28 20 6e 57 72 69 74 65 3c   }.  if( nWrite<
2410: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
2420: 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20   0;.  }..  rc = 
2430: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69  sqlite3_blob_wri
2440: 74 65 28 70 2d 3e 70 42 6c 6f 62 2c 20 28 76 6f  te(p->pBlob, (vo
2450: 69 64 20 2a 29 62 75 66 2c 20 6e 57 72 69 74 65  id *)buf, nWrite
2460: 2c 20 70 2d 3e 69 53 65 65 6b 29 3b 0a 20 20 69  , p->iSeek);.  i
2470: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2480: 20 29 7b 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f   ){.    *errorCo
2490: 64 65 50 74 72 20 3d 20 45 49 4f 3b 0a 20 20 20  dePtr = EIO;.   
24a0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a   return -1;.  }.
24b0: 0a 20 20 70 2d 3e 69 53 65 65 6b 20 2b 3d 20 6e  .  p->iSeek += n
24c0: 57 72 69 74 65 3b 0a 20 20 72 65 74 75 72 6e 20  Write;.  return 
24d0: 6e 57 72 69 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nWrite;.}../*.**
24e0: 20 53 65 65 6b 20 61 6e 20 69 6e 63 72 65 6d 65   Seek an increme
24f0: 6e 74 61 6c 20 62 6c 6f 62 20 63 68 61 6e 6e 65  ntal blob channe
2500: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
2510: 20 69 6e 63 72 62 6c 6f 62 53 65 65 6b 28 0a 20   incrblobSeek(. 
2520: 20 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74   ClientData inst
2530: 61 6e 63 65 44 61 74 61 2c 20 0a 20 20 6c 6f 6e  anceData, .  lon
2540: 67 20 6f 66 66 73 65 74 2c 0a 20 20 69 6e 74 20  g offset,.  int 
2550: 73 65 65 6b 4d 6f 64 65 2c 0a 20 20 69 6e 74 20  seekMode,.  int 
2560: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 0a 29 7b  *errorCodePtr.){
2570: 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  .  IncrblobChann
2580: 65 6c 20 2a 70 20 3d 20 28 49 6e 63 72 62 6c 6f  el *p = (Incrblo
2590: 62 43 68 61 6e 6e 65 6c 20 2a 29 69 6e 73 74 61  bChannel *)insta
25a0: 6e 63 65 44 61 74 61 3b 0a 0a 20 20 73 77 69 74  nceData;..  swit
25b0: 63 68 28 20 73 65 65 6b 4d 6f 64 65 20 29 7b 0a  ch( seekMode ){.
25c0: 20 20 20 20 63 61 73 65 20 53 45 45 4b 5f 53 45      case SEEK_SE
25d0: 54 3a 0a 20 20 20 20 20 20 70 2d 3e 69 53 65 65  T:.      p->iSee
25e0: 6b 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20  k = offset;.    
25f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
2600: 65 20 53 45 45 4b 5f 43 55 52 3a 0a 20 20 20 20  e SEEK_CUR:.    
2610: 20 20 70 2d 3e 69 53 65 65 6b 20 2b 3d 20 6f 66    p->iSeek += of
2620: 66 73 65 74 3b 0a 20 20 20 20 20 20 62 72 65 61  fset;.      brea
2630: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 45 45 4b  k;.    case SEEK
2640: 5f 45 4e 44 3a 0a 20 20 20 20 20 20 70 2d 3e 69  _END:.      p->i
2650: 53 65 65 6b 20 3d 20 73 71 6c 69 74 65 33 5f 62  Seek = sqlite3_b
2660: 6c 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70 42 6c  lob_bytes(p->pBl
2670: 6f 62 29 20 2b 20 6f 66 66 73 65 74 3b 0a 20 20  ob) + offset;.  
2680: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
2690: 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28  default: assert(
26a0: 21 22 42 61 64 20 73 65 65 6b 4d 6f 64 65 22 29  !"Bad seekMode")
26b0: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
26c0: 70 2d 3e 69 53 65 65 6b 3b 0a 7d 0a 0a 0a 73 74  p->iSeek;.}...st
26d0: 61 74 69 63 20 76 6f 69 64 20 69 6e 63 72 62 6c  atic void incrbl
26e0: 6f 62 57 61 74 63 68 28 43 6c 69 65 6e 74 44 61  obWatch(ClientDa
26f0: 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c  ta instanceData,
2700: 20 69 6e 74 20 6d 6f 64 65 29 7b 20 0a 20 20 2f   int mode){ .  /
2710: 2a 20 4e 4f 2d 4f 50 20 2a 2f 20 0a 7d 0a 73 74  * NO-OP */ .}.st
2720: 61 74 69 63 20 69 6e 74 20 69 6e 63 72 62 6c 6f  atic int incrblo
2730: 62 48 61 6e 64 6c 65 28 43 6c 69 65 6e 74 44 61  bHandle(ClientDa
2740: 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c  ta instanceData,
2750: 20 69 6e 74 20 64 69 72 2c 20 43 6c 69 65 6e 74   int dir, Client
2760: 44 61 74 61 20 2a 68 50 74 72 29 7b 0a 20 20 72  Data *hPtr){.  r
2770: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2780: 0a 7d 0a 0a 73 74 61 74 69 63 20 54 63 6c 5f 43  .}..static Tcl_C
2790: 68 61 6e 6e 65 6c 54 79 70 65 20 49 6e 63 72 62  hannelType Incrb
27a0: 6c 6f 62 43 68 61 6e 6e 65 6c 54 79 70 65 20 3d  lobChannelType =
27b0: 20 7b 0a 20 20 22 69 6e 63 72 62 6c 6f 62 22 2c   {.  "incrblob",
27c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d0: 20 20 20 20 20 20 20 20 2f 2a 20 74 79 70 65 4e          /* typeN
27e0: 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ame             
27f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2800: 2a 2f 0a 20 20 54 43 4c 5f 43 48 41 4e 4e 45 4c  */.  TCL_CHANNEL
2810: 5f 56 45 52 53 49 4f 4e 5f 32 2c 20 20 20 20 20  _VERSION_2,     
2820: 20 20 20 20 20 20 20 20 2f 2a 20 76 65 72 73 69          /* versi
2830: 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  on              
2840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2850: 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 43 6c 6f  */.  incrblobClo
2860: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
2870: 20 20 20 20 20 20 20 20 2f 2a 20 63 6c 6f 73 65          /* close
2880: 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20  Proc            
2890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a0: 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 49 6e 70  */.  incrblobInp
28b0: 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ut,             
28c0: 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 70 75 74          /* input
28d0: 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20  Proc            
28e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f0: 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 4f 75 74  */.  incrblobOut
2900: 70 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  put,            
2910: 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 70 75          /* outpu
2920: 74 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20  tProc           
2930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2940: 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 53 65 65  */.  incrblobSee
2950: 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
2960: 20 20 20 20 20 20 20 20 2f 2a 20 73 65 65 6b 50          /* seekP
2970: 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20  roc             
2980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2990: 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
29a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b0: 20 20 20 20 20 20 20 20 2f 2a 20 73 65 74 4f 70          /* setOp
29c0: 74 69 6f 6e 50 72 6f 63 20 20 20 20 20 20 20 20  tionProc        
29d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e0: 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a00: 20 20 20 20 20 20 20 20 2f 2a 20 67 65 74 4f 70          /* getOp
2a10: 74 69 6f 6e 50 72 6f 63 20 20 20 20 20 20 20 20  tionProc        
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a30: 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 57 61 74  */.  incrblobWat
2a40: 63 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ch,             
2a50: 20 20 20 20 20 20 20 20 2f 2a 20 77 61 74 63 68          /* watch
2a60: 50 72 6f 63 20 28 74 68 69 73 20 69 73 20 61 20  Proc (this is a 
2a70: 6e 6f 2d 6f 70 29 20 20 20 20 20 20 20 20 20 20  no-op)          
2a80: 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 48 61 6e  */.  incrblobHan
2a90: 64 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  dle,            
2aa0: 20 20 20 20 20 20 20 20 2f 2a 20 67 65 74 48 61          /* getHa
2ab0: 6e 64 6c 65 50 72 6f 63 20 28 61 6c 77 61 79 73  ndleProc (always
2ac0: 20 72 65 74 75 72 6e 73 20 65 72 72 6f 72 29 20   returns error) 
2ad0: 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
2ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af0: 20 20 20 20 20 20 20 20 2f 2a 20 63 6c 6f 73 65          /* close
2b00: 32 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20  2Proc           
2b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b20: 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
2b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b40: 20 20 20 20 20 20 20 20 2f 2a 20 62 6c 6f 63 6b          /* block
2b50: 4d 6f 64 65 50 72 6f 63 20 20 20 20 20 20 20 20  ModeProc        
2b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b70: 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
2b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b90: 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 75 73 68          /* flush
2ba0: 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20  Proc            
2bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bc0: 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
2bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2be0: 20 20 20 20 20 20 20 20 2f 2a 20 68 61 6e 64 6c          /* handl
2bf0: 65 72 50 72 6f 63 20 20 20 20 20 20 20 20 20 20  erProc          
2c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c10: 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
2c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c30: 20 20 20 20 20 20 20 20 2f 2a 20 77 69 64 65 53          /* wideS
2c40: 65 65 6b 50 72 6f 63 20 20 20 20 20 20 20 20 20  eekProc         
2c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c60: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  */.};../*.** Cre
2c70: 61 74 65 20 61 20 6e 65 77 20 69 6e 63 72 62 6c  ate a new incrbl
2c80: 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73  ob channel..*/.s
2c90: 74 61 74 69 63 20 69 6e 74 20 63 72 65 61 74 65  tatic int create
2ca0: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 28  IncrblobChannel(
2cb0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
2cc0: 6e 74 65 72 70 2c 20 0a 20 20 53 71 6c 69 74 65  nterp, .  Sqlite
2cd0: 44 62 20 2a 70 44 62 2c 20 0a 20 20 63 6f 6e 73  Db *pDb, .  cons
2ce0: 74 20 63 68 61 72 20 2a 7a 44 62 2c 0a 20 20 63  t char *zDb,.  c
2cf0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c  onst char *zTabl
2d00: 65 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  e, .  const char
2d10: 20 2a 7a 43 6f 6c 75 6d 6e 2c 20 0a 20 20 73 71   *zColumn, .  sq
2d20: 6c 69 74 65 5f 69 6e 74 36 34 20 69 52 6f 77 2c  lite_int64 iRow,
2d30: 0a 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c  .  int isReadonl
2d40: 79 0a 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43  y.){.  IncrblobC
2d50: 68 61 6e 6e 65 6c 20 2a 70 3b 0a 20 20 73 71 6c  hannel *p;.  sql
2d60: 69 74 65 33 20 2a 64 62 20 3d 20 70 44 62 2d 3e  ite3 *db = pDb->
2d70: 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c  db;.  sqlite3_bl
2d80: 6f 62 20 2a 70 42 6c 6f 62 3b 0a 20 20 69 6e 74  ob *pBlob;.  int
2d90: 20 72 63 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73   rc;.  int flags
2da0: 20 3d 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 7c   = TCL_READABLE|
2db0: 28 69 73 52 65 61 64 6f 6e 6c 79 20 3f 20 30 20  (isReadonly ? 0 
2dc0: 3a 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 29 3b  : TCL_WRITABLE);
2dd0: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 76 61 72 69  ..  /* This vari
2de0: 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20  able is used to 
2df0: 6e 61 6d 65 20 74 68 65 20 63 68 61 6e 6e 65 6c  name the channel
2e00: 73 3a 20 22 69 6e 63 72 62 6c 6f 62 5f 5b 69 6e  s: "incrblob_[in
2e10: 63 72 20 63 6f 75 6e 74 5d 22 20 2a 2f 0a 20 20  cr count]" */.  
2e20: 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74  static int count
2e30: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 43 68   = 0;.  char zCh
2e40: 61 6e 6e 65 6c 5b 36 34 5d 3b 0a 0a 20 20 72 63  annel[64];..  rc
2e50: 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f   = sqlite3_blob_
2e60: 6f 70 65 6e 28 64 62 2c 20 7a 44 62 2c 20 7a 54  open(db, zDb, zT
2e70: 61 62 6c 65 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 69  able, zColumn, i
2e80: 52 6f 77 2c 20 21 69 73 52 65 61 64 6f 6e 6c 79  Row, !isReadonly
2e90: 2c 20 26 70 42 6c 6f 62 29 3b 0a 20 20 69 66 28  , &pBlob);.  if(
2ea0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2eb0: 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  {.    Tcl_SetRes
2ec0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
2ed0: 72 20 2a 29 73 71 6c 69 74 65 33 5f 65 72 72 6d  r *)sqlite3_errm
2ee0: 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 54 43 4c  sg(pDb->db), TCL
2ef0: 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20  _VOLATILE);.    
2f00: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2f10: 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 28 49 6e  ;.  }..  p = (In
2f20: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 29  crblobChannel *)
2f30: 54 63 6c 5f 41 6c 6c 6f 63 28 73 69 7a 65 6f 66  Tcl_Alloc(sizeof
2f40: 28 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c  (IncrblobChannel
2f50: 29 29 3b 0a 20 20 70 2d 3e 69 53 65 65 6b 20 3d  ));.  p->iSeek =
2f60: 20 30 3b 0a 20 20 70 2d 3e 70 42 6c 6f 62 20 3d   0;.  p->pBlob =
2f70: 20 70 42 6c 6f 62 3b 0a 0a 20 20 73 71 6c 69 74   pBlob;..  sqlit
2f80: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
2f90: 6f 66 28 7a 43 68 61 6e 6e 65 6c 29 2c 20 7a 43  of(zChannel), zC
2fa0: 68 61 6e 6e 65 6c 2c 20 22 69 6e 63 72 62 6c 6f  hannel, "incrblo
2fb0: 62 5f 25 64 22 2c 20 2b 2b 63 6f 75 6e 74 29 3b  b_%d", ++count);
2fc0: 0a 20 20 70 2d 3e 63 68 61 6e 6e 65 6c 20 3d 20  .  p->channel = 
2fd0: 54 63 6c 5f 43 72 65 61 74 65 43 68 61 6e 6e 65  Tcl_CreateChanne
2fe0: 6c 28 26 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  l(&IncrblobChann
2ff0: 65 6c 54 79 70 65 2c 20 7a 43 68 61 6e 6e 65 6c  elType, zChannel
3000: 2c 20 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 54  , p, flags);.  T
3010: 63 6c 5f 52 65 67 69 73 74 65 72 43 68 61 6e 6e  cl_RegisterChann
3020: 65 6c 28 69 6e 74 65 72 70 2c 20 70 2d 3e 63 68  el(interp, p->ch
3030: 61 6e 6e 65 6c 29 3b 0a 0a 20 20 2f 2a 20 4c 69  annel);..  /* Li
3040: 6e 6b 20 74 68 65 20 6e 65 77 20 63 68 61 6e 6e  nk the new chann
3050: 65 6c 20 69 6e 74 6f 20 74 68 65 20 53 71 6c 69  el into the Sqli
3060: 74 65 44 62 2e 70 49 6e 63 72 62 6c 6f 62 20 6c  teDb.pIncrblob l
3070: 69 73 74 2e 20 2a 2f 0a 20 20 70 2d 3e 70 4e 65  ist. */.  p->pNe
3080: 78 74 20 3d 20 70 44 62 2d 3e 70 49 6e 63 72 62  xt = pDb->pIncrb
3090: 6c 6f 62 3b 0a 20 20 70 2d 3e 70 50 72 65 76 20  lob;.  p->pPrev 
30a0: 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e  = 0;.  if( p->pN
30b0: 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e  ext ){.    p->pN
30c0: 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a  ext->pPrev = p;.
30d0: 20 20 7d 0a 20 20 70 44 62 2d 3e 70 49 6e 63 72    }.  pDb->pIncr
30e0: 62 6c 6f 62 20 3d 20 70 3b 0a 20 20 70 2d 3e 70  blob = p;.  p->p
30f0: 44 62 20 3d 20 70 44 62 3b 0a 0a 20 20 54 63 6c  Db = pDb;..  Tcl
3100: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
3110: 70 2c 20 28 63 68 61 72 20 2a 29 54 63 6c 5f 47  p, (char *)Tcl_G
3120: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 70 2d  etChannelName(p-
3130: 3e 63 68 61 6e 6e 65 6c 29 2c 20 54 43 4c 5f 56  >channel), TCL_V
3140: 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 72 65 74 75  OLATILE);.  retu
3150: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6c  rn TCL_OK;.}.#el
3160: 73 65 20 20 2f 2a 20 65 6c 73 65 20 63 6c 61 75  se  /* else clau
3170: 73 65 20 66 6f 72 20 22 23 69 66 6e 64 65 66 20  se for "#ifndef 
3180: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
3190: 42 4c 4f 42 22 20 2a 2f 0a 20 20 23 64 65 66 69  BLOB" */.  #defi
31a0: 6e 65 20 63 6c 6f 73 65 49 6e 63 72 62 6c 6f 62  ne closeIncrblob
31b0: 43 68 61 6e 6e 65 6c 73 28 70 44 62 29 0a 23 65  Channels(pDb).#e
31c0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b  ndif../*.** Look
31d0: 20 61 74 20 74 68 65 20 73 63 72 69 70 74 20 70   at the script p
31e0: 72 65 66 69 78 20 69 6e 20 70 43 6d 64 2e 20 20  refix in pCmd.  
31f0: 57 65 20 77 69 6c 6c 20 62 65 20 65 78 65 63 75  We will be execu
3200: 74 69 6e 67 20 74 68 69 73 20 73 63 72 69 70 74  ting this script
3210: 0a 2a 2a 20 61 66 74 65 72 20 66 69 72 73 74 20  .** after first 
3220: 61 70 70 65 6e 64 69 6e 67 20 6f 6e 65 20 6f 72  appending one or
3230: 20 6d 6f 72 65 20 61 72 67 75 6d 65 6e 74 73 2e   more arguments.
3240: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61    This routine a
3250: 6e 61 6c 79 7a 65 73 0a 2a 2a 20 74 68 65 20 73  nalyzes.** the s
3260: 63 72 69 70 74 20 74 6f 20 73 65 65 20 69 66 20  cript to see if 
3270: 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 75 73  it is safe to us
3280: 65 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29  e Tcl_EvalObjv()
3290: 20 6f 6e 20 74 68 65 20 73 63 72 69 70 74 0a 2a   on the script.*
32a0: 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20 74 68  * rather than th
32b0: 65 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20 54  e more general T
32c0: 63 6c 5f 45 76 61 6c 45 78 28 29 2e 20 20 54 63  cl_EvalEx().  Tc
32d0: 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20 69 73 20  l_EvalObjv() is 
32e0: 6d 75 63 68 0a 2a 2a 20 66 61 73 74 65 72 2e 0a  much.** faster..
32f0: 2a 2a 0a 2a 2a 20 53 63 72 69 70 74 73 20 74 68  **.** Scripts th
3300: 61 74 20 61 72 65 20 73 61 66 65 20 74 6f 20 75  at are safe to u
3310: 73 65 20 77 69 74 68 20 54 63 6c 5f 45 76 61 6c  se with Tcl_Eval
3320: 4f 62 6a 76 28 29 20 63 6f 6e 73 69 73 74 73 20  Objv() consists 
3330: 6f 66 20 61 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 20  of a.** command 
3340: 6e 61 6d 65 20 66 6f 6c 6c 6f 77 65 64 20 62 79  name followed by
3350: 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 61 72   zero or more ar
3360: 67 75 6d 65 6e 74 73 20 77 69 74 68 20 6e 6f 20  guments with no 
3370: 5b 2e 2e 2e 5d 20 6f 72 20 24 0a 2a 2a 20 6f 72  [...] or $.** or
3380: 20 7b 2e 2e 2e 7d 20 6f 72 20 3b 20 74 6f 20 62   {...} or ; to b
3390: 65 20 73 65 65 6e 20 61 6e 79 77 68 65 72 65 2e  e seen anywhere.
33a0: 20 20 4d 6f 73 74 20 63 61 6c 6c 62 61 63 6b 20    Most callback 
33b0: 73 63 72 69 70 74 73 20 63 6f 6e 73 69 73 74 0a  scripts consist.
33c0: 2a 2a 20 6f 66 20 6a 75 73 74 20 61 20 73 69 6e  ** of just a sin
33d0: 67 6c 65 20 70 72 6f 63 65 64 75 72 65 20 6e 61  gle procedure na
33e0: 6d 65 20 61 6e 64 20 74 68 65 79 20 6d 65 65 74  me and they meet
33f0: 20 74 68 69 73 20 72 65 71 75 69 72 65 6d 65 6e   this requiremen
3400: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
3410: 20 73 61 66 65 54 6f 55 73 65 45 76 61 6c 4f 62   safeToUseEvalOb
3420: 6a 76 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  jv(Tcl_Interp *i
3430: 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a  nterp, Tcl_Obj *
3440: 70 43 6d 64 29 7b 0a 20 20 2f 2a 20 57 65 20 63  pCmd){.  /* We c
3450: 6f 75 6c 64 20 74 72 79 20 74 6f 20 64 6f 20 73  ould try to do s
3460: 6f 6d 65 74 68 69 6e 67 20 77 69 74 68 20 54 63  omething with Tc
3470: 6c 5f 50 61 72 73 65 28 29 2e 20 20 42 75 74 20  l_Parse().  But 
3480: 77 65 20 77 69 6c 6c 20 69 6e 73 74 65 61 64 0a  we will instead.
3490: 20 20 2a 2a 20 6a 75 73 74 20 64 6f 20 61 20 73    ** just do a s
34a0: 65 61 72 63 68 20 66 6f 72 20 66 6f 72 62 69 64  earch for forbid
34b0: 64 65 6e 20 63 68 61 72 61 63 74 65 72 73 2e 20  den characters. 
34c0: 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66   If any of the f
34d0: 6f 72 62 69 64 64 65 6e 0a 20 20 2a 2a 20 63 68  orbidden.  ** ch
34e0: 61 72 61 63 74 65 72 73 20 61 70 70 65 61 72 20  aracters appear 
34f0: 69 6e 20 70 43 6d 64 2c 20 77 65 20 77 69 6c 6c  in pCmd, we will
3500: 20 72 65 70 6f 72 74 20 74 68 65 20 73 74 72 69   report the stri
3510: 6e 67 20 61 73 20 75 6e 73 61 66 65 2e 0a 20 20  ng as unsafe..  
3520: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
3530: 2a 7a 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 7a  *z;.  int n;.  z
3540: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
3550: 46 72 6f 6d 4f 62 6a 28 70 43 6d 64 2c 20 26 6e  FromObj(pCmd, &n
3560: 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20  );.  while( n-- 
3570: 3e 20 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 63  > 0 ){.    int c
3580: 20 3d 20 2a 28 7a 2b 2b 29 3b 0a 20 20 20 20 69   = *(z++);.    i
3590: 66 28 20 63 3d 3d 27 24 27 20 7c 7c 20 63 3d 3d  f( c=='$' || c==
35a0: 27 5b 27 20 7c 7c 20 63 3d 3d 27 3b 27 20 29 20  '[' || c==';' ) 
35b0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
35c0: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a  return 1;.}../*.
35d0: 2a 2a 20 46 69 6e 64 20 61 6e 20 53 71 6c 46 75  ** Find an SqlFu
35e0: 6e 63 20 73 74 72 75 63 74 75 72 65 20 77 69 74  nc structure wit
35f0: 68 20 74 68 65 20 67 69 76 65 6e 20 6e 61 6d 65  h the given name
3600: 2e 20 20 4f 72 20 63 72 65 61 74 65 20 61 20 6e  .  Or create a n
3610: 65 77 0a 2a 2a 20 6f 6e 65 20 69 66 20 61 6e 20  ew.** one if an 
3620: 65 78 69 73 74 69 6e 67 20 6f 6e 65 20 63 61 6e  existing one can
3630: 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 20 20 52  not be found.  R
3640: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
3650: 74 6f 20 74 68 65 0a 2a 2a 20 73 74 72 75 63 74  to the.** struct
3660: 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53  ure..*/.static S
3670: 71 6c 46 75 6e 63 20 2a 66 69 6e 64 53 71 6c 46  qlFunc *findSqlF
3680: 75 6e 63 28 53 71 6c 69 74 65 44 62 20 2a 70 44  unc(SqliteDb *pD
3690: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
36a0: 4e 61 6d 65 29 7b 0a 20 20 53 71 6c 46 75 6e 63  Name){.  SqlFunc
36b0: 20 2a 70 2c 20 2a 70 4e 65 77 3b 0a 20 20 69 6e   *p, *pNew;.  in
36c0: 74 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e  t nName = strlen
36d0: 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 70 4e 65  30(zName);.  pNe
36e0: 77 20 3d 20 28 53 71 6c 46 75 6e 63 2a 29 54 63  w = (SqlFunc*)Tc
36f0: 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  l_Alloc( sizeof(
3700: 2a 70 4e 65 77 29 20 2b 20 6e 4e 61 6d 65 20 2b  *pNew) + nName +
3710: 20 31 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 7a 4e   1 );.  pNew->zN
3720: 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 4e  ame = (char*)&pN
3730: 65 77 5b 31 5d 3b 0a 20 20 6d 65 6d 63 70 79 28  ew[1];.  memcpy(
3740: 70 4e 65 77 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61  pNew->zName, zNa
3750: 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20  me, nName+1);.  
3760: 66 6f 72 28 70 3d 70 44 62 2d 3e 70 46 75 6e 63  for(p=pDb->pFunc
3770: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
3780: 7b 20 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  { .    if( sqlit
3790: 65 33 5f 73 74 72 69 63 6d 70 28 70 2d 3e 7a 4e  e3_stricmp(p->zN
37a0: 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65  ame, pNew->zName
37b0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63  )==0 ){.      Tc
37c0: 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 4e  l_Free((char*)pN
37d0: 65 77 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ew);.      retur
37e0: 6e 20 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n p;.    }.  }. 
37f0: 20 70 4e 65 77 2d 3e 69 6e 74 65 72 70 20 3d 20   pNew->interp = 
3800: 70 44 62 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 70  pDb->interp;.  p
3810: 4e 65 77 2d 3e 70 44 62 20 3d 20 70 44 62 3b 0a  New->pDb = pDb;.
3820: 20 20 70 4e 65 77 2d 3e 70 53 63 72 69 70 74 20    pNew->pScript 
3830: 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65  = 0;.  pNew->pNe
3840: 78 74 20 3d 20 70 44 62 2d 3e 70 46 75 6e 63 3b  xt = pDb->pFunc;
3850: 0a 20 20 70 44 62 2d 3e 70 46 75 6e 63 20 3d 20  .  pDb->pFunc = 
3860: 70 4e 65 77 3b 0a 20 20 72 65 74 75 72 6e 20 70  pNew;.  return p
3870: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  New;.}../*.** Fr
3880: 65 65 20 61 20 73 69 6e 67 6c 65 20 53 71 6c 50  ee a single SqlP
3890: 72 65 70 61 72 65 64 53 74 6d 74 20 6f 62 6a 65  reparedStmt obje
38a0: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ct..*/.static vo
38b0: 69 64 20 64 62 46 72 65 65 53 74 6d 74 28 53 71  id dbFreeStmt(Sq
38c0: 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70  lPreparedStmt *p
38d0: 53 74 6d 74 29 7b 0a 23 69 66 64 65 66 20 53 51  Stmt){.#ifdef SQ
38e0: 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20  LITE_TEST.  if( 
38f0: 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 74 6d  sqlite3_sql(pStm
3900: 74 2d 3e 70 53 74 6d 74 29 3d 3d 30 20 29 7b 0a  t->pStmt)==0 ){.
3910: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68      Tcl_Free((ch
3920: 61 72 20 2a 29 70 53 74 6d 74 2d 3e 7a 53 71 6c  ar *)pStmt->zSql
3930: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
3940: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
3950: 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74 29 3b 0a  (pStmt->pStmt);.
3960: 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72    Tcl_Free((char
3970: 20 2a 29 70 53 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a   *)pStmt);.}../*
3980: 0a 2a 2a 20 46 69 6e 61 6c 69 7a 65 20 61 6e 64  .** Finalize and
3990: 20 66 72 65 65 20 61 20 6c 69 73 74 20 6f 66 20   free a list of 
39a0: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
39b0: 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nts.*/.static vo
39c0: 69 64 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68  id flushStmtCach
39d0: 65 28 53 71 6c 69 74 65 44 62 20 2a 70 44 62 29  e(SqliteDb *pDb)
39e0: 7b 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64 53  {.  SqlPreparedS
39f0: 74 6d 74 20 2a 70 50 72 65 53 74 6d 74 3b 0a 20  tmt *pPreStmt;. 
3a00: 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74   SqlPreparedStmt
3a10: 20 2a 70 4e 65 78 74 3b 0a 0a 20 20 66 6f 72 28   *pNext;..  for(
3a20: 70 50 72 65 53 74 6d 74 20 3d 20 70 44 62 2d 3e  pPreStmt = pDb->
3a30: 73 74 6d 74 4c 69 73 74 3b 20 70 50 72 65 53 74  stmtList; pPreSt
3a40: 6d 74 3b 20 70 50 72 65 53 74 6d 74 3d 70 4e 65  mt; pPreStmt=pNe
3a50: 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  xt){.    pNext =
3a60: 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74   pPreStmt->pNext
3a70: 3b 0a 20 20 20 20 64 62 46 72 65 65 53 74 6d 74  ;.    dbFreeStmt
3a80: 28 70 50 72 65 53 74 6d 74 29 3b 0a 20 20 7d 0a  (pPreStmt);.  }.
3a90: 20 20 70 44 62 2d 3e 6e 53 74 6d 74 20 3d 20 30    pDb->nStmt = 0
3aa0: 3b 0a 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73  ;.  pDb->stmtLas
3ab0: 74 20 3d 20 30 3b 0a 20 20 70 44 62 2d 3e 73 74  t = 0;.  pDb->st
3ac0: 6d 74 4c 69 73 74 20 3d 20 30 3b 0a 7d 0a 0a 2f  mtList = 0;.}../
3ad0: 2a 0a 2a 2a 20 54 43 4c 20 63 61 6c 6c 73 20 74  *.** TCL calls t
3ae0: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 77 68  his procedure wh
3af0: 65 6e 20 61 6e 20 73 71 6c 69 74 65 33 20 64 61  en an sqlite3 da
3b00: 74 61 62 61 73 65 20 63 6f 6d 6d 61 6e 64 20 69  tabase command i
3b10: 73 0a 2a 2a 20 64 65 6c 65 74 65 64 2e 0a 2a 2f  s.** deleted..*/
3b20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 44 62 44  .static void DbD
3b30: 65 6c 65 74 65 43 6d 64 28 76 6f 69 64 20 2a 64  eleteCmd(void *d
3b40: 62 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  b){.  SqliteDb *
3b50: 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a  pDb = (SqliteDb*
3b60: 29 64 62 3b 0a 20 20 66 6c 75 73 68 53 74 6d 74  )db;.  flushStmt
3b70: 43 61 63 68 65 28 70 44 62 29 3b 0a 20 20 63 6c  Cache(pDb);.  cl
3b80: 6f 73 65 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  oseIncrblobChann
3b90: 65 6c 73 28 70 44 62 29 3b 0a 20 20 73 71 6c 69  els(pDb);.  sqli
3ba0: 74 65 33 5f 63 6c 6f 73 65 28 70 44 62 2d 3e 64  te3_close(pDb->d
3bb0: 62 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 44 62  b);.  while( pDb
3bc0: 2d 3e 70 46 75 6e 63 20 29 7b 0a 20 20 20 20 53  ->pFunc ){.    S
3bd0: 71 6c 46 75 6e 63 20 2a 70 46 75 6e 63 20 3d 20  qlFunc *pFunc = 
3be0: 70 44 62 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20  pDb->pFunc;.    
3bf0: 70 44 62 2d 3e 70 46 75 6e 63 20 3d 20 70 46 75  pDb->pFunc = pFu
3c00: 6e 63 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61  nc->pNext;.    a
3c10: 73 73 65 72 74 28 20 70 46 75 6e 63 2d 3e 70 44  ssert( pFunc->pD
3c20: 62 3d 3d 70 44 62 20 29 3b 0a 20 20 20 20 54 63  b==pDb );.    Tc
3c30: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
3c40: 46 75 6e 63 2d 3e 70 53 63 72 69 70 74 29 3b 0a  Func->pScript);.
3c50: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68      Tcl_Free((ch
3c60: 61 72 2a 29 70 46 75 6e 63 29 3b 0a 20 20 7d 0a  ar*)pFunc);.  }.
3c70: 20 20 77 68 69 6c 65 28 20 70 44 62 2d 3e 70 43    while( pDb->pC
3c80: 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 53 71  ollate ){.    Sq
3c90: 6c 43 6f 6c 6c 61 74 65 20 2a 70 43 6f 6c 6c 61  lCollate *pColla
3ca0: 74 65 20 3d 20 70 44 62 2d 3e 70 43 6f 6c 6c 61  te = pDb->pColla
3cb0: 74 65 3b 0a 20 20 20 20 70 44 62 2d 3e 70 43 6f  te;.    pDb->pCo
3cc0: 6c 6c 61 74 65 20 3d 20 70 43 6f 6c 6c 61 74 65  llate = pCollate
3cd0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 54 63 6c  ->pNext;.    Tcl
3ce0: 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 43 6f  _Free((char*)pCo
3cf0: 6c 6c 61 74 65 29 3b 0a 20 20 7d 0a 20 20 69 66  llate);.  }.  if
3d00: 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a  ( pDb->zBusy ){.
3d10: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
3d20: 2d 3e 7a 42 75 73 79 29 3b 0a 20 20 7d 0a 20 20  ->zBusy);.  }.  
3d30: 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 20  if( pDb->zTrace 
3d40: 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28  ){.    Tcl_Free(
3d50: 70 44 62 2d 3e 7a 54 72 61 63 65 29 3b 0a 20 20  pDb->zTrace);.  
3d60: 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72  }.  if( pDb->zPr
3d70: 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20 54 63 6c  ofile ){.    Tcl
3d80: 5f 46 72 65 65 28 70 44 62 2d 3e 7a 50 72 6f 66  _Free(pDb->zProf
3d90: 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ile);.  }.  if( 
3da0: 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20  pDb->zAuth ){.  
3db0: 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e    Tcl_Free(pDb->
3dc0: 7a 41 75 74 68 29 3b 0a 20 20 7d 0a 20 20 69 66  zAuth);.  }.  if
3dd0: 28 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 29 7b 0a  ( pDb->zNull ){.
3de0: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
3df0: 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20  ->zNull);.  }.  
3e00: 69 66 28 20 70 44 62 2d 3e 70 55 70 64 61 74 65  if( pDb->pUpdate
3e10: 48 6f 6f 6b 20 29 7b 0a 20 20 20 20 54 63 6c 5f  Hook ){.    Tcl_
3e20: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62  DecrRefCount(pDb
3e30: 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b 29 3b 0a  ->pUpdateHook);.
3e40: 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 70    }.  if( pDb->p
3e50: 50 72 65 55 70 64 61 74 65 48 6f 6f 6b 20 29 7b  PreUpdateHook ){
3e60: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
3e70: 43 6f 75 6e 74 28 70 44 62 2d 3e 70 50 72 65 55  Count(pDb->pPreU
3e80: 70 64 61 74 65 48 6f 6f 6b 29 3b 0a 20 20 7d 0a  pdateHook);.  }.
3e90: 20 20 69 66 28 20 70 44 62 2d 3e 70 52 6f 6c 6c    if( pDb->pRoll
3ea0: 62 61 63 6b 48 6f 6f 6b 20 29 7b 0a 20 20 20 20  backHook ){.    
3eb0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
3ec0: 28 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48  (pDb->pRollbackH
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 57 61 6c 48 6f 6f 6b 20 29 7b  pDb->pWalHook ){
3ef0: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
3f00: 43 6f 75 6e 74 28 70 44 62 2d 3e 70 57 61 6c 48  Count(pDb->pWalH
3f10: 6f 6f 6b 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ook);.  }.  if( 
3f20: 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65  pDb->pCollateNee
3f30: 64 65 64 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44  ded ){.    Tcl_D
3f40: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d  ecrRefCount(pDb-
3f50: 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29  >pCollateNeeded)
3f60: 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 46 72 65 65  ;.  }.  Tcl_Free
3f70: 28 28 63 68 61 72 2a 29 70 44 62 29 3b 0a 7d 0a  ((char*)pDb);.}.
3f80: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
3f90: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
3fa0: 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69  en a database fi
3fb0: 6c 65 20 69 73 20 6c 6f 63 6b 65 64 20 77 68 69  le is locked whi
3fc0: 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20  le trying.** to 
3fd0: 65 78 65 63 75 74 65 20 53 51 4c 2e 0a 2a 2f 0a  execute SQL..*/.
3fe0: 73 74 61 74 69 63 20 69 6e 74 20 44 62 42 75 73  static int DbBus
3ff0: 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63  yHandler(void *c
4000: 64 2c 20 69 6e 74 20 6e 54 72 69 65 73 29 7b 0a  d, int nTries){.
4010: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
4020: 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b  = (SqliteDb*)cd;
4030: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61  .  int rc;.  cha
4040: 72 20 7a 56 61 6c 5b 33 30 5d 3b 0a 0a 20 20 73  r zVal[30];..  s
4050: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
4060: 73 69 7a 65 6f 66 28 7a 56 61 6c 29 2c 20 7a 56  sizeof(zVal), zV
4070: 61 6c 2c 20 22 25 64 22 2c 20 6e 54 72 69 65 73  al, "%d", nTries
4080: 29 3b 0a 20 20 72 63 20 3d 20 54 63 6c 5f 56 61  );.  rc = Tcl_Va
4090: 72 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72  rEval(pDb->inter
40a0: 70 2c 20 70 44 62 2d 3e 7a 42 75 73 79 2c 20 22  p, pDb->zBusy, "
40b0: 20 22 2c 20 7a 56 61 6c 2c 20 28 63 68 61 72 2a   ", zVal, (char*
40c0: 29 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 54  )0);.  if( rc!=T
40d0: 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28 54 63  CL_OK || atoi(Tc
40e0: 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
40f0: 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 29 20  t(pDb->interp)) 
4100: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
4110: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
4120: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
4130: 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53  TE_OMIT_PROGRESS
4140: 5f 43 41 4c 4c 42 41 43 4b 0a 2f 2a 0a 2a 2a 20  _CALLBACK./*.** 
4150: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
4160: 69 6e 76 6f 6b 65 64 20 61 73 20 74 68 65 20 27  invoked as the '
4170: 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63  progress callbac
4180: 6b 27 20 66 6f 72 20 74 68 65 20 64 61 74 61 62  k' for the datab
4190: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ase..*/.static i
41a0: 6e 74 20 44 62 50 72 6f 67 72 65 73 73 48 61 6e  nt DbProgressHan
41b0: 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 29 7b 0a  dler(void *cd){.
41c0: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
41d0: 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b  = (SqliteDb*)cd;
41e0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
41f0: 73 65 72 74 28 20 70 44 62 2d 3e 7a 50 72 6f 67  sert( pDb->zProg
4200: 72 65 73 73 20 29 3b 0a 20 20 72 63 20 3d 20 54  ress );.  rc = T
4210: 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74  cl_Eval(pDb->int
4220: 65 72 70 2c 20 70 44 62 2d 3e 7a 50 72 6f 67 72  erp, pDb->zProgr
4230: 65 73 73 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ess);.  if( rc!=
4240: 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28 54  TCL_OK || atoi(T
4250: 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
4260: 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 29  lt(pDb->interp))
4270: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
4280: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
4290: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
42a0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
42b0: 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73  TRACE./*.** This
42c0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
42d0: 65 64 20 62 79 20 74 68 65 20 53 51 4c 69 74 65  ed by the SQLite
42e0: 20 74 72 61 63 65 20 68 61 6e 64 6c 65 72 20 77   trace handler w
42f0: 68 65 6e 65 76 65 72 20 61 20 6e 65 77 0a 2a 2a  henever a new.**
4300: 20 62 6c 6f 63 6b 20 6f 66 20 53 51 4c 20 69 73   block of SQL is
4310: 20 65 78 65 63 75 74 65 64 2e 20 20 54 68 65 20   executed.  The 
4320: 54 43 4c 20 73 63 72 69 70 74 20 69 6e 20 70 44  TCL script in pD
4330: 62 2d 3e 7a 54 72 61 63 65 20 69 73 20 65 78 65  b->zTrace is exe
4340: 63 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  cuted..*/.static
4350: 20 76 6f 69 64 20 44 62 54 72 61 63 65 48 61 6e   void DbTraceHan
4360: 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 2c 20 63  dler(void *cd, c
4370: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 29  onst char *zSql)
4380: 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  {.  SqliteDb *pD
4390: 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63  b = (SqliteDb*)c
43a0: 64 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  d;.  Tcl_DString
43b0: 20 73 74 72 3b 0a 0a 20 20 54 63 6c 5f 44 53 74   str;..  Tcl_DSt
43c0: 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a  ringInit(&str);.
43d0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
43e0: 65 6e 64 28 26 73 74 72 2c 20 70 44 62 2d 3e 7a  end(&str, pDb->z
43f0: 54 72 61 63 65 2c 20 2d 31 29 3b 0a 20 20 54 63  Trace, -1);.  Tc
4400: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45  l_DStringAppendE
4410: 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 53 71  lement(&str, zSq
4420: 6c 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 28 70  l);.  Tcl_Eval(p
4430: 44 62 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f  Db->interp, Tcl_
4440: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74  DStringValue(&st
4450: 72 29 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  r));.  Tcl_DStri
4460: 6e 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20  ngFree(&str);.  
4470: 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28  Tcl_ResetResult(
4480: 70 44 62 2d 3e 69 6e 74 65 72 70 29 3b 0a 7d 0a  pDb->interp);.}.
4490: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
44a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
44b0: 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E./*.** This rou
44c0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62  tine is called b
44d0: 79 20 74 68 65 20 53 51 4c 69 74 65 20 70 72 6f  y the SQLite pro
44e0: 66 69 6c 65 20 68 61 6e 64 6c 65 72 20 61 66 74  file handler aft
44f0: 65 72 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a  er a statement.*
4500: 2a 20 53 51 4c 20 68 61 73 20 65 78 65 63 75 74  * SQL has execut
4510: 65 64 2e 20 20 54 68 65 20 54 43 4c 20 73 63 72  ed.  The TCL scr
4520: 69 70 74 20 69 6e 20 70 44 62 2d 3e 7a 50 72 6f  ipt in pDb->zPro
4530: 66 69 6c 65 20 69 73 20 65 76 61 6c 75 61 74 65  file is evaluate
4540: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
4550: 64 20 44 62 50 72 6f 66 69 6c 65 48 61 6e 64 6c  d DbProfileHandl
4560: 65 72 28 76 6f 69 64 20 2a 63 64 2c 20 63 6f 6e  er(void *cd, con
4570: 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 73  st char *zSql, s
4580: 71 6c 69 74 65 5f 75 69 6e 74 36 34 20 74 6d 29  qlite_uint64 tm)
4590: 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  {.  SqliteDb *pD
45a0: 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63  b = (SqliteDb*)c
45b0: 64 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  d;.  Tcl_DString
45c0: 20 73 74 72 3b 0a 20 20 63 68 61 72 20 7a 54 6d   str;.  char zTm
45d0: 5b 31 30 30 5d 3b 0a 0a 20 20 73 71 6c 69 74 65  [100];..  sqlite
45e0: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
45f0: 66 28 7a 54 6d 29 2d 31 2c 20 7a 54 6d 2c 20 22  f(zTm)-1, zTm, "
4600: 25 6c 6c 64 22 2c 20 74 6d 29 3b 0a 20 20 54 63  %lld", tm);.  Tc
4610: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73  l_DStringInit(&s
4620: 74 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  tr);.  Tcl_DStri
4630: 6e 67 41 70 70 65 6e 64 28 26 73 74 72 2c 20 70  ngAppend(&str, p
4640: 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 2c 20 2d 31  Db->zProfile, -1
4650: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
4660: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73  AppendElement(&s
4670: 74 72 2c 20 7a 53 71 6c 29 3b 0a 20 20 54 63 6c  tr, zSql);.  Tcl
4680: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c  _DStringAppendEl
4690: 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 54 6d 29  ement(&str, zTm)
46a0: 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 28 70 44 62  ;.  Tcl_Eval(pDb
46b0: 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44 53  ->interp, Tcl_DS
46c0: 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29  tringValue(&str)
46d0: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
46e0: 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20 54 63  Free(&str);.  Tc
46f0: 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 70 44  l_ResetResult(pD
4700: 62 2d 3e 69 6e 74 65 72 70 29 3b 0a 7d 0a 23 65  b->interp);.}.#e
4710: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
4720: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
4730: 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61  ed when a transa
4740: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74  ction is committ
4750: 65 64 2e 20 20 54 68 65 0a 2a 2a 20 54 43 4c 20  ed.  The.** TCL 
4760: 73 63 72 69 70 74 20 69 6e 20 70 44 62 2d 3e 7a  script in pDb->z
4770: 43 6f 6d 6d 69 74 20 69 73 20 65 78 65 63 75 74  Commit is execut
4780: 65 64 2e 20 20 49 66 20 69 74 20 72 65 74 75 72  ed.  If it retur
4790: 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 0a 2a  ns non-zero or.*
47a0: 2a 20 69 66 20 69 74 20 74 68 72 6f 77 73 20 61  * if it throws a
47b0: 6e 20 65 78 63 65 70 74 69 6f 6e 2c 20 74 68 65  n exception, the
47c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
47d0: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 73 74  rolled back inst
47e0: 65 61 64 0a 2a 2a 20 6f 66 20 62 65 69 6e 67 20  ead.** of being 
47f0: 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2f 0a 73 74  committed..*/.st
4800: 61 74 69 63 20 69 6e 74 20 44 62 43 6f 6d 6d 69  atic int DbCommi
4810: 74 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63  tHandler(void *c
4820: 64 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  d){.  SqliteDb *
4830: 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a  pDb = (SqliteDb*
4840: 29 63 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  )cd;.  int rc;..
4850: 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 28    rc = Tcl_Eval(
4860: 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62  pDb->interp, pDb
4870: 2d 3e 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66  ->zCommit);.  if
4880: 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20  ( rc!=TCL_OK || 
4890: 61 74 6f 69 28 54 63 6c 5f 47 65 74 53 74 72 69  atoi(Tcl_GetStri
48a0: 6e 67 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e  ngResult(pDb->in
48b0: 74 65 72 70 29 29 20 29 7b 0a 20 20 20 20 72 65  terp)) ){.    re
48c0: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
48d0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69  turn 0;.}..stati
48e0: 63 20 76 6f 69 64 20 44 62 52 6f 6c 6c 62 61 63  c void DbRollbac
48f0: 6b 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63  kHandler(void *c
4900: 6c 69 65 6e 74 44 61 74 61 29 7b 0a 20 20 53 71  lientData){.  Sq
4910: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53  liteDb *pDb = (S
4920: 71 6c 69 74 65 44 62 2a 29 63 6c 69 65 6e 74 44  qliteDb*)clientD
4930: 61 74 61 3b 0a 20 20 61 73 73 65 72 74 28 70 44  ata;.  assert(pD
4940: 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b  b->pRollbackHook
4950: 29 3b 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21  );.  if( TCL_OK!
4960: 3d 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70  =Tcl_EvalObjEx(p
4970: 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d  Db->interp, pDb-
4980: 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 2c 20  >pRollbackHook, 
4990: 30 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 42 61  0) ){.    Tcl_Ba
49a0: 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 70 44  ckgroundError(pD
49b0: 62 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a  b->interp);.  }.
49c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 70 72  }../*.** This pr
49d0: 6f 63 65 64 75 72 65 20 68 61 6e 64 6c 65 73 20  ocedure handles 
49e0: 77 61 6c 5f 68 6f 6f 6b 20 63 61 6c 6c 62 61 63  wal_hook callbac
49f0: 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ks..*/.static in
4a00: 74 20 44 62 57 61 6c 48 61 6e 64 6c 65 72 28 0a  t DbWalHandler(.
4a10: 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61    void *clientDa
4a20: 74 61 2c 20 0a 20 20 73 71 6c 69 74 65 33 20 2a  ta, .  sqlite3 *
4a30: 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  db, .  const cha
4a40: 72 20 2a 7a 44 62 2c 20 0a 20 20 69 6e 74 20 6e  r *zDb, .  int n
4a50: 45 6e 74 72 79 0a 29 7b 0a 20 20 69 6e 74 20 72  Entry.){.  int r
4a60: 65 74 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  et = SQLITE_OK;.
4a70: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 3b 0a 20 20    Tcl_Obj *p;.  
4a80: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20  SqliteDb *pDb = 
4a90: 28 53 71 6c 69 74 65 44 62 2a 29 63 6c 69 65 6e  (SqliteDb*)clien
4aa0: 74 44 61 74 61 3b 0a 20 20 54 63 6c 5f 49 6e 74  tData;.  Tcl_Int
4ab0: 65 72 70 20 2a 69 6e 74 65 72 70 20 3d 20 70 44  erp *interp = pD
4ac0: 62 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 61 73 73  b->interp;.  ass
4ad0: 65 72 74 28 70 44 62 2d 3e 70 57 61 6c 48 6f 6f  ert(pDb->pWalHoo
4ae0: 6b 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64  k);..  assert( d
4af0: 62 3d 3d 70 44 62 2d 3e 64 62 20 29 3b 0a 20 20  b==pDb->db );.  
4b00: 70 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  p = Tcl_Duplicat
4b10: 65 4f 62 6a 28 70 44 62 2d 3e 70 57 61 6c 48 6f  eObj(pDb->pWalHo
4b20: 6f 6b 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52  ok);.  Tcl_IncrR
4b30: 65 66 43 6f 75 6e 74 28 70 29 3b 0a 20 20 54 63  efCount(p);.  Tc
4b40: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
4b50: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70  lement(interp, p
4b60: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
4b70: 62 6a 28 7a 44 62 2c 20 2d 31 29 29 3b 0a 20 20  bj(zDb, -1));.  
4b80: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
4b90: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
4ba0: 20 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62   p, Tcl_NewIntOb
4bb0: 6a 28 6e 45 6e 74 72 79 29 29 3b 0a 20 20 69 66  j(nEntry));.  if
4bc0: 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 45 76  ( TCL_OK!=Tcl_Ev
4bd0: 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20  alObjEx(interp, 
4be0: 70 2c 20 30 29 20 0a 20 20 20 7c 7c 20 54 43 4c  p, 0) .   || TCL
4bf0: 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 74 46  _OK!=Tcl_GetIntF
4c00: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 54  romObj(interp, T
4c10: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_GetObjResult(
4c20: 69 6e 74 65 72 70 29 2c 20 26 72 65 74 29 0a 20  interp), &ret). 
4c30: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 42 61 63 6b   ){.    Tcl_Back
4c40: 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 65  groundError(inte
4c50: 72 70 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 44  rp);.  }.  Tcl_D
4c60: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 29 3b 0a  ecrRefCount(p);.
4c70: 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d  .  return ret;.}
4c80: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
4c90: 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20 64 65  LITE_TEST) && de
4ca0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
4cb0: 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46  BLE_UNLOCK_NOTIF
4cc0: 59 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  Y).static void s
4cd0: 65 74 54 65 73 74 55 6e 6c 6f 63 6b 4e 6f 74 69  etTestUnlockNoti
4ce0: 66 79 56 61 72 73 28 54 63 6c 5f 49 6e 74 65 72  fyVars(Tcl_Inter
4cf0: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 69  p *interp, int i
4d00: 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 29 7b 0a  Arg, int nArg){.
4d10: 20 20 63 68 61 72 20 7a 42 75 66 5b 36 34 5d 3b    char zBuf[64];
4d20: 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
4d30: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29  ntf(sizeof(zBuf)
4d40: 2c 20 7a 42 75 66 2c 20 22 25 64 22 2c 20 69 41  , zBuf, "%d", iA
4d50: 72 67 29 3b 0a 20 20 54 63 6c 5f 53 65 74 56 61  rg);.  Tcl_SetVa
4d60: 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
4d70: 65 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 5f  e_unlock_notify_
4d80: 61 72 67 22 2c 20 7a 42 75 66 2c 20 54 43 4c 5f  arg", zBuf, TCL_
4d90: 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20  GLOBAL_ONLY);.  
4da0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
4db0: 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a  (sizeof(zBuf), z
4dc0: 42 75 66 2c 20 22 25 64 22 2c 20 6e 41 72 67 29  Buf, "%d", nArg)
4dd0: 3b 0a 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69  ;.  Tcl_SetVar(i
4de0: 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 75  nterp, "sqlite_u
4df0: 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 5f 61 72 67  nlock_notify_arg
4e00: 63 6f 75 6e 74 22 2c 20 7a 42 75 66 2c 20 54 43  count", zBuf, TC
4e10: 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a  L_GLOBAL_ONLY);.
4e20: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
4e30: 20 73 65 74 54 65 73 74 55 6e 6c 6f 63 6b 4e 6f   setTestUnlockNo
4e40: 74 69 66 79 56 61 72 73 28 78 2c 79 2c 7a 29 0a  tifyVars(x,y,z).
4e50: 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
4e60: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c  QLITE_ENABLE_UNL
4e70: 4f 43 4b 5f 4e 4f 54 49 46 59 0a 73 74 61 74 69  OCK_NOTIFY.stati
4e80: 63 20 76 6f 69 64 20 44 62 55 6e 6c 6f 63 6b 4e  c void DbUnlockN
4e90: 6f 74 69 66 79 28 76 6f 69 64 20 2a 2a 61 70 41  otify(void **apA
4ea0: 72 67 2c 20 69 6e 74 20 6e 41 72 67 29 7b 0a 20  rg, int nArg){. 
4eb0: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
4ec0: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
4ed0: 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66  .    const int f
4ee0: 6c 61 67 73 20 3d 20 28 54 43 4c 5f 45 56 41 4c  lags = (TCL_EVAL
4ef0: 5f 47 4c 4f 42 41 4c 7c 54 43 4c 5f 45 56 41 4c  _GLOBAL|TCL_EVAL
4f00: 5f 44 49 52 45 43 54 29 3b 0a 20 20 20 20 53 71  _DIRECT);.    Sq
4f10: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53  liteDb *pDb = (S
4f20: 71 6c 69 74 65 44 62 20 2a 29 61 70 41 72 67 5b  qliteDb *)apArg[
4f30: 69 5d 3b 0a 20 20 20 20 73 65 74 54 65 73 74 55  i];.    setTestU
4f40: 6e 6c 6f 63 6b 4e 6f 74 69 66 79 56 61 72 73 28  nlockNotifyVars(
4f50: 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 69 2c 20  pDb->interp, i, 
4f60: 6e 41 72 67 29 3b 0a 20 20 20 20 61 73 73 65 72  nArg);.    asser
4f70: 74 28 20 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e  t( pDb->pUnlockN
4f80: 6f 74 69 66 79 29 3b 0a 20 20 20 20 54 63 6c 5f  otify);.    Tcl_
4f90: 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69  EvalObjEx(pDb->i
4fa0: 6e 74 65 72 70 2c 20 70 44 62 2d 3e 70 55 6e 6c  nterp, pDb->pUnl
4fb0: 6f 63 6b 4e 6f 74 69 66 79 2c 20 66 6c 61 67 73  ockNotify, flags
4fc0: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52  );.    Tcl_DecrR
4fd0: 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 55 6e  efCount(pDb->pUn
4fe0: 6c 6f 63 6b 4e 6f 74 69 66 79 29 3b 0a 20 20 20  lockNotify);.   
4ff0: 20 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74   pDb->pUnlockNot
5000: 69 66 79 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23  ify = 0;.  }.}.#
5010: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
5020: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55  LITE_ENABLE_PREU
5030: 50 44 41 54 45 5f 48 4f 4f 4b 0a 2f 2a 0a 2a 2a  PDATE_HOOK./*.**
5040: 20 50 72 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b   Pre-update hook
5050: 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74   callback..*/.st
5060: 61 74 69 63 20 76 6f 69 64 20 44 62 50 72 65 55  atic void DbPreU
5070: 70 64 61 74 65 48 61 6e 64 6c 65 72 28 0a 20 20  pdateHandler(.  
5080: 76 6f 69 64 20 2a 70 2c 20 0a 20 20 73 71 6c 69  void *p, .  sqli
5090: 74 65 33 20 2a 64 62 2c 0a 20 20 69 6e 74 20 6f  te3 *db,.  int o
50a0: 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  p,.  const char 
50b0: 2a 7a 44 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63  *zDb, .  const c
50c0: 68 61 72 20 2a 7a 54 62 6c 2c 20 0a 20 20 73 71  har *zTbl, .  sq
50d0: 6c 69 74 65 5f 69 6e 74 36 34 20 69 4b 65 79 31  lite_int64 iKey1
50e0: 2c 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34  ,.  sqlite_int64
50f0: 20 69 4b 65 79 32 0a 29 7b 0a 20 20 53 71 6c 69   iKey2.){.  Sqli
5100: 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c  teDb *pDb = (Sql
5110: 69 74 65 44 62 20 2a 29 70 3b 0a 20 20 54 63 6c  iteDb *)p;.  Tcl
5120: 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 20 20 73 74  _Obj *pCmd;.  st
5130: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
5140: 2a 61 7a 53 74 72 5b 5d 20 3d 20 7b 22 44 45 4c  *azStr[] = {"DEL
5150: 45 54 45 22 2c 20 22 49 4e 53 45 52 54 22 2c 20  ETE", "INSERT", 
5160: 22 55 50 44 41 54 45 22 7d 3b 0a 0a 20 20 61 73  "UPDATE"};..  as
5170: 73 65 72 74 28 20 28 53 51 4c 49 54 45 5f 44 45  sert( (SQLITE_DE
5180: 4c 45 54 45 2d 31 29 2f 39 20 3d 3d 20 30 20 29  LETE-1)/9 == 0 )
5190: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 53 51 4c  ;.  assert( (SQL
51a0: 49 54 45 5f 49 4e 53 45 52 54 2d 31 29 2f 39 20  ITE_INSERT-1)/9 
51b0: 3d 3d 20 31 20 29 3b 0a 20 20 61 73 73 65 72 74  == 1 );.  assert
51c0: 28 20 28 53 51 4c 49 54 45 5f 55 50 44 41 54 45  ( (SQLITE_UPDATE
51d0: 2d 31 29 2f 39 20 3d 3d 20 32 20 29 3b 0a 20 20  -1)/9 == 2 );.  
51e0: 61 73 73 65 72 74 28 20 70 44 62 2d 3e 70 50 72  assert( pDb->pPr
51f0: 65 55 70 64 61 74 65 48 6f 6f 6b 20 29 3b 0a 20  eUpdateHook );. 
5200: 20 61 73 73 65 72 74 28 20 64 62 3d 3d 70 44 62   assert( db==pDb
5210: 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65 72 74  ->db );.  assert
5220: 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 53  ( op==SQLITE_INS
5230: 45 52 54 20 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54  ERT || op==SQLIT
5240: 45 5f 55 50 44 41 54 45 20 7c 7c 20 6f 70 3d 3d  E_UPDATE || op==
5250: 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 20 29 3b  SQLITE_DELETE );
5260: 0a 0a 20 20 70 43 6d 64 20 3d 20 54 63 6c 5f 44  ..  pCmd = Tcl_D
5270: 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 44 62 2d  uplicateObj(pDb-
5280: 3e 70 50 72 65 55 70 64 61 74 65 48 6f 6f 6b 29  >pPreUpdateHook)
5290: 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43  ;.  Tcl_IncrRefC
52a0: 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 54 63  ount(pCmd);.  Tc
52b0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
52c0: 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20  lement(0, pCmd, 
52d0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
52e0: 28 61 7a 53 74 72 5b 28 6f 70 2d 31 29 2f 39 5d  (azStr[(op-1)/9]
52f0: 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
5300: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
5310: 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f  nt(0, pCmd, Tcl_
5320: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 44 62  NewStringObj(zDb
5330: 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
5340: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
5350: 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f  nt(0, pCmd, Tcl_
5360: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54 62  NewStringObj(zTb
5370: 6c 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c  l, -1));.  Tcl_L
5380: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
5390: 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c  ent(0, pCmd, Tcl
53a0: 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 69  _NewWideIntObj(i
53b0: 4b 65 79 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  Key1));.  Tcl_Li
53c0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
53d0: 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f  nt(0, pCmd, Tcl_
53e0: 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 69 4b  NewWideIntObj(iK
53f0: 65 79 32 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61  ey2));.  Tcl_Eva
5400: 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69 6e 74 65  lObjEx(pDb->inte
5410: 72 70 2c 20 70 43 6d 64 2c 20 54 43 4c 5f 45 56  rp, pCmd, TCL_EV
5420: 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20 54 63  AL_DIRECT);.  Tc
5430: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
5440: 43 6d 64 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  Cmd);.}.#endif /
5450: 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
5460: 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 20 2a  PREUPDATE_HOOK *
5470: 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 44  /..static void D
5480: 62 55 70 64 61 74 65 48 61 6e 64 6c 65 72 28 0a  bUpdateHandler(.
5490: 20 20 76 6f 69 64 20 2a 70 2c 20 0a 20 20 69 6e    void *p, .  in
54a0: 74 20 6f 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68  t op,.  const ch
54b0: 61 72 20 2a 7a 44 62 2c 20 0a 20 20 63 6f 6e 73  ar *zDb, .  cons
54c0: 74 20 63 68 61 72 20 2a 7a 54 62 6c 2c 20 0a 20  t char *zTbl, . 
54d0: 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 72 6f   sqlite_int64 ro
54e0: 77 69 64 0a 29 7b 0a 20 20 53 71 6c 69 74 65 44  wid.){.  SqliteD
54f0: 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65  b *pDb = (Sqlite
5500: 44 62 20 2a 29 70 3b 0a 20 20 54 63 6c 5f 4f 62  Db *)p;.  Tcl_Ob
5510: 6a 20 2a 70 43 6d 64 3b 0a 20 20 73 74 61 74 69  j *pCmd;.  stati
5520: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a  c const char *az
5530: 53 74 72 5b 5d 20 3d 20 7b 22 44 45 4c 45 54 45  Str[] = {"DELETE
5540: 22 2c 20 22 49 4e 53 45 52 54 22 2c 20 22 55 50  ", "INSERT", "UP
5550: 44 41 54 45 22 7d 3b 0a 0a 20 20 61 73 73 65 72  DATE"};..  asser
5560: 74 28 20 28 53 51 4c 49 54 45 5f 44 45 4c 45 54  t( (SQLITE_DELET
5570: 45 2d 31 29 2f 39 20 3d 3d 20 30 20 29 3b 0a 20  E-1)/9 == 0 );. 
5580: 20 61 73 73 65 72 74 28 20 28 53 51 4c 49 54 45   assert( (SQLITE
5590: 5f 49 4e 53 45 52 54 2d 31 29 2f 39 20 3d 3d 20  _INSERT-1)/9 == 
55a0: 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  1 );.  assert( (
55b0: 53 51 4c 49 54 45 5f 55 50 44 41 54 45 2d 31 29  SQLITE_UPDATE-1)
55c0: 2f 39 20 3d 3d 20 32 20 29 3b 0a 0a 20 20 61 73  /9 == 2 );..  as
55d0: 73 65 72 74 28 20 70 44 62 2d 3e 70 55 70 64 61  sert( pDb->pUpda
55e0: 74 65 48 6f 6f 6b 20 29 3b 0a 20 20 61 73 73 65  teHook );.  asse
55f0: 72 74 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 49  rt( op==SQLITE_I
5600: 4e 53 45 52 54 20 7c 7c 20 6f 70 3d 3d 53 51 4c  NSERT || op==SQL
5610: 49 54 45 5f 55 50 44 41 54 45 20 7c 7c 20 6f 70  ITE_UPDATE || op
5620: 3d 3d 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 20  ==SQLITE_DELETE 
5630: 29 3b 0a 0a 20 20 70 43 6d 64 20 3d 20 54 63 6c  );..  pCmd = Tcl
5640: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 44  _DuplicateObj(pD
5650: 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b 29 3b  b->pUpdateHook);
5660: 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f  .  Tcl_IncrRefCo
5670: 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 54 63 6c  unt(pCmd);.  Tcl
5680: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
5690: 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54  ement(0, pCmd, T
56a0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
56b0: 61 7a 53 74 72 5b 28 6f 70 2d 31 29 2f 39 5d 2c  azStr[(op-1)/9],
56c0: 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73   -1));.  Tcl_Lis
56d0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
56e0: 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e  t(0, pCmd, Tcl_N
56f0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 44 62 2c  ewStringObj(zDb,
5700: 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73   -1));.  Tcl_Lis
5710: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
5720: 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e  t(0, pCmd, Tcl_N
5730: 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54 62 6c  ewStringObj(zTbl
5740: 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
5750: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
5760: 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f  nt(0, pCmd, Tcl_
5770: 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 72 6f  NewWideIntObj(ro
5780: 77 69 64 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61  wid));.  Tcl_Eva
5790: 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69 6e 74 65  lObjEx(pDb->inte
57a0: 72 70 2c 20 70 43 6d 64 2c 20 54 43 4c 5f 45 56  rp, pCmd, TCL_EV
57b0: 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20 54 63  AL_DIRECT);.  Tc
57c0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
57d0: 43 6d 64 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  Cmd);.}..static 
57e0: 76 6f 69 64 20 74 63 6c 43 6f 6c 6c 61 74 65 4e  void tclCollateN
57f0: 65 65 64 65 64 28 0a 20 20 76 6f 69 64 20 2a 70  eeded(.  void *p
5800: 43 74 78 2c 0a 20 20 73 71 6c 69 74 65 33 20 2a  Ctx,.  sqlite3 *
5810: 64 62 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20  db,.  int enc,. 
5820: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
5830: 6d 65 0a 29 7b 0a 20 20 53 71 6c 69 74 65 44 62  me.){.  SqliteDb
5840: 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44   *pDb = (SqliteD
5850: 62 20 2a 29 70 43 74 78 3b 0a 20 20 54 63 6c 5f  b *)pCtx;.  Tcl_
5860: 4f 62 6a 20 2a 70 53 63 72 69 70 74 20 3d 20 54  Obj *pScript = T
5870: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28  cl_DuplicateObj(
5880: 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65  pDb->pCollateNee
5890: 64 65 64 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72  ded);.  Tcl_Incr
58a0: 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74  RefCount(pScript
58b0: 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
58c0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
58d0: 20 70 53 63 72 69 70 74 2c 20 54 63 6c 5f 4e 65   pScript, Tcl_Ne
58e0: 77 53 74 72 69 6e 67 4f 62 6a 28 7a 4e 61 6d 65  wStringObj(zName
58f0: 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 45 76  , -1));.  Tcl_Ev
5900: 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69 6e 74  alObjEx(pDb->int
5910: 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20 30 29  erp, pScript, 0)
5920: 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43  ;.  Tcl_DecrRefC
5930: 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 7d  ount(pScript);.}
5940: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
5950: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
5960: 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20 53 51  o evaluate an SQ
5970: 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63  L collation func
5980: 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64  tion implemented
5990: 0a 2a 2a 20 75 73 69 6e 67 20 54 43 4c 20 73 63  .** using TCL sc
59a0: 72 69 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ript..*/.static 
59b0: 69 6e 74 20 74 63 6c 53 71 6c 43 6f 6c 6c 61 74  int tclSqlCollat
59c0: 65 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c  e(.  void *pCtx,
59d0: 0a 20 20 69 6e 74 20 6e 41 2c 0a 20 20 63 6f 6e  .  int nA,.  con
59e0: 73 74 20 76 6f 69 64 20 2a 7a 41 2c 0a 20 20 69  st void *zA,.  i
59f0: 6e 74 20 6e 42 2c 0a 20 20 63 6f 6e 73 74 20 76  nt nB,.  const v
5a00: 6f 69 64 20 2a 7a 42 0a 29 7b 0a 20 20 53 71 6c  oid *zB.){.  Sql
5a10: 43 6f 6c 6c 61 74 65 20 2a 70 20 3d 20 28 53 71  Collate *p = (Sq
5a20: 6c 43 6f 6c 6c 61 74 65 20 2a 29 70 43 74 78 3b  lCollate *)pCtx;
5a30: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64  .  Tcl_Obj *pCmd
5a40: 3b 0a 0a 20 20 70 43 6d 64 20 3d 20 54 63 6c 5f  ;..  pCmd = Tcl_
5a50: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 2d 3e  NewStringObj(p->
5a60: 7a 53 63 72 69 70 74 2c 20 2d 31 29 3b 0a 20 20  zScript, -1);.  
5a70: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
5a80: 28 70 43 6d 64 29 3b 0a 20 20 54 63 6c 5f 4c 69  (pCmd);.  Tcl_Li
5a90: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
5aa0: 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43  nt(p->interp, pC
5ab0: 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  md, Tcl_NewStrin
5ac0: 67 4f 62 6a 28 7a 41 2c 20 6e 41 29 29 3b 0a 20  gObj(zA, nA));. 
5ad0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
5ae0: 6e 64 45 6c 65 6d 65 6e 74 28 70 2d 3e 69 6e 74  ndElement(p->int
5af0: 65 72 70 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e  erp, pCmd, Tcl_N
5b00: 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 42 2c 20  ewStringObj(zB, 
5b10: 6e 42 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c  nB));.  Tcl_Eval
5b20: 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c  ObjEx(p->interp,
5b30: 20 70 43 6d 64 2c 20 54 43 4c 5f 45 56 41 4c 5f   pCmd, TCL_EVAL_
5b40: 44 49 52 45 43 54 29 3b 0a 20 20 54 63 6c 5f 44  DIRECT);.  Tcl_D
5b50: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64  ecrRefCount(pCmd
5b60: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 61 74 6f  );.  return (ato
5b70: 69 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52  i(Tcl_GetStringR
5b80: 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29  esult(p->interp)
5b90: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ));.}../*.** Thi
5ba0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
5bb0: 6c 65 64 20 74 6f 20 65 76 61 6c 75 61 74 65 20  led to evaluate 
5bc0: 61 6e 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20  an SQL function 
5bd0: 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 75  implemented.** u
5be0: 73 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74 2e  sing TCL script.
5bf0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5c00: 74 63 6c 53 71 6c 46 75 6e 63 28 73 71 6c 69 74  tclSqlFunc(sqlit
5c10: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
5c20: 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73  ext, int argc, s
5c30: 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 61 72  qlite3_value**ar
5c40: 67 76 29 7b 0a 20 20 53 71 6c 46 75 6e 63 20 2a  gv){.  SqlFunc *
5c50: 70 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72  p = sqlite3_user
5c60: 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29 3b 0a  _data(context);.
5c70: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b    Tcl_Obj *pCmd;
5c80: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
5c90: 72 63 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 3d  rc;..  if( argc=
5ca0: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  =0 ){.    /* If 
5cb0: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 61 72 67  there are no arg
5cc0: 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 66 75  uments to the fu
5cd0: 6e 63 74 69 6f 6e 2c 20 63 61 6c 6c 20 54 63 6c  nction, call Tcl
5ce0: 5f 45 76 61 6c 4f 62 6a 45 78 20 6f 6e 20 74 68  _EvalObjEx on th
5cf0: 65 0a 20 20 20 20 2a 2a 20 73 63 72 69 70 74 20  e.    ** script 
5d00: 6f 62 6a 65 63 74 20 64 69 72 65 63 74 6c 79 2e  object directly.
5d10: 20 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74 68    This allows th
5d20: 65 20 54 43 4c 20 63 6f 6d 70 69 6c 65 72 20 74  e TCL compiler t
5d30: 6f 20 67 65 6e 65 72 61 74 65 0a 20 20 20 20 2a  o generate.    *
5d40: 2a 20 62 79 74 65 63 6f 64 65 20 66 6f 72 20 74  * bytecode for t
5d50: 68 65 20 63 6f 6d 6d 61 6e 64 20 6f 6e 20 74 68  he command on th
5d60: 65 20 66 69 72 73 74 20 69 6e 76 6f 63 61 74 69  e first invocati
5d70: 6f 6e 20 61 6e 64 20 74 68 75 73 20 6d 61 6b 65  on and thus make
5d80: 0a 20 20 20 20 2a 2a 20 73 75 62 73 65 71 75 65  .    ** subseque
5d90: 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73 20 6d  nt invocations m
5da0: 75 63 68 20 66 61 73 74 65 72 2e 20 2a 2f 0a 20  uch faster. */. 
5db0: 20 20 20 70 43 6d 64 20 3d 20 70 2d 3e 70 53 63     pCmd = p->pSc
5dc0: 72 69 70 74 3b 0a 20 20 20 20 54 63 6c 5f 49 6e  ript;.    Tcl_In
5dd0: 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29  crRefCount(pCmd)
5de0: 3b 0a 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 45  ;.    rc = Tcl_E
5df0: 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65  valObjEx(p->inte
5e00: 72 70 2c 20 70 43 6d 64 2c 20 30 29 3b 0a 20 20  rp, pCmd, 0);.  
5e10: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
5e20: 6e 74 28 70 43 6d 64 29 3b 0a 20 20 7d 65 6c 73  nt(pCmd);.  }els
5e30: 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  e{.    /* If the
5e40: 72 65 20 61 72 65 20 61 72 67 75 6d 65 6e 74 73  re are arguments
5e50: 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   to the function
5e60: 2c 20 6d 61 6b 65 20 61 20 73 68 61 6c 6c 6f 77  , make a shallow
5e70: 20 63 6f 70 79 20 6f 66 20 74 68 65 0a 20 20 20   copy of the.   
5e80: 20 2a 2a 20 73 63 72 69 70 74 20 6f 62 6a 65 63   ** script objec
5e90: 74 2c 20 6c 61 70 70 65 6e 64 20 74 68 65 20 61  t, lappend the a
5ea0: 72 67 75 6d 65 6e 74 73 2c 20 74 68 65 6e 20 65  rguments, then e
5eb0: 76 61 6c 75 61 74 65 20 74 68 65 20 63 6f 70 79  valuate the copy
5ec0: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
5ed0: 42 79 20 22 73 68 61 6c 6c 6f 77 22 20 63 6f 70  By "shallow" cop
5ee0: 79 2c 20 77 65 20 6d 65 61 6e 20 6f 6e 6c 79 20  y, we mean only 
5ef0: 74 68 65 20 6f 75 74 65 72 20 6c 69 73 74 20 54  the outer list T
5f00: 63 6c 5f 4f 62 6a 20 69 73 20 64 75 70 6c 69 63  cl_Obj is duplic
5f10: 61 74 65 64 2e 0a 20 20 20 20 2a 2a 20 54 68 65  ated..    ** The
5f20: 20 6e 65 77 20 54 63 6c 5f 4f 62 6a 20 63 6f 6e   new Tcl_Obj con
5f30: 74 61 69 6e 73 20 70 6f 69 6e 74 65 72 73 20 74  tains pointers t
5f40: 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6c  o the original l
5f50: 69 73 74 20 65 6c 65 6d 65 6e 74 73 2e 20 0a 20  ist elements. . 
5f60: 20 20 20 2a 2a 20 54 68 61 74 20 77 61 79 2c 20     ** That way, 
5f70: 77 68 65 6e 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  when Tcl_EvalObj
5f80: 76 28 29 20 69 73 20 72 75 6e 20 61 6e 64 20 73  v() is run and s
5f90: 68 69 6d 6d 65 72 73 20 74 68 65 20 66 69 72 73  himmers the firs
5fa0: 74 20 65 6c 65 6d 65 6e 74 0a 20 20 20 20 2a 2a  t element.    **
5fb0: 20 6f 66 20 74 68 65 20 6c 69 73 74 20 74 6f 20   of the list to 
5fc0: 74 63 6c 43 6d 64 4e 61 6d 65 54 79 70 65 2c 20  tclCmdNameType, 
5fd0: 74 68 61 74 20 61 6c 74 65 72 6e 61 74 65 20 72  that alternate r
5fe0: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 77 69  epresentation wi
5ff0: 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 70 72 65  ll.    ** be pre
6000: 73 65 72 76 65 64 20 61 6e 64 20 72 65 75 73 65  served and reuse
6010: 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 69 6e  d on the next in
6020: 76 6f 63 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  vocation..    */
6030: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61  .    Tcl_Obj **a
6040: 41 72 67 3b 0a 20 20 20 20 69 6e 74 20 6e 41 72  Arg;.    int nAr
6050: 67 3b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 4c  g;.    if( Tcl_L
6060: 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74  istObjGetElement
6070: 73 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 2d 3e  s(p->interp, p->
6080: 70 53 63 72 69 70 74 2c 20 26 6e 41 72 67 2c 20  pScript, &nArg, 
6090: 26 61 41 72 67 29 20 29 7b 0a 20 20 20 20 20 20  &aArg) ){.      
60a0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
60b0: 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 54 63  rror(context, Tc
60c0: 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
60d0: 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c 20 2d 31  t(p->interp), -1
60e0: 29 3b 20 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ); .      return
60f0: 3b 0a 20 20 20 20 7d 20 20 20 20 20 0a 20 20 20  ;.    }     .   
6100: 20 70 43 6d 64 20 3d 20 54 63 6c 5f 4e 65 77 4c   pCmd = Tcl_NewL
6110: 69 73 74 4f 62 6a 28 6e 41 72 67 2c 20 61 41 72  istObj(nArg, aAr
6120: 67 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72  g);.    Tcl_Incr
6130: 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a  RefCount(pCmd);.
6140: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61      for(i=0; i<a
6150: 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rgc; i++){.     
6160: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
6170: 70 49 6e 20 3d 20 61 72 67 76 5b 69 5d 3b 0a 20  pIn = argv[i];. 
6180: 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56       Tcl_Obj *pV
6190: 61 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  al;.            
61a0: 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20 70 56  .      /* Set pV
61b0: 61 6c 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  al to contain th
61c0: 65 20 69 27 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  e i'th column of
61d0: 20 74 68 69 73 20 72 6f 77 2e 20 2a 2f 0a 20 20   this row. */.  
61e0: 20 20 20 20 73 77 69 74 63 68 28 20 73 71 6c 69      switch( sqli
61f0: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70  te3_value_type(p
6200: 49 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  In) ){.        c
6210: 61 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a  ase SQLITE_BLOB:
6220: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74   {.          int
6230: 20 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33   bytes = sqlite3
6240: 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70 49 6e  _value_bytes(pIn
6250: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 56 61  );.          pVa
6260: 6c 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41  l = Tcl_NewByteA
6270: 72 72 61 79 4f 62 6a 28 73 71 6c 69 74 65 33 5f  rrayObj(sqlite3_
6280: 76 61 6c 75 65 5f 62 6c 6f 62 28 70 49 6e 29 2c  value_blob(pIn),
6290: 20 62 79 74 65 73 29 3b 0a 20 20 20 20 20 20 20   bytes);.       
62a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
62b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65    }.        case
62c0: 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a   SQLITE_INTEGER:
62d0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   {.          sql
62e0: 69 74 65 5f 69 6e 74 36 34 20 76 20 3d 20 73 71  ite_int64 v = sq
62f0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36  lite3_value_int6
6300: 34 28 70 49 6e 29 3b 0a 20 20 20 20 20 20 20 20  4(pIn);.        
6310: 20 20 69 66 28 20 76 3e 3d 2d 32 31 34 37 34 38    if( v>=-214748
6320: 33 36 34 37 20 26 26 20 76 3c 3d 32 31 34 37 34  3647 && v<=21474
6330: 38 33 36 34 37 20 29 7b 0a 20 20 20 20 20 20 20  83647 ){.       
6340: 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f       pVal = Tcl_
6350: 4e 65 77 49 6e 74 4f 62 6a 28 28 69 6e 74 29 76  NewIntObj((int)v
6360: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
6370: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
6380: 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 57 69  pVal = Tcl_NewWi
6390: 64 65 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20  deIntObj(v);.   
63a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
63b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
63c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65    }.        case
63d0: 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b   SQLITE_FLOAT: {
63e0: 0a 20 20 20 20 20 20 20 20 20 20 64 6f 75 62 6c  .          doubl
63f0: 65 20 72 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  e r = sqlite3_va
6400: 6c 75 65 5f 64 6f 75 62 6c 65 28 70 49 6e 29 3b  lue_double(pIn);
6410: 0a 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20  .          pVal 
6420: 3d 20 54 63 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f  = Tcl_NewDoubleO
6430: 62 6a 28 72 29 3b 0a 20 20 20 20 20 20 20 20 20  bj(r);.         
6440: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
6450: 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53  }.        case S
6460: 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20  QLITE_NULL: {.  
6470: 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54          pVal = T
6480: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
6490: 70 2d 3e 70 44 62 2d 3e 7a 4e 75 6c 6c 2c 20 2d  p->pDb->zNull, -
64a0: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  1);.          br
64b0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
64c0: 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20         default: 
64d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
64e0: 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f  bytes = sqlite3_
64f0: 76 61 6c 75 65 5f 62 79 74 65 73 28 70 49 6e 29  value_bytes(pIn)
6500: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 56 61 6c  ;.          pVal
6510: 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67   = Tcl_NewString
6520: 4f 62 6a 28 28 63 68 61 72 20 2a 29 73 71 6c 69  Obj((char *)sqli
6530: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70  te3_value_text(p
6540: 49 6e 29 2c 20 62 79 74 65 73 29 3b 0a 20 20 20  In), bytes);.   
6550: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
6560: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
6570: 20 20 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 4c        rc = Tcl_L
6580: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
6590: 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70  ent(p->interp, p
65a0: 43 6d 64 2c 20 70 56 61 6c 29 3b 0a 20 20 20 20  Cmd, pVal);.    
65b0: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
65c0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
65d0: 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20 20  ount(pCmd);.    
65e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
65f0: 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74  lt_error(context
6600: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52  , Tcl_GetStringR
6610: 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29  esult(p->interp)
6620: 2c 20 2d 31 29 3b 20 0a 20 20 20 20 20 20 20 20  , -1); .        
6630: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
6640: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 70      }.    if( !p
6650: 2d 3e 75 73 65 45 76 61 6c 4f 62 6a 76 20 29 7b  ->useEvalObjv ){
6660: 0a 20 20 20 20 20 20 2f 2a 20 54 63 6c 5f 45 76  .      /* Tcl_Ev
6670: 61 6c 4f 62 6a 45 78 28 29 20 77 69 6c 6c 20 61  alObjEx() will a
6680: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 61 6c  utomatically cal
6690: 6c 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29  l Tcl_EvalObjv()
66a0: 20 69 66 20 70 43 6d 64 0a 20 20 20 20 20 20 2a   if pCmd.      *
66b0: 2a 20 69 73 20 61 20 6c 69 73 74 20 77 69 74 68  * is a list with
66c0: 6f 75 74 20 61 20 73 74 72 69 6e 67 20 72 65 70  out a string rep
66d0: 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20 20 54 6f  resentation.  To
66e0: 20 70 72 65 76 65 6e 74 20 74 68 69 73 20 66 72   prevent this fr
66f0: 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 68 61 70 70  om.      ** happ
6700: 65 6e 69 6e 67 2c 20 6d 61 6b 65 20 73 75 72 65  ening, make sure
6710: 20 70 43 6d 64 20 68 61 73 20 61 20 76 61 6c 69   pCmd has a vali
6720: 64 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65  d string represe
6730: 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ntation */.     
6740: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 70   Tcl_GetString(p
6750: 43 6d 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Cmd);.    }.    
6760: 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  rc = Tcl_EvalObj
6770: 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43  Ex(p->interp, pC
6780: 6d 64 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52  md, TCL_EVAL_DIR
6790: 45 43 54 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65  ECT);.    Tcl_De
67a0: 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29  crRefCount(pCmd)
67b0: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 20  ;.  }..  if( rc 
67c0: 26 26 20 72 63 21 3d 54 43 4c 5f 52 45 54 55 52  && rc!=TCL_RETUR
67d0: 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  N ){.    sqlite3
67e0: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f  _result_error(co
67f0: 6e 74 65 78 74 2c 20 54 63 6c 5f 47 65 74 53 74  ntext, Tcl_GetSt
6800: 72 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e  ringResult(p->in
6810: 74 65 72 70 29 2c 20 2d 31 29 3b 20 0a 20 20 7d  terp), -1); .  }
6820: 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 4f 62  else{.    Tcl_Ob
6830: 6a 20 2a 70 56 61 72 20 3d 20 54 63 6c 5f 47 65  j *pVar = Tcl_Ge
6840: 74 4f 62 6a 52 65 73 75 6c 74 28 70 2d 3e 69 6e  tObjResult(p->in
6850: 74 65 72 70 29 3b 0a 20 20 20 20 69 6e 74 20 6e  terp);.    int n
6860: 3b 0a 20 20 20 20 75 38 20 2a 64 61 74 61 3b 0a  ;.    u8 *data;.
6870: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
6880: 7a 54 79 70 65 20 3d 20 28 70 56 61 72 2d 3e 74  zType = (pVar->t
6890: 79 70 65 50 74 72 20 3f 20 70 56 61 72 2d 3e 74  ypePtr ? pVar->t
68a0: 79 70 65 50 74 72 2d 3e 6e 61 6d 65 20 3a 20 22  ypePtr->name : "
68b0: 22 29 3b 0a 20 20 20 20 63 68 61 72 20 63 20 3d  ");.    char c =
68c0: 20 7a 54 79 70 65 5b 30 5d 3b 0a 20 20 20 20 69   zType[0];.    i
68d0: 66 28 20 63 3d 3d 27 62 27 20 26 26 20 73 74 72  f( c=='b' && str
68e0: 63 6d 70 28 7a 54 79 70 65 2c 22 62 79 74 65 61  cmp(zType,"bytea
68f0: 72 72 61 79 22 29 3d 3d 30 20 26 26 20 70 56 61  rray")==0 && pVa
6900: 72 2d 3e 62 79 74 65 73 3d 3d 30 20 29 7b 0a 20  r->bytes==0 ){. 
6910: 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 72 65 74       /* Only ret
6920: 75 72 6e 20 61 20 42 4c 4f 42 20 74 79 70 65 20  urn a BLOB type 
6930: 69 66 20 74 68 65 20 54 63 6c 20 76 61 72 69 61  if the Tcl varia
6940: 62 6c 65 20 69 73 20 61 20 62 79 74 65 61 72 72  ble is a bytearr
6950: 61 79 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  ay and.      ** 
6960: 68 61 73 20 6e 6f 20 73 74 72 69 6e 67 20 72 65  has no string re
6970: 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20 2a 2f  presentation. */
6980: 0a 20 20 20 20 20 20 64 61 74 61 20 3d 20 54 63  .      data = Tc
6990: 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72  l_GetByteArrayFr
69a0: 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b  omObj(pVar, &n);
69b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
69c0: 65 73 75 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65  esult_blob(conte
69d0: 78 74 2c 20 64 61 74 61 2c 20 6e 2c 20 53 51 4c  xt, data, n, SQL
69e0: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
69f0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
6a00: 3d 27 62 27 20 26 26 20 73 74 72 63 6d 70 28 7a  ='b' && strcmp(z
6a10: 54 79 70 65 2c 22 62 6f 6f 6c 65 61 6e 22 29 3d  Type,"boolean")=
6a20: 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =0 ){.      Tcl_
6a30: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 30 2c  GetIntFromObj(0,
6a40: 20 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20   pVar, &n);.    
6a50: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
6a60: 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 6e 29  _int(context, n)
6a70: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
6a80: 63 3d 3d 27 64 27 20 26 26 20 73 74 72 63 6d 70  c=='d' && strcmp
6a90: 28 7a 54 79 70 65 2c 22 64 6f 75 62 6c 65 22 29  (zType,"double")
6aa0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 6f 75  ==0 ){.      dou
6ab0: 62 6c 65 20 72 3b 0a 20 20 20 20 20 20 54 63 6c  ble r;.      Tcl
6ac0: 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62  _GetDoubleFromOb
6ad0: 6a 28 30 2c 20 70 56 61 72 2c 20 26 72 29 3b 0a  j(0, pVar, &r);.
6ae0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
6af0: 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74  sult_double(cont
6b00: 65 78 74 2c 20 72 29 3b 0a 20 20 20 20 7d 65 6c  ext, r);.    }el
6b10: 73 65 20 69 66 28 20 28 63 3d 3d 27 77 27 20 26  se if( (c=='w' &
6b20: 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22  & strcmp(zType,"
6b30: 77 69 64 65 49 6e 74 22 29 3d 3d 30 29 20 7c 7c  wideInt")==0) ||
6b40: 0a 20 20 20 20 20 20 20 20 20 20 28 63 3d 3d 27  .          (c=='
6b50: 69 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79  i' && strcmp(zTy
6b60: 70 65 2c 22 69 6e 74 22 29 3d 3d 30 29 20 29 7b  pe,"int")==0) ){
6b70: 0a 20 20 20 20 20 20 54 63 6c 5f 57 69 64 65 49  .      Tcl_WideI
6b80: 6e 74 20 76 3b 0a 20 20 20 20 20 20 54 63 6c 5f  nt v;.      Tcl_
6b90: 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62  GetWideIntFromOb
6ba0: 6a 28 30 2c 20 70 56 61 72 2c 20 26 76 29 3b 0a  j(0, pVar, &v);.
6bb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
6bc0: 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65  sult_int64(conte
6bd0: 78 74 2c 20 76 29 3b 0a 20 20 20 20 7d 65 6c 73  xt, v);.    }els
6be0: 65 7b 0a 20 20 20 20 20 20 64 61 74 61 20 3d 20  e{.      data = 
6bf0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
6c00: 29 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72  )Tcl_GetStringFr
6c10: 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b  omObj(pVar, &n);
6c20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
6c30: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
6c40: 78 74 2c 20 28 63 68 61 72 20 2a 29 64 61 74 61  xt, (char *)data
6c50: 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  , n, SQLITE_TRAN
6c60: 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d 0a 20 20  SIENT);.    }.  
6c70: 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.}..#ifndef SQL
6c80: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
6c90: 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 54 68 69  ZATION./*.** Thi
6ca0: 73 20 69 73 20 74 68 65 20 61 75 74 68 65 6e 74  s is the authent
6cb0: 69 63 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  ication function
6cc0: 2e 20 20 49 74 20 61 70 70 65 6e 64 73 20 74 68  .  It appends th
6cd0: 65 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e  e authentication
6ce0: 0a 2a 2a 20 74 79 70 65 20 63 6f 64 65 20 61 6e  .** type code an
6cf0: 64 20 74 68 65 20 74 77 6f 20 61 72 67 75 6d 65  d the two argume
6d00: 6e 74 73 20 74 6f 20 7a 43 6d 64 5b 5d 20 74 68  nts to zCmd[] th
6d10: 65 6e 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 72  en invokes the r
6d20: 65 73 75 6c 74 0a 2a 2a 20 6f 6e 20 74 68 65 20  esult.** on the 
6d30: 69 6e 74 65 72 70 72 65 74 65 72 2e 20 20 54 68  interpreter.  Th
6d40: 65 20 72 65 70 6c 79 20 69 73 20 65 78 61 6d 69  e reply is exami
6d50: 6e 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ned to determine
6d60: 20 69 66 20 74 68 65 0a 2a 2a 20 61 75 74 68 65   if the.** authe
6d70: 6e 74 69 63 61 74 69 6f 6e 20 66 61 69 6c 73 20  ntication fails 
6d80: 6f 72 20 73 75 63 63 65 65 64 73 2e 0a 2a 2f 0a  or succeeds..*/.
6d90: 73 74 61 74 69 63 20 69 6e 74 20 61 75 74 68 5f  static int auth_
6da0: 63 61 6c 6c 62 61 63 6b 28 0a 20 20 76 6f 69 64  callback(.  void
6db0: 20 2a 70 41 72 67 2c 0a 20 20 69 6e 74 20 63 6f   *pArg,.  int co
6dc0: 64 65 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  de,.  const char
6dd0: 20 2a 7a 41 72 67 31 2c 0a 20 20 63 6f 6e 73 74   *zArg1,.  const
6de0: 20 63 68 61 72 20 2a 7a 41 72 67 32 2c 0a 20 20   char *zArg2,.  
6df0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
6e00: 33 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  3,.  const char 
6e10: 2a 7a 41 72 67 34 0a 23 69 66 64 65 66 20 53 51  *zArg4.#ifdef SQ
6e20: 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e  LITE_USER_AUTHEN
6e30: 54 49 43 41 54 49 4f 4e 0a 20 20 2c 63 6f 6e 73  TICATION.  ,cons
6e40: 74 20 63 68 61 72 20 2a 7a 41 72 67 35 0a 23 65  t char *zArg5.#e
6e50: 6e 64 69 66 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  ndif.){.  const 
6e60: 63 68 61 72 20 2a 7a 43 6f 64 65 3b 0a 20 20 54  char *zCode;.  T
6e70: 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a  cl_DString str;.
6e80: 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73    int rc;.  cons
6e90: 74 20 63 68 61 72 20 2a 7a 52 65 70 6c 79 3b 0a  t char *zReply;.
6ea0: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
6eb0: 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 70 41 72  = (SqliteDb*)pAr
6ec0: 67 3b 0a 20 20 69 66 28 20 70 44 62 2d 3e 64 69  g;.  if( pDb->di
6ed0: 73 61 62 6c 65 41 75 74 68 20 29 20 72 65 74 75  sableAuth ) retu
6ee0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
6ef0: 20 73 77 69 74 63 68 28 20 63 6f 64 65 20 29 7b   switch( code ){
6f00: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
6f10: 5f 43 4f 50 59 20 20 20 20 20 20 20 20 20 20 20  _COPY           
6f20: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
6f30: 54 45 5f 43 4f 50 59 22 3b 20 62 72 65 61 6b 3b  TE_COPY"; break;
6f40: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
6f50: 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 20 20 20  _CREATE_INDEX   
6f60: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
6f70: 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 22  TE_CREATE_INDEX"
6f80: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
6f90: 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  e SQLITE_CREATE_
6fa0: 54 41 42 4c 45 20 20 20 20 20 20 3a 20 7a 43 6f  TABLE      : zCo
6fb0: 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54  de="SQLITE_CREAT
6fc0: 45 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b  E_TABLE"; break;
6fd0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
6fe0: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44  _CREATE_TEMP_IND
6ff0: 45 58 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49  EX : zCode="SQLI
7000: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49  TE_CREATE_TEMP_I
7010: 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20  NDEX"; break;.  
7020: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52    case SQLITE_CR
7030: 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 20  EATE_TEMP_TABLE 
7040: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
7050: 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c  CREATE_TEMP_TABL
7060: 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  E"; break;.    c
7070: 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54  ase SQLITE_CREAT
7080: 45 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 3a 20  E_TEMP_TRIGGER: 
7090: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52  zCode="SQLITE_CR
70a0: 45 41 54 45 5f 54 45 4d 50 5f 54 52 49 47 47 45  EATE_TEMP_TRIGGE
70b0: 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  R"; break;.    c
70c0: 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54  ase SQLITE_CREAT
70d0: 45 5f 54 45 4d 50 5f 56 49 45 57 20 20 3a 20 7a  E_TEMP_VIEW  : z
70e0: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45  Code="SQLITE_CRE
70f0: 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 22 3b 20  ATE_TEMP_VIEW"; 
7100: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
7110: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 52  SQLITE_CREATE_TR
7120: 49 47 47 45 52 20 20 20 20 3a 20 7a 43 6f 64 65  IGGER    : zCode
7130: 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  ="SQLITE_CREATE_
7140: 54 52 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b  TRIGGER"; 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 56 49 45 57 20 20 20 20  _CREATE_VIEW    
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 56 49 45 57 22 3b  TE_CREATE_VIEW";
7190: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
71a0: 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 20 20   SQLITE_DELETE  
71b0: 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64            : zCod
71c0: 65 3d 22 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  e="SQLITE_DELETE
71d0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
71e0: 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49  se SQLITE_DROP_I
71f0: 4e 44 45 58 20 20 20 20 20 20 20 20 3a 20 7a 43  NDEX        : zC
7200: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50  ode="SQLITE_DROP
7210: 5f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a  _INDEX"; break;.
7220: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
7230: 44 52 4f 50 5f 54 41 42 4c 45 20 20 20 20 20 20  DROP_TABLE      
7240: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
7250: 45 5f 44 52 4f 50 5f 54 41 42 4c 45 22 3b 20 62  E_DROP_TABLE"; b
7260: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
7270: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
7280: 49 4e 44 45 58 20 20 20 3a 20 7a 43 6f 64 65 3d  INDEX   : zCode=
7290: 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d  "SQLITE_DROP_TEM
72a0: 50 5f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b  P_INDEX"; break;
72b0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
72c0: 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45  _DROP_TEMP_TABLE
72d0: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
72e0: 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42  TE_DROP_TEMP_TAB
72f0: 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  LE"; break;.    
7300: 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50  case SQLITE_DROP
7310: 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 20 3a 20  _TEMP_TRIGGER : 
7320: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52  zCode="SQLITE_DR
7330: 4f 50 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 22  OP_TEMP_TRIGGER"
7340: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
7350: 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  e SQLITE_DROP_TE
7360: 4d 50 5f 56 49 45 57 20 20 20 20 3a 20 7a 43 6f  MP_VIEW    : zCo
7370: 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f  de="SQLITE_DROP_
7380: 54 45 4d 50 5f 56 49 45 57 22 3b 20 62 72 65 61  TEMP_VIEW"; 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 52 49 47 47 45 52 20  TE_DROP_TRIGGER 
73b0: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
73c0: 4c 49 54 45 5f 44 52 4f 50 5f 54 52 49 47 47 45  LITE_DROP_TRIGGE
73d0: 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  R"; break;.    c
73e0: 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  ase SQLITE_DROP_
73f0: 56 49 45 57 20 20 20 20 20 20 20 20 20 3a 20 7a  VIEW         : z
7400: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f  Code="SQLITE_DRO
7410: 50 5f 56 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a  P_VIEW"; break;.
7420: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
7430: 49 4e 53 45 52 54 20 20 20 20 20 20 20 20 20 20  INSERT          
7440: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
7450: 45 5f 49 4e 53 45 52 54 22 3b 20 62 72 65 61 6b  E_INSERT"; break
7460: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
7470: 45 5f 50 52 41 47 4d 41 20 20 20 20 20 20 20 20  E_PRAGMA        
7480: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
7490: 49 54 45 5f 50 52 41 47 4d 41 22 3b 20 62 72 65  ITE_PRAGMA"; bre
74a0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
74b0: 49 54 45 5f 52 45 41 44 20 20 20 20 20 20 20 20  ITE_READ        
74c0: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
74d0: 51 4c 49 54 45 5f 52 45 41 44 22 3b 20 62 72 65  QLITE_READ"; bre
74e0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
74f0: 49 54 45 5f 53 45 4c 45 43 54 20 20 20 20 20 20  ITE_SELECT      
7500: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
7510: 51 4c 49 54 45 5f 53 45 4c 45 43 54 22 3b 20 62  QLITE_SELECT"; b
7520: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
7530: 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f  QLITE_TRANSACTIO
7540: 4e 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d  N       : zCode=
7550: 22 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54  "SQLITE_TRANSACT
7560: 49 4f 4e 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ION"; break;.   
7570: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 55 50 44   case SQLITE_UPD
7580: 41 54 45 20 20 20 20 20 20 20 20 20 20 20 20 3a  ATE            :
7590: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 55   zCode="SQLITE_U
75a0: 50 44 41 54 45 22 3b 20 62 72 65 61 6b 3b 0a 20  PDATE"; break;. 
75b0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
75c0: 54 54 41 43 48 20 20 20 20 20 20 20 20 20 20 20  TTACH           
75d0: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
75e0: 5f 41 54 54 41 43 48 22 3b 20 62 72 65 61 6b 3b  _ATTACH"; break;
75f0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
7600: 5f 44 45 54 41 43 48 20 20 20 20 20 20 20 20 20  _DETACH         
7610: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
7620: 54 45 5f 44 45 54 41 43 48 22 3b 20 62 72 65 61  TE_DETACH"; brea
7630: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
7640: 54 45 5f 41 4c 54 45 52 5f 54 41 42 4c 45 20 20  TE_ALTER_TABLE  
7650: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
7660: 4c 49 54 45 5f 41 4c 54 45 52 5f 54 41 42 4c 45  LITE_ALTER_TABLE
7670: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
7680: 73 65 20 53 51 4c 49 54 45 5f 52 45 49 4e 44 45  se SQLITE_REINDE
7690: 58 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43  X           : zC
76a0: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 52 45 49 4e  ode="SQLITE_REIN
76b0: 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  DEX"; break;.   
76c0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 4e 41   case SQLITE_ANA
76d0: 4c 59 5a 45 20 20 20 20 20 20 20 20 20 20 20 3a  LYZE           :
76e0: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 41   zCode="SQLITE_A
76f0: 4e 41 4c 59 5a 45 22 3b 20 62 72 65 61 6b 3b 0a  NALYZE"; break;.
7700: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
7710: 43 52 45 41 54 45 5f 56 54 41 42 4c 45 20 20 20  CREATE_VTABLE   
7720: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
7730: 45 5f 43 52 45 41 54 45 5f 56 54 41 42 4c 45 22  E_CREATE_VTABLE"
7740: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
7750: 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54  e SQLITE_DROP_VT
7760: 41 42 4c 45 20 20 20 20 20 20 20 3a 20 7a 43 6f  ABLE       : zCo
7770: 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f  de="SQLITE_DROP_
7780: 56 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a  VTABLE"; break;.
7790: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
77a0: 46 55 4e 43 54 49 4f 4e 20 20 20 20 20 20 20 20  FUNCTION        
77b0: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
77c0: 45 5f 46 55 4e 43 54 49 4f 4e 22 3b 20 62 72 65  E_FUNCTION"; bre
77d0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
77e0: 49 54 45 5f 53 41 56 45 50 4f 49 4e 54 20 20 20  ITE_SAVEPOINT   
77f0: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
7800: 51 4c 49 54 45 5f 53 41 56 45 50 4f 49 4e 54 22  QLITE_SAVEPOINT"
7810: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
7820: 65 20 53 51 4c 49 54 45 5f 52 45 43 55 52 53 49  e SQLITE_RECURSI
7830: 56 45 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f  VE         : zCo
7840: 64 65 3d 22 53 51 4c 49 54 45 5f 52 45 43 55 52  de="SQLITE_RECUR
7850: 53 49 56 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20  SIVE"; break;.  
7860: 20 20 64 65 66 61 75 6c 74 20 20 20 20 20 20 20    default       
7870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7880: 3a 20 7a 43 6f 64 65 3d 22 3f 3f 3f 3f 22 3b 20  : zCode="????"; 
7890: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 54 63 6c  break;.  }.  Tcl
78a0: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74  _DStringInit(&st
78b0: 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  r);.  Tcl_DStrin
78c0: 67 41 70 70 65 6e 64 28 26 73 74 72 2c 20 70 44  gAppend(&str, pD
78d0: 62 2d 3e 7a 41 75 74 68 2c 20 2d 31 29 3b 0a 20  b->zAuth, -1);. 
78e0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65   Tcl_DStringAppe
78f0: 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20  ndElement(&str, 
7900: 7a 43 6f 64 65 29 3b 0a 20 20 54 63 6c 5f 44 53  zCode);.  Tcl_DS
7910: 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65  tringAppendEleme
7920: 6e 74 28 26 73 74 72 2c 20 7a 41 72 67 31 20 3f  nt(&str, zArg1 ?
7930: 20 7a 41 72 67 31 20 3a 20 22 22 29 3b 0a 20 20   zArg1 : "");.  
7940: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
7950: 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a  dElement(&str, z
7960: 41 72 67 32 20 3f 20 7a 41 72 67 32 20 3a 20 22  Arg2 ? zArg2 : "
7970: 22 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  ");.  Tcl_DStrin
7980: 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26  gAppendElement(&
7990: 73 74 72 2c 20 7a 41 72 67 33 20 3f 20 7a 41 72  str, zArg3 ? zAr
79a0: 67 33 20 3a 20 22 22 29 3b 0a 20 20 54 63 6c 5f  g3 : "");.  Tcl_
79b0: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65  DStringAppendEle
79c0: 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41 72 67 34  ment(&str, zArg4
79d0: 20 3f 20 7a 41 72 67 34 20 3a 20 22 22 29 3b 0a   ? zArg4 : "");.
79e0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 53  #ifdef SQLITE_US
79f0: 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f  ER_AUTHENTICATIO
7a00: 4e 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41  N.  Tcl_DStringA
7a10: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74  ppendElement(&st
7a20: 72 2c 20 7a 41 72 67 35 20 3f 20 7a 41 72 67 35  r, zArg5 ? zArg5
7a30: 20 3a 20 22 22 29 3b 0a 23 65 6e 64 69 66 20 20   : "");.#endif  
7a40: 0a 20 20 72 63 20 3d 20 54 63 6c 5f 47 6c 6f 62  .  rc = Tcl_Glob
7a50: 61 6c 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65  alEval(pDb->inte
7a60: 72 70 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56  rp, Tcl_DStringV
7a70: 61 6c 75 65 28 26 73 74 72 29 29 3b 0a 20 20 54  alue(&str));.  T
7a80: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
7a90: 73 74 72 29 3b 0a 20 20 7a 52 65 70 6c 79 20 3d  str);.  zReply =
7aa0: 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 3f 20 54 63   rc==TCL_OK ? Tc
7ab0: 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
7ac0: 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 20 3a  t(pDb->interp) :
7ad0: 20 22 53 51 4c 49 54 45 5f 44 45 4e 59 22 3b 0a   "SQLITE_DENY";.
7ae0: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 52 65    if( strcmp(zRe
7af0: 70 6c 79 2c 22 53 51 4c 49 54 45 5f 4f 4b 22 29  ply,"SQLITE_OK")
7b00: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
7b10: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
7b20: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 52  se if( strcmp(zR
7b30: 65 70 6c 79 2c 22 53 51 4c 49 54 45 5f 44 45 4e  eply,"SQLITE_DEN
7b40: 59 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  Y")==0 ){.    rc
7b50: 20 3d 20 53 51 4c 49 54 45 5f 44 45 4e 59 3b 0a   = SQLITE_DENY;.
7b60: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
7b70: 6d 70 28 7a 52 65 70 6c 79 2c 22 53 51 4c 49 54  mp(zReply,"SQLIT
7b80: 45 5f 49 47 4e 4f 52 45 22 29 3d 3d 30 20 29 7b  E_IGNORE")==0 ){
7b90: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
7ba0: 5f 49 47 4e 4f 52 45 3b 0a 20 20 7d 65 6c 73 65  _IGNORE;.  }else
7bb0: 7b 0a 20 20 20 20 72 63 20 3d 20 39 39 39 3b 0a  {.    rc = 999;.
7bc0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
7bd0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
7be0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
7bf0: 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ZATION */../*.**
7c00: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
7c10: 61 64 73 20 61 20 6c 69 6e 65 20 6f 66 20 74 65  ads a line of te
7c20: 78 74 20 66 72 6f 6d 20 46 49 4c 45 20 69 6e 2c  xt from FILE in,
7c30: 20 73 74 6f 72 65 73 0a 2a 2a 20 74 68 65 20 74   stores.** the t
7c40: 65 78 74 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62  ext in memory ob
7c50: 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
7c60: 6f 63 28 29 20 61 6e 64 20 72 65 74 75 72 6e 73  oc() and returns
7c70: 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
7c80: 20 74 68 65 20 74 65 78 74 2e 20 20 4e 55 4c 4c   the text.  NULL
7c90: 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 74 20   is returned at 
7ca0: 65 6e 64 20 6f 66 20 66 69 6c 65 2c 20 6f 72 20  end of file, or 
7cb0: 69 66 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 66  if malloc().** f
7cc0: 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ails..**.** The 
7cd0: 69 6e 74 65 72 66 61 63 65 20 69 73 20 6c 69 6b  interface is lik
7ce0: 65 20 22 72 65 61 64 6c 69 6e 65 22 20 62 75 74  e "readline" but
7cf0: 20 6e 6f 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65   no command-line
7d00: 20 65 64 69 74 69 6e 67 0a 2a 2a 20 69 73 20 64   editing.** is d
7d10: 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 63 6f 70 69 65  one..**.** copie
7d20: 64 20 66 72 6f 6d 20 73 68 65 6c 6c 2e 63 20 66  d from shell.c f
7d30: 72 6f 6d 20 27 2e 69 6d 70 6f 72 74 27 20 63 6f  rom '.import' co
7d40: 6d 6d 61 6e 64 0a 2a 2f 0a 73 74 61 74 69 63 20  mmand.*/.static 
7d50: 63 68 61 72 20 2a 6c 6f 63 61 6c 5f 67 65 74 6c  char *local_getl
7d60: 69 6e 65 28 63 68 61 72 20 2a 7a 50 72 6f 6d 70  ine(char *zPromp
7d70: 74 2c 20 46 49 4c 45 20 2a 69 6e 29 7b 0a 20 20  t, FILE *in){.  
7d80: 63 68 61 72 20 2a 7a 4c 69 6e 65 3b 0a 20 20 69  char *zLine;.  i
7d90: 6e 74 20 6e 4c 69 6e 65 3b 0a 20 20 69 6e 74 20  nt nLine;.  int 
7da0: 6e 3b 0a 0a 20 20 6e 4c 69 6e 65 20 3d 20 31 30  n;..  nLine = 10
7db0: 30 3b 0a 20 20 7a 4c 69 6e 65 20 3d 20 6d 61 6c  0;.  zLine = mal
7dc0: 6c 6f 63 28 20 6e 4c 69 6e 65 20 29 3b 0a 20 20  loc( nLine );.  
7dd0: 69 66 28 20 7a 4c 69 6e 65 3d 3d 30 20 29 20 72  if( zLine==0 ) r
7de0: 65 74 75 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 30  eturn 0;.  n = 0
7df0: 3b 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  ;.  while( 1 ){.
7e00: 20 20 20 20 69 66 28 20 6e 2b 31 30 30 3e 6e 4c      if( n+100>nL
7e10: 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 6e 4c 69  ine ){.      nLi
7e20: 6e 65 20 3d 20 6e 4c 69 6e 65 2a 32 20 2b 20 31  ne = nLine*2 + 1
7e30: 30 30 3b 0a 20 20 20 20 20 20 7a 4c 69 6e 65 20  00;.      zLine 
7e40: 3d 20 72 65 61 6c 6c 6f 63 28 7a 4c 69 6e 65 2c  = realloc(zLine,
7e50: 20 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 69   nLine);.      i
7e60: 66 28 20 7a 4c 69 6e 65 3d 3d 30 20 29 20 72 65  f( zLine==0 ) re
7e70: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
7e80: 20 20 69 66 28 20 66 67 65 74 73 28 26 7a 4c 69    if( fgets(&zLi
7e90: 6e 65 5b 6e 5d 2c 20 6e 4c 69 6e 65 20 2d 20 6e  ne[n], nLine - n
7ea0: 2c 20 69 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , in)==0 ){.    
7eb0: 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20    if( n==0 ){.  
7ec0: 20 20 20 20 20 20 66 72 65 65 28 7a 4c 69 6e 65        free(zLine
7ed0: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
7ee0: 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
7ef0: 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b     zLine[n] = 0;
7f00: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7f10: 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 7a    }.    while( z
7f20: 4c 69 6e 65 5b 6e 5d 20 29 7b 20 6e 2b 2b 3b 20  Line[n] ){ n++; 
7f30: 7d 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26  }.    if( n>0 &&
7f40: 20 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 6e   zLine[n-1]=='\n
7f50: 27 20 29 7b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a  ' ){.      n--;.
7f60: 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d        zLine[n] =
7f70: 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
7f80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 4c 69  .    }.  }.  zLi
7f90: 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28 20 7a 4c  ne = realloc( zL
7fa0: 69 6e 65 2c 20 6e 2b 31 20 29 3b 0a 20 20 72 65  ine, n+1 );.  re
7fb0: 74 75 72 6e 20 7a 4c 69 6e 65 3b 0a 7d 0a 0a 0a  turn zLine;.}...
7fc0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
7fd0: 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20 74  ion is part of t
7fe0: 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
7ff0: 6e 20 6f 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64  n of the command
8000: 3a 0a 2a 2a 0a 2a 2a 20 20 20 24 64 62 20 74 72  :.**.**   $db tr
8010: 61 6e 73 61 63 74 69 6f 6e 20 5b 2d 64 65 66 65  ansaction [-defe
8020: 72 72 65 64 7c 2d 69 6d 6d 65 64 69 61 74 65 7c  rred|-immediate|
8030: 2d 65 78 63 6c 75 73 69 76 65 5d 20 53 43 52 49  -exclusive] SCRI
8040: 50 54 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69  PT.**.** It is i
8050: 6e 76 6f 6b 65 64 20 61 66 74 65 72 20 65 76 61  nvoked after eva
8060: 6c 75 61 74 69 6e 67 20 74 68 65 20 73 63 72 69  luating the scri
8070: 70 74 20 53 43 52 49 50 54 20 74 6f 20 63 6f 6d  pt SCRIPT to com
8080: 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 0a  mit or rollback.
8090: 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ** the transacti
80a0: 6f 6e 20 6f 72 20 73 61 76 65 70 6f 69 6e 74 20  on or savepoint 
80b0: 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 5b 74  opened by the [t
80c0: 72 61 6e 73 61 63 74 69 6f 6e 5d 20 63 6f 6d 6d  ransaction] comm
80d0: 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  and..*/.static i
80e0: 6e 74 20 44 62 54 72 61 6e 73 50 6f 73 74 43 6d  nt DbTransPostCm
80f0: 64 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  d(.  ClientData 
8100: 64 61 74 61 5b 5d 2c 20 20 20 20 20 20 20 20 20  data[],         
8110: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 61 74            /* dat
8120: 61 5b 30 5d 20 69 73 20 74 68 65 20 53 71 6c 69  a[0] is the Sqli
8130: 74 65 33 44 62 2a 20 66 6f 72 20 24 64 62 20 2a  te3Db* for $db *
8140: 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
8150: 69 6e 74 65 72 70 2c 20 20 20 20 20 20 20 20 20  interp,         
8160: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 63 6c 20           /* Tcl 
8170: 69 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 20  interpreter */. 
8180: 20 69 6e 74 20 72 65 73 75 6c 74 20 20 20 20 20   int result     
8190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81a0: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
81b0: 6f 66 20 65 76 61 6c 75 61 74 69 6e 67 20 53 43  of evaluating SC
81c0: 52 49 50 54 20 2a 2f 0a 29 7b 0a 20 20 73 74 61  RIPT */.){.  sta
81d0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
81e0: 63 6f 6e 73 74 20 61 7a 45 6e 64 5b 5d 20 3d 20  const azEnd[] = 
81f0: 7b 0a 20 20 20 20 22 52 45 4c 45 41 53 45 20 5f  {.    "RELEASE _
8200: 74 63 6c 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22  tcl_transaction"
8210: 2c 20 20 20 20 20 20 20 20 2f 2a 20 72 63 3d 3d  ,        /* rc==
8220: 54 43 4c 5f 45 52 52 4f 52 2c 20 6e 54 72 61 6e  TCL_ERROR, nTran
8230: 73 61 63 74 69 6f 6e 21 3d 30 20 2a 2f 0a 20 20  saction!=0 */.  
8240: 20 20 22 43 4f 4d 4d 49 54 22 2c 20 20 20 20 20    "COMMIT",     
8250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8260: 20 20 20 20 20 2f 2a 20 72 63 21 3d 54 43 4c 5f       /* rc!=TCL_
8270: 45 52 52 4f 52 2c 20 6e 54 72 61 6e 73 61 63 74  ERROR, nTransact
8280: 69 6f 6e 3d 3d 30 20 2a 2f 0a 20 20 20 20 22 52  ion==0 */.    "R
8290: 4f 4c 4c 42 41 43 4b 20 54 4f 20 5f 74 63 6c 5f  OLLBACK TO _tcl_
82a0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 3b 20 52 45  transaction ; RE
82b0: 4c 45 41 53 45 20 5f 74 63 6c 5f 74 72 61 6e 73  LEASE _tcl_trans
82c0: 61 63 74 69 6f 6e 22 2c 0a 20 20 20 20 22 52 4f  action",.    "RO
82d0: 4c 4c 42 41 43 4b 22 20 20 20 20 20 20 20 20 20  LLBACK"         
82e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82f0: 2f 2a 20 72 63 3d 3d 54 43 4c 5f 45 52 52 4f 52  /* rc==TCL_ERROR
8300: 2c 20 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  , nTransaction==
8310: 30 20 2a 2f 0a 20 20 7d 3b 0a 20 20 53 71 6c 69  0 */.  };.  Sqli
8320: 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c  teDb *pDb = (Sql
8330: 69 74 65 44 62 2a 29 64 61 74 61 5b 30 5d 3b 0a  iteDb*)data[0];.
8340: 20 20 69 6e 74 20 72 63 20 3d 20 72 65 73 75 6c    int rc = resul
8350: 74 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  t;.  const char 
8360: 2a 7a 45 6e 64 3b 0a 0a 20 20 70 44 62 2d 3e 6e  *zEnd;..  pDb->n
8370: 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20  Transaction--;. 
8380: 20 7a 45 6e 64 20 3d 20 61 7a 45 6e 64 5b 28 72   zEnd = azEnd[(r
8390: 63 3d 3d 54 43 4c 5f 45 52 52 4f 52 29 2a 32 20  c==TCL_ERROR)*2 
83a0: 2b 20 28 70 44 62 2d 3e 6e 54 72 61 6e 73 61 63  + (pDb->nTransac
83b0: 74 69 6f 6e 3d 3d 30 29 5d 3b 0a 0a 20 20 70 44  tion==0)];..  pD
83c0: 62 2d 3e 64 69 73 61 62 6c 65 41 75 74 68 2b 2b  b->disableAuth++
83d0: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  ;.  if( sqlite3_
83e0: 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 7a 45  exec(pDb->db, zE
83f0: 6e 64 2c 20 30 2c 20 30 2c 20 30 29 20 29 7b 0a  nd, 0, 0, 0) ){.
8400: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73        /* This is
8410: 20 61 20 74 72 69 63 6b 79 20 73 63 65 6e 61 72   a tricky scenar
8420: 69 6f 20 74 6f 20 68 61 6e 64 6c 65 2e 20 54 68  io to handle. Th
8430: 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 63 61  e most likely ca
8440: 75 73 65 20 6f 66 20 61 6e 0a 20 20 20 20 20 20  use of an.      
8450: 2a 2a 20 65 72 72 6f 72 20 69 73 20 74 68 61 74  ** error is that
8460: 20 74 68 65 20 65 78 65 63 28 29 20 61 62 6f 76   the exec() abov
8470: 65 20 77 61 73 20 61 6e 20 61 74 74 65 6d 70 74  e was an attempt
8480: 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 0a   to commit the .
8490: 20 20 20 20 20 20 2a 2a 20 74 6f 70 2d 6c 65 76        ** top-lev
84a0: 65 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  el transaction t
84b0: 68 61 74 20 72 65 74 75 72 6e 65 64 20 53 51 4c  hat returned SQL
84c0: 49 54 45 5f 42 55 53 59 2e 20 4f 72 2c 20 6c 65  ITE_BUSY. Or, le
84d0: 73 73 20 6c 69 6b 65 6c 79 2c 0a 20 20 20 20 20  ss likely,.     
84e0: 20 2a 2a 20 74 68 61 74 20 61 6e 20 49 4f 2d 65   ** that an IO-e
84f0: 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65  rror has occurre
8500: 64 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73  d. In either cas
8510: 65 2c 20 74 68 72 6f 77 20 61 20 54 63 6c 20 65  e, throw a Tcl e
8520: 78 63 65 70 74 69 6f 6e 0a 20 20 20 20 20 20 2a  xception.      *
8530: 2a 20 61 6e 64 20 74 72 79 20 74 6f 20 72 6f 6c  * and try to rol
8540: 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
8550: 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a  ction..      **.
8560: 20 20 20 20 20 20 2a 2a 20 42 75 74 20 69 74 20        ** But it 
8570: 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20 74 68  could also be th
8580: 61 74 20 74 68 65 20 75 73 65 72 20 65 78 65 63  at the user exec
8590: 75 74 65 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  uted one or more
85a0: 20 42 45 47 49 4e 2c 20 0a 20 20 20 20 20 20 2a   BEGIN, .      *
85b0: 2a 20 43 4f 4d 4d 49 54 2c 20 53 41 56 45 50 4f  * COMMIT, SAVEPO
85c0: 49 4e 54 2c 20 52 45 4c 45 41 53 45 20 6f 72 20  INT, RELEASE or 
85d0: 52 4f 4c 4c 42 41 43 4b 20 63 6f 6d 6d 61 6e 64  ROLLBACK command
85e0: 73 20 74 68 61 74 20 61 72 65 20 63 6f 6e 66 75  s that are confu
85f0: 73 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68  sing.      ** th
8600: 69 73 20 6d 65 74 68 6f 64 27 73 20 6c 6f 67 69  is method's logi
8610: 63 2e 20 4e 6f 74 20 63 6c 65 61 72 20 68 6f 77  c. Not clear how
8620: 20 74 68 69 73 20 77 6f 75 6c 64 20 62 65 20 62   this would be b
8630: 65 73 74 20 68 61 6e 64 6c 65 64 2e 0a 20 20 20  est handled..   
8640: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
8650: 21 3d 54 43 4c 5f 45 52 52 4f 52 20 29 7b 0a 20  !=TCL_ERROR ){. 
8660: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
8670: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71  esult(interp, sq
8680: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62  lite3_errmsg(pDb
8690: 2d 3e 64 62 29 2c 20 28 63 68 61 72 2a 29 30 29  ->db), (char*)0)
86a0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c  ;.      rc = TCL
86b0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
86c0: 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70    sqlite3_exec(p
86d0: 44 62 2d 3e 64 62 2c 20 22 52 4f 4c 4c 42 41 43  Db->db, "ROLLBAC
86e0: 4b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  K", 0, 0, 0);.  
86f0: 7d 0a 20 20 70 44 62 2d 3e 64 69 73 61 62 6c 65  }.  pDb->disable
8700: 41 75 74 68 2d 2d 3b 0a 0a 20 20 72 65 74 75 72  Auth--;..  retur
8710: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  n rc;.}../*.** U
8720: 6e 6c 65 73 73 20 53 51 4c 49 54 45 5f 54 45 53  nless SQLITE_TES
8730: 54 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68  T is defined, th
8740: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
8750: 20 73 69 6d 70 6c 65 20 77 72 61 70 70 65 72 20   simple wrapper 
8760: 61 72 6f 75 6e 64 0a 2a 2a 20 73 71 6c 69 74 65  around.** sqlite
8770: 33 5f 70 72 65 70 61 72 65 5f 76 32 28 29 2e 20  3_prepare_v2(). 
8780: 49 66 20 53 51 4c 49 54 45 5f 54 45 53 54 20 69  If SQLITE_TEST i
8790: 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20  s defined, then 
87a0: 69 74 20 75 73 65 73 20 65 69 74 68 65 72 0a 2a  it uses either.*
87b0: 2a 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  * sqlite3_prepar
87c0: 65 5f 76 32 28 29 20 6f 72 20 6c 65 67 61 63 79  e_v2() or legacy
87d0: 20 69 6e 74 65 72 66 61 63 65 20 73 71 6c 69 74   interface sqlit
87e0: 65 33 5f 70 72 65 70 61 72 65 28 29 2c 20 64 65  e3_prepare(), de
87f0: 70 65 6e 64 69 6e 67 0a 2a 2a 20 6f 6e 20 77 68  pending.** on wh
8800: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
8810: 20 5b 64 62 5f 75 73 65 5f 6c 65 67 61 63 79 5f   [db_use_legacy_
8820: 70 72 65 70 61 72 65 5d 20 63 6f 6d 6d 61 6e 64  prepare] command
8830: 20 68 61 73 20 62 65 65 6e 20 75 73 65 64 20 74   has been used t
8840: 6f 20 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 65 20  o .** configure 
8850: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  the connection..
8860: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 62  */.static int db
8870: 50 72 65 70 61 72 65 28 0a 20 20 53 71 6c 69 74  Prepare(.  Sqlit
8880: 65 44 62 20 2a 70 44 62 2c 20 20 20 20 20 20 20  eDb *pDb,       
8890: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
88a0: 74 61 62 61 73 65 20 6f 62 6a 65 63 74 20 2a 2f  tabase object */
88b0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
88c0: 53 71 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Sql,            
88d0: 20 20 20 2f 2a 20 53 51 4c 20 74 6f 20 63 6f 6d     /* SQL to com
88e0: 70 69 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  pile */.  sqlite
88f0: 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c  3_stmt **ppStmt,
8900: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
8910: 3a 20 50 72 65 70 61 72 65 64 20 73 74 61 74 65  : Prepared state
8920: 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ment */.  const 
8930: 63 68 61 72 20 2a 2a 70 7a 4f 75 74 20 20 20 20  char **pzOut    
8940: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
8950: 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 78  : Pointer to nex
8960: 74 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  t SQL statement 
8970: 2a 2f 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  */.){.#ifdef SQL
8980: 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 70  ITE_TEST.  if( p
8990: 44 62 2d 3e 62 4c 65 67 61 63 79 50 72 65 70 61  Db->bLegacyPrepa
89a0: 72 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  re ){.    return
89b0: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
89c0: 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  (pDb->db, zSql, 
89d0: 2d 31 2c 20 70 70 53 74 6d 74 2c 20 70 7a 4f 75  -1, ppStmt, pzOu
89e0: 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  t);.  }.#endif. 
89f0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
8a00: 70 72 65 70 61 72 65 5f 76 32 28 70 44 62 2d 3e  prepare_v2(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 7d 0a  Stmt, pzOut);.}.
8a30: 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74 68  ./*.** Search th
8a40: 65 20 63 61 63 68 65 20 66 6f 72 20 61 20 70 72  e cache for a pr
8a50: 65 70 61 72 65 64 2d 73 74 61 74 65 6d 65 6e 74  epared-statement
8a60: 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 6d 70   object that imp
8a70: 6c 65 6d 65 6e 74 73 20 74 68 65 0a 2a 2a 20 66  lements the.** f
8a80: 69 72 73 74 20 53 51 4c 20 73 74 61 74 65 6d 65  irst SQL stateme
8a90: 6e 74 20 69 6e 20 74 68 65 20 62 75 66 66 65 72  nt in the buffer
8aa0: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70   pointed to by p
8ab0: 61 72 61 6d 65 74 65 72 20 7a 49 6e 2e 20 49 66  arameter zIn. If
8ac0: 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 70 72 65 70  .** no such prep
8ad0: 61 72 65 64 2d 73 74 61 74 65 6d 65 6e 74 20 63  ared-statement c
8ae0: 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 61 6c 6c  an be found, all
8af0: 6f 63 61 74 65 20 61 6e 64 20 70 72 65 70 61 72  ocate and prepar
8b00: 65 20 61 20 6e 65 77 0a 2a 2a 20 6f 6e 65 2e 20  e a new.** one. 
8b10: 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 20  In either case, 
8b20: 62 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74  bind the current
8b30: 20 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20 72   values of the r
8b40: 65 6c 65 76 61 6e 74 20 54 63 6c 0a 2a 2a 20 76  elevant Tcl.** v
8b50: 61 72 69 61 62 6c 65 73 20 74 6f 20 61 6e 79 20  ariables to any 
8b60: 24 76 61 72 2c 20 3a 76 61 72 20 6f 72 20 40 76  $var, :var or @v
8b70: 61 72 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20  ar variables in 
8b80: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 42  the statement. B
8b90: 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75 72 6e 69  efore.** returni
8ba0: 6e 67 2c 20 73 65 74 20 2a 70 70 50 72 65 53 74  ng, set *ppPreSt
8bb0: 6d 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  mt to point to t
8bc0: 68 65 20 70 72 65 70 61 72 65 64 2d 73 74 61 74  he prepared-stat
8bd0: 65 6d 65 6e 74 20 6f 62 6a 65 63 74 2e 0a 2a 2a  ement object..**
8be0: 0a 2a 2a 20 4f 75 74 70 75 74 20 70 61 72 61 6d  .** Output param
8bf0: 65 74 65 72 20 2a 70 7a 4f 75 74 20 69 73 20 73  eter *pzOut is s
8c00: 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  et to point to t
8c10: 68 65 20 6e 65 78 74 20 53 51 4c 20 73 74 61 74  he next SQL stat
8c20: 65 6d 65 6e 74 20 69 6e 0a 2a 2a 20 62 75 66 66  ement in.** buff
8c30: 65 72 20 7a 49 6e 2c 20 6f 72 20 74 6f 20 74 68  er zIn, or to th
8c40: 65 20 27 5c 30 27 20 62 79 74 65 20 61 74 20 74  e '\0' byte at t
8c50: 68 65 20 65 6e 64 20 6f 66 20 7a 49 6e 20 69 66  he end of zIn if
8c60: 20 74 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20   there is no.** 
8c70: 6e 65 78 74 20 73 74 61 74 65 6d 65 6e 74 2e 0a  next statement..
8c80: 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
8c90: 66 75 6c 2c 20 54 43 4c 5f 4f 4b 20 69 73 20 72  ful, TCL_OK is r
8ca0: 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
8cb0: 73 65 2c 20 54 43 4c 5f 45 52 52 4f 52 20 69 73  se, TCL_ERROR is
8cc0: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64   returned.** and
8cd0: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
8ce0: 65 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 69 6e  e loaded into in
8cf0: 74 65 72 70 72 65 74 65 72 20 70 44 62 2d 3e 69  terpreter pDb->i
8d00: 6e 74 65 72 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  nterp..*/.static
8d10: 20 69 6e 74 20 64 62 50 72 65 70 61 72 65 41 6e   int dbPrepareAn
8d20: 64 42 69 6e 64 28 0a 20 20 53 71 6c 69 74 65 44  dBind(.  SqliteD
8d30: 62 20 2a 70 44 62 2c 20 20 20 20 20 20 20 20 20  b *pDb,         
8d40: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
8d50: 62 61 73 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  base object */. 
8d60: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 49 6e   char const *zIn
8d70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
8d80: 20 2f 2a 20 53 51 4c 20 74 6f 20 63 6f 6d 70 69   /* SQL to compi
8d90: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e  le */.  char con
8da0: 73 74 20 2a 2a 70 7a 4f 75 74 2c 20 20 20 20 20  st **pzOut,     
8db0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
8dc0: 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 78 74 20  Pointer to next 
8dd0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  SQL statement */
8de0: 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74  .  SqlPreparedSt
8df0: 6d 74 20 2a 2a 70 70 50 72 65 53 74 6d 74 20 20  mt **ppPreStmt  
8e00: 20 20 20 2f 2a 20 4f 55 54 3a 20 4f 62 6a 65 63     /* OUT: Objec
8e10: 74 20 75 73 65 64 20 74 6f 20 63 61 63 68 65 20  t used to cache 
8e20: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a  statement */.){.
8e30: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
8e40: 71 6c 20 3d 20 7a 49 6e 3b 20 20 20 20 20 20 20  ql = zIn;       
8e50: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
8e60: 66 69 72 73 74 20 53 51 4c 20 73 74 61 74 65 6d  first SQL statem
8e70: 65 6e 74 20 69 6e 20 7a 49 6e 20 2a 2f 0a 20 20  ent in zIn */.  
8e80: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
8e90: 74 6d 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  tmt = 0;        
8ea0: 2f 2a 20 50 72 65 70 61 72 65 64 20 73 74 61 74  /* Prepared stat
8eb0: 65 6d 65 6e 74 20 6f 62 6a 65 63 74 20 2a 2f 0a  ement object */.
8ec0: 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d    SqlPreparedStm
8ed0: 74 20 2a 70 50 72 65 53 74 6d 74 3b 20 20 20 20  t *pPreStmt;    
8ee0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
8ef0: 63 61 63 68 65 64 20 73 74 61 74 65 6d 65 6e 74  cached statement
8f00: 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 71 6c 3b 20   */.  int nSql; 
8f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f20: 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
8f30: 6f 66 20 7a 53 71 6c 20 69 6e 20 62 79 74 65 73  of zSql in bytes
8f40: 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72 20 3d   */.  int nVar =
8f50: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
8f60: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
8f70: 6f 66 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20  of variables in 
8f80: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  statement */.  i
8f90: 6e 74 20 69 50 61 72 6d 20 3d 20 30 3b 20 20 20  nt iParm = 0;   
8fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8fb0: 2a 20 4e 65 78 74 20 66 72 65 65 20 65 6e 74 72  * Next free entr
8fc0: 79 20 69 6e 20 61 70 50 61 72 6d 20 2a 2f 0a 20  y in apParm */. 
8fd0: 20 63 68 61 72 20 63 3b 0a 20 20 69 6e 74 20 69   char c;.  int i
8fe0: 3b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ;.  Tcl_Interp *
8ff0: 69 6e 74 65 72 70 20 3d 20 70 44 62 2d 3e 69 6e  interp = pDb->in
9000: 74 65 72 70 3b 0a 0a 20 20 2a 70 70 50 72 65 53  terp;..  *ppPreS
9010: 74 6d 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54  tmt = 0;..  /* T
9020: 72 69 6d 20 73 70 61 63 65 73 20 66 72 6f 6d 20  rim spaces from 
9030: 74 68 65 20 73 74 61 72 74 20 6f 66 20 7a 53 71  the start of zSq
9040: 6c 20 61 6e 64 20 63 61 6c 63 75 6c 61 74 65 20  l and calculate 
9050: 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 20 6c 65  the remaining le
9060: 6e 67 74 68 2e 20 2a 2f 0a 20 20 77 68 69 6c 65  ngth. */.  while
9070: 28 20 28 63 20 3d 20 7a 53 71 6c 5b 30 5d 29 3d  ( (c = zSql[0])=
9080: 3d 27 20 27 20 7c 7c 20 63 3d 3d 27 5c 74 27 20  =' ' || c=='\t' 
9090: 7c 7c 20 63 3d 3d 27 5c 72 27 20 7c 7c 20 63 3d  || c=='\r' || c=
90a0: 3d 27 5c 6e 27 20 29 7b 20 7a 53 71 6c 2b 2b 3b  ='\n' ){ zSql++;
90b0: 20 7d 0a 20 20 6e 53 71 6c 20 3d 20 73 74 72 6c   }.  nSql = strl
90c0: 65 6e 33 30 28 7a 53 71 6c 29 3b 0a 0a 20 20 66  en30(zSql);..  f
90d0: 6f 72 28 70 50 72 65 53 74 6d 74 20 3d 20 70 44  or(pPreStmt = pD
90e0: 62 2d 3e 73 74 6d 74 4c 69 73 74 3b 20 70 50 72  b->stmtList; pPr
90f0: 65 53 74 6d 74 3b 20 70 50 72 65 53 74 6d 74 3d  eStmt; pPreStmt=
9100: 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 29  pPreStmt->pNext)
9110: 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 50  {.    int n = pP
9120: 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 3b 0a 20 20  reStmt->nSql;.  
9130: 20 20 69 66 28 20 6e 53 71 6c 3e 3d 6e 20 0a 20    if( nSql>=n . 
9140: 20 20 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70         && memcmp
9150: 28 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 2c  (pPreStmt->zSql,
9160: 20 7a 53 71 6c 2c 20 6e 29 3d 3d 30 0a 20 20 20   zSql, n)==0.   
9170: 20 20 20 20 20 26 26 20 28 7a 53 71 6c 5b 6e 5d       && (zSql[n]
9180: 3d 3d 30 20 7c 7c 20 7a 53 71 6c 5b 6e 2d 31 5d  ==0 || zSql[n-1]
9190: 3d 3d 27 3b 27 29 0a 20 20 20 20 29 7b 0a 20 20  ==';').    ){.  
91a0: 20 20 20 20 70 53 74 6d 74 20 3d 20 70 50 72 65      pStmt = pPre
91b0: 53 74 6d 74 2d 3e 70 53 74 6d 74 3b 0a 20 20 20  Stmt->pStmt;.   
91c0: 20 20 20 2a 70 7a 4f 75 74 20 3d 20 26 7a 53 71     *pzOut = &zSq
91d0: 6c 5b 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c  l[pPreStmt->nSql
91e0: 5d 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65  ];..      /* Whe
91f0: 6e 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61  n a prepared sta
9200: 74 65 6d 65 6e 74 20 69 73 20 66 6f 75 6e 64 2c  tement is found,
9210: 20 75 6e 6c 69 6e 6b 20 69 74 20 66 72 6f 6d 20   unlink it from 
9220: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 63  the.      ** cac
9230: 68 65 20 6c 69 73 74 2e 20 20 49 74 20 77 69 6c  he list.  It wil
9240: 6c 20 6c 61 74 65 72 20 62 65 20 61 64 64 65 64  l later be added
9250: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 62 65 67   back to the beg
9260: 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  inning.      ** 
9270: 6f 66 20 74 68 65 20 63 61 63 68 65 20 6c 69 73  of the cache lis
9280: 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6d  t in order to im
9290: 70 6c 65 6d 65 6e 74 20 4c 52 55 20 72 65 70 6c  plement LRU repl
92a0: 61 63 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a  acement..      *
92b0: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65  /.      if( pPre
92c0: 53 74 6d 74 2d 3e 70 50 72 65 76 20 29 7b 0a 20  Stmt->pPrev ){. 
92d0: 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d         pPreStmt-
92e0: 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
92f0: 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 3b  pPreStmt->pNext;
9300: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
9310: 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c        pDb->stmtL
9320: 69 73 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e  ist = pPreStmt->
9330: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
9340: 20 20 20 20 20 69 66 28 20 70 50 72 65 53 74 6d       if( pPreStm
9350: 74 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  t->pNext ){.    
9360: 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e      pPreStmt->pN
9370: 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 50 72  ext->pPrev = pPr
9380: 65 53 74 6d 74 2d 3e 70 50 72 65 76 3b 0a 20 20  eStmt->pPrev;.  
9390: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
93a0: 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74     pDb->stmtLast
93b0: 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72   = pPreStmt->pPr
93c0: 65 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ev;.      }.    
93d0: 20 20 70 44 62 2d 3e 6e 53 74 6d 74 2d 2d 3b 0a    pDb->nStmt--;.
93e0: 20 20 20 20 20 20 6e 56 61 72 20 3d 20 73 71 6c        nVar = sql
93f0: 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65  ite3_bind_parame
9400: 74 65 72 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29  ter_count(pStmt)
9410: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
9420: 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a     }.  }.  .  /*
9430: 20 49 66 20 6e 6f 20 70 72 65 70 61 72 65 64 20   If no prepared 
9440: 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 66 6f  statement was fo
9450: 75 6e 64 2e 20 43 6f 6d 70 69 6c 65 20 74 68 65  und. Compile the
9460: 20 53 51 4c 20 74 65 78 74 2e 20 41 6c 73 6f 20   SQL text. Also 
9470: 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 61 20  allocate.  ** a 
9480: 6e 65 77 20 53 71 6c 50 72 65 70 61 72 65 64 53  new SqlPreparedS
9490: 74 6d 74 20 73 74 72 75 63 74 75 72 65 2e 20 20  tmt structure.  
94a0: 2a 2f 0a 20 20 69 66 28 20 70 50 72 65 53 74 6d  */.  if( pPreStm
94b0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  t==0 ){.    int 
94c0: 6e 42 79 74 65 3b 0a 0a 20 20 20 20 69 66 28 20  nByte;..    if( 
94d0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 64 62 50 72 65  SQLITE_OK!=dbPre
94e0: 70 61 72 65 28 70 44 62 2c 20 7a 53 71 6c 2c 20  pare(pDb, zSql, 
94f0: 26 70 53 74 6d 74 2c 20 70 7a 4f 75 74 29 20 29  &pStmt, pzOut) )
9500: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f  {.      Tcl_SetO
9510: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
9520: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
9530: 6a 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  j(sqlite3_errmsg
9540: 28 70 44 62 2d 3e 64 62 29 2c 20 2d 31 29 29 3b  (pDb->db), -1));
9550: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
9560: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
9570: 20 20 20 69 66 28 20 70 53 74 6d 74 3d 3d 30 20     if( pStmt==0 
9580: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  ){.      if( SQL
9590: 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f  ITE_OK!=sqlite3_
95a0: 65 72 72 63 6f 64 65 28 70 44 62 2d 3e 64 62 29  errcode(pDb->db)
95b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   ){.        /* A
95c0: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 65 72   compile-time er
95d0: 72 6f 72 20 69 6e 20 74 68 65 20 73 74 61 74 65  ror in the state
95e0: 6d 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ment. */.       
95f0: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
9600: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
9610: 77 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74  wStringObj(sqlit
9620: 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64  e3_errmsg(pDb->d
9630: 62 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 20 20  b), -1));.      
9640: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
9650: 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  OR;.      }else{
9660: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
9670: 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 61 20  statement was a 
9680: 6e 6f 2d 6f 70 2e 20 20 43 6f 6e 74 69 6e 75 65  no-op.  Continue
9690: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 74 61   to the next sta
96a0: 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 20 20 2a  tement.        *
96b0: 2a 20 69 6e 20 74 68 65 20 53 51 4c 20 73 74 72  * in the SQL str
96c0: 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ing..        */.
96d0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
96e0: 43 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  CL_OK;.      }. 
96f0: 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74     }..    assert
9700: 28 20 70 50 72 65 53 74 6d 74 3d 3d 30 20 29 3b  ( pPreStmt==0 );
9710: 0a 20 20 20 20 6e 56 61 72 20 3d 20 73 71 6c 69  .    nVar = sqli
9720: 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  te3_bind_paramet
9730: 65 72 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b  er_count(pStmt);
9740: 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 73 69 7a  .    nByte = siz
9750: 65 6f 66 28 53 71 6c 50 72 65 70 61 72 65 64 53  eof(SqlPreparedS
9760: 74 6d 74 29 20 2b 20 6e 56 61 72 2a 73 69 7a 65  tmt) + nVar*size
9770: 6f 66 28 54 63 6c 5f 4f 62 6a 20 2a 29 3b 0a 20  of(Tcl_Obj *);. 
9780: 20 20 20 70 50 72 65 53 74 6d 74 20 3d 20 28 53     pPreStmt = (S
9790: 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 2a 29  qlPreparedStmt*)
97a0: 54 63 6c 5f 41 6c 6c 6f 63 28 6e 42 79 74 65 29  Tcl_Alloc(nByte)
97b0: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 72  ;.    memset(pPr
97c0: 65 53 74 6d 74 2c 20 30 2c 20 6e 42 79 74 65 29  eStmt, 0, nByte)
97d0: 3b 0a 0a 20 20 20 20 70 50 72 65 53 74 6d 74 2d  ;..    pPreStmt-
97e0: 3e 70 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a  >pStmt = pStmt;.
97f0: 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53      pPreStmt->nS
9800: 71 6c 20 3d 20 28 69 6e 74 29 28 2a 70 7a 4f 75  ql = (int)(*pzOu
9810: 74 20 2d 20 7a 53 71 6c 29 3b 0a 20 20 20 20 70  t - zSql);.    p
9820: 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 20 3d 20  PreStmt->zSql = 
9830: 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 74 6d  sqlite3_sql(pStm
9840: 74 29 3b 0a 20 20 20 20 70 50 72 65 53 74 6d 74  t);.    pPreStmt
9850: 2d 3e 61 70 50 61 72 6d 20 3d 20 28 54 63 6c 5f  ->apParm = (Tcl_
9860: 4f 62 6a 20 2a 2a 29 26 70 50 72 65 53 74 6d 74  Obj **)&pPreStmt
9870: 5b 31 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  [1];.#ifdef SQLI
9880: 54 45 5f 54 45 53 54 0a 20 20 20 20 69 66 28 20  TE_TEST.    if( 
9890: 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 3d 3d  pPreStmt->zSql==
98a0: 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  0 ){.      char 
98b0: 2a 7a 43 6f 70 79 20 3d 20 54 63 6c 5f 41 6c 6c  *zCopy = Tcl_All
98c0: 6f 63 28 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71  oc(pPreStmt->nSq
98d0: 6c 20 2b 20 31 29 3b 0a 20 20 20 20 20 20 6d 65  l + 1);.      me
98e0: 6d 63 70 79 28 7a 43 6f 70 79 2c 20 7a 53 71 6c  mcpy(zCopy, zSql
98f0: 2c 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c  , pPreStmt->nSql
9900: 29 3b 0a 20 20 20 20 20 20 7a 43 6f 70 79 5b 70  );.      zCopy[p
9910: 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 5d 20 3d  PreStmt->nSql] =
9920: 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 70 50 72   '\0';.      pPr
9930: 65 53 74 6d 74 2d 3e 7a 53 71 6c 20 3d 20 7a 43  eStmt->zSql = zC
9940: 6f 70 79 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  opy;.    }.#endi
9950: 66 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  f.  }.  assert( 
9960: 70 50 72 65 53 74 6d 74 20 29 3b 0a 20 20 61 73  pPreStmt );.  as
9970: 73 65 72 74 28 20 73 74 72 6c 65 6e 33 30 28 70  sert( strlen30(p
9980: 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 29 3d 3d  PreStmt->zSql)==
9990: 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 20 29  pPreStmt->nSql )
99a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 6d  ;.  assert( 0==m
99b0: 65 6d 63 6d 70 28 70 50 72 65 53 74 6d 74 2d 3e  emcmp(pPreStmt->
99c0: 7a 53 71 6c 2c 20 7a 53 71 6c 2c 20 70 50 72 65  zSql, zSql, pPre
99d0: 53 74 6d 74 2d 3e 6e 53 71 6c 29 20 29 3b 0a 0a  Stmt->nSql) );..
99e0: 20 20 2f 2a 20 42 69 6e 64 20 76 61 6c 75 65 73    /* Bind values
99f0: 20 74 6f 20 70 61 72 61 6d 65 74 65 72 73 20 74   to parameters t
9a00: 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 24  hat begin with $
9a10: 20 6f 72 20 3a 20 2a 2f 20 20 0a 20 20 66 6f 72   or : */  .  for
9a20: 28 69 3d 31 3b 20 69 3c 3d 6e 56 61 72 3b 20 69  (i=1; i<=nVar; i
9a30: 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ++){.    const c
9a40: 68 61 72 20 2a 7a 56 61 72 20 3d 20 73 71 6c 69  har *zVar = sqli
9a50: 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  te3_bind_paramet
9a60: 65 72 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 20 69  er_name(pStmt, i
9a70: 29 3b 0a 20 20 20 20 69 66 28 20 7a 56 61 72 21  );.    if( zVar!
9a80: 3d 30 20 26 26 20 28 7a 56 61 72 5b 30 5d 3d 3d  =0 && (zVar[0]==
9a90: 27 24 27 20 7c 7c 20 7a 56 61 72 5b 30 5d 3d 3d  '$' || zVar[0]==
9aa0: 27 3a 27 20 7c 7c 20 7a 56 61 72 5b 30 5d 3d 3d  ':' || zVar[0]==
9ab0: 27 40 27 29 20 29 7b 0a 20 20 20 20 20 20 54 63  '@') ){.      Tc
9ac0: 6c 5f 4f 62 6a 20 2a 70 56 61 72 20 3d 20 54 63  l_Obj *pVar = Tc
9ad0: 6c 5f 47 65 74 56 61 72 32 45 78 28 69 6e 74 65  l_GetVar2Ex(inte
9ae0: 72 70 2c 20 26 7a 56 61 72 5b 31 5d 2c 20 30 2c  rp, &zVar[1], 0,
9af0: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
9b00: 56 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Var ){.        i
9b10: 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20 20 75 38  nt n;.        u8
9b20: 20 2a 64 61 74 61 3b 0a 20 20 20 20 20 20 20 20   *data;.        
9b30: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
9b40: 65 20 3d 20 28 70 56 61 72 2d 3e 74 79 70 65 50  e = (pVar->typeP
9b50: 74 72 20 3f 20 70 56 61 72 2d 3e 74 79 70 65 50  tr ? pVar->typeP
9b60: 74 72 2d 3e 6e 61 6d 65 20 3a 20 22 22 29 3b 0a  tr->name : "");.
9b70: 20 20 20 20 20 20 20 20 63 20 3d 20 7a 54 79 70          c = zTyp
9b80: 65 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  e[0];.        if
9b90: 28 20 7a 56 61 72 5b 30 5d 3d 3d 27 40 27 20 7c  ( zVar[0]=='@' |
9ba0: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 28 63 3d  |.           (c=
9bb0: 3d 27 62 27 20 26 26 20 73 74 72 63 6d 70 28 7a  ='b' && strcmp(z
9bc0: 54 79 70 65 2c 22 62 79 74 65 61 72 72 61 79 22  Type,"bytearray"
9bd0: 29 3d 3d 30 20 26 26 20 70 56 61 72 2d 3e 62 79  )==0 && pVar->by
9be0: 74 65 73 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20  tes==0) ){.     
9bf0: 20 20 20 20 20 2f 2a 20 4c 6f 61 64 20 61 20 42       /* Load a B
9c00: 4c 4f 42 20 74 79 70 65 20 69 66 20 74 68 65 20  LOB type if the 
9c10: 54 63 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20  Tcl variable is 
9c20: 61 20 62 79 74 65 61 72 72 61 79 20 61 6e 64 0a  a bytearray and.
9c30: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20            ** it 
9c40: 68 61 73 20 6e 6f 20 73 74 72 69 6e 67 20 72 65  has no string re
9c50: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 72 20  presentation or 
9c60: 74 68 65 20 68 6f 73 74 0a 20 20 20 20 20 20 20  the host.       
9c70: 20 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 20     ** parameter 
9c80: 6e 61 6d 65 20 62 65 67 69 6e 73 20 77 69 74 68  name begins with
9c90: 20 22 40 22 2e 20 2a 2f 0a 20 20 20 20 20 20 20   "@". */.       
9ca0: 20 20 20 64 61 74 61 20 3d 20 54 63 6c 5f 47 65     data = Tcl_Ge
9cb0: 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62  tByteArrayFromOb
9cc0: 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20  j(pVar, &n);.   
9cd0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
9ce0: 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20  ind_blob(pStmt, 
9cf0: 69 2c 20 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49  i, data, n, SQLI
9d00: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
9d10: 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65        Tcl_IncrRe
9d20: 66 43 6f 75 6e 74 28 70 56 61 72 29 3b 0a 20 20  fCount(pVar);.  
9d30: 20 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74          pPreStmt
9d40: 2d 3e 61 70 50 61 72 6d 5b 69 50 61 72 6d 2b 2b  ->apParm[iParm++
9d50: 5d 20 3d 20 70 56 61 72 3b 0a 20 20 20 20 20 20  ] = pVar;.      
9d60: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
9d70: 62 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79  b' && strcmp(zTy
9d80: 70 65 2c 22 62 6f 6f 6c 65 61 6e 22 29 3d 3d 30  pe,"boolean")==0
9d90: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63   ){.          Tc
9da0: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
9db0: 69 6e 74 65 72 70 2c 20 70 56 61 72 2c 20 26 6e  interp, pVar, &n
9dc0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
9dd0: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53  ite3_bind_int(pS
9de0: 74 6d 74 2c 20 69 2c 20 6e 29 3b 0a 20 20 20 20  tmt, i, n);.    
9df0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
9e00: 3d 27 64 27 20 26 26 20 73 74 72 63 6d 70 28 7a  ='d' && strcmp(z
9e10: 54 79 70 65 2c 22 64 6f 75 62 6c 65 22 29 3d 3d  Type,"double")==
9e20: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 64  0 ){.          d
9e30: 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20 20 20 20  ouble r;.       
9e40: 20 20 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65     Tcl_GetDouble
9e50: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
9e60: 70 56 61 72 2c 20 26 72 29 3b 0a 20 20 20 20 20  pVar, &r);.     
9e70: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
9e80: 64 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20  d_double(pStmt, 
9e90: 69 2c 20 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  i, r);.        }
9ea0: 65 6c 73 65 20 69 66 28 20 28 63 3d 3d 27 77 27  else if( (c=='w'
9eb0: 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65   && strcmp(zType
9ec0: 2c 22 77 69 64 65 49 6e 74 22 29 3d 3d 30 29 20  ,"wideInt")==0) 
9ed0: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ||.             
9ee0: 20 28 63 3d 3d 27 69 27 20 26 26 20 73 74 72 63   (c=='i' && strc
9ef0: 6d 70 28 7a 54 79 70 65 2c 22 69 6e 74 22 29 3d  mp(zType,"int")=
9f00: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  =0) ){.         
9f10: 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 76 3b 0a   Tcl_WideInt v;.
9f20: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65            Tcl_Ge
9f30: 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28  tWideIntFromObj(
9f40: 69 6e 74 65 72 70 2c 20 70 56 61 72 2c 20 26 76  interp, pVar, &v
9f50: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
9f60: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
9f70: 70 53 74 6d 74 2c 20 69 2c 20 76 29 3b 0a 20 20  pStmt, i, v);.  
9f80: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
9f90: 20 20 20 20 20 20 20 64 61 74 61 20 3d 20 28 75         data = (u
9fa0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 54  nsigned char *)T
9fb0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
9fc0: 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a 20  Obj(pVar, &n);. 
9fd0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
9fe0: 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74  _bind_text(pStmt
9ff0: 2c 20 69 2c 20 28 63 68 61 72 20 2a 29 64 61 74  , i, (char *)dat
a000: 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41  a, n, SQLITE_STA
a010: 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20  TIC);.          
a020: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
a030: 28 70 56 61 72 29 3b 0a 20 20 20 20 20 20 20 20  (pVar);.        
a040: 20 20 70 50 72 65 53 74 6d 74 2d 3e 61 70 50 61    pPreStmt->apPa
a050: 72 6d 5b 69 50 61 72 6d 2b 2b 5d 20 3d 20 70 56  rm[iParm++] = pV
a060: 61 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ar;.        }.  
a070: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a080: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
a090: 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 69 29 3b 0a  null(pStmt, i);.
a0a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
a0b0: 7d 0a 20 20 70 50 72 65 53 74 6d 74 2d 3e 6e 50  }.  pPreStmt->nP
a0c0: 61 72 6d 20 3d 20 69 50 61 72 6d 3b 0a 20 20 2a  arm = iParm;.  *
a0d0: 70 70 50 72 65 53 74 6d 74 20 3d 20 70 50 72 65  ppPreStmt = pPre
a0e0: 53 74 6d 74 3b 0a 0a 20 20 72 65 74 75 72 6e 20  Stmt;..  return 
a0f0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
a100: 20 52 65 6c 65 61 73 65 20 61 20 73 74 61 74 65   Release a state
a110: 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65 20 6f  ment reference o
a120: 62 74 61 69 6e 65 64 20 62 79 20 63 61 6c 6c 69  btained by calli
a130: 6e 67 20 64 62 50 72 65 70 61 72 65 41 6e 64 42  ng dbPrepareAndB
a140: 69 6e 64 28 29 2e 0a 2a 2a 20 54 68 65 72 65 20  ind()..** There 
a150: 73 68 6f 75 6c 64 20 62 65 20 65 78 61 63 74 6c  should be exactl
a160: 79 20 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 74 68  y one call to th
a170: 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  is function for 
a180: 65 61 63 68 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20  each call to.** 
a190: 64 62 50 72 65 70 61 72 65 41 6e 64 42 69 6e 64  dbPrepareAndBind
a1a0: 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ()..**.** If the
a1b0: 20 64 69 73 63 61 72 64 20 70 61 72 61 6d 65 74   discard paramet
a1c0: 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  er is non-zero, 
a1d0: 74 68 65 6e 20 74 68 65 20 73 74 61 74 65 6d 65  then the stateme
a1e0: 6e 74 20 69 73 20 64 65 6c 65 74 65 64 0a 2a 2a  nt is deleted.**
a1f0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 4f 74   immediately. Ot
a200: 68 65 72 77 69 73 65 20 69 74 20 69 73 20 61 64  herwise it is ad
a210: 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c  ded to the LRU l
a220: 69 73 74 20 61 6e 64 20 6d 61 79 20 62 65 20 72  ist and may be r
a230: 65 74 75 72 6e 65 64 0a 2a 2a 20 62 79 20 61 20  eturned.** by a 
a240: 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 20  subsequent call 
a250: 74 6f 20 64 62 50 72 65 70 61 72 65 41 6e 64 42  to dbPrepareAndB
a260: 69 6e 64 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ind()..*/.static
a270: 20 76 6f 69 64 20 64 62 52 65 6c 65 61 73 65 53   void dbReleaseS
a280: 74 6d 74 28 0a 20 20 53 71 6c 69 74 65 44 62 20  tmt(.  SqliteDb 
a290: 2a 70 44 62 2c 20 20 20 20 20 20 20 20 20 20 20  *pDb,           
a2a0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
a2b0: 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 53  se handle */.  S
a2c0: 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a  qlPreparedStmt *
a2d0: 70 50 72 65 53 74 6d 74 2c 20 20 20 20 20 20 2f  pPreStmt,      /
a2e0: 2a 20 50 72 65 70 61 72 65 64 20 73 74 61 74 65  * Prepared state
a2f0: 6d 65 6e 74 20 68 61 6e 64 6c 65 20 74 6f 20 72  ment handle to r
a300: 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  elease */.  int 
a310: 64 69 73 63 61 72 64 20 20 20 20 20 20 20 20 20  discard         
a320: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
a330: 72 75 65 20 74 6f 20 64 65 6c 65 74 65 20 28 6e  rue to delete (n
a340: 6f 74 20 63 61 63 68 65 29 20 74 68 65 20 70 50  ot cache) the pP
a350: 72 65 53 74 6d 74 20 2a 2f 0a 29 7b 0a 20 20 69  reStmt */.){.  i
a360: 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 46 72 65 65  nt i;..  /* Free
a370: 20 74 68 65 20 62 6f 75 6e 64 20 73 74 72 69 6e   the bound strin
a380: 67 20 61 6e 64 20 62 6c 6f 62 20 70 61 72 61 6d  g and blob param
a390: 65 74 65 72 73 20 2a 2f 0a 20 20 66 6f 72 28 69  eters */.  for(i
a3a0: 3d 30 3b 20 69 3c 70 50 72 65 53 74 6d 74 2d 3e  =0; i<pPreStmt->
a3b0: 6e 50 61 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  nParm; i++){.   
a3c0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
a3d0: 74 28 70 50 72 65 53 74 6d 74 2d 3e 61 70 50 61  t(pPreStmt->apPa
a3e0: 72 6d 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 70 50  rm[i]);.  }.  pP
a3f0: 72 65 53 74 6d 74 2d 3e 6e 50 61 72 6d 20 3d 20  reStmt->nParm = 
a400: 30 3b 0a 0a 20 20 69 66 28 20 70 44 62 2d 3e 6d  0;..  if( pDb->m
a410: 61 78 53 74 6d 74 3c 3d 30 20 7c 7c 20 64 69 73  axStmt<=0 || dis
a420: 63 61 72 64 20 29 7b 0a 20 20 20 20 2f 2a 20 49  card ){.    /* I
a430: 66 20 74 68 65 20 63 61 63 68 65 20 69 73 20 74  f the cache is t
a440: 75 72 6e 65 64 20 6f 66 66 2c 20 64 65 61 6c 6c  urned off, deall
a450: 6f 63 61 74 65 64 20 74 68 65 20 73 74 61 74 65  ocated the state
a460: 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 64 62 46 72  ment */.    dbFr
a470: 65 65 53 74 6d 74 28 70 50 72 65 53 74 6d 74 29  eeStmt(pPreStmt)
a480: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
a490: 2a 20 41 64 64 20 74 68 65 20 70 72 65 70 61 72  * Add the prepar
a4a0: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  ed statement to 
a4b0: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
a4c0: 20 74 68 65 20 63 61 63 68 65 20 6c 69 73 74 2e   the cache list.
a4d0: 20 2a 2f 0a 20 20 20 20 70 50 72 65 53 74 6d 74   */.    pPreStmt
a4e0: 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e 73  ->pNext = pDb->s
a4f0: 74 6d 74 4c 69 73 74 3b 0a 20 20 20 20 70 50 72  tmtList;.    pPr
a500: 65 53 74 6d 74 2d 3e 70 50 72 65 76 20 3d 20 30  eStmt->pPrev = 0
a510: 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 73  ;.    if( pDb->s
a520: 74 6d 74 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  tmtList ){.     
a530: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 2d 3e 70  pDb->stmtList->p
a540: 50 72 65 76 20 3d 20 70 50 72 65 53 74 6d 74 3b  Prev = pPreStmt;
a550: 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 62 2d 3e  .    }.    pDb->
a560: 73 74 6d 74 4c 69 73 74 20 3d 20 70 50 72 65 53  stmtList = pPreS
a570: 74 6d 74 3b 0a 20 20 20 20 69 66 28 20 70 44 62  tmt;.    if( pDb
a580: 2d 3e 73 74 6d 74 4c 61 73 74 3d 3d 30 20 29 7b  ->stmtLast==0 ){
a590: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a5a0: 44 62 2d 3e 6e 53 74 6d 74 3d 3d 30 20 29 3b 0a  Db->nStmt==0 );.
a5b0: 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c        pDb->stmtL
a5c0: 61 73 74 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a  ast = pPreStmt;.
a5d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a5e0: 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 6e 53   assert( pDb->nS
a5f0: 74 6d 74 3e 30 20 29 3b 0a 20 20 20 20 7d 0a 20  tmt>0 );.    }. 
a600: 20 20 20 70 44 62 2d 3e 6e 53 74 6d 74 2b 2b 3b     pDb->nStmt++;
a610: 0a 20 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 77  .   .    /* If w
a620: 65 20 68 61 76 65 20 74 6f 6f 20 6d 61 6e 79 20  e have too many 
a630: 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 63 61 63  statement in cac
a640: 68 65 2c 20 72 65 6d 6f 76 65 20 74 68 65 20 73  he, remove the s
a650: 75 72 70 6c 75 73 20 66 72 6f 6d 20 0a 20 20 20  urplus from .   
a660: 20 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74   ** the end of t
a670: 68 65 20 63 61 63 68 65 20 6c 69 73 74 2e 20 20  he cache list.  
a680: 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70 44  */.    while( pD
a690: 62 2d 3e 6e 53 74 6d 74 3e 70 44 62 2d 3e 6d 61  b->nStmt>pDb->ma
a6a0: 78 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 53  xStmt ){.      S
a6b0: 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a  qlPreparedStmt *
a6c0: 70 4c 61 73 74 20 3d 20 70 44 62 2d 3e 73 74 6d  pLast = pDb->stm
a6d0: 74 4c 61 73 74 3b 0a 20 20 20 20 20 20 70 44 62  tLast;.      pDb
a6e0: 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20 70 4c 61  ->stmtLast = pLa
a6f0: 73 74 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20  st->pPrev;.     
a700: 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e   pDb->stmtLast->
a710: 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20  pNext = 0;.     
a720: 20 70 44 62 2d 3e 6e 53 74 6d 74 2d 2d 3b 0a 20   pDb->nStmt--;. 
a730: 20 20 20 20 20 64 62 46 72 65 65 53 74 6d 74 28       dbFreeStmt(
a740: 70 4c 61 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  pLast);.    }.  
a750: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63  }.}../*.** Struc
a760: 74 75 72 65 20 75 73 65 64 20 77 69 74 68 20 64  ture used with d
a770: 62 45 76 61 6c 58 58 58 28 29 20 66 75 6e 63 74  bEvalXXX() funct
a780: 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 64 62  ions:.**.**   db
a790: 45 76 61 6c 49 6e 69 74 28 29 0a 2a 2a 20 20 20  EvalInit().**   
a7a0: 64 62 45 76 61 6c 53 74 65 70 28 29 0a 2a 2a 20  dbEvalStep().** 
a7b0: 20 20 64 62 45 76 61 6c 46 69 6e 61 6c 69 7a 65    dbEvalFinalize
a7c0: 28 29 0a 2a 2a 20 20 20 64 62 45 76 61 6c 52 6f  ().**   dbEvalRo
a7d0: 77 49 6e 66 6f 28 29 0a 2a 2a 20 20 20 64 62 45  wInfo().**   dbE
a7e0: 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65 28 29  valColumnValue()
a7f0: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
a800: 63 74 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74  ct DbEvalContext
a810: 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 3b 0a   DbEvalContext;.
a820: 73 74 72 75 63 74 20 44 62 45 76 61 6c 43 6f 6e  struct DbEvalCon
a830: 74 65 78 74 20 7b 0a 20 20 53 71 6c 69 74 65 44  text {.  SqliteD
a840: 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20  b *pDb;         
a850: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
a860: 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  base handle */. 
a870: 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 71 6c 3b 20   Tcl_Obj *pSql; 
a880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a890: 20 2f 2a 20 4f 62 6a 65 63 74 20 68 6f 6c 64 69   /* Object holdi
a8a0: 6e 67 20 73 74 72 69 6e 67 20 7a 53 71 6c 20 2a  ng string zSql *
a8b0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
a8c0: 7a 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20  zSql;           
a8d0: 20 20 20 20 2f 2a 20 52 65 6d 61 69 6e 69 6e 67      /* Remaining
a8e0: 20 53 51 4c 20 74 6f 20 65 78 65 63 75 74 65 20   SQL to execute 
a8f0: 2a 2f 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64  */.  SqlPrepared
a900: 53 74 6d 74 20 2a 70 50 72 65 53 74 6d 74 3b 20  Stmt *pPreStmt; 
a910: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
a920: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  statement */.  i
a930: 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt nCol;        
a940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a950: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
a960: 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  mns returned by 
a970: 70 53 74 6d 74 20 2a 2f 0a 20 20 54 63 6c 5f 4f  pStmt */.  Tcl_O
a980: 62 6a 20 2a 70 41 72 72 61 79 3b 20 20 20 20 20  bj *pArray;     
a990: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
a9a0: 6d 65 20 6f 66 20 61 72 72 61 79 20 76 61 72 69  me of array vari
a9b0: 61 62 6c 65 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  able */.  Tcl_Ob
a9c0: 6a 20 2a 2a 61 70 43 6f 6c 4e 61 6d 65 3b 20 20  j **apColName;  
a9d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
a9e0: 61 79 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ay of column nam
a9f0: 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  es */.};../*.** 
aa00: 52 65 6c 65 61 73 65 20 61 6e 79 20 63 61 63 68  Release any cach
aa10: 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  e of column name
aa20: 73 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64  s currently held
aa30: 20 61 73 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74   as part of.** t
aa40: 68 65 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74  he DbEvalContext
aa50: 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65   structure passe
aa60: 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
aa70: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
aa80: 69 63 20 76 6f 69 64 20 64 62 52 65 6c 65 61 73  ic void dbReleas
aa90: 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 44 62 45  eColumnNames(DbE
aaa0: 76 61 6c 43 6f 6e 74 65 78 74 20 2a 70 29 7b 0a  valContext *p){.
aab0: 20 20 69 66 28 20 70 2d 3e 61 70 43 6f 6c 4e 61    if( p->apColNa
aac0: 6d 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  me ){.    int i;
aad0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
aae0: 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  p->nCol; i++){. 
aaf0: 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66       Tcl_DecrRef
ab00: 43 6f 75 6e 74 28 70 2d 3e 61 70 43 6f 6c 4e 61  Count(p->apColNa
ab10: 6d 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  me[i]);.    }.  
ab20: 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72    Tcl_Free((char
ab30: 20 2a 29 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65 29   *)p->apColName)
ab40: 3b 0a 20 20 20 20 70 2d 3e 61 70 43 6f 6c 4e 61  ;.    p->apColNa
ab50: 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 2d  me = 0;.  }.  p-
ab60: 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  >nCol = 0;.}../*
ab70: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61  .** Initialize a
ab80: 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 73   DbEvalContext s
ab90: 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20  tructure..**.** 
aba0: 49 66 20 70 41 72 72 61 79 20 69 73 20 6e 6f 74  If pArray is not
abb0: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 63   NULL, then it c
abc0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65  ontains the name
abd0: 20 6f 66 20 61 20 54 63 6c 20 61 72 72 61 79 0a   of a Tcl array.
abe0: 2a 2a 20 76 61 72 69 61 62 6c 65 2e 20 54 68 65  ** variable. The
abf0: 20 22 2a 22 20 6d 65 6d 62 65 72 20 6f 66 20 74   "*" member of t
ac00: 68 69 73 20 61 72 72 61 79 20 69 73 20 73 65 74  his array is set
ac10: 20 74 6f 20 61 20 6c 69 73 74 20 63 6f 6e 74 61   to a list conta
ac20: 69 6e 69 6e 67 0a 2a 2a 20 74 68 65 20 6e 61 6d  ining.** the nam
ac30: 65 73 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  es of the column
ac40: 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  s returned by th
ac50: 65 20 73 74 61 74 65 6d 65 6e 74 20 61 73 20 70  e statement as p
ac60: 61 72 74 20 6f 66 20 65 61 63 68 0a 2a 2a 20 63  art of each.** c
ac70: 61 6c 6c 20 74 6f 20 64 62 45 76 61 6c 53 74 65  all to dbEvalSte
ac80: 70 28 29 2c 20 69 6e 20 6f 72 64 65 72 20 66 72  p(), in order fr
ac90: 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  om left to right
aca0: 2e 20 65 2e 67 2e 20 69 66 20 74 68 65 20 6e 61  . e.g. if the na
acb0: 6d 65 73 20 0a 2a 2a 20 6f 66 20 74 68 65 20 72  mes .** of the r
acc0: 65 74 75 72 6e 65 64 20 63 6f 6c 75 6d 6e 73 20  eturned columns 
acd0: 61 72 65 20 61 2c 20 62 20 61 6e 64 20 63 2c 20  are a, b and c, 
ace0: 69 74 20 64 6f 65 73 20 74 68 65 20 65 71 75 69  it does the equi
acf0: 76 61 6c 65 6e 74 20 6f 66 20 74 68 65 20 0a 2a  valent of the .*
ad00: 2a 20 74 63 6c 20 63 6f 6d 6d 61 6e 64 3a 0a 2a  * tcl command:.*
ad10: 2a 0a 2a 2a 20 20 20 20 20 73 65 74 20 24 7b 70  *.**     set ${p
ad20: 41 72 72 61 79 7d 28 2a 29 20 7b 61 20 62 20 63  Array}(*) {a b c
ad30: 7d 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  }.*/.static void
ad40: 20 64 62 45 76 61 6c 49 6e 69 74 28 0a 20 20 44   dbEvalInit(.  D
ad50: 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 70 2c  bEvalContext *p,
ad60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ad70: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 74 72  * Pointer to str
ad80: 75 63 74 75 72 65 20 74 6f 20 69 6e 69 74 69 61  ucture to initia
ad90: 6c 69 7a 65 20 2a 2f 0a 20 20 53 71 6c 69 74 65  lize */.  Sqlite
ada0: 44 62 20 2a 70 44 62 2c 20 20 20 20 20 20 20 20  Db *pDb,        
adb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
adc0: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
add0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 71 6c 2c    Tcl_Obj *pSql,
ade0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
adf0: 20 20 2f 2a 20 4f 62 6a 65 63 74 20 63 6f 6e 74    /* Object cont
ae00: 61 69 6e 69 6e 67 20 53 51 4c 20 73 63 72 69 70  aining SQL scrip
ae10: 74 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  t */.  Tcl_Obj *
ae20: 70 41 72 72 61 79 20 20 20 20 20 20 20 20 20 20  pArray          
ae30: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
ae40: 66 20 54 63 6c 20 61 72 72 61 79 20 74 6f 20 73  f Tcl array to s
ae50: 65 74 20 28 2a 29 20 65 6c 65 6d 65 6e 74 20 6f  et (*) element o
ae60: 66 20 2a 2f 0a 29 7b 0a 20 20 6d 65 6d 73 65 74  f */.){.  memset
ae70: 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 44 62  (p, 0, sizeof(Db
ae80: 45 76 61 6c 43 6f 6e 74 65 78 74 29 29 3b 0a 20  EvalContext));. 
ae90: 20 70 2d 3e 70 44 62 20 3d 20 70 44 62 3b 0a 20   p->pDb = pDb;. 
aea0: 20 70 2d 3e 7a 53 71 6c 20 3d 20 54 63 6c 5f 47   p->zSql = Tcl_G
aeb0: 65 74 53 74 72 69 6e 67 28 70 53 71 6c 29 3b 0a  etString(pSql);.
aec0: 20 20 70 2d 3e 70 53 71 6c 20 3d 20 70 53 71 6c    p->pSql = pSql
aed0: 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43  ;.  Tcl_IncrRefC
aee0: 6f 75 6e 74 28 70 53 71 6c 29 3b 0a 20 20 69 66  ount(pSql);.  if
aef0: 28 20 70 41 72 72 61 79 20 29 7b 0a 20 20 20 20  ( pArray ){.    
af00: 70 2d 3e 70 41 72 72 61 79 20 3d 20 70 41 72 72  p->pArray = pArr
af10: 61 79 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72  ay;.    Tcl_Incr
af20: 52 65 66 43 6f 75 6e 74 28 70 41 72 72 61 79 29  RefCount(pArray)
af30: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  ;.  }.}../*.** O
af40: 62 74 61 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f  btain informatio
af50: 6e 20 61 62 6f 75 74 20 74 68 65 20 72 6f 77 20  n about the row 
af60: 74 68 61 74 20 74 68 65 20 44 62 45 76 61 6c 43  that the DbEvalC
af70: 6f 6e 74 65 78 74 20 70 61 73 73 65 64 20 61 73  ontext passed as
af80: 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 61 72   the.** first ar
af90: 67 75 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c 79  gument currently
afa0: 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 73   points to..*/.s
afb0: 74 61 74 69 63 20 76 6f 69 64 20 64 62 45 76 61  tatic void dbEva
afc0: 6c 52 6f 77 49 6e 66 6f 28 0a 20 20 44 62 45 76  lRowInfo(.  DbEv
afd0: 61 6c 43 6f 6e 74 65 78 74 20 2a 70 2c 20 20 20  alContext *p,   
afe0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
aff0: 76 61 6c 75 61 74 69 6f 6e 20 63 6f 6e 74 65 78  valuation contex
b000: 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 6f  t */.  int *pnCo
b010: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
b020: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e         /* OUT: N
b030: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 20  umber of column 
b040: 6e 61 6d 65 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  names */.  Tcl_O
b050: 62 6a 20 2a 2a 2a 70 61 70 43 6f 6c 4e 61 6d 65  bj ***papColName
b060: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
b070: 54 3a 20 41 72 72 61 79 20 6f 66 20 63 6f 6c 75  T: Array of colu
b080: 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 29 7b 0a 20  mn names */.){. 
b090: 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 75   /* Compute colu
b0a0: 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 66  mn names */.  if
b0b0: 28 20 30 3d 3d 70 2d 3e 61 70 43 6f 6c 4e 61 6d  ( 0==p->apColNam
b0c0: 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
b0d0: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 70  _stmt *pStmt = p
b0e0: 2d 3e 70 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d  ->pPreStmt->pStm
b0f0: 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20  t;.    int i;   
b100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b110: 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
b120: 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20   variable */.   
b130: 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20   int nCol;      
b140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b150: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
b160: 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  mns returned by 
b170: 70 53 74 6d 74 20 2a 2f 0a 20 20 20 20 54 63 6c  pStmt */.    Tcl
b180: 5f 4f 62 6a 20 2a 2a 61 70 43 6f 6c 4e 61 6d 65  _Obj **apColName
b190: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 41 72   = 0;      /* Ar
b1a0: 72 61 79 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61  ray of column na
b1b0: 6d 65 73 20 2a 2f 0a 0a 20 20 20 20 70 2d 3e 6e  mes */..    p->n
b1c0: 43 6f 6c 20 3d 20 6e 43 6f 6c 20 3d 20 73 71 6c  Col = nCol = sql
b1d0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
b1e0: 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66  t(pStmt);.    if
b1f0: 28 20 6e 43 6f 6c 3e 30 20 26 26 20 28 70 61 70  ( nCol>0 && (pap
b200: 43 6f 6c 4e 61 6d 65 20 7c 7c 20 70 2d 3e 70 41  ColName || p->pA
b210: 72 72 61 79 29 20 29 7b 0a 20 20 20 20 20 20 61  rray) ){.      a
b220: 70 43 6f 6c 4e 61 6d 65 20 3d 20 28 54 63 6c 5f  pColName = (Tcl_
b230: 4f 62 6a 2a 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28  Obj**)Tcl_Alloc(
b240: 20 73 69 7a 65 6f 66 28 54 63 6c 5f 4f 62 6a 2a   sizeof(Tcl_Obj*
b250: 29 2a 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20  )*nCol );.      
b260: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
b270: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61   i++){.        a
b280: 70 43 6f 6c 4e 61 6d 65 5b 69 5d 20 3d 20 54 63  pColName[i] = Tc
b290: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73  l_NewStringObj(s
b2a0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61  qlite3_column_na
b2b0: 6d 65 28 70 53 74 6d 74 2c 69 29 2c 20 2d 31 29  me(pStmt,i), -1)
b2c0: 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e  ;.        Tcl_In
b2d0: 63 72 52 65 66 43 6f 75 6e 74 28 61 70 43 6f 6c  crRefCount(apCol
b2e0: 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20  Name[i]);.      
b2f0: 7d 0a 20 20 20 20 20 20 70 2d 3e 61 70 43 6f 6c  }.      p->apCol
b300: 4e 61 6d 65 20 3d 20 61 70 43 6f 6c 4e 61 6d 65  Name = apColName
b310: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
b320: 49 66 20 72 65 73 75 6c 74 73 20 61 72 65 20 62  If results are b
b330: 65 69 6e 67 20 73 74 6f 72 65 64 20 69 6e 20 61  eing stored in a
b340: 6e 20 61 72 72 61 79 20 76 61 72 69 61 62 6c 65  n array variable
b350: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 0a 20 20  , then create.  
b360: 20 20 2a 2a 20 74 68 65 20 61 72 72 61 79 28 2a    ** the array(*
b370: 29 20 65 6e 74 72 79 20 66 6f 72 20 74 68 61 74  ) entry for that
b380: 20 61 72 72 61 79 0a 20 20 20 20 2a 2f 0a 20 20   array.    */.  
b390: 20 20 69 66 28 20 70 2d 3e 70 41 72 72 61 79 20    if( p->pArray 
b3a0: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 74  ){.      Tcl_Int
b3b0: 65 72 70 20 2a 69 6e 74 65 72 70 20 3d 20 70 2d  erp *interp = p-
b3c0: 3e 70 44 62 2d 3e 69 6e 74 65 72 70 3b 0a 20 20  >pDb->interp;.  
b3d0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6f      Tcl_Obj *pCo
b3e0: 6c 4c 69 73 74 20 3d 20 54 63 6c 5f 4e 65 77 4f  lList = Tcl_NewO
b3f0: 62 6a 28 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f  bj();.      Tcl_
b400: 4f 62 6a 20 2a 70 53 74 61 72 20 3d 20 54 63 6c  Obj *pStar = Tcl
b410: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 2a  _NewStringObj("*
b420: 22 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 20 20 66  ", -1);..      f
b430: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
b440: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 54 63  i++){.        Tc
b450: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
b460: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70  lement(interp, p
b470: 43 6f 6c 4c 69 73 74 2c 20 61 70 43 6f 6c 4e 61  ColList, apColNa
b480: 6d 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  me[i]);.      }.
b490: 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65        Tcl_IncrRe
b4a0: 66 43 6f 75 6e 74 28 70 53 74 61 72 29 3b 0a 20  fCount(pStar);. 
b4b0: 20 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56       Tcl_ObjSetV
b4c0: 61 72 32 28 69 6e 74 65 72 70 2c 20 70 2d 3e 70  ar2(interp, p->p
b4d0: 41 72 72 61 79 2c 20 70 53 74 61 72 2c 20 70 43  Array, pStar, pC
b4e0: 6f 6c 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20 20  olList, 0);.    
b4f0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
b500: 6e 74 28 70 53 74 61 72 29 3b 0a 20 20 20 20 7d  nt(pStar);.    }
b510: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 61 70 43  .  }..  if( papC
b520: 6f 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 2a 70  olName ){.    *p
b530: 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 70 2d 3e 61  apColName = p->a
b540: 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20  pColName;.  }.  
b550: 69 66 28 20 70 6e 43 6f 6c 20 29 7b 0a 20 20 20  if( pnCol ){.   
b560: 20 2a 70 6e 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f   *pnCol = p->nCo
b570: 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l;.  }.}../*.** 
b580: 52 65 74 75 72 6e 20 6f 6e 65 20 6f 66 20 54 43  Return one of TC
b590: 4c 5f 4f 4b 2c 20 54 43 4c 5f 42 52 45 41 4b 20  L_OK, TCL_BREAK 
b5a0: 6f 72 20 54 43 4c 5f 45 52 52 4f 52 2e 20 49 66  or TCL_ERROR. If
b5b0: 20 54 43 4c 5f 45 52 52 4f 52 20 69 73 0a 2a 2a   TCL_ERROR is.**
b5c0: 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20   returned, then 
b5d0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
b5e0: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68   is stored in th
b5f0: 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 62 65  e interpreter be
b600: 66 6f 72 65 0a 2a 2a 20 72 65 74 75 72 6e 69 6e  fore.** returnin
b610: 67 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65 74 75 72  g..**.** A retur
b620: 6e 20 76 61 6c 75 65 20 6f 66 20 54 43 4c 5f 4f  n value of TCL_O
b630: 4b 20 6d 65 61 6e 73 20 74 68 65 72 65 20 69 73  K means there is
b640: 20 61 20 72 6f 77 20 6f 66 20 64 61 74 61 20 61   a row of data a
b650: 76 61 69 6c 61 62 6c 65 2e 20 54 68 65 0a 2a 2a  vailable. The.**
b660: 20 64 61 74 61 20 6d 61 79 20 62 65 20 61 63 63   data may be acc
b670: 65 73 73 65 64 20 75 73 69 6e 67 20 64 62 45 76  essed using dbEv
b680: 61 6c 52 6f 77 49 6e 66 6f 28 29 20 61 6e 64 20  alRowInfo() and 
b690: 64 62 45 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75  dbEvalColumnValu
b6a0: 65 28 29 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20  e(). This.** is 
b6b0: 61 6e 61 6c 6f 67 6f 75 73 20 74 6f 20 61 20 72  analogous to a r
b6c0: 65 74 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f  eturn of SQLITE_
b6d0: 52 4f 57 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ROW from sqlite3
b6e0: 5f 73 74 65 70 28 29 2e 20 49 66 20 54 43 4c 5f  _step(). If TCL_
b6f0: 42 52 45 41 4b 0a 2a 2a 20 69 73 20 72 65 74 75  BREAK.** is retu
b700: 72 6e 65 64 2c 20 74 68 65 6e 20 74 68 65 20 53  rned, then the S
b710: 51 4c 20 73 63 72 69 70 74 20 68 61 73 20 66 69  QL script has fi
b720: 6e 69 73 68 65 64 20 65 78 65 63 75 74 69 6e 67  nished executing
b730: 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 0a 2a   and there are.*
b740: 2a 20 6e 6f 20 66 75 72 74 68 65 72 20 72 6f 77  * no further row
b750: 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 54 68 69  s available. Thi
b760: 73 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20  s is similar to 
b770: 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2f 0a  SQLITE_DONE..*/.
b780: 73 74 61 74 69 63 20 69 6e 74 20 64 62 45 76 61  static int dbEva
b790: 6c 53 74 65 70 28 44 62 45 76 61 6c 43 6f 6e 74  lStep(DbEvalCont
b7a0: 65 78 74 20 2a 70 29 7b 0a 20 20 63 6f 6e 73 74  ext *p){.  const
b7b0: 20 63 68 61 72 20 2a 7a 50 72 65 76 53 71 6c 20   char *zPrevSql 
b7c0: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 50 72  = 0;       /* Pr
b7d0: 65 76 69 6f 75 73 20 76 61 6c 75 65 20 6f 66 20  evious value of 
b7e0: 70 2d 3e 7a 53 71 6c 20 2a 2f 0a 0a 20 20 77 68  p->zSql */..  wh
b7f0: 69 6c 65 28 20 70 2d 3e 7a 53 71 6c 5b 30 5d 20  ile( p->zSql[0] 
b800: 7c 7c 20 70 2d 3e 70 50 72 65 53 74 6d 74 20 29  || p->pPreStmt )
b810: 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
b820: 20 20 69 66 28 20 70 2d 3e 70 50 72 65 53 74 6d    if( p->pPreStm
b830: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 50  t==0 ){.      zP
b840: 72 65 76 53 71 6c 20 3d 20 28 70 2d 3e 7a 53 71  revSql = (p->zSq
b850: 6c 3d 3d 7a 50 72 65 76 53 71 6c 20 3f 20 30 20  l==zPrevSql ? 0 
b860: 3a 20 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20 20 20  : p->zSql);.    
b870: 20 20 72 63 20 3d 20 64 62 50 72 65 70 61 72 65    rc = dbPrepare
b880: 41 6e 64 42 69 6e 64 28 70 2d 3e 70 44 62 2c 20  AndBind(p->pDb, 
b890: 70 2d 3e 7a 53 71 6c 2c 20 26 70 2d 3e 7a 53 71  p->zSql, &p->zSq
b8a0: 6c 2c 20 26 70 2d 3e 70 50 72 65 53 74 6d 74 29  l, &p->pPreStmt)
b8b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
b8c0: 54 43 4c 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  TCL_OK ) return 
b8d0: 72 63 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  rc;.    }else{. 
b8e0: 20 20 20 20 20 69 6e 74 20 72 63 73 3b 0a 20 20       int rcs;.  
b8f0: 20 20 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44      SqliteDb *pD
b900: 62 20 3d 20 70 2d 3e 70 44 62 3b 0a 20 20 20 20  b = p->pDb;.    
b910: 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d    SqlPreparedStm
b920: 74 20 2a 70 50 72 65 53 74 6d 74 20 3d 20 70 2d  t *pPreStmt = p-
b930: 3e 70 50 72 65 53 74 6d 74 3b 0a 20 20 20 20 20  >pPreStmt;.     
b940: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
b950: 53 74 6d 74 20 3d 20 70 50 72 65 53 74 6d 74 2d  Stmt = pPreStmt-
b960: 3e 70 53 74 6d 74 3b 0a 0a 20 20 20 20 20 20 72  >pStmt;..      r
b970: 63 73 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65  cs = sqlite3_ste
b980: 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  p(pStmt);.      
b990: 69 66 28 20 72 63 73 3d 3d 53 51 4c 49 54 45 5f  if( rcs==SQLITE_
b9a0: 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ROW ){.        r
b9b0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20  eturn TCL_OK;.  
b9c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
b9d0: 70 2d 3e 70 41 72 72 61 79 20 29 7b 0a 20 20 20  p->pArray ){.   
b9e0: 20 20 20 20 20 64 62 45 76 61 6c 52 6f 77 49 6e       dbEvalRowIn
b9f0: 66 6f 28 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  fo(p, 0, 0);.   
ba00: 20 20 20 7d 0a 20 20 20 20 20 20 72 63 73 20 3d     }.      rcs =
ba10: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
ba20: 53 74 6d 74 29 3b 0a 0a 20 20 20 20 20 20 70 44  Stmt);..      pD
ba30: 62 2d 3e 6e 53 74 65 70 20 3d 20 73 71 6c 69 74  b->nStep = sqlit
ba40: 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70  e3_stmt_status(p
ba50: 53 74 6d 74 2c 53 51 4c 49 54 45 5f 53 54 4d 54  Stmt,SQLITE_STMT
ba60: 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f  STATUS_FULLSCAN_
ba70: 53 54 45 50 2c 31 29 3b 0a 20 20 20 20 20 20 70  STEP,1);.      p
ba80: 44 62 2d 3e 6e 53 6f 72 74 20 3d 20 73 71 6c 69  Db->nSort = sqli
ba90: 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28  te3_stmt_status(
baa0: 70 53 74 6d 74 2c 53 51 4c 49 54 45 5f 53 54 4d  pStmt,SQLITE_STM
bab0: 54 53 54 41 54 55 53 5f 53 4f 52 54 2c 31 29 3b  TSTATUS_SORT,1);
bac0: 0a 20 20 20 20 20 20 70 44 62 2d 3e 6e 49 6e 64  .      pDb->nInd
bad0: 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d  ex = sqlite3_stm
bae0: 74 5f 73 74 61 74 75 73 28 70 53 74 6d 74 2c 53  t_status(pStmt,S
baf0: 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
bb00: 5f 41 55 54 4f 49 4e 44 45 58 2c 31 29 3b 0a 20  _AUTOINDEX,1);. 
bb10: 20 20 20 20 20 64 62 52 65 6c 65 61 73 65 43 6f       dbReleaseCo
bb20: 6c 75 6d 6e 4e 61 6d 65 73 28 70 29 3b 0a 20 20  lumnNames(p);.  
bb30: 20 20 20 20 70 2d 3e 70 50 72 65 53 74 6d 74 20      p->pPreStmt 
bb40: 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  = 0;..      if( 
bb50: 72 63 73 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  rcs!=SQLITE_OK )
bb60: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
bb70: 61 20 72 75 6e 2d 74 69 6d 65 20 65 72 72 6f 72  a run-time error
bb80: 20 6f 63 63 75 72 73 2c 20 72 65 70 6f 72 74 20   occurs, report 
bb90: 74 68 65 20 65 72 72 6f 72 20 61 6e 64 20 73 74  the error and st
bba0: 6f 70 20 72 65 61 64 69 6e 67 0a 20 20 20 20 20  op reading.     
bbb0: 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 2e 20 20     ** the SQL.  
bbc0: 2a 2f 0a 20 20 20 20 20 20 20 20 64 62 52 65 6c  */.        dbRel
bbd0: 65 61 73 65 53 74 6d 74 28 70 44 62 2c 20 70 50  easeStmt(pDb, pP
bbe0: 72 65 53 74 6d 74 2c 20 31 29 3b 0a 23 69 66 20  reStmt, 1);.#if 
bbf0: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20  SQLITE_TEST.    
bc00: 20 20 20 20 69 66 28 20 70 2d 3e 70 44 62 2d 3e      if( p->pDb->
bc10: 62 4c 65 67 61 63 79 50 72 65 70 61 72 65 20 26  bLegacyPrepare &
bc20: 26 20 72 63 73 3d 3d 53 51 4c 49 54 45 5f 53 43  & rcs==SQLITE_SC
bc30: 48 45 4d 41 20 26 26 20 7a 50 72 65 76 53 71 6c  HEMA && zPrevSql
bc40: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
bc50: 20 49 66 20 74 68 65 20 72 75 6e 74 69 6d 65 20   If the runtime 
bc60: 65 72 72 6f 72 20 77 61 73 20 61 6e 20 53 51 4c  error was an SQL
bc70: 49 54 45 5f 53 43 48 45 4d 41 2c 20 61 6e 64 20  ITE_SCHEMA, and 
bc80: 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
bc90: 20 20 20 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65         ** handle
bca0: 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74   is configured t
bcb0: 6f 20 75 73 65 20 74 68 65 20 6c 65 67 61 63 79  o use the legacy
bcc0: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
bcd0: 28 29 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  () .          **
bce0: 20 69 6e 74 65 72 66 61 63 65 2c 20 72 65 74 72   interface, retr
bcf0: 79 20 70 72 65 70 61 72 65 28 29 2f 73 74 65 70  y prepare()/step
bd00: 28 29 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 53  () on the same S
bd10: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  QL statement..  
bd20: 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20          ** This 
bd30: 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 6f 6e 63  only happens onc
bd40: 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  e. If there is a
bd50: 20 73 65 63 6f 6e 64 20 53 51 4c 49 54 45 5f 53   second SQLITE_S
bd60: 43 48 45 4d 41 0a 20 20 20 20 20 20 20 20 20 20  CHEMA.          
bd70: 2a 2a 20 65 72 72 6f 72 2c 20 74 68 65 20 65 72  ** error, the er
bd80: 72 6f 72 20 77 69 6c 6c 20 62 65 20 72 65 74 75  ror will be retu
bd90: 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
bda0: 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  er. */.         
bdb0: 20 70 2d 3e 7a 53 71 6c 20 3d 20 7a 50 72 65 76   p->zSql = zPrev
bdc0: 53 71 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 63  Sql;.          c
bdd0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
bde0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
bdf0: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
be00: 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 0a  lt(pDb->interp,.
be10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be20: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4e 65 77           Tcl_New
be30: 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65  StringObj(sqlite
be40: 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62  3_errmsg(pDb->db
be50: 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 20 20 20  ), -1));.       
be60: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
be70: 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  R;.      }else{.
be80: 20 20 20 20 20 20 20 20 64 62 52 65 6c 65 61 73          dbReleas
be90: 65 53 74 6d 74 28 70 44 62 2c 20 70 50 72 65 53  eStmt(pDb, pPreS
bea0: 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  tmt, 0);.      }
beb0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
bec0: 20 46 69 6e 69 73 68 65 64 20 2a 2f 0a 20 20 72   Finished */.  r
bed0: 65 74 75 72 6e 20 54 43 4c 5f 42 52 45 41 4b 3b  eturn TCL_BREAK;
bee0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
bef0: 6c 6c 20 72 65 73 6f 75 72 63 65 73 20 63 75 72  ll resources cur
bf00: 72 65 6e 74 6c 79 20 68 65 6c 64 20 62 79 20 74  rently held by t
bf10: 68 65 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74  he DbEvalContext
bf20: 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65   structure passe
bf30: 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73  d.** as the firs
bf40: 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 72  t argument. Ther
bf50: 65 20 73 68 6f 75 6c 64 20 62 65 20 65 78 61 63  e should be exac
bf60: 74 6c 79 20 6f 6e 65 20 63 61 6c 6c 20 74 6f 20  tly one call to 
bf70: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
bf80: 20 66 6f 72 20 65 61 63 68 20 63 61 6c 6c 20 74   for each call t
bf90: 6f 20 64 62 45 76 61 6c 49 6e 69 74 28 29 2e 0a  o dbEvalInit()..
bfa0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
bfb0: 62 45 76 61 6c 46 69 6e 61 6c 69 7a 65 28 44 62  bEvalFinalize(Db
bfc0: 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 70 29 7b  EvalContext *p){
bfd0: 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 53 74  .  if( p->pPreSt
bfe0: 6d 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  mt ){.    sqlite
bff0: 33 5f 72 65 73 65 74 28 70 2d 3e 70 50 72 65 53  3_reset(p->pPreS
c000: 74 6d 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20  tmt->pStmt);.   
c010: 20 64 62 52 65 6c 65 61 73 65 53 74 6d 74 28 70   dbReleaseStmt(p
c020: 2d 3e 70 44 62 2c 20 70 2d 3e 70 50 72 65 53 74  ->pDb, p->pPreSt
c030: 6d 74 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 70  mt, 0);.    p->p
c040: 50 72 65 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d  PreStmt = 0;.  }
c050: 0a 20 20 69 66 28 20 70 2d 3e 70 41 72 72 61 79  .  if( p->pArray
c060: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72   ){.    Tcl_Decr
c070: 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 41 72 72  RefCount(p->pArr
c080: 61 79 29 3b 0a 20 20 20 20 70 2d 3e 70 41 72 72  ay);.    p->pArr
c090: 61 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 54 63  ay = 0;.  }.  Tc
c0a0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
c0b0: 2d 3e 70 53 71 6c 29 3b 0a 20 20 64 62 52 65 6c  ->pSql);.  dbRel
c0c0: 65 61 73 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  easeColumnNames(
c0d0: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  p);.}../*.** Ret
c0e0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
c0f0: 20 61 20 54 63 6c 5f 4f 62 6a 20 73 74 72 75 63   a Tcl_Obj struc
c100: 74 75 72 65 20 77 69 74 68 20 72 65 66 2d 63 6f  ture with ref-co
c110: 75 6e 74 20 30 20 74 68 61 74 20 63 6f 6e 74 61  unt 0 that conta
c120: 69 6e 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  ins.** the value
c130: 20 66 6f 72 20 74 68 65 20 69 43 6f 6c 27 74 68   for the iCol'th
c140: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 72   column of the r
c150: 6f 77 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  ow currently poi
c160: 6e 74 65 64 20 74 6f 20 62 79 0a 2a 2a 20 74 68  nted to by.** th
c170: 65 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20  e DbEvalContext 
c180: 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64  structure passed
c190: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
c1a0: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
c1b0: 63 20 54 63 6c 5f 4f 62 6a 20 2a 64 62 45 76 61  c Tcl_Obj *dbEva
c1c0: 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65 28 44 62 45  lColumnValue(DbE
c1d0: 76 61 6c 43 6f 6e 74 65 78 74 20 2a 70 2c 20 69  valContext *p, i
c1e0: 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 73 71 6c 69  nt iCol){.  sqli
c1f0: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20  te3_stmt *pStmt 
c200: 3d 20 70 2d 3e 70 50 72 65 53 74 6d 74 2d 3e 70  = p->pPreStmt->p
c210: 53 74 6d 74 3b 0a 20 20 73 77 69 74 63 68 28 20  Stmt;.  switch( 
c220: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
c230: 79 70 65 28 70 53 74 6d 74 2c 20 69 43 6f 6c 29  ype(pStmt, iCol)
c240: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
c250: 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20  ITE_BLOB: {.    
c260: 20 20 69 6e 74 20 62 79 74 65 73 20 3d 20 73 71    int bytes = sq
c270: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74  lite3_column_byt
c280: 65 73 28 70 53 74 6d 74 2c 20 69 43 6f 6c 29 3b  es(pStmt, iCol);
c290: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
c2a0: 72 20 2a 7a 42 6c 6f 62 20 3d 20 73 71 6c 69 74  r *zBlob = sqlit
c2b0: 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70  e3_column_blob(p
c2c0: 53 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 20  Stmt, iCol);.   
c2d0: 20 20 20 69 66 28 20 21 7a 42 6c 6f 62 20 29 20     if( !zBlob ) 
c2e0: 62 79 74 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  bytes = 0;.     
c2f0: 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e 65 77 42   return Tcl_NewB
c300: 79 74 65 41 72 72 61 79 4f 62 6a 28 28 75 38 2a  yteArrayObj((u8*
c310: 29 7a 42 6c 6f 62 2c 20 62 79 74 65 73 29 3b 0a  )zBlob, bytes);.
c320: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
c330: 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b  QLITE_INTEGER: {
c340: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 5f 69 6e  .      sqlite_in
c350: 74 36 34 20 76 20 3d 20 73 71 6c 69 74 65 33 5f  t64 v = sqlite3_
c360: 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74  column_int64(pSt
c370: 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20  mt, iCol);.     
c380: 20 69 66 28 20 76 3e 3d 2d 32 31 34 37 34 38 33   if( v>=-2147483
c390: 36 34 37 20 26 26 20 76 3c 3d 32 31 34 37 34 38  647 && v<=214748
c3a0: 33 36 34 37 20 29 7b 0a 20 20 20 20 20 20 20 20  3647 ){.        
c3b0: 72 65 74 75 72 6e 20 54 63 6c 5f 4e 65 77 49 6e  return Tcl_NewIn
c3c0: 74 4f 62 6a 28 28 69 6e 74 29 76 29 3b 0a 20 20  tObj((int)v);.  
c3d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c3e0: 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e 65     return Tcl_Ne
c3f0: 77 57 69 64 65 49 6e 74 4f 62 6a 28 76 29 3b 0a  wWideIntObj(v);.
c400: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
c410: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4c    case SQLITE_FL
c420: 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  OAT: {.      ret
c430: 75 72 6e 20 54 63 6c 5f 4e 65 77 44 6f 75 62 6c  urn Tcl_NewDoubl
c440: 65 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 6f 6c  eObj(sqlite3_col
c450: 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74  umn_double(pStmt
c460: 2c 20 69 43 6f 6c 29 29 3b 0a 20 20 20 20 7d 0a  , iCol));.    }.
c470: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
c480: 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 72 65  NULL: {.      re
c490: 74 75 72 6e 20 54 63 6c 5f 4e 65 77 53 74 72 69  turn Tcl_NewStri
c4a0: 6e 67 4f 62 6a 28 70 2d 3e 70 44 62 2d 3e 7a 4e  ngObj(p->pDb->zN
c4b0: 75 6c 6c 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a  ull, -1);.    }.
c4c0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 63    }..  return Tc
c4d0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28  l_NewStringObj((
c4e0: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
c4f0: 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
c500: 20 69 43 6f 6c 29 2c 20 2d 31 29 3b 0a 7d 0a 0a   iCol), -1);.}..
c510: 2f 2a 0a 2a 2a 20 49 66 20 75 73 69 6e 67 20 54  /*.** If using T
c520: 63 6c 20 76 65 72 73 69 6f 6e 20 38 2e 36 20 6f  cl version 8.6 o
c530: 72 20 67 72 65 61 74 65 72 2c 20 75 73 65 20 74  r greater, use t
c540: 68 65 20 4e 52 20 66 75 6e 63 74 69 6f 6e 73 20  he NR functions 
c550: 74 6f 20 61 76 6f 69 64 0a 2a 2a 20 72 65 63 75  to avoid.** recu
c560: 72 73 69 76 65 20 65 76 61 6c 75 74 69 6f 6e 20  rsive evalution 
c570: 6f 66 20 73 63 72 69 70 74 73 20 62 79 20 74 68  of scripts by th
c580: 65 20 5b 64 62 20 65 76 61 6c 5d 20 61 6e 64 20  e [db eval] and 
c590: 5b 64 62 20 74 72 61 6e 73 5d 0a 2a 2a 20 63 6f  [db trans].** co
c5a0: 6d 6d 61 6e 64 73 2e 20 45 76 65 6e 20 69 66 20  mmands. Even if 
c5b0: 74 68 65 20 68 65 61 64 65 72 73 20 75 73 65 64  the headers used
c5c0: 20 77 68 69 6c 65 20 63 6f 6d 70 69 6c 69 6e 67   while compiling
c5d0: 20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e 0a 2a   the extension.*
c5e0: 2a 20 61 72 65 20 38 2e 36 20 6f 72 20 6e 65 77  * are 8.6 or new
c5f0: 65 72 2c 20 74 68 65 20 63 6f 64 65 20 73 74 69  er, the code sti
c600: 6c 6c 20 74 65 73 74 73 20 74 68 65 20 54 63 6c  ll tests the Tcl
c610: 20 76 65 72 73 69 6f 6e 20 61 74 20 72 75 6e 74   version at runt
c620: 69 6d 65 2e 0a 2a 2a 20 54 68 69 73 20 61 6c 6c  ime..** This all
c630: 6f 77 73 20 73 74 75 62 73 2d 65 6e 61 62 6c 65  ows stubs-enable
c640: 64 20 62 75 69 6c 64 73 20 74 6f 20 62 65 20 75  d builds to be u
c650: 73 65 64 20 77 69 74 68 20 6f 6c 64 65 72 20 54  sed with older T
c660: 63 6c 20 6c 69 62 72 61 72 69 65 73 2e 0a 2a 2f  cl libraries..*/
c670: 0a 23 69 66 20 54 43 4c 5f 4d 41 4a 4f 52 5f 56  .#if TCL_MAJOR_V
c680: 45 52 53 49 4f 4e 3e 38 20 7c 7c 20 28 54 43 4c  ERSION>8 || (TCL
c690: 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 3d 3d  _MAJOR_VERSION==
c6a0: 38 20 26 26 20 54 43 4c 5f 4d 49 4e 4f 52 5f 56  8 && TCL_MINOR_V
c6b0: 45 52 53 49 4f 4e 3e 3d 36 29 0a 23 20 64 65 66  ERSION>=6).# def
c6c0: 69 6e 65 20 53 51 4c 49 54 45 5f 54 43 4c 5f 4e  ine SQLITE_TCL_N
c6d0: 52 45 20 31 0a 73 74 61 74 69 63 20 69 6e 74 20  RE 1.static int 
c6e0: 44 62 55 73 65 4e 72 65 28 76 6f 69 64 29 7b 0a  DbUseNre(void){.
c6f0: 20 20 69 6e 74 20 6d 61 6a 6f 72 2c 20 6d 69 6e    int major, min
c700: 6f 72 3b 0a 20 20 54 63 6c 5f 47 65 74 56 65 72  or;.  Tcl_GetVer
c710: 73 69 6f 6e 28 26 6d 61 6a 6f 72 2c 20 26 6d 69  sion(&major, &mi
c720: 6e 6f 72 2c 20 30 2c 20 30 29 3b 0a 20 20 72 65  nor, 0, 0);.  re
c730: 74 75 72 6e 28 20 28 6d 61 6a 6f 72 3d 3d 38 20  turn( (major==8 
c740: 26 26 20 6d 69 6e 6f 72 3e 3d 36 29 20 7c 7c 20  && minor>=6) || 
c750: 6d 61 6a 6f 72 3e 38 20 29 3b 0a 7d 0a 23 65 6c  major>8 );.}.#el
c760: 73 65 0a 2f 2a 20 0a 2a 2a 20 43 6f 6d 70 69 6c  se./* .** Compil
c770: 69 6e 67 20 75 73 69 6e 67 20 68 65 61 64 65 72  ing using header
c780: 73 20 65 61 72 6c 69 65 72 20 74 68 61 6e 20 38  s earlier than 8
c790: 2e 36 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  .6. In this case
c7a0: 20 4e 52 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a   NR cannot be.**
c7b0: 20 75 73 65 64 2c 20 73 6f 20 44 62 55 73 65 4e   used, so DbUseN
c7c0: 72 65 28 29 20 74 6f 20 61 6c 77 61 79 73 20 72  re() to always r
c7d0: 65 74 75 72 6e 20 7a 65 72 6f 2e 20 41 64 64 20  eturn zero. Add 
c7e0: 23 64 65 66 69 6e 65 73 20 66 6f 72 20 74 68 65  #defines for the
c7f0: 20 6f 74 68 65 72 0a 2a 2a 20 54 63 6c 5f 4e 52   other.** Tcl_NR
c800: 78 78 78 28 29 20 66 75 6e 63 74 69 6f 6e 73 20  xxx() functions 
c810: 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 6d 20  to prevent them 
c820: 66 72 6f 6d 20 63 61 75 73 69 6e 67 20 63 6f 6d  from causing com
c830: 70 69 6c 61 74 69 6f 6e 20 65 72 72 6f 72 73 2c  pilation errors,
c840: 0a 2a 2a 20 65 76 65 6e 20 74 68 6f 75 67 68 20  .** even though 
c850: 74 68 65 20 6f 6e 6c 79 20 69 6e 76 6f 63 61 74  the only invocat
c860: 69 6f 6e 73 20 6f 66 20 74 68 65 6d 20 61 72 65  ions of them are
c870: 20 77 69 74 68 69 6e 20 63 6f 6e 64 69 74 69 6f   within conditio
c880: 6e 61 6c 20 62 6c 6f 63 6b 73 20 0a 2a 2a 20 6f  nal blocks .** o
c890: 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  f the form:.**.*
c8a0: 2a 20 20 20 69 66 28 20 44 62 55 73 65 4e 72 65  *   if( DbUseNre
c8b0: 28 29 20 29 20 7b 20 2e 2e 2e 20 7d 0a 2a 2f 0a  () ) { ... }.*/.
c8c0: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
c8d0: 54 43 4c 5f 4e 52 45 20 30 0a 23 20 64 65 66 69  TCL_NRE 0.# defi
c8e0: 6e 65 20 44 62 55 73 65 4e 72 65 28 29 20 30 0a  ne DbUseNre() 0.
c8f0: 23 20 64 65 66 69 6e 65 20 54 63 6c 5f 4e 52 41  # define Tcl_NRA
c900: 64 64 43 61 6c 6c 62 61 63 6b 28 61 2c 62 2c 63  ddCallback(a,b,c
c910: 2c 64 2c 65 2c 66 29 20 28 76 6f 69 64 29 30 0a  ,d,e,f) (void)0.
c920: 23 20 64 65 66 69 6e 65 20 54 63 6c 5f 4e 52 45  # define Tcl_NRE
c930: 76 61 6c 4f 62 6a 28 61 2c 62 2c 63 29 20 30 0a  valObj(a,b,c) 0.
c940: 23 20 64 65 66 69 6e 65 20 54 63 6c 5f 4e 52 43  # define Tcl_NRC
c950: 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 61 2c 62  reateCommand(a,b
c960: 2c 63 2c 64 2c 65 2c 66 29 20 28 76 6f 69 64 29  ,c,d,e,f) (void)
c970: 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
c980: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
c990: 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6d 70   part of the imp
c9a0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
c9b0: 68 65 20 63 6f 6d 6d 61 6e 64 3a 0a 2a 2a 0a 2a  he command:.**.*
c9c0: 2a 20 20 20 24 64 62 20 65 76 61 6c 20 53 51 4c  *   $db eval SQL
c9d0: 20 3f 41 52 52 41 59 4e 41 4d 45 3f 20 53 43 52   ?ARRAYNAME? SCR
c9e0: 49 50 54 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  IPT.*/.static in
c9f0: 74 20 44 62 45 76 61 6c 4e 65 78 74 43 6d 64 28  t DbEvalNextCmd(
ca00: 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 64 61  .  ClientData da
ca10: 74 61 5b 5d 2c 20 20 20 20 20 20 20 20 20 20 20  ta[],           
ca20: 20 20 20 20 20 20 20 20 2f 2a 20 64 61 74 61 5b          /* data[
ca30: 30 5d 20 69 73 20 74 68 65 20 28 44 62 45 76 61  0] is the (DbEva
ca40: 6c 43 6f 6e 74 65 78 74 2a 29 20 2a 2f 0a 20 20  lContext*) */.  
ca50: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
ca60: 72 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rp,             
ca70: 20 20 20 20 20 2f 2a 20 54 63 6c 20 69 6e 74 65       /* Tcl inte
ca80: 72 70 72 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74  rpreter */.  int
ca90: 20 72 65 73 75 6c 74 20 20 20 20 20 20 20 20 20   result         
caa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cab0: 20 20 2f 2a 20 52 65 73 75 6c 74 20 73 6f 20 66    /* Result so f
cac0: 61 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ar */.){.  int r
cad0: 63 20 3d 20 72 65 73 75 6c 74 3b 20 20 20 20 20  c = result;     
cae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
caf0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
cb00: 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 66 69 72 73  /..  /* The firs
cb10: 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  t element of the
cb20: 20 64 61 74 61 5b 5d 20 61 72 72 61 79 20 69 73   data[] array is
cb30: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
cb40: 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 0a 20 20  DbEvalContext.  
cb50: 2a 2a 20 73 74 72 75 63 74 75 72 65 20 61 6c 6c  ** structure all
cb60: 6f 63 61 74 65 64 20 75 73 69 6e 67 20 54 63 6c  ocated using Tcl
cb70: 5f 41 6c 6c 6f 63 28 29 2e 20 54 68 65 20 73 65  _Alloc(). The se
cb80: 63 6f 6e 64 20 65 6c 65 6d 65 6e 74 20 6f 66 20  cond element of 
cb90: 64 61 74 61 5b 5d 0a 20 20 2a 2a 20 69 73 20 61  data[].  ** is a
cba0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 54 63   pointer to a Tc
cbb0: 6c 5f 4f 62 6a 20 63 6f 6e 74 61 69 6e 69 6e 67  l_Obj containing
cbc0: 20 74 68 65 20 73 63 72 69 70 74 20 74 6f 20 72   the script to r
cbd0: 75 6e 20 66 6f 72 20 65 61 63 68 20 72 6f 77 0a  un for each row.
cbe0: 20 20 2a 2a 20 72 65 74 75 72 6e 65 64 20 62 79    ** returned by
cbf0: 20 74 68 65 20 71 75 65 72 69 65 73 20 65 6e 63   the queries enc
cc00: 61 70 73 75 6c 61 74 65 64 20 69 6e 20 64 61 74  apsulated in dat
cc10: 61 5b 30 5d 2e 20 2a 2f 0a 20 20 44 62 45 76 61  a[0]. */.  DbEva
cc20: 6c 43 6f 6e 74 65 78 74 20 2a 70 20 3d 20 28 44  lContext *p = (D
cc30: 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 29 64  bEvalContext *)d
cc40: 61 74 61 5b 30 5d 3b 0a 20 20 54 63 6c 5f 4f 62  ata[0];.  Tcl_Ob
cc50: 6a 20 2a 70 53 63 72 69 70 74 20 3d 20 28 54 63  j *pScript = (Tc
cc60: 6c 5f 4f 62 6a 20 2a 29 64 61 74 61 5b 31 5d 3b  l_Obj *)data[1];
cc70: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 41 72 72  .  Tcl_Obj *pArr
cc80: 61 79 20 3d 20 70 2d 3e 70 41 72 72 61 79 3b 0a  ay = p->pArray;.
cc90: 0a 20 20 77 68 69 6c 65 28 20 28 72 63 3d 3d 54  .  while( (rc==T
cca0: 43 4c 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 54 43 4c  CL_OK || rc==TCL
ccb0: 5f 43 4f 4e 54 49 4e 55 45 29 20 26 26 20 54 43  _CONTINUE) && TC
ccc0: 4c 5f 4f 4b 3d 3d 28 72 63 20 3d 20 64 62 45 76  L_OK==(rc = dbEv
ccd0: 61 6c 53 74 65 70 28 70 29 29 20 29 7b 0a 20 20  alStep(p)) ){.  
cce0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74    int i;.    int
ccf0: 20 6e 43 6f 6c 3b 0a 20 20 20 20 54 63 6c 5f 4f   nCol;.    Tcl_O
cd00: 62 6a 20 2a 2a 61 70 43 6f 6c 4e 61 6d 65 3b 0a  bj **apColName;.
cd10: 20 20 20 20 64 62 45 76 61 6c 52 6f 77 49 6e 66      dbEvalRowInf
cd20: 6f 28 70 2c 20 26 6e 43 6f 6c 2c 20 26 61 70 43  o(p, &nCol, &apC
cd30: 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72  olName);.    for
cd40: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
cd50: 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62  +){.      Tcl_Ob
cd60: 6a 20 2a 70 56 61 6c 20 3d 20 64 62 45 76 61 6c  j *pVal = dbEval
cd70: 43 6f 6c 75 6d 6e 56 61 6c 75 65 28 70 2c 20 69  ColumnValue(p, i
cd80: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 72  );.      if( pAr
cd90: 72 61 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ray==0 ){.      
cda0: 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32    Tcl_ObjSetVar2
cdb0: 28 69 6e 74 65 72 70 2c 20 61 70 43 6f 6c 4e 61  (interp, apColNa
cdc0: 6d 65 5b 69 5d 2c 20 30 2c 20 70 56 61 6c 2c 20  me[i], 0, pVal, 
cdd0: 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  0);.      }else{
cde0: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a  .        Tcl_Obj
cdf0: 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20  SetVar2(interp, 
ce00: 70 41 72 72 61 79 2c 20 61 70 43 6f 6c 4e 61 6d  pArray, apColNam
ce10: 65 5b 69 5d 2c 20 70 56 61 6c 2c 20 30 29 3b 0a  e[i], pVal, 0);.
ce20: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
ce30: 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 69 72     /* The requir
ce40: 65 64 20 69 6e 74 65 72 70 72 65 74 65 72 20 76  ed interpreter v
ce50: 61 72 69 61 62 6c 65 73 20 61 72 65 20 6e 6f 77  ariables are now
ce60: 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
ce70: 74 68 65 20 64 61 74 61 20 0a 20 20 20 20 2a 2a  the data .    **
ce80: 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e   from the curren
ce90: 74 20 72 6f 77 2e 20 49 66 20 75 73 69 6e 67 20  t row. If using 
cea0: 4e 52 45 2c 20 73 63 68 65 64 75 6c 65 20 63 61  NRE, schedule ca
ceb0: 6c 6c 62 61 63 6b 73 20 74 6f 20 65 76 61 6c 75  llbacks to evalu
cec0: 61 74 65 0a 20 20 20 20 2a 2a 20 73 63 72 69 70  ate.    ** scrip
ced0: 74 20 70 53 63 72 69 70 74 2c 20 74 68 65 6e 20  t pScript, then 
cee0: 74 6f 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 66  to invoke this f
cef0: 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 20 74 6f  unction again to
cf00: 20 66 65 74 63 68 20 74 68 65 20 6e 65 78 74 0a   fetch the next.
cf10: 20 20 20 20 2a 2a 20 72 6f 77 20 28 6f 72 20 63      ** row (or c
cf20: 6c 65 61 6e 20 75 70 20 69 66 20 74 68 65 72 65  lean up if there
cf30: 20 69 73 20 6e 6f 20 6e 65 78 74 20 72 6f 77 20   is no next row 
cf40: 6f 72 20 74 68 65 20 73 63 72 69 70 74 20 74 68  or the script th
cf50: 72 6f 77 73 20 61 6e 0a 20 20 20 20 2a 2a 20 65  rows an.    ** e
cf60: 78 63 65 70 74 69 6f 6e 29 2e 20 41 66 74 65 72  xception). After
cf70: 20 73 63 68 65 64 75 6c 69 6e 67 20 74 68 65 20   scheduling the 
cf80: 63 61 6c 6c 62 61 63 6b 73 2c 20 72 65 74 75 72  callbacks, retur
cf90: 6e 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65  n control to the
cfa0: 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 2e   .    ** caller.
cfb0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
cfc0: 66 20 6e 6f 74 20 75 73 69 6e 67 20 4e 52 45 2c  f not using NRE,
cfd0: 20 65 76 61 6c 75 61 74 65 20 70 53 63 72 69 70   evaluate pScrip
cfe0: 74 20 64 69 72 65 63 74 6c 79 20 61 6e 64 20 63  t directly and c
cff0: 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 74 68 65  ontinue with the
d000: 0a 20 20 20 20 2a 2a 20 6e 65 78 74 20 69 74 65  .    ** next ite
d010: 72 61 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 77  ration of this w
d020: 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 2e 20  hile(...) loop. 
d030: 20 2a 2f 0a 20 20 20 20 69 66 28 20 44 62 55 73   */.    if( DbUs
d040: 65 4e 72 65 28 29 20 29 7b 0a 20 20 20 20 20 20  eNre() ){.      
d050: 54 63 6c 5f 4e 52 41 64 64 43 61 6c 6c 62 61 63  Tcl_NRAddCallbac
d060: 6b 28 69 6e 74 65 72 70 2c 20 44 62 45 76 61 6c  k(interp, DbEval
d070: 4e 65 78 74 43 6d 64 2c 20 28 76 6f 69 64 2a 29  NextCmd, (void*)
d080: 70 2c 20 28 76 6f 69 64 2a 29 70 53 63 72 69 70  p, (void*)pScrip
d090: 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 0, 0);.      
d0a0: 72 65 74 75 72 6e 20 54 63 6c 5f 4e 52 45 76 61  return Tcl_NREva
d0b0: 6c 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 53 63  lObj(interp, pSc
d0c0: 72 69 70 74 2c 20 30 29 3b 0a 20 20 20 20 7d 65  ript, 0);.    }e
d0d0: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
d0e0: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e  Tcl_EvalObjEx(in
d0f0: 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20 30  terp, pScript, 0
d100: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
d110: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
d120: 28 70 53 63 72 69 70 74 29 3b 0a 20 20 64 62 45  (pScript);.  dbE
d130: 76 61 6c 46 69 6e 61 6c 69 7a 65 28 70 29 3b 0a  valFinalize(p);.
d140: 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72    Tcl_Free((char
d150: 20 2a 29 70 29 3b 0a 0a 20 20 69 66 28 20 72 63   *)p);..  if( rc
d160: 3d 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 72 63 3d 3d  ==TCL_OK || rc==
d170: 54 43 4c 5f 42 52 45 41 4b 20 29 7b 0a 20 20 20  TCL_BREAK ){.   
d180: 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74   Tcl_ResetResult
d190: 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 63  (interp);.    rc
d1a0: 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 7d 0a 20   = TCL_OK;.  }. 
d1b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
d1c0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
d1d0: 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20 74 68  on is used by th
d1e0: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
d1f0: 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s of the followi
d200: 6e 67 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  ng database .** 
d210: 68 61 6e 64 6c 65 20 73 75 62 2d 63 6f 6d 6d 61  handle sub-comma
d220: 6e 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 24 64 62  nds:.**.**   $db
d230: 20 75 70 64 61 74 65 5f 68 6f 6f 6b 20 3f 53 43   update_hook ?SC
d240: 52 49 50 54 3f 0a 2a 2a 20 20 20 24 64 62 20 77  RIPT?.**   $db w
d250: 61 6c 5f 68 6f 6f 6b 20 3f 53 43 52 49 50 54 3f  al_hook ?SCRIPT?
d260: 0a 2a 2a 20 20 20 24 64 62 20 63 6f 6d 6d 69 74  .**   $db commit
d270: 5f 68 6f 6f 6b 20 3f 53 43 52 49 50 54 3f 0a 2a  _hook ?SCRIPT?.*
d280: 2a 20 20 20 24 64 62 20 70 72 65 75 70 64 61 74  *   $db preupdat
d290: 65 20 68 6f 6f 6b 20 3f 53 43 52 49 50 54 3f 0a  e hook ?SCRIPT?.
d2a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 44  */.static void D
d2b0: 62 48 6f 6f 6b 43 6d 64 28 0a 20 20 54 63 6c 5f  bHookCmd(.  Tcl_
d2c0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
d2d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
d2e0: 63 6c 20 69 6e 74 65 72 70 72 65 74 65 72 20 2a  cl interpreter *
d2f0: 2f 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  /.  SqliteDb *pD
d300: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
d310: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
d320: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 54 63 6c 5f  handle */.  Tcl_
d330: 4f 62 6a 20 2a 70 41 72 67 2c 20 20 20 20 20 20  Obj *pArg,      
d340: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
d350: 43 52 49 50 54 20 61 72 67 75 6d 65 6e 74 20 28  CRIPT argument (
d360: 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 54 63  or NULL) */.  Tc
d370: 6c 5f 4f 62 6a 20 2a 2a 70 70 48 6f 6f 6b 20 20  l_Obj **ppHook  
d380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d390: 20 50 6f 69 6e 74 65 72 20 74 6f 20 6d 65 6d 62   Pointer to memb
d3a0: 65 72 20 6f 66 20 53 71 6c 69 74 65 44 62 20 2a  er of SqliteDb *
d3b0: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
d3c0: 64 62 20 3d 20 70 44 62 2d 3e 64 62 3b 0a 0a 20  db = pDb->db;.. 
d3d0: 20 69 66 28 20 2a 70 70 48 6f 6f 6b 20 29 7b 0a   if( *ppHook ){.
d3e0: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
d3f0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 2a 70 70  sult(interp, *pp
d400: 48 6f 6f 6b 29 3b 0a 20 20 20 20 69 66 28 20 70  Hook);.    if( p
d410: 41 72 67 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  Arg ){.      Tcl
d420: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 2a 70  _DecrRefCount(*p
d430: 70 48 6f 6f 6b 29 3b 0a 20 20 20 20 20 20 2a 70  pHook);.      *p
d440: 70 48 6f 6f 6b 20 3d 20 30 3b 0a 20 20 20 20 7d  pHook = 0;.    }
d450: 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 72 67 20  .  }.  if( pArg 
d460: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
d470: 28 2a 70 70 48 6f 6f 6b 29 20 29 3b 0a 20 20 20  (*ppHook) );.   
d480: 20 69 66 28 20 54 63 6c 5f 47 65 74 43 68 61 72   if( Tcl_GetChar
d490: 4c 65 6e 67 74 68 28 70 41 72 67 29 3e 30 20 29  Length(pArg)>0 )
d4a0: 7b 0a 20 20 20 20 20 20 2a 70 70 48 6f 6f 6b 20  {.      *ppHook 
d4b0: 3d 20 70 41 72 67 3b 0a 20 20 20 20 20 20 54 63  = pArg;.      Tc
d4c0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 2a  l_IncrRefCount(*
d4d0: 70 70 48 6f 6f 6b 29 3b 0a 20 20 20 20 7d 0a 20  ppHook);.    }. 
d4e0: 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
d4f0: 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41  E_ENABLE_PREUPDA
d500: 54 45 5f 48 4f 4f 4b 0a 20 20 73 71 6c 69 74 65  TE_HOOK.  sqlite
d510: 33 5f 70 72 65 75 70 64 61 74 65 5f 68 6f 6f 6b  3_preupdate_hook
d520: 28 64 62 2c 20 28 70 44 62 2d 3e 70 50 72 65 55  (db, (pDb->pPreU
d530: 70 64 61 74 65 48 6f 6f 6b 3f 44 62 50 72 65 55  pdateHook?DbPreU
d540: 70 64 61 74 65 48 61 6e 64 6c 65 72 3a 30 29 2c  pdateHandler:0),
d550: 20 70 44 62 29 3b 0a 23 65 6e 64 69 66 0a 20 20   pDb);.#endif.  
d560: 73 71 6c 69 74 65 33 5f 75 70 64 61 74 65 5f 68  sqlite3_update_h
d570: 6f 6f 6b 28 64 62 2c 20 28 70 44 62 2d 3e 70 55  ook(db, (pDb->pU
d580: 70 64 61 74 65 48 6f 6f 6b 3f 44 62 55 70 64 61  pdateHook?DbUpda
d590: 74 65 48 61 6e 64 6c 65 72 3a 30 29 2c 20 70 44  teHandler:0), pD
d5a0: 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 6f  b);.  sqlite3_ro
d5b0: 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28 64 62 2c 20  llback_hook(db, 
d5c0: 28 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48  (pDb->pRollbackH
d5d0: 6f 6f 6b 3f 44 62 52 6f 6c 6c 62 61 63 6b 48 61  ook?DbRollbackHa
d5e0: 6e 64 6c 65 72 3a 30 29 2c 20 70 44 62 29 3b 0a  ndler:0), pDb);.
d5f0: 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f    sqlite3_wal_ho
d600: 6f 6b 28 64 62 2c 20 28 70 44 62 2d 3e 70 57 61  ok(db, (pDb->pWa
d610: 6c 48 6f 6f 6b 3f 44 62 57 61 6c 48 61 6e 64 6c  lHook?DbWalHandl
d620: 65 72 3a 30 29 2c 20 70 44 62 29 3b 0a 7d 0a 0a  er:0), pDb);.}..
d630: 2f 2a 0a 2a 2a 20 54 68 65 20 22 73 71 6c 69 74  /*.** The "sqlit
d640: 65 22 20 63 6f 6d 6d 61 6e 64 20 62 65 6c 6f 77  e" command below
d650: 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 20 54   creates a new T
d660: 63 6c 20 63 6f 6d 6d 61 6e 64 20 66 6f 72 20 65  cl command for e
d670: 61 63 68 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  ach.** connectio
d680: 6e 20 69 74 20 6f 70 65 6e 73 20 74 6f 20 61 6e  n it opens to an
d690: 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
d6a0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
d6b0: 69 73 20 69 6e 76 6f 6b 65 64 0a 2a 2a 20 77 68  is invoked.** wh
d6c0: 65 6e 65 76 65 72 20 6f 6e 65 20 6f 66 20 74 68  enever one of th
d6d0: 6f 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2d 73  ose connection-s
d6e0: 70 65 63 69 66 69 63 20 63 6f 6d 6d 61 6e 64 73  pecific commands
d6f0: 20 69 73 20 65 78 65 63 75 74 65 64 0a 2a 2a 20   is executed.** 
d700: 69 6e 20 54 63 6c 2e 20 20 46 6f 72 20 65 78 61  in Tcl.  For exa
d710: 6d 70 6c 65 2c 20 69 66 20 79 6f 75 20 72 75 6e  mple, if you run
d720: 20 54 63 6c 20 63 6f 64 65 20 6c 69 6b 65 20 74   Tcl code like t
d730: 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
d740: 20 73 71 6c 69 74 65 33 20 64 62 31 20 20 22 6d   sqlite3 db1  "m
d750: 79 5f 64 61 74 61 62 61 73 65 22 0a 2a 2a 20 20  y_database".**  
d760: 20 20 20 20 20 64 62 31 20 63 6c 6f 73 65 0a 2a       db1 close.*
d770: 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 63  *.** The first c
d780: 6f 6d 6d 61 6e 64 20 6f 70 65 6e 73 20 61 20 63  ommand opens a c
d790: 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65  onnection to the
d7a0: 20 22 6d 79 5f 64 61 74 61 62 61 73 65 22 20 64   "my_database" d
d7b0: 61 74 61 62 61 73 65 0a 2a 2a 20 61 6e 64 20 63  atabase.** and c
d7c0: 61 6c 6c 73 20 74 68 61 74 20 63 6f 6e 6e 65 63  alls that connec
d7d0: 74 69 6f 6e 20 22 64 62 31 22 2e 20 20 54 68 65  tion "db1".  The
d7e0: 20 73 65 63 6f 6e 64 20 63 6f 6d 6d 61 6e 64 20   second command 
d7f0: 63 61 75 73 65 73 20 74 68 69 73 0a 2a 2a 20 73  causes this.** s
d800: 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 62 65 20  ubroutine to be 
d810: 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74  invoked..*/.stat
d820: 69 63 20 69 6e 74 20 44 62 4f 62 6a 43 6d 64 28  ic int DbObjCmd(
d830: 76 6f 69 64 20 2a 63 64 2c 20 54 63 6c 5f 49 6e  void *cd, Tcl_In
d840: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
d850: 74 20 6f 62 6a 63 2c 54 63 6c 5f 4f 62 6a 20 2a  t objc,Tcl_Obj *
d860: 63 6f 6e 73 74 2a 6f 62 6a 76 29 7b 0a 20 20 53  const*objv){.  S
d870: 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28  qliteDb *pDb = (
d880: 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20  SqliteDb*)cd;.  
d890: 69 6e 74 20 63 68 6f 69 63 65 3b 0a 20 20 69 6e  int choice;.  in
d8a0: 74 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20  t rc = TCL_OK;. 
d8b0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
d8c0: 61 72 20 2a 44 42 5f 73 74 72 73 5b 5d 20 3d 20  ar *DB_strs[] = 
d8d0: 7b 0a 20 20 20 20 22 61 75 74 68 6f 72 69 7a 65  {.    "authorize
d8e0: 72 22 2c 20 20 20 20 20 20 20 20 20 22 62 61 63  r",         "bac
d8f0: 6b 75 70 22 2c 20 20 20 20 20 20 20 20 20 20 20  kup",           
d900: 20 22 62 75 73 79 22 2c 0a 20 20 20 20 22 63 61   "busy",.    "ca
d910: 63 68 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  che",           
d920: 20 20 20 22 63 68 61 6e 67 65 73 22 2c 20 20 20     "changes",   
d930: 20 20 20 20 20 20 20 20 22 63 6c 6f 73 65 22 2c          "close",
d940: 0a 20 20 20 20 22 63 6f 6c 6c 61 74 65 22 2c 20  .    "collate", 
d950: 20 20 20 20 20 20 20 20 20 20 20 22 63 6f 6c 6c             "coll
d960: 61 74 69 6f 6e 5f 6e 65 65 64 65 64 22 2c 20 20  ation_needed",  
d970: 22 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 22 2c 0a 20  "commit_hook",. 
d980: 20 20 20 22 63 6f 6d 70 6c 65 74 65 22 2c 20 20     "complete",  
d990: 20 20 20 20 20 20 20 20 20 22 63 6f 70 79 22 2c           "copy",
d9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 65                "e
d9b0: 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e  nable_load_exten
d9c0: 73 69 6f 6e 22 2c 0a 20 20 20 20 22 65 72 72 6f  sion",.    "erro
d9d0: 72 63 6f 64 65 22 2c 20 20 20 20 20 20 20 20 20  rcode",         
d9e0: 20 22 65 76 61 6c 22 2c 20 20 20 20 20 20 20 20   "eval",        
d9f0: 20 20 20 20 20 20 22 65 78 69 73 74 73 22 2c 0a        "exists",.
da00: 20 20 20 20 22 66 75 6e 63 74 69 6f 6e 22 2c 20      "function", 
da10: 20 20 20 20 20 20 20 20 20 20 22 69 6e 63 72 62            "incrb
da20: 6c 6f 62 22 2c 20 20 20 20 20 20 20 20 20 20 22  lob",          "
da30: 69 6e 74 65 72 72 75 70 74 22 2c 0a 20 20 20 20  interrupt",.    
da40: 22 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77  "last_insert_row
da50: 69 64 22 2c 20 20 22 6e 75 6c 6c 76 61 6c 75 65  id",  "nullvalue
da60: 22 2c 20 20 20 20 20 20 20 20 20 22 6f 6e 65 63  ",         "onec
da70: 6f 6c 75 6d 6e 22 2c 0a 20 20 20 20 22 70 72 65  olumn",.    "pre
da80: 75 70 64 61 74 65 22 2c 20 20 20 20 20 20 20 20  update",        
da90: 20 20 22 70 72 6f 66 69 6c 65 22 2c 20 20 20 20    "profile",    
daa0: 20 20 20 20 20 20 20 22 70 72 6f 67 72 65 73 73         "progress
dab0: 22 2c 0a 20 20 20 20 22 72 65 6b 65 79 22 2c 20  ",.    "rekey", 
dac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 72 65               "re
dad0: 73 74 6f 72 65 22 2c 20 20 20 20 20 20 20 20 20  store",         
dae0: 20 20 22 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b    "rollback_hook
daf0: 22 2c 0a 20 20 20 20 22 73 74 61 74 75 73 22 2c  ",.    "status",
db00: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 74 69               "ti
db10: 6d 65 6f 75 74 22 2c 20 20 20 20 20 20 20 20 20  meout",         
db20: 20 20 22 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73    "total_changes
db30: 22 2c 0a 20 20 20 20 22 74 72 61 63 65 22 2c 20  ",.    "trace", 
db40: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 74 72               "tr
db50: 61 6e 73 61 63 74 69 6f 6e 22 2c 20 20 20 20 20  ansaction",     
db60: 20 20 22 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79    "unlock_notify
db70: 22 2c 0a 20 20 20 20 22 75 70 64 61 74 65 5f 68  ",.    "update_h
db80: 6f 6f 6b 22 2c 20 20 20 20 20 20 20 20 22 76 65  ook",        "ve
db90: 72 73 69 6f 6e 22 2c 20 20 20 20 20 20 20 20 20  rsion",         
dba0: 20 20 22 77 61 6c 5f 68 6f 6f 6b 22 2c 0a 20 20    "wal_hook",.  
dbb0: 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
dbc0: 20 20 20 20 20 20 20 0a 20 20 7d 3b 0a 20 20 65         .  };.  e
dbd0: 6e 75 6d 20 44 42 5f 65 6e 75 6d 20 7b 0a 20 20  num DB_enum {.  
dbe0: 20 20 44 42 5f 41 55 54 48 4f 52 49 5a 45 52 2c    DB_AUTHORIZER,
dbf0: 20 20 20 20 20 20 20 20 44 42 5f 42 41 43 4b 55          DB_BACKU
dc00: 50 2c 20 20 20 20 20 20 20 20 20 20 20 44 42 5f  P,           DB_
dc10: 42 55 53 59 2c 0a 20 20 20 20 44 42 5f 43 41 43  BUSY,.    DB_CAC
dc20: 48 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  HE,             
dc30: 44 42 5f 43 48 41 4e 47 45 53 2c 20 20 20 20 20  DB_CHANGES,     
dc40: 20 20 20 20 20 44 42 5f 43 4c 4f 53 45 2c 0a 20       DB_CLOSE,. 
dc50: 20 20 20 44 42 5f 43 4f 4c 4c 41 54 45 2c 20 20     DB_COLLATE,  
dc60: 20 20 20 20 20 20 20 20 20 44 42 5f 43 4f 4c 4c           DB_COLL
dc70: 41 54 49 4f 4e 5f 4e 45 45 44 45 44 2c 20 44 42  ATION_NEEDED, DB
dc80: 5f 43 4f 4d 4d 49 54 5f 48 4f 4f 4b 2c 0a 20 20  _COMMIT_HOOK,.  
dc90: 20 20 44 42 5f 43 4f 4d 50 4c 45 54 45 2c 20 20    DB_COMPLETE,  
dca0: 20 20 20 20 20 20 20 20 44 42 5f 43 4f 50 59 2c          DB_COPY,
dcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f               DB_
dcc0: 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45  ENABLE_LOAD_EXTE
dcd0: 4e 53 49 4f 4e 2c 0a 20 20 20 20 44 42 5f 45 52  NSION,.    DB_ER
dce0: 52 4f 52 43 4f 44 45 2c 20 20 20 20 20 20 20 20  RORCODE,        
dcf0: 20 44 42 5f 45 56 41 4c 2c 20 20 20 20 20 20 20   DB_EVAL,       
dd00: 20 20 20 20 20 20 44 42 5f 45 58 49 53 54 53 2c        DB_EXISTS,
dd10: 0a 20 20 20 20 44 42 5f 46 55 4e 43 54 49 4f 4e  .    DB_FUNCTION
dd20: 2c 20 20 20 20 20 20 20 20 20 20 44 42 5f 49 4e  ,          DB_IN
dd30: 43 52 42 4c 4f 42 2c 20 20 20 20 20 20 20 20 20  CRBLOB,         
dd40: 44 42 5f 49 4e 54 45 52 52 55 50 54 2c 0a 20 20  DB_INTERRUPT,.  
dd50: 20 20 44 42 5f 4c 41 53 54 5f 49 4e 53 45 52 54    DB_LAST_INSERT
dd60: 5f 52 4f 57 49 44 2c 20 44 42 5f 4e 55 4c 4c 56  _ROWID, DB_NULLV
dd70: 41 4c 55 45 2c 20 20 20 20 20 20 20 20 44 42 5f  ALUE,        DB_
dd80: 4f 4e 45 43 4f 4c 55 4d 4e 2c 0a 20 20 20 20 44  ONECOLUMN,.    D
dd90: 42 5f 50 52 45 55 50 44 41 54 45 2c 20 20 20 20  B_PREUPDATE,    
dda0: 20 20 20 20 20 44 42 5f 50 52 4f 46 49 4c 45 2c       DB_PROFILE,
ddb0: 20 20 20 20 20 20 20 20 20 20 44 42 5f 50 52 4f            DB_PRO
ddc0: 47 52 45 53 53 2c 0a 20 20 20 20 44 42 5f 52 45  GRESS,.    DB_RE
ddd0: 4b 45 59 2c 20 20 20 20 20 20 20 20 20 20 20 20  KEY,            
dde0: 20 44 42 5f 52 45 53 54 4f 52 45 2c 20 20 20 20   DB_RESTORE,    
ddf0: 20 20 20 20 20 20 44 42 5f 52 4f 4c 4c 42 41 43        DB_ROLLBAC
de00: 4b 5f 48 4f 4f 4b 2c 0a 20 20 20 20 44 42 5f 53  K_HOOK,.    DB_S
de10: 54 41 54 55 53 2c 20 20 20 20 20 20 20 20 20 20  TATUS,          
de20: 20 20 44 42 5f 54 49 4d 45 4f 55 54 2c 20 20 20    DB_TIMEOUT,   
de30: 20 20 20 20 20 20 20 44 42 5f 54 4f 54 41 4c 5f         DB_TOTAL_
de40: 43 48 41 4e 47 45 53 2c 0a 20 20 20 20 44 42 5f  CHANGES,.    DB_
de50: 54 52 41 43 45 2c 20 20 20 20 20 20 20 20 20 20  TRACE,          
de60: 20 20 20 44 42 5f 54 52 41 4e 53 41 43 54 49 4f     DB_TRANSACTIO
de70: 4e 2c 20 20 20 20 20 20 44 42 5f 55 4e 4c 4f 43  N,      DB_UNLOC
de80: 4b 5f 4e 4f 54 49 46 59 2c 0a 20 20 20 20 44 42  K_NOTIFY,.    DB
de90: 5f 55 50 44 41 54 45 5f 48 4f 4f 4b 2c 20 20 20  _UPDATE_HOOK,   
dea0: 20 20 20 20 44 42 5f 56 45 52 53 49 4f 4e 2c 20      DB_VERSION, 
deb0: 20 20 20 20 20 20 20 20 20 44 42 5f 57 41 4c 5f           DB_WAL_
dec0: 48 4f 4f 4b 2c 0a 20 20 7d 3b 0a 20 20 2f 2a 20  HOOK,.  };.  /* 
ded0: 64 6f 6e 27 74 20 6c 65 61 76 65 20 74 72 61 69  don't leave trai
dee0: 6c 69 6e 67 20 63 6f 6d 6d 61 73 20 6f 6e 20 44  ling commas on D
def0: 42 5f 65 6e 75 6d 2c 20 69 74 20 63 6f 6e 66 75  B_enum, it confu
df00: 73 65 73 20 74 68 65 20 41 49 58 20 78 6c 63 20  ses the AIX xlc 
df10: 63 6f 6d 70 69 6c 65 72 20 2a 2f 0a 0a 20 20 69  compiler */..  i
df20: 66 28 20 6f 62 6a 63 3c 32 20 29 7b 0a 20 20 20  f( objc<2 ){.   
df30: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
df40: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
df50: 76 2c 20 22 53 55 42 43 4f 4d 4d 41 4e 44 20 2e  v, "SUBCOMMAND .
df60: 2e 2e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ..");.    return
df70: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
df80: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 64    if( Tcl_GetInd
df90: 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  exFromObj(interp
dfa0: 2c 20 6f 62 6a 76 5b 31 5d 2c 20 44 42 5f 73 74  , objv[1], DB_st
dfb0: 72 73 2c 20 22 6f 70 74 69 6f 6e 22 2c 20 30 2c  rs, "option", 0,
dfc0: 20 26 63 68 6f 69 63 65 29 20 29 7b 0a 20 20 20   &choice) ){.   
dfd0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
dfe0: 52 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68  R;.  }..  switch
dff0: 28 20 28 65 6e 75 6d 20 44 42 5f 65 6e 75 6d 29  ( (enum DB_enum)
e000: 63 68 6f 69 63 65 20 29 7b 0a 0a 20 20 2f 2a 20  choice ){..  /* 
e010: 20 20 20 24 64 62 20 61 75 74 68 6f 72 69 7a 65     $db authorize
e020: 72 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a  r ?CALLBACK?.  *
e030: 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  *.  ** Invoke th
e040: 65 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b  e given callback
e050: 20 74 6f 20 61 75 74 68 6f 72 69 7a 65 20 65 61   to authorize ea
e060: 63 68 20 53 51 4c 20 6f 70 65 72 61 74 69 6f 6e  ch SQL operation
e070: 20 61 73 20 69 74 20 69 73 0a 20 20 2a 2a 20 63   as it is.  ** c
e080: 6f 6d 70 69 6c 65 64 2e 20 20 35 20 61 72 67 75  ompiled.  5 argu
e090: 6d 65 6e 74 73 20 61 72 65 20 61 70 70 65 6e 64  ments are append
e0a0: 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61  ed to the callba
e0b0: 63 6b 20 62 65 66 6f 72 65 20 69 74 20 69 73 0a  ck before it is.
e0c0: 20 20 2a 2a 20 69 6e 76 6f 6b 65 64 3a 0a 20 20    ** invoked:.  
e0d0: 2a 2a 0a 20 20 2a 2a 20 20 20 28 31 29 20 54 68  **.  **   (1) Th
e0e0: 65 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  e authorization 
e0f0: 74 79 70 65 20 28 65 78 3a 20 53 51 4c 49 54 45  type (ex: SQLITE
e100: 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 2c 20 53  _CREATE_TABLE, S
e110: 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 2e 2e  QLITE_INSERT, ..
e120: 2e 29 0a 20 20 2a 2a 20 20 20 28 32 29 20 46 69  .).  **   (2) Fi
e130: 72 73 74 20 64 65 73 63 72 69 70 74 69 76 65 20  rst descriptive 
e140: 6e 61 6d 65 20 28 64 65 70 65 6e 64 73 20 6f 6e  name (depends on
e150: 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74   authorization t
e160: 79 70 65 29 0a 20 20 2a 2a 20 20 20 28 33 29 20  ype).  **   (3) 
e170: 53 65 63 6f 6e 64 20 64 65 73 63 72 69 70 74 69  Second descripti
e180: 76 65 20 6e 61 6d 65 0a 20 20 2a 2a 20 20 20 28  ve name.  **   (
e190: 34 29 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  4) Name of the d
e1a0: 61 74 61 62 61 73 65 20 28 65 78 3a 20 22 6d 61  atabase (ex: "ma
e1b0: 69 6e 22 2c 20 22 74 65 6d 70 22 29 0a 20 20 2a  in", "temp").  *
e1c0: 2a 20 20 20 28 35 29 20 4e 61 6d 65 20 6f 66 20  *   (5) Name of 
e1d0: 74 72 69 67 67 65 72 20 74 68 61 74 20 69 73 20  trigger that is 
e1e0: 64 6f 69 6e 67 20 74 68 65 20 61 63 63 65 73 73  doing the access
e1f0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63  .  **.  ** The c
e200: 61 6c 6c 62 61 63 6b 20 73 68 6f 75 6c 64 20 72  allback should r
e210: 65 74 75 72 6e 20 6f 6e 20 6f 66 20 74 68 65 20  eturn on of the 
e220: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 69 6e 67  following string
e230: 73 3a 20 53 51 4c 49 54 45 5f 4f 4b 2c 0a 20 20  s: SQLITE_OK,.  
e240: 2a 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  ** SQLITE_IGNORE
e250: 2c 20 6f 72 20 53 51 4c 49 54 45 5f 44 45 4e 59  , or SQLITE_DENY
e260: 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74  .  Any other ret
e270: 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61 6e 20  urn value is an 
e280: 65 72 72 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  error..  **.  **
e290: 20 49 66 20 74 68 69 73 20 6d 65 74 68 6f 64 20   If this method 
e2a0: 69 73 20 69 6e 76 6f 6b 65 64 20 77 69 74 68 20  is invoked with 
e2b0: 6e 6f 20 61 72 67 75 6d 65 6e 74 73 2c 20 74 68  no arguments, th
e2c0: 65 20 63 75 72 72 65 6e 74 20 61 75 74 68 6f 72  e current author
e2d0: 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 63 61 6c  ization.  ** cal
e2e0: 6c 62 61 63 6b 20 73 74 72 69 6e 67 20 69 73 20  lback string is 
e2f0: 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2f 0a 20  returned..  */. 
e300: 20 63 61 73 65 20 44 42 5f 41 55 54 48 4f 52 49   case DB_AUTHORI
e310: 5a 45 52 3a 20 7b 0a 23 69 66 64 65 66 20 53 51  ZER: {.#ifdef SQ
e320: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
e330: 49 5a 41 54 49 4f 4e 0a 20 20 20 20 54 63 6c 5f  IZATION.    Tcl_
e340: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
e350: 65 72 70 2c 20 22 61 75 74 68 6f 72 69 7a 61 74  erp, "authorizat
e360: 69 6f 6e 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  ion not availabl
e370: 65 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64 22  e in this build"
e380: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e390: 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 30 29         (char*)0)
e3a0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
e3b0: 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20  _ERROR;.#else.  
e3c0: 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a    if( objc>3 ){.
e3d0: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
e3e0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
e3f0: 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41  , objv, "?CALLBA
e400: 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74  CK?");.      ret
e410: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
e420: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a     }else if( obj
e430: 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66  c==2 ){.      if
e440: 28 20 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a  ( pDb->zAuth ){.
e450: 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65          Tcl_Appe
e460: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
e470: 20 70 44 62 2d 3e 7a 41 75 74 68 2c 20 28 63 68   pDb->zAuth, (ch
e480: 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ar*)0);.      }.
e490: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e4a0: 20 63 68 61 72 20 2a 7a 41 75 74 68 3b 0a 20 20   char *zAuth;.  
e4b0: 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
e4c0: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74     if( pDb->zAut
e4d0: 68 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  h ){.        Tcl
e4e0: 5f 46 72 65 65 28 70 44 62 2d 3e 7a 41 75 74 68  _Free(pDb->zAuth
e4f0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
e500: 20 7a 41 75 74 68 20 3d 20 54 63 6c 5f 47 65 74   zAuth = Tcl_Get
e510: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
e520: 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20  jv[2], &len);.  
e530: 20 20 20 20 69 66 28 20 7a 41 75 74 68 20 26 26      if( zAuth &&
e540: 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20   len>0 ){.      
e550: 20 20 70 44 62 2d 3e 7a 41 75 74 68 20 3d 20 54    pDb->zAuth = T
e560: 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20  cl_Alloc( len + 
e570: 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  1 );.        mem
e580: 63 70 79 28 70 44 62 2d 3e 7a 41 75 74 68 2c 20  cpy(pDb->zAuth, 
e590: 7a 41 75 74 68 2c 20 6c 65 6e 2b 31 29 3b 0a 20  zAuth, len+1);. 
e5a0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
e5b0: 20 20 20 20 70 44 62 2d 3e 7a 41 75 74 68 20 3d      pDb->zAuth =
e5c0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
e5d0: 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74 68    if( pDb->zAuth
e5e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 74 79 70 65   ){.        type
e5f0: 64 65 66 20 69 6e 74 20 28 2a 73 71 6c 69 74 65  def int (*sqlite
e600: 33 5f 61 75 74 68 5f 63 62 29 28 0a 20 20 20 20  3_auth_cb)(.    
e610: 20 20 20 20 20 20 20 76 6f 69 64 2a 2c 69 6e 74         void*,int
e620: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e  ,const char*,con
e630: 73 74 20 63 68 61 72 2a 2c 0a 20 20 20 20 20 20  st char*,.      
e640: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 2a       const char*
e650: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20  ,const char*);. 
e660: 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65         pDb->inte
e670: 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20  rp = interp;.   
e680: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74       sqlite3_set
e690: 5f 61 75 74 68 6f 72 69 7a 65 72 28 70 44 62 2d  _authorizer(pDb-
e6a0: 3e 64 62 2c 28 73 71 6c 69 74 65 33 5f 61 75 74  >db,(sqlite3_aut
e6b0: 68 5f 63 62 29 61 75 74 68 5f 63 61 6c 6c 62 61  h_cb)auth_callba
e6c0: 63 6b 2c 70 44 62 29 3b 0a 20 20 20 20 20 20 7d  ck,pDb);.      }
e6d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
e6e0: 6c 69 74 65 33 5f 73 65 74 5f 61 75 74 68 6f 72  lite3_set_author
e6f0: 69 7a 65 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c  izer(pDb->db, 0,
e700: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
e710: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72   }.#endif.    br
e720: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
e730: 20 20 24 64 62 20 62 61 63 6b 75 70 20 3f 44 41    $db backup ?DA
e740: 54 41 42 41 53 45 3f 20 46 49 4c 45 4e 41 4d 45  TABASE? FILENAME
e750: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 70 65 6e 20  .  **.  ** Open 
e760: 6f 72 20 63 72 65 61 74 65 20 61 20 64 61 74 61  or create a data
e770: 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 64 20  base file named 
e780: 46 49 4c 45 4e 41 4d 45 2e 20 20 54 72 61 6e 73  FILENAME.  Trans
e790: 66 65 72 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6e  fer the.  ** con
e7a0: 74 65 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 64 61  tent of local da
e7b0: 74 61 62 61 73 65 20 44 41 54 41 42 41 53 45 20  tabase DATABASE 
e7c0: 28 64 65 66 61 75 6c 74 3a 20 22 6d 61 69 6e 22  (default: "main"
e7d0: 29 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20  ) into the.  ** 
e7e0: 46 49 4c 45 4e 41 4d 45 20 64 61 74 61 62 61 73  FILENAME databas
e7f0: 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  e..  */.  case D
e800: 42 5f 42 41 43 4b 55 50 3a 20 7b 0a 20 20 20 20  B_BACKUP: {.    
e810: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 73  const char *zDes
e820: 74 46 69 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74  tFile;.    const
e830: 20 63 68 61 72 20 2a 7a 53 72 63 44 62 3b 0a 20   char *zSrcDb;. 
e840: 20 20 20 73 71 6c 69 74 65 33 20 2a 70 44 65 73     sqlite3 *pDes
e850: 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  t;.    sqlite3_b
e860: 61 63 6b 75 70 20 2a 70 42 61 63 6b 75 70 3b 0a  ackup *pBackup;.
e870: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33  .    if( objc==3
e880: 20 29 7b 0a 20 20 20 20 20 20 7a 53 72 63 44 62   ){.      zSrcDb
e890: 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 20   = "main";.     
e8a0: 20 7a 44 65 73 74 46 69 6c 65 20 3d 20 54 63 6c   zDestFile = Tcl
e8b0: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
e8c0: 32 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  2]);.    }else i
e8d0: 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20  f( objc==4 ){.  
e8e0: 20 20 20 20 7a 53 72 63 44 62 20 3d 20 54 63 6c      zSrcDb = Tcl
e8f0: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
e900: 32 5d 29 3b 0a 20 20 20 20 20 20 7a 44 65 73 74  2]);.      zDest
e910: 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  File = Tcl_GetSt
e920: 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20  ring(objv[3]);. 
e930: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e940: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
e950: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
e960: 2c 20 22 3f 44 41 54 41 42 41 53 45 3f 20 46 49  , "?DATABASE? FI
e970: 4c 45 4e 41 4d 45 22 29 3b 0a 20 20 20 20 20 20  LENAME");.      
e980: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
e990: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
e9a0: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 44   sqlite3_open(zD
e9b0: 65 73 74 46 69 6c 65 2c 20 26 70 44 65 73 74 29  estFile, &pDest)
e9c0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
e9d0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
e9e0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
e9f0: 74 28 69 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f  t(interp, "canno
ea00: 74 20 6f 70 65 6e 20 74 61 72 67 65 74 20 64 61  t open target da
ea10: 74 61 62 61 73 65 3a 20 22 2c 0a 20 20 20 20 20  tabase: ",.     
ea20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72        sqlite3_er
ea30: 72 6d 73 67 28 70 44 65 73 74 29 2c 20 28 63 68  rmsg(pDest), (ch
ea40: 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 73 71  ar*)0);.      sq
ea50: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 44 65 73  lite3_close(pDes
ea60: 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
ea70: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
ea80: 7d 0a 20 20 20 20 70 42 61 63 6b 75 70 20 3d 20  }.    pBackup = 
ea90: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 69  sqlite3_backup_i
eaa0: 6e 69 74 28 70 44 65 73 74 2c 20 22 6d 61 69 6e  nit(pDest, "main
eab0: 22 2c 20 70 44 62 2d 3e 64 62 2c 20 7a 53 72 63  ", pDb->db, zSrc
eac0: 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70 42 61  Db);.    if( pBa
ead0: 63 6b 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ckup==0 ){.     
eae0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
eaf0: 74 28 69 6e 74 65 72 70 2c 20 22 62 61 63 6b 75  t(interp, "backu
eb00: 70 20 66 61 69 6c 65 64 3a 20 22 2c 0a 20 20 20  p failed: ",.   
eb10: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
eb20: 65 72 72 6d 73 67 28 70 44 65 73 74 29 2c 20 28  errmsg(pDest), (
eb30: 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
eb40: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 44  sqlite3_close(pD
eb50: 65 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  est);.      retu
eb60: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
eb70: 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 20    }.    while(  
eb80: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 61  (rc = sqlite3_ba
eb90: 63 6b 75 70 5f 73 74 65 70 28 70 42 61 63 6b 75  ckup_step(pBacku
eba0: 70 2c 31 30 30 29 29 3d 3d 53 51 4c 49 54 45 5f  p,100))==SQLITE_
ebb0: 4f 4b 20 29 7b 7d 0a 20 20 20 20 73 71 6c 69 74  OK ){}.    sqlit
ebc0: 65 33 5f 62 61 63 6b 75 70 5f 66 69 6e 69 73 68  e3_backup_finish
ebd0: 28 70 42 61 63 6b 75 70 29 3b 0a 20 20 20 20 69  (pBackup);.    i
ebe0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
ebf0: 4e 45 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  NE ){.      rc =
ec00: 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c   TCL_OK;.    }el
ec10: 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  se{.      Tcl_Ap
ec20: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
ec30: 70 2c 20 22 62 61 63 6b 75 70 20 66 61 69 6c 65  p, "backup faile
ec40: 64 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d: ",.          
ec50: 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
ec60: 70 44 65 73 74 29 2c 20 28 63 68 61 72 2a 29 30  pDest), (char*)0
ec70: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43  );.      rc = TC
ec80: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
ec90: 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
eca0: 28 70 44 65 73 74 29 3b 0a 20 20 20 20 62 72 65  (pDest);.    bre
ecb0: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
ecc0: 20 24 64 62 20 62 75 73 79 20 3f 43 41 4c 4c 42   $db busy ?CALLB
ecd0: 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ACK?.  **.  ** I
ece0: 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20  nvoke the given 
ecf0: 63 61 6c 6c 62 61 63 6b 20 69 66 20 61 6e 20 53  callback if an S
ed00: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 74 74  QL statement att
ed10: 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 0a 20 20  empts to open.  
ed20: 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 64 61 74 61  ** a locked data
ed30: 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  base file..  */.
ed40: 20 20 63 61 73 65 20 44 42 5f 42 55 53 59 3a 20    case DB_BUSY: 
ed50: 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33  {.    if( objc>3
ed60: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
ed70: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
ed80: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 43 41 4c  p, 2, objv, "CAL
ed90: 4c 42 41 43 4b 22 29 3b 0a 20 20 20 20 20 20 72  LBACK");.      r
eda0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
edb0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
edc0: 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  bjc==2 ){.      
edd0: 69 66 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29  if( pDb->zBusy )
ede0: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70  {.        Tcl_Ap
edf0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
ee00: 70 2c 20 70 44 62 2d 3e 7a 42 75 73 79 2c 20 28  p, pDb->zBusy, (
ee10: 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
ee20: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
ee30: 20 20 20 63 68 61 72 20 2a 7a 42 75 73 79 3b 0a     char *zBusy;.
ee40: 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20        int len;. 
ee50: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 42       if( pDb->zB
ee60: 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20 54  usy ){.        T
ee70: 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 42 75  cl_Free(pDb->zBu
ee80: 73 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  sy);.      }.   
ee90: 20 20 20 7a 42 75 73 79 20 3d 20 54 63 6c 5f 47     zBusy = Tcl_G
eea0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
eeb0: 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a  objv[2], &len);.
eec0: 20 20 20 20 20 20 69 66 28 20 7a 42 75 73 79 20        if( zBusy 
eed0: 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20  && len>0 ){.    
eee0: 20 20 20 20 70 44 62 2d 3e 7a 42 75 73 79 20 3d      pDb->zBusy =
eef0: 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20   Tcl_Alloc( len 
ef00: 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d  + 1 );.        m
ef10: 65 6d 63 70 79 28 70 44 62 2d 3e 7a 42 75 73 79  emcpy(pDb->zBusy
ef20: 2c 20 7a 42 75 73 79 2c 20 6c 65 6e 2b 31 29 3b  , zBusy, len+1);
ef30: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
ef40: 20 20 20 20 20 20 70 44 62 2d 3e 7a 42 75 73 79        pDb->zBusy
ef50: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
ef60: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 42 75      if( pDb->zBu
ef70: 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  sy ){.        pD
ef80: 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65  b->interp = inte
ef90: 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  rp;.        sqli
efa0: 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72  te3_busy_handler
efb0: 28 70 44 62 2d 3e 64 62 2c 20 44 62 42 75 73 79  (pDb->db, DbBusy
efc0: 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20  Handler, pDb);. 
efd0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
efe0: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79      sqlite3_busy
eff0: 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62  _handler(pDb->db
f000: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
f010: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
f020: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 20  ;.  }..  /*     
f030: 24 64 62 20 63 61 63 68 65 20 66 6c 75 73 68 0a  $db cache flush.
f040: 20 20 2a 2a 20 20 20 20 20 24 64 62 20 63 61 63    **     $db cac
f050: 68 65 20 73 69 7a 65 20 6e 0a 20 20 2a 2a 0a 20  he size n.  **. 
f060: 20 2a 2a 20 46 6c 75 73 68 20 74 68 65 20 70 72   ** Flush the pr
f070: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
f080: 20 63 61 63 68 65 2c 20 6f 72 20 73 65 74 20 74   cache, or set t
f090: 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
f0a0: 72 20 6f 66 0a 20 20 2a 2a 20 63 61 63 68 65 64  r of.  ** cached
f0b0: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a   statements..  *
f0c0: 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 41 43 48  /.  case DB_CACH
f0d0: 45 3a 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 73  E: {.    char *s
f0e0: 75 62 43 6d 64 3b 0a 20 20 20 20 69 6e 74 20 6e  ubCmd;.    int n
f0f0: 3b 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3c  ;..    if( objc<
f100: 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =2 ){.      Tcl_
f110: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
f120: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63  erp, 1, objv, "c
f130: 61 63 68 65 20 6f 70 74 69 6f 6e 20 3f 61 72 67  ache option ?arg
f140: 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ?");.      retur
f150: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
f160: 20 7d 0a 20 20 20 20 73 75 62 43 6d 64 20 3d 20   }.    subCmd = 
f170: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
f180: 6d 4f 62 6a 28 20 6f 62 6a 76 5b 32 5d 2c 20 30  mObj( objv[2], 0
f190: 20 29 3b 0a 20 20 20 20 69 66 28 20 2a 73 75 62   );.    if( *sub
f1a0: 43 6d 64 3d 3d 27 66 27 20 26 26 20 73 74 72 63  Cmd=='f' && strc
f1b0: 6d 70 28 73 75 62 43 6d 64 2c 22 66 6c 75 73 68  mp(subCmd,"flush
f1c0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
f1d0: 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
f1e0: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
f1f0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
f200: 2c 20 6f 62 6a 76 2c 20 22 66 6c 75 73 68 22 29  , objv, "flush")
f210: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
f220: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
f230: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
f240: 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28   flushStmtCache(
f250: 20 70 44 62 20 29 3b 0a 20 20 20 20 20 20 7d 0a   pDb );.      }.
f260: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 2a 73      }else if( *s
f270: 75 62 43 6d 64 3d 3d 27 73 27 20 26 26 20 73 74  ubCmd=='s' && st
f280: 72 63 6d 70 28 73 75 62 43 6d 64 2c 22 73 69 7a  rcmp(subCmd,"siz
f290: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
f2a0: 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20  if( objc!=4 ){. 
f2b0: 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67         Tcl_Wrong
f2c0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
f2d0: 32 2c 20 6f 62 6a 76 2c 20 22 73 69 7a 65 20 6e  2, objv, "size n
f2e0: 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ");.        retu
f2f0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
f300: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f310: 20 20 20 69 66 28 20 54 43 4c 5f 45 52 52 4f 52     if( TCL_ERROR
f320: 3d 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ==Tcl_GetIntFrom
f330: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
f340: 5b 33 5d 2c 20 26 6e 29 20 29 7b 0a 20 20 20 20  [3], &n) ){.    
f350: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
f360: 52 65 73 75 6c 74 28 20 69 6e 74 65 72 70 2c 20  Result( interp, 
f370: 22 63 61 6e 6e 6f 74 20 63 6f 6e 76 65 72 74 20  "cannot convert 
f380: 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  \"", .          
f390: 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
f3a0: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33  ngFromObj(objv[3
f3b0: 5d 2c 30 29 2c 20 22 5c 22 20 74 6f 20 69 6e 74  ],0), "\" to int
f3c0: 65 67 65 72 22 2c 20 28 63 68 61 72 2a 29 30 29  eger", (char*)0)
f3d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
f3e0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
f3f0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f400: 20 20 20 20 20 20 20 69 66 28 20 6e 3c 30 20 29         if( n<0 )
f410: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6c  {.            fl
f420: 75 73 68 53 74 6d 74 43 61 63 68 65 28 20 70 44  ushStmtCache( pD
f430: 62 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  b );.           
f440: 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   n = 0;.        
f450: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3e 4d 41    }else if( n>MA
f460: 58 5f 50 52 45 50 41 52 45 44 5f 53 54 4d 54 53  X_PREPARED_STMTS
f470: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
f480: 6e 20 3d 20 4d 41 58 5f 50 52 45 50 41 52 45 44  n = MAX_PREPARED
f490: 5f 53 54 4d 54 53 3b 0a 20 20 20 20 20 20 20 20  _STMTS;.        
f4a0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 44    }.          pD
f4b0: 62 2d 3e 6d 61 78 53 74 6d 74 20 3d 20 6e 3b 0a  b->maxStmt = n;.
f4c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f4d0: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
f4e0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
f4f0: 75 6c 74 28 20 69 6e 74 65 72 70 2c 20 22 62 61  ult( interp, "ba
f500: 64 20 6f 70 74 69 6f 6e 20 5c 22 22 2c 20 0a 20  d option \"", . 
f510: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74           Tcl_Get
f520: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
f530: 6a 76 5b 32 5d 2c 30 29 2c 20 22 5c 22 3a 20 6d  jv[2],0), "\": m
f540: 75 73 74 20 62 65 20 66 6c 75 73 68 20 6f 72 20  ust be flush or 
f550: 73 69 7a 65 22 2c 0a 20 20 20 20 20 20 20 20 20  size",.         
f560: 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
f570: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
f580: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72  OR;.    }.    br
f590: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
f5a0: 20 20 20 24 64 62 20 63 68 61 6e 67 65 73 0a 20     $db changes. 
f5b0: 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20   **.  ** Return 
f5c0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
f5d0: 77 73 20 74 68 61 74 20 77 65 72 65 20 6d 6f 64  ws that were mod
f5e0: 69 66 69 65 64 2c 20 69 6e 73 65 72 74 65 64 2c  ified, inserted,
f5f0: 20 6f 72 20 64 65 6c 65 74 65 64 20 62 79 0a 20   or deleted by. 
f600: 20 2a 2a 20 74 68 65 20 6d 6f 73 74 20 72 65 63   ** the most rec
f610: 65 6e 74 20 49 4e 53 45 52 54 2c 20 55 50 44 41  ent INSERT, UPDA
f620: 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61  TE or DELETE sta
f630: 74 65 6d 65 6e 74 2c 20 6e 6f 74 20 69 6e 63 6c  tement, not incl
f640: 75 64 69 6e 67 20 0a 20 20 2a 2a 20 61 6e 79 20  uding .  ** any 
f650: 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20  changes made by 
f660: 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73  trigger programs
f670: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
f680: 5f 43 48 41 4e 47 45 53 3a 20 7b 0a 20 20 20 20  _CHANGES: {.    
f690: 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74  Tcl_Obj *pResult
f6a0: 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ;.    if( objc!=
f6b0: 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  2 ){.      Tcl_W
f6c0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
f6d0: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 22 29  rp, 2, objv, "")
f6e0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
f6f0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
f700: 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63      pResult = Tc
f710: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_GetObjResult(i
f720: 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f  nterp);.    Tcl_
f730: 53 65 74 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c  SetIntObj(pResul
f740: 74 2c 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  t, sqlite3_chang
f750: 65 73 28 70 44 62 2d 3e 64 62 29 29 3b 0a 20 20  es(pDb->db));.  
f760: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
f770: 2f 2a 20 20 20 20 24 64 62 20 63 6c 6f 73 65 0a  /*    $db close.
f780: 20 20 2a 2a 0a 20 20 2a 2a 20 53 68 75 74 64 6f    **.  ** Shutdo
f790: 77 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  wn the database.
f7a0: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43    */.  case DB_C
f7b0: 4c 4f 53 45 3a 20 7b 0a 20 20 20 20 54 63 6c 5f  LOSE: {.    Tcl_
f7c0: 44 65 6c 65 74 65 43 6f 6d 6d 61 6e 64 28 69 6e  DeleteCommand(in
f7d0: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
f7e0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
f7f0: 30 5d 2c 20 30 29 29 3b 0a 20 20 20 20 62 72 65  0], 0));.    bre
f800: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
f810: 2a 2a 20 20 20 20 20 24 64 62 20 63 6f 6c 6c 61  **     $db colla
f820: 74 65 20 4e 41 4d 45 20 53 43 52 49 50 54 0a 20  te NAME SCRIPT. 
f830: 20 2a 2a 0a 20 20 2a 2a 20 43 72 65 61 74 65 20   **.  ** Create 
f840: 61 20 6e 65 77 20 53 51 4c 20 63 6f 6c 6c 61 74  a new SQL collat
f850: 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  ion function cal
f860: 6c 65 64 20 4e 41 4d 45 2e 20 20 57 68 65 6e 65  led NAME.  Whene
f870: 76 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 66 75  ver.  ** that fu
f880: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
f890: 2c 20 69 6e 76 6f 6b 65 20 53 43 52 49 50 54 20  , invoke SCRIPT 
f8a0: 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  to evaluate the 
f8b0: 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  function..  */. 
f8c0: 20 63 61 73 65 20 44 42 5f 43 4f 4c 4c 41 54 45   case DB_COLLATE
f8d0: 3a 20 7b 0a 20 20 20 20 53 71 6c 43 6f 6c 6c 61  : {.    SqlColla
f8e0: 74 65 20 2a 70 43 6f 6c 6c 61 74 65 3b 0a 20 20  te *pCollate;.  
f8f0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
f900: 20 20 20 63 68 61 72 20 2a 7a 53 63 72 69 70 74     char *zScript
f910: 3b 0a 20 20 20 20 69 6e 74 20 6e 53 63 72 69 70  ;.    int nScrip
f920: 74 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  t;.    if( objc!
f930: 3d 34 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =4 ){.      Tcl_
f940: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
f950: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e  erp, 2, objv, "N
f960: 41 4d 45 20 53 43 52 49 50 54 22 29 3b 0a 20 20  AME SCRIPT");.  
f970: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
f980: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
f990: 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53  zName = Tcl_GetS
f9a0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
f9b0: 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20 7a 53  v[2], 0);.    zS
f9c0: 63 72 69 70 74 20 3d 20 54 63 6c 5f 47 65 74 53  cript = Tcl_GetS
f9d0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
f9e0: 76 5b 33 5d 2c 20 26 6e 53 63 72 69 70 74 29 3b  v[3], &nScript);
f9f0: 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65 20 3d 20  .    pCollate = 
fa00: 28 53 71 6c 43 6f 6c 6c 61 74 65 2a 29 54 63 6c  (SqlCollate*)Tcl
fa10: 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  _Alloc( sizeof(*
fa20: 70 43 6f 6c 6c 61 74 65 29 20 2b 20 6e 53 63 72  pCollate) + nScr
fa30: 69 70 74 20 2b 20 31 20 29 3b 0a 20 20 20 20 69  ipt + 1 );.    i
fa40: 66 28 20 70 43 6f 6c 6c 61 74 65 3d 3d 30 20 29  f( pCollate==0 )
fa50: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
fa60: 52 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65 2d  R;.    pCollate-
fa70: 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  >interp = interp
fa80: 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65 2d 3e  ;.    pCollate->
fa90: 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e 70 43 6f  pNext = pDb->pCo
faa0: 6c 6c 61 74 65 3b 0a 20 20 20 20 70 43 6f 6c 6c  llate;.    pColl
fab0: 61 74 65 2d 3e 7a 53 63 72 69 70 74 20 3d 20 28  ate->zScript = (
fac0: 63 68 61 72 2a 29 26 70 43 6f 6c 6c 61 74 65 5b  char*)&pCollate[
fad0: 31 5d 3b 0a 20 20 20 20 70 44 62 2d 3e 70 43 6f  1];.    pDb->pCo
fae0: 6c 6c 61 74 65 20 3d 20 70 43 6f 6c 6c 61 74 65  llate = pCollate
faf0: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 43 6f  ;.    memcpy(pCo
fb00: 6c 6c 61 74 65 2d 3e 7a 53 63 72 69 70 74 2c 20  llate->zScript, 
fb10: 7a 53 63 72 69 70 74 2c 20 6e 53 63 72 69 70 74  zScript, nScript
fb20: 2b 31 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  +1);.    if( sql
fb30: 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
fb40: 61 74 69 6f 6e 28 70 44 62 2d 3e 64 62 2c 20 7a  ation(pDb->db, z
fb50: 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54 46  Name, SQLITE_UTF
fb60: 38 2c 20 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  8, .        pCol
fb70: 6c 61 74 65 2c 20 74 63 6c 53 71 6c 43 6f 6c 6c  late, tclSqlColl
fb80: 61 74 65 29 20 29 7b 0a 20 20 20 20 20 20 54 63  ate) ){.      Tc
fb90: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
fba0: 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69  rp, (char *)sqli
fbb0: 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e  te3_errmsg(pDb->
fbc0: 64 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c  db), TCL_VOLATIL
fbd0: 45 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  E);.      return
fbe0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
fbf0: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
fc00: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20  ..  /*.  **     
fc10: 24 64 62 20 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65  $db collation_ne
fc20: 65 64 65 64 20 53 43 52 49 50 54 0a 20 20 2a 2a  eded SCRIPT.  **
fc30: 0a 20 20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  .  ** Create a n
fc40: 65 77 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e  ew SQL collation
fc50: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64   function called
fc60: 20 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76 65 72   NAME.  Whenever
fc70: 0a 20 20 2a 2a 20 74 68 61 74 20 66 75 6e 63 74  .  ** that funct
fc80: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
fc90: 6e 76 6f 6b 65 20 53 43 52 49 50 54 20 74 6f 20  nvoke SCRIPT to 
fca0: 65 76 61 6c 75 61 74 65 20 74 68 65 20 66 75 6e  evaluate the fun
fcb0: 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61  ction..  */.  ca
fcc0: 73 65 20 44 42 5f 43 4f 4c 4c 41 54 49 4f 4e 5f  se DB_COLLATION_
fcd0: 4e 45 45 44 45 44 3a 20 7b 0a 20 20 20 20 69 66  NEEDED: {.    if
fce0: 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
fcf0: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
fd00: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
fd10: 62 6a 76 2c 20 22 53 43 52 49 50 54 22 29 3b 0a  bjv, "SCRIPT");.
fd20: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
fd30: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
fd40: 20 20 69 66 28 20 70 44 62 2d 3e 70 43 6f 6c 6c    if( pDb->pColl
fd50: 61 74 65 4e 65 65 64 65 64 20 29 7b 0a 20 20 20  ateNeeded ){.   
fd60: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
fd70: 75 6e 74 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74  unt(pDb->pCollat
fd80: 65 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 7d 0a  eNeeded);.    }.
fd90: 20 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74      pDb->pCollat
fda0: 65 4e 65 65 64 65 64 20 3d 20 54 63 6c 5f 44 75  eNeeded = Tcl_Du
fdb0: 70 6c 69 63 61 74 65 4f 62 6a 28 6f 62 6a 76 5b  plicateObj(objv[
fdc0: 32 5d 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63  2]);.    Tcl_Inc
fdd0: 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70  rRefCount(pDb->p
fde0: 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a  CollateNeeded);.
fdf0: 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c      sqlite3_coll
fe00: 61 74 69 6f 6e 5f 6e 65 65 64 65 64 28 70 44 62  ation_needed(pDb
fe10: 2d 3e 64 62 2c 20 70 44 62 2c 20 74 63 6c 43 6f  ->db, pDb, tclCo
fe20: 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20  llateNeeded);.  
fe30: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
fe40: 2f 2a 20 20 20 20 24 64 62 20 63 6f 6d 6d 69 74  /*    $db commit
fe50: 5f 68 6f 6f 6b 20 3f 43 41 4c 4c 42 41 43 4b 3f  _hook ?CALLBACK?
fe60: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b  .  **.  ** Invok
fe70: 65 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c  e the given call
fe80: 62 61 63 6b 20 6a 75 73 74 20 62 65 66 6f 72 65  back just before
fe90: 20 63 6f 6d 6d 69 74 74 69 6e 67 20 65 76 65 72   committing ever
fea0: 79 20 53 51 4c 20 74 72 61 6e 73 61 63 74 69 6f  y SQL transactio
feb0: 6e 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 63  n..  ** If the c
fec0: 61 6c 6c 62 61 63 6b 20 74 68 72 6f 77 73 20 61  allback throws a
fed0: 6e 20 65 78 63 65 70 74 69 6f 6e 20 6f 72 20 72  n exception or r
fee0: 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  eturns non-zero,
fef0: 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 74   then the.  ** t
ff00: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 62  ransaction is ab
ff10: 6f 72 74 65 64 2e 20 20 49 66 20 43 41 4c 4c 42  orted.  If CALLB
ff20: 41 43 4b 20 69 73 20 61 6e 20 65 6d 70 74 79 20  ACK is an empty 
ff30: 73 74 72 69 6e 67 2c 20 74 68 65 20 63 61 6c 6c  string, the call
ff40: 62 61 63 6b 0a 20 20 2a 2a 20 69 73 20 64 69 73  back.  ** is dis
ff50: 61 62 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61  abled..  */.  ca
ff60: 73 65 20 44 42 5f 43 4f 4d 4d 49 54 5f 48 4f 4f  se DB_COMMIT_HOO
ff70: 4b 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a  K: {.    if( obj
ff80: 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  c>3 ){.      Tcl
ff90: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
ffa0: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
ffb0: 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20  ?CALLBACK?");.  
ffc0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
ffd0: 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20  RROR;.    }else 
ffe0: 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20  if( objc==2 ){. 
fff0: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 43       if( pDb->zC
10000 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  ommit ){.       
10010 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
10020 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a  t(interp, pDb->z
10030 43 6f 6d 6d 69 74 2c 20 28 63 68 61 72 2a 29 30  Commit, (char*)0
10040 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
10050 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73  else{.      cons
10060 74 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b  t char *zCommit;
10070 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a  .      int len;.
10080 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
10090 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  Commit ){.      
100a0 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e    Tcl_Free(pDb->
100b0 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20  zCommit);.      
100c0 7d 0a 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20  }.      zCommit 
100d0 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
100e0 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
100f0 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  &len);.      if(
10100 20 7a 43 6f 6d 6d 69 74 20 26 26 20 6c 65 6e 3e   zCommit && len>
10110 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  0 ){.        pDb
10120 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20 54 63 6c 5f  ->zCommit = Tcl_
10130 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29  Alloc( len + 1 )
10140 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
10150 28 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 2c 20 7a  (pDb->zCommit, z
10160 43 6f 6d 6d 69 74 2c 20 6c 65 6e 2b 31 29 3b 0a  Commit, len+1);.
10170 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
10180 20 20 20 20 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69       pDb->zCommi
10190 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 0;.      }. 
101a0 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 43       if( pDb->zC
101b0 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  ommit ){.       
101c0 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69   pDb->interp = i
101d0 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73  nterp;.        s
101e0 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f  qlite3_commit_ho
101f0 6f 6b 28 70 44 62 2d 3e 64 62 2c 20 44 62 43 6f  ok(pDb->db, DbCo
10200 6d 6d 69 74 48 61 6e 64 6c 65 72 2c 20 70 44 62  mmitHandler, pDb
10210 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
10220 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
10230 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 70 44 62 2d  commit_hook(pDb-
10240 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  >db, 0, 0);.    
10250 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72    }.    }.    br
10260 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
10270 20 20 24 64 62 20 63 6f 6d 70 6c 65 74 65 20 53    $db complete S
10280 51 4c 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74  QL.  **.  ** Ret
10290 75 72 6e 20 54 52 55 45 20 69 66 20 53 51 4c 20  urn TRUE if SQL 
102a0 69 73 20 61 20 63 6f 6d 70 6c 65 74 65 20 53 51  is a complete SQ
102b0 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 52 65  L statement.  Re
102c0 74 75 72 6e 20 46 41 4c 53 45 20 69 66 0a 20 20  turn FALSE if.  
102d0 2a 2a 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 69  ** additional li
102e0 6e 65 73 20 6f 66 20 69 6e 70 75 74 20 61 72 65  nes of input are
102f0 20 6e 65 65 64 65 64 2e 20 20 54 68 69 73 20 69   needed.  This i
10300 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65  s similar to the
10310 0a 20 20 2a 2a 20 62 75 69 6c 74 2d 69 6e 20 22  .  ** built-in "
10320 69 6e 66 6f 20 63 6f 6d 70 6c 65 74 65 22 20 63  info complete" c
10330 6f 6d 6d 61 6e 64 20 6f 66 20 54 63 6c 2e 0a 20  ommand of Tcl.. 
10340 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f   */.  case DB_CO
10350 4d 50 4c 45 54 45 3a 20 7b 0a 23 69 66 6e 64 65  MPLETE: {.#ifnde
10360 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
10370 4d 50 4c 45 54 45 0a 20 20 20 20 54 63 6c 5f 4f  MPLETE.    Tcl_O
10380 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20  bj *pResult;.   
10390 20 69 6e 74 20 69 73 43 6f 6d 70 6c 65 74 65 3b   int isComplete;
103a0 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  .    if( objc!=3
103b0 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
103c0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
103d0 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 51 4c  p, 2, objv, "SQL
103e0 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
103f0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
10400 7d 0a 20 20 20 20 69 73 43 6f 6d 70 6c 65 74 65  }.    isComplete
10410 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c   = sqlite3_compl
10420 65 74 65 28 20 54 63 6c 5f 47 65 74 53 74 72 69  ete( Tcl_GetStri
10430 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
10440 5d 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 52 65  ], 0) );.    pRe
10450 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62  sult = Tcl_GetOb
10460 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  jResult(interp);
10470 0a 20 20 20 20 54 63 6c 5f 53 65 74 42 6f 6f 6c  .    Tcl_SetBool
10480 65 61 6e 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20  eanObj(pResult, 
10490 69 73 43 6f 6d 70 6c 65 74 65 29 3b 0a 23 65 6e  isComplete);.#en
104a0 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  dif.    break;. 
104b0 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20   }..  /*    $db 
104c0 63 6f 70 79 20 63 6f 6e 66 6c 69 63 74 2d 61 6c  copy conflict-al
104d0 67 6f 72 69 74 68 6d 20 74 61 62 6c 65 20 66 69  gorithm table fi
104e0 6c 65 6e 61 6d 65 20 3f 53 45 50 41 52 41 54 4f  lename ?SEPARATO
104f0 52 3f 20 3f 4e 55 4c 4c 49 4e 44 49 43 41 54 4f  R? ?NULLINDICATO
10500 52 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f 70  R?.  **.  ** Cop
10510 79 20 64 61 74 61 20 69 6e 74 6f 20 74 61 62 6c  y data into tabl
10520 65 20 66 72 6f 6d 20 66 69 6c 65 6e 61 6d 65 2c  e from filename,
10530 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 75 73 69 6e   optionally usin
10540 67 20 53 45 50 41 52 41 54 4f 52 0a 20 20 2a 2a  g SEPARATOR.  **
10550 20 61 73 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72   as column separ
10560 61 74 6f 72 73 2e 20 20 49 66 20 61 20 63 6f 6c  ators.  If a col
10570 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 20 6e  umn contains a n
10580 75 6c 6c 20 73 74 72 69 6e 67 2c 20 6f 72 20 74  ull string, or t
10590 68 65 0a 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66  he.  ** value of
105a0 20 4e 55 4c 4c 49 4e 44 49 43 41 54 4f 52 2c 20   NULLINDICATOR, 
105b0 61 20 4e 55 4c 4c 20 69 73 20 69 6e 73 65 72 74  a NULL is insert
105c0 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  ed for the colum
105d0 6e 2e 0a 20 20 2a 2a 20 63 6f 6e 66 6c 69 63 74  n..  ** conflict
105e0 2d 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 6f 6e  -algorithm is on
105f0 65 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 20  e of the sqlite 
10600 63 6f 6e 66 6c 69 63 74 20 61 6c 67 6f 72 69 74  conflict algorit
10610 68 6d 73 3a 0a 20 20 2a 2a 20 20 20 20 72 6f 6c  hms:.  **    rol
10620 6c 62 61 63 6b 2c 20 61 62 6f 72 74 2c 20 66 61  lback, abort, fa
10630 69 6c 2c 20 69 67 6e 6f 72 65 2c 20 72 65 70 6c  il, ignore, repl
10640 61 63 65 0a 20 20 2a 2a 20 4f 6e 20 73 75 63 63  ace.  ** On succ
10650 65 73 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20  ess, return the 
10660 6e 75 6d 62 65 72 20 6f 66 20 6c 69 6e 65 73 20  number of lines 
10670 70 72 6f 63 65 73 73 65 64 2c 20 6e 6f 74 20 6e  processed, not n
10680 65 63 65 73 73 61 72 69 6c 79 20 73 61 6d 65 0a  ecessarily same.
10690 20 20 2a 2a 20 61 73 20 27 64 62 20 63 68 61 6e    ** as 'db chan
106a0 67 65 73 27 20 64 75 65 20 74 6f 20 63 6f 6e 66  ges' due to conf
106b0 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d 20 73  lict-algorithm s
106c0 65 6c 65 63 74 65 64 2e 0a 20 20 2a 2a 0a 20 20  elected..  **.  
106d0 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 69 73 20  ** This code is 
106e0 62 61 73 69 63 61 6c 6c 79 20 61 6e 20 69 6d 70  basically an imp
106f0 6c 65 6d 65 6e 74 61 74 69 6f 6e 2f 65 6e 68 61  lementation/enha
10700 6e 63 65 6d 65 6e 74 20 6f 66 0a 20 20 2a 2a 20  ncement of.  ** 
10710 74 68 65 20 73 71 6c 69 74 65 33 20 73 68 65 6c  the sqlite3 shel
10720 6c 2e 63 20 22 2e 69 6d 70 6f 72 74 22 20 63 6f  l.c ".import" co
10730 6d 6d 61 6e 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  mmand..  **.  **
10740 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 75 73   This command us
10750 61 67 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e  age is equivalen
10760 74 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 32  t to the sqlite2
10770 2e 78 20 43 4f 50 59 20 73 74 61 74 65 6d 65 6e  .x COPY statemen
10780 74 2c 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 6d  t,.  ** which im
10790 70 6f 72 74 73 20 66 69 6c 65 20 64 61 74 61 20  ports file data 
107a0 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 75 73 69  into a table usi
107b0 6e 67 20 74 68 65 20 50 6f 73 74 67 72 65 53 51  ng the PostgreSQ
107c0 4c 20 43 4f 50 59 20 66 69 6c 65 20 66 6f 72 6d  L COPY file form
107d0 61 74 3a 0a 20 20 2a 2a 20 20 20 24 64 62 20 63  at:.  **   $db c
107e0 6f 70 79 20 24 63 6f 6e 66 6c 69 74 5f 61 6c 67  opy $conflit_alg
107f0 6f 20 24 74 61 62 6c 65 5f 6e 61 6d 65 20 24 66  o $table_name $f
10800 69 6c 65 6e 61 6d 65 20 5c 74 20 5c 5c 4e 0a 20  ilename \t \\N. 
10810 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f   */.  case DB_CO
10820 50 59 3a 20 7b 0a 20 20 20 20 63 68 61 72 20 2a  PY: {.    char *
10830 7a 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20  zTable;         
10840 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20        /* Insert 
10850 64 61 74 61 20 69 6e 74 6f 20 74 68 69 73 20 74  data into this t
10860 61 62 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72  able */.    char
10870 20 2a 7a 46 69 6c 65 3b 20 20 20 20 20 20 20 20   *zFile;        
10880 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
10890 69 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20 74  ile from which t
108a0 6f 20 65 78 74 72 61 63 74 20 64 61 74 61 20 2a  o extract data *
108b0 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6e  /.    char *zCon
108c0 66 6c 69 63 74 3b 20 20 20 20 20 20 20 20 20 20  flict;          
108d0 20 20 2f 2a 20 54 68 65 20 63 6f 6e 66 6c 69 63    /* The conflic
108e0 74 20 61 6c 67 6f 72 69 74 68 6d 20 74 6f 20 75  t algorithm to u
108f0 73 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  se */.    sqlite
10900 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20  3_stmt *pStmt;  
10910 20 20 20 20 20 20 2f 2a 20 41 20 73 74 61 74 65        /* A state
10920 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ment */.    int 
10930 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  nCol;           
10940 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
10950 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
10960 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  the table */.   
10970 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20   int nByte;     
10980 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10990 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
109a0 69 6e 20 61 6e 20 53 51 4c 20 73 74 72 69 6e 67  in an SQL string
109b0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a   */.    int i, j
109c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
109d0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
109e0 74 65 72 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ters */.    int 
109f0 6e 53 65 70 3b 20 20 20 20 20 20 20 20 20 20 20  nSep;           
10a00 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
10a10 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 53  r of bytes in zS
10a20 65 70 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ep[] */.    int 
10a30 6e 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  nNull;          
10a40 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
10a50 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 4e  r of bytes in zN
10a60 75 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 63 68 61  ull[] */.    cha
10a70 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20 20  r *zSql;        
10a80 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 53           /* An S
10a90 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  QL statement */.
10aa0 20 20 20 20 63 68 61 72 20 2a 7a 4c 69 6e 65 3b      char *zLine;
10ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ac0 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c 69 6e 65  /* A single line
10ad0 20 6f 66 20 69 6e 70 75 74 20 66 72 6f 6d 20 74   of input from t
10ae0 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 63  he file */.    c
10af0 68 61 72 20 2a 2a 61 7a 43 6f 6c 3b 20 20 20 20  har **azCol;    
10b00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4c             /* zL
10b10 69 6e 65 5b 5d 20 62 72 6f 6b 65 6e 20 75 70 20  ine[] broken up 
10b20 69 6e 74 6f 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  into columns */.
10b30 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
10b40 7a 43 6f 6d 6d 69 74 3b 20 20 20 20 20 20 20 20  zCommit;        
10b50 2f 2a 20 48 6f 77 20 74 6f 20 63 6f 6d 6d 69 74  /* How to commit
10b60 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 20 20   changes */.    
10b70 46 49 4c 45 20 2a 69 6e 3b 20 20 20 20 20 20 20  FILE *in;       
10b80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
10b90 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f  he input file */
10ba0 0a 20 20 20 20 69 6e 74 20 6c 69 6e 65 6e 6f 20  .    int lineno 
10bb0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
10bc0 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20   /* Line number 
10bd0 6f 66 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f  of input file */
10be0 0a 20 20 20 20 63 68 61 72 20 7a 4c 69 6e 65 4e  .    char zLineN
10bf0 75 6d 5b 38 30 5d 3b 20 20 20 20 20 20 20 20 20  um[80];         
10c00 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20   /* Line number 
10c10 70 72 69 6e 74 20 62 75 66 66 65 72 20 2a 2f 0a  print buffer */.
10c20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65      Tcl_Obj *pRe
10c30 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20  sult;           
10c40 2f 2a 20 69 6e 74 65 72 70 20 72 65 73 75 6c 74  /* interp result
10c50 20 2a 2f 0a 0a 20 20 20 20 63 6f 6e 73 74 20 63   */..    const c
10c60 68 61 72 20 2a 7a 53 65 70 3b 0a 20 20 20 20 63  har *zSep;.    c
10c70 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 75 6c 6c  onst char *zNull
10c80 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3c 35  ;.    if( objc<5
10c90 20 7c 7c 20 6f 62 6a 63 3e 37 20 29 7b 0a 20 20   || objc>7 ){.  
10ca0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
10cb0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
10cc0 6f 62 6a 76 2c 20 0a 20 20 20 20 20 20 20 20 20  objv, .         
10cd0 22 43 4f 4e 46 4c 49 43 54 2d 41 4c 47 4f 52 49  "CONFLICT-ALGORI
10ce0 54 48 4d 20 54 41 42 4c 45 20 46 49 4c 45 4e 41  THM TABLE FILENA
10cf0 4d 45 20 3f 53 45 50 41 52 41 54 4f 52 3f 20 3f  ME ?SEPARATOR? ?
10d00 4e 55 4c 4c 49 4e 44 49 43 41 54 4f 52 3f 22 29  NULLINDICATOR?")
10d10 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
10d20 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
10d30 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 3d 36 20      if( objc>=6 
10d40 29 7b 0a 20 20 20 20 20 20 7a 53 65 70 20 3d 20  ){.      zSep = 
10d50 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
10d60 6d 4f 62 6a 28 6f 62 6a 76 5b 35 5d 2c 20 30 29  mObj(objv[5], 0)
10d70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
10d80 20 20 20 7a 53 65 70 20 3d 20 22 5c 74 22 3b 0a     zSep = "\t";.
10d90 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62      }.    if( ob
10da0 6a 63 3e 3d 37 20 29 7b 0a 20 20 20 20 20 20 7a  jc>=7 ){.      z
10db0 4e 75 6c 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74  Null = Tcl_GetSt
10dc0 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
10dd0 5b 36 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  [6], 0);.    }el
10de0 73 65 7b 0a 20 20 20 20 20 20 7a 4e 75 6c 6c 20  se{.      zNull 
10df0 3d 20 22 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = "";.    }.    
10e00 7a 43 6f 6e 66 6c 69 63 74 20 3d 20 54 63 6c 5f  zConflict = Tcl_
10e10 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
10e20 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20  (objv[2], 0);.  
10e30 20 20 7a 54 61 62 6c 65 20 3d 20 54 63 6c 5f 47    zTable = Tcl_G
10e40 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
10e50 6f 62 6a 76 5b 33 5d 2c 20 30 29 3b 0a 20 20 20  objv[3], 0);.   
10e60 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74   zFile = Tcl_Get
10e70 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
10e80 6a 76 5b 34 5d 2c 20 30 29 3b 0a 20 20 20 20 6e  jv[4], 0);.    n
10e90 53 65 70 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a  Sep = strlen30(z
10ea0 53 65 70 29 3b 0a 20 20 20 20 6e 4e 75 6c 6c 20  Sep);.    nNull 
10eb0 3d 20 73 74 72 6c 65 6e 33 30 28 7a 4e 75 6c 6c  = strlen30(zNull
10ec0 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 65 70 3d  );.    if( nSep=
10ed0 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =0 ){.      Tcl_
10ee0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
10ef0 65 72 70 2c 22 45 72 72 6f 72 3a 20 6e 6f 6e 2d  erp,"Error: non-
10f00 6e 75 6c 6c 20 73 65 70 61 72 61 74 6f 72 20 72  null separator r
10f10 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f 70 79  equired for copy
10f20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
10f30 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
10f40 29 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  )0);.      retur
10f50 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
10f60 20 7d 0a 20 20 20 20 69 66 28 73 74 72 63 6d 70   }.    if(strcmp
10f70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 72 6f 6c  (zConflict, "rol
10f80 6c 62 61 63 6b 22 29 20 21 3d 20 30 20 26 26 0a  lback") != 0 &&.
10f90 20 20 20 20 20 20 20 73 74 72 63 6d 70 28 7a 43         strcmp(zC
10fa0 6f 6e 66 6c 69 63 74 2c 20 22 61 62 6f 72 74 22  onflict, "abort"
10fb0 20 20 20 29 20 21 3d 20 30 20 26 26 0a 20 20 20     ) != 0 &&.   
10fc0 20 20 20 20 73 74 72 63 6d 70 28 7a 43 6f 6e 66      strcmp(zConf
10fd0 6c 69 63 74 2c 20 22 66 61 69 6c 22 20 20 20 20  lict, "fail"    
10fe0 29 20 21 3d 20 30 20 26 26 0a 20 20 20 20 20 20  ) != 0 &&.      
10ff0 20 73 74 72 63 6d 70 28 7a 43 6f 6e 66 6c 69 63   strcmp(zConflic
11000 74 2c 20 22 69 67 6e 6f 72 65 22 20 20 29 20 21  t, "ignore"  ) !
11010 3d 20 30 20 26 26 0a 20 20 20 20 20 20 20 73 74  = 0 &&.       st
11020 72 63 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20  rcmp(zConflict, 
11030 22 72 65 70 6c 61 63 65 22 20 29 20 21 3d 20 30  "replace" ) != 0
11040 20 29 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41   ) {.      Tcl_A
11050 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
11060 72 70 2c 20 22 45 72 72 6f 72 3a 20 5c 22 22 2c  rp, "Error: \"",
11070 20 7a 43 6f 6e 66 6c 69 63 74 2c 20 0a 20 20 20   zConflict, .   
11080 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 63 6f           "\", co
11090 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d  nflict-algorithm
110a0 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 3a   must be one of:
110b0 20 72 6f 6c 6c 62 61 63 6b 2c 20 22 0a 20 20 20   rollback, ".   
110c0 20 20 20 20 20 20 20 20 20 22 61 62 6f 72 74 2c           "abort,
110d0 20 66 61 69 6c 2c 20 69 67 6e 6f 72 65 2c 20 6f   fail, ignore, o
110e0 72 20 72 65 70 6c 61 63 65 22 2c 20 28 63 68 61  r replace", (cha
110f0 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 65 74  r*)0);.      ret
11100 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
11110 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d 20     }.    zSql = 
11120 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
11130 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 27  "SELECT * FROM '
11140 25 71 27 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20  %q'", zTable);. 
11150 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29     if( zSql==0 )
11160 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
11170 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
11180 20 22 45 72 72 6f 72 3a 20 6e 6f 20 73 75 63 68   "Error: no such
11190 20 74 61 62 6c 65 3a 20 22 2c 20 7a 54 61 62 6c   table: ", zTabl
111a0 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  e, (char*)0);.  
111b0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
111c0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
111d0 6e 42 79 74 65 20 3d 20 73 74 72 6c 65 6e 33 30  nByte = strlen30
111e0 28 7a 53 71 6c 29 3b 0a 20 20 20 20 72 63 20 3d  (zSql);.    rc =
111f0 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
11200 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  (pDb->db, zSql, 
11210 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
11220 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
11230 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20  (zSql);.    if( 
11240 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  rc ){.      Tcl_
11250 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
11260 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 22 2c 20  erp, "Error: ", 
11270 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
11280 44 62 2d 3e 64 62 29 2c 20 28 63 68 61 72 2a 29  Db->db), (char*)
11290 30 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 20 3d  0);.      nCol =
112a0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
112b0 20 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69       nCol = sqli
112c0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  te3_column_count
112d0 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20  (pStmt);.    }. 
112e0 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
112f0 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
11300 69 66 28 20 6e 43 6f 6c 3d 3d 30 20 29 20 7b 0a  if( nCol==0 ) {.
11310 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
11320 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
11330 20 20 7a 53 71 6c 20 3d 20 6d 61 6c 6c 6f 63 28    zSql = malloc(
11340 20 6e 42 79 74 65 20 2b 20 35 30 20 2b 20 6e 43   nByte + 50 + nC
11350 6f 6c 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20  ol*2 );.    if( 
11360 7a 53 71 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20  zSql==0 ) {.    
11370 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
11380 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f  lt(interp, "Erro
11390 72 3a 20 63 61 6e 27 74 20 6d 61 6c 6c 6f 63 28  r: can't malloc(
113a0 29 22 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  )", (char*)0);. 
113b0 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
113c0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
113d0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
113e0 66 28 6e 42 79 74 65 2b 35 30 2c 20 7a 53 71 6c  f(nByte+50, zSql
113f0 2c 20 22 49 4e 53 45 52 54 20 4f 52 20 25 71 20  , "INSERT OR %q 
11400 49 4e 54 4f 20 27 25 71 27 20 56 41 4c 55 45 53  INTO '%q' VALUES
11410 28 3f 22 2c 0a 20 20 20 20 20 20 20 20 20 7a 43  (?",.         zC
11420 6f 6e 66 6c 69 63 74 2c 20 7a 54 61 62 6c 65 29  onflict, zTable)
11430 3b 0a 20 20 20 20 6a 20 3d 20 73 74 72 6c 65 6e  ;.    j = strlen
11440 33 30 28 7a 53 71 6c 29 3b 0a 20 20 20 20 66 6f  30(zSql);.    fo
11450 72 28 69 3d 31 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=1; i<nCol; i
11460 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c 5b  ++){.      zSql[
11470 6a 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20  j++] = ',';.    
11480 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 3f    zSql[j++] = '?
11490 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71  ';.    }.    zSq
114a0 6c 5b 6a 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20  l[j++] = ')';.  
114b0 20 20 7a 53 71 6c 5b 6a 5d 20 3d 20 30 3b 0a 20    zSql[j] = 0;. 
114c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
114d0 70 72 65 70 61 72 65 28 70 44 62 2d 3e 64 62 2c  prepare(pDb->db,
114e0 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
114f0 74 2c 20 30 29 3b 0a 20 20 20 20 66 72 65 65 28  t, 0);.    free(
11500 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 72  zSql);.    if( r
11510 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  c ){.      Tcl_A
11520 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
11530 72 70 2c 20 22 45 72 72 6f 72 3a 20 22 2c 20 73  rp, "Error: ", s
11540 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44  qlite3_errmsg(pD
11550 62 2d 3e 64 62 29 2c 20 28 63 68 61 72 2a 29 30  b->db), (char*)0
11560 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11570 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
11580 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
11590 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
115a0 20 20 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a      in = fopen(z
115b0 46 69 6c 65 2c 20 22 72 62 22 29 3b 0a 20 20 20  File, "rb");.   
115c0 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20   if( in==0 ){.  
115d0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
115e0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72  sult(interp, "Er
115f0 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e  ror: cannot open
11600 20 66 69 6c 65 3a 20 22 2c 20 7a 46 69 6c 65 2c   file: ", zFile,
11610 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71   NULL);.      sq
11620 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
11630 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74  Stmt);.      ret
11640 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
11650 20 20 20 7d 0a 20 20 20 20 61 7a 43 6f 6c 20 3d     }.    azCol =
11660 20 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28   malloc( sizeof(
11670 61 7a 43 6f 6c 5b 30 5d 29 2a 28 6e 43 6f 6c 2b  azCol[0])*(nCol+
11680 31 29 20 29 3b 0a 20 20 20 20 69 66 28 20 61 7a  1) );.    if( az
11690 43 6f 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20  Col==0 ) {.     
116a0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
116b0 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72  t(interp, "Error
116c0 3a 20 63 61 6e 27 74 20 6d 61 6c 6c 6f 63 28 29  : can't malloc()
116d0 22 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ", (char*)0);.  
116e0 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a      fclose(in);.
116f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
11700 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
11710 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 5f    (void)sqlite3_
11720 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 22 42  exec(pDb->db, "B
11730 45 47 49 4e 22 2c 20 30 2c 20 30 2c 20 30 29 3b  EGIN", 0, 0, 0);
11740 0a 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22  .    zCommit = "
11750 43 4f 4d 4d 49 54 22 3b 0a 20 20 20 20 77 68 69  COMMIT";.    whi
11760 6c 65 28 20 28 7a 4c 69 6e 65 20 3d 20 6c 6f 63  le( (zLine = loc
11770 61 6c 5f 67 65 74 6c 69 6e 65 28 30 2c 20 69 6e  al_getline(0, in
11780 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  ))!=0 ){.      c
11790 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 6c 69  har *z;.      li
117a0 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 61 7a  neno++;.      az
117b0 43 6f 6c 5b 30 5d 20 3d 20 7a 4c 69 6e 65 3b 0a  Col[0] = zLine;.
117c0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 7a        for(i=0, z
117d0 3d 7a 4c 69 6e 65 3b 20 2a 7a 3b 20 7a 2b 2b 29  =zLine; *z; z++)
117e0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a 7a  {.        if( *z
117f0 3d 3d 7a 53 65 70 5b 30 5d 20 26 26 20 73 74 72  ==zSep[0] && str
11800 6e 63 6d 70 28 7a 2c 20 7a 53 65 70 2c 20 6e 53  ncmp(z, zSep, nS
11810 65 70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ep)==0 ){.      
11820 20 20 20 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20      *z = 0;.    
11830 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20        i++;.     
11840 20 20 20 20 20 69 66 28 20 69 3c 6e 43 6f 6c 20       if( i<nCol 
11850 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
11860 7a 43 6f 6c 5b 69 5d 20 3d 20 26 7a 5b 6e 53 65  zCol[i] = &z[nSe
11870 70 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  p];.            
11880 7a 20 2b 3d 20 6e 53 65 70 2d 31 3b 0a 20 20 20  z += nSep-1;.   
11890 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
118a0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
118b0 20 69 66 28 20 69 2b 31 21 3d 6e 43 6f 6c 20 29   if( i+1!=nCol )
118c0 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
118d0 7a 45 72 72 3b 0a 20 20 20 20 20 20 20 20 69 6e  zErr;.        in
118e0 74 20 6e 45 72 72 20 3d 20 73 74 72 6c 65 6e 33  t nErr = strlen3
118f0 30 28 7a 46 69 6c 65 29 20 2b 20 32 30 30 3b 0a  0(zFile) + 200;.
11900 20 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20 6d          zErr = m
11910 61 6c 6c 6f 63 28 6e 45 72 72 29 3b 0a 20 20 20  alloc(nErr);.   
11920 20 20 20 20 20 69 66 28 20 7a 45 72 72 20 29 7b       if( zErr ){
11930 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
11940 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 45 72 72  e3_snprintf(nErr
11950 2c 20 7a 45 72 72 2c 0a 20 20 20 20 20 20 20 20  , zErr,.        
11960 20 20 20 20 20 22 45 72 72 6f 72 3a 20 25 73 20       "Error: %s 
11970 6c 69 6e 65 20 25 64 3a 20 65 78 70 65 63 74 65  line %d: expecte
11980 64 20 25 64 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  d %d columns of 
11990 64 61 74 61 20 62 75 74 20 66 6f 75 6e 64 20 25  data but found %
119a0 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  d",.            
119b0 20 7a 46 69 6c 65 2c 20 6c 69 6e 65 6e 6f 2c 20   zFile, lineno, 
119c0 6e 43 6f 6c 2c 20 69 2b 31 29 3b 0a 20 20 20 20  nCol, i+1);.    
119d0 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
119e0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
119f0 45 72 72 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  Err, (char*)0);.
11a00 20 20 20 20 20 20 20 20 20 20 66 72 65 65 28 7a            free(z
11a10 45 72 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Err);.        }.
11a20 20 20 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20          zCommit 
11a30 3d 20 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20  = "ROLLBACK";.  
11a40 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11a50 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69     }.      for(i
11a60 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
11a70 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 63 68 65  {.        /* che
11a80 63 6b 20 66 6f 72 20 6e 75 6c 6c 20 64 61 74 61  ck for null data
11a90 2c 20 69 66 20 73 6f 2c 20 62 69 6e 64 20 61 73  , if so, bind as
11aa0 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20   null */.       
11ab0 20 69 66 28 20 28 6e 4e 75 6c 6c 3e 30 20 26 26   if( (nNull>0 &&
11ac0 20 73 74 72 63 6d 70 28 61 7a 43 6f 6c 5b 69 5d   strcmp(azCol[i]
11ad0 2c 20 7a 4e 75 6c 6c 29 3d 3d 30 29 0a 20 20 20  , zNull)==0).   
11ae0 20 20 20 20 20 20 20 7c 7c 20 73 74 72 6c 65 6e         || strlen
11af0 33 30 28 61 7a 43 6f 6c 5b 69 5d 29 3d 3d 30 20  30(azCol[i])==0 
11b00 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
11b10 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
11b20 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 69  nd_null(pStmt, i
11b30 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  +1);.        }el
11b40 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  se{.          sq
11b50 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28  lite3_bind_text(
11b60 70 53 74 6d 74 2c 20 69 2b 31 2c 20 61 7a 43 6f  pStmt, i+1, azCo
11b70 6c 5b 69 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45  l[i], -1, SQLITE
11b80 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
11b90 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
11ba0 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70    sqlite3_step(p
11bb0 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 63 20  Stmt);.      rc 
11bc0 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
11bd0 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 66 72  pStmt);.      fr
11be0 65 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20  ee(zLine);.     
11bf0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11c00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  OK ){.        Tc
11c10 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
11c20 6e 74 65 72 70 2c 22 45 72 72 6f 72 3a 20 22 2c  nterp,"Error: ",
11c30 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
11c40 70 44 62 2d 3e 64 62 29 2c 20 28 63 68 61 72 2a  pDb->db), (char*
11c50 29 30 29 3b 0a 20 20 20 20 20 20 20 20 7a 43 6f  )0);.        zCo
11c60 6d 6d 69 74 20 3d 20 22 52 4f 4c 4c 42 41 43 4b  mmit = "ROLLBACK
11c70 22 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ";.        break
11c80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11c90 20 20 20 20 66 72 65 65 28 61 7a 43 6f 6c 29 3b      free(azCol);
11ca0 0a 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b  .    fclose(in);
11cb0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
11cc0 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
11cd0 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 5f    (void)sqlite3_
11ce0 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 7a 43  exec(pDb->db, zC
11cf0 6f 6d 6d 69 74 2c 20 30 2c 20 30 2c 20 30 29 3b  ommit, 0, 0, 0);
11d00 0a 0a 20 20 20 20 69 66 28 20 7a 43 6f 6d 6d 69  ..    if( zCommi
11d10 74 5b 30 5d 20 3d 3d 20 27 43 27 20 29 7b 0a 20  t[0] == 'C' ){. 
11d20 20 20 20 20 20 2f 2a 20 73 75 63 63 65 73 73 2c       /* success,
11d30 20 73 65 74 20 72 65 73 75 6c 74 20 61 73 20 6e   set result as n
11d40 75 6d 62 65 72 20 6f 66 20 6c 69 6e 65 73 20 70  umber of lines p
11d50 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 20 20  rocessed */.    
11d60 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f    pResult = Tcl_
11d70 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  GetObjResult(int
11d80 65 72 70 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f  erp);.      Tcl_
11d90 53 65 74 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c  SetIntObj(pResul
11da0 74 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20  t, lineno);.    
11db0 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20    rc = TCL_OK;. 
11dc0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11dd0 2f 2a 20 66 61 69 6c 75 72 65 2c 20 61 70 70 65  /* failure, appe
11de0 6e 64 20 6c 69 6e 65 6e 6f 20 77 68 65 72 65 20  nd lineno where 
11df0 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20  failed */.      
11e00 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
11e10 28 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 4e 75 6d  (sizeof(zLineNum
11e20 29 2c 20 7a 4c 69 6e 65 4e 75 6d 2c 22 25 64 22  ), zLineNum,"%d"
11e30 2c 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20  ,lineno);.      
11e40 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
11e50 28 69 6e 74 65 72 70 2c 22 2c 20 66 61 69 6c 65  (interp,", faile
11e60 64 20 77 68 69 6c 65 20 70 72 6f 63 65 73 73 69  d while processi
11e70 6e 67 20 6c 69 6e 65 3a 20 22 2c 7a 4c 69 6e 65  ng line: ",zLine
11e80 4e 75 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Num,.           
11e90 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
11ea0 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 63 20  r*)0);.      rc 
11eb0 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  = TCL_ERROR;.   
11ec0 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
11ed0 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
11ee0 24 64 62 20 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f  $db enable_load_
11ef0 65 78 74 65 6e 73 69 6f 6e 20 42 4f 4f 4c 45 41  extension BOOLEA
11f00 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 75 72 6e  N.  **.  ** Turn
11f10 20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e 20 6c   the extension l
11f20 6f 61 64 69 6e 67 20 66 65 61 74 75 72 65 20 6f  oading feature o
11f30 6e 20 6f 72 20 6f 66 66 2e 20 20 49 74 20 69 66  n or off.  It if
11f40 20 6f 66 66 20 62 79 0a 20 20 2a 2a 20 64 65 66   off by.  ** def
11f50 61 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  ault..  */.  cas
11f60 65 20 44 42 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44  e DB_ENABLE_LOAD
11f70 5f 45 58 54 45 4e 53 49 4f 4e 3a 20 7b 0a 23 69  _EXTENSION: {.#i
11f80 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11f90 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
11fa0 0a 20 20 20 20 69 6e 74 20 6f 6e 6f 66 66 3b 0a  .    int onoff;.
11fb0 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20      if( objc!=3 
11fc0 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
11fd0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
11fe0 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 42 4f 4f 4c  , 2, objv, "BOOL
11ff0 45 41 4e 22 29 3b 0a 20 20 20 20 20 20 72 65 74  EAN");.      ret
12000 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
12010 20 20 20 7d 0a 20 20 20 20 69 66 28 20 54 63 6c     }.    if( Tcl
12020 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
12030 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
12040 32 5d 2c 20 26 6f 6e 6f 66 66 29 20 29 7b 0a 20  2], &onoff) ){. 
12050 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
12060 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
12070 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
12080 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 70  load_extension(p
12090 44 62 2d 3e 64 62 2c 20 6f 6e 6f 66 66 29 3b 0a  Db->db, onoff);.
120a0 20 20 20 20 62 72 65 61 6b 3b 0a 23 65 6c 73 65      break;.#else
120b0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
120c0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 65  esult(interp, "e
120d0 78 74 65 6e 73 69 6f 6e 20 6c 6f 61 64 69 6e 67  xtension loading
120e0 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66 20 61   is turned off a
120f0 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 22 2c  t compile-time",
12100 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12110 20 20 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b        (char*)0);
12120 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
12130 45 52 52 4f 52 3b 0a 23 65 6e 64 69 66 0a 20 20  ERROR;.#endif.  
12140 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
12150 24 64 62 20 65 72 72 6f 72 63 6f 64 65 0a 20 20  $db errorcode.  
12160 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74  **.  ** Return t
12170 68 65 20 6e 75 6d 65 72 69 63 20 65 72 72 6f 72  he numeric error
12180 20 63 6f 64 65 20 74 68 61 74 20 77 61 73 20 72   code that was r
12190 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 6d  eturned by the m
121a0 6f 73 74 20 72 65 63 65 6e 74 0a 20 20 2a 2a 20  ost recent.  ** 
121b0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f  call to sqlite3_
121c0 65 78 65 63 28 29 2e 0a 20 20 2a 2f 0a 20 20 63  exec()..  */.  c
121d0 61 73 65 20 44 42 5f 45 52 52 4f 52 43 4f 44 45  ase DB_ERRORCODE
121e0 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f  : {.    Tcl_SetO
121f0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
12200 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73   Tcl_NewIntObj(s
12210 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 70  qlite3_errcode(p
12220 44 62 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20 62  Db->db)));.    b
12230 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
12240 20 20 2a 2a 20 20 20 20 24 64 62 20 65 78 69 73    **    $db exis
12250 74 73 20 24 73 71 6c 0a 20 20 2a 2a 20 20 20 20  ts $sql.  **    
12260 24 64 62 20 6f 6e 65 63 6f 6c 75 6d 6e 20 24 73  $db onecolumn $s
12270 71 6c 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  ql.  **.  ** The
12280 20 6f 6e 65 63 6f 6c 75 6d 6e 20 6d 65 74 68 6f   onecolumn metho
12290 64 20 69 73 20 74 68 65 20 65 71 75 69 76 61 6c  d is the equival
122a0 65 6e 74 20 6f 66 3a 0a 20 20 2a 2a 20 20 20 20  ent of:.  **    
122b0 20 6c 69 6e 64 65 78 20 5b 24 64 62 20 65 76 61   lindex [$db eva
122c0 6c 20 24 73 71 6c 5d 20 30 0a 20 20 2a 2f 0a 20  l $sql] 0.  */. 
122d0 20 63 61 73 65 20 44 42 5f 45 58 49 53 54 53 3a   case DB_EXISTS:
122e0 20 0a 20 20 63 61 73 65 20 44 42 5f 4f 4e 45 43   .  case DB_ONEC
122f0 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 44 62 45  OLUMN: {.    DbE
12300 76 61 6c 43 6f 6e 74 65 78 74 20 73 45 76 61 6c  valContext sEval
12310 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ;.    if( objc!=
12320 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
12330 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
12340 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 51  rp, 2, objv, "SQ
12350 4c 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  L");.      retur
12360 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
12370 20 7d 0a 0a 20 20 20 20 64 62 45 76 61 6c 49 6e   }..    dbEvalIn
12380 69 74 28 26 73 45 76 61 6c 2c 20 70 44 62 2c 20  it(&sEval, pDb, 
12390 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20  objv[2], 0);.   
123a0 20 72 63 20 3d 20 64 62 45 76 61 6c 53 74 65 70   rc = dbEvalStep
123b0 28 26 73 45 76 61 6c 29 3b 0a 20 20 20 20 69 66  (&sEval);.    if
123c0 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f 4f 4e 45  ( choice==DB_ONE
123d0 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20  COLUMN ){.      
123e0 69 66 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29  if( rc==TCL_OK )
123f0 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65  {.        Tcl_Se
12400 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
12410 70 2c 20 64 62 45 76 61 6c 43 6f 6c 75 6d 6e 56  p, dbEvalColumnV
12420 61 6c 75 65 28 26 73 45 76 61 6c 2c 20 30 29 29  alue(&sEval, 0))
12430 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
12440 28 20 72 63 3d 3d 54 43 4c 5f 42 52 45 41 4b 20  ( rc==TCL_BREAK 
12450 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 52  ){.        Tcl_R
12460 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  esetResult(inter
12470 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
12480 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 54 43  }else if( rc==TC
12490 4c 5f 42 52 45 41 4b 20 7c 7c 20 72 63 3d 3d 54  L_BREAK || rc==T
124a0 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54  CL_OK ){.      T
124b0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
124c0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42  interp, Tcl_NewB
124d0 6f 6f 6c 65 61 6e 4f 62 6a 28 72 63 3d 3d 54 43  ooleanObj(rc==TC
124e0 4c 5f 4f 4b 29 29 3b 0a 20 20 20 20 7d 0a 20 20  L_OK));.    }.  
124f0 20 20 64 62 45 76 61 6c 46 69 6e 61 6c 69 7a 65    dbEvalFinalize
12500 28 26 73 45 76 61 6c 29 3b 0a 0a 20 20 20 20 69  (&sEval);..    i
12510 66 28 20 72 63 3d 3d 54 43 4c 5f 42 52 45 41 4b  f( rc==TCL_BREAK
12520 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 54   ){.      rc = T
12530 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  CL_OK;.    }.   
12540 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 20 0a   break;.  }.   .
12550 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62    /*.  **    $db
12560 20 65 76 61 6c 20 24 73 71 6c 20 3f 61 72 72 61   eval $sql ?arra
12570 79 3f 20 3f 7b 20 20 2e 2e 2e 63 6f 64 65 2e 2e  y? ?{  ...code..
12580 2e 20 7d 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  . }?.  **.  ** T
12590 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
125a0 20 69 6e 20 24 73 71 6c 20 69 73 20 65 76 61 6c   in $sql is eval
125b0 75 61 74 65 64 2e 20 20 46 6f 72 20 65 61 63 68  uated.  For each
125c0 20 72 6f 77 2c 20 74 68 65 20 76 61 6c 75 65 73   row, the values
125d0 20 61 72 65 0a 20 20 2a 2a 20 70 6c 61 63 65 64   are.  ** placed
125e0 20 69 6e 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20   in elements of 
125f0 74 68 65 20 61 72 72 61 79 20 6e 61 6d 65 64 20  the array named 
12600 22 61 72 72 61 79 22 20 61 6e 64 20 2e 2e 2e 63  "array" and ...c
12610 6f 64 65 2e 2e 2e 20 69 73 20 65 78 65 63 75 74  ode... is execut
12620 65 64 2e 0a 20 20 2a 2a 20 49 66 20 22 61 72 72  ed..  ** If "arr
12630 61 79 22 20 61 6e 64 20 22 63 6f 64 65 22 20 61  ay" and "code" a
12640 72 65 20 6f 6d 69 74 74 65 64 2c 20 74 68 65 6e  re omitted, then
12650 20 6e 6f 20 63 61 6c 6c 62 61 63 6b 20 69 73 20   no callback is 
12660 65 76 65 72 79 20 69 6e 76 6f 6b 65 64 2e 0a 20  every invoked.. 
12670 20 2a 2a 20 49 66 20 22 61 72 72 61 79 22 20 69   ** If "array" i
12680 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  s an empty strin
12690 67 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  g, then the valu
126a0 65 73 20 61 72 65 20 70 6c 61 63 65 64 20 69 6e  es are placed in
126b0 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20   variables.  ** 
126c0 74 68 61 74 20 68 61 76 65 20 74 68 65 20 73 61  that have the sa
126d0 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 66  me name as the f
126e0 69 65 6c 64 73 20 65 78 74 72 61 63 74 65 64 20  ields extracted 
126f0 62 79 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20  by the query..  
12700 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 45 56 41  */.  case DB_EVA
12710 4c 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a  L: {.    if( obj
12720 63 3c 33 20 7c 7c 20 6f 62 6a 63 3e 35 20 29 7b  c<3 || objc>5 ){
12730 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
12740 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
12750 32 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 20 3f 41  2, objv, "SQL ?A
12760 52 52 41 59 2d 4e 41 4d 45 3f 20 3f 53 43 52 49  RRAY-NAME? ?SCRI
12770 50 54 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74  PT?");.      ret
12780 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
12790 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 6f 62     }..    if( ob
127a0 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 44  jc==3 ){.      D
127b0 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 73 45 76  bEvalContext sEv
127c0 61 6c 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62  al;.      Tcl_Ob
127d0 6a 20 2a 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65  j *pRet = Tcl_Ne
127e0 77 4f 62 6a 28 29 3b 0a 20 20 20 20 20 20 54 63  wObj();.      Tc
127f0 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
12800 52 65 74 29 3b 0a 20 20 20 20 20 20 64 62 45 76  Ret);.      dbEv
12810 61 6c 49 6e 69 74 28 26 73 45 76 61 6c 2c 20 70  alInit(&sEval, p
12820 44 62 2c 20 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b  Db, objv[2], 0);
12830 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 54 43  .      while( TC
12840 4c 5f 4f 4b 3d 3d 28 72 63 20 3d 20 64 62 45 76  L_OK==(rc = dbEv
12850 61 6c 53 74 65 70 28 26 73 45 76 61 6c 29 29 20  alStep(&sEval)) 
12860 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
12870 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43  ;.        int nC
12880 6f 6c 3b 0a 20 20 20 20 20 20 20 20 64 62 45 76  ol;.        dbEv
12890 61 6c 52 6f 77 49 6e 66 6f 28 26 73 45 76 61 6c  alRowInfo(&sEval
128a0 2c 20 26 6e 43 6f 6c 2c 20 30 29 3b 0a 20 20 20  , &nCol, 0);.   
128b0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
128c0 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
128d0 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62        Tcl_ListOb
128e0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
128f0 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 64 62 45  nterp, pRet, dbE
12900 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65 28 26  valColumnValue(&
12910 73 45 76 61 6c 2c 20 69 29 29 3b 0a 20 20 20 20  sEval, i));.    
12920 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
12930 20 20 20 20 64 62 45 76 61 6c 46 69 6e 61 6c 69      dbEvalFinali
12940 7a 65 28 26 73 45 76 61 6c 29 3b 0a 20 20 20 20  ze(&sEval);.    
12950 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 42 52    if( rc==TCL_BR
12960 45 41 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 54  EAK ){.        T
12970 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
12980 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 20  interp, pRet);. 
12990 20 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f         rc = TCL_
129a0 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
129b0 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
129c0 6e 74 28 70 52 65 74 29 3b 0a 20 20 20 20 7d 65  nt(pRet);.    }e
129d0 6c 73 65 7b 0a 20 20 20 20 20 20 43 6c 69 65 6e  lse{.      Clien
129e0 74 44 61 74 61 20 63 64 32 5b 32 5d 3b 0a 20 20  tData cd2[2];.  
129f0 20 20 20 20 44 62 45 76 61 6c 43 6f 6e 74 65 78      DbEvalContex
12a00 74 20 2a 70 3b 0a 20 20 20 20 20 20 54 63 6c 5f  t *p;.      Tcl_
12a10 4f 62 6a 20 2a 70 41 72 72 61 79 20 3d 20 30 3b  Obj *pArray = 0;
12a20 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  .      Tcl_Obj *
12a30 70 53 63 72 69 70 74 3b 0a 0a 20 20 20 20 20 20  pScript;..      
12a40 69 66 28 20 6f 62 6a 63 3d 3d 35 20 26 26 20 2a  if( objc==5 && *
12a50 28 63 68 61 72 20 2a 29 54 63 6c 5f 47 65 74 53  (char *)Tcl_GetS
12a60 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 20 29  tring(objv[3]) )
12a70 7b 0a 20 20 20 20 20 20 20 20 70 41 72 72 61 79  {.        pArray
12a80 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20 20   = objv[3];.    
12a90 20 20 7d 0a 20 20 20 20 20 20 70 53 63 72 69 70    }.      pScrip
12aa0 74 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d  t = objv[objc-1]
12ab0 3b 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72  ;.      Tcl_Incr
12ac0 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74  RefCount(pScript
12ad0 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20  );.      .      
12ae0 70 20 3d 20 28 44 62 45 76 61 6c 43 6f 6e 74 65  p = (DbEvalConte
12af0 78 74 20 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 73  xt *)Tcl_Alloc(s
12b00 69 7a 65 6f 66 28 44 62 45 76 61 6c 43 6f 6e 74  izeof(DbEvalCont
12b10 65 78 74 29 29 3b 0a 20 20 20 20 20 20 64 62 45  ext));.      dbE
12b20 76 61 6c 49 6e 69 74 28 70 2c 20 70 44 62 2c 20  valInit(p, pDb, 
12b30 6f 62 6a 76 5b 32 5d 2c 20 70 41 72 72 61 79 29  objv[2], pArray)
12b40 3b 0a 0a 20 20 20 20 20 20 63 64 32 5b 30 5d 20  ;..      cd2[0] 
12b50 3d 20 28 76 6f 69 64 20 2a 29 70 3b 0a 20 20 20  = (void *)p;.   
12b60 20 20 20 63 64 32 5b 31 5d 20 3d 20 28 76 6f 69     cd2[1] = (voi
12b70 64 20 2a 29 70 53 63 72 69 70 74 3b 0a 20 20 20  d *)pScript;.   
12b80 20 20 20 72 63 20 3d 20 44 62 45 76 61 6c 4e 65     rc = DbEvalNe
12b90 78 74 43 6d 64 28 63 64 32 2c 20 69 6e 74 65 72  xtCmd(cd2, inter
12ba0 70 2c 20 54 43 4c 5f 4f 4b 29 3b 0a 20 20 20 20  p, TCL_OK);.    
12bb0 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
12bc0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20  ..  /*.  **     
12bd0 24 64 62 20 66 75 6e 63 74 69 6f 6e 20 4e 41 4d  $db function NAM
12be0 45 20 5b 2d 61 72 67 63 6f 75 6e 74 20 4e 5d 20  E [-argcount N] 
12bf0 5b 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63 5d  [-deterministic]
12c00 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a   SCRIPT.  **.  *
12c10 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53  * Create a new S
12c20 51 4c 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  QL function call
12c30 65 64 20 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76  ed NAME.  Whenev
12c40 65 72 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e  er that function
12c50 20 69 73 0a 20 20 2a 2a 20 63 61 6c 6c 65 64 2c   is.  ** called,
12c60 20 69 6e 76 6f 6b 65 20 53 43 52 49 50 54 20 74   invoke SCRIPT t
12c70 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 66  o evaluate the f
12c80 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  unction..  */.  
12c90 63 61 73 65 20 44 42 5f 46 55 4e 43 54 49 4f 4e  case DB_FUNCTION
12ca0 3a 20 7b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67  : {.    int flag
12cb0 73 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  s = SQLITE_UTF8;
12cc0 0a 20 20 20 20 53 71 6c 46 75 6e 63 20 2a 70 46  .    SqlFunc *pF
12cd0 75 6e 63 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  unc;.    Tcl_Obj
12ce0 20 2a 70 53 63 72 69 70 74 3b 0a 20 20 20 20 63   *pScript;.    c
12cf0 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20  har *zName;.    
12d00 69 6e 74 20 6e 41 72 67 20 3d 20 2d 31 3b 0a 20  int nArg = -1;. 
12d10 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 66     int i;.    if
12d20 28 20 6f 62 6a 63 3c 34 20 29 7b 0a 20 20 20 20  ( objc<4 ){.    
12d30 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
12d40 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
12d50 6a 76 2c 20 22 4e 41 4d 45 20 3f 53 57 49 54 43  jv, "NAME ?SWITC
12d60 48 45 53 3f 20 53 43 52 49 50 54 22 29 3b 0a 20  HES? SCRIPT");. 
12d70 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
12d80 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
12d90 20 66 6f 72 28 69 3d 33 3b 20 69 3c 28 6f 62 6a   for(i=3; i<(obj
12da0 63 2d 31 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  c-1); i++){.    
12db0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
12dc0 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
12dd0 6f 62 6a 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20  objv[i]);.      
12de0 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30  int n = strlen30
12df0 28 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  (z);.      if( n
12e00 3e 32 20 26 26 20 73 74 72 6e 63 6d 70 28 7a 2c  >2 && strncmp(z,
12e10 20 22 2d 61 72 67 63 6f 75 6e 74 22 2c 6e 29 3d   "-argcount",n)=
12e20 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
12e30 28 20 69 3d 3d 28 6f 62 6a 63 2d 32 29 20 29 7b  ( i==(objc-2) ){
12e40 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 41  .          Tcl_A
12e50 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
12e60 72 70 2c 20 22 6f 70 74 69 6f 6e 20 72 65 71 75  rp, "option requ
12e70 69 72 65 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  ires an argument
12e80 3a 20 22 2c 20 7a 2c 20 30 29 3b 0a 20 20 20 20  : ", z, 0);.    
12e90 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
12ea0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
12eb0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 54 63  }.        if( Tc
12ec0 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
12ed0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 2b 31  interp, objv[i+1
12ee0 5d 2c 20 26 6e 41 72 67 29 20 29 20 72 65 74 75  ], &nArg) ) retu
12ef0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
12f00 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3c 30        if( nArg<0
12f10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63   ){.          Tc
12f20 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
12f30 6e 74 65 72 70 2c 20 22 6e 75 6d 62 65 72 20 6f  nterp, "number o
12f40 66 20 61 72 67 75 6d 65 6e 74 73 20 6d 75 73 74  f arguments must
12f50 20 62 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65   be non-negative
12f60 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
12f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
12f80 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 20  har*)0);.       
12f90 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
12fa0 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ROR;.        }. 
12fb0 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20         i++;.    
12fc0 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 69 66    }else.      if
12fd0 28 20 6e 3e 32 20 26 26 20 73 74 72 6e 63 6d 70  ( n>2 && strncmp
12fe0 28 7a 2c 20 22 2d 64 65 74 65 72 6d 69 6e 69 73  (z, "-determinis
12ff0 74 69 63 22 2c 6e 29 3d 3d 30 20 29 7b 0a 20 20  tic",n)==0 ){.  
13000 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53        flags |= S
13010 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
13020 54 49 43 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  TIC;.      }else
13030 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70  {.        Tcl_Ap
13040 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
13050 70 2c 20 22 62 61 64 20 6f 70 74 69 6f 6e 20 5c  p, "bad option \
13060 22 22 2c 20 7a 2c 20 0a 20 20 20 20 20 20 20 20  "", z, .        
13070 20 20 20 20 22 5c 22 3a 20 6d 75 73 74 20 62 65      "\": must be
13080 20 2d 61 72 67 63 6f 75 6e 74 20 6f 72 20 2d 64   -argcount or -d
13090 65 74 65 72 6d 69 6e 69 73 74 69 63 22 2c 20 30  eterministic", 0
130a0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
130b0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
130c0 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
130d0 20 20 7d 0a 0a 20 20 20 20 70 53 63 72 69 70 74    }..    pScript
130e0 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 3b   = objv[objc-1];
130f0 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 54 63 6c  .    zName = Tcl
13100 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
13110 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20  j(objv[2], 0);. 
13120 20 20 20 70 46 75 6e 63 20 3d 20 66 69 6e 64 53     pFunc = findS
13130 71 6c 46 75 6e 63 28 70 44 62 2c 20 7a 4e 61 6d  qlFunc(pDb, zNam
13140 65 29 3b 0a 20 20 20 20 69 66 28 20 70 46 75 6e  e);.    if( pFun
13150 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 54 43  c==0 ) return TC
13160 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 69 66 28  L_ERROR;.    if(
13170 20 70 46 75 6e 63 2d 3e 70 53 63 72 69 70 74 20   pFunc->pScript 
13180 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63  ){.      Tcl_Dec
13190 72 52 65 66 43 6f 75 6e 74 28 70 46 75 6e 63 2d  rRefCount(pFunc-
131a0 3e 70 53 63 72 69 70 74 29 3b 0a 20 20 20 20 7d  >pScript);.    }
131b0 0a 20 20 20 20 70 46 75 6e 63 2d 3e 70 53 63 72  .    pFunc->pScr
131c0 69 70 74 20 3d 20 70 53 63 72 69 70 74 3b 0a 20  ipt = pScript;. 
131d0 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
131e0 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 20 20  unt(pScript);.  
131f0 20 20 70 46 75 6e 63 2d 3e 75 73 65 45 76 61 6c    pFunc->useEval
13200 4f 62 6a 76 20 3d 20 73 61 66 65 54 6f 55 73 65  Objv = safeToUse
13210 45 76 61 6c 4f 62 6a 76 28 69 6e 74 65 72 70 2c  EvalObjv(interp,
13220 20 70 53 63 72 69 70 74 29 3b 0a 20 20 20 20 72   pScript);.    r
13230 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
13240 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70 44 62 2d  te_function(pDb-
13250 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72 67  >db, zName, nArg
13260 2c 20 66 6c 61 67 73 2c 0a 20 20 20 20 20 20 20  , flags,.       
13270 20 70 46 75 6e 63 2c 20 74 63 6c 53 71 6c 46 75   pFunc, tclSqlFu
13280 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69  nc, 0, 0);.    i
13290 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
132a0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 54   ){.      rc = T
132b0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
132c0 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
132d0 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71  terp, (char *)sq
132e0 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62  lite3_errmsg(pDb
132f0 2d 3e 64 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54  ->db), TCL_VOLAT
13300 49 4c 45 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ILE);.    }.    
13310 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
13320 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 69 6e  .  **     $db in
13330 63 72 62 6c 6f 62 20 3f 2d 72 65 61 64 6f 6e 6c  crblob ?-readonl
13340 79 3f 20 3f 44 42 3f 20 54 41 42 4c 45 20 43 4f  y? ?DB? TABLE CO
13350 4c 55 4d 4e 20 52 4f 57 49 44 0a 20 20 2a 2f 0a  LUMN ROWID.  */.
13360 20 20 63 61 73 65 20 44 42 5f 49 4e 43 52 42 4c    case DB_INCRBL
13370 4f 42 3a 20 7b 0a 23 69 66 64 65 66 20 53 51 4c  OB: {.#ifdef SQL
13380 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
13390 42 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  B.    Tcl_Append
133a0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
133b0 69 6e 63 72 62 6c 6f 62 20 6e 6f 74 20 61 76 61  incrblob not ava
133c0 69 6c 61 62 6c 65 20 69 6e 20 74 68 69 73 20 62  ilable in this b
133d0 75 69 6c 64 22 2c 20 28 63 68 61 72 2a 29 30 29  uild", (char*)0)
133e0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
133f0 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20  _ERROR;.#else.  
13400 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79    int isReadonly
13410 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20   = 0;.    const 
13420 63 68 61 72 20 2a 7a 44 62 20 3d 20 22 6d 61 69  char *zDb = "mai
13430 6e 22 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  n";.    const ch
13440 61 72 20 2a 7a 54 61 62 6c 65 3b 0a 20 20 20 20  ar *zTable;.    
13450 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
13460 75 6d 6e 3b 0a 20 20 20 20 54 63 6c 5f 57 69 64  umn;.    Tcl_Wid
13470 65 49 6e 74 20 69 52 6f 77 3b 0a 0a 20 20 20 20  eInt iRow;..    
13480 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 74 68 65  /* Check for the
13490 20 2d 72 65 61 64 6f 6e 6c 79 20 6f 70 74 69 6f   -readonly optio
134a0 6e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 62 6a  n */.    if( obj
134b0 63 3e 33 20 26 26 20 73 74 72 63 6d 70 28 54 63  c>3 && strcmp(Tc
134c0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
134d0 5b 32 5d 29 2c 20 22 2d 72 65 61 64 6f 6e 6c 79  [2]), "-readonly
134e0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
134f0 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20  sReadonly = 1;. 
13500 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 6f 62     }..    if( ob
13510 6a 63 21 3d 28 35 2b 69 73 52 65 61 64 6f 6e 6c  jc!=(5+isReadonl
13520 79 29 20 26 26 20 6f 62 6a 63 21 3d 28 36 2b 69  y) && objc!=(6+i
13530 73 52 65 61 64 6f 6e 6c 79 29 20 29 7b 0a 20 20  sReadonly) ){.  
13540 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
13550 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
13560 6f 62 6a 76 2c 20 22 3f 2d 72 65 61 64 6f 6e 6c  objv, "?-readonl
13570 79 3f 20 3f 44 42 3f 20 54 41 42 4c 45 20 43 4f  y? ?DB? TABLE CO
13580 4c 55 4d 4e 20 52 4f 57 49 44 22 29 3b 0a 20 20  LUMN ROWID");.  
13590 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
135a0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
135b0 20 69 66 28 20 6f 62 6a 63 3d 3d 28 36 2b 69 73   if( objc==(6+is
135c0 52 65 61 64 6f 6e 6c 79 29 20 29 7b 0a 20 20 20  Readonly) ){.   
135d0 20 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74     zDb = Tcl_Get
135e0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
135f0 0a 20 20 20 20 7d 0a 20 20 20 20 7a 54 61 62 6c  .    }.    zTabl
13600 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
13610 67 28 6f 62 6a 76 5b 6f 62 6a 63 2d 33 5d 29 3b  g(objv[objc-3]);
13620 0a 20 20 20 20 7a 43 6f 6c 75 6d 6e 20 3d 20 54  .    zColumn = T
13630 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
13640 76 5b 6f 62 6a 63 2d 32 5d 29 3b 0a 20 20 20 20  v[objc-2]);.    
13650 72 63 20 3d 20 54 63 6c 5f 47 65 74 57 69 64 65  rc = Tcl_GetWide
13660 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
13670 70 2c 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 2c  p, objv[objc-1],
13680 20 26 69 52 6f 77 29 3b 0a 0a 20 20 20 20 69 66   &iRow);..    if
13690 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a  ( rc==TCL_OK ){.
136a0 20 20 20 20 20 20 72 63 20 3d 20 63 72 65 61 74        rc = creat
136b0 65 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c  eIncrblobChannel
136c0 28 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 65  (.          inte
136d0 72 70 2c 20 70 44 62 2c 20 7a 44 62 2c 20 7a 54  rp, pDb, zDb, zT
136e0 61 62 6c 65 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 28  able, zColumn, (
136f0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 69 52  sqlite3_int64)iR
13700 6f 77 2c 20 69 73 52 65 61 64 6f 6e 6c 79 0a 20  ow, isReadonly. 
13710 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 23 65       );.    }.#e
13720 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a  ndif.    break;.
13730 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
13740 20 20 20 24 64 62 20 69 6e 74 65 72 72 75 70 74     $db interrupt
13750 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 74 65 72  .  **.  ** Inter
13760 72 75 70 74 20 74 68 65 20 65 78 65 63 75 74 69  rupt the executi
13770 6f 6e 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 2d  on of the inner-
13780 6d 6f 73 74 20 53 51 4c 20 69 6e 74 65 72 70 72  most SQL interpr
13790 65 74 65 72 2e 20 20 54 68 69 73 0a 20 20 2a 2a  eter.  This.  **
137a0 20 63 61 75 73 65 73 20 74 68 65 20 53 51 4c 20   causes the SQL 
137b0 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 72 65 74  statement to ret
137c0 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 6f 66 20  urn an error of 
137d0 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
137e0 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
137f0 5f 49 4e 54 45 52 52 55 50 54 3a 20 7b 0a 20 20  _INTERRUPT: {.  
13800 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72    sqlite3_interr
13810 75 70 74 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20  upt(pDb->db);.  
13820 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
13830 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20  /*.  **     $db 
13840 6e 75 6c 6c 76 61 6c 75 65 20 3f 53 54 52 49 4e  nullvalue ?STRIN
13850 47 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 68 61  G?.  **.  ** Cha
13860 6e 67 65 20 74 65 78 74 20 75 73 65 64 20 77 68  nge text used wh
13870 65 6e 20 61 20 4e 55 4c 4c 20 63 6f 6d 65 73 20  en a NULL comes 
13880 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 64 61  back from the da
13890 74 61 62 61 73 65 2e 20 49 66 20 3f 53 54 52 49  tabase. If ?STRI
138a0 4e 47 3f 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20  NG?.  ** is not 
138b0 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 74 68  present, then th
138c0 65 20 63 75 72 72 65 6e 74 20 73 74 72 69 6e 67  e current string
138d0 20 75 73 65 64 20 66 6f 72 20 4e 55 4c 4c 20 69   used for NULL i
138e0 73 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2a  s returned..  **
138f0 20 49 66 20 53 54 52 49 4e 47 20 69 73 20 70 72   If STRING is pr
13900 65 73 65 6e 74 2c 20 74 68 65 6e 20 53 54 52 49  esent, then STRI
13910 4e 47 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  NG is returned..
13920 20 20 2a 2a 0a 20 20 2a 2f 0a 20 20 63 61 73 65    **.  */.  case
13930 20 44 42 5f 4e 55 4c 4c 56 41 4c 55 45 3a 20 7b   DB_NULLVALUE: {
13940 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  .    if( objc!=2
13950 20 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20   && objc!=3 ){. 
13960 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
13970 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
13980 20 6f 62 6a 76 2c 20 22 4e 55 4c 4c 56 41 4c 55   objv, "NULLVALU
13990 45 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  E");.      retur
139a0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
139b0 20 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d   }.    if( objc=
139c0 3d 33 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =3 ){.      int 
139d0 6c 65 6e 3b 0a 20 20 20 20 20 20 63 68 61 72 20  len;.      char 
139e0 2a 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f 47 65 74  *zNull = Tcl_Get
139f0 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
13a00 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20  jv[2], &len);.  
13a10 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 4e 75      if( pDb->zNu
13a20 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  ll ){.        Tc
13a30 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 4e 75 6c  l_Free(pDb->zNul
13a40 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
13a50 20 20 69 66 28 20 7a 4e 75 6c 6c 20 26 26 20 6c    if( zNull && l
13a60 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  en>0 ){.        
13a70 70 44 62 2d 3e 7a 4e 75 6c 6c 20 3d 20 54 63 6c  pDb->zNull = Tcl
13a80 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20  _Alloc( len + 1 
13a90 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  );.        memcp
13aa0 79 28 70 44 62 2d 3e 7a 4e 75 6c 6c 2c 20 7a 4e  y(pDb->zNull, zN
13ab0 75 6c 6c 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 20  ull, len);.     
13ac0 20 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c 5b 6c 65     pDb->zNull[le
13ad0 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20  n] = '\0';.     
13ae0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
13af0 70 44 62 2d 3e 7a 4e 75 6c 6c 20 3d 20 30 3b 0a  pDb->zNull = 0;.
13b00 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
13b10 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
13b20 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
13b30 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 44 62 2d  ewStringObj(pDb-
13b40 3e 7a 4e 75 6c 6c 2c 20 2d 31 29 29 3b 0a 20 20  >zNull, -1));.  
13b50 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
13b60 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20  /*.  **     $db 
13b70 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
13b80 64 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74  d .  **.  ** Ret
13b90 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77  urn an integer w
13ba0 68 69 63 68 20 69 73 20 74 68 65 20 52 4f 57 49  hich is the ROWI
13bb0 44 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72  D for the most r
13bc0 65 63 65 6e 74 20 69 6e 73 65 72 74 2e 0a 20 20  ecent insert..  
13bd0 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 4c 41 53  */.  case DB_LAS
13be0 54 5f 49 4e 53 45 52 54 5f 52 4f 57 49 44 3a 20  T_INSERT_ROWID: 
13bf0 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  {.    Tcl_Obj *p
13c00 52 65 73 75 6c 74 3b 0a 20 20 20 20 54 63 6c 5f  Result;.    Tcl_
13c10 57 69 64 65 49 6e 74 20 72 6f 77 69 64 3b 0a 20  WideInt rowid;. 
13c20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29     if( objc!=2 )
13c30 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
13c40 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
13c50 20 32 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20   2, objv, "");. 
13c60 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
13c70 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
13c80 20 72 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33   rowid = sqlite3
13c90 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77  _last_insert_row
13ca0 69 64 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20 20  id(pDb->db);.   
13cb0 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47   pResult = Tcl_G
13cc0 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
13cd0 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  rp);.    Tcl_Set
13ce0 57 69 64 65 49 6e 74 4f 62 6a 28 70 52 65 73 75  WideIntObj(pResu
13cf0 6c 74 2c 20 72 6f 77 69 64 29 3b 0a 20 20 20 20  lt, rowid);.    
13d00 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
13d10 0a 20 20 2a 2a 20 54 68 65 20 44 42 5f 4f 4e 45  .  ** The DB_ONE
13d20 43 4f 4c 55 4d 4e 20 6d 65 74 68 6f 64 20 69 73  COLUMN method is
13d30 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 74 6f 67   implemented tog
13d40 65 74 68 65 72 20 77 69 74 68 20 44 42 5f 45 58  ether with DB_EX
13d50 49 53 54 53 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a  ISTS..  */..  /*
13d60 20 20 20 20 24 64 62 20 70 72 6f 67 72 65 73 73      $db progress
13d70 20 3f 4e 20 43 41 4c 4c 42 41 43 4b 3f 0a 20 20   ?N CALLBACK?.  
13d80 2a 2a 20 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20  ** .  ** Invoke 
13d90 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62 61  the given callba
13da0 63 6b 20 65 76 65 72 79 20 4e 20 76 69 72 74 75  ck every N virtu
13db0 61 6c 20 6d 61 63 68 69 6e 65 20 6f 70 63 6f 64  al machine opcod
13dc0 65 73 20 77 68 69 6c 65 20 65 78 65 63 75 74 69  es while executi
13dd0 6e 67 0a 20 20 2a 2a 20 71 75 65 72 69 65 73 2e  ng.  ** queries.
13de0 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
13df0 50 52 4f 47 52 45 53 53 3a 20 7b 0a 20 20 20 20  PROGRESS: {.    
13e00 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20  if( objc==2 ){. 
13e10 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50       if( pDb->zP
13e20 72 6f 67 72 65 73 73 20 29 7b 0a 20 20 20 20 20  rogress ){.     
13e30 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
13e40 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d  ult(interp, pDb-
13e50 3e 7a 50 72 6f 67 72 65 73 73 2c 20 28 63 68 61  >zProgress, (cha
13e60 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  r*)0);.      }. 
13e70 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a     }else if( obj
13e80 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 63 68  c==4 ){.      ch
13e90 61 72 20 2a 7a 50 72 6f 67 72 65 73 73 3b 0a 20  ar *zProgress;. 
13ea0 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20       int len;.  
13eb0 20 20 20 20 69 6e 74 20 4e 3b 0a 20 20 20 20 20      int N;.     
13ec0 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c   if( TCL_OK!=Tcl
13ed0 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
13ee0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
13ef0 26 4e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  &N) ){.        r
13f00 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
13f10 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20  .      };.      
13f20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65  if( pDb->zProgre
13f30 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  ss ){.        Tc
13f40 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 50 72 6f  l_Free(pDb->zPro
13f50 67 72 65 73 73 29 3b 0a 20 20 20 20 20 20 7d 0a  gress);.      }.
13f60 20 20 20 20 20 20 7a 50 72 6f 67 72 65 73 73 20        zProgress 
13f70 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
13f80 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20  romObj(objv[3], 
13f90 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  &len);.      if(
13fa0 20 7a 50 72 6f 67 72 65 73 73 20 26 26 20 6c 65   zProgress && le
13fb0 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  n>0 ){.        p
13fc0 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 3d 20  Db->zProgress = 
13fd0 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b  Tcl_Alloc( len +
13fe0 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65   1 );.        me
13ff0 6d 63 70 79 28 70 44 62 2d 3e 7a 50 72 6f 67 72  mcpy(pDb->zProgr
14000 65 73 73 2c 20 7a 50 72 6f 67 72 65 73 73 2c 20  ess, zProgress, 
14010 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65  len+1);.      }e
14020 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62  lse{.        pDb
14030 2d 3e 7a 50 72 6f 67 72 65 73 73 20 3d 20 30 3b  ->zProgress = 0;
14040 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  .      }.#ifndef
14050 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f   SQLITE_OMIT_PRO
14060 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 20  GRESS_CALLBACK. 
14070 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50       if( pDb->zP
14080 72 6f 67 72 65 73 73 20 29 7b 0a 20 20 20 20 20  rogress ){.     
14090 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d     pDb->interp =
140a0 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20   interp;.       
140b0 20 73 71 6c 69 74 65 33 5f 70 72 6f 67 72 65 73   sqlite3_progres
140c0 73 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64  s_handler(pDb->d
140d0 62 2c 20 4e 2c 20 44 62 50 72 6f 67 72 65 73 73  b, N, DbProgress
140e0 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20  Handler, pDb);. 
140f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
14100 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 67      sqlite3_prog
14110 72 65 73 73 5f 68 61 6e 64 6c 65 72 28 70 44 62  ress_handler(pDb
14120 2d 3e 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  ->db, 0, 0, 0);.
14130 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
14140 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14150 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
14160 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
14170 2c 20 22 4e 20 43 41 4c 4c 42 41 43 4b 22 29 3b  , "N CALLBACK");
14180 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
14190 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
141a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
141b0 20 2f 2a 20 20 20 20 24 64 62 20 70 72 6f 66 69   /*    $db profi
141c0 6c 65 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20  le ?CALLBACK?.  
141d0 2a 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20 61 72 72  **.  ** Make arr
141e0 61 6e 67 65 6d 65 6e 74 73 20 74 6f 20 69 6e 76  angements to inv
141f0 6f 6b 65 20 74 68 65 20 43 41 4c 4c 42 41 43 4b  oke the CALLBACK
14200 20 72 6f 75 74 69 6e 65 20 61 66 74 65 72 20 65   routine after e
14210 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ach SQL statemen
14220 74 0a 20 20 2a 2a 20 74 68 61 74 20 68 61 73 20  t.  ** that has 
14230 72 75 6e 2e 20 20 54 68 65 20 74 65 78 74 20 6f  run.  The text o
14240 66 20 74 68 65 20 53 51 4c 20 61 6e 64 20 74 68  f the SQL and th
14250 65 20 61 6d 6f 75 6e 74 20 6f 66 20 65 6c 61 70  e amount of elap
14260 73 65 20 74 69 6d 65 20 61 72 65 0a 20 20 2a 2a  se time are.  **
14270 20 61 70 70 65 6e 64 65 64 20 74 6f 20 43 41 4c   appended to CAL
14280 4c 42 41 43 4b 20 62 65 66 6f 72 65 20 74 68 65  LBACK before the
14290 20 73 63 72 69 70 74 20 69 73 20 72 75 6e 2e 0a   script is run..
142a0 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 50    */.  case DB_P
142b0 52 4f 46 49 4c 45 3a 20 7b 0a 20 20 20 20 69 66  ROFILE: {.    if
142c0 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20  ( objc>3 ){.    
142d0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
142e0 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
142f0 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22  jv, "?CALLBACK?"
14300 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
14310 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
14320 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32  else if( objc==2
14330 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44   ){.      if( pD
14340 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a 20  b->zProfile ){. 
14350 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
14360 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
14370 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 2c 20 28  pDb->zProfile, (
14380 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
14390 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
143a0 20 20 20 63 68 61 72 20 2a 7a 50 72 6f 66 69 6c     char *zProfil
143b0 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  e;.      int len
143c0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  ;.      if( pDb-
143d0 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20  >zProfile ){.   
143e0 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44       Tcl_Free(pD
143f0 62 2d 3e 7a 50 72 6f 66 69 6c 65 29 3b 0a 20 20  b->zProfile);.  
14400 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 50 72 6f      }.      zPro
14410 66 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  file = Tcl_GetSt
14420 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
14430 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20  [2], &len);.    
14440 20 20 69 66 28 20 7a 50 72 6f 66 69 6c 65 20 26    if( zProfile &
14450 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20  & len>0 ){.     
14460 20 20 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65     pDb->zProfile
14470 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65   = Tcl_Alloc( le
14480 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20  n + 1 );.       
14490 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 50 72   memcpy(pDb->zPr
144a0 6f 66 69 6c 65 2c 20 7a 50 72 6f 66 69 6c 65 2c  ofile, zProfile,
144b0 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d   len+1);.      }
144c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44  else{.        pD
144d0 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 3d 20 30 3b  b->zProfile = 0;
144e0 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 21 64 65  .      }.#if !de
144f0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
14500 54 5f 54 52 41 43 45 29 20 26 26 20 21 64 65 66  T_TRACE) && !def
14510 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
14520 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29  _FLOATING_POINT)
14530 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
14540 7a 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20  zProfile ){.    
14550 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20      pDb->interp 
14560 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20  = interp;.      
14570 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c    sqlite3_profil
14580 65 28 70 44 62 2d 3e 64 62 2c 20 44 62 50 72 6f  e(pDb->db, DbPro
14590 66 69 6c 65 48 61 6e 64 6c 65 72 2c 20 70 44 62  fileHandler, pDb
145a0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
145b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
145c0 70 72 6f 66 69 6c 65 28 70 44 62 2d 3e 64 62 2c  profile(pDb->db,
145d0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
145e0 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
145f0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
14600 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 72  *.  **     $db r
14610 65 6b 65 79 20 4b 45 59 0a 20 20 2a 2a 0a 20 20  ekey KEY.  **.  
14620 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 65 6e  ** Change the en
14630 63 72 79 70 74 69 6f 6e 20 6b 65 79 20 6f 6e 20  cryption key on 
14640 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70  the currently op
14650 65 6e 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  en database..  *
14660 2f 0a 20 20 63 61 73 65 20 44 42 5f 52 45 4b 45  /.  case DB_REKE
14670 59 3a 20 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  Y: {.#ifdef SQLI
14680 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20  TE_HAS_CODEC.   
14690 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20 76   int nKey;.    v
146a0 6f 69 64 20 2a 70 4b 65 79 3b 0a 23 65 6e 64 69  oid *pKey;.#endi
146b0 66 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  f.    if( objc!=
146c0 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
146d0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
146e0 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4b 45  rp, 2, objv, "KE
146f0 59 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Y");.      retur
14700 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
14710 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
14720 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 70  _HAS_CODEC.    p
14730 4b 65 79 20 3d 20 54 63 6c 5f 47 65 74 42 79 74  Key = Tcl_GetByt
14740 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62  eArrayFromObj(ob
14750 6a 76 5b 32 5d 2c 20 26 6e 4b 65 79 29 3b 0a 20  jv[2], &nKey);. 
14760 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
14770 72 65 6b 65 79 28 70 44 62 2d 3e 64 62 2c 20 70  rekey(pDb->db, p
14780 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 20 20  Key, nKey);.    
14790 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
147a0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
147b0 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33  (interp, sqlite3
147c0 5f 65 72 72 73 74 72 28 72 63 29 2c 20 28 63 68  _errstr(rc), (ch
147d0 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 63  ar*)0);.      rc
147e0 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20   = TCL_ERROR;.  
147f0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 62    }.#endif.    b
14800 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  reak;.  }..  /* 
14810 20 20 20 24 64 62 20 72 65 73 74 6f 72 65 20 3f     $db restore ?
14820 44 41 54 41 42 41 53 45 3f 20 46 49 4c 45 4e 41  DATABASE? FILENA
14830 4d 45 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 70 65  ME.  **.  ** Ope
14840 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  n a database fil
14850 65 20 6e 61 6d 65 64 20 46 49 4c 45 4e 41 4d 45  e named FILENAME
14860 2e 20 20 54 72 61 6e 73 66 65 72 20 74 68 65 20  .  Transfer the 
14870 63 6f 6e 74 65 6e 74 20 0a 20 20 2a 2a 20 6f 66  content .  ** of
14880 20 46 49 4c 45 4e 41 4d 45 20 69 6e 74 6f 20 74   FILENAME into t
14890 68 65 20 6c 6f 63 61 6c 20 64 61 74 61 62 61 73  he local databas
148a0 65 20 44 41 54 41 42 41 53 45 20 28 64 65 66 61  e DATABASE (defa
148b0 75 6c 74 3a 20 22 6d 61 69 6e 22 29 2e 0a 20 20  ult: "main")..  
148c0 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 52 45 53  */.  case DB_RES
148d0 54 4f 52 45 3a 20 7b 0a 20 20 20 20 63 6f 6e 73  TORE: {.    cons
148e0 74 20 63 68 61 72 20 2a 7a 53 72 63 46 69 6c 65  t char *zSrcFile
148f0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
14900 20 2a 7a 44 65 73 74 44 62 3b 0a 20 20 20 20 73   *zDestDb;.    s
14910 71 6c 69 74 65 33 20 2a 70 53 72 63 3b 0a 20 20  qlite3 *pSrc;.  
14920 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70    sqlite3_backup
14930 20 2a 70 42 61 63 6b 75 70 3b 0a 20 20 20 20 69   *pBackup;.    i
14940 6e 74 20 6e 54 69 6d 65 6f 75 74 20 3d 20 30 3b  nt nTimeout = 0;
14950 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d  ..    if( objc==
14960 33 20 29 7b 0a 20 20 20 20 20 20 7a 44 65 73 74  3 ){.      zDest
14970 44 62 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20  Db = "main";.   
14980 20 20 20 7a 53 72 63 46 69 6c 65 20 3d 20 54 63     zSrcFile = Tc
14990 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
149a0 5b 32 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  [2]);.    }else 
149b0 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20  if( objc==4 ){. 
149c0 20 20 20 20 20 7a 44 65 73 74 44 62 20 3d 20 54       zDestDb = T
149d0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
149e0 76 5b 32 5d 29 3b 0a 20 20 20 20 20 20 7a 53 72  v[2]);.      zSr
149f0 63 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53  cFile = Tcl_GetS
14a00 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a  tring(objv[3]);.
14a10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14a20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
14a30 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
14a40 76 2c 20 22 3f 44 41 54 41 42 41 53 45 3f 20 46  v, "?DATABASE? F
14a50 49 4c 45 4e 41 4d 45 22 29 3b 0a 20 20 20 20 20  ILENAME");.     
14a60 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
14a70 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  R;.    }.    rc 
14a80 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76  = sqlite3_open_v
14a90 32 28 7a 53 72 63 46 69 6c 65 2c 20 26 70 53 72  2(zSrcFile, &pSr
14aa0 63 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  c, SQLITE_OPEN_R
14ab0 45 41 44 4f 4e 4c 59 2c 20 30 29 3b 0a 20 20 20  EADONLY, 0);.   
14ac0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
14ad0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  OK ){.      Tcl_
14ae0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
14af0 65 72 70 2c 20 22 63 61 6e 6e 6f 74 20 6f 70 65  erp, "cannot ope
14b00 6e 20 73 6f 75 72 63 65 20 64 61 74 61 62 61 73  n source databas
14b10 65 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20  e: ",.          
14b20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
14b30 70 53 72 63 29 2c 20 28 63 68 61 72 2a 29 30 29  pSrc), (char*)0)
14b40 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
14b50 63 6c 6f 73 65 28 70 53 72 63 29 3b 0a 20 20 20  close(pSrc);.   
14b60 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
14b70 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ROR;.    }.    p
14b80 42 61 63 6b 75 70 20 3d 20 73 71 6c 69 74 65 33  Backup = sqlite3
14b90 5f 62 61 63 6b 75 70 5f 69 6e 69 74 28 70 44 62  _backup_init(pDb
14ba0 2d 3e 64 62 2c 20 7a 44 65 73 74 44 62 2c 20 70  ->db, zDestDb, p
14bb0 53 72 63 2c 20 22 6d 61 69 6e 22 29 3b 0a 20 20  Src, "main");.  
14bc0 20 20 69 66 28 20 70 42 61 63 6b 75 70 3d 3d 30    if( pBackup==0
14bd0 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
14be0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
14bf0 70 2c 20 22 72 65 73 74 6f 72 65 20 66 61 69 6c  p, "restore fail
14c00 65 64 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20  ed: ",.         
14c10 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67    sqlite3_errmsg
14c20 28 70 44 62 2d 3e 64 62 29 2c 20 28 63 68 61 72  (pDb->db), (char
14c30 2a 29 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  *)0);.      sqli
14c40 74 65 33 5f 63 6c 6f 73 65 28 70 53 72 63 29 3b  te3_close(pSrc);
14c50 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
14c60 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
14c70 20 20 20 77 68 69 6c 65 28 20 28 72 63 20 3d 20     while( (rc = 
14c80 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 73  sqlite3_backup_s
14c90 74 65 70 28 70 42 61 63 6b 75 70 2c 31 30 30 29  tep(pBackup,100)
14ca0 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20  )==SQLITE_OK.   
14cb0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 72 63             || rc
14cc0 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b  ==SQLITE_BUSY ){
14cd0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
14ce0 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
14cf0 20 20 20 20 20 20 69 66 28 20 6e 54 69 6d 65 6f        if( nTimeo
14d00 75 74 2b 2b 20 3e 3d 20 33 20 29 20 62 72 65 61  ut++ >= 3 ) brea
14d10 6b 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  k;.        sqlit
14d20 65 33 5f 73 6c 65 65 70 28 31 30 30 29 3b 0a 20  e3_sleep(100);. 
14d30 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
14d40 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f   sqlite3_backup_
14d50 66 69 6e 69 73 68 28 70 42 61 63 6b 75 70 29 3b  finish(pBackup);
14d60 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
14d70 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
14d80 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20    rc = TCL_OK;. 
14d90 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d     }else if( rc=
14da0 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20  =SQLITE_BUSY || 
14db0 72 63 3d 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  rc==SQLITE_LOCKE
14dc0 44 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  D ){.      Tcl_A
14dd0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
14de0 72 70 2c 20 22 72 65 73 74 6f 72 65 20 66 61 69  rp, "restore fai
14df0 6c 65 64 3a 20 73 6f 75 72 63 65 20 64 61 74 61  led: source data
14e00 62 61 73 65 20 62 75 73 79 22 2c 0a 20 20 20 20  base busy",.    
14e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e20 20 20 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20     (char*)0);.  
14e30 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52      rc = TCL_ERR
14e40 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  OR;.    }else{. 
14e50 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
14e60 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 72  esult(interp, "r
14e70 65 73 74 6f 72 65 20 66 61 69 6c 65 64 3a 20 22  estore failed: "
14e80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  ,.           sql
14e90 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d  ite3_errmsg(pDb-
14ea0 3e 64 62 29 2c 20 28 63 68 61 72 2a 29 30 29 3b  >db), (char*)0);
14eb0 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f  .      rc = TCL_
14ec0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
14ed0 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70   sqlite3_close(p
14ee0 53 72 63 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  Src);.    break;
14ef0 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
14f00 20 20 20 20 24 64 62 20 73 74 61 74 75 73 20 28      $db status (
14f10 73 74 65 70 7c 73 6f 72 74 7c 61 75 74 6f 69 6e  step|sort|autoin
14f20 64 65 78 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44  dex).  **.  ** D
14f30 69 73 70 6c 61 79 20 53 51 4c 49 54 45 5f 53 54  isplay SQLITE_ST
14f40 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41  MTSTATUS_FULLSCA
14f50 4e 5f 53 54 45 50 20 6f 72 20 0a 20 20 2a 2a 20  N_STEP or .  ** 
14f60 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
14f70 53 5f 53 4f 52 54 20 66 6f 72 20 74 68 65 20 6d  S_SORT for the m
14f80 6f 73 74 20 72 65 63 65 6e 74 20 65 76 61 6c 2e  ost recent eval.
14f90 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
14fa0 53 54 41 54 55 53 3a 20 7b 0a 20 20 20 20 69 6e  STATUS: {.    in
14fb0 74 20 76 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  t v;.    const c
14fc0 68 61 72 20 2a 7a 4f 70 3b 0a 20 20 20 20 69 66  har *zOp;.    if
14fd0 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
14fe0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
14ff0 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
15000 62 6a 76 2c 20 22 28 73 74 65 70 7c 73 6f 72 74  bjv, "(step|sort
15010 7c 61 75 74 6f 69 6e 64 65 78 29 22 29 3b 0a 20  |autoindex)");. 
15020 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
15030 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
15040 20 7a 4f 70 20 3d 20 54 63 6c 5f 47 65 74 53 74   zOp = Tcl_GetSt
15050 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
15060 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4f     if( strcmp(zO
15070 70 2c 20 22 73 74 65 70 22 29 3d 3d 30 20 29 7b  p, "step")==0 ){
15080 0a 20 20 20 20 20 20 76 20 3d 20 70 44 62 2d 3e  .      v = pDb->
15090 6e 53 74 65 70 3b 0a 20 20 20 20 7d 65 6c 73 65  nStep;.    }else
150a0 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4f 70 2c   if( strcmp(zOp,
150b0 20 22 73 6f 72 74 22 29 3d 3d 30 20 29 7b 0a 20   "sort")==0 ){. 
150c0 20 20 20 20 20 76 20 3d 20 70 44 62 2d 3e 6e 53       v = pDb->nS
150d0 6f 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ort;.    }else i
150e0 66 28 20 73 74 72 63 6d 70 28 7a 4f 70 2c 20 22  f( strcmp(zOp, "
150f0 61 75 74 6f 69 6e 64 65 78 22 29 3d 3d 30 20 29  autoindex")==0 )
15100 7b 0a 20 20 20 20 20 20 76 20 3d 20 70 44 62 2d  {.      v = pDb-
15110 3e 6e 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c  >nIndex;.    }el
15120 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  se{.      Tcl_Ap
15130 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
15140 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  p, .            
15150 22 62 61 64 20 61 72 67 75 6d 65 6e 74 3a 20 73  "bad argument: s
15160 68 6f 75 6c 64 20 62 65 20 61 75 74 6f 69 6e 64  hould be autoind
15170 65 78 2c 20 73 74 65 70 2c 20 6f 72 20 73 6f 72  ex, step, or sor
15180 74 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  t", .           
15190 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
151a0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
151b0 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63  OR;.    }.    Tc
151c0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
151d0 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
151e0 74 4f 62 6a 28 76 29 29 3b 0a 20 20 20 20 62 72  tObj(v));.    br
151f0 65 61 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  eak;.  }.  .  /*
15200 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 74 69  .  **     $db ti
15210 6d 65 6f 75 74 20 4d 49 4c 4c 45 53 45 43 4f 4e  meout MILLESECON
15220 44 53 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 65 6c  DS.  **.  ** Del
15230 61 79 20 66 6f 72 20 74 68 65 20 6e 75 6d 62 65  ay for the numbe
15240 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  r of millisecond
15250 73 20 73 70 65 63 69 66 69 65 64 20 77 68 65 6e  s specified when
15260 20 61 20 66 69 6c 65 20 69 73 20 6c 6f 63 6b 65   a file is locke
15270 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  d..  */.  case D
15280 42 5f 54 49 4d 45 4f 55 54 3a 20 7b 0a 20 20 20  B_TIMEOUT: {.   
15290 20 69 6e 74 20 6d 73 3b 0a 20 20 20 20 69 66 28   int ms;.    if(
152a0 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
152b0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
152c0 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
152d0 6a 76 2c 20 22 4d 49 4c 4c 49 53 45 43 4f 4e 44  jv, "MILLISECOND
152e0 53 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  S");.      retur
152f0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
15300 20 7d 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47   }.    if( Tcl_G
15310 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
15320 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6d  erp, objv[2], &m
15330 73 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  s) ) return TCL_
15340 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74  ERROR;.    sqlit
15350 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28  e3_busy_timeout(
15360 70 44 62 2d 3e 64 62 2c 20 6d 73 29 3b 0a 20 20  pDb->db, ms);.  
15370 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 0a    break;.  }.  .
15380 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64    /*.  **     $d
15390 62 20 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 0a  b total_changes.
153a0 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e    **.  ** Return
153b0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
153c0 6f 77 73 20 74 68 61 74 20 77 65 72 65 20 6d 6f  ows that were mo
153d0 64 69 66 69 65 64 2c 20 69 6e 73 65 72 74 65 64  dified, inserted
153e0 2c 20 6f 72 20 64 65 6c 65 74 65 64 20 0a 20 20  , or deleted .  
153f0 2a 2a 20 73 69 6e 63 65 20 74 68 65 20 64 61 74  ** since the dat
15400 61 62 61 73 65 20 68 61 6e 64 6c 65 20 77 61 73  abase handle was
15410 20 63 72 65 61 74 65 64 2e 0a 20 20 2a 2f 0a 20   created..  */. 
15420 20 63 61 73 65 20 44 42 5f 54 4f 54 41 4c 5f 43   case DB_TOTAL_C
15430 48 41 4e 47 45 53 3a 20 7b 0a 20 20 20 20 54 63  HANGES: {.    Tc
15440 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a  l_Obj *pResult;.
15450 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20      if( objc!=2 
15460 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
15470 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
15480 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a  , 2, objv, "");.
15490 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
154a0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
154b0 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f    pResult = Tcl_
154c0 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  GetObjResult(int
154d0 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  erp);.    Tcl_Se
154e0 74 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c  tIntObj(pResult,
154f0 20 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63   sqlite3_total_c
15500 68 61 6e 67 65 73 28 70 44 62 2d 3e 64 62 29 29  hanges(pDb->db))
15510 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
15520 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 74 72  ..  /*    $db tr
15530 61 63 65 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20  ace ?CALLBACK?. 
15540 20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20 61 72   **.  ** Make ar
15550 72 61 6e 67 65 6d 65 6e 74 73 20 74 6f 20 69 6e  rangements to in
15560 76 6f 6b 65 20 74 68 65 20 43 41 4c 4c 42 41 43  voke the CALLBAC
15570 4b 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 65 61  K routine for ea
15580 63 68 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ch SQL statement
15590 0a 20 20 2a 2a 20 74 68 61 74 20 69 73 20 65 78  .  ** that is ex
155a0 65 63 75 74 65 64 2e 20 20 54 68 65 20 74 65 78  ecuted.  The tex
155b0 74 20 6f 66 20 74 68 65 20 53 51 4c 20 69 73 20  t of the SQL is 
155c0 61 70 70 65 6e 64 65 64 20 74 6f 20 43 41 4c 4c  appended to CALL
155d0 42 41 43 4b 20 62 65 66 6f 72 65 0a 20 20 2a 2a  BACK before.  **
155e0 20 69 74 20 69 73 20 65 78 65 63 75 74 65 64 2e   it is executed.
155f0 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
15600 54 52 41 43 45 3a 20 7b 0a 20 20 20 20 69 66 28  TRACE: {.    if(
15610 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20   objc>3 ){.     
15620 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
15630 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
15640 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29  v, "?CALLBACK?")
15650 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
15660 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65  CL_ERROR;.    }e
15670 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20  lse if( objc==2 
15680 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  ){.      if( pDb
15690 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20 20 20  ->zTrace ){.    
156a0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
156b0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62  sult(interp, pDb
156c0 2d 3e 7a 54 72 61 63 65 2c 20 28 63 68 61 72 2a  ->zTrace, (char*
156d0 29 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  )0);.      }.   
156e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
156f0 61 72 20 2a 7a 54 72 61 63 65 3b 0a 20 20 20 20  ar *zTrace;.    
15700 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20    int len;.     
15710 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65   if( pDb->zTrace
15720 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
15730 46 72 65 65 28 70 44 62 2d 3e 7a 54 72 61 63 65  Free(pDb->zTrace
15740 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
15750 20 7a 54 72 61 63 65 20 3d 20 54 63 6c 5f 47 65   zTrace = Tcl_Ge
15760 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
15770 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20  bjv[2], &len);. 
15780 20 20 20 20 20 69 66 28 20 7a 54 72 61 63 65 20       if( zTrace 
15790 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20  && len>0 ){.    
157a0 20 20 20 20 70 44 62 2d 3e 7a 54 72 61 63 65 20      pDb->zTrace 
157b0 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e  = Tcl_Alloc( len
157c0 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20   + 1 );.        
157d0 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 54 72 61  memcpy(pDb->zTra
157e0 63 65 2c 20 7a 54 72 61 63 65 2c 20 6c 65 6e 2b  ce, zTrace, len+
157f0 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
15800 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 54  .        pDb->zT
15810 72 61 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  race = 0;.      
15820 7d 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  }.#if !defined(S
15830 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
15840 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
15850 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
15860 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20 20 20  NG_POINT).      
15870 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 20  if( pDb->zTrace 
15880 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
15890 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b  interp = interp;
158a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
158b0 5f 74 72 61 63 65 28 70 44 62 2d 3e 64 62 2c 20  _trace(pDb->db, 
158c0 44 62 54 72 61 63 65 48 61 6e 64 6c 65 72 2c 20  DbTraceHandler, 
158d0 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  pDb);.      }els
158e0 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
158f0 65 33 5f 74 72 61 63 65 28 70 44 62 2d 3e 64 62  e3_trace(pDb->db
15900 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
15910 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
15920 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
15930 2f 2a 20 20 20 20 24 64 62 20 74 72 61 6e 73 61  /*    $db transa
15940 63 74 69 6f 6e 20 5b 2d 64 65 66 65 72 72 65 64  ction [-deferred
15950 7c 2d 69 6d 6d 65 64 69 61 74 65 7c 2d 65 78 63  |-immediate|-exc
15960 6c 75 73 69 76 65 5d 20 53 43 52 49 50 54 0a 20  lusive] SCRIPT. 
15970 20 2a 2a 0a 20 20 2a 2a 20 53 74 61 72 74 20 61   **.  ** Start a
15980 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
15990 20 28 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20   (if we are not 
159a0 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 6d  already in the m
159b0 69 64 73 74 20 6f 66 20 61 0a 20 20 2a 2a 20 74  idst of a.  ** t
159c0 72 61 6e 73 61 63 74 69 6f 6e 29 20 61 6e 64 20  ransaction) and 
159d0 65 78 65 63 75 74 65 20 74 68 65 20 54 43 4c 20  execute the TCL 
159e0 73 63 72 69 70 74 20 53 43 52 49 50 54 2e 20 20  script SCRIPT.  
159f0 41 66 74 65 72 20 53 43 52 49 50 54 0a 20 20 2a  After SCRIPT.  *
15a00 2a 20 63 6f 6d 70 6c 65 74 65 73 2c 20 65 69 74  * completes, eit
15a10 68 65 72 20 63 6f 6d 6d 69 74 20 74 68 65 20 74  her commit the t
15a20 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 72 6f  ransaction or ro
15a30 6c 6c 20 69 74 20 62 61 63 6b 20 69 66 20 53 43  ll it back if SC
15a40 52 49 50 54 0a 20 20 2a 2a 20 74 68 72 6f 77 73  RIPT.  ** throws
15a50 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 2e 20 20   an exception.  
15a60 4f 72 20 69 66 20 6e 6f 20 6e 65 77 20 74 72 61  Or if no new tra
15a70 6e 73 61 74 69 6f 6e 20 77 61 73 20 73 74 61 72  nsation was star
15a80 74 65 64 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e  ted, do nothing.
15a90 0a 20 20 2a 2a 20 70 61 73 73 20 74 68 65 20 65  .  ** pass the e
15aa0 78 63 65 70 74 69 6f 6e 20 6f 6e 20 75 70 20 74  xception on up t
15ab0 68 65 20 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20  he stack..  **. 
15ac0 20 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64   ** This command
15ad0 20 77 61 73 20 69 6e 73 70 69 72 65 64 20 62 79   was inspired by
15ae0 20 44 61 76 65 20 54 68 6f 6d 61 73 27 73 20 74   Dave Thomas's t
15af0 61 6c 6b 20 6f 6e 20 52 75 62 79 20 61 74 20 74  alk on Ruby at t
15b00 68 65 0a 20 20 2a 2a 20 32 30 30 35 20 4f 27 52  he.  ** 2005 O'R
15b10 65 69 6c 6c 79 20 4f 70 65 6e 20 53 6f 75 72 63  eilly Open Sourc
15b20 65 20 43 6f 6e 76 65 6e 74 69 6f 6e 20 28 4f 53  e Convention (OS
15b30 43 4f 4e 29 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  CON)..  */.  cas
15b40 65 20 44 42 5f 54 52 41 4e 53 41 43 54 49 4f 4e  e DB_TRANSACTION
15b50 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  : {.    Tcl_Obj 
15b60 2a 70 53 63 72 69 70 74 3b 0a 20 20 20 20 63 6f  *pScript;.    co
15b70 6e 73 74 20 63 68 61 72 20 2a 7a 42 65 67 69 6e  nst char *zBegin
15b80 20 3d 20 22 53 41 56 45 50 4f 49 4e 54 20 5f 74   = "SAVEPOINT _t
15b90 63 6c 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22 3b  cl_transaction";
15ba0 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  .    if( objc!=3
15bb0 20 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20   && objc!=4 ){. 
15bc0 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
15bd0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
15be0 20 6f 62 6a 76 2c 20 22 5b 54 59 50 45 5d 20 53   objv, "[TYPE] S
15bf0 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72  CRIPT");.      r
15c00 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
15c10 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
15c20 70 44 62 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pDb->nTransactio
15c30 6e 3d 3d 30 20 26 26 20 6f 62 6a 63 3d 3d 34 20  n==0 && objc==4 
15c40 29 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  ){.      static 
15c50 63 6f 6e 73 74 20 63 68 61 72 20 2a 54 54 59 50  const char *TTYP
15c60 45 5f 73 74 72 73 5b 5d 20 3d 20 7b 0a 20 20 20  E_strs[] = {.   
15c70 20 20 20 20 20 22 64 65 66 65 72 72 65 64 22 2c       "deferred",
15c80 20 20 20 22 65 78 63 6c 75 73 69 76 65 22 2c 20     "exclusive", 
15c90 20 22 69 6d 6d 65 64 69 61 74 65 22 2c 20 30 0a   "immediate", 0.
15ca0 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 65        };.      e
15cb0 6e 75 6d 20 54 54 59 50 45 5f 65 6e 75 6d 20 7b  num TTYPE_enum {
15cc0 0a 20 20 20 20 20 20 20 20 54 54 59 50 45 5f 44  .        TTYPE_D
15cd0 45 46 45 52 52 45 44 2c 20 54 54 59 50 45 5f 45  EFERRED, TTYPE_E
15ce0 58 43 4c 55 53 49 56 45 2c 20 54 54 59 50 45 5f  XCLUSIVE, TTYPE_
15cf0 49 4d 4d 45 44 49 41 54 45 0a 20 20 20 20 20 20  IMMEDIATE.      
15d00 7d 3b 0a 20 20 20 20 20 20 69 6e 74 20 74 74 79  };.      int tty
15d10 70 65 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63  pe;.      if( Tc
15d20 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62  l_GetIndexFromOb
15d30 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
15d40 5d 2c 20 54 54 59 50 45 5f 73 74 72 73 2c 20 22  ], TTYPE_strs, "
15d50 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 79 70 65  transaction type
15d60 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
15d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d80 20 30 2c 20 26 74 74 79 70 65 29 20 29 7b 0a 20   0, &ttype) ){. 
15d90 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
15da0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  L_ERROR;.      }
15db0 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20 28  .      switch( (
15dc0 65 6e 75 6d 20 54 54 59 50 45 5f 65 6e 75 6d 29  enum TTYPE_enum)
15dd0 74 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 20  ttype ){.       
15de0 20 63 61 73 65 20 54 54 59 50 45 5f 44 45 46 45   case TTYPE_DEFE
15df0 52 52 45 44 3a 20 20 20 20 2f 2a 20 6e 6f 2d 6f  RRED:    /* no-o
15e00 70 20 2a 2f 3b 20 20 20 20 20 20 20 20 20 20 20  p */;           
15e10 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15e20 20 20 20 20 20 63 61 73 65 20 54 54 59 50 45 5f       case TTYPE_
15e30 45 58 43 4c 55 53 49 56 45 3a 20 20 20 7a 42 65  EXCLUSIVE:   zBe
15e40 67 69 6e 20 3d 20 22 42 45 47 49 4e 20 45 58 43  gin = "BEGIN EXC
15e50 4c 55 53 49 56 45 22 3b 20 20 62 72 65 61 6b 3b  LUSIVE";  break;
15e60 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 54 54  .        case TT
15e70 59 50 45 5f 49 4d 4d 45 44 49 41 54 45 3a 20 20  YPE_IMMEDIATE:  
15e80 20 7a 42 65 67 69 6e 20 3d 20 22 42 45 47 49 4e   zBegin = "BEGIN
15e90 20 49 4d 4d 45 44 49 41 54 45 22 3b 20 20 62 72   IMMEDIATE";  br
15ea0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
15eb0 20 7d 0a 20 20 20 20 70 53 63 72 69 70 74 20 3d   }.    pScript =
15ec0 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 3b 0a 0a   objv[objc-1];..
15ed0 20 20 20 20 2f 2a 20 52 75 6e 20 74 68 65 20 53      /* Run the S
15ee0 51 4c 69 74 65 20 42 45 47 49 4e 20 63 6f 6d 6d  QLite BEGIN comm
15ef0 61 6e 64 20 74 6f 20 6f 70 65 6e 20 61 20 74 72  and to open a tr
15f00 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 73 61 76  ansaction or sav
15f10 65 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20 20 20 70  epoint. */.    p
15f20 44 62 2d 3e 64 69 73 61 62 6c 65 41 75 74 68 2b  Db->disableAuth+
15f30 2b 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  +;.    rc = sqli
15f40 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62  te3_exec(pDb->db
15f50 2c 20 7a 42 65 67 69 6e 2c 20 30 2c 20 30 2c 20  , zBegin, 0, 0, 
15f60 30 29 3b 0a 20 20 20 20 70 44 62 2d 3e 64 69 73  0);.    pDb->dis
15f70 61 62 6c 65 41 75 74 68 2d 2d 3b 0a 20 20 20 20  ableAuth--;.    
15f80 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
15f90 4b 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  K ){.      Tcl_A
15fa0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
15fb0 72 70 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  rp, sqlite3_errm
15fc0 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 28 63 68  sg(pDb->db), (ch
15fd0 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 65  ar*)0);.      re
15fe0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
15ff0 20 20 20 20 7d 0a 20 20 20 20 70 44 62 2d 3e 6e      }.    pDb->n
16000 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 0a  Transaction++;..
16010 20 20 20 20 2f 2a 20 49 66 20 75 73 69 6e 67 20      /* If using 
16020 4e 52 45 2c 20 73 63 68 65 64 75 6c 65 20 61 20  NRE, schedule a 
16030 63 61 6c 6c 62 61 63 6b 20 74 6f 20 69 6e 76 6f  callback to invo
16040 6b 65 20 74 68 65 20 73 63 72 69 70 74 20 70 53  ke the script pS
16050 63 72 69 70 74 2c 20 74 68 65 6e 0a 20 20 20 20  cript, then.    
16060 2a 2a 20 61 20 73 65 63 6f 6e 64 20 63 61 6c 6c  ** a second call
16070 62 61 63 6b 20 74 6f 20 63 6f 6d 6d 69 74 20 28  back to commit (
16080 6f 72 20 72 6f 6c 6c 62 61 63 6b 29 20 74 68 65  or rollback) the
16090 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20   transaction or 
160a0 73 61 76 65 70 6f 69 6e 74 0a 20 20 20 20 2a 2a  savepoint.    **
160b0 20 6f 70 65 6e 65 64 20 61 62 6f 76 65 2e 20 49   opened above. I
160c0 66 20 6e 6f 74 20 75 73 69 6e 67 20 4e 52 45 2c  f not using NRE,
160d0 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 73 63   evaluate the sc
160e0 72 69 70 74 20 64 69 72 65 63 74 6c 79 2c 20 74  ript directly, t
160f0 68 65 6e 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20  hen.    ** call 
16100 66 75 6e 63 74 69 6f 6e 20 44 62 54 72 61 6e 73  function DbTrans
16110 50 6f 73 74 43 6d 64 28 29 20 74 6f 20 63 6f 6d  PostCmd() to com
16120 6d 69 74 20 28 6f 72 20 72 6f 6c 6c 62 61 63 6b  mit (or rollback
16130 29 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  ) the transactio
16140 6e 20 0a 20 20 20 20 2a 2a 20 6f 72 20 73 61 76  n .    ** or sav
16150 65 70 6f 69 6e 74 2e 20 20 2a 2f 0a 20 20 20 20  epoint.  */.    
16160 69 66 28 20 44 62 55 73 65 4e 72 65 28 29 20 29  if( DbUseNre() )
16170 7b 0a 20 20 20 20 20 20 54 63 6c 5f 4e 52 41 64  {.      Tcl_NRAd
16180 64 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70  dCallback(interp
16190 2c 20 44 62 54 72 61 6e 73 50 6f 73 74 43 6d 64  , DbTransPostCmd
161a0 2c 20 63 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  , cd, 0, 0, 0);.
161b0 20 20 20 20 20 20 28 76 6f 69 64 29 54 63 6c 5f        (void)Tcl_
161c0 4e 52 45 76 61 6c 4f 62 6a 28 69 6e 74 65 72 70  NREvalObj(interp
161d0 2c 20 70 53 63 72 69 70 74 2c 20 30 29 3b 0a 20  , pScript, 0);. 
161e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
161f0 72 63 20 3d 20 44 62 54 72 61 6e 73 50 6f 73 74  rc = DbTransPost
16200 43 6d 64 28 26 63 64 2c 20 69 6e 74 65 72 70 2c  Cmd(&cd, interp,
16210 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69   Tcl_EvalObjEx(i
16220 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20  nterp, pScript, 
16230 30 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  0));.    }.    b
16240 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
16250 20 20 2a 2a 20 20 20 20 24 64 62 20 75 6e 6c 6f    **    $db unlo
16260 63 6b 5f 6e 6f 74 69 66 79 20 3f 73 63 72 69 70  ck_notify ?scrip
16270 74 3f 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  t?.  */.  case D
16280 42 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 3a  B_UNLOCK_NOTIFY:
16290 20 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   {.#ifndef SQLIT
162a0 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f  E_ENABLE_UNLOCK_
162b0 4e 4f 54 49 46 59 0a 20 20 20 20 54 63 6c 5f 41  NOTIFY.    Tcl_A
162c0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
162d0 72 70 2c 20 22 75 6e 6c 6f 63 6b 5f 6e 6f 74 69  rp, "unlock_noti
162e0 66 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  fy not available
162f0 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64 22 2c   in this build",
16300 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16310 20 20 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b        (char*)0);
16320 0a 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52  .    rc = TCL_ER
16330 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69  ROR;.#else.    i
16340 66 28 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62  f( objc!=2 && ob
16350 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54  jc!=3 ){.      T
16360 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
16370 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
16380 20 22 3f 53 43 52 49 50 54 3f 22 29 3b 0a 20 20   "?SCRIPT?");.  
16390 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52      rc = TCL_ERR
163a0 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  OR;.    }else{. 
163b0 20 20 20 20 20 76 6f 69 64 20 28 2a 78 4e 6f 74       void (*xNot
163c0 69 66 79 29 28 76 6f 69 64 20 2a 2a 2c 20 69 6e  ify)(void **, in
163d0 74 29 20 3d 20 30 3b 0a 20 20 20 20 20 20 76 6f  t) = 0;.      vo
163e0 69 64 20 2a 70 4e 6f 74 69 66 79 41 72 67 20 3d  id *pNotifyArg =
163f0 20 30 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70   0;..      if( p
16400 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66  Db->pUnlockNotif
16410 79 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  y ){.        Tcl
16420 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44  _DecrRefCount(pD
16430 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79  b->pUnlockNotify
16440 29 3b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  );.        pDb->
16450 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 20 3d 20  pUnlockNotify = 
16460 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20  0;.      }.  .  
16470 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20      if( objc==3 
16480 29 7b 0a 20 20 20 20 20 20 20 20 78 4e 6f 74 69  ){.        xNoti
16490 66 79 20 3d 20 44 62 55 6e 6c 6f 63 6b 4e 6f 74  fy = DbUnlockNot
164a0 69 66 79 3b 0a 20 20 20 20 20 20 20 20 70 4e 6f  ify;.        pNo
164b0 74 69 66 79 41 72 67 20 3d 20 28 76 6f 69 64 20  tifyArg = (void 
164c0 2a 29 70 44 62 3b 0a 20 20 20 20 20 20 20 20 70  *)pDb;.        p
164d0 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66  Db->pUnlockNotif
164e0 79 20 3d 20 6f 62 6a 76 5b 32 5d 3b 0a 20 20 20  y = objv[2];.   
164f0 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66       Tcl_IncrRef
16500 43 6f 75 6e 74 28 70 44 62 2d 3e 70 55 6e 6c 6f  Count(pDb->pUnlo
16510 63 6b 4e 6f 74 69 66 79 29 3b 0a 20 20 20 20 20  ckNotify);.     
16520 20 7d 0a 20 20 0a 20 20 20 20 20 20 69 66 28 20   }.  .      if( 
16530 73 71 6c 69 74 65 33 5f 75 6e 6c 6f 63 6b 5f 6e  sqlite3_unlock_n
16540 6f 74 69 66 79 28 70 44 62 2d 3e 64 62 2c 20 78  otify(pDb->db, x
16550 4e 6f 74 69 66 79 2c 20 70 4e 6f 74 69 66 79 41  Notify, pNotifyA
16560 72 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20 54  rg) ){.        T
16570 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
16580 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 5f  interp, sqlite3_
16590 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c  errmsg(pDb->db),
165a0 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
165b0 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52      rc = TCL_ERR
165c0 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
165d0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65  }.#endif.    bre
165e0 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
165f0 2a 2a 20 20 20 20 24 64 62 20 70 72 65 75 70 64  **    $db preupd
16600 61 74 65 5f 68 6f 6f 6b 20 63 6f 75 6e 74 0a 20  ate_hook count. 
16610 20 2a 2a 20 20 20 20 24 64 62 20 70 72 65 75 70   **    $db preup
16620 64 61 74 65 5f 68 6f 6f 6b 20 68 6f 6f 6b 20 3f  date_hook hook ?
16630 53 43 52 49 50 54 3f 0a 20 20 2a 2a 20 20 20 20  SCRIPT?.  **    
16640 24 64 62 20 70 72 65 75 70 64 61 74 65 5f 68 6f  $db preupdate_ho
16650 6f 6b 20 6e 65 77 20 49 4e 44 45 58 0a 20 20 2a  ok new INDEX.  *
16660 2a 20 20 20 20 24 64 62 20 70 72 65 75 70 64 61  *    $db preupda
16670 74 65 5f 68 6f 6f 6b 20 6f 6c 64 20 49 4e 44 45  te_hook old INDE
16680 58 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  X.  */.  case DB
16690 5f 50 52 45 55 50 44 41 54 45 3a 20 7b 0a 23 69  _PREUPDATE: {.#i
166a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  fndef SQLITE_ENA
166b0 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f  BLE_PREUPDATE_HO
166c0 4f 4b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  OK.    Tcl_Appen
166d0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
166e0 22 70 72 65 75 70 64 61 74 65 5f 68 6f 6f 6b 20  "preupdate_hook 
166f0 77 61 73 20 6f 6d 69 74 74 65 64 20 61 74 20 63  was omitted at c
16700 6f 6d 70 69 6c 65 2d 74 69 6d 65 22 29 3b 0a 20  ompile-time");. 
16710 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f     rc = TCL_ERRO
16720 52 3b 0a 23 65 6c 73 65 0a 20 20 20 20 73 74 61  R;.#else.    sta
16730 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
16740 61 7a 53 75 62 5b 5d 20 3d 20 7b 22 63 6f 75 6e  azSub[] = {"coun
16750 74 22 2c 20 22 64 65 70 74 68 22 2c 20 22 68 6f  t", "depth", "ho
16760 6f 6b 22 2c 20 22 6e 65 77 22 2c 20 22 6f 6c 64  ok", "new", "old
16770 22 2c 20 30 7d 3b 0a 20 20 20 20 65 6e 75 6d 20  ", 0};.    enum 
16780 44 62 50 72 65 75 70 64 61 74 65 53 75 62 43 6d  DbPreupdateSubCm
16790 64 20 7b 0a 20 20 20 20 20 20 50 52 45 5f 43 4f  d {.      PRE_CO
167a0 55 4e 54 2c 20 50 52 45 5f 44 45 50 54 48 2c 20  UNT, PRE_DEPTH, 
167b0 50 52 45 5f 48 4f 4f 4b 2c 20 50 52 45 5f 4e 45  PRE_HOOK, PRE_NE
167c0 57 2c 20 50 52 45 5f 4f 4c 44 0a 20 20 20 20 7d  W, PRE_OLD.    }
167d0 3b 0a 20 20 20 20 69 6e 74 20 69 53 75 62 3b 0a  ;.    int iSub;.
167e0 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3c 33 20  .    if( objc<3 
167f0 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
16800 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
16810 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 55 42 2d  , 2, objv, "SUB-
16820 43 4f 4d 4d 41 4e 44 20 3f 41 52 47 53 3f 22 29  COMMAND ?ARGS?")
16830 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
16840 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d  Tcl_GetIndexFrom
16850 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
16860 5b 32 5d 2c 20 61 7a 53 75 62 2c 20 22 73 75 62  [2], azSub, "sub
16870 2d 63 6f 6d 6d 61 6e 64 22 2c 20 30 2c 20 26 69  -command", 0, &i
16880 53 75 62 29 20 29 7b 0a 20 20 20 20 20 20 72 65  Sub) ){.      re
16890 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
168a0 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 63      }..    switc
168b0 68 28 20 28 65 6e 75 6d 20 44 62 50 72 65 75 70  h( (enum DbPreup
168c0 64 61 74 65 53 75 62 43 6d 64 29 69 53 75 62 20  dateSubCmd)iSub 
168d0 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 50 52  ){.      case PR
168e0 45 5f 43 4f 55 4e 54 3a 20 7b 0a 20 20 20 20 20  E_COUNT: {.     
168f0 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 73 71     int nCol = sq
16900 6c 69 74 65 33 5f 70 72 65 75 70 64 61 74 65 5f  lite3_preupdate_
16910 63 6f 75 6e 74 28 70 44 62 2d 3e 64 62 29 3b 0a  count(pDb->db);.
16920 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f          Tcl_SetO
16930 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
16940 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e   Tcl_NewIntObj(n
16950 43 6f 6c 29 29 3b 0a 20 20 20 20 20 20 20 20 62  Col));.        b
16960 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
16970 20 20 20 20 20 63 61 73 65 20 50 52 45 5f 48 4f       case PRE_HO
16980 4f 4b 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66  OK: {.        if
16990 28 20 6f 62 6a 63 3e 34 20 29 7b 0a 20 20 20 20  ( objc>4 ){.    
169a0 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
169b0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
169c0 2c 20 6f 62 6a 76 2c 20 22 68 6f 6f 6b 20 3f 53  , objv, "hook ?S
169d0 43 52 49 50 54 3f 22 29 3b 0a 20 20 20 20 20 20  CRIPT?");.      
169e0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
169f0 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a  RROR;.        }.
16a00 20 20 20 20 20 20 20 20 44 62 48 6f 6f 6b 43 6d          DbHookCm
16a10 64 28 69 6e 74 65 72 70 2c 20 70 44 62 2c 20 28  d(interp, pDb, (
16a20 6f 62 6a 63 3d 3d 34 20 3f 20 6f 62 6a 76 5b 33  objc==4 ? objv[3
16a30 5d 20 3a 20 30 29 2c 20 26 70 44 62 2d 3e 70 50  ] : 0), &pDb->pP
16a40 72 65 55 70 64 61 74 65 48 6f 6f 6b 29 3b 0a 20  reUpdateHook);. 
16a50 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
16a60 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 61 73      }..      cas
16a70 65 20 50 52 45 5f 44 45 50 54 48 3a 20 7b 0a 20  e PRE_DEPTH: {. 
16a80 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a         Tcl_Obj *
16a90 70 52 65 74 3b 0a 20 20 20 20 20 20 20 20 69 66  pRet;.        if
16aa0 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
16ab0 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67         Tcl_Wrong
16ac0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
16ad0 33 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20  3, objv, "");.  
16ae0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
16af0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
16b00 20 20 7d 0a 20 20 20 20 20 20 20 20 70 52 65 74    }.        pRet
16b10 20 3d 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a   = Tcl_NewIntObj
16b20 28 73 71 6c 69 74 65 33 5f 70 72 65 75 70 64 61  (sqlite3_preupda
16b30 74 65 5f 64 65 70 74 68 28 70 44 62 2d 3e 64 62  te_depth(pDb->db
16b40 29 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  ));.        Tcl_
16b50 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
16b60 65 72 70 2c 20 70 52 65 74 29 3b 0a 20 20 20 20  erp, pRet);.    
16b70 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
16b80 20 7d 0a 0a 20 20 20 20 20 20 63 61 73 65 20 50   }..      case P
16b90 52 45 5f 4e 45 57 3a 0a 20 20 20 20 20 20 63 61  RE_NEW:.      ca
16ba0 73 65 20 50 52 45 5f 4f 4c 44 3a 20 7b 0a 20 20  se PRE_OLD: {.  
16bb0 20 20 20 20 20 20 69 6e 74 20 69 49 64 78 3b 0a        int iIdx;.
16bc0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
16bd0 76 61 6c 75 65 20 2a 70 56 61 6c 75 65 3b 0a 20  value *pValue;. 
16be0 20 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21         if( objc!
16bf0 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =4 ){.          
16c00 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
16c10 28 69 6e 74 65 72 70 2c 20 33 2c 20 6f 62 6a 76  (interp, 3, objv
16c20 2c 20 22 49 4e 44 45 58 22 29 3b 0a 20 20 20 20  , "INDEX");.    
16c30 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
16c40 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
16c50 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 54 63  }.        if( Tc
16c60 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
16c70 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
16c80 20 26 69 49 64 78 29 20 29 7b 0a 20 20 20 20 20   &iIdx) ){.     
16c90 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
16ca0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d  ERROR;.        }
16cb0 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 53  ..        if( iS
16cc0 75 62 3d 3d 50 52 45 5f 4f 4c 44 20 29 7b 0a 20  ub==PRE_OLD ){. 
16cd0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
16ce0 6c 69 74 65 33 5f 70 72 65 75 70 64 61 74 65 5f  lite3_preupdate_
16cf0 6f 6c 64 28 70 44 62 2d 3e 64 62 2c 20 69 49 64  old(pDb->db, iId
16d00 78 2c 20 26 70 56 61 6c 75 65 29 3b 0a 20 20 20  x, &pValue);.   
16d10 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
16d20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 53        assert( iS
16d30 75 62 3d 3d 50 52 45 5f 4e 45 57 20 29 3b 0a 20  ub==PRE_NEW );. 
16d40 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
16d50 6c 69 74 65 33 5f 70 72 65 75 70 64 61 74 65 5f  lite3_preupdate_
16d60 6e 65 77 28 70 44 62 2d 3e 64 62 2c 20 69 49 64  new(pDb->db, iId
16d70 78 2c 20 26 70 56 61 6c 75 65 29 3b 0a 20 20 20  x, &pValue);.   
16d80 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
16d90 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
16da0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  K ){.          T
16db0 63 6c 5f 4f 62 6a 20 2a 70 4f 62 6a 3b 0a 20 20  cl_Obj *pObj;.  
16dc0 20 20 20 20 20 20 20 20 70 4f 62 6a 20 3d 20 54          pObj = T
16dd0 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
16de0 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76  (char*)sqlite3_v
16df0 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 75 65  alue_text(pValue
16e00 29 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  ), -1);.        
16e10 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
16e20 6c 74 28 69 6e 74 65 72 70 2c 20 70 4f 62 6a 29  lt(interp, pObj)
16e30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
16e40 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 41  .          Tcl_A
16e50 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
16e60 72 70 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  rp, sqlite3_errm
16e70 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b  sg(pDb->db), 0);
16e80 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
16e90 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
16ea0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
16eb0 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
16ec0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45  QLITE_ENABLE_PRE
16ed0 55 50 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a 20  UPDATE_HOOK */. 
16ee0 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
16ef0 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20   /*.  **    $db 
16f00 77 61 6c 5f 68 6f 6f 6b 20 3f 73 63 72 69 70 74  wal_hook ?script
16f10 3f 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 75 70  ?.  **    $db up
16f20 64 61 74 65 5f 68 6f 6f 6b 20 3f 73 63 72 69 70  date_hook ?scrip
16f30 74 3f 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 72  t?.  **    $db r
16f40 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 20 3f 73 63  ollback_hook ?sc
16f50 72 69 70 74 3f 0a 20 20 2a 2f 0a 20 20 63 61 73  ript?.  */.  cas
16f60 65 20 44 42 5f 57 41 4c 5f 48 4f 4f 4b 3a 20 0a  e DB_WAL_HOOK: .
16f70 20 20 63 61 73 65 20 44 42 5f 55 50 44 41 54 45    case DB_UPDATE
16f80 5f 48 4f 4f 4b 3a 20 0a 20 20 63 61 73 65 20 44  _HOOK: .  case D
16f90 42 5f 52 4f 4c 4c 42 41 43 4b 5f 48 4f 4f 4b 3a  B_ROLLBACK_HOOK:
16fa0 20 7b 0a 20 20 20 20 2f 2a 20 73 65 74 20 70 70   {.    /* set pp
16fb0 48 6f 6f 6b 20 74 6f 20 70 6f 69 6e 74 20 61 74  Hook to point at
16fc0 20 70 55 70 64 61 74 65 48 6f 6f 6b 20 6f 72 20   pUpdateHook or 
16fd0 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 2c 20 64  pRollbackHook, d
16fe0 65 70 65 6e 64 69 6e 67 20 6f 6e 20 0a 20 20 20  epending on .   
16ff0 20 2a 2a 20 77 68 65 74 68 65 72 20 5b 24 64 62   ** whether [$db
17000 20 75 70 64 61 74 65 5f 68 6f 6f 6b 5d 20 6f 72   update_hook] or
17010 20 5b 24 64 62 20 72 6f 6c 6c 62 61 63 6b 5f 68   [$db rollback_h
17020 6f 6f 6b 5d 20 77 61 73 20 69 6e 76 6f 6b 65 64  ook] was invoked
17030 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c  ..    */.    Tcl
17040 5f 4f 62 6a 20 2a 2a 70 70 48 6f 6f 6b 3b 20 0a  _Obj **ppHook; .
17050 20 20 20 20 69 66 28 20 63 68 6f 69 63 65 3d 3d      if( choice==
17060 44 42 5f 57 41 4c 5f 48 4f 4f 4b 20 29 20 70 70  DB_WAL_HOOK ) pp
17070 48 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e 70 57 61  Hook = &pDb->pWa
17080 6c 48 6f 6f 6b 3b 0a 20 20 20 20 69 66 28 20 63  lHook;.    if( c
17090 68 6f 69 63 65 3d 3d 44 42 5f 55 50 44 41 54 45  hoice==DB_UPDATE
170a0 5f 48 4f 4f 4b 20 29 20 70 70 48 6f 6f 6b 20 3d  _HOOK ) ppHook =
170b0 20 26 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f   &pDb->pUpdateHo
170c0 6f 6b 3b 0a 20 20 20 20 69 66 28 20 63 68 6f 69  ok;.    if( choi
170d0 63 65 3d 3d 44 42 5f 52 4f 4c 4c 42 41 43 4b 5f  ce==DB_ROLLBACK_
170e0 48 4f 4f 4b 20 29 20 70 70 48 6f 6f 6b 20 3d 20  HOOK ) ppHook = 
170f0 26 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48  &pDb->pRollbackH
17100 6f 6f 6b 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a  ook;.    if( obj
17110 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 20 54 63  c>3 ){.       Tc
17120 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
17130 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
17140 22 3f 53 43 52 49 50 54 3f 22 29 3b 0a 20 20 20  "?SCRIPT?");.   
17150 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
17160 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
17170 20 44 62 48 6f 6f 6b 43 6d 64 28 69 6e 74 65 72   DbHookCmd(inter
17180 70 2c 20 70 44 62 2c 20 28 6f 62 6a 63 3d 3d 33  p, pDb, (objc==3
17190 20 3f 20 6f 62 6a 76 5b 32 5d 20 3a 20 30 29 2c   ? objv[2] : 0),
171a0 20 70 70 48 6f 6f 6b 29 3b 0a 20 20 20 20 62 72   ppHook);.    br
171b0 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
171c0 20 20 24 64 62 20 76 65 72 73 69 6f 6e 0a 20 20    $db version.  
171d0 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74  **.  ** Return t
171e0 68 65 20 76 65 72 73 69 6f 6e 20 73 74 72 69 6e  he version strin
171f0 67 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62  g for this datab
17200 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ase..  */.  case
17210 20 44 42 5f 56 45 52 53 49 4f 4e 3a 20 7b 0a 20   DB_VERSION: {. 
17220 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
17230 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
17240 29 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73  )sqlite3_libvers
17250 69 6f 6e 28 29 2c 20 54 43 4c 5f 53 54 41 54 49  ion(), TCL_STATI
17260 43 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  C);.    break;. 
17270 20 7d 0a 0a 0a 20 20 7d 20 2f 2a 20 45 6e 64 20   }...  } /* End 
17280 6f 66 20 74 68 65 20 53 57 49 54 43 48 20 73 74  of the SWITCH st
17290 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 72 65 74  atement */.  ret
172a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 53  urn rc;.}..#if S
172b0 51 4c 49 54 45 5f 54 43 4c 5f 4e 52 45 0a 2f 2a  QLITE_TCL_NRE./*
172c0 0a 2a 2a 20 41 64 61 70 74 6f 72 20 74 68 61 74  .** Adaptor that
172d0 20 70 72 6f 76 69 64 65 73 20 61 6e 20 6f 62 6a   provides an obj
172e0 43 6d 64 20 69 6e 74 65 72 66 61 63 65 20 74 6f  Cmd interface to
172f0 20 74 68 65 20 4e 52 45 2d 65 6e 61 62 6c 65 64   the NRE-enabled
17300 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 20 69 6d  .** interface im
17310 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f  plementation..*/
17320 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 4f 62  .static int DbOb
17330 6a 43 6d 64 41 64 61 70 74 6f 72 28 0a 20 20 76  jCmdAdaptor(.  v
17340 6f 69 64 20 2a 63 64 2c 0a 20 20 54 63 6c 5f 49  oid *cd,.  Tcl_I
17350 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
17360 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
17370 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76  _Obj *const*objv
17380 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 54 63 6c  .){.  return Tcl
17390 5f 4e 52 43 61 6c 6c 4f 62 6a 50 72 6f 63 28 69  _NRCallObjProc(i
173a0 6e 74 65 72 70 2c 20 44 62 4f 62 6a 43 6d 64 2c  nterp, DbObjCmd,
173b0 20 63 64 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 29   cd, objc, objv)
173c0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
173d0 4c 49 54 45 5f 54 43 4c 5f 4e 52 45 20 2a 2f 0a  LITE_TCL_NRE */.
173e0 0a 2f 2a 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33  ./*.**   sqlite3
173f0 20 44 42 4e 41 4d 45 20 46 49 4c 45 4e 41 4d 45   DBNAME FILENAME
17400 20 3f 2d 76 66 73 20 56 46 53 4e 41 4d 45 3f 20   ?-vfs VFSNAME? 
17410 3f 2d 6b 65 79 20 4b 45 59 3f 20 3f 2d 72 65 61  ?-key KEY? ?-rea
17420 64 6f 6e 6c 79 20 42 4f 4f 4c 45 41 4e 3f 0a 2a  donly BOOLEAN?.*
17430 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
17440 20 20 20 20 20 20 20 20 20 20 20 20 3f 2d 63 72              ?-cr
17450 65 61 74 65 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d  eate BOOLEAN? ?-
17460 6e 6f 6d 75 74 65 78 20 42 4f 4f 4c 45 41 4e 3f  nomutex BOOLEAN?
17470 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  .**.** This is t
17480 68 65 20 6d 61 69 6e 20 54 63 6c 20 63 6f 6d 6d  he main Tcl comm
17490 61 6e 64 2e 20 20 57 68 65 6e 20 74 68 65 20 22  and.  When the "
174a0 73 71 6c 69 74 65 22 20 54 63 6c 20 63 6f 6d 6d  sqlite" Tcl comm
174b0 61 6e 64 20 69 73 0a 2a 2a 20 69 6e 76 6f 6b 65  and is.** invoke
174c0 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  d, this routine 
174d0 72 75 6e 73 20 74 6f 20 70 72 6f 63 65 73 73 20  runs to process 
174e0 74 68 61 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  that command..**
174f0 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72  .** The first ar
17500 67 75 6d 65 6e 74 2c 20 44 42 4e 41 4d 45 2c 20  gument, DBNAME, 
17510 69 73 20 61 6e 20 61 72 62 69 74 72 61 72 79 20  is an arbitrary 
17520 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 0a 2a  name for a new.*
17530 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * database conne
17540 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 63 6f 6d  ction.  This com
17550 6d 61 6e 64 20 63 72 65 61 74 65 73 20 61 20 6e  mand creates a n
17560 65 77 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 64  ew command named
17570 0a 2a 2a 20 44 42 4e 41 4d 45 20 74 68 61 74 20  .** DBNAME that 
17580 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6e 74 72  is used to contr
17590 6f 6c 20 74 68 61 74 20 63 6f 6e 6e 65 63 74 69  ol that connecti
175a0 6f 6e 2e 20 20 54 68 65 20 64 61 74 61 62 61 73  on.  The databas
175b0 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  e.** connection 
175c0 69 73 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20  is deleted when 
175d0 74 68 65 20 44 42 4e 41 4d 45 20 63 6f 6d 6d 61  the DBNAME comma
175e0 6e 64 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a  nd is deleted..*
175f0 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20  *.** The second 
17600 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
17610 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
17620 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2f  base file..**.*/
17630 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 4d 61  .static int DbMa
17640 69 6e 28 76 6f 69 64 20 2a 63 64 2c 20 54 63 6c  in(void *cd, Tcl
17650 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
17660 20 69 6e 74 20 6f 62 6a 63 2c 54 63 6c 5f 4f 62   int objc,Tcl_Ob
17670 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76 29 7b 0a  j *const*objv){.
17680 20 20 53 71 6c 69 74 65 44 62 20 2a 70 3b 0a 20    SqliteDb *p;. 
17690 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72   const char *zAr
176a0 67 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  g;.  char *zErrM
176b0 73 67 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  sg;.  int i;.  c
176c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
176d0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
176e0 7a 56 66 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20  zVfs = 0;.  int 
176f0 66 6c 61 67 73 3b 0a 20 20 54 63 6c 5f 44 53 74  flags;.  Tcl_DSt
17700 72 69 6e 67 20 74 72 61 6e 73 6c 61 74 65 64 46  ring translatedF
17710 69 6c 65 6e 61 6d 65 3b 0a 23 69 66 64 65 66 20  ilename;.#ifdef 
17720 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
17730 0a 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d 20  .  void *pKey = 
17740 30 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20  0;.  int nKey = 
17750 30 3b 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74 20  0;.#endif.  int 
17760 72 63 3b 0a 0a 20 20 2f 2a 20 49 6e 20 6e 6f 72  rc;..  /* In nor
17770 6d 61 6c 20 75 73 65 2c 20 65 61 63 68 20 54 43  mal use, each TC
17780 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 72 75  L interpreter ru
17790 6e 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 74  ns in a single t
177a0 68 72 65 61 64 2e 20 20 53 6f 0a 20 20 2a 2a 20  hread.  So.  ** 
177b0 62 79 20 64 65 66 61 75 6c 74 2c 20 77 65 20 63  by default, we c
177c0 61 6e 20 74 75 72 6e 20 6f 66 20 6d 75 74 65 78  an turn of mutex
177d0 69 6e 67 20 6f 6e 20 53 51 4c 69 74 65 20 64 61  ing on SQLite da
177e0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
177f0 6e 73 2e 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72  ns..  ** However
17800 2c 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75  , for testing pu
17810 72 70 6f 73 65 73 20 69 74 20 69 73 20 75 73 65  rposes it is use
17820 66 75 6c 20 74 6f 20 68 61 76 65 20 6d 75 74 65  ful to have mute
17830 78 65 73 20 74 75 72 6e 65 64 0a 20 20 2a 2a 20  xes turned.  ** 
17840 6f 6e 2e 20 20 53 6f 2c 20 62 79 20 64 65 66 61  on.  So, by defa
17850 75 6c 74 2c 20 6d 75 74 65 78 65 73 20 64 65 66  ult, mutexes def
17860 61 75 6c 74 20 6f 66 66 2e 20 20 42 75 74 20 69  ault off.  But i
17870 66 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 0a  f compiled with.
17880 20 20 2a 2a 20 53 51 4c 49 54 45 5f 54 43 4c 5f    ** SQLITE_TCL_
17890 44 45 46 41 55 4c 54 5f 46 55 4c 4c 4d 55 54 45  DEFAULT_FULLMUTE
178a0 58 20 74 68 65 6e 20 6d 75 74 65 78 65 73 20 64  X then mutexes d
178b0 65 66 61 75 6c 74 20 6f 6e 2e 0a 20 20 2a 2f 0a  efault on..  */.
178c0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 43  #ifdef SQLITE_TC
178d0 4c 5f 44 45 46 41 55 4c 54 5f 46 55 4c 4c 4d 55  L_DEFAULT_FULLMU
178e0 54 45 58 0a 20 20 66 6c 61 67 73 20 3d 20 53 51  TEX.  flags = SQ
178f0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
17900 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE | SQLITE_OPE
17910 4e 5f 43 52 45 41 54 45 20 7c 20 53 51 4c 49 54  N_CREATE | SQLIT
17920 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58  E_OPEN_FULLMUTEX
17930 3b 0a 23 65 6c 73 65 0a 20 20 66 6c 61 67 73 20  ;.#else.  flags 
17940 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
17950 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45  ADWRITE | SQLITE
17960 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 20 53  _OPEN_CREATE | S
17970 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54  QLITE_OPEN_NOMUT
17980 45 58 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  EX;.#endif..  if
17990 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20  ( objc==2 ){.   
179a0 20 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65 74 53   zArg = Tcl_GetS
179b0 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
179c0 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 20 20 69 66  v[1], 0);.    if
179d0 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d  ( strcmp(zArg,"-
179e0 76 65 72 73 69 6f 6e 22 29 3d 3d 30 20 29 7b 0a  version")==0 ){.
179f0 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
17a00 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 73 71  Result(interp,sq
17a10 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e  lite3_libversion
17a20 28 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  (), (char*)0);. 
17a30 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
17a40 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OK;.    }.    if
17a50 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d  ( strcmp(zArg,"-
17a60 73 6f 75 72 63 65 69 64 22 29 3d 3d 30 20 29 7b  sourceid")==0 ){
17a70 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
17a80 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 73  dResult(interp,s
17a90 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28  qlite3_sourceid(
17aa0 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ), (char*)0);.  
17ab0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
17ac0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  K;.    }.    if(
17ad0 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 68   strcmp(zArg,"-h
17ae0 61 73 2d 63 6f 64 65 63 22 29 3d 3d 30 20 29 7b  as-codec")==0 ){
17af0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
17b00 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 20 20 54  AS_CODEC.      T
17b10 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
17b20 69 6e 74 65 72 70 2c 22 31 22 2c 28 63 68 61 72  interp,"1",(char
17b30 2a 29 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  *)0);.#else.    
17b40 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
17b50 6c 74 28 69 6e 74 65 72 70 2c 22 30 22 2c 28 63  lt(interp,"0",(c
17b60 68 61 72 2a 29 30 29 3b 0a 23 65 6e 64 69 66 0a  har*)0);.#endif.
17b70 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
17b80 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
17b90 20 66 6f 72 28 69 3d 33 3b 20 69 2b 31 3c 6f 62   for(i=3; i+1<ob
17ba0 6a 63 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20 7a  jc; i+=2){.    z
17bb0 41 72 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  Arg = Tcl_GetStr
17bc0 69 6e 67 28 6f 62 6a 76 5b 69 5d 29 3b 0a 20 20  ing(objv[i]);.  
17bd0 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72    if( strcmp(zAr
17be0 67 2c 22 2d 6b 65 79 22 29 3d 3d 30 20 29 7b 0a  g,"-key")==0 ){.
17bf0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
17c00 53 5f 43 4f 44 45 43 0a 20 20 20 20 20 20 70 4b  S_CODEC.      pK
17c10 65 79 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65  ey = Tcl_GetByte
17c20 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a  ArrayFromObj(obj
17c30 76 5b 69 2b 31 5d 2c 20 26 6e 4b 65 79 29 3b 0a  v[i+1], &nKey);.
17c40 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
17c50 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67   if( strcmp(zArg
17c60 2c 20 22 2d 76 66 73 22 29 3d 3d 30 20 29 7b 0a  , "-vfs")==0 ){.
17c70 20 20 20 20 20 20 7a 56 66 73 20 3d 20 54 63 6c        zVfs = Tcl
17c80 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
17c90 69 2b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  i+1]);.    }else
17ca0 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67   if( strcmp(zArg
17cb0 2c 20 22 2d 72 65 61 64 6f 6e 6c 79 22 29 3d 3d  , "-readonly")==
17cc0 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62  0 ){.      int b
17cd0 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f  ;.      if( Tcl_
17ce0 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62  GetBooleanFromOb
17cf0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69  j(interp, objv[i
17d00 2b 31 5d 2c 20 26 62 29 20 29 20 72 65 74 75 72  +1], &b) ) retur
17d10 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
17d20 20 20 20 69 66 28 20 62 20 29 7b 0a 20 20 20 20     if( b ){.    
17d30 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 28 53      flags &= ~(S
17d40 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
17d50 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE|SQLITE_OPEN
17d60 5f 43 52 45 41 54 45 29 3b 0a 20 20 20 20 20 20  _CREATE);.      
17d70 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54    flags |= SQLIT
17d80 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b  E_OPEN_READONLY;
17d90 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
17da0 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e        flags &= ~
17db0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
17dc0 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 66 6c  ONLY;.        fl
17dd0 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50  ags |= SQLITE_OP
17de0 45 4e 5f 52 45 41 44 57 52 49 54 45 3b 0a 20 20  EN_READWRITE;.  
17df0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }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 63 72 65 61 74 65 22 29 3d 3d 30 20 29   "-create")==0 )
17e20 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 3b 0a 20  {.      int b;. 
17e30 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74       if( Tcl_Get
17e40 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
17e50 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d  nterp, objv[i+1]
17e60 2c 20 26 62 29 20 29 20 72 65 74 75 72 6e 20 54  , &b) ) return T
17e70 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
17e80 69 66 28 20 62 20 26 26 20 28 66 6c 61 67 73 20  if( b && (flags 
17e90 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  & SQLITE_OPEN_RE
17ea0 41 44 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20  ADONLY)==0 ){.  
17eb0 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53        flags |= S
17ec0 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
17ed0 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  E;.      }else{.
17ee0 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d          flags &=
17ef0 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52   ~SQLITE_OPEN_CR
17f00 45 41 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  EATE;.      }.  
17f10 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
17f20 6d 70 28 7a 41 72 67 2c 20 22 2d 6e 6f 6d 75 74  mp(zArg, "-nomut
17f30 65 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ex")==0 ){.     
17f40 20 69 6e 74 20 62 3b 0a 20 20 20 20 20 20 69 66   int b;.      if
17f50 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e  ( Tcl_GetBoolean
17f60 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
17f70 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 62 29 20 29  objv[i+1], &b) )
17f80 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
17f90 52 3b 0a 20 20 20 20 20 20 69 66 28 20 62 20 29  R;.      if( b )
17fa0 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  {.        flags 
17fb0 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e  |= SQLITE_OPEN_N
17fc0 4f 4d 55 54 45 58 3b 0a 20 20 20 20 20 20 20 20  OMUTEX;.        
17fd0 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
17fe0 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 3b  _OPEN_FULLMUTEX;
17ff0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
18000 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e        flags &= ~
18010 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55  SQLITE_OPEN_NOMU
18020 54 45 58 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  TEX;.      }.   
18030 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
18040 70 28 7a 41 72 67 2c 20 22 2d 66 75 6c 6c 6d 75  p(zArg, "-fullmu
18050 74 65 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  tex")==0 ){.    
18060 20 20 69 6e 74 20 62 3b 0a 20 20 20 20 20 20 69    int b;.      i
18070 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61  f( Tcl_GetBoolea
18080 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  nFromObj(interp,
18090 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 62 29 20   objv[i+1], &b) 
180a0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
180b0 4f 52 3b 0a 20 20 20 20 20 20 69 66 28 20 62 20  OR;.      if( b 
180c0 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  ){.        flags
180d0 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   |= SQLITE_OPEN_
180e0 46 55 4c 4c 4d 55 54 45 58 3b 0a 20 20 20 20 20  FULLMUTEX;.     
180f0 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c     flags &= ~SQL
18100 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58  ITE_OPEN_NOMUTEX
18110 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
18120 20 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20         flags &= 
18130 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c  ~SQLITE_OPEN_FUL
18140 4c 4d 55 54 45 58 3b 0a 20 20 20 20 20 20 7d 0a  LMUTEX;.      }.
18150 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
18160 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d 75 72 69  rcmp(zArg, "-uri
18170 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
18180 6e 74 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20  nt b;.      if( 
18190 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
181a0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
181b0 6a 76 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20 72  jv[i+1], &b) ) r
181c0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
181d0 0a 20 20 20 20 20 20 69 66 28 20 62 20 29 7b 0a  .      if( b ){.
181e0 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d          flags |=
181f0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49   SQLITE_OPEN_URI
18200 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
18210 20 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20         flags &= 
18220 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49  ~SQLITE_OPEN_URI
18230 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
18240 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  lse{.      Tcl_A
18250 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
18260 72 70 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74  rp, "unknown opt
18270 69 6f 6e 3a 20 22 2c 20 7a 41 72 67 2c 20 28 63  ion: ", zArg, (c
18280 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72  har*)0);.      r
18290 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
182a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
182b0 20 6f 62 6a 63 3c 33 20 7c 7c 20 28 6f 62 6a 63   objc<3 || (objc
182c0 26 31 29 21 3d 31 20 29 7b 0a 20 20 20 20 54 63  &1)!=1 ){.    Tc
182d0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
182e0 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
182f0 0a 20 20 20 20 20 20 22 48 41 4e 44 4c 45 20 46  .      "HANDLE F
18300 49 4c 45 4e 41 4d 45 20 3f 2d 76 66 73 20 56 46  ILENAME ?-vfs VF
18310 53 4e 41 4d 45 3f 20 3f 2d 72 65 61 64 6f 6e 6c  SNAME? ?-readonl
18320 79 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d 63 72 65  y BOOLEAN? ?-cre
18330 61 74 65 20 42 4f 4f 4c 45 41 4e 3f 22 0a 20 20  ate BOOLEAN?".  
18340 20 20 20 20 22 20 3f 2d 6e 6f 6d 75 74 65 78 20      " ?-nomutex 
18350 42 4f 4f 4c 45 41 4e 3f 20 3f 2d 66 75 6c 6c 6d  BOOLEAN? ?-fullm
18360 75 74 65 78 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d  utex BOOLEAN? ?-
18370 75 72 69 20 42 4f 4f 4c 45 41 4e 3f 22 0a 23 69  uri BOOLEAN?".#i
18380 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
18390 43 4f 44 45 43 0a 20 20 20 20 20 20 22 20 3f 2d  CODEC.      " ?-
183a0 6b 65 79 20 43 4f 44 45 43 4b 45 59 3f 22 0a 23  key CODECKEY?".#
183b0 65 6e 64 69 66 0a 20 20 20 20 29 3b 0a 20 20 20  endif.    );.   
183c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
183d0 52 3b 0a 20 20 7d 0a 20 20 7a 45 72 72 4d 73 67  R;.  }.  zErrMsg
183e0 20 3d 20 30 3b 0a 20 20 70 20 3d 20 28 53 71 6c   = 0;.  p = (Sql
183f0 69 74 65 44 62 2a 29 54 63 6c 5f 41 6c 6c 6f 63  iteDb*)Tcl_Alloc
18400 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a  ( sizeof(*p) );.
18410 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
18420 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
18430 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
18440 22 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 22 2c  "malloc failed",
18450 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20   TCL_STATIC);.  
18460 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
18470 4f 52 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  OR;.  }.  memset
18480 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  (p, 0, sizeof(*p
18490 29 29 3b 0a 20 20 7a 46 69 6c 65 20 3d 20 54 63  ));.  zFile = Tc
184a0 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
184b0 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a  bj(objv[2], 0);.
184c0 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 54 72    zFile = Tcl_Tr
184d0 61 6e 73 6c 61 74 65 46 69 6c 65 4e 61 6d 65 28  anslateFileName(
184e0 69 6e 74 65 72 70 2c 20 7a 46 69 6c 65 2c 20 26  interp, zFile, &
184f0 74 72 61 6e 73 6c 61 74 65 64 46 69 6c 65 6e 61  translatedFilena
18500 6d 65 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  me);.  rc = sqli
18510 74 65 33 5f 6f 70 65 6e 5f 76 32 28 7a 46 69 6c  te3_open_v2(zFil
18520 65 2c 20 26 70 2d 3e 64 62 2c 20 66 6c 61 67 73  e, &p->db, flags
18530 2c 20 7a 56 66 73 29 3b 0a 20 20 54 63 6c 5f 44  , zVfs);.  Tcl_D
18540 53 74 72 69 6e 67 46 72 65 65 28 26 74 72 61 6e  StringFree(&tran
18550 73 6c 61 74 65 64 46 69 6c 65 6e 61 6d 65 29 3b  slatedFilename);
18560 0a 20 20 69 66 28 20 70 2d 3e 64 62 20 29 7b 0a  .  if( p->db ){.
18570 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
18580 4b 21 3d 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  K!=sqlite3_errco
18590 64 65 28 70 2d 3e 64 62 29 20 29 7b 0a 20 20 20  de(p->db) ){.   
185a0 20 20 20 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c     zErrMsg = sql
185b0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
185c0 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
185d0 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20  g(p->db));.     
185e0 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70   sqlite3_close(p
185f0 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 70 2d 3e  ->db);.      p->
18600 64 62 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  db = 0;.    }.  
18610 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 45 72 72 4d  }else{.    zErrM
18620 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  sg = sqlite3_mpr
18630 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74  intf("%s", sqlit
18640 65 33 5f 65 72 72 73 74 72 28 72 63 29 29 3b 0a  e3_errstr(rc));.
18650 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
18660 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66  E_HAS_CODEC.  if
18670 28 20 70 2d 3e 64 62 20 29 7b 0a 20 20 20 20 73  ( p->db ){.    s
18680 71 6c 69 74 65 33 5f 6b 65 79 28 70 2d 3e 64 62  qlite3_key(p->db
18690 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20  , pKey, nKey);. 
186a0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
186b0 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20  p->db==0 ){.    
186c0 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
186d0 74 65 72 70 2c 20 7a 45 72 72 4d 73 67 2c 20 54  terp, zErrMsg, T
186e0 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20  CL_VOLATILE);.  
186f0 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72    Tcl_Free((char
18700 2a 29 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  *)p);.    sqlite
18710 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b  3_free(zErrMsg);
18720 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
18730 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 2d 3e  ERROR;.  }.  p->
18740 6d 61 78 53 74 6d 74 20 3d 20 4e 55 4d 5f 50 52  maxStmt = NUM_PR
18750 45 50 41 52 45 44 5f 53 54 4d 54 53 3b 0a 20 20  EPARED_STMTS;.  
18760 70 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65  p->interp = inte
18770 72 70 3b 0a 20 20 7a 41 72 67 20 3d 20 54 63 6c  rp;.  zArg = Tcl
18780 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
18790 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20  j(objv[1], 0);. 
187a0 20 69 66 28 20 44 62 55 73 65 4e 72 65 28 29 20   if( DbUseNre() 
187b0 29 7b 0a 20 20 20 20 54 63 6c 5f 4e 52 43 72 65  ){.    Tcl_NRCre
187c0 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ateCommand(inter
187d0 70 2c 20 7a 41 72 67 2c 20 44 62 4f 62 6a 43 6d  p, zArg, DbObjCm
187e0 64 41 64 61 70 74 6f 72 2c 20 44 62 4f 62 6a 43  dAdaptor, DbObjC
187f0 6d 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  md,.            
18800 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
18810 72 2a 29 70 2c 20 44 62 44 65 6c 65 74 65 43 6d  r*)p, DbDeleteCm
18820 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  d);.  }else{.   
18830 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
18840 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 7a 41  mmand(interp, zA
18850 72 67 2c 20 44 62 4f 62 6a 43 6d 64 2c 20 28 63  rg, DbObjCmd, (c
18860 68 61 72 2a 29 70 2c 20 44 62 44 65 6c 65 74 65  har*)p, DbDelete
18870 43 6d 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Cmd);.  }.  retu
18880 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
18890 0a 2a 2a 20 50 72 6f 76 69 64 65 20 61 20 64 75  .** Provide a du
188a0 6d 6d 79 20 54 63 6c 5f 49 6e 69 74 53 74 75 62  mmy Tcl_InitStub
188b0 73 20 69 66 20 77 65 20 61 72 65 20 75 73 69 6e  s if we are usin
188c0 67 20 74 68 69 73 20 61 73 20 61 20 73 74 61 74  g this as a stat
188d0 69 63 0a 2a 2a 20 6c 69 62 72 61 72 79 2e 0a 2a  ic.** library..*
188e0 2f 0a 23 69 66 6e 64 65 66 20 55 53 45 5f 54 43  /.#ifndef USE_TC
188f0 4c 5f 53 54 55 42 53 0a 23 20 75 6e 64 65 66 20  L_STUBS.# undef 
18900 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 0a 23   Tcl_InitStubs.#
18910 20 64 65 66 69 6e 65 20 54 63 6c 5f 49 6e 69 74   define Tcl_Init
18920 53 74 75 62 73 28 61 2c 62 2c 63 29 20 54 43 4c  Stubs(a,b,c) TCL
18930 5f 56 45 52 53 49 4f 4e 0a 23 65 6e 64 69 66 0a  _VERSION.#endif.
18940 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
18950 20 77 65 20 68 61 76 65 20 61 20 50 41 43 4b 41   we have a PACKA
18960 47 45 5f 56 45 52 53 49 4f 4e 20 6d 61 63 72 6f  GE_VERSION macro
18970 20 64 65 66 69 6e 65 64 2e 20 20 54 68 69 73 20   defined.  This 
18980 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 66 69 6e  will be.** defin
18990 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
189a0 20 62 79 20 74 68 65 20 54 45 41 20 6d 61 6b 65   by the TEA make
189b0 66 69 6c 65 2e 20 20 42 75 74 20 6f 74 68 65 72  file.  But other
189c0 20 6d 61 6b 65 66 69 6c 65 73 0a 2a 2a 20 64 6f   makefiles.** do
189d0 20 6e 6f 74 20 64 65 66 69 6e 65 20 69 74 2e 0a   not define it..
189e0 2a 2f 0a 23 69 66 6e 64 65 66 20 50 41 43 4b 41  */.#ifndef PACKA
189f0 47 45 5f 56 45 52 53 49 4f 4e 0a 23 20 64 65 66  GE_VERSION.# def
18a00 69 6e 65 20 50 41 43 4b 41 47 45 5f 56 45 52 53  ine PACKAGE_VERS
18a10 49 4f 4e 20 53 51 4c 49 54 45 5f 56 45 52 53 49  ION SQLITE_VERSI
18a20 4f 4e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  ON.#endif../*.**
18a30 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 69 73   Initialize this
18a40 20 6d 6f 64 75 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54   module..**.** T
18a50 68 69 73 20 54 63 6c 20 6d 6f 64 75 6c 65 20 63  his Tcl module c
18a60 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 61 20 73  ontains only a s
18a70 69 6e 67 6c 65 20 6e 65 77 20 54 63 6c 20 63 6f  ingle new Tcl co
18a80 6d 6d 61 6e 64 20 6e 61 6d 65 64 20 22 73 71 6c  mmand named "sql
18a90 69 74 65 22 2e 0a 2a 2a 20 28 48 65 6e 63 65 20  ite"..** (Hence 
18aa0 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 61 6d 65  there is no name
18ab0 73 70 61 63 65 2e 20 20 54 68 65 72 65 20 69 73  space.  There is
18ac0 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 75 73 69   no point in usi
18ad0 6e 67 20 61 20 6e 61 6d 65 73 70 61 63 65 0a 2a  ng a namespace.*
18ae0 2a 20 69 66 20 74 68 65 20 65 78 74 65 6e 73 69  * if the extensi
18af0 6f 6e 20 6f 6e 6c 79 20 73 75 70 70 6c 69 65 73  on only supplies
18b00 20 6f 6e 65 20 6e 65 77 20 6e 61 6d 65 21 29 20   one new name!) 
18b10 20 54 68 65 20 22 73 71 6c 69 74 65 22 20 63 6f   The "sqlite" co
18b20 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 75 73 65 64  mmand is.** used
18b30 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 53   to open a new S
18b40 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e 20  QLite database. 
18b50 20 53 65 65 20 74 68 65 20 44 62 4d 61 69 6e 28   See the DbMain(
18b60 29 20 72 6f 75 74 69 6e 65 20 61 62 6f 76 65 0a  ) routine above.
18b70 2a 2a 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  ** for additiona
18b80 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
18b90 2a 0a 2a 2a 20 54 68 65 20 45 58 54 45 52 4e 20  *.** The EXTERN 
18ba0 6d 61 63 72 6f 73 20 61 72 65 20 72 65 71 75 69  macros are requi
18bb0 72 65 64 20 62 79 20 54 43 4c 20 69 6e 20 6f 72  red by TCL in or
18bc0 64 65 72 20 74 6f 20 77 6f 72 6b 20 6f 6e 20 77  der to work on w
18bd0 69 6e 64 6f 77 73 2e 0a 2a 2f 0a 45 58 54 45 52  indows..*/.EXTER
18be0 4e 20 69 6e 74 20 53 71 6c 69 74 65 33 5f 49 6e  N int Sqlite3_In
18bf0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  it(Tcl_Interp *i
18c00 6e 74 65 72 70 29 7b 0a 20 20 69 6e 74 20 72 63  nterp){.  int rc
18c10 20 3d 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73   = Tcl_InitStubs
18c20 28 69 6e 74 65 72 70 2c 20 22 38 2e 34 22 2c 20  (interp, "8.4", 
18c30 30 29 20 3f 20 54 43 4c 5f 4f 4b 20 3a 20 54 43  0) ? TCL_OK : TC
18c40 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72  L_ERROR;.  if( r
18c50 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20  c==TCL_OK ){.   
18c60 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
18c70 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 73  mmand(interp, "s
18c80 71 6c 69 74 65 33 22 2c 20 28 54 63 6c 5f 4f 62  qlite3", (Tcl_Ob
18c90 6a 43 6d 64 50 72 6f 63 2a 29 44 62 4d 61 69 6e  jCmdProc*)DbMain
18ca0 2c 20 30 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66  , 0, 0);.#ifndef
18cb0 20 53 51 4c 49 54 45 5f 33 5f 53 55 46 46 49 58   SQLITE_3_SUFFIX
18cc0 5f 4f 4e 4c 59 0a 20 20 20 20 2f 2a 20 54 68 65  _ONLY.    /* The
18cd0 20 22 73 71 6c 69 74 65 22 20 61 6c 69 61 73 20   "sqlite" alias 
18ce0 69 73 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64 2e  is undocumented.
18cf0 20 20 49 74 20 69 73 20 68 65 72 65 20 6f 6e 6c    It is here onl
18d00 79 20 74 6f 20 73 75 70 70 6f 72 74 0a 20 20 20  y to support.   
18d10 20 2a 2a 20 6c 65 67 61 63 79 20 73 63 72 69 70   ** legacy scrip
18d20 74 73 2e 20 20 41 6c 6c 20 6e 65 77 20 73 63 72  ts.  All new scr
18d30 69 70 74 73 20 73 68 6f 75 6c 64 20 75 73 65 20  ipts should use 
18d40 6f 6e 6c 79 20 74 68 65 20 22 73 71 6c 69 74 65  only the "sqlite
18d50 33 22 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e  3".    ** comman
18d60 64 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 43 72  d. */.    Tcl_Cr
18d70 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
18d80 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 22 2c  nterp, "sqlite",
18d90 20 28 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63   (Tcl_ObjCmdProc
18da0 2a 29 44 62 4d 61 69 6e 2c 20 30 2c 20 30 29 3b  *)DbMain, 0, 0);
18db0 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d  .#endif.    rc =
18dc0 20 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28   Tcl_PkgProvide(
18dd0 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33  interp, "sqlite3
18de0 22 2c 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49  ", PACKAGE_VERSI
18df0 4f 4e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ON);.  }.  retur
18e00 6e 20 72 63 3b 0a 7d 0a 45 58 54 45 52 4e 20 69  n rc;.}.EXTERN i
18e10 6e 74 20 54 63 6c 73 71 6c 69 74 65 33 5f 49 6e  nt Tclsqlite3_In
18e20 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  it(Tcl_Interp *i
18e30 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20 53  nterp){ return S
18e40 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74 65  qlite3_Init(inte
18e50 72 70 29 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e  rp); }.EXTERN in
18e60 74 20 53 71 6c 69 74 65 33 5f 55 6e 6c 6f 61 64  t Sqlite3_Unload
18e70 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
18e80 65 72 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  erp, int flags){
18e90 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20   return TCL_OK; 
18ea0 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 54 63 6c  }.EXTERN int Tcl
18eb0 73 71 6c 69 74 65 33 5f 55 6e 6c 6f 61 64 28 54  sqlite3_Unload(T
18ec0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
18ed0 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 20 72  p, int flags){ r
18ee0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a  eturn TCL_OK; }.
18ef0 0a 2f 2a 20 42 65 63 61 75 73 65 20 69 74 20 61  ./* Because it a
18f00 63 63 65 73 73 65 73 20 74 68 65 20 66 69 6c 65  ccesses the file
18f10 2d 73 79 73 74 65 6d 20 61 6e 64 20 75 73 65 73  -system and uses
18f20 20 70 65 72 73 69 73 74 65 6e 74 20 73 74 61 74   persistent stat
18f30 65 2c 20 53 51 4c 69 74 65 0a 2a 2a 20 69 73 20  e, SQLite.** is 
18f40 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 20 61  not considered a
18f50 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 73  ppropriate for s
18f60 61 66 65 20 69 6e 74 65 72 70 72 65 74 65 72 73  afe interpreters
18f70 2e 20 20 48 65 6e 63 65 2c 20 77 65 20 64 65 6c  .  Hence, we del
18f80 69 62 65 72 61 74 65 6c 79 0a 2a 2a 20 6f 6d 69  iberately.** omi
18f90 74 20 74 68 65 20 5f 53 61 66 65 49 6e 69 74 28  t the _SafeInit(
18fa0 29 20 69 6e 74 65 72 66 61 63 65 73 2e 0a 2a 2f  ) interfaces..*/
18fb0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
18fc0 5f 33 5f 53 55 46 46 49 58 5f 4f 4e 4c 59 0a 69  _3_SUFFIX_ONLY.i
18fd0 6e 74 20 53 71 6c 69 74 65 5f 49 6e 69 74 28 54  nt Sqlite_Init(T
18fe0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
18ff0 70 29 7b 20 72 65 74 75 72 6e 20 53 71 6c 69 74  p){ return Sqlit
19000 65 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  e3_Init(interp);
19010 20 7d 0a 69 6e 74 20 54 63 6c 73 71 6c 69 74 65   }.int Tclsqlite
19020 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
19030 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72   *interp){ retur
19040 6e 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69  n Sqlite3_Init(i
19050 6e 74 65 72 70 29 3b 20 7d 0a 69 6e 74 20 53 71  nterp); }.int Sq
19060 6c 69 74 65 5f 55 6e 6c 6f 61 64 28 54 63 6c 5f  lite_Unload(Tcl_
19070 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
19080 69 6e 74 20 66 6c 61 67 73 29 7b 20 72 65 74 75  int flags){ retu
19090 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 69 6e 74  rn TCL_OK; }.int
190a0 20 54 63 6c 73 71 6c 69 74 65 5f 55 6e 6c 6f 61   Tclsqlite_Unloa
190b0 64 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  d(Tcl_Interp *in
190c0 74 65 72 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  terp, int flags)
190d0 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b  { return TCL_OK;
190e0 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65   }.#endif..#ifde
190f0 66 20 54 43 4c 53 48 0a 2f 2a 2a 2a 2a 2a 2a 2a  f TCLSH./*******
19100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19120 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19140 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66  ******.** All of
19150 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 66   the code that f
19160 6f 6c 6c 6f 77 73 20 69 73 20 75 73 65 64 20 74  ollows is used t
19170 6f 20 62 75 69 6c 64 20 73 74 61 6e 64 61 6c 6f  o build standalo
19180 6e 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  ne TCL interpret
19190 65 72 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20  ers.** that are 
191a0 73 74 61 74 69 63 61 6c 6c 79 20 6c 69 6e 6b 65  statically linke
191b0 64 20 77 69 74 68 20 53 51 4c 69 74 65 2e 20 20  d with SQLite.  
191c0 45 6e 61 62 6c 65 20 74 68 65 73 65 20 62 79 20  Enable these by 
191d0 63 6f 6d 70 69 6c 69 6e 67 0a 2a 2a 20 77 69 74  compiling.** wit
191e0 68 20 2d 44 54 43 4c 53 48 3d 6e 20 77 68 65 72  h -DTCLSH=n wher
191f0 65 20 6e 20 63 61 6e 20 62 65 20 31 20 6f 72 20  e n can be 1 or 
19200 32 2e 20 20 41 6e 20 6e 20 6f 66 20 31 20 67 65  2.  An n of 1 ge
19210 6e 65 72 61 74 65 73 20 61 20 73 74 61 6e 64 61  nerates a standa
19220 72 64 0a 2a 2a 20 74 63 6c 73 68 20 62 75 74 20  rd.** tclsh but 
19230 77 69 74 68 20 53 51 4c 69 74 65 20 62 75 69 6c  with SQLite buil
19240 74 20 69 6e 2e 20 20 41 6e 20 6e 20 6f 66 20 32  t in.  An n of 2
19250 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 53   generates the S
19260 51 4c 69 74 65 20 73 70 61 63 65 0a 2a 2a 20 61  QLite space.** a
19270 6e 61 6c 79 73 69 73 20 70 72 6f 67 72 61 6d 2e  nalysis program.
19280 0a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  .*/..#if defined
19290 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c  (SQLITE_TEST) ||
192a0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
192b0 54 43 4c 4d 44 35 29 0a 2f 2a 0a 20 2a 20 54 68  TCLMD5)./*. * Th
192c0 69 73 20 63 6f 64 65 20 69 6d 70 6c 65 6d 65 6e  is code implemen
192d0 74 73 20 74 68 65 20 4d 44 35 20 6d 65 73 73 61  ts the MD5 messa
192e0 67 65 2d 64 69 67 65 73 74 20 61 6c 67 6f 72 69  ge-digest algori
192f0 74 68 6d 2e 0a 20 2a 20 54 68 65 20 61 6c 67 6f  thm.. * The algo
19300 72 69 74 68 6d 20 69 73 20 64 75 65 20 74 6f 20  rithm is due to 
19310 52 6f 6e 20 52 69 76 65 73 74 2e 20 20 54 68 69  Ron Rivest.  Thi
19320 73 20 63 6f 64 65 20 77 61 73 0a 20 2a 20 77 72  s code was. * wr
19330 69 74 74 65 6e 20 62 79 20 43 6f 6c 69 6e 20 50  itten by Colin P
19340 6c 75 6d 62 20 69 6e 20 31 39 39 33 2c 20 6e 6f  lumb in 1993, no
19350 20 63 6f 70 79 72 69 67 68 74 20 69 73 20 63 6c   copyright is cl
19360 61 69 6d 65 64 2e 0a 20 2a 20 54 68 69 73 20 63  aimed.. * This c
19370 6f 64 65 20 69 73 20 69 6e 20 74 68 65 20 70 75  ode is in the pu
19380 62 6c 69 63 20 64 6f 6d 61 69 6e 3b 20 64 6f 20  blic domain; do 
19390 77 69 74 68 20 69 74 20 77 68 61 74 20 79 6f 75  with it what you
193a0 20 77 69 73 68 2e 0a 20 2a 0a 20 2a 20 45 71 75   wish.. *. * Equ
193b0 69 76 61 6c 65 6e 74 20 63 6f 64 65 20 69 73 20  ivalent code is 
193c0 61 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20 52  available from R
193d0 53 41 20 44 61 74 61 20 53 65 63 75 72 69 74 79  SA Data Security
193e0 2c 20 49 6e 63 2e 0a 20 2a 20 54 68 69 73 20 63  , Inc.. * This c
193f0 6f 64 65 20 68 61 73 20 62 65 65 6e 20 74 65 73  ode has been tes
19400 74 65 64 20 61 67 61 69 6e 73 74 20 74 68 61 74  ted against that
19410 2c 20 61 6e 64 20 69 73 20 65 71 75 69 76 61 6c  , and is equival
19420 65 6e 74 2c 0a 20 2a 20 65 78 63 65 70 74 20 74  ent,. * except t
19430 68 61 74 20 79 6f 75 20 64 6f 6e 27 74 20 6e 65  hat you don't ne
19440 65 64 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 77  ed to include tw
19450 6f 20 70 61 67 65 73 20 6f 66 20 6c 65 67 61 6c  o pages of legal
19460 65 73 65 0a 20 2a 20 77 69 74 68 20 65 76 65 72  ese. * with ever
19470 79 20 63 6f 70 79 2e 0a 20 2a 0a 20 2a 20 54 6f  y copy.. *. * To
19480 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6d 65 73   compute the mes
19490 73 61 67 65 20 64 69 67 65 73 74 20 6f 66 20 61  sage digest of a
194a0 20 63 68 75 6e 6b 20 6f 66 20 62 79 74 65 73 2c   chunk of bytes,
194b0 20 64 65 63 6c 61 72 65 20 61 6e 0a 20 2a 20 4d   declare an. * M
194c0 44 35 43 6f 6e 74 65 78 74 20 73 74 72 75 63 74  D5Context struct
194d0 75 72 65 2c 20 70 61 73 73 20 69 74 20 74 6f 20  ure, pass it to 
194e0 4d 44 35 49 6e 69 74 2c 20 63 61 6c 6c 20 4d 44  MD5Init, call MD
194f0 35 55 70 64 61 74 65 20 61 73 0a 20 2a 20 6e 65  5Update as. * ne
19500 65 64 65 64 20 6f 6e 20 62 75 66 66 65 72 73 20  eded on buffers 
19510 66 75 6c 6c 20 6f 66 20 62 79 74 65 73 2c 20 61  full of bytes, a
19520 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 4d 44 35  nd then call MD5
19530 46 69 6e 61 6c 2c 20 77 68 69 63 68 0a 20 2a 20  Final, which. * 
19540 77 69 6c 6c 20 66 69 6c 6c 20 61 20 73 75 70 70  will fill a supp
19550 6c 69 65 64 20 31 36 2d 62 79 74 65 20 61 72 72  lied 16-byte arr
19560 61 79 20 77 69 74 68 20 74 68 65 20 64 69 67 65  ay with the dige
19570 73 74 2e 0a 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 49  st.. */../*. * I
19580 66 20 63 6f 6d 70 69 6c 65 64 20 6f 6e 20 61 20  f compiled on a 
19590 6d 61 63 68 69 6e 65 20 74 68 61 74 20 64 6f 65  machine that doe
195a0 73 6e 27 74 20 68 61 76 65 20 61 20 33 32 2d 62  sn't have a 32-b
195b0 69 74 20 69 6e 74 65 67 65 72 2c 0a 20 2a 20 79  it integer,. * y
195c0 6f 75 20 6a 75 73 74 20 73 65 74 20 22 75 69 6e  ou just set "uin
195d0 74 33 32 22 20 74 6f 20 74 68 65 20 61 70 70 72  t32" to the appr
195e0 6f 70 72 69 61 74 65 20 64 61 74 61 74 79 70 65  opriate datatype
195f0 20 66 6f 72 20 61 6e 0a 20 2a 20 75 6e 73 69 67   for an. * unsig
19600 6e 65 64 20 33 32 2d 62 69 74 20 69 6e 74 65 67  ned 32-bit integ
19610 65 72 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  er.  For example
19620 3a 0a 20 2a 0a 20 2a 20 20 20 20 20 20 20 63 63  :. *. *       cc
19630 20 2d 44 75 69 6e 74 33 32 3d 27 75 6e 73 69 67   -Duint32='unsig
19640 6e 65 64 20 6c 6f 6e 67 27 20 6d 64 35 2e 63 0a  ned long' md5.c.
19650 20 2a 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 75   *. */.#ifndef u
19660 69 6e 74 33 32 0a 23 20 20 64 65 66 69 6e 65 20  int32.#  define 
19670 75 69 6e 74 33 32 20 75 6e 73 69 67 6e 65 64 20  uint32 unsigned 
19680 69 6e 74 0a 23 65 6e 64 69 66 0a 0a 73 74 72 75  int.#endif..stru
19690 63 74 20 4d 44 35 43 6f 6e 74 65 78 74 20 7b 0a  ct MD5Context {.
196a0 20 20 69 6e 74 20 69 73 49 6e 69 74 3b 0a 20 20    int isInit;.  
196b0 75 69 6e 74 33 32 20 62 75 66 5b 34 5d 3b 0a 20  uint32 buf[4];. 
196c0 20 75 69 6e 74 33 32 20 62 69 74 73 5b 32 5d 3b   uint32 bits[2];
196d0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
196e0 20 69 6e 5b 36 34 5d 3b 0a 7d 3b 0a 74 79 70 65   in[64];.};.type
196f0 64 65 66 20 73 74 72 75 63 74 20 4d 44 35 43 6f  def struct MD5Co
19700 6e 74 65 78 74 20 4d 44 35 43 6f 6e 74 65 78 74  ntext MD5Context
19710 3b 0a 0a 2f 2a 0a 20 2a 20 4e 6f 74 65 3a 20 74  ;../*. * Note: t
19720 68 69 73 20 63 6f 64 65 20 69 73 20 68 61 72 6d  his code is harm
19730 6c 65 73 73 20 6f 6e 20 6c 69 74 74 6c 65 2d 65  less on little-e
19740 6e 64 69 61 6e 20 6d 61 63 68 69 6e 65 73 2e 0a  ndian machines..
19750 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
19760 62 79 74 65 52 65 76 65 72 73 65 20 28 75 6e 73  byteReverse (uns
19770 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c  igned char *buf,
19780 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 73 29   unsigned longs)
19790 7b 0a 20 20 20 20 20 20 20 20 75 69 6e 74 33 32  {.        uint32
197a0 20 74 3b 0a 20 20 20 20 20 20 20 20 64 6f 20 7b   t;.        do {
197b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
197c0 20 74 20 3d 20 28 75 69 6e 74 33 32 29 28 28 75   t = (uint32)((u
197d0 6e 73 69 67 6e 65 64 29 62 75 66 5b 33 5d 3c 3c  nsigned)buf[3]<<
197e0 38 20 7c 20 62 75 66 5b 32 5d 29 20 3c 3c 20 31  8 | buf[2]) << 1
197f0 36 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  6 |.            
19800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19810 28 28 75 6e 73 69 67 6e 65 64 29 62 75 66 5b 31  ((unsigned)buf[1
19820 5d 3c 3c 38 20 7c 20 62 75 66 5b 30 5d 29 3b 0a  ]<<8 | buf[0]);.
19830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19840 2a 28 75 69 6e 74 33 32 20 2a 29 62 75 66 20 3d  *(uint32 *)buf =
19850 20 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   t;.            
19860 20 20 20 20 62 75 66 20 2b 3d 20 34 3b 0a 20 20      buf += 4;.  
19870 20 20 20 20 20 20 7d 20 77 68 69 6c 65 20 28 2d        } while (-
19880 2d 6c 6f 6e 67 73 29 3b 0a 7d 0a 2f 2a 20 54 68  -longs);.}./* Th
19890 65 20 66 6f 75 72 20 63 6f 72 65 20 66 75 6e 63  e four core func
198a0 74 69 6f 6e 73 20 2d 20 46 31 20 69 73 20 6f 70  tions - F1 is op
198b0 74 69 6d 69 7a 65 64 20 73 6f 6d 65 77 68 61 74  timized somewhat
198c0 20 2a 2f 0a 0a 2f 2a 20 23 64 65 66 69 6e 65 20   */../* #define 
198d0 46 31 28 78 2c 20 79 2c 20 7a 29 20 28 78 20 26  F1(x, y, z) (x &
198e0 20 79 20 7c 20 7e 78 20 26 20 7a 29 20 2a 2f 0a   y | ~x & z) */.
198f0 23 64 65 66 69 6e 65 20 46 31 28 78 2c 20 79 2c  #define F1(x, y,
19900 20 7a 29 20 28 7a 20 5e 20 28 78 20 26 20 28 79   z) (z ^ (x & (y
19910 20 5e 20 7a 29 29 29 0a 23 64 65 66 69 6e 65 20   ^ z))).#define 
19920 46 32 28 78 2c 20 79 2c 20 7a 29 20 46 31 28 7a  F2(x, y, z) F1(z
19930 2c 20 78 2c 20 79 29 0a 23 64 65 66 69 6e 65 20  , x, y).#define 
19940 46 33 28 78 2c 20 79 2c 20 7a 29 20 28 78 20 5e  F3(x, y, z) (x ^
19950 20 79 20 5e 20 7a 29 0a 23 64 65 66 69 6e 65 20   y ^ z).#define 
19960 46 34 28 78 2c 20 79 2c 20 7a 29 20 28 79 20 5e  F4(x, y, z) (y ^
19970 20 28 78 20 7c 20 7e 7a 29 29 0a 0a 2f 2a 20 54   (x | ~z))../* T
19980 68 69 73 20 69 73 20 74 68 65 20 63 65 6e 74 72  his is the centr
19990 61 6c 20 73 74 65 70 20 69 6e 20 74 68 65 20 4d  al step in the M
199a0 44 35 20 61 6c 67 6f 72 69 74 68 6d 2e 20 2a 2f  D5 algorithm. */
199b0 0a 23 64 65 66 69 6e 65 20 4d 44 35 53 54 45 50  .#define MD5STEP
199c0 28 66 2c 20 77 2c 20 78 2c 20 79 2c 20 7a 2c 20  (f, w, x, y, z, 
199d0 64 61 74 61 2c 20 73 29 20 5c 0a 20 20 20 20 20  data, s) \.     
199e0 20 20 20 28 20 77 20 2b 3d 20 66 28 78 2c 20 79     ( w += f(x, y
199f0 2c 20 7a 29 20 2b 20 64 61 74 61 2c 20 20 77 20  , z) + data,  w 
19a00 3d 20 77 3c 3c 73 20 7c 20 77 3e 3e 28 33 32 2d  = w<<s | w>>(32-
19a10 73 29 2c 20 20 77 20 2b 3d 20 78 20 29 0a 0a 2f  s),  w += x )../
19a20 2a 0a 20 2a 20 54 68 65 20 63 6f 72 65 20 6f 66  *. * The core of
19a30 20 74 68 65 20 4d 44 35 20 61 6c 67 6f 72 69 74   the MD5 algorit
19a40 68 6d 2c 20 74 68 69 73 20 61 6c 74 65 72 73 20  hm, this alters 
19a50 61 6e 20 65 78 69 73 74 69 6e 67 20 4d 44 35 20  an existing MD5 
19a60 68 61 73 68 20 74 6f 0a 20 2a 20 72 65 66 6c 65  hash to. * refle
19a70 63 74 20 74 68 65 20 61 64 64 69 74 69 6f 6e 20  ct the addition 
19a80 6f 66 20 31 36 20 6c 6f 6e 67 77 6f 72 64 73 20  of 16 longwords 
19a90 6f 66 20 6e 65 77 20 64 61 74 61 2e 20 20 4d 44  of new data.  MD
19aa0 35 55 70 64 61 74 65 20 62 6c 6f 63 6b 73 0a 20  5Update blocks. 
19ab0 2a 20 74 68 65 20 64 61 74 61 20 61 6e 64 20 63  * the data and c
19ac0 6f 6e 76 65 72 74 73 20 62 79 74 65 73 20 69 6e  onverts bytes in
19ad0 74 6f 20 6c 6f 6e 67 77 6f 72 64 73 20 66 6f 72  to longwords for
19ae0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 20   this routine.. 
19af0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 4d  */.static void M
19b00 44 35 54 72 61 6e 73 66 6f 72 6d 28 75 69 6e 74  D5Transform(uint
19b10 33 32 20 62 75 66 5b 34 5d 2c 20 63 6f 6e 73 74  32 buf[4], const
19b20 20 75 69 6e 74 33 32 20 69 6e 5b 31 36 5d 29 7b   uint32 in[16]){
19b30 0a 20 20 20 20 20 20 20 20 72 65 67 69 73 74 65  .        registe
19b40 72 20 75 69 6e 74 33 32 20 61 2c 20 62 2c 20 63  r uint32 a, b, c
19b50 2c 20 64 3b 0a 0a 20 20 20 20 20 20 20 20 61 20  , d;..        a 
19b60 3d 20 62 75 66 5b 30 5d 3b 0a 20 20 20 20 20 20  = buf[0];.      
19b70 20 20 62 20 3d 20 62 75 66 5b 31 5d 3b 0a 20 20    b = buf[1];.  
19b80 20 20 20 20 20 20 63 20 3d 20 62 75 66 5b 32 5d        c = buf[2]
19b90 3b 0a 20 20 20 20 20 20 20 20 64 20 3d 20 62 75  ;.        d = bu
19ba0 66 5b 33 5d 3b 0a 0a 20 20 20 20 20 20 20 20 4d  f[3];..        M
19bb0 44 35 53 54 45 50 28 46 31 2c 20 61 2c 20 62 2c  D5STEP(F1, a, b,
19bc0 20 63 2c 20 64 2c 20 69 6e 5b 20 30 5d 2b 30 78   c, d, in[ 0]+0x
19bd0 64 37 36 61 61 34 37 38 2c 20 20 37 29 3b 0a 20  d76aa478,  7);. 
19be0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
19bf0 31 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69  1, d, a, b, c, i
19c00 6e 5b 20 31 5d 2b 30 78 65 38 63 37 62 37 35 36  n[ 1]+0xe8c7b756
19c10 2c 20 31 32 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 12);.        M
19c20 44 35 53 54 45 50 28 46 31 2c 20 63 2c 20 64 2c  D5STEP(F1, c, d,
19c30 20 61 2c 20 62 2c 20 69 6e 5b 20 32 5d 2b 30 78   a, b, in[ 2]+0x
19c40 32 34 32 30 37 30 64 62 2c 20 31 37 29 3b 0a 20  242070db, 17);. 
19c50 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
19c60 31 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  1, b, c, d, a, i
19c70 6e 5b 20 33 5d 2b 30 78 63 31 62 64 63 65 65 65  n[ 3]+0xc1bdceee
19c80 2c 20 32 32 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 22);.        M
19c90 44 35 53 54 45 50 28 46 31 2c 20 61 2c 20 62 2c  D5STEP(F1, a, b,
19ca0 20 63 2c 20 64 2c 20 69 6e 5b 20 34 5d 2b 30 78   c, d, in[ 4]+0x
19cb0 66 35 37 63 30 66 61 66 2c 20 20 37 29 3b 0a 20  f57c0faf,  7);. 
19cc0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
19cd0 31 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69  1, d, a, b, c, i
19ce0 6e 5b 20 35 5d 2b 30 78 34 37 38 37 63 36 32 61  n[ 5]+0x4787c62a
19cf0 2c 20 31 32 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 12);.        M
19d00 44 35 53 54 45 50 28 46 31 2c 20 63 2c 20 64 2c  D5STEP(F1, c, d,
19d10 20 61 2c 20 62 2c 20 69 6e 5b 20 36 5d 2b 30 78   a, b, in[ 6]+0x
19d20 61 38 33 30 34 36 31 33 2c 20 31 37 29 3b 0a 20  a8304613, 17);. 
19d30 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
19d40 31 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  1, b, c, d, a, i
19d50 6e 5b 20 37 5d 2b 30 78 66 64 34 36 39 35 30 31  n[ 7]+0xfd469501
19d60 2c 20 32 32 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 22);.        M
19d70 44 35 53 54 45 50 28 46 31 2c 20 61 2c 20 62 2c  D5STEP(F1, a, b,
19d80 20 63 2c 20 64 2c 20 69 6e 5b 20 38 5d 2b 30 78   c, d, in[ 8]+0x
19d90 36 39 38 30 39 38 64 38 2c 20 20 37 29 3b 0a 20  698098d8,  7);. 
19da0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
19db0 31 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69  1, d, a, b, c, i
19dc0 6e 5b 20 39 5d 2b 30 78 38 62 34 34 66 37 61 66  n[ 9]+0x8b44f7af
19dd0 2c 20 31 32 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 12);.        M
19de0 44 35 53 54 45 50 28 46 31 2c 20 63 2c 20 64 2c  D5STEP(F1, c, d,
19df0 20 61 2c 20 62 2c 20 69 6e 5b 31 30 5d 2b 30 78   a, b, in[10]+0x
19e00 66 66 66 66 35 62 62 31 2c 20 31 37 29 3b 0a 20  ffff5bb1, 17);. 
19e10 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
19e20 31 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  1, b, c, d, a, i
19e30 6e 5b 31 31 5d 2b 30 78 38 39 35 63 64 37 62 65  n[11]+0x895cd7be
19e40 2c 20 32 32 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 22);.        M
19e50 44 35 53 54 45 50 28 46 31 2c 20 61 2c 20 62 2c  D5STEP(F1, a, b,
19e60 20 63 2c 20 64 2c 20 69 6e 5b 31 32 5d 2b 30 78   c, d, in[12]+0x
19e70 36 62 39 30 31 31 32 32 2c 20 20 37 29 3b 0a 20  6b901122,  7);. 
19e80 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
19e90 31 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69  1, d, a, b, c, i
19ea0 6e 5b 31 33 5d 2b 30 78 66 64 39 38 37 31 39 33  n[13]+0xfd987193
19eb0 2c 20 31 32 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 12);.        M
19ec0 44 35 53 54 45 50 28 46 31 2c 20 63 2c 20 64 2c  D5STEP(F1, c, d,
19ed0 20 61 2c 20 62 2c 20 69 6e 5b 31 34 5d 2b 30 78   a, b, in[14]+0x
19ee0 61 36 37 39 34 33 38 65 2c 20 31 37 29 3b 0a 20  a679438e, 17);. 
19ef0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
19f00 31 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  1, b, c, d, a, i
19f10 6e 5b 31 35 5d 2b 30 78 34 39 62 34 30 38 32 31  n[15]+0x49b40821
19f20 2c 20 32 32 29 3b 0a 0a 20 20 20 20 20 20 20 20  , 22);..        
19f30 4d 44 35 53 54 45 50 28 46 32 2c 20 61 2c 20 62  MD5STEP(F2, a, b
19f40 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 31 5d 2b 30  , c, d, in[ 1]+0
19f50 78 66 36 31 65 32 35 36 32 2c 20 20 35 29 3b 0a  xf61e2562,  5);.
19f60 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
19f70 46 32 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20  F2, d, a, b, c, 
19f80 69 6e 5b 20 36 5d 2b 30 78 63 30 34 30 62 33 34  in[ 6]+0xc040b34
19f90 30 2c 20 20 39 29 3b 0a 20 20 20 20 20 20 20 20  0,  9);.        
19fa0 4d 44 35 53 54 45 50 28 46 32 2c 20 63 2c 20 64  MD5STEP(F2, c, d
19fb0 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 31 5d 2b 30  , a, b, in[11]+0
19fc0 78 32 36 35 65 35 61 35 31 2c 20 31 34 29 3b 0a  x265e5a51, 14);.
19fd0 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
19fe0 46 32 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20  F2, b, c, d, a, 
19ff0 69 6e 5b 20 30 5d 2b 30 78 65 39 62 36 63 37 61  in[ 0]+0xe9b6c7a
1a000 61 2c 20 32 30 29 3b 0a 20 20 20 20 20 20 20 20  a, 20);.        
1a010 4d 44 35 53 54 45 50 28 46 32 2c 20 61 2c 20 62  MD5STEP(F2, a, b
1a020 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 35 5d 2b 30  , c, d, in[ 5]+0
1a030 78 64 36 32 66 31 30 35 64 2c 20 20 35 29 3b 0a  xd62f105d,  5);.
1a040 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
1a050 46 32 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20  F2, d, a, b, c, 
1a060 69 6e 5b 31 30 5d 2b 30 78 30 32 34 34 31 34 35  in[10]+0x0244145
1a070 33 2c 20 20 39 29 3b 0a 20 20 20 20 20 20 20 20  3,  9);.        
1a080 4d 44 35 53 54 45 50 28 46 32 2c 20 63 2c 20 64  MD5STEP(F2, c, d
1a090 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 35 5d 2b 30  , a, b, in[15]+0
1a0a0 78 64 38 61 31 65 36 38 31 2c 20 31 34 29 3b 0a  xd8a1e681, 14);.
1a0b0 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
1a0c0 46 32 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20  F2, b, c, d, a, 
1a0d0 69 6e 5b 20 34 5d 2b 30 78 65 37 64 33 66 62 63  in[ 4]+0xe7d3fbc
1a0e0 38 2c 20 32 30 29 3b 0a 20 20 20 20 20 20 20 20  8, 20);.        
1a0f0 4d 44 35 53 54 45 50 28 46 32 2c 20 61 2c 20 62  MD5STEP(F2, a, b
1a100 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 39 5d 2b 30  , c, d, in[ 9]+0
1a110 78 32 31 65 31 63 64 65 36 2c 20 20 35 29 3b 0a  x21e1cde6,  5);.
1a120 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
1a130 46 32 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20  F2, d, a, b, c, 
1a140 69 6e 5b 31 34 5d 2b 30 78 63 33 33 37 30 37 64  in[14]+0xc33707d
1a150 36 2c 20 20 39 29 3b 0a 20 20 20 20 20 20 20 20  6,  9);.        
1a160 4d 44 35 53 54 45 50 28 46 32 2c 20 63 2c 20 64  MD5STEP(F2, c, d
1a170 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 33 5d 2b 30  , a, b, in[ 3]+0
1a180 78 66 34 64 35 30 64 38 37 2c 20 31 34 29 3b 0a  xf4d50d87, 14);.
1a190 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
1a1a0 46 32 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20  F2, b, c, d, a, 
1a1b0 69 6e 5b 20 38 5d 2b 30 78 34 35 35 61 31 34 65  in[ 8]+0x455a14e
1a1c0 64 2c 20 32 30 29 3b 0a 20 20 20 20 20 20 20 20  d, 20);.        
1a1d0 4d 44 35 53 54 45 50 28 46 32 2c 20 61 2c 20 62  MD5STEP(F2, a, b
1a1e0 2c 20 63 2c 20 64 2c 20 69 6e 5b 31 33 5d 2b 30  , c, d, in[13]+0
1a1f0 78 61 39 65 33 65 39 30 35 2c 20 20 35 29 3b 0a  xa9e3e905,  5);.
1a200 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
1a210 46 32 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20  F2, d, a, b, c, 
1a220 69 6e 5b 20 32 5d 2b 30 78 66 63 65 66 61 33 66  in[ 2]+0xfcefa3f
1a230 38 2c 20 20 39 29 3b 0a 20 20 20 20 20 20 20 20  8,  9);.        
1a240 4d 44 35 53 54 45 50 28 46 32 2c 20 63 2c 20 64  MD5STEP(F2, c, d
1a250 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 37 5d 2b 30  , a, b, in[ 7]+0
1a260 78 36 37 36 66 30 32 64 39 2c 20 31 34 29 3b 0a  x676f02d9, 14);.
1a270 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
1a280 46 32 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20  F2, b, c, d, a, 
1a290 69 6e 5b 31 32 5d 2b 30 78 38 64 32 61 34 63 38  in[12]+0x8d2a4c8
1a2a0 61 2c 20 32 30 29 3b 0a 0a 20 20 20 20 20 20 20  a, 20);..       
1a2b0 20 4d 44 35 53 54 45 50 28 46 33 2c 20 61 2c 20   MD5STEP(F3, a, 
1a2c0 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 35 5d 2b  b, c, d, in[ 5]+
1a2d0 30 78 66 66 66 61 33 39 34 32 2c 20 20 34 29 3b  0xfffa3942,  4);
1a2e0 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1a2f0 28 46 33 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c  (F3, d, a, b, c,
1a300 20 69 6e 5b 20 38 5d 2b 30 78 38 37 37 31 66 36   in[ 8]+0x8771f6
1a310 38 31 2c 20 31 31 29 3b 0a 20 20 20 20 20 20 20  81, 11);.       
1a320 20 4d 44 35 53 54 45 50 28 46 33 2c 20 63 2c 20   MD5STEP(F3, c, 
1a330 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 31 5d 2b  d, a, b, in[11]+
1a340 30 78 36 64 39 64 36 31 32 32 2c 20 31 36 29 3b  0x6d9d6122, 16);
1a350 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1a360 28 46 33 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c  (F3, b, c, d, a,
1a370 20 69 6e 5b 31 34 5d 2b 30 78 66 64 65 35 33 38   in[14]+0xfde538
1a380 30 63 2c 20 32 33 29 3b 0a 20 20 20 20 20 20 20  0c, 23);.       
1a390 20 4d 44 35 53 54 45 50 28 46 33 2c 20 61 2c 20   MD5STEP(F3, a, 
1a3a0 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 31 5d 2b  b, c, d, in[ 1]+
1a3b0 30 78 61 34 62 65 65 61 34 34 2c 20 20 34 29 3b  0xa4beea44,  4);
1a3c0 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1a3d0 28 46 33 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c  (F3, d, a, b, c,
1a3e0 20 69 6e 5b 20 34 5d 2b 30 78 34 62 64 65 63 66   in[ 4]+0x4bdecf
1a3f0 61 39 2c 20 31 31 29 3b 0a 20 20 20 20 20 20 20  a9, 11);.       
1a400 20 4d 44 35 53 54 45 50 28 46 33 2c 20 63 2c 20   MD5STEP(F3, c, 
1a410 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 37 5d 2b  d, a, b, in[ 7]+
1a420 30 78 66 36 62 62 34 62 36 30 2c 20 31 36 29 3b  0xf6bb4b60, 16);
1a430 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1a440 28 46 33 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c  (F3, b, c, d, a,
1a450 20 69 6e 5b 31 30 5d 2b 30 78 62 65 62 66 62 63   in[10]+0xbebfbc
1a460 37 30 2c 20 32 33 29 3b 0a 20 20 20 20 20 20 20  70, 23);.       
1a470 20 4d 44 35 53 54 45 50 28 46 33 2c 20 61 2c 20   MD5STEP(F3, a, 
1a480 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 31 33 5d 2b  b, c, d, in[13]+
1a490 30 78 32 38 39 62 37 65 63 36 2c 20 20 34 29 3b  0x289b7ec6,  4);
1a4a0 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1a4b0 28 46 33 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c  (F3, d, a, b, c,
1a4c0 20 69 6e 5b 20 30 5d 2b 30 78 65 61 61 31 32 37   in[ 0]+0xeaa127
1a4d0 66 61 2c 20 31 31 29 3b 0a 20 20 20 20 20 20 20  fa, 11);.       
1a4e0 20 4d 44 35 53 54 45 50 28 46 33 2c 20 63 2c 20   MD5STEP(F3, c, 
1a4f0 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 33 5d 2b  d, a, b, in[ 3]+
1a500 30 78 64 34 65 66 33 30 38 35 2c 20 31 36 29 3b  0xd4ef3085, 16);
1a510 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1a520 28 46 33 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c  (F3, b, c, d, a,
1a530 20 69 6e 5b 20 36 5d 2b 30 78 30 34 38 38 31 64   in[ 6]+0x04881d
1a540 30 35 2c 20 32 33 29 3b 0a 20 20 20 20 20 20 20  05, 23);.       
1a550 20 4d 44 35 53 54 45 50 28 46 33 2c 20 61 2c 20   MD5STEP(F3, a, 
1a560 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 39 5d 2b  b, c, d, in[ 9]+
1a570 30 78 64 39 64 34 64 30 33 39 2c 20 20 34 29 3b  0xd9d4d039,  4);
1a580 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1a590 28 46 33 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c  (F3, d, a, b, c,
1a5a0 20 69 6e 5b 31 32 5d 2b 30 78 65 36 64 62 39 39   in[12]+0xe6db99
1a5b0 65 35 2c 20 31 31 29 3b 0a 20 20 20 20 20 20 20  e5, 11);.       
1a5c0 20 4d 44 35 53 54 45 50 28 46 33 2c 20 63 2c 20   MD5STEP(F3, c, 
1a5d0 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 35 5d 2b  d, a, b, in[15]+
1a5e0 30 78 31 66 61 32 37 63 66 38 2c 20 31 36 29 3b  0x1fa27cf8, 16);
1a5f0 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1a600 28 46 33 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c  (F3, b, c, d, a,
1a610 20 69 6e 5b 20 32 5d 2b 30 78 63 34 61 63 35 36   in[ 2]+0xc4ac56
1a620 36 35 2c 20 32 33 29 3b 0a 0a 20 20 20 20 20 20  65, 23);..      
1a630 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 61 2c    MD5STEP(F4, a,
1a640 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 30 5d   b, c, d, in[ 0]
1a650 2b 30 78 66 34 32 39 32 32 34 34 2c 20 20 36 29  +0xf4292244,  6)
1a660 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
1a670 50 28 46 34 2c 20 64 2c 20 61 2c 20 62 2c 20 63  P(F4, d, a, b, c
1a680 2c 20 69 6e 5b 20 37 5d 2b 30 78 34 33 32 61 66  , in[ 7]+0x432af
1a690 66 39 37 2c 20 31 30 29 3b 0a 20 20 20 20 20 20  f97, 10);.      
1a6a0 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 63 2c    MD5STEP(F4, c,
1a6b0 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 34 5d   d, a, b, in[14]
1a6c0 2b 30 78 61 62 39 34 32 33 61 37 2c 20 31 35 29  +0xab9423a7, 15)
1a6d0 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
1a6e0 50 28 46 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61  P(F4, b, c, d, a
1a6f0 2c 20 69 6e 5b 20 35 5d 2b 30 78 66 63 39 33 61  , in[ 5]+0xfc93a
1a700 30 33 39 2c 20 32 31 29 3b 0a 20 20 20 20 20 20  039, 21);.      
1a710 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 61 2c    MD5STEP(F4, a,
1a720 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 31 32 5d   b, c, d, in[12]
1a730 2b 30 78 36 35 35 62 35 39 63 33 2c 20 20 36 29  +0x655b59c3,  6)
1a740 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
1a750 50 28 46 34 2c 20 64 2c 20 61 2c 20 62 2c 20 63  P(F4, d, a, b, c
1a760 2c 20 69 6e 5b 20 33 5d 2b 30 78 38 66 30 63 63  , in[ 3]+0x8f0cc
1a770 63 39 32 2c 20 31 30 29 3b 0a 20 20 20 20 20 20  c92, 10);.      
1a780 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 63 2c    MD5STEP(F4, c,
1a790 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 30 5d   d, a, b, in[10]
1a7a0 2b 30 78 66 66 65 66 66 34 37 64 2c 20 31 35 29  +0xffeff47d, 15)
1a7b0 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
1a7c0 50 28 46 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61  P(F4, b, c, d, a
1a7d0 2c 20 69 6e 5b 20 31 5d 2b 30 78 38 35 38 34 35  , in[ 1]+0x85845
1a7e0 64 64 31 2c 20 32 31 29 3b 0a 20 20 20 20 20 20  dd1, 21);.      
1a7f0 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 61 2c    MD5STEP(F4, a,
1a800 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 38 5d   b, c, d, in[ 8]
1a810 2b 30 78 36 66 61 38 37 65 34 66 2c 20 20 36 29  +0x6fa87e4f,  6)
1a820 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
1a830 50 28 46 34 2c 20 64 2c 20 61 2c 20 62 2c 20 63  P(F4, d, a, b, c
1a840 2c 20 69 6e 5b 31 35 5d 2b 30 78 66 65 32 63 65  , in[15]+0xfe2ce
1a850 36 65 30 2c 20 31 30 29 3b 0a 20 20 20 20 20 20  6e0, 10);.      
1a860 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 63 2c    MD5STEP(F4, c,
1a870 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 36 5d   d, a, b, in[ 6]
1a880 2b 30 78 61 33 30 31 34 33 31 34 2c 20 31 35 29  +0xa3014314, 15)
1a890 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
1a8a0 50 28 46 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61  P(F4, b, c, d, a
1a8b0 2c 20 69 6e 5b 31 33 5d 2b 30 78 34 65 30 38 31  , in[13]+0x4e081
1a8c0 31 61 31 2c 20 32 31 29 3b 0a 20 20 20 20 20 20  1a1, 21);.      
1a8d0 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 61 2c    MD5STEP(F4, a,
1a8e0 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 34 5d   b, c, d, in[ 4]
1a8f0 2b 30 78 66 37 35 33 37 65 38 32 2c 20 20 36 29  +0xf7537e82,  6)
1a900 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
1a910 50 28 46 34 2c 20 64 2c 20 61 2c 20 62 2c 20 63  P(F4, d, a, b, c
1a920 2c 20 69 6e 5b 31 31 5d 2b 30 78 62 64 33 61 66  , in[11]+0xbd3af
1a930 32 33 35 2c 20 31 30 29 3b 0a 20 20 20 20 20 20  235, 10);.      
1a940 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 63 2c    MD5STEP(F4, c,
1a950 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 32 5d   d, a, b, in[ 2]
1a960 2b 30 78 32 61 64 37 64 32 62 62 2c 20 31 35 29  +0x2ad7d2bb, 15)
1a970 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
1a980 50 28 46 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61  P(F4, b, c, d, a
1a990 2c 20 69 6e 5b 20 39 5d 2b 30 78 65 62 38 36 64  , in[ 9]+0xeb86d
1a9a0 33 39 31 2c 20 32 31 29 3b 0a 0a 20 20 20 20 20  391, 21);..     
1a9b0 20 20 20 62 75 66 5b 30 5d 20 2b 3d 20 61 3b 0a     buf[0] += a;.
1a9c0 20 20 20 20 20 20 20 20 62 75 66 5b 31 5d 20 2b          buf[1] +
1a9d0 3d 20 62 3b 0a 20 20 20 20 20 20 20 20 62 75 66  = b;.        buf
1a9e0 5b 32 5d 20 2b 3d 20 63 3b 0a 20 20 20 20 20 20  [2] += c;.      
1a9f0 20 20 62 75 66 5b 33 5d 20 2b 3d 20 64 3b 0a 7d    buf[3] += d;.}
1aa00 0a 0a 2f 2a 0a 20 2a 20 53 74 61 72 74 20 4d 44  ../*. * Start MD
1aa10 35 20 61 63 63 75 6d 75 6c 61 74 69 6f 6e 2e 20  5 accumulation. 
1aa20 20 53 65 74 20 62 69 74 20 63 6f 75 6e 74 20 74   Set bit count t
1aa30 6f 20 30 20 61 6e 64 20 62 75 66 66 65 72 20 74  o 0 and buffer t
1aa40 6f 20 6d 79 73 74 65 72 69 6f 75 73 0a 20 2a 20  o mysterious. * 
1aa50 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 63  initialization c
1aa60 6f 6e 73 74 61 6e 74 73 2e 0a 20 2a 2f 0a 73 74  onstants.. */.st
1aa70 61 74 69 63 20 76 6f 69 64 20 4d 44 35 49 6e 69  atic void MD5Ini
1aa80 74 28 4d 44 35 43 6f 6e 74 65 78 74 20 2a 63 74  t(MD5Context *ct
1aa90 78 29 7b 0a 20 20 20 20 20 20 20 20 63 74 78 2d  x){.        ctx-
1aaa0 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20  >isInit = 1;.   
1aab0 20 20 20 20 20 63 74 78 2d 3e 62 75 66 5b 30 5d       ctx->buf[0]
1aac0 20 3d 20 30 78 36 37 34 35 32 33 30 31 3b 0a 20   = 0x67452301;. 
1aad0 20 20 20 20 20 20 20 63 74 78 2d 3e 62 75 66 5b         ctx->buf[
1aae0 31 5d 20 3d 20 30 78 65 66 63 64 61 62 38 39 3b  1] = 0xefcdab89;
1aaf0 0a 20 20 20 20 20 20 20 20 63 74 78 2d 3e 62 75  .        ctx->bu
1ab00 66 5b 32 5d 20 3d 20 30 78 39 38 62 61 64 63 66  f[2] = 0x98badcf
1ab10 65 3b 0a 20 20 20 20 20 20 20 20 63 74 78 2d 3e  e;.        ctx->
1ab20 62 75 66 5b 33 5d 20 3d 20 30 78 31 30 33 32 35  buf[3] = 0x10325
1ab30 34 37 36 3b 0a 20 20 20 20 20 20 20 20 63 74 78  476;.        ctx
1ab40 2d 3e 62 69 74 73 5b 30 5d 20 3d 20 30 3b 0a 20  ->bits[0] = 0;. 
1ab50 20 20 20 20 20 20 20 63 74 78 2d 3e 62 69 74 73         ctx->bits
1ab60 5b 31 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20  [1] = 0;.}../*. 
1ab70 2a 20 55 70 64 61 74 65 20 63 6f 6e 74 65 78 74  * Update context
1ab80 20 74 6f 20 72 65 66 6c 65 63 74 20 74 68 65 20   to reflect the 
1ab90 63 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 20 6f 66  concatenation of
1aba0 20 61 6e 6f 74 68 65 72 20 62 75 66 66 65 72 20   another buffer 
1abb0 66 75 6c 6c 0a 20 2a 20 6f 66 20 62 79 74 65 73  full. * of bytes
1abc0 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 0a 76 6f  .. */.static .vo
1abd0 69 64 20 4d 44 35 55 70 64 61 74 65 28 4d 44 35  id MD5Update(MD5
1abe0 43 6f 6e 74 65 78 74 20 2a 63 74 78 2c 20 63 6f  Context *ctx, co
1abf0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1ac00 72 20 2a 62 75 66 2c 20 75 6e 73 69 67 6e 65 64  r *buf, unsigned
1ac10 20 69 6e 74 20 6c 65 6e 29 7b 0a 20 20 20 20 20   int len){.     
1ac20 20 20 20 75 69 6e 74 33 32 20 74 3b 0a 0a 20 20     uint32 t;..  
1ac30 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20        /* Update 
1ac40 62 69 74 63 6f 75 6e 74 20 2a 2f 0a 0a 20 20 20  bitcount */..   
1ac50 20 20 20 20 20 74 20 3d 20 63 74 78 2d 3e 62 69       t = ctx->bi
1ac60 74 73 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69  ts[0];.        i
1ac70 66 20 28 28 63 74 78 2d 3e 62 69 74 73 5b 30 5d  f ((ctx->bits[0]
1ac80 20 3d 20 74 20 2b 20 28 28 75 69 6e 74 33 32 29   = t + ((uint32)
1ac90 6c 65 6e 20 3c 3c 20 33 29 29 20 3c 20 74 29 0a  len << 3)) < t).
1aca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1acb0 63 74 78 2d 3e 62 69 74 73 5b 31 5d 2b 2b 3b 20  ctx->bits[1]++; 
1acc0 2f 2a 20 43 61 72 72 79 20 66 72 6f 6d 20 6c 6f  /* Carry from lo
1acd0 77 20 74 6f 20 68 69 67 68 20 2a 2f 0a 20 20 20  w to high */.   
1ace0 20 20 20 20 20 63 74 78 2d 3e 62 69 74 73 5b 31       ctx->bits[1
1acf0 5d 20 2b 3d 20 6c 65 6e 20 3e 3e 20 32 39 3b 0a  ] += len >> 29;.
1ad00 0a 20 20 20 20 20 20 20 20 74 20 3d 20 28 74 20  .        t = (t 
1ad10 3e 3e 20 33 29 20 26 20 30 78 33 66 3b 20 20 20  >> 3) & 0x3f;   
1ad20 20 2f 2a 20 42 79 74 65 73 20 61 6c 72 65 61 64   /* Bytes alread
1ad30 79 20 69 6e 20 73 68 73 49 6e 66 6f 2d 3e 64 61  y in shsInfo->da
1ad40 74 61 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f  ta */..        /
1ad50 2a 20 48 61 6e 64 6c 65 20 61 6e 79 20 6c 65 61  * Handle any lea
1ad60 64 69 6e 67 20 6f 64 64 2d 73 69 7a 65 64 20 63  ding odd-sized c
1ad70 68 75 6e 6b 73 20 2a 2f 0a 0a 20 20 20 20 20 20  hunks */..      
1ad80 20 20 69 66 20 28 20 74 20 29 20 7b 0a 20 20 20    if ( t ) {.   
1ad90 20 20 20 20 20 20 20 20 20 20 20 20 20 75 6e 73               uns
1ada0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 20 3d 20  igned char *p = 
1adb0 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
1adc0 29 63 74 78 2d 3e 69 6e 20 2b 20 74 3b 0a 0a 20  )ctx->in + t;.. 
1add0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
1ade0 20 3d 20 36 34 2d 74 3b 0a 20 20 20 20 20 20 20   = 64-t;.       
1adf0 20 20 20 20 20 20 20 20 20 69 66 20 28 6c 65 6e           if (len
1ae00 20 3c 20 74 29 20 7b 0a 20 20 20 20 20 20 20 20   < t) {.        
1ae10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae20 6d 65 6d 63 70 79 28 70 2c 20 62 75 66 2c 20 6c  memcpy(p, buf, l
1ae30 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  en);.           
1ae40 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
1ae50 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  urn;.           
1ae60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1ae70 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 2c         memcpy(p,
1ae80 20 62 75 66 2c 20 74 29 3b 0a 20 20 20 20 20 20   buf, t);.      
1ae90 20 20 20 20 20 20 20 20 20 20 62 79 74 65 52 65            byteRe
1aea0 76 65 72 73 65 28 63 74 78 2d 3e 69 6e 2c 20 31  verse(ctx->in, 1
1aeb0 36 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  6);.            
1aec0 20 20 20 20 4d 44 35 54 72 61 6e 73 66 6f 72 6d      MD5Transform
1aed0 28 63 74 78 2d 3e 62 75 66 2c 20 28 75 69 6e 74  (ctx->buf, (uint
1aee0 33 32 20 2a 29 63 74 78 2d 3e 69 6e 29 3b 0a 20  32 *)ctx->in);. 
1aef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
1af00 75 66 20 2b 3d 20 74 3b 0a 20 20 20 20 20 20 20  uf += t;.       
1af10 20 20 20 20 20 20 20 20 20 6c 65 6e 20 2d 3d 20           len -= 
1af20 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  t;.        }..  
1af30 20 20 20 20 20 20 2f 2a 20 50 72 6f 63 65 73 73        /* Process
1af40 20 64 61 74 61 20 69 6e 20 36 34 2d 62 79 74 65   data in 64-byte
1af50 20 63 68 75 6e 6b 73 20 2a 2f 0a 0a 20 20 20 20   chunks */..    
1af60 20 20 20 20 77 68 69 6c 65 20 28 6c 65 6e 20 3e      while (len >
1af70 3d 20 36 34 29 20 7b 0a 20 20 20 20 20 20 20 20  = 64) {.        
1af80 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 63          memcpy(c
1af90 74 78 2d 3e 69 6e 2c 20 62 75 66 2c 20 36 34 29  tx->in, buf, 64)
1afa0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1afb0 20 20 62 79 74 65 52 65 76 65 72 73 65 28 63 74    byteReverse(ct
1afc0 78 2d 3e 69 6e 2c 20 31 36 29 3b 0a 20 20 20 20  x->in, 16);.    
1afd0 20 20 20 20 20 20 20 20 20 20 20 20 4d 44 35 54              MD5T
1afe0 72 61 6e 73 66 6f 72 6d 28 63 74 78 2d 3e 62 75  ransform(ctx->bu
1aff0 66 2c 20 28 75 69 6e 74 33 32 20 2a 29 63 74 78  f, (uint32 *)ctx
1b000 2d 3e 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  ->in);.         
1b010 20 20 20 20 20 20 20 62 75 66 20 2b 3d 20 36 34         buf += 64
1b020 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1b030 20 20 6c 65 6e 20 2d 3d 20 36 34 3b 0a 20 20 20    len -= 64;.   
1b040 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
1b050 2f 2a 20 48 61 6e 64 6c 65 20 61 6e 79 20 72 65  /* Handle any re
1b060 6d 61 69 6e 69 6e 67 20 62 79 74 65 73 20 6f 66  maining bytes of
1b070 20 64 61 74 61 2e 20 2a 2f 0a 0a 20 20 20 20 20   data. */..     
1b080 20 20 20 6d 65 6d 63 70 79 28 63 74 78 2d 3e 69     memcpy(ctx->i
1b090 6e 2c 20 62 75 66 2c 20 6c 65 6e 29 3b 0a 7d 0a  n, buf, len);.}.
1b0a0 0a 2f 2a 0a 20 2a 20 46 69 6e 61 6c 20 77 72 61  ./*. * Final wra
1b0b0 70 75 70 20 2d 20 70 61 64 20 74 6f 20 36 34 2d  pup - pad to 64-
1b0c0 62 79 74 65 20 62 6f 75 6e 64 61 72 79 20 77 69  byte boundary wi
1b0d0 74 68 20 74 68 65 20 62 69 74 20 70 61 74 74 65  th the bit patte
1b0e0 72 6e 20 0a 20 2a 20 31 20 30 2a 20 28 36 34 2d  rn . * 1 0* (64-
1b0f0 62 69 74 20 63 6f 75 6e 74 20 6f 66 20 62 69 74  bit count of bit
1b100 73 20 70 72 6f 63 65 73 73 65 64 2c 20 4d 53 42  s processed, MSB
1b110 2d 66 69 72 73 74 29 0a 20 2a 2f 0a 73 74 61 74  -first). */.stat
1b120 69 63 20 76 6f 69 64 20 4d 44 35 46 69 6e 61 6c  ic void MD5Final
1b130 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64  (unsigned char d
1b140 69 67 65 73 74 5b 31 36 5d 2c 20 4d 44 35 43 6f  igest[16], MD5Co
1b150 6e 74 65 78 74 20 2a 63 74 78 29 7b 0a 20 20 20  ntext *ctx){.   
1b160 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 6f       unsigned co
1b170 75 6e 74 3b 0a 20 20 20 20 20 20 20 20 75 6e 73  unt;.        uns
1b180 69 67 6e 65 64 20 63 68 61 72 20 2a 70 3b 0a 0a  igned char *p;..
1b190 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 75          /* Compu
1b1a0 74 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  te number of byt
1b1b0 65 73 20 6d 6f 64 20 36 34 20 2a 2f 0a 20 20 20  es mod 64 */.   
1b1c0 20 20 20 20 20 63 6f 75 6e 74 20 3d 20 28 63 74       count = (ct
1b1d0 78 2d 3e 62 69 74 73 5b 30 5d 20 3e 3e 20 33 29  x->bits[0] >> 3)
1b1e0 20 26 20 30 78 33 46 3b 0a 0a 20 20 20 20 20 20   & 0x3F;..      
1b1f0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 66 69 72    /* Set the fir
1b200 73 74 20 63 68 61 72 20 6f 66 20 70 61 64 64 69  st char of paddi
1b210 6e 67 20 74 6f 20 30 78 38 30 2e 20 20 54 68 69  ng to 0x80.  Thi
1b220 73 20 69 73 20 73 61 66 65 20 73 69 6e 63 65 20  s is safe since 
1b230 74 68 65 72 65 20 69 73 0a 20 20 20 20 20 20 20  there is.       
1b240 20 20 20 20 61 6c 77 61 79 73 20 61 74 20 6c 65      always at le
1b250 61 73 74 20 6f 6e 65 20 62 79 74 65 20 66 72 65  ast one byte fre
1b260 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 20 3d  e */.        p =
1b270 20 63 74 78 2d 3e 69 6e 20 2b 20 63 6f 75 6e 74   ctx->in + count
1b280 3b 0a 20 20 20 20 20 20 20 20 2a 70 2b 2b 20 3d  ;.        *p++ =
1b290 20 30 78 38 30 3b 0a 0a 20 20 20 20 20 20 20 20   0x80;..        
1b2a0 2f 2a 20 42 79 74 65 73 20 6f 66 20 70 61 64 64  /* Bytes of padd
1b2b0 69 6e 67 20 6e 65 65 64 65 64 20 74 6f 20 6d 61  ing needed to ma
1b2c0 6b 65 20 36 34 20 62 79 74 65 73 20 2a 2f 0a 20  ke 64 bytes */. 
1b2d0 20 20 20 20 20 20 20 63 6f 75 6e 74 20 3d 20 36         count = 6
1b2e0 34 20 2d 20 31 20 2d 20 63 6f 75 6e 74 3b 0a 0a  4 - 1 - count;..
1b2f0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 64 20 6f          /* Pad o
1b300 75 74 20 74 6f 20 35 36 20 6d 6f 64 20 36 34 20  ut to 56 mod 64 
1b310 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 20 28 63  */.        if (c
1b320 6f 75 6e 74 20 3c 20 38 29 20 7b 0a 20 20 20 20  ount < 8) {.    
1b330 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1b340 77 6f 20 6c 6f 74 73 20 6f 66 20 70 61 64 64 69  wo lots of paddi
1b350 6e 67 3a 20 20 50 61 64 20 74 68 65 20 66 69 72  ng:  Pad the fir
1b360 73 74 20 62 6c 6f 63 6b 20 74 6f 20 36 34 20 62  st block to 64 b
1b370 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ytes */.        
1b380 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70          memset(p
1b390 2c 20 30 2c 20 63 6f 75 6e 74 29 3b 0a 20 20 20  , 0, count);.   
1b3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 62 79 74               byt
1b3b0 65 52 65 76 65 72 73 65 28 63 74 78 2d 3e 69 6e  eReverse(ctx->in
1b3c0 2c 20 31 36 29 3b 0a 20 20 20 20 20 20 20 20 20  , 16);.         
1b3d0 20 20 20 20 20 20 20 4d 44 35 54 72 61 6e 73 66         MD5Transf
1b3e0 6f 72 6d 28 63 74 78 2d 3e 62 75 66 2c 20 28 75  orm(ctx->buf, (u
1b3f0 69 6e 74 33 32 20 2a 29 63 74 78 2d 3e 69 6e 29  int32 *)ctx->in)
1b400 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
1b410 20 20 20 2f 2a 20 4e 6f 77 20 66 69 6c 6c 20 74     /* Now fill t
1b420 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 77 69  he next block wi
1b430 74 68 20 35 36 20 62 79 74 65 73 20 2a 2f 0a 20  th 56 bytes */. 
1b440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
1b450 65 6d 73 65 74 28 63 74 78 2d 3e 69 6e 2c 20 30  emset(ctx->in, 0
1b460 2c 20 35 36 29 3b 0a 20 20 20 20 20 20 20 20 7d  , 56);.        }
1b470 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
1b480 20 20 20 20 20 20 20 20 2f 2a 20 50 61 64 20 62          /* Pad b
1b490 6c 6f 63 6b 20 74 6f 20 35 36 20 62 79 74 65 73  lock to 56 bytes
1b4a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
1b4b0 20 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c      memset(p, 0,
1b4c0 20 63 6f 75 6e 74 2d 38 29 3b 0a 20 20 20 20 20   count-8);.     
1b4d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 79 74     }.        byt
1b4e0 65 52 65 76 65 72 73 65 28 63 74 78 2d 3e 69 6e  eReverse(ctx->in
1b4f0 2c 20 31 34 29 3b 0a 0a 20 20 20 20 20 20 20 20  , 14);..        
1b500 2f 2a 20 41 70 70 65 6e 64 20 6c 65 6e 67 74 68  /* Append length
1b510 20 69 6e 20 62 69 74 73 20 61 6e 64 20 74 72 61   in bits and tra
1b520 6e 73 66 6f 72 6d 20 2a 2f 0a 20 20 20 20 20 20  nsform */.      
1b530 20 20 6d 65 6d 63 70 79 28 63 74 78 2d 3e 69 6e    memcpy(ctx->in
1b540 20 2b 20 31 34 2a 34 2c 20 63 74 78 2d 3e 62 69   + 14*4, ctx->bi
1b550 74 73 2c 20 38 29 3b 0a 0a 20 20 20 20 20 20 20  ts, 8);..       
1b560 20 4d 44 35 54 72 61 6e 73 66 6f 72 6d 28 63 74   MD5Transform(ct
1b570 78 2d 3e 62 75 66 2c 20 28 75 69 6e 74 33 32 20  x->buf, (uint32 
1b580 2a 29 63 74 78 2d 3e 69 6e 29 3b 0a 20 20 20 20  *)ctx->in);.    
1b590 20 20 20 20 62 79 74 65 52 65 76 65 72 73 65 28      byteReverse(
1b5a0 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
1b5b0 29 63 74 78 2d 3e 62 75 66 2c 20 34 29 3b 0a 20  )ctx->buf, 4);. 
1b5c0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 64 69         memcpy(di
1b5d0 67 65 73 74 2c 20 63 74 78 2d 3e 62 75 66 2c 20  gest, ctx->buf, 
1b5e0 31 36 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  16);.}../*.** Co
1b5f0 6e 76 65 72 74 20 61 20 31 32 38 2d 62 69 74 20  nvert a 128-bit 
1b600 4d 44 35 20 64 69 67 65 73 74 20 69 6e 74 6f 20  MD5 digest into 
1b610 61 20 33 32 2d 64 69 67 69 74 20 62 61 73 65 2d  a 32-digit base-
1b620 31 36 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74  16 number..*/.st
1b630 61 74 69 63 20 76 6f 69 64 20 4d 44 35 44 69 67  atic void MD5Dig
1b640 65 73 74 54 6f 42 61 73 65 31 36 28 75 6e 73 69  estToBase16(unsi
1b650 67 6e 65 64 20 63 68 61 72 20 2a 64 69 67 65 73  gned char *diges
1b660 74 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  t, char *zBuf){.
1b670 20 20 73 74 61 74 69 63 20 63 68 61 72 20 63 6f    static char co
1b680 6e 73 74 20 7a 45 6e 63 6f 64 65 5b 5d 20 3d 20  nst zEncode[] = 
1b690 22 30 31 32 33 34 35 36 37 38 39 61 62 63 64 65  "0123456789abcde
1b6a0 66 22 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  f";.  int i, j;.
1b6b0 0a 20 20 66 6f 72 28 6a 3d 69 3d 30 3b 20 69 3c  .  for(j=i=0; i<
1b6c0 31 36 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  16; i++){.    in
1b6d0 74 20 61 20 3d 20 64 69 67 65 73 74 5b 69 5d 3b  t a = digest[i];
1b6e0 0a 20 20 20 20 7a 42 75 66 5b 6a 2b 2b 5d 20 3d  .    zBuf[j++] =
1b6f0 20 7a 45 6e 63 6f 64 65 5b 28 61 3e 3e 34 29 26   zEncode[(a>>4)&
1b700 30 78 66 5d 3b 0a 20 20 20 20 7a 42 75 66 5b 6a  0xf];.    zBuf[j
1b710 2b 2b 5d 20 3d 20 7a 45 6e 63 6f 64 65 5b 61 20  ++] = zEncode[a 
1b720 26 20 30 78 66 5d 3b 0a 20 20 7d 0a 20 20 7a 42  & 0xf];.  }.  zB
1b730 75 66 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f  uf[j] = 0;.}.../
1b740 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 31  *.** Convert a 1
1b750 32 38 2d 62 69 74 20 4d 44 35 20 64 69 67 65 73  28-bit MD5 diges
1b760 74 20 69 6e 74 6f 20 73 65 71 75 65 6e 63 79 20  t into sequency 
1b770 6f 66 20 65 69 67 68 74 20 35 2d 64 69 67 69 74  of eight 5-digit
1b780 20 69 6e 74 65 67 65 72 73 0a 2a 2a 20 65 61 63   integers.** eac
1b790 68 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 31  h representing 1
1b7a0 36 20 62 69 74 73 20 6f 66 20 74 68 65 20 64 69  6 bits of the di
1b7b0 67 65 73 74 20 61 6e 64 20 73 65 70 61 72 61 74  gest and separat
1b7c0 65 64 20 66 72 6f 6d 20 65 61 63 68 0a 2a 2a 20  ed from each.** 
1b7d0 6f 74 68 65 72 20 62 79 20 61 20 22 2d 22 20 63  other by a "-" c
1b7e0 68 61 72 61 63 74 65 72 2e 0a 2a 2f 0a 73 74 61  haracter..*/.sta
1b7f0 74 69 63 20 76 6f 69 64 20 4d 44 35 44 69 67 65  tic void MD5Dige
1b800 73 74 54 6f 42 61 73 65 31 30 78 38 28 75 6e 73  stToBase10x8(uns
1b810 69 67 6e 65 64 20 63 68 61 72 20 64 69 67 65 73  igned char diges
1b820 74 5b 31 36 5d 2c 20 63 68 61 72 20 7a 44 69 67  t[16], char zDig
1b830 65 73 74 5b 35 30 5d 29 7b 0a 20 20 69 6e 74 20  est[50]){.  int 
1b840 69 2c 20 6a 3b 0a 20 20 75 6e 73 69 67 6e 65 64  i, j;.  unsigned
1b850 20 69 6e 74 20 78 3b 0a 20 20 66 6f 72 28 69 3d   int x;.  for(i=
1b860 6a 3d 30 3b 20 69 3c 31 36 3b 20 69 2b 3d 32 29  j=0; i<16; i+=2)
1b870 7b 0a 20 20 20 20 78 20 3d 20 64 69 67 65 73 74  {.    x = digest
1b880 5b 69 5d 2a 32 35 36 20 2b 20 64 69 67 65 73 74  [i]*256 + digest
1b890 5b 69 2b 31 5d 3b 0a 20 20 20 20 69 66 28 20 69  [i+1];.    if( i
1b8a0 3e 30 20 29 20 7a 44 69 67 65 73 74 5b 6a 2b 2b  >0 ) zDigest[j++
1b8b0 5d 20 3d 20 27 2d 27 3b 0a 20 20 20 20 73 71 6c  ] = '-';.    sql
1b8c0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 35 30  ite3_snprintf(50
1b8d0 2d 6a 2c 20 26 7a 44 69 67 65 73 74 5b 6a 5d 2c  -j, &zDigest[j],
1b8e0 20 22 25 30 35 75 22 2c 20 78 29 3b 0a 20 20 20   "%05u", x);.   
1b8f0 20 6a 20 2b 3d 20 35 3b 0a 20 20 7d 0a 20 20 7a   j += 5;.  }.  z
1b900 44 69 67 65 73 74 5b 6a 5d 20 3d 20 30 3b 0a 7d  Digest[j] = 0;.}
1b910 0a 0a 2f 2a 0a 2a 2a 20 41 20 54 43 4c 20 63 6f  ../*.** A TCL co
1b920 6d 6d 61 6e 64 20 66 6f 72 20 6d 64 35 2e 20 20  mmand for md5.  
1b930 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  The argument is 
1b940 74 68 65 20 74 65 78 74 20 74 6f 20 62 65 20 68  the text to be h
1b950 61 73 68 65 64 2e 20 20 54 68 65 0a 2a 2a 20 52  ashed.  The.** R
1b960 65 73 75 6c 74 20 69 73 20 74 68 65 20 68 61 73  esult is the has
1b970 68 20 69 6e 20 62 61 73 65 36 34 2e 20 20 0a 2a  h in base64.  .*
1b980 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 64 35  /.static int md5
1b990 5f 63 6d 64 28 76 6f 69 64 2a 63 64 2c 20 54 63  _cmd(void*cd, Tc
1b9a0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1b9b0 2c 20 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73  , int argc, cons
1b9c0 74 20 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a  t char **argv){.
1b9d0 20 20 4d 44 35 43 6f 6e 74 65 78 74 20 63 74 78    MD5Context ctx
1b9e0 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
1b9f0 72 20 64 69 67 65 73 74 5b 31 36 5d 3b 0a 20 20  r digest[16];.  
1ba00 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20  char zBuf[50];. 
1ba10 20 76 6f 69 64 20 28 2a 63 6f 6e 76 65 72 74 65   void (*converte
1ba20 72 29 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  r)(unsigned char
1ba30 2a 2c 20 63 68 61 72 2a 29 3b 0a 0a 20 20 69 66  *, char*);..  if
1ba40 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20  ( argc!=2 ){.   
1ba50 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1ba60 74 28 69 6e 74 65 72 70 2c 22 77 72 6f 6e 67 20  t(interp,"wrong 
1ba70 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1ba80 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20  e \"", argv[0], 
1ba90 0a 20 20 20 20 20 20 20 20 22 20 54 45 58 54 5c  .        " TEXT\
1baa0 22 22 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  "", (char*)0);. 
1bab0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1bac0 52 4f 52 3b 0a 20 20 7d 0a 20 20 4d 44 35 49 6e  ROR;.  }.  MD5In
1bad0 69 74 28 26 63 74 78 29 3b 0a 20 20 4d 44 35 55  it(&ctx);.  MD5U
1bae0 70 64 61 74 65 28 26 63 74 78 2c 20 28 75 6e 73  pdate(&ctx, (uns
1baf0 69 67 6e 65 64 20 63 68 61 72 2a 29 61 72 67 76  igned char*)argv
1bb00 5b 31 5d 2c 20 28 75 6e 73 69 67 6e 65 64 29 73  [1], (unsigned)s
1bb10 74 72 6c 65 6e 28 61 72 67 76 5b 31 5d 29 29 3b  trlen(argv[1]));
1bb20 0a 20 20 4d 44 35 46 69 6e 61 6c 28 64 69 67 65  .  MD5Final(dige
1bb30 73 74 2c 20 26 63 74 78 29 3b 0a 20 20 63 6f 6e  st, &ctx);.  con
1bb40 76 65 72 74 65 72 20 3d 20 28 76 6f 69 64 28 2a  verter = (void(*
1bb50 29 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a  )(unsigned char*
1bb60 2c 63 68 61 72 2a 29 29 63 64 3b 0a 20 20 63 6f  ,char*))cd;.  co
1bb70 6e 76 65 72 74 65 72 28 64 69 67 65 73 74 2c 20  nverter(digest, 
1bb80 7a 42 75 66 29 3b 0a 20 20 54 63 6c 5f 41 70 70  zBuf);.  Tcl_App
1bb90 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1bba0 2c 20 7a 42 75 66 2c 20 28 63 68 61 72 2a 29 30  , zBuf, (char*)0
1bbb0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
1bbc0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 54  OK;.}../*.** A T
1bbd0 43 4c 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 74 61  CL command to ta
1bbe0 6b 65 20 74 68 65 20 6d 64 35 20 68 61 73 68 20  ke the md5 hash 
1bbf0 6f 66 20 61 20 66 69 6c 65 2e 20 20 54 68 65 20  of a file.  The 
1bc00 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0a  argument is the.
1bc10 2a 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66  ** name of the f
1bc20 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
1bc30 6e 74 20 6d 64 35 66 69 6c 65 5f 63 6d 64 28 76  nt md5file_cmd(v
1bc40 6f 69 64 2a 63 64 2c 20 54 63 6c 5f 49 6e 74 65  oid*cd, Tcl_Inte
1bc50 72 70 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 61  rp*interp, int a
1bc60 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rgc, const char 
1bc70 2a 2a 61 72 67 76 29 7b 0a 20 20 46 49 4c 45 20  **argv){.  FILE 
1bc80 2a 69 6e 3b 0a 20 20 4d 44 35 43 6f 6e 74 65 78  *in;.  MD5Contex
1bc90 74 20 63 74 78 3b 0a 20 20 76 6f 69 64 20 28 2a  t ctx;.  void (*
1bca0 63 6f 6e 76 65 72 74 65 72 29 28 75 6e 73 69 67  converter)(unsig
1bcb0 6e 65 64 20 63 68 61 72 2a 2c 20 63 68 61 72 2a  ned char*, char*
1bcc0 29 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  );.  unsigned ch
1bcd0 61 72 20 64 69 67 65 73 74 5b 31 36 5d 3b 0a 20  ar digest[16];. 
1bce0 20 63 68 61 72 20 7a 42 75 66 5b 31 30 32 34 30   char zBuf[10240
1bcf0 5d 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 21 3d  ];..  if( argc!=
1bd00 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
1bd10 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1bd20 2c 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20  ,"wrong # args: 
1bd30 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
1bd40 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20  rgv[0], .       
1bd50 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20   " FILENAME\"", 
1bd60 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72  (char*)0);.    r
1bd70 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1bd80 0a 20 20 7d 0a 20 20 69 6e 20 3d 20 66 6f 70 65  .  }.  in = fope
1bd90 6e 28 61 72 67 76 5b 31 5d 2c 22 72 62 22 29 3b  n(argv[1],"rb");
1bda0 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a  .  if( in==0 ){.
1bdb0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1bdc0 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 75 6e 61  sult(interp,"una
1bdd0 62 6c 65 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65  ble to open file
1bde0 20 5c 22 22 2c 20 61 72 67 76 5b 31 5d 2c 20 0a   \"", argv[1], .
1bdf0 20 20 20 20 20 20 20 20 20 22 5c 22 20 66 6f 72           "\" for
1be00 20 72 65 61 64 69 6e 67 22 2c 20 28 63 68 61 72   reading", (char
1be10 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  *)0);.    return
1be20 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1be30 20 20 4d 44 35 49 6e 69 74 28 26 63 74 78 29 3b    MD5Init(&ctx);
1be40 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20  .  for(;;){.    
1be50 69 6e 74 20 6e 3b 0a 20 20 20 20 6e 20 3d 20 28  int n;.    n = (
1be60 69 6e 74 29 66 72 65 61 64 28 7a 42 75 66 2c 20  int)fread(zBuf, 
1be70 31 2c 20 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c  1, sizeof(zBuf),
1be80 20 69 6e 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c   in);.    if( n<
1be90 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
1bea0 4d 44 35 55 70 64 61 74 65 28 26 63 74 78 2c 20  MD5Update(&ctx, 
1beb0 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
1bec0 7a 42 75 66 2c 20 28 75 6e 73 69 67 6e 65 64 29  zBuf, (unsigned)
1bed0 6e 29 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65  n);.  }.  fclose
1bee0 28 69 6e 29 3b 0a 20 20 4d 44 35 46 69 6e 61 6c  (in);.  MD5Final
1bef0 28 64 69 67 65 73 74 2c 20 26 63 74 78 29 3b 0a  (digest, &ctx);.
1bf00 20 20 63 6f 6e 76 65 72 74 65 72 20 3d 20 28 76    converter = (v
1bf10 6f 69 64 28 2a 29 28 75 6e 73 69 67 6e 65 64 20  oid(*)(unsigned 
1bf20 63 68 61 72 2a 2c 63 68 61 72 2a 29 29 63 64 3b  char*,char*))cd;
1bf30 0a 20 20 63 6f 6e 76 65 72 74 65 72 28 64 69 67  .  converter(dig
1bf40 65 73 74 2c 20 7a 42 75 66 29 3b 0a 20 20 54 63  est, zBuf);.  Tc
1bf50 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1bf60 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 28 63 68  nterp, zBuf, (ch
1bf70 61 72 2a 29 30 29 3b 0a 20 20 72 65 74 75 72 6e  ar*)0);.  return
1bf80 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1bf90 2a 20 52 65 67 69 73 74 65 72 20 74 68 65 20 66  * Register the f
1bfa0 6f 75 72 20 6e 65 77 20 54 43 4c 20 63 6f 6d 6d  our new TCL comm
1bfb0 61 6e 64 73 20 66 6f 72 20 67 65 6e 65 72 61 74  ands for generat
1bfc0 69 6e 67 20 4d 44 35 20 63 68 65 63 6b 73 75 6d  ing MD5 checksum
1bfd0 73 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 54 43  s.** with the TC
1bfe0 4c 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 2a  L interpreter..*
1bff0 2f 0a 69 6e 74 20 4d 64 35 5f 49 6e 69 74 28 54  /.int Md5_Init(T
1c000 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1c010 70 29 7b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65  p){.  Tcl_Create
1c020 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
1c030 22 6d 64 35 22 2c 20 28 54 63 6c 5f 43 6d 64 50  "md5", (Tcl_CmdP
1c040 72 6f 63 2a 29 6d 64 35 5f 63 6d 64 2c 0a 20 20  roc*)md5_cmd,.  
1c050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c060 20 20 4d 44 35 44 69 67 65 73 74 54 6f 42 61 73    MD5DigestToBas
1c070 65 31 36 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43  e16, 0);.  Tcl_C
1c080 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74  reateCommand(int
1c090 65 72 70 2c 20 22 6d 64 35 2d 31 30 78 38 22 2c  erp, "md5-10x8",
1c0a0 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 6d   (Tcl_CmdProc*)m
1c0b0 64 35 5f 63 6d 64 2c 0a 20 20 20 20 20 20 20 20  d5_cmd,.        
1c0c0 20 20 20 20 20 20 20 20 20 20 20 20 4d 44 35 44              MD5D
1c0d0 69 67 65 73 74 54 6f 42 61 73 65 31 30 78 38 2c  igestToBase10x8,
1c0e0 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74   0);.  Tcl_Creat
1c0f0 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  eCommand(interp,
1c100 20 22 6d 64 35 66 69 6c 65 22 2c 20 28 54 63 6c   "md5file", (Tcl
1c110 5f 43 6d 64 50 72 6f 63 2a 29 6d 64 35 66 69 6c  _CmdProc*)md5fil
1c120 65 5f 63 6d 64 2c 0a 20 20 20 20 20 20 20 20 20  e_cmd,.         
1c130 20 20 20 20 20 20 20 20 20 20 20 4d 44 35 44 69             MD5Di
1c140 67 65 73 74 54 6f 42 61 73 65 31 36 2c 20 30 29  gestToBase16, 0)
1c150 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 43 6f  ;.  Tcl_CreateCo
1c160 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 6d  mmand(interp, "m
1c170 64 35 66 69 6c 65 2d 31 30 78 38 22 2c 20 28 54  d5file-10x8", (T
1c180 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 6d 64 35 66  cl_CmdProc*)md5f
1c190 69 6c 65 5f 63 6d 64 2c 0a 20 20 20 20 20 20 20  ile_cmd,.       
1c1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 4d 44 35               MD5
1c1b0 44 69 67 65 73 74 54 6f 42 61 73 65 31 30 78 38  DigestToBase10x8
1c1c0 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  , 0);.  return T
1c1d0 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  CL_OK;.}.#endif 
1c1e0 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  /* defined(SQLIT
1c1f0 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e  E_TEST) || defin
1c200 65 64 28 53 51 4c 49 54 45 5f 54 43 4c 4d 44 35  ed(SQLITE_TCLMD5
1c210 29 20 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65  ) */..#if define
1c220 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f  d(SQLITE_TEST)./
1c230 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 74 65 73 74  *.** During test
1c240 69 6e 67 2c 20 74 68 65 20 73 70 65 63 69 61 6c  ing, the special
1c250 20 6d 64 35 73 75 6d 28 29 20 61 67 67 72 65 67   md5sum() aggreg
1c260 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  ate function is 
1c270 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 20 69 6e  available..** in
1c280 73 69 64 65 20 53 51 4c 69 74 65 2e 20 20 54 68  side SQLite.  Th
1c290 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74  e following rout
1c2a0 69 6e 65 73 20 69 6d 70 6c 65 6d 65 6e 74 20 74  ines implement t
1c2b0 68 61 74 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  hat function..*/
1c2c0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 64 35  .static void md5
1c2d0 73 74 65 70 28 73 71 6c 69 74 65 33 5f 63 6f 6e  step(sqlite3_con
1c2e0 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69  text *context, i
1c2f0 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
1c300 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a  _value **argv){.
1c310 20 20 4d 44 35 43 6f 6e 74 65 78 74 20 2a 70 3b    MD5Context *p;
1c320 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
1c330 61 72 67 63 3c 31 20 29 20 72 65 74 75 72 6e 3b  argc<1 ) return;
1c340 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61  .  p = sqlite3_a
1c350 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
1c360 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66  (context, sizeof
1c370 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 3d 3d  (*p));.  if( p==
1c380 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
1c390 28 20 21 70 2d 3e 69 73 49 6e 69 74 20 29 7b 0a  ( !p->isInit ){.
1c3a0 20 20 20 20 4d 44 35 49 6e 69 74 28 70 29 3b 0a      MD5Init(p);.
1c3b0 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
1c3c0 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <argc; i++){.   
1c3d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61   const char *zDa
1c3e0 74 61 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69  ta = (char*)sqli
1c3f0 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
1c400 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28  rgv[i]);.    if(
1c410 20 7a 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20   zData ){.      
1c420 4d 44 35 55 70 64 61 74 65 28 70 2c 20 28 75 6e  MD5Update(p, (un
1c430 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 44 61  signed char*)zDa
1c440 74 61 2c 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  ta, (int)strlen(
1c450 7a 44 61 74 61 29 29 3b 0a 20 20 20 20 7d 0a 20  zData));.    }. 
1c460 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
1c470 20 6d 64 35 66 69 6e 61 6c 69 7a 65 28 73 71 6c   md5finalize(sql
1c480 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
1c490 6e 74 65 78 74 29 7b 0a 20 20 4d 44 35 43 6f 6e  ntext){.  MD5Con
1c4a0 74 65 78 74 20 2a 70 3b 0a 20 20 75 6e 73 69 67  text *p;.  unsig
1c4b0 6e 65 64 20 63 68 61 72 20 64 69 67 65 73 74 5b  ned char digest[
1c4c0 31 36 5d 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  16];.  char zBuf
1c4d0 5b 33 33 5d 3b 0a 20 20 70 20 3d 20 73 71 6c 69  [33];.  p = sqli
1c4e0 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
1c4f0 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73  ntext(context, s
1c500 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 4d 44  izeof(*p));.  MD
1c510 35 46 69 6e 61 6c 28 64 69 67 65 73 74 2c 70 29  5Final(digest,p)
1c520 3b 0a 20 20 4d 44 35 44 69 67 65 73 74 54 6f 42  ;.  MD5DigestToB
1c530 61 73 65 31 36 28 64 69 67 65 73 74 2c 20 7a 42  ase16(digest, zB
1c540 75 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72  uf);.  sqlite3_r
1c550 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
1c560 78 74 2c 20 7a 42 75 66 2c 20 2d 31 2c 20 53 51  xt, zBuf, -1, SQ
1c570 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
1c580 0a 7d 0a 69 6e 74 20 4d 64 35 5f 52 65 67 69 73  .}.int Md5_Regis
1c590 74 65 72 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ter(sqlite3 *db)
1c5a0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c  {.  int rc = sql
1c5b0 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
1c5c0 74 69 6f 6e 28 64 62 2c 20 22 6d 64 35 73 75 6d  tion(db, "md5sum
1c5d0 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  ", -1, SQLITE_UT
1c5e0 46 38 2c 20 30 2c 20 30 2c 20 0a 20 20 20 20 20  F8, 0, 0, .     
1c5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c600 20 20 20 20 20 20 20 20 20 20 20 20 6d 64 35 73              md5s
1c610 74 65 70 2c 20 6d 64 35 66 69 6e 61 6c 69 7a 65  tep, md5finalize
1c620 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6f 76 65  );.  sqlite3_ove
1c630 72 6c 6f 61 64 5f 66 75 6e 63 74 69 6f 6e 28 64  rload_function(d
1c640 62 2c 20 22 6d 64 35 73 75 6d 22 2c 20 2d 31 29  b, "md5sum", -1)
1c650 3b 20 20 2f 2a 20 54 6f 20 65 78 65 72 63 69 73  ;  /* To exercis
1c660 65 20 74 68 69 73 20 41 50 49 20 2a 2f 0a 20 20  e this API */.  
1c670 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
1c680 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53  dif /* defined(S
1c690 51 4c 49 54 45 5f 54 45 53 54 29 20 2a 2f 0a 0a  QLITE_TEST) */..
1c6a0 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61  ./*.** If the ma
1c6b0 63 72 6f 20 54 43 4c 53 48 20 69 73 20 6f 6e 65  cro TCLSH is one
1c6c0 2c 20 74 68 65 6e 20 70 75 74 20 69 6e 20 63 6f  , then put in co
1c6d0 64 65 20 74 68 69 73 20 66 6f 72 20 74 68 65 0a  de this for the.
1c6e0 2a 2a 20 22 6d 61 69 6e 22 20 72 6f 75 74 69 6e  ** "main" routin
1c6f0 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 69 74  e that will init
1c700 69 61 6c 69 7a 65 20 54 63 6c 20 61 6e 64 20 74  ialize Tcl and t
1c710 61 6b 65 20 69 6e 70 75 74 20 66 72 6f 6d 0a 2a  ake input from.*
1c720 2a 20 73 74 61 6e 64 61 72 64 20 69 6e 70 75 74  * standard input
1c730 2c 20 6f 72 20 69 66 20 61 20 66 69 6c 65 20 69  , or if a file i
1c740 73 20 6e 61 6d 65 64 20 6f 6e 20 74 68 65 20 63  s named on the c
1c750 6f 6d 6d 61 6e 64 20 6c 69 6e 65 0a 2a 2a 20 74  ommand line.** t
1c760 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
1c770 65 72 20 72 65 61 64 73 20 61 6e 64 20 65 76 61  er reads and eva
1c780 6c 75 61 74 65 73 20 74 68 61 74 20 66 69 6c 65  luates that file
1c790 2e 0a 2a 2f 0a 23 69 66 20 54 43 4c 53 48 3d 3d  ..*/.#if TCLSH==
1c7a0 31 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  1.static const c
1c7b0 68 61 72 20 2a 74 63 6c 73 68 5f 6d 61 69 6e 5f  har *tclsh_main_
1c7c0 6c 6f 6f 70 28 76 6f 69 64 29 7b 0a 20 20 73 74  loop(void){.  st
1c7d0 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
1c7e0 7a 4d 61 69 6e 6c 6f 6f 70 5b 5d 20 3d 0a 20 20  zMainloop[] =.  
1c7f0 20 20 22 73 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e    "set line {}\n
1c800 22 0a 20 20 20 20 22 77 68 69 6c 65 20 7b 21 5b  ".    "while {![
1c810 65 6f 66 20 73 74 64 69 6e 5d 7d 20 7b 5c 6e 22  eof stdin]} {\n"
1c820 0a 20 20 20 20 20 20 22 69 66 20 7b 24 6c 69 6e  .      "if {$lin
1c830 65 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20  e!=\"\"} {\n".  
1c840 20 20 20 20 20 20 22 70 75 74 73 20 2d 6e 6f 6e        "puts -non
1c850 65 77 6c 69 6e 65 20 5c 22 3e 20 5c 22 5c 6e 22  ewline \"> \"\n"
1c860 0a 20 20 20 20 20 20 22 7d 20 65 6c 73 65 20 7b  .      "} else {
1c870 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 70 75 74  \n".        "put
1c880 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 5c 22 25  s -nonewline \"%
1c890 20 5c 22 5c 6e 22 0a 20 20 20 20 20 20 22 7d 5c   \"\n".      "}\
1c8a0 6e 22 0a 20 20 20 20 20 20 22 66 6c 75 73 68 20  n".      "flush 
1c8b0 73 74 64 6f 75 74 5c 6e 22 0a 20 20 20 20 20 20  stdout\n".      
1c8c0 22 61 70 70 65 6e 64 20 6c 69 6e 65 20 5b 67 65  "append line [ge
1c8d0 74 73 20 73 74 64 69 6e 5d 5c 6e 22 0a 20 20 20  ts stdin]\n".   
1c8e0 20 20 20 22 69 66 20 7b 5b 69 6e 66 6f 20 63 6f     "if {[info co
1c8f0 6d 70 6c 65 74 65 20 24 6c 69 6e 65 5d 7d 20 7b  mplete $line]} {
1c900 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 69 66 20  \n".        "if 
1c910 7b 5b 63 61 74 63 68 20 7b 75 70 6c 65 76 65 6c  {[catch {uplevel
1c920 20 23 30 20 24 6c 69 6e 65 7d 20 72 65 73 75 6c   #0 $line} resul
1c930 74 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20  t]} {\n".       
1c940 20 20 20 22 70 75 74 73 20 73 74 64 65 72 72 20     "puts stderr 
1c950 5c 22 45 72 72 6f 72 3a 20 24 72 65 73 75 6c 74  \"Error: $result
1c960 5c 22 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 7d  \"\n".        "}
1c970 20 65 6c 73 65 69 66 20 7b 24 72 65 73 75 6c 74   elseif {$result
1c980 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20 20  !=\"\"} {\n".   
1c990 20 20 20 20 20 20 20 22 70 75 74 73 20 24 72 65         "puts $re
1c9a0 73 75 6c 74 5c 6e 22 0a 20 20 20 20 20 20 20 20  sult\n".        
1c9b0 22 7d 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 73  "}\n".        "s
1c9c0 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e 22 0a 20 20  et line {}\n".  
1c9d0 20 20 20 20 22 7d 20 65 6c 73 65 20 7b 5c 6e 22      "} else {\n"
1c9e0 0a 20 20 20 20 20 20 20 20 22 61 70 70 65 6e 64  .        "append
1c9f0 20 6c 69 6e 65 20 5c 5c 6e 5c 6e 22 0a 20 20 20   line \\n\n".   
1ca00 20 20 20 22 7d 5c 6e 22 0a 20 20 20 20 22 7d 5c     "}\n".    "}\
1ca10 6e 22 0a 20 20 3b 0a 20 20 72 65 74 75 72 6e 20  n".  ;.  return 
1ca20 7a 4d 61 69 6e 6c 6f 6f 70 3b 0a 7d 0a 23 65 6e  zMainloop;.}.#en
1ca30 64 69 66 0a 23 69 66 20 54 43 4c 53 48 3d 3d 32  dif.#if TCLSH==2
1ca40 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
1ca50 61 72 20 2a 74 63 6c 73 68 5f 6d 61 69 6e 5f 6c  ar *tclsh_main_l
1ca60 6f 6f 70 28 76 6f 69 64 29 3b 0a 23 65 6e 64 69  oop(void);.#endi
1ca70 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
1ca80 5f 54 45 53 54 0a 73 74 61 74 69 63 20 76 6f 69  _TEST.static voi
1ca90 64 20 69 6e 69 74 5f 61 6c 6c 28 54 63 6c 5f 49  d init_all(Tcl_I
1caa0 6e 74 65 72 70 20 2a 29 3b 0a 73 74 61 74 69 63  nterp *);.static
1cab0 20 69 6e 74 20 69 6e 69 74 5f 61 6c 6c 5f 63 6d   int init_all_cm
1cac0 64 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  d(.  ClientData 
1cad0 63 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  cd,.  Tcl_Interp
1cae0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1caf0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1cb00 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1cb10 0a 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ..  Tcl_Interp *
1cb20 73 6c 61 76 65 3b 0a 20 20 69 66 28 20 6f 62 6a  slave;.  if( obj
1cb30 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
1cb40 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
1cb50 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53  erp, 1, objv, "S
1cb60 4c 41 56 45 22 29 3b 0a 20 20 20 20 72 65 74 75  LAVE");.    retu
1cb70 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1cb80 7d 0a 0a 20 20 73 6c 61 76 65 20 3d 20 54 63 6c  }..  slave = Tcl
1cb90 5f 47 65 74 53 6c 61 76 65 28 69 6e 74 65 72 70  _GetSlave(interp
1cba0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
1cbb0 6f 62 6a 76 5b 31 5d 29 29 3b 0a 20 20 69 66 28  objv[1]));.  if(
1cbc0 20 21 73 6c 61 76 65 20 29 7b 0a 20 20 20 20 72   !slave ){.    r
1cbd0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1cbe0 0a 20 20 7d 0a 0a 20 20 69 6e 69 74 5f 61 6c 6c  .  }..  init_all
1cbf0 28 73 6c 61 76 65 29 3b 0a 20 20 72 65 74 75 72  (slave);.  retur
1cc00 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1cc10 2a 2a 20 54 63 6c 63 6d 64 3a 20 64 62 5f 75 73  ** Tclcmd: db_us
1cc20 65 5f 6c 65 67 61 63 79 5f 70 72 65 70 61 72 65  e_legacy_prepare
1cc30 20 44 42 20 42 4f 4f 4c 45 41 4e 0a 2a 2a 0a 2a   DB BOOLEAN.**.*
1cc40 2a 20 20 20 54 68 65 20 66 69 72 73 74 20 61 72  *   The first ar
1cc50 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 63  gument to this c
1cc60 6f 6d 6d 61 6e 64 20 6d 75 73 74 20 62 65 20 61  ommand must be a
1cc70 20 64 61 74 61 62 61 73 65 20 63 6f 6d 6d 61 6e   database comman
1cc80 64 20 63 72 65 61 74 65 64 20 62 79 0a 2a 2a 20  d created by.** 
1cc90 20 20 5b 73 71 6c 69 74 65 33 5d 2e 20 49 66 20    [sqlite3]. If 
1cca0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
1ccb0 65 6e 74 20 69 73 20 74 72 75 65 2c 20 74 68 65  ent is true, the
1ccc0 6e 20 74 68 65 20 68 61 6e 64 6c 65 20 69 73 20  n the handle is 
1ccd0 63 6f 6e 66 69 67 75 72 65 64 0a 2a 2a 20 20 20  configured.**   
1cce0 74 6f 20 75 73 65 20 74 68 65 20 73 71 6c 69 74  to use the sqlit
1ccf0 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 29 20  e3_prepare_v2() 
1cd00 66 75 6e 63 74 69 6f 6e 20 74 6f 20 70 72 65 70  function to prep
1cd10 61 72 65 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  are statements. 
1cd20 49 66 20 69 74 0a 2a 2a 20 20 20 69 73 20 66 61  If it.**   is fa
1cd30 6c 73 65 2c 20 73 71 6c 69 74 65 33 5f 70 72 65  lse, sqlite3_pre
1cd40 70 61 72 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  pare()..*/.stati
1cd50 63 20 69 6e 74 20 64 62 5f 75 73 65 5f 6c 65 67  c int db_use_leg
1cd60 61 63 79 5f 70 72 65 70 61 72 65 5f 63 6d 64 28  acy_prepare_cmd(
1cd70 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 64  .  ClientData cd
1cd80 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1cd90 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
1cda0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
1cdb0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
1cdc0 20 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64   Tcl_CmdInfo cmd
1cdd0 49 6e 66 6f 3b 0a 20 20 53 71 6c 69 74 65 44 62  Info;.  SqliteDb
1cde0 20 2a 70 44 62 3b 0a 20 20 69 6e 74 20 62 50 72   *pDb;.  int bPr
1cdf0 65 70 61 72 65 3b 0a 0a 20 20 69 66 28 20 6f 62  epare;..  if( ob
1ce00 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    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 44 42 20 42 4f 4f 4c 45 41 4e 22 29 3b 0a 20 20  DB BOOLEAN");.  
1ce40 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1ce50 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21  OR;.  }..  if( !
1ce60 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e  Tcl_GetCommandIn
1ce70 66 6f 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  fo(interp, Tcl_G
1ce80 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
1ce90 29 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29 7b 0a  ), &cmdInfo) ){.
1cea0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1ceb0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f  sult(interp, "no
1cec0 20 73 75 63 68 20 64 62 3a 20 22 2c 20 54 63 6c   such db: ", Tcl
1ced0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1cee0 31 5d 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  1]), (char*)0);.
1cef0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1cf00 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 44 62 20  RROR;.  }.  pDb 
1cf10 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 6d 64  = (SqliteDb*)cmd
1cf20 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44 61  Info.objClientDa
1cf30 74 61 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  ta;.  if( Tcl_Ge
1cf40 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
1cf50 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
1cf60 20 26 62 50 72 65 70 61 72 65 29 20 29 7b 0a 20   &bPrepare) ){. 
1cf70 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1cf80 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 70 44 62 2d  ROR;.  }..  pDb-
1cf90 3e 62 4c 65 67 61 63 79 50 72 65 70 61 72 65 20  >bLegacyPrepare 
1cfa0 3d 20 62 50 72 65 70 61 72 65 3b 0a 0a 20 20 54  = bPrepare;..  T
1cfb0 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69  cl_ResetResult(i
1cfc0 6e 74 65 72 70 29 3b 0a 20 20 72 65 74 75 72 6e  nterp);.  return
1cfd0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1cfe0 2a 20 54 63 6c 63 6d 64 3a 20 64 62 5f 6c 61 73  * Tclcmd: db_las
1cff0 74 5f 73 74 6d 74 5f 70 74 72 20 44 42 0a 2a 2a  t_stmt_ptr DB.**
1d000 0a 2a 2a 20 20 20 49 66 20 74 68 65 20 73 74 61  .**   If the sta
1d010 74 65 6d 65 6e 74 20 63 61 63 68 65 20 61 73 73  tement cache ass
1d020 6f 63 69 61 74 65 64 20 77 69 74 68 20 64 61 74  ociated with dat
1d030 61 62 61 73 65 20 44 42 20 69 73 20 6e 6f 74 20  abase DB is not 
1d040 65 6d 70 74 79 2c 0a 2a 2a 20 20 20 72 65 74 75  empty,.**   retu
1d050 72 6e 20 74 68 65 20 74 65 78 74 20 72 65 70 72  rn the text repr
1d060 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
1d070 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
1d080 75 73 65 64 20 73 74 61 74 65 6d 65 6e 74 0a 2a  used statement.*
1d090 2a 20 20 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73  *   handle..*/.s
1d0a0 74 61 74 69 63 20 69 6e 74 20 64 62 5f 6c 61 73  tatic int db_las
1d0b0 74 5f 73 74 6d 74 5f 70 74 72 28 0a 20 20 43 6c  t_stmt_ptr(.  Cl
1d0c0 69 65 6e 74 44 61 74 61 20 63 64 2c 0a 20 20 54  ientData cd,.  T
1d0d0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1d0e0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1d0f0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1d100 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 65 78 74 65  objv[].){.  exte
1d110 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 54 65  rn int sqlite3Te
1d120 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72  stMakePointerStr
1d130 28 54 63 6c 5f 49 6e 74 65 72 70 2a 2c 20 63 68  (Tcl_Interp*, ch
1d140 61 72 2a 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 54  ar*, void*);.  T
1d150 63 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49 6e  cl_CmdInfo cmdIn
1d160 66 6f 3b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  fo;.  SqliteDb *
1d170 70 44 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  pDb;.  sqlite3_s
1d180 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
1d190 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d    char zBuf[100]
1d1a0 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
1d1b0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
1d1c0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
1d1d0 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 22 29 3b   1, objv, "DB");
1d1e0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1d1f0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
1d200 28 20 21 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e  ( !Tcl_GetComman
1d210 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 54 63  dInfo(interp, Tc
1d220 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1d230 5b 31 5d 29 2c 20 26 63 6d 64 49 6e 66 6f 29 20  [1]), &cmdInfo) 
1d240 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1d250 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1d260 22 6e 6f 20 73 75 63 68 20 64 62 3a 20 22 2c 20  "no such db: ", 
1d270 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1d280 6a 76 5b 31 5d 29 2c 20 28 63 68 61 72 2a 29 30  jv[1]), (char*)0
1d290 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1d2a0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70  L_ERROR;.  }.  p
1d2b0 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29  Db = (SqliteDb*)
1d2c0 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e  cmdInfo.objClien
1d2d0 74 44 61 74 61 3b 0a 0a 20 20 69 66 28 20 70 44  tData;..  if( pD
1d2e0 62 2d 3e 73 74 6d 74 4c 69 73 74 20 29 20 70 53  b->stmtList ) pS
1d2f0 74 6d 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c  tmt = pDb->stmtL
1d300 69 73 74 2d 3e 70 53 74 6d 74 3b 0a 20 20 69 66  ist->pStmt;.  if
1d310 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b  ( sqlite3TestMak
1d320 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65  ePointerStr(inte
1d330 72 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74 29  rp, zBuf, pStmt)
1d340 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
1d350 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1d360 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
1d370 74 65 72 70 2c 20 7a 42 75 66 2c 20 54 43 4c 5f  terp, zBuf, TCL_
1d380 56 4f 4c 41 54 49 4c 45 29 3b 0a 0a 20 20 72 65  VOLATILE);..  re
1d390 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23  turn TCL_OK;.}.#
1d3a0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1d3b0 54 45 53 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43  TEST */../*.** C
1d3c0 6f 6e 66 69 67 75 72 65 20 74 68 65 20 69 6e 74  onfigure the int
1d3d0 65 72 70 72 65 74 65 72 20 70 61 73 73 65 64 20  erpreter passed 
1d3e0 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
1d3f0 75 6d 65 6e 74 20 74 6f 20 68 61 76 65 20 61 63  ument to have ac
1d400 63 65 73 73 0a 2a 2a 20 74 6f 20 74 68 65 20 63  cess.** to the c
1d410 6f 6d 6d 61 6e 64 73 20 61 6e 64 20 6c 69 6e 6b  ommands and link
1d420 65 64 20 76 61 72 69 61 62 6c 65 73 20 74 68 61  ed variables tha
1d430 74 20 6d 61 6b 65 20 75 70 3a 0a 2a 2a 0a 2a 2a  t make up:.**.**
1d440 20 20 20 2a 20 74 68 65 20 5b 73 71 6c 69 74 65     * the [sqlite
1d450 33 5d 20 65 78 74 65 6e 73 69 6f 6e 20 69 74 73  3] extension its
1d460 65 6c 66 2c 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  elf, .**.**   * 
1d470 49 66 20 53 51 4c 49 54 45 5f 54 43 4c 4d 44 35  If SQLITE_TCLMD5
1d480 20 6f 72 20 53 51 4c 49 54 45 5f 54 45 53 54 20   or SQLITE_TEST 
1d490 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65 20  is defined, the 
1d4a0 4d 64 35 20 63 6f 6d 6d 61 6e 64 73 2c 20 61 6e  Md5 commands, an
1d4b0 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 53  d.**.**   * If S
1d4c0 51 4c 49 54 45 5f 54 45 53 54 20 69 73 20 73 65  QLITE_TEST is se
1d4d0 74 2c 20 74 68 65 20 76 61 72 69 6f 75 73 20 74  t, the various t
1d4e0 65 73 74 20 69 6e 74 65 72 66 61 63 65 73 20 75  est interfaces u
1d4f0 73 65 64 20 62 79 20 74 68 65 20 54 63 6c 0a 2a  sed by the Tcl.*
1d500 2a 20 20 20 20 20 74 65 73 74 20 73 75 69 74 65  *     test suite
1d510 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1d520 20 69 6e 69 74 5f 61 6c 6c 28 54 63 6c 5f 49 6e   init_all(Tcl_In
1d530 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20  terp *interp){. 
1d540 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e   Sqlite3_Init(in
1d550 74 65 72 70 29 3b 0a 0a 23 69 66 20 64 65 66 69  terp);..#if defi
1d560 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
1d570 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
1d580 54 45 5f 54 43 4c 4d 44 35 29 0a 20 20 4d 64 35  TE_TCLMD5).  Md5
1d590 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 23  _Init(interp);.#
1d5a0 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
1d5b0 4c 49 54 45 5f 54 45 53 54 0a 20 20 7b 0a 20 20  LITE_TEST.  {.  
1d5c0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1d5d0 69 74 65 63 6f 6e 66 69 67 5f 49 6e 69 74 28 54  iteconfig_Init(T
1d5e0 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1d5f0 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1d600 74 65 74 65 73 74 31 5f 49 6e 69 74 28 54 63 6c  tetest1_Init(Tcl
1d610 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1d620 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1d630 74 65 73 74 32 5f 49 6e 69 74 28 54 63 6c 5f 49  test2_Init(Tcl_I
1d640 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1d650 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1d660 73 74 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  st3_Init(Tcl_Int
1d670 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1d680 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1d690 34 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  4_Init(Tcl_Inter
1d6a0 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1d6b0 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 35 5f  int Sqlitetest5_
1d6c0 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1d6d0 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
1d6e0 74 20 53 71 6c 69 74 65 74 65 73 74 36 5f 49 6e  t Sqlitetest6_In
1d6f0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1d700 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1d710 53 71 6c 69 74 65 74 65 73 74 37 5f 49 6e 69 74  Sqlitetest7_Init
1d720 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1d730 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1d740 6c 69 74 65 74 65 73 74 38 5f 49 6e 69 74 28 54  litetest8_Init(T
1d750 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1d760 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1d770 74 65 74 65 73 74 39 5f 49 6e 69 74 28 54 63 6c  tetest9_Init(Tcl
1d780 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1d790 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1d7a0 74 65 73 74 61 73 79 6e 63 5f 49 6e 69 74 28 54  testasync_Init(T
1d7b0 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1d7c0 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1d7d0 74 65 74 65 73 74 5f 61 75 74 6f 65 78 74 5f 49  tetest_autoext_I
1d7e0 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
1d7f0 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
1d800 20 53 71 6c 69 74 65 74 65 73 74 5f 62 6c 6f 62   Sqlitetest_blob
1d810 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1d820 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1d830 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f 64 65  nt Sqlitetest_de
1d840 6d 6f 76 66 73 5f 49 6e 69 74 28 54 63 6c 5f 49  movfs_Init(Tcl_I
1d850 6e 74 65 72 70 20 2a 29 3b 0a 20 20 20 20 65 78  nterp *);.    ex
1d860 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1d870 65 73 74 5f 66 75 6e 63 5f 49 6e 69 74 28 54 63  est_func_Init(Tc
1d880 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1d890 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1d8a0 65 74 65 73 74 5f 68 65 78 69 6f 5f 49 6e 69 74  etest_hexio_Init
1d8b0 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1d8c0 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1d8d0 6c 69 74 65 74 65 73 74 5f 69 6e 69 74 5f 49 6e  litetest_init_In
1d8e0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1d8f0 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1d900 53 71 6c 69 74 65 74 65 73 74 5f 6d 61 6c 6c 6f  Sqlitetest_mallo
1d910 63 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  c_Init(Tcl_Inter
1d920 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1d930 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f 6d  int Sqlitetest_m
1d940 75 74 65 78 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  utex_Init(Tcl_In
1d950 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
1d960 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1d970 74 73 63 68 65 6d 61 5f 49 6e 69 74 28 54 63 6c  tschema_Init(Tcl
1d980 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1d990 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1d9a0 74 65 73 74 73 73 65 5f 49 6e 69 74 28 54 63 6c  testsse_Init(Tcl
1d9b0 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1d9c0 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1d9d0 74 65 73 74 74 63 6c 76 61 72 5f 49 6e 69 74 28  testtclvar_Init(
1d9e0 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1d9f0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1da00 69 74 65 74 65 73 74 66 73 5f 49 6e 69 74 28 54  itetestfs_Init(T
1da10 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1da20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1da30 74 65 74 65 73 74 54 68 72 65 61 64 5f 49 6e 69  tetestThread_Ini
1da40 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
1da50 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1da60 71 6c 69 74 65 74 65 73 74 4f 6e 65 66 69 6c 65  qlitetestOnefile
1da70 5f 49 6e 69 74 28 29 3b 0a 20 20 20 20 65 78 74  _Init();.    ext
1da80 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1da90 73 74 4f 73 69 6e 73 74 5f 49 6e 69 74 28 54 63  stOsinst_Init(Tc
1daa0 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1dab0 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1dac0 65 74 65 73 74 62 61 63 6b 75 70 5f 49 6e 69 74  etestbackup_Init
1dad0 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1dae0 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1daf0 6c 69 74 65 74 65 73 74 69 6e 74 61 72 72 61 79  litetestintarray
1db00 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1db10 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1db20 6e 74 20 53 71 6c 69 74 65 74 65 73 74 76 66 73  nt Sqlitetestvfs
1db30 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1db40 20 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20   *);.    extern 
1db50 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 72 74  int Sqlitetestrt
1db60 72 65 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  ree_Init(Tcl_Int
1db70 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1db80 6e 20 69 6e 74 20 53 71 6c 69 74 65 71 75 6f 74  n int Sqlitequot
1db90 61 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  a_Init(Tcl_Inter
1dba0 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1dbb0 69 6e 74 20 53 71 6c 69 74 65 6d 75 6c 74 69 70  int Sqlitemultip
1dbc0 6c 65 78 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  lex_Init(Tcl_Int
1dbd0 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1dbe0 6e 20 69 6e 74 20 53 71 6c 69 74 65 53 75 70 65  n int SqliteSupe
1dbf0 72 6c 6f 63 6b 5f 49 6e 69 74 28 54 63 6c 5f 49  rlock_Init(Tcl_I
1dc00 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1dc10 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1dc20 73 74 53 79 73 63 61 6c 6c 5f 49 6e 69 74 28 54  stSyscall_Init(T
1dc30 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 23 69 66  cl_Interp*);.#if
1dc40 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1dc50 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 20  ENABLE_SESSION) 
1dc60 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
1dc70 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41  E_ENABLE_PREUPDA
1dc80 54 45 5f 48 4f 4f 4b 29 0a 20 20 20 20 65 78 74  TE_HOOK).    ext
1dc90 65 72 6e 20 69 6e 74 20 54 65 73 74 53 65 73 73  ern int TestSess
1dca0 69 6f 6e 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  ion_Init(Tcl_Int
1dcb0 65 72 70 2a 29 3b 0a 23 65 6e 64 69 66 0a 20 20  erp*);.#endif.  
1dcc0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 46 74 73    extern int Fts
1dcd0 35 74 63 6c 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  5tcl_Init(Tcl_In
1dce0 74 65 72 70 20 2a 29 3b 0a 20 20 20 20 65 78 74  terp *);.    ext
1dcf0 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 52 62  ern int SqliteRb
1dd00 75 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  u_Init(Tcl_Inter
1dd10 70 2a 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  p*);.#if defined
1dd20 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46  (SQLITE_ENABLE_F
1dd30 54 53 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  TS3) || defined(
1dd40 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54  SQLITE_ENABLE_FT
1dd50 53 34 29 0a 20 20 20 20 65 78 74 65 72 6e 20 69  S4).    extern i
1dd60 6e 74 20 53 71 6c 69 74 65 74 65 73 74 66 74 73  nt Sqlitetestfts
1dd70 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  3_Init(Tcl_Inter
1dd80 70 20 2a 69 6e 74 65 72 70 29 3b 0a 23 65 6e 64  p *interp);.#end
1dd90 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
1dda0 45 5f 45 4e 41 42 4c 45 5f 5a 49 50 56 46 53 0a  E_ENABLE_ZIPVFS.
1ddb0 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 5a      extern int Z
1ddc0 69 70 76 66 73 5f 49 6e 69 74 28 54 63 6c 5f 49  ipvfs_Init(Tcl_I
1ddd0 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 5a 69 70  nterp*);.    Zip
1dde0 76 66 73 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  vfs_Init(interp)
1ddf0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 53 71  ;.#endif..    Sq
1de00 6c 69 74 65 63 6f 6e 66 69 67 5f 49 6e 69 74 28  liteconfig_Init(
1de10 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
1de20 69 74 65 74 65 73 74 31 5f 49 6e 69 74 28 69 6e  itetest1_Init(in
1de30 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
1de40 65 74 65 73 74 32 5f 49 6e 69 74 28 69 6e 74 65  etest2_Init(inte
1de50 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
1de60 65 73 74 33 5f 49 6e 69 74 28 69 6e 74 65 72 70  est3_Init(interp
1de70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
1de80 74 34 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  t4_Init(interp);
1de90 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 35  .    Sqlitetest5
1dea0 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
1deb0 20 20 20 53 71 6c 69 74 65 74 65 73 74 36 5f 49     Sqlitetest6_I
1dec0 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1ded0 20 53 71 6c 69 74 65 74 65 73 74 37 5f 49 6e 69   Sqlitetest7_Ini
1dee0 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
1def0 71 6c 69 74 65 74 65 73 74 38 5f 49 6e 69 74 28  qlitetest8_Init(
1df00 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
1df10 69 74 65 74 65 73 74 39 5f 49 6e 69 74 28 69 6e  itetest9_Init(in
1df20 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
1df30 65 74 65 73 74 61 73 79 6e 63 5f 49 6e 69 74 28  etestasync_Init(
1df40 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
1df50 69 74 65 74 65 73 74 5f 61 75 74 6f 65 78 74 5f  itetest_autoext_
1df60 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
1df70 20 20 53 71 6c 69 74 65 74 65 73 74 5f 62 6c 6f    Sqlitetest_blo
1df80 62 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  b_Init(interp);.
1df90 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 5f 64      Sqlitetest_d
1dfa0 65 6d 6f 76 66 73 5f 49 6e 69 74 28 69 6e 74 65  emovfs_Init(inte
1dfb0 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
1dfc0 65 73 74 5f 66 75 6e 63 5f 49 6e 69 74 28 69 6e  est_func_Init(in
1dfd0 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
1dfe0 65 74 65 73 74 5f 68 65 78 69 6f 5f 49 6e 69 74  etest_hexio_Init
1dff0 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1e000 6c 69 74 65 74 65 73 74 5f 69 6e 69 74 5f 49 6e  litetest_init_In
1e010 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1e020 53 71 6c 69 74 65 74 65 73 74 5f 6d 61 6c 6c 6f  Sqlitetest_mallo
1e030 63 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  c_Init(interp);.
1e040 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 5f 6d      Sqlitetest_m
1e050 75 74 65 78 5f 49 6e 69 74 28 69 6e 74 65 72 70  utex_Init(interp
1e060 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
1e070 74 73 63 68 65 6d 61 5f 49 6e 69 74 28 69 6e 74  tschema_Init(int
1e080 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1e090 74 65 73 74 74 63 6c 76 61 72 5f 49 6e 69 74 28  testtclvar_Init(
1e0a0 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
1e0b0 69 74 65 74 65 73 74 66 73 5f 49 6e 69 74 28 69  itetestfs_Init(i
1e0c0 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1e0d0 74 65 74 65 73 74 54 68 72 65 61 64 5f 49 6e 69  tetestThread_Ini
1e0e0 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
1e0f0 71 6c 69 74 65 74 65 73 74 4f 6e 65 66 69 6c 65  qlitetestOnefile
1e100 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
1e110 20 20 20 53 71 6c 69 74 65 74 65 73 74 4f 73 69     SqlitetestOsi
1e120 6e 73 74 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  nst_Init(interp)
1e130 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
1e140 62 61 63 6b 75 70 5f 49 6e 69 74 28 69 6e 74 65  backup_Init(inte
1e150 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
1e160 65 73 74 69 6e 74 61 72 72 61 79 5f 49 6e 69 74  estintarray_Init
1e170 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1e180 6c 69 74 65 74 65 73 74 76 66 73 5f 49 6e 69 74  litetestvfs_Init
1e190 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1e1a0 6c 69 74 65 74 65 73 74 72 74 72 65 65 5f 49 6e  litetestrtree_In
1e1b0 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1e1c0 53 71 6c 69 74 65 71 75 6f 74 61 5f 49 6e 69 74  Sqlitequota_Init
1e1d0 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1e1e0 6c 69 74 65 6d 75 6c 74 69 70 6c 65 78 5f 49 6e  litemultiplex_In
1e1f0 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1e200 53 71 6c 69 74 65 53 75 70 65 72 6c 6f 63 6b 5f  SqliteSuperlock_
1e210 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
1e220 20 20 53 71 6c 69 74 65 74 65 73 74 53 79 73 63    SqlitetestSysc
1e230 61 6c 6c 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  all_Init(interp)
1e240 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ;.#if defined(SQ
1e250 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53  LITE_ENABLE_SESS
1e260 49 4f 4e 29 20 26 26 20 64 65 66 69 6e 65 64 28  ION) && defined(
1e270 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52  SQLITE_ENABLE_PR
1e280 45 55 50 44 41 54 45 5f 48 4f 4f 4b 29 0a 20 20  EUPDATE_HOOK).  
1e290 20 20 54 65 73 74 53 65 73 73 69 6f 6e 5f 49 6e    TestSession_In
1e2a0 69 74 28 69 6e 74 65 72 70 29 3b 0a 23 65 6e 64  it(interp);.#end
1e2b0 69 66 0a 20 20 20 20 46 74 73 35 74 63 6c 5f 49  if.    Fts5tcl_I
1e2c0 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1e2d0 20 53 71 6c 69 74 65 52 62 75 5f 49 6e 69 74 28   SqliteRbu_Init(
1e2e0 69 6e 74 65 72 70 29 3b 0a 0a 23 69 66 20 64 65  interp);..#if de
1e2f0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
1e300 42 4c 45 5f 46 54 53 33 29 20 7c 7c 20 64 65 66  BLE_FTS3) || def
1e310 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
1e320 4c 45 5f 46 54 53 34 29 0a 20 20 20 20 53 71 6c  LE_FTS4).    Sql
1e330 69 74 65 74 65 73 74 66 74 73 33 5f 49 6e 69 74  itetestfts3_Init
1e340 28 69 6e 74 65 72 70 29 3b 0a 23 65 6e 64 69 66  (interp);.#endif
1e350 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  ..    Tcl_Create
1e360 4f 62 6a 43 6f 6d 6d 61 6e 64 28 0a 20 20 20 20  ObjCommand(.    
1e370 20 20 20 20 69 6e 74 65 72 70 2c 20 22 6c 6f 61      interp, "loa
1e380 64 5f 74 65 73 74 66 69 78 74 75 72 65 5f 65 78  d_testfixture_ex
1e390 74 65 6e 73 69 6f 6e 73 22 2c 20 69 6e 69 74 5f  tensions", init_
1e3a0 61 6c 6c 5f 63 6d 64 2c 20 30 2c 20 30 0a 20 20  all_cmd, 0, 0.  
1e3b0 20 20 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65    );.    Tcl_Cre
1e3c0 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 0a 20  ateObjCommand(. 
1e3d0 20 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20 22         interp, "
1e3e0 64 62 5f 75 73 65 5f 6c 65 67 61 63 79 5f 70 72  db_use_legacy_pr
1e3f0 65 70 61 72 65 22 2c 20 64 62 5f 75 73 65 5f 6c  epare", db_use_l
1e400 65 67 61 63 79 5f 70 72 65 70 61 72 65 5f 63 6d  egacy_prepare_cm
1e410 64 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20  d, 0, 0.    );. 
1e420 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
1e430 43 6f 6d 6d 61 6e 64 28 0a 20 20 20 20 20 20 20  Command(.       
1e440 20 69 6e 74 65 72 70 2c 20 22 64 62 5f 6c 61 73   interp, "db_las
1e450 74 5f 73 74 6d 74 5f 70 74 72 22 2c 20 64 62 5f  t_stmt_ptr", db_
1e460 6c 61 73 74 5f 73 74 6d 74 5f 70 74 72 2c 20 30  last_stmt_ptr, 0
1e470 2c 20 30 0a 20 20 20 20 29 3b 0a 0a 23 69 66 64  , 0.    );..#ifd
1e480 65 66 20 53 51 4c 49 54 45 5f 53 53 45 0a 20 20  ef SQLITE_SSE.  
1e490 20 20 53 71 6c 69 74 65 74 65 73 74 73 73 65 5f    Sqlitetestsse_
1e4a0 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 23 65  Init(interp);.#e
1e4b0 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ndif.  }.#endif.
1e4c0 7d 0a 0a 2f 2a 20 4e 65 65 64 65 64 20 66 6f 72  }../* Needed for
1e4d0 20 74 68 65 20 73 65 74 72 6c 69 6d 69 74 28 29   the setrlimit()
1e4e0 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6f 6e 20   system call on 
1e4f0 75 6e 69 78 20 2a 2f 0a 23 69 66 20 64 65 66 69  unix */.#if defi
1e500 6e 65 64 28 75 6e 69 78 29 0a 23 69 6e 63 6c 75  ned(unix).#inclu
1e510 64 65 20 3c 73 79 73 2f 72 65 73 6f 75 72 63 65  de <sys/resource
1e520 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66  .h>.#endif..#def
1e530 69 6e 65 20 54 43 4c 53 48 5f 4d 41 49 4e 20 6d  ine TCLSH_MAIN m
1e540 61 69 6e 20 20 20 2f 2a 20 4e 65 65 64 65 64 20  ain   /* Needed 
1e550 74 6f 20 66 61 6b 65 20 6f 75 74 20 6d 6b 74 63  to fake out mktc
1e560 6c 61 70 70 20 2a 2f 0a 69 6e 74 20 54 43 4c 53  lapp */.int TCLS
1e570 48 5f 4d 41 49 4e 28 69 6e 74 20 61 72 67 63 2c  H_MAIN(int argc,
1e580 20 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20   char **argv){. 
1e590 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1e5a0 65 72 70 3b 0a 0a 23 69 66 20 21 64 65 66 69 6e  erp;..#if !defin
1e5b0 65 64 28 5f 57 49 4e 33 32 5f 57 43 45 29 0a 20  ed(_WIN32_WCE). 
1e5c0 20 69 66 28 20 67 65 74 65 6e 76 28 22 42 52 45   if( getenv("BRE
1e5d0 41 4b 22 29 20 29 7b 0a 20 20 20 20 66 70 72 69  AK") ){.    fpri
1e5e0 6e 74 66 28 73 74 64 65 72 72 2c 0a 20 20 20 20  ntf(stderr,.    
1e5f0 20 20 20 20 22 61 74 74 61 63 68 20 64 65 62 75      "attach debu
1e600 67 67 65 72 20 74 6f 20 70 72 6f 63 65 73 73 20  gger to process 
1e610 25 64 20 61 6e 64 20 70 72 65 73 73 20 61 6e 79  %d and press any
1e620 20 6b 65 79 20 74 6f 20 63 6f 6e 74 69 6e 75 65   key to continue
1e630 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 47 45  .\n",.        GE
1e640 54 50 49 44 28 29 29 3b 0a 20 20 20 20 66 67 65  TPID());.    fge
1e650 74 63 28 73 74 64 69 6e 29 3b 0a 20 20 7d 0a 23  tc(stdin);.  }.#
1e660 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 69 6e 63  endif..  /* Sinc
1e670 65 20 74 68 65 20 70 72 69 6d 61 72 79 20 75 73  e the primary us
1e680 65 20 63 61 73 65 20 66 6f 72 20 74 68 69 73 20  e case for this 
1e690 62 69 6e 61 72 79 20 69 73 20 74 65 73 74 69 6e  binary is testin
1e6a0 67 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20 20 2a  g of SQLite,.  *
1e6b0 2a 20 62 65 20 73 75 72 65 20 74 6f 20 67 65 6e  * be sure to gen
1e6c0 65 72 61 74 65 20 63 6f 72 65 20 66 69 6c 65 73  erate core files
1e6d0 20 69 66 20 77 65 20 63 72 61 73 68 20 2a 2f 0a   if we crash */.
1e6e0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
1e6f0 54 45 5f 54 45 53 54 29 20 26 26 20 64 65 66 69  TE_TEST) && defi
1e700 6e 65 64 28 75 6e 69 78 29 0a 20 20 7b 20 73 74  ned(unix).  { st
1e710 72 75 63 74 20 72 6c 69 6d 69 74 20 78 3b 0a 20  ruct rlimit x;. 
1e720 20 20 20 67 65 74 72 6c 69 6d 69 74 28 52 4c 49     getrlimit(RLI
1e730 4d 49 54 5f 43 4f 52 45 2c 20 26 78 29 3b 0a 20  MIT_CORE, &x);. 
1e740 20 20 20 78 2e 72 6c 69 6d 5f 63 75 72 20 3d 20     x.rlim_cur = 
1e750 78 2e 72 6c 69 6d 5f 6d 61 78 3b 0a 20 20 20 20  x.rlim_max;.    
1e760 73 65 74 72 6c 69 6d 69 74 28 52 4c 49 4d 49 54  setrlimit(RLIMIT
1e770 5f 43 4f 52 45 2c 20 26 78 29 3b 0a 20 20 7d 0a  _CORE, &x);.  }.
1e780 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1e790 5f 54 45 53 54 20 26 26 20 75 6e 69 78 20 2a 2f  _TEST && unix */
1e7a0 0a 0a 0a 20 20 2f 2a 20 43 61 6c 6c 20 73 71 6c  ...  /* Call sql
1e7b0 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 29 20  ite3_shutdown() 
1e7c0 6f 6e 63 65 20 62 65 66 6f 72 65 20 64 6f 69 6e  once before doin
1e7d0 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 2e  g anything else.
1e7e0 20 54 68 69 73 20 69 73 20 74 6f 0a 20 20 2a 2a   This is to.  **
1e7f0 20 74 65 73 74 20 74 68 61 74 20 73 71 6c 69 74   test that sqlit
1e800 65 33 5f 73 68 75 74 64 6f 77 6e 28 29 20 63 61  e3_shutdown() ca
1e810 6e 20 62 65 20 73 61 66 65 6c 79 20 63 61 6c 6c  n be safely call
1e820 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20  ed by a process 
1e830 62 65 66 6f 72 65 0a 20 20 2a 2a 20 73 71 6c 69  before.  ** sqli
1e840 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
1e850 20 69 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65   is. */.  sqlite
1e860 33 5f 73 68 75 74 64 6f 77 6e 28 29 3b 0a 0a 20  3_shutdown();.. 
1e870 20 54 63 6c 5f 46 69 6e 64 45 78 65 63 75 74 61   Tcl_FindExecuta
1e880 62 6c 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ble(argv[0]);.  
1e890 54 63 6c 5f 53 65 74 53 79 73 74 65 6d 45 6e 63  Tcl_SetSystemEnc
1e8a0 6f 64 69 6e 67 28 4e 55 4c 4c 2c 20 22 75 74 66  oding(NULL, "utf
1e8b0 2d 38 22 29 3b 0a 20 20 69 6e 74 65 72 70 20 3d  -8");.  interp =
1e8c0 20 54 63 6c 5f 43 72 65 61 74 65 49 6e 74 65 72   Tcl_CreateInter
1e8d0 70 28 29 3b 0a 0a 23 69 66 20 54 43 4c 53 48 3d  p();..#if TCLSH=
1e8e0 3d 32 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  =2.  sqlite3_con
1e8f0 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49  fig(SQLITE_CONFI
1e900 47 5f 53 49 4e 47 4c 45 54 48 52 45 41 44 29 3b  G_SINGLETHREAD);
1e910 0a 23 65 6e 64 69 66 0a 0a 20 20 69 6e 69 74 5f  .#endif..  init_
1e920 61 6c 6c 28 69 6e 74 65 72 70 29 3b 0a 20 20 69  all(interp);.  i
1e930 66 28 20 61 72 67 63 3e 3d 32 20 29 7b 0a 20 20  f( argc>=2 ){.  
1e940 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 68 61    int i;.    cha
1e950 72 20 7a 41 72 67 63 5b 33 32 5d 3b 0a 20 20 20  r zArgc[32];.   
1e960 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
1e970 66 28 73 69 7a 65 6f 66 28 7a 41 72 67 63 29 2c  f(sizeof(zArgc),
1e980 20 7a 41 72 67 63 2c 20 22 25 64 22 2c 20 61 72   zArgc, "%d", ar
1e990 67 63 2d 28 33 2d 54 43 4c 53 48 29 29 3b 0a 20  gc-(3-TCLSH));. 
1e9a0 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e     Tcl_SetVar(in
1e9b0 74 65 72 70 2c 22 61 72 67 63 22 2c 20 7a 41 72  terp,"argc", zAr
1e9c0 67 63 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f  gc, TCL_GLOBAL_O
1e9d0 4e 4c 59 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  NLY);.    Tcl_Se
1e9e0 74 56 61 72 28 69 6e 74 65 72 70 2c 22 61 72 67  tVar(interp,"arg
1e9f0 76 30 22 2c 61 72 67 76 5b 31 5d 2c 54 43 4c 5f  v0",argv[1],TCL_
1ea00 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20  GLOBAL_ONLY);.  
1ea10 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74    Tcl_SetVar(int
1ea20 65 72 70 2c 22 61 72 67 76 22 2c 20 22 22 2c 20  erp,"argv", "", 
1ea30 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29  TCL_GLOBAL_ONLY)
1ea40 3b 0a 20 20 20 20 66 6f 72 28 69 3d 33 2d 54 43  ;.    for(i=3-TC
1ea50 4c 53 48 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b  LSH; i<argc; i++
1ea60 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  ){.      Tcl_Set
1ea70 56 61 72 28 69 6e 74 65 72 70 2c 20 22 61 72 67  Var(interp, "arg
1ea80 76 22 2c 20 61 72 67 76 5b 69 5d 2c 0a 20 20 20  v", argv[i],.   
1ea90 20 20 20 20 20 20 20 54 43 4c 5f 47 4c 4f 42 41         TCL_GLOBA
1eaa0 4c 5f 4f 4e 4c 59 20 7c 20 54 43 4c 5f 4c 49 53  L_ONLY | TCL_LIS
1eab0 54 5f 45 4c 45 4d 45 4e 54 20 7c 20 54 43 4c 5f  T_ELEMENT | TCL_
1eac0 41 50 50 45 4e 44 5f 56 41 4c 55 45 29 3b 0a 20  APPEND_VALUE);. 
1ead0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 54 43 4c     }.    if( TCL
1eae0 53 48 3d 3d 31 20 26 26 20 54 63 6c 5f 45 76 61  SH==1 && Tcl_Eva
1eaf0 6c 46 69 6c 65 28 69 6e 74 65 72 70 2c 20 61 72  lFile(interp, ar
1eb00 67 76 5b 31 5d 29 21 3d 54 43 4c 5f 4f 4b 20 29  gv[1])!=TCL_OK )
1eb10 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
1eb20 61 72 20 2a 7a 49 6e 66 6f 20 3d 20 54 63 6c 5f  ar *zInfo = Tcl_
1eb30 47 65 74 56 61 72 28 69 6e 74 65 72 70 2c 20 22  GetVar(interp, "
1eb40 65 72 72 6f 72 49 6e 66 6f 22 2c 20 54 43 4c 5f  errorInfo", TCL_
1eb50 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20  GLOBAL_ONLY);.  
1eb60 20 20 20 20 69 66 28 20 7a 49 6e 66 6f 3d 3d 30      if( zInfo==0
1eb70 20 29 20 7a 49 6e 66 6f 20 3d 20 54 63 6c 5f 47   ) zInfo = Tcl_G
1eb80 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 69  etStringResult(i
1eb90 6e 74 65 72 70 29 3b 0a 20 20 20 20 20 20 66 70  nterp);.      fp
1eba0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25 73  rintf(stderr,"%s
1ebb0 3a 20 25 73 5c 6e 22 2c 20 2a 61 72 67 76 2c 20  : %s\n", *argv, 
1ebc0 7a 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 72 65  zInfo);.      re
1ebd0 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1ebe0 7d 0a 20 20 69 66 28 20 54 43 4c 53 48 3d 3d 32  }.  if( TCLSH==2
1ebf0 20 7c 7c 20 61 72 67 63 3c 3d 31 20 29 7b 0a 20   || argc<=1 ){. 
1ec00 20 20 20 54 63 6c 5f 47 6c 6f 62 61 6c 45 76 61     Tcl_GlobalEva
1ec10 6c 28 69 6e 74 65 72 70 2c 20 74 63 6c 73 68 5f  l(interp, tclsh_
1ec20 6d 61 69 6e 5f 6c 6f 6f 70 28 29 29 3b 0a 20 20  main_loop());.  
1ec30 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
1ec40 23 65 6e 64 69 66 20 2f 2a 20 54 43 4c 53 48 20  #endif /* TCLSH 
1ec50 2a 2f 0a                                         */.