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

Artifact 6c2151b6d8d98e183a04466d40df8889c0574d79:


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 20 69 6e  UDE_MSVC_H).# in
04b0: 63 6c 75 64 65 20 22 6d 73 76 63 2e 68 22 0a 23  clude "msvc.h".#
04c0: 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e  endif..#if defin
04d0: 65 64 28 49 4e 43 4c 55 44 45 5f 53 51 4c 49 54  ed(INCLUDE_SQLIT
04e0: 45 5f 54 43 4c 5f 48 29 0a 23 20 69 6e 63 6c 75  E_TCL_H).# inclu
04f0: 64 65 20 22 73 71 6c 69 74 65 5f 74 63 6c 2e 68  de "sqlite_tcl.h
0500: 22 0a 23 65 6c 73 65 0a 23 20 69 6e 63 6c 75 64  ".#else.# includ
0510: 65 20 22 74 63 6c 2e 68 22 0a 23 20 69 66 6e 64  e "tcl.h".# ifnd
0520: 65 66 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  ef SQLITE_TCLAPI
0530: 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54  .#  define SQLIT
0540: 45 5f 54 43 4c 41 50 49 0a 23 20 65 6e 64 69 66  E_TCLAPI.# endif
0550: 0a 23 65 6e 64 69 66 0a 23 69 6e 63 6c 75 64 65  .#endif.#include
0560: 20 3c 65 72 72 6e 6f 2e 68 3e 0a 0a 2f 2a 0a 2a   <errno.h>../*.*
0570: 2a 20 53 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61  * Some additiona
0580: 6c 20 69 6e 63 6c 75 64 65 20 66 69 6c 65 73 20  l include files 
0590: 61 72 65 20 6e 65 65 64 65 64 20 69 66 20 74 68  are needed if th
05a0: 69 73 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 2a  is file is not.*
05b0: 2a 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  * appended to th
05c0: 65 20 61 6d 61 6c 67 61 6d 61 74 69 6f 6e 2e 0a  e amalgamation..
05d0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
05e0: 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 0a 23  E_AMALGAMATION.#
05f0: 20 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65   include "sqlite
0600: 33 2e 68 22 0a 23 20 69 6e 63 6c 75 64 65 20 3c  3.h".# include <
0610: 73 74 64 6c 69 62 2e 68 3e 0a 23 20 69 6e 63 6c  stdlib.h>.# incl
0620: 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23  ude <string.h>.#
0630: 20 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74   include <assert
0640: 2e 68 3e 0a 20 20 74 79 70 65 64 65 66 20 75 6e  .h>.  typedef un
0650: 73 69 67 6e 65 64 20 63 68 61 72 20 75 38 3b 0a  signed char u8;.
0660: 23 65 6e 64 69 66 0a 23 69 6e 63 6c 75 64 65 20  #endif.#include 
0670: 3c 63 74 79 70 65 2e 68 3e 0a 0a 2f 2a 20 55 73  <ctype.h>../* Us
0680: 65 64 20 74 6f 20 67 65 74 20 74 68 65 20 63 75  ed to get the cu
0690: 72 72 65 6e 74 20 70 72 6f 63 65 73 73 20 49 44  rrent process ID
06a0: 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64   */.#if !defined
06b0: 28 5f 57 49 4e 33 32 29 0a 23 20 69 6e 63 6c 75  (_WIN32).# inclu
06c0: 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 20  de <unistd.h>.# 
06d0: 64 65 66 69 6e 65 20 47 45 54 50 49 44 20 67 65  define GETPID ge
06e0: 74 70 69 64 0a 23 65 6c 69 66 20 21 64 65 66 69  tpid.#elif !defi
06f0: 6e 65 64 28 5f 57 49 4e 33 32 5f 57 43 45 29 0a  ned(_WIN32_WCE).
0700: 23 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  # ifndef SQLITE_
0710: 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 0a 23 20 20  AMALGAMATION.#  
0720: 64 65 66 69 6e 65 20 57 49 4e 33 32 5f 4c 45 41  define WIN32_LEA
0730: 4e 5f 41 4e 44 5f 4d 45 41 4e 0a 23 20 20 69 6e  N_AND_MEAN.#  in
0740: 63 6c 75 64 65 20 3c 77 69 6e 64 6f 77 73 2e 68  clude <windows.h
0750: 3e 0a 23 20 65 6e 64 69 66 0a 23 20 64 65 66 69  >.# endif.# defi
0760: 6e 65 20 47 45 54 50 49 44 20 28 69 6e 74 29 47  ne GETPID (int)G
0770: 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
0780: 49 64 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a  Id.#endif../*. *
0790: 20 57 69 6e 64 6f 77 73 20 6e 65 65 64 73 20 74   Windows needs t
07a0: 6f 20 6b 6e 6f 77 20 77 68 69 63 68 20 73 79 6d  o know which sym
07b0: 62 6f 6c 73 20 74 6f 20 65 78 70 6f 72 74 2e 20  bols to export. 
07c0: 20 55 6e 69 78 20 64 6f 65 73 20 6e 6f 74 2e 0a   Unix does not..
07d0: 20 2a 20 42 55 49 4c 44 5f 73 71 6c 69 74 65 20   * BUILD_sqlite 
07e0: 73 68 6f 75 6c 64 20 62 65 20 75 6e 64 65 66 69  should be undefi
07f0: 6e 65 64 20 66 6f 72 20 55 6e 69 78 2e 0a 20 2a  ned for Unix.. *
0800: 2f 0a 23 69 66 64 65 66 20 42 55 49 4c 44 5f 73  /.#ifdef BUILD_s
0810: 71 6c 69 74 65 0a 23 75 6e 64 65 66 20 54 43 4c  qlite.#undef TCL
0820: 5f 53 54 4f 52 41 47 45 5f 43 4c 41 53 53 0a 23  _STORAGE_CLASS.#
0830: 64 65 66 69 6e 65 20 54 43 4c 5f 53 54 4f 52 41  define TCL_STORA
0840: 47 45 5f 43 4c 41 53 53 20 44 4c 4c 45 58 50 4f  GE_CLASS DLLEXPO
0850: 52 54 0a 23 65 6e 64 69 66 20 2f 2a 20 42 55 49  RT.#endif /* BUI
0860: 4c 44 5f 73 71 6c 69 74 65 20 2a 2f 0a 0a 23 64  LD_sqlite */..#d
0870: 65 66 69 6e 65 20 4e 55 4d 5f 50 52 45 50 41 52  efine NUM_PREPAR
0880: 45 44 5f 53 54 4d 54 53 20 31 30 0a 23 64 65 66  ED_STMTS 10.#def
0890: 69 6e 65 20 4d 41 58 5f 50 52 45 50 41 52 45 44  ine MAX_PREPARED
08a0: 5f 53 54 4d 54 53 20 31 30 30 0a 0a 2f 2a 20 46  _STMTS 100../* F
08b0: 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
08c0: 6f 6e 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  on */.typedef st
08d0: 72 75 63 74 20 53 71 6c 69 74 65 44 62 20 53 71  ruct SqliteDb Sq
08e0: 6c 69 74 65 44 62 3b 0a 0a 2f 2a 0a 2a 2a 20 4e  liteDb;../*.** N
08f0: 65 77 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73  ew SQL functions
0900: 20 63 61 6e 20 62 65 20 63 72 65 61 74 65 64 20   can be created 
0910: 61 73 20 54 43 4c 20 73 63 72 69 70 74 73 2e 20  as TCL scripts. 
0920: 20 45 61 63 68 20 73 75 63 68 20 66 75 6e 63 74   Each such funct
0930: 69 6f 6e 0a 2a 2a 20 69 73 20 64 65 73 63 72 69  ion.** is descri
0940: 62 65 64 20 62 79 20 61 6e 20 69 6e 73 74 61 6e  bed by an instan
0950: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
0960: 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ing structure..*
0970: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
0980: 20 53 71 6c 46 75 6e 63 20 53 71 6c 46 75 6e 63   SqlFunc SqlFunc
0990: 3b 0a 73 74 72 75 63 74 20 53 71 6c 46 75 6e 63  ;.struct SqlFunc
09a0: 20 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20   {.  Tcl_Interp 
09b0: 2a 69 6e 74 65 72 70 3b 20 20 20 2f 2a 20 54 68  *interp;   /* Th
09c0: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 20  e TCL interpret 
09d0: 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 20 66  to execute the f
09e0: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
09f0: 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 20 20  _Obj *pScript;  
0a00: 20 20 20 2f 2a 20 54 68 65 20 54 63 6c 5f 4f 62     /* The Tcl_Ob
0a10: 6a 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  j representation
0a20: 20 6f 66 20 74 68 65 20 73 63 72 69 70 74 20 2a   of the script *
0a30: 2f 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  /.  SqliteDb *pD
0a40: 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74  b;        /* Dat
0a50: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
0a60: 20 74 68 61 74 20 6f 77 6e 73 20 74 68 69 73 20   that owns this 
0a70: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  function */.  in
0a80: 74 20 75 73 65 45 76 61 6c 4f 62 6a 76 3b 20 20  t useEvalObjv;  
0a90: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69      /* True if i
0aa0: 74 20 69 73 20 73 61 66 65 20 74 6f 20 75 73 65  t is safe to use
0ab0: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 20 2a 2f   Tcl_EvalObjv */
0ac0: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20  .  char *zName; 
0ad0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
0ae0: 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
0af0: 6e 20 2a 2f 0a 20 20 53 71 6c 46 75 6e 63 20 2a  n */.  SqlFunc *
0b00: 70 4e 65 78 74 3b 20 20 20 20 20 20 20 2f 2a 20  pNext;       /* 
0b10: 4e 65 78 74 20 66 75 6e 63 74 69 6f 6e 20 6f 6e  Next function on
0b20: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 74 68 65   the list of the
0b30: 6d 20 61 6c 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  m all */.};../*.
0b40: 2a 2a 20 4e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e  ** New collation
0b50: 20 73 65 71 75 65 6e 63 65 73 20 66 75 6e 63 74   sequences funct
0b60: 69 6f 6e 20 63 61 6e 20 62 65 20 63 72 65 61 74  ion can be creat
0b70: 65 64 20 61 73 20 54 43 4c 20 73 63 72 69 70 74  ed as TCL script
0b80: 73 2e 20 20 45 61 63 68 20 73 75 63 68 0a 2a 2a  s.  Each such.**
0b90: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 64 65 73   function is des
0ba0: 63 72 69 62 65 64 20 62 79 20 61 6e 20 69 6e 73  cribed by an ins
0bb0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
0bc0: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
0bd0: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
0be0: 75 63 74 20 53 71 6c 43 6f 6c 6c 61 74 65 20 53  uct SqlCollate S
0bf0: 71 6c 43 6f 6c 6c 61 74 65 3b 0a 73 74 72 75 63  qlCollate;.struc
0c00: 74 20 53 71 6c 43 6f 6c 6c 61 74 65 20 7b 0a 20  t SqlCollate {. 
0c10: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
0c20: 65 72 70 3b 20 20 20 2f 2a 20 54 68 65 20 54 43  erp;   /* The TC
0c30: 4c 20 69 6e 74 65 72 70 72 65 74 20 74 6f 20 65  L interpret to e
0c40: 78 65 63 75 74 65 20 74 68 65 20 66 75 6e 63 74  xecute the funct
0c50: 69 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ion */.  char *z
0c60: 53 63 72 69 70 74 3b 20 20 20 20 20 20 20 20 2f  Script;        /
0c70: 2a 20 54 68 65 20 73 63 72 69 70 74 20 74 6f 20  * The script to 
0c80: 62 65 20 72 75 6e 20 2a 2f 0a 20 20 53 71 6c 43  be run */.  SqlC
0c90: 6f 6c 6c 61 74 65 20 2a 70 4e 65 78 74 3b 20 20  ollate *pNext;  
0ca0: 20 20 2f 2a 20 4e 65 78 74 20 66 75 6e 63 74 69    /* Next functi
0cb0: 6f 6e 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 6f  on on the list o
0cc0: 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 7d 3b  f them all */.};
0cd0: 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 64  ../*.** Prepared
0ce0: 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20   statements are 
0cf0: 63 61 63 68 65 64 20 66 6f 72 20 66 61 73 74 65  cached for faste
0d00: 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 45 61  r execution.  Ea
0d10: 63 68 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73  ch prepared.** s
0d20: 74 61 74 65 6d 65 6e 74 20 69 73 20 64 65 73 63  tatement is desc
0d30: 72 69 62 65 64 20 62 79 20 61 6e 20 69 6e 73 74  ribed by an inst
0d40: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
0d50: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e  owing structure.
0d60: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
0d70: 63 74 20 53 71 6c 50 72 65 70 61 72 65 64 53 74  ct SqlPreparedSt
0d80: 6d 74 20 53 71 6c 50 72 65 70 61 72 65 64 53 74  mt SqlPreparedSt
0d90: 6d 74 3b 0a 73 74 72 75 63 74 20 53 71 6c 50 72  mt;.struct SqlPr
0da0: 65 70 61 72 65 64 53 74 6d 74 20 7b 0a 20 20 53  eparedStmt {.  S
0db0: 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a  qlPreparedStmt *
0dc0: 70 4e 65 78 74 3b 20 20 2f 2a 20 4e 65 78 74 20  pNext;  /* Next 
0dd0: 69 6e 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 2a  in linked list *
0de0: 2f 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64 53  /.  SqlPreparedS
0df0: 74 6d 74 20 2a 70 50 72 65 76 3b 20 20 2f 2a 20  tmt *pPrev;  /* 
0e00: 50 72 65 76 69 6f 75 73 20 6f 6e 20 74 68 65 20  Previous on the 
0e10: 6c 69 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  list */.  sqlite
0e20: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20  3_stmt *pStmt;  
0e30: 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72     /* The prepar
0e40: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  ed statement */.
0e50: 20 20 69 6e 74 20 6e 53 71 6c 3b 20 20 20 20 20    int nSql;     
0e60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 68             /* ch
0e70: 61 72 73 20 69 6e 20 7a 53 71 6c 5b 5d 20 2a 2f  ars in zSql[] */
0e80: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
0e90: 53 71 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  Sql;        /* T
0ea0: 65 78 74 20 6f 66 20 74 68 65 20 53 51 4c 20 73  ext of the SQL s
0eb0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
0ec0: 74 20 6e 50 61 72 6d 3b 20 20 20 20 20 20 20 20  t nParm;        
0ed0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
0ee0: 66 20 61 70 50 61 72 6d 20 61 72 72 61 79 20 2a  f apParm array *
0ef0: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70  /.  Tcl_Obj **ap
0f00: 50 61 72 6d 3b 20 20 20 20 20 20 20 20 2f 2a 20  Parm;        /* 
0f10: 41 72 72 61 79 20 6f 66 20 72 65 66 65 72 65 6e  Array of referen
0f20: 63 65 64 20 6f 62 6a 65 63 74 20 70 6f 69 6e 74  ced object point
0f30: 65 72 73 20 2a 2f 0a 7d 3b 0a 0a 74 79 70 65 64  ers */.};..typed
0f40: 65 66 20 73 74 72 75 63 74 20 49 6e 63 72 62 6c  ef struct Incrbl
0f50: 6f 62 43 68 61 6e 6e 65 6c 20 49 6e 63 72 62 6c  obChannel Incrbl
0f60: 6f 62 43 68 61 6e 6e 65 6c 3b 0a 0a 2f 2a 0a 2a  obChannel;../*.*
0f70: 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69  * There is one i
0f80: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
0f90: 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 61  structure for ea
0fa0: 63 68 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ch SQLite databa
0fb0: 73 65 0a 2a 2a 20 74 68 61 74 20 68 61 73 20 62  se.** that has b
0fc0: 65 65 6e 20 6f 70 65 6e 65 64 20 62 79 20 74 68  een opened by th
0fd0: 65 20 53 51 4c 69 74 65 20 54 43 4c 20 69 6e 74  e SQLite TCL int
0fe0: 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  erface..**.** If
0ff0: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 69 73 20   this module is 
1000: 62 75 69 6c 74 20 77 69 74 68 20 53 51 4c 49 54  built with SQLIT
1010: 45 5f 54 45 53 54 20 64 65 66 69 6e 65 64 20 28  E_TEST defined (
1020: 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 53 51  to create the SQ
1030: 4c 69 74 65 0a 2a 2a 20 74 65 73 74 66 69 78 74  Lite.** testfixt
1040: 75 72 65 20 65 78 65 63 75 74 61 62 6c 65 29 2c  ure executable),
1050: 20 74 68 65 6e 20 69 74 20 6d 61 79 20 62 65 20   then it may be 
1060: 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73  configured to us
1070: 65 20 65 69 74 68 65 72 0a 2a 2a 20 73 71 6c 69  e either.** sqli
1080: 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 29  te3_prepare_v2()
1090: 20 6f 72 20 73 71 6c 69 74 65 33 5f 70 72 65 70   or sqlite3_prep
10a0: 61 72 65 28 29 20 74 6f 20 70 72 65 70 61 72 65  are() to prepare
10b0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e   SQL statements.
10c0: 0a 2a 2a 20 49 66 20 53 71 6c 69 74 65 44 62 2e  .** If SqliteDb.
10d0: 62 4c 65 67 61 63 79 50 72 65 70 61 72 65 20 69  bLegacyPrepare i
10e0: 73 20 74 72 75 65 2c 20 73 71 6c 69 74 65 33 5f  s true, sqlite3_
10f0: 70 72 65 70 61 72 65 28 29 20 69 73 20 75 73 65  prepare() is use
1100: 64 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53 71 6c  d..*/.struct Sql
1110: 69 74 65 44 62 20 7b 0a 20 20 73 71 6c 69 74 65  iteDb {.  sqlite
1120: 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
1130: 20 20 20 20 20 2f 2a 20 54 68 65 20 22 72 65 61       /* The "rea
1140: 6c 22 20 64 61 74 61 62 61 73 65 20 73 74 72 75  l" database stru
1150: 63 74 75 72 65 2e 20 4d 55 53 54 20 42 45 20 46  cture. MUST BE F
1160: 49 52 53 54 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  IRST */.  Tcl_In
1170: 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 20 20 20  terp *interp;   
1180: 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 74 65       /* The inte
1190: 72 70 72 65 74 65 72 20 75 73 65 64 20 66 6f 72  rpreter used for
11a0: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a   this database *
11b0: 2f 0a 20 20 63 68 61 72 20 2a 7a 42 75 73 79 3b  /.  char *zBusy;
11c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11d0: 2a 20 54 68 65 20 62 75 73 79 20 63 61 6c 6c 62  * The busy callb
11e0: 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  ack routine */. 
11f0: 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 20   char *zCommit; 
1200: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1210: 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 63  he commit hook c
1220: 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20  allback routine 
1230: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 72 61 63  */.  char *zTrac
1240: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1250: 2f 2a 20 54 68 65 20 74 72 61 63 65 20 63 61 6c  /* The trace 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 54 72 61 63 65 56  .  char *zTraceV
1280: 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  2;            /*
1290: 20 54 68 65 20 74 72 61 63 65 5f 76 32 20 63 61   The trace_v2 ca
12a0: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a  llback routine *
12b0: 2f 0a 20 20 63 68 61 72 20 2a 7a 50 72 6f 66 69  /.  char *zProfi
12c0: 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  le;            /
12d0: 2a 20 54 68 65 20 70 72 6f 66 69 6c 65 20 63 61  * The profile ca
12e0: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a  llback routine *
12f0: 2f 0a 20 20 63 68 61 72 20 2a 7a 50 72 6f 67 72  /.  char *zProgr
1300: 65 73 73 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ess;           /
1310: 2a 20 54 68 65 20 70 72 6f 67 72 65 73 73 20 63  * The progress c
1320: 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20  allback routine 
1330: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41 75 74 68  */.  char *zAuth
1340: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1350: 2f 2a 20 54 68 65 20 61 75 74 68 6f 72 69 7a 61  /* The authoriza
1360: 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 20 72 6f  tion callback ro
1370: 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 64  utine */.  int d
1380: 69 73 61 62 6c 65 41 75 74 68 3b 20 20 20 20 20  isableAuth;     
1390: 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65        /* Disable
13a0: 20 74 68 65 20 61 75 74 68 6f 72 69 7a 65 72 20   the authorizer 
13b0: 69 66 20 69 74 20 65 78 69 73 74 73 20 2a 2f 0a  if it exists */.
13c0: 20 20 63 68 61 72 20 2a 7a 4e 75 6c 6c 3b 20 20    char *zNull;  
13d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13e0: 54 65 78 74 20 74 6f 20 73 75 62 73 74 69 74 75  Text to substitu
13f0: 74 65 20 66 6f 72 20 61 6e 20 53 51 4c 20 4e 55  te for an SQL NU
1400: 4c 4c 20 76 61 6c 75 65 20 2a 2f 0a 20 20 53 71  LL value */.  Sq
1410: 6c 46 75 6e 63 20 2a 70 46 75 6e 63 3b 20 20 20  lFunc *pFunc;   
1420: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
1430: 20 6f 66 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e   of SQL function
1440: 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
1450: 70 55 70 64 61 74 65 48 6f 6f 6b 3b 20 20 20 20  pUpdateHook;    
1460: 20 20 2f 2a 20 55 70 64 61 74 65 20 68 6f 6f 6b    /* Update hook
1470: 20 73 63 72 69 70 74 20 28 69 66 20 61 6e 79 29   script (if any)
1480: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70   */.  Tcl_Obj *p
1490: 50 72 65 55 70 64 61 74 65 48 6f 6f 6b 3b 20 20  PreUpdateHook;  
14a0: 20 2f 2a 20 50 72 65 2d 75 70 64 61 74 65 20 68   /* Pre-update h
14b0: 6f 6f 6b 20 73 63 72 69 70 74 20 28 69 66 20 61  ook script (if a
14c0: 6e 79 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  ny) */.  Tcl_Obj
14d0: 20 2a 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3b   *pRollbackHook;
14e0: 20 20 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20      /* Rollback 
14f0: 68 6f 6f 6b 20 73 63 72 69 70 74 20 28 69 66 20  hook script (if 
1500: 61 6e 79 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  any) */.  Tcl_Ob
1510: 6a 20 2a 70 57 61 6c 48 6f 6f 6b 3b 20 20 20 20  j *pWalHook;    
1520: 20 20 20 20 20 2f 2a 20 57 41 4c 20 68 6f 6f 6b       /* WAL hook
1530: 20 73 63 72 69 70 74 20 28 69 66 20 61 6e 79 29   script (if any)
1540: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70   */.  Tcl_Obj *p
1550: 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 3b 20 20 20  UnlockNotify;   
1560: 20 2f 2a 20 55 6e 6c 6f 63 6b 20 6e 6f 74 69 66   /* Unlock notif
1570: 79 20 73 63 72 69 70 74 20 28 69 66 20 61 6e 79  y script (if any
1580: 29 20 2a 2f 0a 20 20 53 71 6c 43 6f 6c 6c 61 74  ) */.  SqlCollat
1590: 65 20 2a 70 43 6f 6c 6c 61 74 65 3b 20 20 20 20  e *pCollate;    
15a0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 53 51 4c    /* List of SQL
15b0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74   collation funct
15c0: 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ions */.  int rc
15d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15e0: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
15f0: 6f 64 65 20 6f 66 20 6d 6f 73 74 20 72 65 63 65  ode of most rece
1600: 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  nt sqlite3_exec(
1610: 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  ) */.  Tcl_Obj *
1620: 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 3b 20  pCollateNeeded; 
1630: 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 6e    /* Collation n
1640: 65 65 64 65 64 20 73 63 72 69 70 74 20 2a 2f 0a  eeded script */.
1650: 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d    SqlPreparedStm
1660: 74 20 2a 73 74 6d 74 4c 69 73 74 3b 20 2f 2a 20  t *stmtList; /* 
1670: 4c 69 73 74 20 6f 66 20 70 72 65 70 61 72 65 64  List of prepared
1680: 20 73 74 61 74 65 6d 65 6e 74 73 2a 2f 0a 20 20   statements*/.  
1690: 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20  SqlPreparedStmt 
16a0: 2a 73 74 6d 74 4c 61 73 74 3b 20 2f 2a 20 4c 61  *stmtLast; /* La
16b0: 73 74 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  st statement in 
16c0: 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e  the list */.  in
16d0: 74 20 6d 61 78 53 74 6d 74 3b 20 20 20 20 20 20  t maxStmt;      
16e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
16f0: 6e 65 78 74 20 6d 61 78 69 6d 75 6d 20 6e 75 6d  next maximum num
1700: 62 65 72 20 6f 66 20 73 74 6d 74 4c 69 73 74 20  ber of stmtList 
1710: 2a 2f 0a 20 20 69 6e 74 20 6e 53 74 6d 74 3b 20  */.  int nStmt; 
1720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1730: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 74 61  /* Number of sta
1740: 74 65 6d 65 6e 74 73 20 69 6e 20 73 74 6d 74 4c  tements in stmtL
1750: 69 73 74 20 2a 2f 0a 20 20 49 6e 63 72 62 6c 6f  ist */.  Incrblo
1760: 62 43 68 61 6e 6e 65 6c 20 2a 70 49 6e 63 72 62  bChannel *pIncrb
1770: 6c 6f 62 3b 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69  lob;/* Linked li
1780: 73 74 20 6f 66 20 6f 70 65 6e 20 69 6e 63 72 62  st of open incrb
1790: 6c 6f 62 20 63 68 61 6e 6e 65 6c 73 20 2a 2f 0a  lob channels */.
17a0: 20 20 69 6e 74 20 6e 53 74 65 70 2c 20 6e 53 6f    int nStep, nSo
17b0: 72 74 2c 20 6e 49 6e 64 65 78 3b 20 20 2f 2a 20  rt, nIndex;  /* 
17c0: 53 74 61 74 69 73 74 69 63 73 20 66 6f 72 20 6d  Statistics for m
17d0: 6f 73 74 20 72 65 63 65 6e 74 20 6f 70 65 72 61  ost recent opera
17e0: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  tion */.  int nT
17f0: 72 61 6e 73 61 63 74 69 6f 6e 3b 20 20 20 20 20  ransaction;     
1800: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1810: 66 20 6e 65 73 74 65 64 20 5b 74 72 61 6e 73 61  f nested [transa
1820: 63 74 69 6f 6e 5d 20 6d 65 74 68 6f 64 73 20 2a  ction] methods *
1830: 2f 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67  /.  int openFlag
1840: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  s;             /
1850: 2a 20 46 6c 61 67 73 20 75 73 65 64 20 74 6f 20  * Flags used to 
1860: 6f 70 65 6e 2e 20 20 28 53 51 4c 49 54 45 5f 4f  open.  (SQLITE_O
1870: 50 45 4e 5f 55 52 49 29 20 2a 2f 0a 23 69 66 64  PEN_URI) */.#ifd
1880: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
1890: 20 69 6e 74 20 62 4c 65 67 61 63 79 50 72 65 70   int bLegacyPrep
18a0: 61 72 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  are;        /* T
18b0: 72 75 65 20 74 6f 20 75 73 65 20 73 71 6c 69 74  rue to use sqlit
18c0: 65 33 5f 70 72 65 70 61 72 65 28 29 20 2a 2f 0a  e3_prepare() */.
18d0: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 73 74 72 75 63  #endif.};..struc
18e0: 74 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65  t IncrblobChanne
18f0: 6c 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c  l {.  sqlite3_bl
1900: 6f 62 20 2a 70 42 6c 6f 62 3b 20 20 20 20 20 20  ob *pBlob;      
1910: 2f 2a 20 73 71 6c 69 74 65 33 20 62 6c 6f 62 20  /* sqlite3 blob 
1920: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 53 71 6c 69  handle */.  Sqli
1930: 74 65 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20  teDb *pDb;      
1940: 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61        /* Associa
1950: 74 65 64 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ted database con
1960: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
1970: 20 69 53 65 65 6b 3b 20 20 20 20 20 20 20 20 20   iSeek;         
1980: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
1990: 74 20 73 65 65 6b 20 6f 66 66 73 65 74 20 2a 2f  t seek offset */
19a0: 0a 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63  .  Tcl_Channel c
19b0: 68 61 6e 6e 65 6c 3b 20 20 20 20 20 20 2f 2a 20  hannel;      /* 
19c0: 43 68 61 6e 6e 65 6c 20 69 64 65 6e 74 69 66 69  Channel identifi
19d0: 65 72 20 2a 2f 0a 20 20 49 6e 63 72 62 6c 6f 62  er */.  Incrblob
19e0: 43 68 61 6e 6e 65 6c 20 2a 70 4e 65 78 74 3b 20  Channel *pNext; 
19f0: 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74    /* Linked list
1a00: 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 69 6e 63   of all open inc
1a10: 72 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 73 20 2a  rblob channels *
1a20: 2f 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e  /.  IncrblobChan
1a30: 6e 65 6c 20 2a 70 50 72 65 76 3b 20 20 20 2f 2a  nel *pPrev;   /*
1a40: 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   Linked list of 
1a50: 61 6c 6c 20 6f 70 65 6e 20 69 6e 63 72 62 6c 6f  all open incrblo
1a60: 62 20 63 68 61 6e 6e 65 6c 73 20 2a 2f 0a 7d 3b  b channels */.};
1a70: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
1a80: 61 20 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  a string length 
1a90: 74 68 61 74 20 69 73 20 6c 69 6d 69 74 65 64 20  that is limited 
1aa0: 74 6f 20 77 68 61 74 20 63 61 6e 20 62 65 20 73  to what can be s
1ab0: 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 6c 6f 77 65  tored in.** lowe
1ac0: 72 20 33 30 20 62 69 74 73 20 6f 66 20 61 20 33  r 30 bits of a 3
1ad0: 32 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74  2-bit signed int
1ae0: 65 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eger..*/.static 
1af0: 69 6e 74 20 73 74 72 6c 65 6e 33 30 28 63 6f 6e  int strlen30(con
1b00: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 63  st char *z){.  c
1b10: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 20 3d 20  onst char *z2 = 
1b20: 7a 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a 32 20  z;.  while( *z2 
1b30: 29 7b 20 7a 32 2b 2b 3b 20 7d 0a 20 20 72 65 74  ){ z2++; }.  ret
1b40: 75 72 6e 20 30 78 33 66 66 66 66 66 66 66 20 26  urn 0x3fffffff &
1b50: 20 28 69 6e 74 29 28 7a 32 20 2d 20 7a 29 3b 0a   (int)(z2 - z);.
1b60: 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  }...#ifndef SQLI
1b70: 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
1b80: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c  ./*.** Close all
1b90: 20 69 6e 63 72 62 6c 6f 62 20 63 68 61 6e 6e 65   incrblob channe
1ba0: 6c 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20  ls opened using 
1bb0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1bc0: 69 6f 6e 20 70 44 62 2e 0a 2a 2a 20 54 68 69 73  ion pDb..** This
1bd0: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
1be0: 73 68 75 74 74 69 6e 67 20 64 6f 77 6e 20 74 68  shutting down th
1bf0: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
1c00: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
1c10: 20 76 6f 69 64 20 63 6c 6f 73 65 49 6e 63 72 62   void closeIncrb
1c20: 6c 6f 62 43 68 61 6e 6e 65 6c 73 28 53 71 6c 69  lobChannels(Sqli
1c30: 74 65 44 62 20 2a 70 44 62 29 7b 0a 20 20 49 6e  teDb *pDb){.  In
1c40: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70  crblobChannel *p
1c50: 3b 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e  ;.  IncrblobChan
1c60: 6e 65 6c 20 2a 70 4e 65 78 74 3b 0a 0a 20 20 66  nel *pNext;..  f
1c70: 6f 72 28 70 3d 70 44 62 2d 3e 70 49 6e 63 72 62  or(p=pDb->pIncrb
1c80: 6c 6f 62 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29  lob; p; p=pNext)
1c90: 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d  {.    pNext = p-
1ca0: 3e 70 4e 65 78 74 3b 0a 0a 20 20 20 20 2f 2a 20  >pNext;..    /* 
1cb0: 4e 6f 74 65 3a 20 43 61 6c 6c 69 6e 67 20 75 6e  Note: Calling un
1cc0: 72 65 67 69 73 74 65 72 20 68 65 72 65 20 63 61  register here ca
1cd0: 6c 6c 20 54 63 6c 5f 43 6c 6f 73 65 20 6f 6e 20  ll Tcl_Close on 
1ce0: 74 68 65 20 69 6e 63 72 62 6c 6f 62 20 63 68 61  the incrblob cha
1cf0: 6e 6e 65 6c 2c 0a 20 20 20 20 2a 2a 20 77 68 69  nnel,.    ** whi
1d00: 63 68 20 64 65 6c 65 74 65 73 20 74 68 65 20 49  ch deletes the I
1d10: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 73  ncrblobChannel s
1d20: 74 72 75 63 74 75 72 65 20 61 74 20 2a 70 2e 20  tructure at *p. 
1d30: 53 6f 20 64 6f 20 6e 6f 74 0a 20 20 20 20 2a 2a  So do not.    **
1d40: 20 63 61 6c 6c 20 54 63 6c 5f 46 72 65 65 28 29   call Tcl_Free()
1d50: 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   here..    */.  
1d60: 20 20 54 63 6c 5f 55 6e 72 65 67 69 73 74 65 72    Tcl_Unregister
1d70: 43 68 61 6e 6e 65 6c 28 70 44 62 2d 3e 69 6e 74  Channel(pDb->int
1d80: 65 72 70 2c 20 70 2d 3e 63 68 61 6e 6e 65 6c 29  erp, p->channel)
1d90: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
1da0: 6c 6f 73 65 20 61 6e 20 69 6e 63 72 65 6d 65 6e  lose an incremen
1db0: 74 61 6c 20 62 6c 6f 62 20 63 68 61 6e 6e 65 6c  tal blob channel
1dc0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1dd0: 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 69 6e  SQLITE_TCLAPI in
1de0: 63 72 62 6c 6f 62 43 6c 6f 73 65 28 0a 20 20 43  crblobClose(.  C
1df0: 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e  lientData instan
1e00: 63 65 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ceData,.  Tcl_In
1e10: 74 65 72 70 20 2a 69 6e 74 65 72 70 0a 29 7b 0a  terp *interp.){.
1e20: 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65    IncrblobChanne
1e30: 6c 20 2a 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62  l *p = (Incrblob
1e40: 43 68 61 6e 6e 65 6c 20 2a 29 69 6e 73 74 61 6e  Channel *)instan
1e50: 63 65 44 61 74 61 3b 0a 20 20 69 6e 74 20 72 63  ceData;.  int rc
1e60: 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f   = sqlite3_blob_
1e70: 63 6c 6f 73 65 28 70 2d 3e 70 42 6c 6f 62 29 3b  close(p->pBlob);
1e80: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1e90: 20 70 2d 3e 70 44 62 2d 3e 64 62 3b 0a 0a 20 20   p->pDb->db;..  
1ea0: 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 63 68  /* Remove the ch
1eb0: 61 6e 6e 65 6c 20 66 72 6f 6d 20 74 68 65 20 53  annel from the S
1ec0: 71 6c 69 74 65 44 62 2e 70 49 6e 63 72 62 6c 6f  qliteDb.pIncrblo
1ed0: 62 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 69 66 28  b list. */.  if(
1ee0: 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20   p->pNext ){.   
1ef0: 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76   p->pNext->pPrev
1f00: 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d   = p->pPrev;.  }
1f10: 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20  .  if( p->pPrev 
1f20: 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76 2d  ){.    p->pPrev-
1f30: 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78  >pNext = p->pNex
1f40: 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  t;.  }.  if( p->
1f50: 70 44 62 2d 3e 70 49 6e 63 72 62 6c 6f 62 3d 3d  pDb->pIncrblob==
1f60: 70 20 29 7b 0a 20 20 20 20 70 2d 3e 70 44 62 2d  p ){.    p->pDb-
1f70: 3e 70 49 6e 63 72 62 6c 6f 62 20 3d 20 70 2d 3e  >pIncrblob = p->
1f80: 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pNext;.  }..  /*
1f90: 20 46 72 65 65 20 74 68 65 20 49 6e 63 72 62 6c   Free the Incrbl
1fa0: 6f 62 43 68 61 6e 6e 65 6c 20 73 74 72 75 63 74  obChannel struct
1fb0: 75 72 65 20 2a 2f 0a 20 20 54 63 6c 5f 46 72 65  ure */.  Tcl_Fre
1fc0: 65 28 28 63 68 61 72 20 2a 29 70 29 3b 0a 0a 20  e((char *)p);.. 
1fd0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1fe0: 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65  OK ){.    Tcl_Se
1ff0: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
2000: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
2010: 65 72 72 6d 73 67 28 64 62 29 2c 20 54 43 4c 5f  errmsg(db), TCL_
2020: 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 72  VOLATILE);.    r
2030: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2040: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
2050: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  L_OK;.}../*.** R
2060: 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61 6e  ead data from an
2070: 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f   incremental blo
2080: 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74  b channel..*/.st
2090: 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
20a0: 54 43 4c 41 50 49 20 69 6e 63 72 62 6c 6f 62 49  TCLAPI incrblobI
20b0: 6e 70 75 74 28 0a 20 20 43 6c 69 65 6e 74 44 61  nput(.  ClientDa
20c0: 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c  ta instanceData,
20d0: 0a 20 20 63 68 61 72 20 2a 62 75 66 2c 0a 20 20  .  char *buf,.  
20e0: 69 6e 74 20 62 75 66 53 69 7a 65 2c 0a 20 20 69  int bufSize,.  i
20f0: 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72  nt *errorCodePtr
2100: 0a 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68  .){.  IncrblobCh
2110: 61 6e 6e 65 6c 20 2a 70 20 3d 20 28 49 6e 63 72  annel *p = (Incr
2120: 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 69 6e  blobChannel *)in
2130: 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 69 6e  stanceData;.  in
2140: 74 20 6e 52 65 61 64 20 3d 20 62 75 66 53 69 7a  t nRead = bufSiz
2150: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  e;         /* Nu
2160: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
2170: 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 6e   read */.  int n
2180: 42 6c 6f 62 3b 20 20 20 20 20 20 20 20 20 20 20  Blob;           
2190: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
21a0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f   size of the blo
21b0: 62 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  b */.  int rc;  
21c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d0: 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 20 65 72      /* sqlite er
21e0: 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 6e  ror code */..  n
21f0: 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 62  Blob = sqlite3_b
2200: 6c 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70 42 6c  lob_bytes(p->pBl
2210: 6f 62 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 69  ob);.  if( (p->i
2220: 53 65 65 6b 2b 6e 52 65 61 64 29 3e 6e 42 6c 6f  Seek+nRead)>nBlo
2230: 62 20 29 7b 0a 20 20 20 20 6e 52 65 61 64 20 3d  b ){.    nRead =
2240: 20 6e 42 6c 6f 62 2d 70 2d 3e 69 53 65 65 6b 3b   nBlob-p->iSeek;
2250: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 61 64  .  }.  if( nRead
2260: 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  <=0 ){.    retur
2270: 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  n 0;.  }..  rc =
2280: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65   sqlite3_blob_re
2290: 61 64 28 70 2d 3e 70 42 6c 6f 62 2c 20 28 76 6f  ad(p->pBlob, (vo
22a0: 69 64 20 2a 29 62 75 66 2c 20 6e 52 65 61 64 2c  id *)buf, nRead,
22b0: 20 70 2d 3e 69 53 65 65 6b 29 3b 0a 20 20 69 66   p->iSeek);.  if
22c0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
22d0: 29 7b 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f 64  ){.    *errorCod
22e0: 65 50 74 72 20 3d 20 72 63 3b 0a 20 20 20 20 72  ePtr = rc;.    r
22f0: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 0a 20  eturn -1;.  }.. 
2300: 20 70 2d 3e 69 53 65 65 6b 20 2b 3d 20 6e 52 65   p->iSeek += nRe
2310: 61 64 3b 0a 20 20 72 65 74 75 72 6e 20 6e 52 65  ad;.  return nRe
2320: 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  ad;.}../*.** Wri
2330: 74 65 20 64 61 74 61 20 74 6f 20 61 6e 20 69 6e  te data to an in
2340: 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63  cremental blob c
2350: 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69  hannel..*/.stati
2360: 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
2370: 41 50 49 20 69 6e 63 72 62 6c 6f 62 4f 75 74 70  API incrblobOutp
2380: 75 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  ut(.  ClientData
2390: 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 0a 20   instanceData,. 
23a0: 20 43 4f 4e 53 54 20 63 68 61 72 20 2a 62 75 66   CONST char *buf
23b0: 2c 0a 20 20 69 6e 74 20 74 6f 57 72 69 74 65 2c  ,.  int toWrite,
23c0: 0a 20 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64  .  int *errorCod
23d0: 65 50 74 72 0a 29 7b 0a 20 20 49 6e 63 72 62 6c  ePtr.){.  Incrbl
23e0: 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 20 3d 20 28  obChannel *p = (
23f0: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20  IncrblobChannel 
2400: 2a 29 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a  *)instanceData;.
2410: 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 74    int nWrite = t
2420: 6f 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 2f  oWrite;        /
2430: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
2440: 73 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20  s to write */.  
2450: 69 6e 74 20 6e 42 6c 6f 62 3b 20 20 20 20 20 20  int nBlob;      
2460: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2470: 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68  Total size of th
2480: 65 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 6e 74 20  e blob */.  int 
2490: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
24a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
24b0: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f  te error code */
24c0: 0a 0a 20 20 6e 42 6c 6f 62 20 3d 20 73 71 6c 69  ..  nBlob = sqli
24d0: 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70  te3_blob_bytes(p
24e0: 2d 3e 70 42 6c 6f 62 29 3b 0a 20 20 69 66 28 20  ->pBlob);.  if( 
24f0: 28 70 2d 3e 69 53 65 65 6b 2b 6e 57 72 69 74 65  (p->iSeek+nWrite
2500: 29 3e 6e 42 6c 6f 62 20 29 7b 0a 20 20 20 20 2a  )>nBlob ){.    *
2510: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45  errorCodePtr = E
2520: 49 4e 56 41 4c 3b 0a 20 20 20 20 72 65 74 75 72  INVAL;.    retur
2530: 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  n -1;.  }.  if( 
2540: 6e 57 72 69 74 65 3c 3d 30 20 29 7b 0a 20 20 20  nWrite<=0 ){.   
2550: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
2560: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
2570: 6c 6f 62 5f 77 72 69 74 65 28 70 2d 3e 70 42 6c  lob_write(p->pBl
2580: 6f 62 2c 20 28 76 6f 69 64 20 2a 29 62 75 66 2c  ob, (void *)buf,
2590: 20 6e 57 72 69 74 65 2c 20 70 2d 3e 69 53 65 65   nWrite, p->iSee
25a0: 6b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  k);.  if( rc!=SQ
25b0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
25c0: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45  errorCodePtr = E
25d0: 49 4f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d  IO;.    return -
25e0: 31 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 69 53 65  1;.  }..  p->iSe
25f0: 65 6b 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20  ek += nWrite;.  
2600: 72 65 74 75 72 6e 20 6e 57 72 69 74 65 3b 0a 7d  return nWrite;.}
2610: 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 61 6e 20  ../*.** Seek an 
2620: 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62  incremental blob
2630: 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61   channel..*/.sta
2640: 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
2650: 43 4c 41 50 49 20 69 6e 63 72 62 6c 6f 62 53 65  CLAPI incrblobSe
2660: 65 6b 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  ek(.  ClientData
2670: 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 0a 20   instanceData,. 
2680: 20 6c 6f 6e 67 20 6f 66 66 73 65 74 2c 0a 20 20   long offset,.  
2690: 69 6e 74 20 73 65 65 6b 4d 6f 64 65 2c 0a 20 20  int seekMode,.  
26a0: 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50 74  int *errorCodePt
26b0: 72 0a 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43  r.){.  IncrblobC
26c0: 68 61 6e 6e 65 6c 20 2a 70 20 3d 20 28 49 6e 63  hannel *p = (Inc
26d0: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 69  rblobChannel *)i
26e0: 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 0a 20 20  nstanceData;..  
26f0: 73 77 69 74 63 68 28 20 73 65 65 6b 4d 6f 64 65  switch( seekMode
2700: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 45 45   ){.    case SEE
2710: 4b 5f 53 45 54 3a 0a 20 20 20 20 20 20 70 2d 3e  K_SET:.      p->
2720: 69 53 65 65 6b 20 3d 20 6f 66 66 73 65 74 3b 0a  iSeek = offset;.
2730: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2740: 20 63 61 73 65 20 53 45 45 4b 5f 43 55 52 3a 0a   case SEEK_CUR:.
2750: 20 20 20 20 20 20 70 2d 3e 69 53 65 65 6b 20 2b        p->iSeek +
2760: 3d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  = offset;.      
2770: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
2780: 53 45 45 4b 5f 45 4e 44 3a 0a 20 20 20 20 20 20  SEEK_END:.      
2790: 70 2d 3e 69 53 65 65 6b 20 3d 20 73 71 6c 69 74  p->iSeek = sqlit
27a0: 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70 2d  e3_blob_bytes(p-
27b0: 3e 70 42 6c 6f 62 29 20 2b 20 6f 66 66 73 65 74  >pBlob) + offset
27c0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
27d0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73      default: ass
27e0: 65 72 74 28 21 22 42 61 64 20 73 65 65 6b 4d 6f  ert(!"Bad seekMo
27f0: 64 65 22 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  de");.  }..  ret
2800: 75 72 6e 20 70 2d 3e 69 53 65 65 6b 3b 0a 7d 0a  urn p->iSeek;.}.
2810: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 53 51  ..static void SQ
2820: 4c 49 54 45 5f 54 43 4c 41 50 49 20 69 6e 63 72  LITE_TCLAPI incr
2830: 62 6c 6f 62 57 61 74 63 68 28 0a 20 20 43 6c 69  blobWatch(.  Cli
2840: 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65  entData instance
2850: 44 61 74 61 2c 0a 20 20 69 6e 74 20 6d 6f 64 65  Data,.  int mode
2860: 0a 29 7b 0a 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a  .){.  /* NO-OP *
2870: 2f 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 53  /.}.static int S
2880: 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 69 6e 63  QLITE_TCLAPI inc
2890: 72 62 6c 6f 62 48 61 6e 64 6c 65 28 0a 20 20 43  rblobHandle(.  C
28a0: 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e  lientData instan
28b0: 63 65 44 61 74 61 2c 0a 20 20 69 6e 74 20 64 69  ceData,.  int di
28c0: 72 2c 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  r,.  ClientData 
28d0: 2a 68 50 74 72 0a 29 7b 0a 20 20 72 65 74 75 72  *hPtr.){.  retur
28e0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a  n TCL_ERROR;.}..
28f0: 73 74 61 74 69 63 20 54 63 6c 5f 43 68 61 6e 6e  static Tcl_Chann
2900: 65 6c 54 79 70 65 20 49 6e 63 72 62 6c 6f 62 43  elType IncrblobC
2910: 68 61 6e 6e 65 6c 54 79 70 65 20 3d 20 7b 0a 20  hannelType = {. 
2920: 20 22 69 6e 63 72 62 6c 6f 62 22 2c 20 20 20 20   "incrblob",    
2930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2940: 20 20 20 20 2f 2a 20 74 79 70 65 4e 61 6d 65 20      /* typeName 
2950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2960: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2970: 20 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56 45 52   TCL_CHANNEL_VER
2980: 53 49 4f 4e 5f 32 2c 20 20 20 20 20 20 20 20 20  SION_2,         
2990: 20 20 20 20 2f 2a 20 76 65 72 73 69 6f 6e 20 20      /* version  
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 20 20 20 20 2a 2f 0a 20              */. 
29c0: 20 69 6e 63 72 62 6c 6f 62 43 6c 6f 73 65 2c 20   incrblobClose, 
29d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e0: 20 20 20 20 2f 2a 20 63 6c 6f 73 65 50 72 6f 63      /* closeProc
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 20 20 20 20 2a 2f 0a 20              */. 
2a10: 20 69 6e 63 72 62 6c 6f 62 49 6e 70 75 74 2c 20   incrblobInput, 
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a30: 20 20 20 20 2f 2a 20 69 6e 70 75 74 50 72 6f 63      /* inputProc
2a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a50: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2a60: 20 69 6e 63 72 62 6c 6f 62 4f 75 74 70 75 74 2c   incrblobOutput,
2a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a80: 20 20 20 20 2f 2a 20 6f 75 74 70 75 74 50 72 6f      /* outputPro
2a90: 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
2aa0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2ab0: 20 69 6e 63 72 62 6c 6f 62 53 65 65 6b 2c 20 20   incrblobSeek,  
2ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad0: 20 20 20 20 2f 2a 20 73 65 65 6b 50 72 6f 63 20      /* seekProc 
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 20 20 20 20 2a 2f 0a 20              */. 
2b00: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
2b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b20: 20 20 20 20 2f 2a 20 73 65 74 4f 70 74 69 6f 6e      /* setOption
2b30: 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20  Proc            
2b40: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2b50: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
2b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b70: 20 20 20 20 2f 2a 20 67 65 74 4f 70 74 69 6f 6e      /* getOption
2b80: 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20  Proc            
2b90: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2ba0: 20 69 6e 63 72 62 6c 6f 62 57 61 74 63 68 2c 20   incrblobWatch, 
2bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bc0: 20 20 20 20 2f 2a 20 77 61 74 63 68 50 72 6f 63      /* watchProc
2bd0: 20 28 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f   (this is a no-o
2be0: 70 29 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  p)          */. 
2bf0: 20 69 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 2c   incrblobHandle,
2c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c10: 20 20 20 20 2f 2a 20 67 65 74 48 61 6e 64 6c 65      /* getHandle
2c20: 50 72 6f 63 20 28 61 6c 77 61 79 73 20 72 65 74  Proc (always ret
2c30: 75 72 6e 73 20 65 72 72 6f 72 29 20 2a 2f 0a 20  urns error) */. 
2c40: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
2c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c60: 20 20 20 20 2f 2a 20 63 6c 6f 73 65 32 50 72 6f      /* close2Pro
2c70: 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
2c80: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2c90: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
2ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cb0: 20 20 20 20 2f 2a 20 62 6c 6f 63 6b 4d 6f 64 65      /* blockMode
2cc0: 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20  Proc            
2cd0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2ce0: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
2cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d00: 20 20 20 20 2f 2a 20 66 6c 75 73 68 50 72 6f 63      /* flushProc
2d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d20: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2d30: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
2d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d50: 20 20 20 20 2f 2a 20 68 61 6e 64 6c 65 72 50 72      /* handlerPr
2d60: 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  oc              
2d70: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2d80: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
2d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2da0: 20 20 20 20 2f 2a 20 77 69 64 65 53 65 65 6b 50      /* wideSeekP
2db0: 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20  roc             
2dc0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 7d              */.}
2dd0: 3b 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  ;../*.** Create 
2de0: 61 20 6e 65 77 20 69 6e 63 72 62 6c 6f 62 20 63  a new incrblob c
2df0: 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69  hannel..*/.stati
2e00: 63 20 69 6e 74 20 63 72 65 61 74 65 49 6e 63 72  c int createIncr
2e10: 62 6c 6f 62 43 68 61 6e 6e 65 6c 28 0a 20 20 54  blobChannel(.  T
2e20: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2e30: 70 2c 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  p,.  SqliteDb *p
2e40: 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  Db,.  const char
2e50: 20 2a 7a 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63   *zDb,.  const c
2e60: 68 61 72 20 2a 7a 54 61 62 6c 65 2c 0a 20 20 63  har *zTable,.  c
2e70: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75  onst char *zColu
2e80: 6d 6e 2c 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74  mn,.  sqlite_int
2e90: 36 34 20 69 52 6f 77 2c 0a 20 20 69 6e 74 20 69  64 iRow,.  int i
2ea0: 73 52 65 61 64 6f 6e 6c 79 0a 29 7b 0a 20 20 49  sReadonly.){.  I
2eb0: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a  ncrblobChannel *
2ec0: 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  p;.  sqlite3 *db
2ed0: 20 3d 20 70 44 62 2d 3e 64 62 3b 0a 20 20 73 71   = pDb->db;.  sq
2ee0: 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f  lite3_blob *pBlo
2ef0: 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  b;.  int rc;.  i
2f00: 6e 74 20 66 6c 61 67 73 20 3d 20 54 43 4c 5f 52  nt flags = TCL_R
2f10: 45 41 44 41 42 4c 45 7c 28 69 73 52 65 61 64 6f  EADABLE|(isReado
2f20: 6e 6c 79 20 3f 20 30 20 3a 20 54 43 4c 5f 57 52  nly ? 0 : TCL_WR
2f30: 49 54 41 42 4c 45 29 3b 0a 0a 20 20 2f 2a 20 54  ITABLE);..  /* T
2f40: 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20  his variable is 
2f50: 75 73 65 64 20 74 6f 20 6e 61 6d 65 20 74 68 65  used to name the
2f60: 20 63 68 61 6e 6e 65 6c 73 3a 20 22 69 6e 63 72   channels: "incr
2f70: 62 6c 6f 62 5f 5b 69 6e 63 72 20 63 6f 75 6e 74  blob_[incr count
2f80: 5d 22 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 69  ]" */.  static i
2f90: 6e 74 20 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20  nt count = 0;.  
2fa0: 63 68 61 72 20 7a 43 68 61 6e 6e 65 6c 5b 36 34  char zChannel[64
2fb0: 5d 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ];..  rc = sqlit
2fc0: 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 64 62 2c  e3_blob_open(db,
2fd0: 20 7a 44 62 2c 20 7a 54 61 62 6c 65 2c 20 7a 43   zDb, zTable, zC
2fe0: 6f 6c 75 6d 6e 2c 20 69 52 6f 77 2c 20 21 69 73  olumn, iRow, !is
2ff0: 52 65 61 64 6f 6e 6c 79 2c 20 26 70 42 6c 6f 62  Readonly, &pBlob
3000: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
3010: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63  ITE_OK ){.    Tc
3020: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
3030: 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69  rp, (char *)sqli
3040: 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e  te3_errmsg(pDb->
3050: 64 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c  db), TCL_VOLATIL
3060: 45 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  E);.    return T
3070: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
3080: 20 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68   p = (IncrblobCh
3090: 61 6e 6e 65 6c 20 2a 29 54 63 6c 5f 41 6c 6c 6f  annel *)Tcl_Allo
30a0: 63 28 73 69 7a 65 6f 66 28 49 6e 63 72 62 6c 6f  c(sizeof(Incrblo
30b0: 62 43 68 61 6e 6e 65 6c 29 29 3b 0a 20 20 70 2d  bChannel));.  p-
30c0: 3e 69 53 65 65 6b 20 3d 20 30 3b 0a 20 20 70 2d  >iSeek = 0;.  p-
30d0: 3e 70 42 6c 6f 62 20 3d 20 70 42 6c 6f 62 3b 0a  >pBlob = pBlob;.
30e0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
30f0: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 43 68 61 6e  ntf(sizeof(zChan
3100: 6e 65 6c 29 2c 20 7a 43 68 61 6e 6e 65 6c 2c 20  nel), zChannel, 
3110: 22 69 6e 63 72 62 6c 6f 62 5f 25 64 22 2c 20 2b  "incrblob_%d", +
3120: 2b 63 6f 75 6e 74 29 3b 0a 20 20 70 2d 3e 63 68  +count);.  p->ch
3130: 61 6e 6e 65 6c 20 3d 20 54 63 6c 5f 43 72 65 61  annel = Tcl_Crea
3140: 74 65 43 68 61 6e 6e 65 6c 28 26 49 6e 63 72 62  teChannel(&Incrb
3150: 6c 6f 62 43 68 61 6e 6e 65 6c 54 79 70 65 2c 20  lobChannelType, 
3160: 7a 43 68 61 6e 6e 65 6c 2c 20 70 2c 20 66 6c 61  zChannel, p, fla
3170: 67 73 29 3b 0a 20 20 54 63 6c 5f 52 65 67 69 73  gs);.  Tcl_Regis
3180: 74 65 72 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72  terChannel(inter
3190: 70 2c 20 70 2d 3e 63 68 61 6e 6e 65 6c 29 3b 0a  p, p->channel);.
31a0: 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e  .  /* Link the n
31b0: 65 77 20 63 68 61 6e 6e 65 6c 20 69 6e 74 6f 20  ew channel into 
31c0: 74 68 65 20 53 71 6c 69 74 65 44 62 2e 70 49 6e  the SqliteDb.pIn
31d0: 63 72 62 6c 6f 62 20 6c 69 73 74 2e 20 2a 2f 0a  crblob list. */.
31e0: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62    p->pNext = pDb
31f0: 2d 3e 70 49 6e 63 72 62 6c 6f 62 3b 0a 20 20 70  ->pIncrblob;.  p
3200: 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 69  ->pPrev = 0;.  i
3210: 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  f( p->pNext ){. 
3220: 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72     p->pNext->pPr
3230: 65 76 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 70 44  ev = p;.  }.  pD
3240: 62 2d 3e 70 49 6e 63 72 62 6c 6f 62 20 3d 20 70  b->pIncrblob = p
3250: 3b 0a 20 20 70 2d 3e 70 44 62 20 3d 20 70 44 62  ;.  p->pDb = pDb
3260: 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75  ;..  Tcl_SetResu
3270: 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
3280: 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   *)Tcl_GetChanne
3290: 6c 4e 61 6d 65 28 70 2d 3e 63 68 61 6e 6e 65 6c  lName(p->channel
32a0: 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29  ), TCL_VOLATILE)
32b0: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
32c0: 4b 3b 0a 7d 0a 23 65 6c 73 65 20 20 2f 2a 20 65  K;.}.#else  /* e
32d0: 6c 73 65 20 63 6c 61 75 73 65 20 66 6f 72 20 22  lse clause for "
32e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
32f0: 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 22 20 2a 2f  MIT_INCRBLOB" */
3300: 0a 20 20 23 64 65 66 69 6e 65 20 63 6c 6f 73 65  .  #define close
3310: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 73  IncrblobChannels
3320: 28 70 44 62 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  (pDb).#endif../*
3330: 0a 2a 2a 20 4c 6f 6f 6b 20 61 74 20 74 68 65 20  .** Look at the 
3340: 73 63 72 69 70 74 20 70 72 65 66 69 78 20 69 6e  script prefix in
3350: 20 70 43 6d 64 2e 20 20 57 65 20 77 69 6c 6c 20   pCmd.  We will 
3360: 62 65 20 65 78 65 63 75 74 69 6e 67 20 74 68 69  be executing thi
3370: 73 20 73 63 72 69 70 74 0a 2a 2a 20 61 66 74 65  s script.** afte
3380: 72 20 66 69 72 73 74 20 61 70 70 65 6e 64 69 6e  r first appendin
3390: 67 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 61 72  g one or more ar
33a0: 67 75 6d 65 6e 74 73 2e 20 20 54 68 69 73 20 72  guments.  This r
33b0: 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65 73 0a  outine analyzes.
33c0: 2a 2a 20 74 68 65 20 73 63 72 69 70 74 20 74 6f  ** the script to
33d0: 20 73 65 65 20 69 66 20 69 74 20 69 73 20 73 61   see if it is sa
33e0: 66 65 20 74 6f 20 75 73 65 20 54 63 6c 5f 45 76  fe to use Tcl_Ev
33f0: 61 6c 4f 62 6a 76 28 29 20 6f 6e 20 74 68 65 20  alObjv() on the 
3400: 73 63 72 69 70 74 0a 2a 2a 20 72 61 74 68 65 72  script.** rather
3410: 20 74 68 61 6e 20 74 68 65 20 6d 6f 72 65 20 67   than the more g
3420: 65 6e 65 72 61 6c 20 54 63 6c 5f 45 76 61 6c 45  eneral Tcl_EvalE
3430: 78 28 29 2e 20 20 54 63 6c 5f 45 76 61 6c 4f 62  x().  Tcl_EvalOb
3440: 6a 76 28 29 20 69 73 20 6d 75 63 68 0a 2a 2a 20  jv() is much.** 
3450: 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 63  faster..**.** Sc
3460: 72 69 70 74 73 20 74 68 61 74 20 61 72 65 20 73  ripts that are s
3470: 61 66 65 20 74 6f 20 75 73 65 20 77 69 74 68 20  afe to use with 
3480: 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20 63  Tcl_EvalObjv() c
3490: 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20  onsists of a.** 
34a0: 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20 66 6f 6c  command name fol
34b0: 6c 6f 77 65 64 20 62 79 20 7a 65 72 6f 20 6f 72  lowed by zero or
34c0: 20 6d 6f 72 65 20 61 72 67 75 6d 65 6e 74 73 20   more arguments 
34d0: 77 69 74 68 20 6e 6f 20 5b 2e 2e 2e 5d 20 6f 72  with no [...] or
34e0: 20 24 0a 2a 2a 20 6f 72 20 7b 2e 2e 2e 7d 20 6f   $.** or {...} o
34f0: 72 20 3b 20 74 6f 20 62 65 20 73 65 65 6e 20 61  r ; to be seen a
3500: 6e 79 77 68 65 72 65 2e 20 20 4d 6f 73 74 20 63  nywhere.  Most c
3510: 61 6c 6c 62 61 63 6b 20 73 63 72 69 70 74 73 20  allback scripts 
3520: 63 6f 6e 73 69 73 74 0a 2a 2a 20 6f 66 20 6a 75  consist.** of ju
3530: 73 74 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 63  st a single proc
3540: 65 64 75 72 65 20 6e 61 6d 65 20 61 6e 64 20 74  edure name and t
3550: 68 65 79 20 6d 65 65 74 20 74 68 69 73 20 72 65  hey meet this re
3560: 71 75 69 72 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74  quirement..*/.st
3570: 61 74 69 63 20 69 6e 74 20 73 61 66 65 54 6f 55  atic int safeToU
3580: 73 65 45 76 61 6c 4f 62 6a 76 28 54 63 6c 5f 49  seEvalObjv(Tcl_I
3590: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 54  nterp *interp, T
35a0: 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 29 7b 0a 20  cl_Obj *pCmd){. 
35b0: 20 2f 2a 20 57 65 20 63 6f 75 6c 64 20 74 72 79   /* We could try
35c0: 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67   to do something
35d0: 20 77 69 74 68 20 54 63 6c 5f 50 61 72 73 65 28   with Tcl_Parse(
35e0: 29 2e 20 20 42 75 74 20 77 65 20 77 69 6c 6c 20  ).  But we will 
35f0: 69 6e 73 74 65 61 64 0a 20 20 2a 2a 20 6a 75 73  instead.  ** jus
3600: 74 20 64 6f 20 61 20 73 65 61 72 63 68 20 66 6f  t do a search fo
3610: 72 20 66 6f 72 62 69 64 64 65 6e 20 63 68 61 72  r forbidden char
3620: 61 63 74 65 72 73 2e 20 20 49 66 20 61 6e 79 20  acters.  If any 
3630: 6f 66 20 74 68 65 20 66 6f 72 62 69 64 64 65 6e  of the forbidden
3640: 0a 20 20 2a 2a 20 63 68 61 72 61 63 74 65 72 73  .  ** characters
3650: 20 61 70 70 65 61 72 20 69 6e 20 70 43 6d 64 2c   appear in pCmd,
3660: 20 77 65 20 77 69 6c 6c 20 72 65 70 6f 72 74 20   we will report 
3670: 74 68 65 20 73 74 72 69 6e 67 20 61 73 20 75 6e  the string as un
3680: 73 61 66 65 2e 0a 20 20 2a 2f 0a 20 20 63 6f 6e  safe..  */.  con
3690: 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e  st char *z;.  in
36a0: 74 20 6e 3b 0a 20 20 7a 20 3d 20 54 63 6c 5f 47  t n;.  z = Tcl_G
36b0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
36c0: 70 43 6d 64 2c 20 26 6e 29 3b 0a 20 20 77 68 69  pCmd, &n);.  whi
36d0: 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20  le( n-- > 0 ){. 
36e0: 20 20 20 69 6e 74 20 63 20 3d 20 2a 28 7a 2b 2b     int c = *(z++
36f0: 29 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 24  );.    if( c=='$
3700: 27 20 7c 7c 20 63 3d 3d 27 5b 27 20 7c 7c 20 63  ' || c=='[' || c
3710: 3d 3d 27 3b 27 20 29 20 72 65 74 75 72 6e 20 30  ==';' ) return 0
3720: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31  ;.  }.  return 1
3730: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  ;.}../*.** Find 
3740: 61 6e 20 53 71 6c 46 75 6e 63 20 73 74 72 75 63  an SqlFunc struc
3750: 74 75 72 65 20 77 69 74 68 20 74 68 65 20 67 69  ture with the gi
3760: 76 65 6e 20 6e 61 6d 65 2e 20 20 4f 72 20 63 72  ven name.  Or cr
3770: 65 61 74 65 20 61 20 6e 65 77 0a 2a 2a 20 6f 6e  eate a new.** on
3780: 65 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67  e if an existing
3790: 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 62 65 20 66   one cannot be f
37a0: 6f 75 6e 64 2e 20 20 52 65 74 75 72 6e 20 61 20  ound.  Return a 
37b0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a  pointer to the.*
37c0: 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  * structure..*/.
37d0: 73 74 61 74 69 63 20 53 71 6c 46 75 6e 63 20 2a  static SqlFunc *
37e0: 66 69 6e 64 53 71 6c 46 75 6e 63 28 53 71 6c 69  findSqlFunc(Sqli
37f0: 74 65 44 62 20 2a 70 44 62 2c 20 63 6f 6e 73 74  teDb *pDb, const
3800: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
3810: 20 53 71 6c 46 75 6e 63 20 2a 70 2c 20 2a 70 4e   SqlFunc *p, *pN
3820: 65 77 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 20  ew;.  int nName 
3830: 3d 20 73 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65  = strlen30(zName
3840: 29 3b 0a 20 20 70 4e 65 77 20 3d 20 28 53 71 6c  );.  pNew = (Sql
3850: 46 75 6e 63 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28  Func*)Tcl_Alloc(
3860: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 2b   sizeof(*pNew) +
3870: 20 6e 4e 61 6d 65 20 2b 20 31 20 29 3b 0a 20 20   nName + 1 );.  
3880: 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63  pNew->zName = (c
3890: 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20  har*)&pNew[1];. 
38a0: 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 4e   memcpy(pNew->zN
38b0: 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  ame, zName, nNam
38c0: 65 2b 31 29 3b 0a 20 20 66 6f 72 28 70 3d 70 44  e+1);.  for(p=pD
38d0: 62 2d 3e 70 46 75 6e 63 3b 20 70 3b 20 70 3d 70  b->pFunc; p; p=p
38e0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
38f0: 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ( sqlite3_stricm
3900: 70 28 70 2d 3e 7a 4e 61 6d 65 2c 20 70 4e 65 77  p(p->zName, pNew
3910: 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ->zName)==0 ){. 
3920: 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63       Tcl_Free((c
3930: 68 61 72 2a 29 70 4e 65 77 29 3b 0a 20 20 20 20  har*)pNew);.    
3940: 20 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 20 20    return p;.    
3950: 7d 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 69 6e  }.  }.  pNew->in
3960: 74 65 72 70 20 3d 20 70 44 62 2d 3e 69 6e 74 65  terp = pDb->inte
3970: 72 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 44 62 20  rp;.  pNew->pDb 
3980: 3d 20 70 44 62 3b 0a 20 20 70 4e 65 77 2d 3e 70  = pDb;.  pNew->p
3990: 53 63 72 69 70 74 20 3d 20 30 3b 0a 20 20 70 4e  Script = 0;.  pN
39a0: 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d  ew->pNext = pDb-
39b0: 3e 70 46 75 6e 63 3b 0a 20 20 70 44 62 2d 3e 70  >pFunc;.  pDb->p
39c0: 46 75 6e 63 20 3d 20 70 4e 65 77 3b 0a 20 20 72  Func = pNew;.  r
39d0: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
39e0: 2a 0a 2a 2a 20 46 72 65 65 20 61 20 73 69 6e 67  *.** Free a sing
39f0: 6c 65 20 53 71 6c 50 72 65 70 61 72 65 64 53 74  le SqlPreparedSt
3a00: 6d 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  mt object..*/.st
3a10: 61 74 69 63 20 76 6f 69 64 20 64 62 46 72 65 65  atic void dbFree
3a20: 53 74 6d 74 28 53 71 6c 50 72 65 70 61 72 65 64  Stmt(SqlPrepared
3a30: 53 74 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 23 69  Stmt *pStmt){.#i
3a40: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
3a50: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73  .  if( sqlite3_s
3a60: 71 6c 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74 29  ql(pStmt->pStmt)
3a70: 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46  ==0 ){.    Tcl_F
3a80: 72 65 65 28 28 63 68 61 72 20 2a 29 70 53 74 6d  ree((char *)pStm
3a90: 74 2d 3e 7a 53 71 6c 29 3b 0a 20 20 7d 0a 23 65  t->zSql);.  }.#e
3aa0: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 66  ndif.  sqlite3_f
3ab0: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 2d 3e 70  inalize(pStmt->p
3ac0: 53 74 6d 74 29 3b 0a 20 20 54 63 6c 5f 46 72 65  Stmt);.  Tcl_Fre
3ad0: 65 28 28 63 68 61 72 20 2a 29 70 53 74 6d 74 29  e((char *)pStmt)
3ae0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 61 6c  ;.}../*.** Final
3af0: 69 7a 65 20 61 6e 64 20 66 72 65 65 20 61 20 6c  ize and free a l
3b00: 69 73 74 20 6f 66 20 70 72 65 70 61 72 65 64 20  ist of prepared 
3b10: 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74  statements.*/.st
3b20: 61 74 69 63 20 76 6f 69 64 20 66 6c 75 73 68 53  atic void flushS
3b30: 74 6d 74 43 61 63 68 65 28 53 71 6c 69 74 65 44  tmtCache(SqliteD
3b40: 62 20 2a 70 44 62 29 7b 0a 20 20 53 71 6c 50 72  b *pDb){.  SqlPr
3b50: 65 70 61 72 65 64 53 74 6d 74 20 2a 70 50 72 65  eparedStmt *pPre
3b60: 53 74 6d 74 3b 0a 20 20 53 71 6c 50 72 65 70 61  Stmt;.  SqlPrepa
3b70: 72 65 64 53 74 6d 74 20 2a 70 4e 65 78 74 3b 0a  redStmt *pNext;.
3b80: 0a 20 20 66 6f 72 28 70 50 72 65 53 74 6d 74 20  .  for(pPreStmt 
3b90: 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 3b  = pDb->stmtList;
3ba0: 20 70 50 72 65 53 74 6d 74 3b 20 70 50 72 65 53   pPreStmt; pPreS
3bb0: 74 6d 74 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  tmt=pNext){.    
3bc0: 70 4e 65 78 74 20 3d 20 70 50 72 65 53 74 6d 74  pNext = pPreStmt
3bd0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 64 62 46  ->pNext;.    dbF
3be0: 72 65 65 53 74 6d 74 28 70 50 72 65 53 74 6d 74  reeStmt(pPreStmt
3bf0: 29 3b 0a 20 20 7d 0a 20 20 70 44 62 2d 3e 6e 53  );.  }.  pDb->nS
3c00: 74 6d 74 20 3d 20 30 3b 0a 20 20 70 44 62 2d 3e  tmt = 0;.  pDb->
3c10: 73 74 6d 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20  stmtLast = 0;.  
3c20: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 3d 20  pDb->stmtList = 
3c30: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 43 4c 20  0;.}../*.** TCL 
3c40: 63 61 6c 6c 73 20 74 68 69 73 20 70 72 6f 63 65  calls this proce
3c50: 64 75 72 65 20 77 68 65 6e 20 61 6e 20 73 71 6c  dure when an sql
3c60: 69 74 65 33 20 64 61 74 61 62 61 73 65 20 63 6f  ite3 database co
3c70: 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 64 65 6c 65  mmand is.** dele
3c80: 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ted..*/.static v
3c90: 6f 69 64 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  oid SQLITE_TCLAP
3ca0: 49 20 44 62 44 65 6c 65 74 65 43 6d 64 28 76 6f  I DbDeleteCmd(vo
3cb0: 69 64 20 2a 64 62 29 7b 0a 20 20 53 71 6c 69 74  id *db){.  Sqlit
3cc0: 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69  eDb *pDb = (Sqli
3cd0: 74 65 44 62 2a 29 64 62 3b 0a 20 20 66 6c 75 73  teDb*)db;.  flus
3ce0: 68 53 74 6d 74 43 61 63 68 65 28 70 44 62 29 3b  hStmtCache(pDb);
3cf0: 0a 20 20 63 6c 6f 73 65 49 6e 63 72 62 6c 6f 62  .  closeIncrblob
3d00: 43 68 61 6e 6e 65 6c 73 28 70 44 62 29 3b 0a 20  Channels(pDb);. 
3d10: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70   sqlite3_close(p
3d20: 44 62 2d 3e 64 62 29 3b 0a 20 20 77 68 69 6c 65  Db->db);.  while
3d30: 28 20 70 44 62 2d 3e 70 46 75 6e 63 20 29 7b 0a  ( pDb->pFunc ){.
3d40: 20 20 20 20 53 71 6c 46 75 6e 63 20 2a 70 46 75      SqlFunc *pFu
3d50: 6e 63 20 3d 20 70 44 62 2d 3e 70 46 75 6e 63 3b  nc = pDb->pFunc;
3d60: 0a 20 20 20 20 70 44 62 2d 3e 70 46 75 6e 63 20  .    pDb->pFunc 
3d70: 3d 20 70 46 75 6e 63 2d 3e 70 4e 65 78 74 3b 0a  = pFunc->pNext;.
3d80: 20 20 20 20 61 73 73 65 72 74 28 20 70 46 75 6e      assert( pFun
3d90: 63 2d 3e 70 44 62 3d 3d 70 44 62 20 29 3b 0a 20  c->pDb==pDb );. 
3da0: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
3db0: 75 6e 74 28 70 46 75 6e 63 2d 3e 70 53 63 72 69  unt(pFunc->pScri
3dc0: 70 74 29 3b 0a 20 20 20 20 54 63 6c 5f 46 72 65  pt);.    Tcl_Fre
3dd0: 65 28 28 63 68 61 72 2a 29 70 46 75 6e 63 29 3b  e((char*)pFunc);
3de0: 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 44  .  }.  while( pD
3df0: 62 2d 3e 70 43 6f 6c 6c 61 74 65 20 29 7b 0a 20  b->pCollate ){. 
3e00: 20 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70     SqlCollate *p
3e10: 43 6f 6c 6c 61 74 65 20 3d 20 70 44 62 2d 3e 70  Collate = pDb->p
3e20: 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 70 44 62  Collate;.    pDb
3e30: 2d 3e 70 43 6f 6c 6c 61 74 65 20 3d 20 70 43 6f  ->pCollate = pCo
3e40: 6c 6c 61 74 65 2d 3e 70 4e 65 78 74 3b 0a 20 20  llate->pNext;.  
3e50: 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72    Tcl_Free((char
3e60: 2a 29 70 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 7d  *)pCollate);.  }
3e70: 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 42 75 73  .  if( pDb->zBus
3e80: 79 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65  y ){.    Tcl_Fre
3e90: 65 28 70 44 62 2d 3e 7a 42 75 73 79 29 3b 0a 20  e(pDb->zBusy);. 
3ea0: 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 54   }.  if( pDb->zT
3eb0: 72 61 63 65 20 29 7b 0a 20 20 20 20 54 63 6c 5f  race ){.    Tcl_
3ec0: 46 72 65 65 28 70 44 62 2d 3e 7a 54 72 61 63 65  Free(pDb->zTrace
3ed0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62  );.  }.  if( pDb
3ee0: 2d 3e 7a 54 72 61 63 65 56 32 20 29 7b 0a 20 20  ->zTraceV2 ){.  
3ef0: 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e    Tcl_Free(pDb->
3f00: 7a 54 72 61 63 65 56 32 29 3b 0a 20 20 7d 0a 20  zTraceV2);.  }. 
3f10: 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69   if( pDb->zProfi
3f20: 6c 65 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72  le ){.    Tcl_Fr
3f30: 65 65 28 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65  ee(pDb->zProfile
3f40: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62  );.  }.  if( pDb
3f50: 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 54  ->zAuth ){.    T
3f60: 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 41 75  cl_Free(pDb->zAu
3f70: 74 68 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  th);.  }.  if( p
3f80: 44 62 2d 3e 7a 4e 75 6c 6c 20 29 7b 0a 20 20 20  Db->zNull ){.   
3f90: 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
3fa0: 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Null);.  }.  if(
3fb0: 20 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f   pDb->pUpdateHoo
3fc0: 6b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63  k ){.    Tcl_Dec
3fd0: 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70  rRefCount(pDb->p
3fe0: 55 70 64 61 74 65 48 6f 6f 6b 29 3b 0a 20 20 7d  UpdateHook);.  }
3ff0: 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 50 72 65  .  if( pDb->pPre
4000: 55 70 64 61 74 65 48 6f 6f 6b 20 29 7b 0a 20 20  UpdateHook ){.  
4010: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
4020: 6e 74 28 70 44 62 2d 3e 70 50 72 65 55 70 64 61  nt(pDb->pPreUpda
4030: 74 65 48 6f 6f 6b 29 3b 0a 20 20 7d 0a 20 20 69  teHook);.  }.  i
4040: 66 28 20 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63  f( pDb->pRollbac
4050: 6b 48 6f 6f 6b 20 29 7b 0a 20 20 20 20 54 63 6c  kHook ){.    Tcl
4060: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44  _DecrRefCount(pD
4070: 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b  b->pRollbackHook
4080: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62  );.  }.  if( pDb
4090: 2d 3e 70 57 61 6c 48 6f 6f 6b 20 29 7b 0a 20 20  ->pWalHook ){.  
40a0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
40b0: 6e 74 28 70 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b  nt(pDb->pWalHook
40c0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62  );.  }.  if( pDb
40d0: 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64  ->pCollateNeeded
40e0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72   ){.    Tcl_Decr
40f0: 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 43  RefCount(pDb->pC
4100: 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20  ollateNeeded);. 
4110: 20 7d 0a 20 20 54 63 6c 5f 46 72 65 65 28 28 63   }.  Tcl_Free((c
4120: 68 61 72 2a 29 70 44 62 29 3b 0a 7d 0a 0a 2f 2a  har*)pDb);.}../*
4130: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
4140: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
4150: 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
4160: 69 73 20 6c 6f 63 6b 65 64 20 77 68 69 6c 65 20  is locked while 
4170: 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 65 78 65  trying.** to exe
4180: 63 75 74 65 20 53 51 4c 2e 0a 2a 2f 0a 73 74 61  cute SQL..*/.sta
4190: 74 69 63 20 69 6e 74 20 44 62 42 75 73 79 48 61  tic int DbBusyHa
41a0: 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 2c 20  ndler(void *cd, 
41b0: 69 6e 74 20 6e 54 72 69 65 73 29 7b 0a 20 20 53  int nTries){.  S
41c0: 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28  qliteDb *pDb = (
41d0: 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20  SqliteDb*)cd;.  
41e0: 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 7a  int rc;.  char z
41f0: 56 61 6c 5b 33 30 5d 3b 0a 0a 20 20 73 71 6c 69  Val[30];..  sqli
4200: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
4210: 65 6f 66 28 7a 56 61 6c 29 2c 20 7a 56 61 6c 2c  eof(zVal), zVal,
4220: 20 22 25 64 22 2c 20 6e 54 72 69 65 73 29 3b 0a   "%d", nTries);.
4230: 20 20 72 63 20 3d 20 54 63 6c 5f 56 61 72 45 76    rc = Tcl_VarEv
4240: 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20  al(pDb->interp, 
4250: 70 44 62 2d 3e 7a 42 75 73 79 2c 20 22 20 22 2c  pDb->zBusy, " ",
4260: 20 7a 56 61 6c 2c 20 28 63 68 61 72 2a 29 30 29   zVal, (char*)0)
4270: 3b 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f  ;.  if( rc!=TCL_
4280: 4f 4b 20 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47  OK || atoi(Tcl_G
4290: 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70  etStringResult(p
42a0: 44 62 2d 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a  Db->interp)) ){.
42b0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
42c0: 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
42d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
42e0: 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41  OMIT_PROGRESS_CA
42f0: 4c 4c 42 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69  LLBACK./*.** Thi
4300: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76  s routine is inv
4310: 6f 6b 65 64 20 61 73 20 74 68 65 20 27 70 72 6f  oked as the 'pro
4320: 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 27 20  gress callback' 
4330: 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
4340: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4350: 44 62 50 72 6f 67 72 65 73 73 48 61 6e 64 6c 65  DbProgressHandle
4360: 72 28 76 6f 69 64 20 2a 63 64 29 7b 0a 20 20 53  r(void *cd){.  S
4370: 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28  qliteDb *pDb = (
4380: 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20  SqliteDb*)cd;.  
4390: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
43a0: 74 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73  t( pDb->zProgres
43b0: 73 20 29 3b 0a 20 20 72 63 20 3d 20 54 63 6c 5f  s );.  rc = Tcl_
43c0: 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70  Eval(pDb->interp
43d0: 2c 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73  , pDb->zProgress
43e0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c  );.  if( rc!=TCL
43f0: 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28 54 63 6c 5f  _OK || atoi(Tcl_
4400: 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28  GetStringResult(
4410: 70 44 62 2d 3e 69 6e 74 65 72 70 29 29 20 29 7b  pDb->interp)) ){
4420: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
4430: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
4440: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
4450: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
4460: 54 5f 54 52 41 43 45 29 20 26 26 20 21 64 65 66  T_TRACE) && !def
4470: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
4480: 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29  _FLOATING_POINT)
4490: 20 26 26 20 5c 0a 20 20 20 20 21 64 65 66 69 6e   && \.    !defin
44a0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
44b0: 45 50 52 45 43 41 54 45 44 29 0a 2f 2a 0a 2a 2a  EPRECATED)./*.**
44c0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
44d0: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 53   called by the S
44e0: 51 4c 69 74 65 20 74 72 61 63 65 20 68 61 6e 64  QLite trace hand
44f0: 6c 65 72 20 77 68 65 6e 65 76 65 72 20 61 20 6e  ler whenever a n
4500: 65 77 0a 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20 53  ew.** block of S
4510: 51 4c 20 69 73 20 65 78 65 63 75 74 65 64 2e 20  QL is executed. 
4520: 20 54 68 65 20 54 43 4c 20 73 63 72 69 70 74 20   The TCL script 
4530: 69 6e 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 69  in pDb->zTrace i
4540: 73 20 65 78 65 63 75 74 65 64 2e 0a 2a 2f 0a 73  s executed..*/.s
4550: 74 61 74 69 63 20 76 6f 69 64 20 44 62 54 72 61  tatic void DbTra
4560: 63 65 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a  ceHandler(void *
4570: 63 64 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  cd, const char *
4580: 7a 53 71 6c 29 7b 0a 20 20 53 71 6c 69 74 65 44  zSql){.  SqliteD
4590: 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65  b *pDb = (Sqlite
45a0: 44 62 2a 29 63 64 3b 0a 20 20 54 63 6c 5f 44 53  Db*)cd;.  Tcl_DS
45b0: 74 72 69 6e 67 20 73 74 72 3b 0a 0a 20 20 54 63  tring str;..  Tc
45c0: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73  l_DStringInit(&s
45d0: 74 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  tr);.  Tcl_DStri
45e0: 6e 67 41 70 70 65 6e 64 28 26 73 74 72 2c 20 70  ngAppend(&str, p
45f0: 44 62 2d 3e 7a 54 72 61 63 65 2c 20 2d 31 29 3b  Db->zTrace, -1);
4600: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70  .  Tcl_DStringAp
4610: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72  pendElement(&str
4620: 2c 20 7a 53 71 6c 29 3b 0a 20 20 54 63 6c 5f 45  , zSql);.  Tcl_E
4630: 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c  val(pDb->interp,
4640: 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75   Tcl_DStringValu
4650: 65 28 26 73 74 72 29 29 3b 0a 20 20 54 63 6c 5f  e(&str));.  Tcl_
4660: 44 53 74 72 69 6e 67 46 72 65 65 28 26 73 74 72  DStringFree(&str
4670: 29 3b 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65  );.  Tcl_ResetRe
4680: 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70  sult(pDb->interp
4690: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  );.}.#endif..#if
46a0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
46b0: 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69  _TRACE./*.** Thi
46c0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
46d0: 6c 65 64 20 62 79 20 74 68 65 20 53 51 4c 69 74  led by the SQLit
46e0: 65 20 74 72 61 63 65 5f 76 32 20 68 61 6e 64 6c  e trace_v2 handl
46f0: 65 72 20 77 68 65 6e 65 76 65 72 20 61 20 6e 65  er whenever a ne
4700: 77 0a 2a 2a 20 73 75 70 70 6f 72 74 65 64 20 65  w.** supported e
4710: 76 65 6e 74 20 69 73 20 67 65 6e 65 72 61 74 65  vent is generate
4720: 64 2e 20 20 55 6e 73 75 70 70 6f 72 74 65 64 20  d.  Unsupported 
4730: 65 76 65 6e 74 20 74 79 70 65 73 20 61 72 65 20  event types are 
4740: 69 67 6e 6f 72 65 64 2e 0a 2a 2a 20 54 68 65 20  ignored..** The 
4750: 54 43 4c 20 73 63 72 69 70 74 20 69 6e 20 70 44  TCL script in pD
4760: 62 2d 3e 7a 54 72 61 63 65 56 32 20 69 73 20 65  b->zTraceV2 is e
4770: 78 65 63 75 74 65 64 2c 20 77 69 74 68 20 74 68  xecuted, with th
4780: 65 20 61 72 67 75 6d 65 6e 74 73 20 66 6f 72 0a  e arguments for.
4790: 2a 2a 20 74 68 65 20 65 76 65 6e 74 20 61 70 70  ** the event app
47a0: 65 6e 64 65 64 20 74 6f 20 69 74 20 28 61 73 20  ended to it (as 
47b0: 6c 69 73 74 20 65 6c 65 6d 65 6e 74 73 29 2e 0a  list elements)..
47c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62  */.static int Db
47d0: 54 72 61 63 65 56 32 48 61 6e 64 6c 65 72 28 0a  TraceV2Handler(.
47e0: 20 20 75 6e 73 69 67 6e 65 64 20 74 79 70 65 2c    unsigned type,
47f0: 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 53   /* One of the S
4800: 51 4c 49 54 45 5f 54 52 41 43 45 5f 2a 20 65 76  QLITE_TRACE_* ev
4810: 65 6e 74 20 74 79 70 65 73 2e 20 2a 2f 0a 20 20  ent types. */.  
4820: 76 6f 69 64 20 2a 63 64 2c 20 20 20 20 20 20 2f  void *cd,      /
4830: 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 63  * The original c
4840: 6f 6e 74 65 78 74 20 64 61 74 61 20 70 6f 69 6e  ontext data poin
4850: 74 65 72 2e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  ter. */.  void *
4860: 70 64 2c 20 20 20 20 20 20 2f 2a 20 50 72 69 6d  pd,      /* Prim
4870: 61 72 79 20 65 76 65 6e 74 20 64 61 74 61 2c 20  ary event data, 
4880: 64 65 70 65 6e 64 73 20 6f 6e 20 65 76 65 6e 74  depends on event
4890: 20 74 79 70 65 2e 20 2a 2f 0a 20 20 76 6f 69 64   type. */.  void
48a0: 20 2a 78 64 20 20 20 20 20 20 20 2f 2a 20 45 78   *xd       /* Ex
48b0: 74 72 61 20 65 76 65 6e 74 20 64 61 74 61 2c 20  tra event data, 
48c0: 64 65 70 65 6e 64 73 20 6f 6e 20 65 76 65 6e 74  depends on event
48d0: 20 74 79 70 65 2e 20 2a 2f 0a 29 7b 0a 20 20 53   type. */.){.  S
48e0: 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28  qliteDb *pDb = (
48f0: 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20  SqliteDb*)cd;.  
4900: 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 0a  Tcl_Obj *pCmd;..
4910: 20 20 73 77 69 74 63 68 28 20 74 79 70 65 20 29    switch( type )
4920: 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
4930: 45 5f 54 52 41 43 45 5f 53 54 4d 54 3a 20 7b 0a  E_TRACE_STMT: {.
4940: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
4950: 6d 74 20 2a 70 53 74 6d 74 20 3d 20 28 73 71 6c  mt *pStmt = (sql
4960: 69 74 65 33 5f 73 74 6d 74 20 2a 29 70 64 3b 0a  ite3_stmt *)pd;.
4970: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c        char *zSql
4980: 20 3d 20 28 63 68 61 72 20 2a 29 78 64 3b 0a 0a   = (char *)xd;..
4990: 20 20 20 20 20 20 70 43 6d 64 20 3d 20 54 63 6c        pCmd = Tcl
49a0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 44  _NewStringObj(pD
49b0: 62 2d 3e 7a 54 72 61 63 65 56 32 2c 20 2d 31 29  b->zTraceV2, -1)
49c0: 3b 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72  ;.      Tcl_Incr
49d0: 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a  RefCount(pCmd);.
49e0: 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62        Tcl_ListOb
49f0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70  jAppendElement(p
4a00: 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64  Db->interp, pCmd
4a10: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
4a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a30: 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f   Tcl_NewWideIntO
4a40: 62 6a 28 28 54 63 6c 5f 57 69 64 65 49 6e 74 29  bj((Tcl_WideInt)
4a50: 70 53 74 6d 74 29 29 3b 0a 20 20 20 20 20 20 54  pStmt));.      T
4a60: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
4a70: 45 6c 65 6d 65 6e 74 28 70 44 62 2d 3e 69 6e 74  Element(pDb->int
4a80: 65 72 70 2c 20 70 43 6d 64 2c 0a 20 20 20 20 20  erp, pCmd,.     
4a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4aa0: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4e 65            Tcl_Ne
4ab0: 77 53 74 72 69 6e 67 4f 62 6a 28 7a 53 71 6c 2c  wStringObj(zSql,
4ac0: 20 2d 31 29 29 3b 0a 20 20 20 20 20 20 54 63 6c   -1));.      Tcl
4ad0: 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e  _EvalObjEx(pDb->
4ae0: 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 43  interp, pCmd, TC
4af0: 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a  L_EVAL_DIRECT);.
4b00: 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65        Tcl_DecrRe
4b10: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20  fCount(pCmd);.  
4b20: 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73      Tcl_ResetRes
4b30: 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29  ult(pDb->interp)
4b40: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4b50: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
4b60: 4c 49 54 45 5f 54 52 41 43 45 5f 50 52 4f 46 49  LITE_TRACE_PROFI
4b70: 4c 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  LE: {.      sqli
4b80: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20  te3_stmt *pStmt 
4b90: 3d 20 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  = (sqlite3_stmt 
4ba0: 2a 29 70 64 3b 0a 20 20 20 20 20 20 73 71 6c 69  *)pd;.      sqli
4bb0: 74 65 33 5f 69 6e 74 36 34 20 6e 73 20 3d 20 28  te3_int64 ns = (
4bc0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 78 64  sqlite3_int64)xd
4bd0: 3b 0a 0a 20 20 20 20 20 20 70 43 6d 64 20 3d 20  ;..      pCmd = 
4be0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
4bf0: 28 70 44 62 2d 3e 7a 54 72 61 63 65 56 32 2c 20  (pDb->zTraceV2, 
4c00: 2d 31 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 49  -1);.      Tcl_I
4c10: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64  ncrRefCount(pCmd
4c20: 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69 73  );.      Tcl_Lis
4c30: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
4c40: 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70  t(pDb->interp, p
4c50: 43 6d 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Cmd,.           
4c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c70: 20 20 20 20 54 63 6c 5f 4e 65 77 57 69 64 65 49      Tcl_NewWideI
4c80: 6e 74 4f 62 6a 28 28 54 63 6c 5f 57 69 64 65 49  ntObj((Tcl_WideI
4c90: 6e 74 29 70 53 74 6d 74 29 29 3b 0a 20 20 20 20  nt)pStmt));.    
4ca0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
4cb0: 65 6e 64 45 6c 65 6d 65 6e 74 28 70 44 62 2d 3e  endElement(pDb->
4cc0: 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 0a 20 20  interp, pCmd,.  
4cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c               Tcl
4cf0: 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 28  _NewWideIntObj((
4d00: 54 63 6c 5f 57 69 64 65 49 6e 74 29 6e 73 29 29  Tcl_WideInt)ns))
4d10: 3b 0a 20 20 20 20 20 20 54 63 6c 5f 45 76 61 6c  ;.      Tcl_Eval
4d20: 4f 62 6a 45 78 28 70 44 62 2d 3e 69 6e 74 65 72  ObjEx(pDb->inter
4d30: 70 2c 20 70 43 6d 64 2c 20 54 43 4c 5f 45 56 41  p, pCmd, TCL_EVA
4d40: 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20 20 20 20  L_DIRECT);.     
4d50: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
4d60: 74 28 70 43 6d 64 29 3b 0a 20 20 20 20 20 20 54  t(pCmd);.      T
4d70: 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 70  cl_ResetResult(p
4d80: 44 62 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 20  Db->interp);.   
4d90: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4da0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
4db0: 54 52 41 43 45 5f 52 4f 57 3a 20 7b 0a 20 20 20  TRACE_ROW: {.   
4dc0: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
4dd0: 2a 70 53 74 6d 74 20 3d 20 28 73 71 6c 69 74 65  *pStmt = (sqlite
4de0: 33 5f 73 74 6d 74 20 2a 29 70 64 3b 0a 0a 20 20  3_stmt *)pd;..  
4df0: 20 20 20 20 70 43 6d 64 20 3d 20 54 63 6c 5f 4e      pCmd = Tcl_N
4e00: 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 44 62 2d  ewStringObj(pDb-
4e10: 3e 7a 54 72 61 63 65 56 32 2c 20 2d 31 29 3b 0a  >zTraceV2, -1);.
4e20: 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65        Tcl_IncrRe
4e30: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20  fCount(pCmd);.  
4e40: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
4e50: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70 44 62  ppendElement(pDb
4e60: 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 0a  ->interp, pCmd,.
4e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
4e90: 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a  cl_NewWideIntObj
4ea0: 28 28 54 63 6c 5f 57 69 64 65 49 6e 74 29 70 53  ((Tcl_WideInt)pS
4eb0: 74 6d 74 29 29 3b 0a 20 20 20 20 20 20 54 63 6c  tmt));.      Tcl
4ec0: 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e  _EvalObjEx(pDb->
4ed0: 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 43  interp, pCmd, TC
4ee0: 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a  L_EVAL_DIRECT);.
4ef0: 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65        Tcl_DecrRe
4f00: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20  fCount(pCmd);.  
4f10: 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73      Tcl_ResetRes
4f20: 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29  ult(pDb->interp)
4f30: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4f40: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
4f50: 4c 49 54 45 5f 54 52 41 43 45 5f 43 4c 4f 53 45  LITE_TRACE_CLOSE
4f60: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
4f70: 33 20 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33  3 *db = (sqlite3
4f80: 20 2a 29 70 64 3b 0a 0a 20 20 20 20 20 20 70 43   *)pd;..      pC
4f90: 6d 64 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69  md = Tcl_NewStri
4fa0: 6e 67 4f 62 6a 28 70 44 62 2d 3e 7a 54 72 61 63  ngObj(pDb->zTrac
4fb0: 65 56 32 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  eV2, -1);.      
4fc0: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
4fd0: 28 70 43 6d 64 29 3b 0a 20 20 20 20 20 20 54 63  (pCmd);.      Tc
4fe0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
4ff0: 6c 65 6d 65 6e 74 28 70 44 62 2d 3e 69 6e 74 65  lement(pDb->inte
5000: 72 70 2c 20 70 43 6d 64 2c 0a 20 20 20 20 20 20  rp, pCmd,.      
5010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5020: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4e 65 77           Tcl_New
5030: 57 69 64 65 49 6e 74 4f 62 6a 28 28 54 63 6c 5f  WideIntObj((Tcl_
5040: 57 69 64 65 49 6e 74 29 64 62 29 29 3b 0a 20 20  WideInt)db));.  
5050: 20 20 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45      Tcl_EvalObjE
5060: 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70  x(pDb->interp, p
5070: 43 6d 64 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49  Cmd, TCL_EVAL_DI
5080: 52 45 43 54 29 3b 0a 20 20 20 20 20 20 54 63 6c  RECT);.      Tcl
5090: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43  _DecrRefCount(pC
50a0: 6d 64 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 52  md);.      Tcl_R
50b0: 65 73 65 74 52 65 73 75 6c 74 28 70 44 62 2d 3e  esetResult(pDb->
50c0: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 20 20 62  interp);.      b
50d0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
50e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
50f0: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  OK;.}.#endif..#i
5100: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
5110: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26  E_OMIT_TRACE) &&
5120: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
5130: 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
5140: 4f 49 4e 54 29 20 26 26 20 5c 0a 20 20 20 20 21  OINT) && \.    !
5150: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
5160: 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 29 0a  MIT_DEPRECATED).
5170: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
5180: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
5190: 74 68 65 20 53 51 4c 69 74 65 20 70 72 6f 66 69  the SQLite profi
51a0: 6c 65 20 68 61 6e 64 6c 65 72 20 61 66 74 65 72  le handler after
51b0: 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20   a statement.** 
51c0: 53 51 4c 20 68 61 73 20 65 78 65 63 75 74 65 64  SQL has executed
51d0: 2e 20 20 54 68 65 20 54 43 4c 20 73 63 72 69 70  .  The TCL scrip
51e0: 74 20 69 6e 20 70 44 62 2d 3e 7a 50 72 6f 66 69  t in pDb->zProfi
51f0: 6c 65 20 69 73 20 65 76 61 6c 75 61 74 65 64 2e  le is evaluated.
5200: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5210: 44 62 50 72 6f 66 69 6c 65 48 61 6e 64 6c 65 72  DbProfileHandler
5220: 28 76 6f 69 64 20 2a 63 64 2c 20 63 6f 6e 73 74  (void *cd, const
5230: 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 73 71 6c   char *zSql, sql
5240: 69 74 65 5f 75 69 6e 74 36 34 20 74 6d 29 7b 0a  ite_uint64 tm){.
5250: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
5260: 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b  = (SqliteDb*)cd;
5270: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73  .  Tcl_DString s
5280: 74 72 3b 0a 20 20 63 68 61 72 20 7a 54 6d 5b 31  tr;.  char zTm[1
5290: 30 30 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  00];..  sqlite3_
52a0: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
52b0: 7a 54 6d 29 2d 31 2c 20 7a 54 6d 2c 20 22 25 6c  zTm)-1, zTm, "%l
52c0: 6c 64 22 2c 20 74 6d 29 3b 0a 20 20 54 63 6c 5f  ld", tm);.  Tcl_
52d0: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72  DStringInit(&str
52e0: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
52f0: 41 70 70 65 6e 64 28 26 73 74 72 2c 20 70 44 62  Append(&str, pDb
5300: 2d 3e 7a 50 72 6f 66 69 6c 65 2c 20 2d 31 29 3b  ->zProfile, -1);
5310: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70  .  Tcl_DStringAp
5320: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72  pendElement(&str
5330: 2c 20 7a 53 71 6c 29 3b 0a 20 20 54 63 6c 5f 44  , zSql);.  Tcl_D
5340: 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d  StringAppendElem
5350: 65 6e 74 28 26 73 74 72 2c 20 7a 54 6d 29 3b 0a  ent(&str, zTm);.
5360: 20 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e    Tcl_Eval(pDb->
5370: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44 53 74 72  interp, Tcl_DStr
5380: 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29 29 3b  ingValue(&str));
5390: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72  .  Tcl_DStringFr
53a0: 65 65 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f  ee(&str);.  Tcl_
53b0: 52 65 73 65 74 52 65 73 75 6c 74 28 70 44 62 2d  ResetResult(pDb-
53c0: 3e 69 6e 74 65 72 70 29 3b 0a 7d 0a 23 65 6e 64  >interp);.}.#end
53d0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  if../*.** This r
53e0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
53f0: 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
5400: 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
5410: 2e 20 20 54 68 65 0a 2a 2a 20 54 43 4c 20 73 63  .  The.** TCL sc
5420: 72 69 70 74 20 69 6e 20 70 44 62 2d 3e 7a 43 6f  ript in pDb->zCo
5430: 6d 6d 69 74 20 69 73 20 65 78 65 63 75 74 65 64  mmit is executed
5440: 2e 20 20 49 66 20 69 74 20 72 65 74 75 72 6e 73  .  If it returns
5450: 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 0a 2a 2a 20   non-zero or.** 
5460: 69 66 20 69 74 20 74 68 72 6f 77 73 20 61 6e 20  if it throws an 
5470: 65 78 63 65 70 74 69 6f 6e 2c 20 74 68 65 20 74  exception, the t
5480: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
5490: 6c 6c 65 64 20 62 61 63 6b 20 69 6e 73 74 65 61  lled back instea
54a0: 64 0a 2a 2a 20 6f 66 20 62 65 69 6e 67 20 63 6f  d.** of being co
54b0: 6d 6d 69 74 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  mmitted..*/.stat
54c0: 69 63 20 69 6e 74 20 44 62 43 6f 6d 6d 69 74 48  ic int DbCommitH
54d0: 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 29  andler(void *cd)
54e0: 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  {.  SqliteDb *pD
54f0: 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63  b = (SqliteDb*)c
5500: 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  d;.  int rc;..  
5510: 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 28 70 44  rc = Tcl_Eval(pD
5520: 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e  b->interp, pDb->
5530: 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20  zCommit);.  if( 
5540: 72 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74  rc!=TCL_OK || at
5550: 6f 69 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  oi(Tcl_GetString
5560: 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65  Result(pDb->inte
5570: 72 70 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75  rp)) ){.    retu
5580: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
5590: 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  rn 0;.}..static 
55a0: 76 6f 69 64 20 44 62 52 6f 6c 6c 62 61 63 6b 48  void DbRollbackH
55b0: 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 6c 69  andler(void *cli
55c0: 65 6e 74 44 61 74 61 29 7b 0a 20 20 53 71 6c 69  entData){.  Sqli
55d0: 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c  teDb *pDb = (Sql
55e0: 69 74 65 44 62 2a 29 63 6c 69 65 6e 74 44 61 74  iteDb*)clientDat
55f0: 61 3b 0a 20 20 61 73 73 65 72 74 28 70 44 62 2d  a;.  assert(pDb-
5600: 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 29 3b  >pRollbackHook);
5610: 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54  .  if( TCL_OK!=T
5620: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62  cl_EvalObjEx(pDb
5630: 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 70  ->interp, pDb->p
5640: 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 2c 20 30 29  RollbackHook, 0)
5650: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 42 61 63 6b   ){.    Tcl_Back
5660: 67 72 6f 75 6e 64 45 72 72 6f 72 28 70 44 62 2d  groundError(pDb-
5670: 3e 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 7d 0a  >interp);.  }.}.
5680: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 70 72 6f 63  ./*.** This proc
5690: 65 64 75 72 65 20 68 61 6e 64 6c 65 73 20 77 61  edure handles wa
56a0: 6c 5f 68 6f 6f 6b 20 63 61 6c 6c 62 61 63 6b 73  l_hook callbacks
56b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
56c0: 44 62 57 61 6c 48 61 6e 64 6c 65 72 28 0a 20 20  DbWalHandler(.  
56d0: 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61  void *clientData
56e0: 2c 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  ,.  sqlite3 *db,
56f0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
5700: 44 62 2c 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79  Db,.  int nEntry
5710: 0a 29 7b 0a 20 20 69 6e 74 20 72 65 74 20 3d 20  .){.  int ret = 
5720: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 54 63 6c  SQLITE_OK;.  Tcl
5730: 5f 4f 62 6a 20 2a 70 3b 0a 20 20 53 71 6c 69 74  _Obj *p;.  Sqlit
5740: 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69  eDb *pDb = (Sqli
5750: 74 65 44 62 2a 29 63 6c 69 65 6e 74 44 61 74 61  teDb*)clientData
5760: 3b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ;.  Tcl_Interp *
5770: 69 6e 74 65 72 70 20 3d 20 70 44 62 2d 3e 69 6e  interp = pDb->in
5780: 74 65 72 70 3b 0a 20 20 61 73 73 65 72 74 28 70  terp;.  assert(p
5790: 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 29 3b 0a 0a  Db->pWalHook);..
57a0: 20 20 61 73 73 65 72 74 28 20 64 62 3d 3d 70 44    assert( db==pD
57b0: 62 2d 3e 64 62 20 29 3b 0a 20 20 70 20 3d 20 54  b->db );.  p = T
57c0: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28  cl_DuplicateObj(
57d0: 70 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 29 3b 0a  pDb->pWalHook);.
57e0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
57f0: 6e 74 28 70 29 3b 0a 20 20 54 63 6c 5f 4c 69 73  nt(p);.  Tcl_Lis
5800: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
5810: 74 28 69 6e 74 65 72 70 2c 20 70 2c 20 54 63 6c  t(interp, p, Tcl
5820: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 44  _NewStringObj(zD
5830: 62 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c  b, -1));.  Tcl_L
5840: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
5850: 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 2c 20 54  ent(interp, p, T
5860: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 45 6e  cl_NewIntObj(nEn
5870: 74 72 79 29 29 3b 0a 20 20 69 66 28 20 54 43 4c  try));.  if( TCL
5880: 5f 4f 4b 21 3d 54 63 6c 5f 45 76 61 6c 4f 62 6a  _OK!=Tcl_EvalObj
5890: 45 78 28 69 6e 74 65 72 70 2c 20 70 2c 20 30 29  Ex(interp, p, 0)
58a0: 0a 20 20 20 7c 7c 20 54 43 4c 5f 4f 4b 21 3d 54  .   || TCL_OK!=T
58b0: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
58c0: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
58d0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
58e0: 29 2c 20 26 72 65 74 29 0a 20 20 29 7b 0a 20 20  ), &ret).  ){.  
58f0: 20 20 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64    Tcl_Background
5900: 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 20  Error(interp);. 
5910: 20 7d 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66   }.  Tcl_DecrRef
5920: 43 6f 75 6e 74 28 70 29 3b 0a 0a 20 20 72 65 74  Count(p);..  ret
5930: 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 23 69 66 20  urn ret;.}..#if 
5940: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
5950: 45 53 54 29 20 26 26 20 64 65 66 69 6e 65 64 28  EST) && defined(
5960: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e  SQLITE_ENABLE_UN
5970: 4c 4f 43 4b 5f 4e 4f 54 49 46 59 29 0a 73 74 61  LOCK_NOTIFY).sta
5980: 74 69 63 20 76 6f 69 64 20 73 65 74 54 65 73 74  tic void setTest
5990: 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 56 61 72 73  UnlockNotifyVars
59a0: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
59b0: 65 72 70 2c 20 69 6e 74 20 69 41 72 67 2c 20 69  erp, int iArg, i
59c0: 6e 74 20 6e 41 72 67 29 7b 0a 20 20 63 68 61 72  nt nArg){.  char
59d0: 20 7a 42 75 66 5b 36 34 5d 3b 0a 20 20 73 71 6c   zBuf[64];.  sql
59e0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
59f0: 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66  zeof(zBuf), zBuf
5a00: 2c 20 22 25 64 22 2c 20 69 41 72 67 29 3b 0a 20  , "%d", iArg);. 
5a10: 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65   Tcl_SetVar(inte
5a20: 72 70 2c 20 22 73 71 6c 69 74 65 5f 75 6e 6c 6f  rp, "sqlite_unlo
5a30: 63 6b 5f 6e 6f 74 69 66 79 5f 61 72 67 22 2c 20  ck_notify_arg", 
5a40: 7a 42 75 66 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c  zBuf, TCL_GLOBAL
5a50: 5f 4f 4e 4c 59 29 3b 0a 20 20 73 71 6c 69 74 65  _ONLY);.  sqlite
5a60: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
5a70: 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22  f(zBuf), zBuf, "
5a80: 25 64 22 2c 20 6e 41 72 67 29 3b 0a 20 20 54 63  %d", nArg);.  Tc
5a90: 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c  l_SetVar(interp,
5aa0: 20 22 73 71 6c 69 74 65 5f 75 6e 6c 6f 63 6b 5f   "sqlite_unlock_
5ab0: 6e 6f 74 69 66 79 5f 61 72 67 63 6f 75 6e 74 22  notify_argcount"
5ac0: 2c 20 7a 42 75 66 2c 20 54 43 4c 5f 47 4c 4f 42  , zBuf, TCL_GLOB
5ad0: 41 4c 5f 4f 4e 4c 59 29 3b 0a 7d 0a 23 65 6c 73  AL_ONLY);.}.#els
5ae0: 65 0a 23 20 64 65 66 69 6e 65 20 73 65 74 54 65  e.# define setTe
5af0: 73 74 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 56 61  stUnlockNotifyVa
5b00: 72 73 28 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66  rs(x,y,z).#endif
5b10: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
5b20: 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f  ENABLE_UNLOCK_NO
5b30: 54 49 46 59 0a 73 74 61 74 69 63 20 76 6f 69 64  TIFY.static void
5b40: 20 44 62 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 28   DbUnlockNotify(
5b50: 76 6f 69 64 20 2a 2a 61 70 41 72 67 2c 20 69 6e  void **apArg, in
5b60: 74 20 6e 41 72 67 29 7b 0a 20 20 69 6e 74 20 69  t nArg){.  int i
5b70: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
5b80: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  Arg; i++){.    c
5b90: 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d  onst int flags =
5ba0: 20 28 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41   (TCL_EVAL_GLOBA
5bb0: 4c 7c 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43  L|TCL_EVAL_DIREC
5bc0: 54 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 44 62  T);.    SqliteDb
5bd0: 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44   *pDb = (SqliteD
5be0: 62 20 2a 29 61 70 41 72 67 5b 69 5d 3b 0a 20 20  b *)apArg[i];.  
5bf0: 20 20 73 65 74 54 65 73 74 55 6e 6c 6f 63 6b 4e    setTestUnlockN
5c00: 6f 74 69 66 79 56 61 72 73 28 70 44 62 2d 3e 69  otifyVars(pDb->i
5c10: 6e 74 65 72 70 2c 20 69 2c 20 6e 41 72 67 29 3b  nterp, i, nArg);
5c20: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 44 62  .    assert( pDb
5c30: 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 29  ->pUnlockNotify)
5c40: 3b 0a 20 20 20 20 54 63 6c 5f 45 76 61 6c 4f 62  ;.    Tcl_EvalOb
5c50: 6a 45 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c  jEx(pDb->interp,
5c60: 20 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74   pDb->pUnlockNot
5c70: 69 66 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  ify, flags);.   
5c80: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
5c90: 74 28 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f  t(pDb->pUnlockNo
5ca0: 74 69 66 79 29 3b 0a 20 20 20 20 70 44 62 2d 3e  tify);.    pDb->
5cb0: 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 20 3d 20  pUnlockNotify = 
5cc0: 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  0;.  }.}.#endif.
5cd0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
5ce0: 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f  NABLE_PREUPDATE_
5cf0: 48 4f 4f 4b 0a 2f 2a 0a 2a 2a 20 50 72 65 2d 75  HOOK./*.** Pre-u
5d00: 70 64 61 74 65 20 68 6f 6f 6b 20 63 61 6c 6c 62  pdate hook callb
5d10: 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ack..*/.static v
5d20: 6f 69 64 20 44 62 50 72 65 55 70 64 61 74 65 48  oid DbPreUpdateH
5d30: 61 6e 64 6c 65 72 28 0a 20 20 76 6f 69 64 20 2a  andler(.  void *
5d40: 70 2c 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  p,.  sqlite3 *db
5d50: 2c 0a 20 20 69 6e 74 20 6f 70 2c 0a 20 20 63 6f  ,.  int op,.  co
5d60: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 0a 20  nst char *zDb,. 
5d70: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 62   const char *zTb
5d80: 6c 2c 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36  l,.  sqlite_int6
5d90: 34 20 69 4b 65 79 31 2c 0a 20 20 73 71 6c 69 74  4 iKey1,.  sqlit
5da0: 65 5f 69 6e 74 36 34 20 69 4b 65 79 32 0a 29 7b  e_int64 iKey2.){
5db0: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
5dc0: 20 3d 20 28 53 71 6c 69 74 65 44 62 20 2a 29 70   = (SqliteDb *)p
5dd0: 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d  ;.  Tcl_Obj *pCm
5de0: 64 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  d;.  static cons
5df0: 74 20 63 68 61 72 20 2a 61 7a 53 74 72 5b 5d 20  t char *azStr[] 
5e00: 3d 20 7b 22 44 45 4c 45 54 45 22 2c 20 22 49 4e  = {"DELETE", "IN
5e10: 53 45 52 54 22 2c 20 22 55 50 44 41 54 45 22 7d  SERT", "UPDATE"}
5e20: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 53 51  ;..  assert( (SQ
5e30: 4c 49 54 45 5f 44 45 4c 45 54 45 2d 31 29 2f 39  LITE_DELETE-1)/9
5e40: 20 3d 3d 20 30 20 29 3b 0a 20 20 61 73 73 65 72   == 0 );.  asser
5e50: 74 28 20 28 53 51 4c 49 54 45 5f 49 4e 53 45 52  t( (SQLITE_INSER
5e60: 54 2d 31 29 2f 39 20 3d 3d 20 31 20 29 3b 0a 20  T-1)/9 == 1 );. 
5e70: 20 61 73 73 65 72 74 28 20 28 53 51 4c 49 54 45   assert( (SQLITE
5e80: 5f 55 50 44 41 54 45 2d 31 29 2f 39 20 3d 3d 20  _UPDATE-1)/9 == 
5e90: 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  2 );.  assert( p
5ea0: 44 62 2d 3e 70 50 72 65 55 70 64 61 74 65 48 6f  Db->pPreUpdateHo
5eb0: 6f 6b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ok );.  assert( 
5ec0: 64 62 3d 3d 70 44 62 2d 3e 64 62 20 29 3b 0a 20  db==pDb->db );. 
5ed0: 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 51 4c   assert( op==SQL
5ee0: 49 54 45 5f 49 4e 53 45 52 54 20 7c 7c 20 6f 70  ITE_INSERT || op
5ef0: 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20  ==SQLITE_UPDATE 
5f00: 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 44 45  || op==SQLITE_DE
5f10: 4c 45 54 45 20 29 3b 0a 0a 20 20 70 43 6d 64 20  LETE );..  pCmd 
5f20: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
5f30: 62 6a 28 70 44 62 2d 3e 70 50 72 65 55 70 64 61  bj(pDb->pPreUpda
5f40: 74 65 48 6f 6f 6b 29 3b 0a 20 20 54 63 6c 5f 49  teHook);.  Tcl_I
5f50: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64  ncrRefCount(pCmd
5f60: 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
5f70: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
5f80: 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74   pCmd, Tcl_NewSt
5f90: 72 69 6e 67 4f 62 6a 28 61 7a 53 74 72 5b 28 6f  ringObj(azStr[(o
5fa0: 70 2d 31 29 2f 39 5d 2c 20 2d 31 29 29 3b 0a 20  p-1)/9], -1));. 
5fb0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
5fc0: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d  ndElement(0, pCm
5fd0: 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  d, Tcl_NewString
5fe0: 4f 62 6a 28 7a 44 62 2c 20 2d 31 29 29 3b 0a 20  Obj(zDb, -1));. 
5ff0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
6000: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d  ndElement(0, pCm
6010: 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  d, Tcl_NewString
6020: 4f 62 6a 28 7a 54 62 6c 2c 20 2d 31 29 29 3b 0a  Obj(zTbl, -1));.
6030: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
6040: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43  endElement(0, pC
6050: 6d 64 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49  md, Tcl_NewWideI
6060: 6e 74 4f 62 6a 28 69 4b 65 79 31 29 29 3b 0a 20  ntObj(iKey1));. 
6070: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
6080: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d  ndElement(0, pCm
6090: 64 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e  d, Tcl_NewWideIn
60a0: 74 4f 62 6a 28 69 4b 65 79 32 29 29 3b 0a 20 20  tObj(iKey2));.  
60b0: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44  Tcl_EvalObjEx(pD
60c0: 62 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c  b->interp, pCmd,
60d0: 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54   TCL_EVAL_DIRECT
60e0: 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66  );.  Tcl_DecrRef
60f0: 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 7d 0a 23  Count(pCmd);.}.#
6100: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
6110: 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45  ENABLE_PREUPDATE
6120: 5f 48 4f 4f 4b 20 2a 2f 0a 0a 73 74 61 74 69 63  _HOOK */..static
6130: 20 76 6f 69 64 20 44 62 55 70 64 61 74 65 48 61   void DbUpdateHa
6140: 6e 64 6c 65 72 28 0a 20 20 76 6f 69 64 20 2a 70  ndler(.  void *p
6150: 2c 0a 20 20 69 6e 74 20 6f 70 2c 0a 20 20 63 6f  ,.  int op,.  co
6160: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 0a 20  nst char *zDb,. 
6170: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 62   const char *zTb
6180: 6c 2c 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36  l,.  sqlite_int6
6190: 34 20 72 6f 77 69 64 0a 29 7b 0a 20 20 53 71 6c  4 rowid.){.  Sql
61a0: 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71  iteDb *pDb = (Sq
61b0: 6c 69 74 65 44 62 20 2a 29 70 3b 0a 20 20 54 63  liteDb *)p;.  Tc
61c0: 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 20 20 73  l_Obj *pCmd;.  s
61d0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
61e0: 20 2a 61 7a 53 74 72 5b 5d 20 3d 20 7b 22 44 45   *azStr[] = {"DE
61f0: 4c 45 54 45 22 2c 20 22 49 4e 53 45 52 54 22 2c  LETE", "INSERT",
6200: 20 22 55 50 44 41 54 45 22 7d 3b 0a 0a 20 20 61   "UPDATE"};..  a
6210: 73 73 65 72 74 28 20 28 53 51 4c 49 54 45 5f 44  ssert( (SQLITE_D
6220: 45 4c 45 54 45 2d 31 29 2f 39 20 3d 3d 20 30 20  ELETE-1)/9 == 0 
6230: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 53 51  );.  assert( (SQ
6240: 4c 49 54 45 5f 49 4e 53 45 52 54 2d 31 29 2f 39  LITE_INSERT-1)/9
6250: 20 3d 3d 20 31 20 29 3b 0a 20 20 61 73 73 65 72   == 1 );.  asser
6260: 74 28 20 28 53 51 4c 49 54 45 5f 55 50 44 41 54  t( (SQLITE_UPDAT
6270: 45 2d 31 29 2f 39 20 3d 3d 20 32 20 29 3b 0a 0a  E-1)/9 == 2 );..
6280: 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 70    assert( pDb->p
6290: 55 70 64 61 74 65 48 6f 6f 6b 20 29 3b 0a 20 20  UpdateHook );.  
62a0: 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 51 4c 49  assert( op==SQLI
62b0: 54 45 5f 49 4e 53 45 52 54 20 7c 7c 20 6f 70 3d  TE_INSERT || op=
62c0: 3d 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20 7c  =SQLITE_UPDATE |
62d0: 7c 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 44 45 4c  | op==SQLITE_DEL
62e0: 45 54 45 20 29 3b 0a 0a 20 20 70 43 6d 64 20 3d  ETE );..  pCmd =
62f0: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62   Tcl_DuplicateOb
6300: 6a 28 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f  j(pDb->pUpdateHo
6310: 6f 6b 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52  ok);.  Tcl_IncrR
6320: 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20  efCount(pCmd);. 
6330: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
6340: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d  ndElement(0, pCm
6350: 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  d, Tcl_NewString
6360: 4f 62 6a 28 61 7a 53 74 72 5b 28 6f 70 2d 31 29  Obj(azStr[(op-1)
6370: 2f 39 5d 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  /9], -1));.  Tcl
6380: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
6390: 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54  ement(0, pCmd, T
63a0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
63b0: 7a 44 62 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  zDb, -1));.  Tcl
63c0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
63d0: 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54  ement(0, pCmd, T
63e0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
63f0: 7a 54 62 6c 2c 20 2d 31 29 29 3b 0a 20 20 54 63  zTbl, -1));.  Tc
6400: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
6410: 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20  lement(0, pCmd, 
6420: 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62  Tcl_NewWideIntOb
6430: 6a 28 72 6f 77 69 64 29 29 3b 0a 20 20 54 63 6c  j(rowid));.  Tcl
6440: 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e  _EvalObjEx(pDb->
6450: 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 43  interp, pCmd, TC
6460: 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a  L_EVAL_DIRECT);.
6470: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
6480: 6e 74 28 70 43 6d 64 29 3b 0a 7d 0a 0a 73 74 61  nt(pCmd);.}..sta
6490: 74 69 63 20 76 6f 69 64 20 74 63 6c 43 6f 6c 6c  tic void tclColl
64a0: 61 74 65 4e 65 65 64 65 64 28 0a 20 20 76 6f 69  ateNeeded(.  voi
64b0: 64 20 2a 70 43 74 78 2c 0a 20 20 73 71 6c 69 74  d *pCtx,.  sqlit
64c0: 65 33 20 2a 64 62 2c 0a 20 20 69 6e 74 20 65 6e  e3 *db,.  int en
64d0: 63 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  c,.  const char 
64e0: 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 53 71 6c 69  *zName.){.  Sqli
64f0: 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c  teDb *pDb = (Sql
6500: 69 74 65 44 62 20 2a 29 70 43 74 78 3b 0a 20 20  iteDb *)pCtx;.  
6510: 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74  Tcl_Obj *pScript
6520: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
6530: 4f 62 6a 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74  Obj(pDb->pCollat
6540: 65 4e 65 65 64 65 64 29 3b 0a 20 20 54 63 6c 5f  eNeeded);.  Tcl_
6550: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63  IncrRefCount(pSc
6560: 72 69 70 74 29 3b 0a 20 20 54 63 6c 5f 4c 69 73  ript);.  Tcl_Lis
6570: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
6580: 74 28 30 2c 20 70 53 63 72 69 70 74 2c 20 54 63  t(0, pScript, Tc
6590: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a  l_NewStringObj(z
65a0: 4e 61 6d 65 2c 20 2d 31 29 29 3b 0a 20 20 54 63  Name, -1));.  Tc
65b0: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d  l_EvalObjEx(pDb-
65c0: 3e 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74  >interp, pScript
65d0: 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72  , 0);.  Tcl_Decr
65e0: 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74  RefCount(pScript
65f0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
6600: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
6610: 65 64 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61  ed to evaluate a
6620: 6e 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20  n SQL collation 
6630: 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65  function impleme
6640: 6e 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20 54 43  nted.** using TC
6650: 4c 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 73 74 61  L script..*/.sta
6660: 74 69 63 20 69 6e 74 20 74 63 6c 53 71 6c 43 6f  tic int tclSqlCo
6670: 6c 6c 61 74 65 28 0a 20 20 76 6f 69 64 20 2a 70  llate(.  void *p
6680: 43 74 78 2c 0a 20 20 69 6e 74 20 6e 41 2c 0a 20  Ctx,.  int nA,. 
6690: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 41 2c   const void *zA,
66a0: 0a 20 20 69 6e 74 20 6e 42 2c 0a 20 20 63 6f 6e  .  int nB,.  con
66b0: 73 74 20 76 6f 69 64 20 2a 7a 42 0a 29 7b 0a 20  st void *zB.){. 
66c0: 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 20 3d   SqlCollate *p =
66d0: 20 28 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 29 70   (SqlCollate *)p
66e0: 43 74 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  Ctx;.  Tcl_Obj *
66f0: 70 43 6d 64 3b 0a 0a 20 20 70 43 6d 64 20 3d 20  pCmd;..  pCmd = 
6700: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
6710: 28 70 2d 3e 7a 53 63 72 69 70 74 2c 20 2d 31 29  (p->zScript, -1)
6720: 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43  ;.  Tcl_IncrRefC
6730: 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 54 63  ount(pCmd);.  Tc
6740: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
6750: 6c 65 6d 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70  lement(p->interp
6760: 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53  , pCmd, Tcl_NewS
6770: 74 72 69 6e 67 4f 62 6a 28 7a 41 2c 20 6e 41 29  tringObj(zA, nA)
6780: 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
6790: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70 2d  AppendElement(p-
67a0: 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54  >interp, pCmd, T
67b0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
67c0: 7a 42 2c 20 6e 42 29 29 3b 0a 20 20 54 63 6c 5f  zB, nB));.  Tcl_
67d0: 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74  EvalObjEx(p->int
67e0: 65 72 70 2c 20 70 43 6d 64 2c 20 54 43 4c 5f 45  erp, pCmd, TCL_E
67f0: 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20 54  VAL_DIRECT);.  T
6800: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
6810: 70 43 6d 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  pCmd);.  return 
6820: 28 61 74 6f 69 28 54 63 6c 5f 47 65 74 53 74 72  (atoi(Tcl_GetStr
6830: 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74  ingResult(p->int
6840: 65 72 70 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  erp)));.}../*.**
6850: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
6860: 20 63 61 6c 6c 65 64 20 74 6f 20 65 76 61 6c 75   called to evalu
6870: 61 74 65 20 61 6e 20 53 51 4c 20 66 75 6e 63 74  ate an SQL funct
6880: 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a  ion implemented.
6890: 2a 2a 20 75 73 69 6e 67 20 54 43 4c 20 73 63 72  ** using TCL scr
68a0: 69 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ipt..*/.static v
68b0: 6f 69 64 20 74 63 6c 53 71 6c 46 75 6e 63 28 73  oid tclSqlFunc(s
68c0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
68d0: 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
68e0: 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
68f0: 2a 2a 61 72 67 76 29 7b 0a 20 20 53 71 6c 46 75  **argv){.  SqlFu
6900: 6e 63 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 5f  nc *p = sqlite3_
6910: 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78  user_data(contex
6920: 74 29 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  t);.  Tcl_Obj *p
6930: 43 6d 64 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  Cmd;.  int i;.  
6940: 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 61  int rc;..  if( a
6950: 72 67 63 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  rgc==0 ){.    /*
6960: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
6970: 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68   arguments to th
6980: 65 20 66 75 6e 63 74 69 6f 6e 2c 20 63 61 6c 6c  e function, call
6990: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 20 6f   Tcl_EvalObjEx o
69a0: 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 63 72  n the.    ** scr
69b0: 69 70 74 20 6f 62 6a 65 63 74 20 64 69 72 65 63  ipt object direc
69c0: 74 6c 79 2e 20 20 54 68 69 73 20 61 6c 6c 6f 77  tly.  This allow
69d0: 73 20 74 68 65 20 54 43 4c 20 63 6f 6d 70 69 6c  s the TCL compil
69e0: 65 72 20 74 6f 20 67 65 6e 65 72 61 74 65 0a 20  er to generate. 
69f0: 20 20 20 2a 2a 20 62 79 74 65 63 6f 64 65 20 66     ** bytecode f
6a00: 6f 72 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6f  or the command o
6a10: 6e 20 74 68 65 20 66 69 72 73 74 20 69 6e 76 6f  n the first invo
6a20: 63 61 74 69 6f 6e 20 61 6e 64 20 74 68 75 73 20  cation and thus 
6a30: 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 62 73  make.    ** subs
6a40: 65 71 75 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f  equent invocatio
6a50: 6e 73 20 6d 75 63 68 20 66 61 73 74 65 72 2e 20  ns much faster. 
6a60: 2a 2f 0a 20 20 20 20 70 43 6d 64 20 3d 20 70 2d  */.    pCmd = p-
6a70: 3e 70 53 63 72 69 70 74 3b 0a 20 20 20 20 54 63  >pScript;.    Tc
6a80: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
6a90: 43 6d 64 29 3b 0a 20 20 20 20 72 63 20 3d 20 54  Cmd);.    rc = T
6aa0: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e  cl_EvalObjEx(p->
6ab0: 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 30 29  interp, pCmd, 0)
6ac0: 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  ;.    Tcl_DecrRe
6ad0: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20  fCount(pCmd);.  
6ae0: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
6af0: 20 74 68 65 72 65 20 61 72 65 20 61 72 67 75 6d   there are argum
6b00: 65 6e 74 73 20 74 6f 20 74 68 65 20 66 75 6e 63  ents to the func
6b10: 74 69 6f 6e 2c 20 6d 61 6b 65 20 61 20 73 68 61  tion, make a sha
6b20: 6c 6c 6f 77 20 63 6f 70 79 20 6f 66 20 74 68 65  llow copy of the
6b30: 0a 20 20 20 20 2a 2a 20 73 63 72 69 70 74 20 6f  .    ** script o
6b40: 62 6a 65 63 74 2c 20 6c 61 70 70 65 6e 64 20 74  bject, lappend t
6b50: 68 65 20 61 72 67 75 6d 65 6e 74 73 2c 20 74 68  he arguments, th
6b60: 65 6e 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  en evaluate the 
6b70: 63 6f 70 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  copy..    **.   
6b80: 20 2a 2a 20 42 79 20 22 73 68 61 6c 6c 6f 77 22   ** By "shallow"
6b90: 20 63 6f 70 79 2c 20 77 65 20 6d 65 61 6e 20 6f   copy, we mean o
6ba0: 6e 6c 79 20 74 68 65 20 6f 75 74 65 72 20 6c 69  nly the outer li
6bb0: 73 74 20 54 63 6c 5f 4f 62 6a 20 69 73 20 64 75  st Tcl_Obj is du
6bc0: 70 6c 69 63 61 74 65 64 2e 0a 20 20 20 20 2a 2a  plicated..    **
6bd0: 20 54 68 65 20 6e 65 77 20 54 63 6c 5f 4f 62 6a   The new Tcl_Obj
6be0: 20 63 6f 6e 74 61 69 6e 73 20 70 6f 69 6e 74 65   contains pointe
6bf0: 72 73 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e  rs to the origin
6c00: 61 6c 20 6c 69 73 74 20 65 6c 65 6d 65 6e 74 73  al list elements
6c10: 2e 0a 20 20 20 20 2a 2a 20 54 68 61 74 20 77 61  ..    ** That wa
6c20: 79 2c 20 77 68 65 6e 20 54 63 6c 5f 45 76 61 6c  y, when Tcl_Eval
6c30: 4f 62 6a 76 28 29 20 69 73 20 72 75 6e 20 61 6e  Objv() is run an
6c40: 64 20 73 68 69 6d 6d 65 72 73 20 74 68 65 20 66  d shimmers the f
6c50: 69 72 73 74 20 65 6c 65 6d 65 6e 74 0a 20 20 20  irst element.   
6c60: 20 2a 2a 20 6f 66 20 74 68 65 20 6c 69 73 74 20   ** of the list 
6c70: 74 6f 20 74 63 6c 43 6d 64 4e 61 6d 65 54 79 70  to tclCmdNameTyp
6c80: 65 2c 20 74 68 61 74 20 61 6c 74 65 72 6e 61 74  e, that alternat
6c90: 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  e representation
6ca0: 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20   will.    ** be 
6cb0: 70 72 65 73 65 72 76 65 64 20 61 6e 64 20 72 65  preserved and re
6cc0: 75 73 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74  used on the next
6cd0: 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a 20 20 20   invocation..   
6ce0: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20   */.    Tcl_Obj 
6cf0: 2a 2a 61 41 72 67 3b 0a 20 20 20 20 69 6e 74 20  **aArg;.    int 
6d00: 6e 41 72 67 3b 0a 20 20 20 20 69 66 28 20 54 63  nArg;.    if( Tc
6d10: 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d  l_ListObjGetElem
6d20: 65 6e 74 73 28 70 2d 3e 69 6e 74 65 72 70 2c 20  ents(p->interp, 
6d30: 70 2d 3e 70 53 63 72 69 70 74 2c 20 26 6e 41 72  p->pScript, &nAr
6d40: 67 2c 20 26 61 41 72 67 29 20 29 7b 0a 20 20 20  g, &aArg) ){.   
6d50: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
6d60: 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
6d70: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65   Tcl_GetStringRe
6d80: 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c  sult(p->interp),
6d90: 20 2d 31 29 3b 0a 20 20 20 20 20 20 72 65 74 75   -1);.      retu
6da0: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  rn;.    }.    pC
6db0: 6d 64 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74  md = Tcl_NewList
6dc0: 4f 62 6a 28 6e 41 72 67 2c 20 61 41 72 67 29 3b  Obj(nArg, aArg);
6dd0: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
6de0: 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20  Count(pCmd);.   
6df0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63   for(i=0; i<argc
6e00: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
6e10: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 49 6e  lite3_value *pIn
6e20: 20 3d 20 61 72 67 76 5b 69 5d 3b 0a 20 20 20 20   = argv[i];.    
6e30: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c 3b    Tcl_Obj *pVal;
6e40: 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20 70  ..      /* Set p
6e50: 56 61 6c 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  Val to contain t
6e60: 68 65 20 69 27 74 68 20 63 6f 6c 75 6d 6e 20 6f  he i'th column o
6e70: 66 20 74 68 69 73 20 72 6f 77 2e 20 2a 2f 0a 20  f this row. */. 
6e80: 20 20 20 20 20 73 77 69 74 63 68 28 20 73 71 6c       switch( sql
6e90: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
6ea0: 70 49 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pIn) ){.        
6eb0: 63 61 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42  case SQLITE_BLOB
6ec0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  : {.          in
6ed0: 74 20 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65  t bytes = sqlite
6ee0: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70 49  3_value_bytes(pI
6ef0: 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 56  n);.          pV
6f00: 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65  al = Tcl_NewByte
6f10: 41 72 72 61 79 4f 62 6a 28 73 71 6c 69 74 65 33  ArrayObj(sqlite3
6f20: 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 70 49 6e 29  _value_blob(pIn)
6f30: 2c 20 62 79 74 65 73 29 3b 0a 20 20 20 20 20 20  , bytes);.      
6f40: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
6f50: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73     }.        cas
6f60: 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  e SQLITE_INTEGER
6f70: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  : {.          sq
6f80: 6c 69 74 65 5f 69 6e 74 36 34 20 76 20 3d 20 73  lite_int64 v = s
6f90: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
6fa0: 36 34 28 70 49 6e 29 3b 0a 20 20 20 20 20 20 20  64(pIn);.       
6fb0: 20 20 20 69 66 28 20 76 3e 3d 2d 32 31 34 37 34     if( v>=-21474
6fc0: 38 33 36 34 37 20 26 26 20 76 3c 3d 32 31 34 37  83647 && v<=2147
6fd0: 34 38 33 36 34 37 20 29 7b 0a 20 20 20 20 20 20  483647 ){.      
6fe0: 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c        pVal = Tcl
6ff0: 5f 4e 65 77 49 6e 74 4f 62 6a 28 28 69 6e 74 29  _NewIntObj((int)
7000: 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  v);.          }e
7010: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
7020: 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 57   pVal = Tcl_NewW
7030: 69 64 65 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20  ideIntObj(v);.  
7040: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7050: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
7060: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73     }.        cas
7070: 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20  e SQLITE_FLOAT: 
7080: 7b 0a 20 20 20 20 20 20 20 20 20 20 64 6f 75 62  {.          doub
7090: 6c 65 20 72 20 3d 20 73 71 6c 69 74 65 33 5f 76  le r = sqlite3_v
70a0: 61 6c 75 65 5f 64 6f 75 62 6c 65 28 70 49 6e 29  alue_double(pIn)
70b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 56 61 6c  ;.          pVal
70c0: 20 3d 20 54 63 6c 5f 4e 65 77 44 6f 75 62 6c 65   = Tcl_NewDouble
70d0: 4f 62 6a 28 72 29 3b 0a 20 20 20 20 20 20 20 20  Obj(r);.        
70e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
70f0: 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20   }.        case 
7100: 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20  SQLITE_NULL: {. 
7110: 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20           pVal = 
7120: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
7130: 28 70 2d 3e 70 44 62 2d 3e 7a 4e 75 6c 6c 2c 20  (p->pDb->zNull, 
7140: 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  -1);.          b
7150: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
7160: 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a          default:
7170: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74   {.          int
7180: 20 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33   bytes = sqlite3
7190: 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70 49 6e  _value_bytes(pIn
71a0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 56 61  );.          pVa
71b0: 6c 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  l = Tcl_NewStrin
71c0: 67 4f 62 6a 28 28 63 68 61 72 20 2a 29 73 71 6c  gObj((char *)sql
71d0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
71e0: 70 49 6e 29 2c 20 62 79 74 65 73 29 3b 0a 20 20  pIn), bytes);.  
71f0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
7200: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
7210: 0a 20 20 20 20 20 20 72 63 20 3d 20 54 63 6c 5f  .      rc = Tcl_
7220: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
7230: 6d 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c 20  ment(p->interp, 
7240: 70 43 6d 64 2c 20 70 56 61 6c 29 3b 0a 20 20 20  pCmd, pVal);.   
7250: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
7260: 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66       Tcl_DecrRef
7270: 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20  Count(pCmd);.   
7280: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
7290: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
72a0: 74 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  t, Tcl_GetString
72b0: 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70  Result(p->interp
72c0: 29 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  ), -1);.        
72d0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
72e0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 70      }.    if( !p
72f0: 2d 3e 75 73 65 45 76 61 6c 4f 62 6a 76 20 29 7b  ->useEvalObjv ){
7300: 0a 20 20 20 20 20 20 2f 2a 20 54 63 6c 5f 45 76  .      /* Tcl_Ev
7310: 61 6c 4f 62 6a 45 78 28 29 20 77 69 6c 6c 20 61  alObjEx() will a
7320: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 61 6c  utomatically cal
7330: 6c 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29  l Tcl_EvalObjv()
7340: 20 69 66 20 70 43 6d 64 0a 20 20 20 20 20 20 2a   if pCmd.      *
7350: 2a 20 69 73 20 61 20 6c 69 73 74 20 77 69 74 68  * is a list with
7360: 6f 75 74 20 61 20 73 74 72 69 6e 67 20 72 65 70  out a string rep
7370: 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20 20 54 6f  resentation.  To
7380: 20 70 72 65 76 65 6e 74 20 74 68 69 73 20 66 72   prevent this fr
7390: 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 68 61 70 70  om.      ** happ
73a0: 65 6e 69 6e 67 2c 20 6d 61 6b 65 20 73 75 72 65  ening, make sure
73b0: 20 70 43 6d 64 20 68 61 73 20 61 20 76 61 6c 69   pCmd has a vali
73c0: 64 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65  d string represe
73d0: 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ntation */.     
73e0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 70   Tcl_GetString(p
73f0: 43 6d 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Cmd);.    }.    
7400: 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  rc = Tcl_EvalObj
7410: 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43  Ex(p->interp, pC
7420: 6d 64 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52  md, TCL_EVAL_DIR
7430: 45 43 54 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65  ECT);.    Tcl_De
7440: 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29  crRefCount(pCmd)
7450: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 20  ;.  }..  if( rc 
7460: 26 26 20 72 63 21 3d 54 43 4c 5f 52 45 54 55 52  && rc!=TCL_RETUR
7470: 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  N ){.    sqlite3
7480: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f  _result_error(co
7490: 6e 74 65 78 74 2c 20 54 63 6c 5f 47 65 74 53 74  ntext, Tcl_GetSt
74a0: 72 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e  ringResult(p->in
74b0: 74 65 72 70 29 2c 20 2d 31 29 3b 0a 20 20 7d 65  terp), -1);.  }e
74c0: 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  lse{.    Tcl_Obj
74d0: 20 2a 70 56 61 72 20 3d 20 54 63 6c 5f 47 65 74   *pVar = Tcl_Get
74e0: 4f 62 6a 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74  ObjResult(p->int
74f0: 65 72 70 29 3b 0a 20 20 20 20 69 6e 74 20 6e 3b  erp);.    int n;
7500: 0a 20 20 20 20 75 38 20 2a 64 61 74 61 3b 0a 20  .    u8 *data;. 
7510: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
7520: 54 79 70 65 20 3d 20 28 70 56 61 72 2d 3e 74 79  Type = (pVar->ty
7530: 70 65 50 74 72 20 3f 20 70 56 61 72 2d 3e 74 79  pePtr ? pVar->ty
7540: 70 65 50 74 72 2d 3e 6e 61 6d 65 20 3a 20 22 22  pePtr->name : ""
7550: 29 3b 0a 20 20 20 20 63 68 61 72 20 63 20 3d 20  );.    char c = 
7560: 7a 54 79 70 65 5b 30 5d 3b 0a 20 20 20 20 69 66  zType[0];.    if
7570: 28 20 63 3d 3d 27 62 27 20 26 26 20 73 74 72 63  ( c=='b' && strc
7580: 6d 70 28 7a 54 79 70 65 2c 22 62 79 74 65 61 72  mp(zType,"bytear
7590: 72 61 79 22 29 3d 3d 30 20 26 26 20 70 56 61 72  ray")==0 && pVar
75a0: 2d 3e 62 79 74 65 73 3d 3d 30 20 29 7b 0a 20 20  ->bytes==0 ){.  
75b0: 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 72 65 74 75      /* Only retu
75c0: 72 6e 20 61 20 42 4c 4f 42 20 74 79 70 65 20 69  rn a BLOB type i
75d0: 66 20 74 68 65 20 54 63 6c 20 76 61 72 69 61 62  f the Tcl variab
75e0: 6c 65 20 69 73 20 61 20 62 79 74 65 61 72 72 61  le is a bytearra
75f0: 79 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 68  y and.      ** h
7600: 61 73 20 6e 6f 20 73 74 72 69 6e 67 20 72 65 70  as no string rep
7610: 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20 2a 2f 0a  resentation. */.
7620: 20 20 20 20 20 20 64 61 74 61 20 3d 20 54 63 6c        data = Tcl
7630: 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f  _GetByteArrayFro
7640: 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a  mObj(pVar, &n);.
7650: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
7660: 73 75 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78  sult_blob(contex
7670: 74 2c 20 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49  t, data, n, SQLI
7680: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
7690: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
76a0: 27 62 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54  'b' && strcmp(zT
76b0: 79 70 65 2c 22 62 6f 6f 6c 65 61 6e 22 29 3d 3d  ype,"boolean")==
76c0: 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 47  0 ){.      Tcl_G
76d0: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 30 2c 20  etIntFromObj(0, 
76e0: 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20  pVar, &n);.     
76f0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
7700: 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 6e 29 3b  int(context, n);
7710: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
7720: 3d 3d 27 64 27 20 26 26 20 73 74 72 63 6d 70 28  =='d' && strcmp(
7730: 7a 54 79 70 65 2c 22 64 6f 75 62 6c 65 22 29 3d  zType,"double")=
7740: 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 6f 75 62  =0 ){.      doub
7750: 6c 65 20 72 3b 0a 20 20 20 20 20 20 54 63 6c 5f  le r;.      Tcl_
7760: 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a  GetDoubleFromObj
7770: 28 30 2c 20 70 56 61 72 2c 20 26 72 29 3b 0a 20  (0, pVar, &r);. 
7780: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
7790: 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65  ult_double(conte
77a0: 78 74 2c 20 72 29 3b 0a 20 20 20 20 7d 65 6c 73  xt, r);.    }els
77b0: 65 20 69 66 28 20 28 63 3d 3d 27 77 27 20 26 26  e if( (c=='w' &&
77c0: 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 77   strcmp(zType,"w
77d0: 69 64 65 49 6e 74 22 29 3d 3d 30 29 20 7c 7c 0a  ideInt")==0) ||.
77e0: 20 20 20 20 20 20 20 20 20 20 28 63 3d 3d 27 69            (c=='i
77f0: 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70  ' && strcmp(zTyp
7800: 65 2c 22 69 6e 74 22 29 3d 3d 30 29 20 29 7b 0a  e,"int")==0) ){.
7810: 20 20 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e        Tcl_WideIn
7820: 74 20 76 3b 0a 20 20 20 20 20 20 54 63 6c 5f 47  t v;.      Tcl_G
7830: 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a  etWideIntFromObj
7840: 28 30 2c 20 70 56 61 72 2c 20 26 76 29 3b 0a 20  (0, pVar, &v);. 
7850: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
7860: 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78  ult_int64(contex
7870: 74 2c 20 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t, v);.    }else
7880: 7b 0a 20 20 20 20 20 20 64 61 74 61 20 3d 20 28  {.      data = (
7890: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
78a0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
78b0: 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a  mObj(pVar, &n);.
78c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
78d0: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
78e0: 74 2c 20 28 63 68 61 72 20 2a 29 64 61 74 61 2c  t, (char *)data,
78f0: 20 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53   n, SQLITE_TRANS
7900: 49 45 4e 54 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  IENT);.    }.  }
7910: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
7920: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
7930: 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ATION./*.** This
7940: 20 69 73 20 74 68 65 20 61 75 74 68 65 6e 74 69   is the authenti
7950: 63 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 2e  cation function.
7960: 20 20 49 74 20 61 70 70 65 6e 64 73 20 74 68 65    It appends the
7970: 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 0a   authentication.
7980: 2a 2a 20 74 79 70 65 20 63 6f 64 65 20 61 6e 64  ** type code and
7990: 20 74 68 65 20 74 77 6f 20 61 72 67 75 6d 65 6e   the two argumen
79a0: 74 73 20 74 6f 20 7a 43 6d 64 5b 5d 20 74 68 65  ts to zCmd[] the
79b0: 6e 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 72 65  n invokes the re
79c0: 73 75 6c 74 0a 2a 2a 20 6f 6e 20 74 68 65 20 69  sult.** on the i
79d0: 6e 74 65 72 70 72 65 74 65 72 2e 20 20 54 68 65  nterpreter.  The
79e0: 20 72 65 70 6c 79 20 69 73 20 65 78 61 6d 69 6e   reply is examin
79f0: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
7a00: 69 66 20 74 68 65 0a 2a 2a 20 61 75 74 68 65 6e  if the.** authen
7a10: 74 69 63 61 74 69 6f 6e 20 66 61 69 6c 73 20 6f  tication fails o
7a20: 72 20 73 75 63 63 65 65 64 73 2e 0a 2a 2f 0a 73  r succeeds..*/.s
7a30: 74 61 74 69 63 20 69 6e 74 20 61 75 74 68 5f 63  tatic int auth_c
7a40: 61 6c 6c 62 61 63 6b 28 0a 20 20 76 6f 69 64 20  allback(.  void 
7a50: 2a 70 41 72 67 2c 0a 20 20 69 6e 74 20 63 6f 64  *pArg,.  int cod
7a60: 65 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e,.  const char 
7a70: 2a 7a 41 72 67 31 2c 0a 20 20 63 6f 6e 73 74 20  *zArg1,.  const 
7a80: 63 68 61 72 20 2a 7a 41 72 67 32 2c 0a 20 20 63  char *zArg2,.  c
7a90: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 33  onst char *zArg3
7aa0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
7ab0: 7a 41 72 67 34 0a 23 69 66 64 65 66 20 53 51 4c  zArg4.#ifdef SQL
7ac0: 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54  ITE_USER_AUTHENT
7ad0: 49 43 41 54 49 4f 4e 0a 20 20 2c 63 6f 6e 73 74  ICATION.  ,const
7ae0: 20 63 68 61 72 20 2a 7a 41 72 67 35 0a 23 65 6e   char *zArg5.#en
7af0: 64 69 66 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63  dif.){.  const c
7b00: 68 61 72 20 2a 7a 43 6f 64 65 3b 0a 20 20 54 63  har *zCode;.  Tc
7b10: 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a 20  l_DString str;. 
7b20: 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74   int rc;.  const
7b30: 20 63 68 61 72 20 2a 7a 52 65 70 6c 79 3b 0a 20   char *zReply;. 
7b40: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
7b50: 20 28 53 71 6c 69 74 65 44 62 2a 29 70 41 72 67   (SqliteDb*)pArg
7b60: 3b 0a 20 20 69 66 28 20 70 44 62 2d 3e 64 69 73  ;.  if( pDb->dis
7b70: 61 62 6c 65 41 75 74 68 20 29 20 72 65 74 75 72  ableAuth ) retur
7b80: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
7b90: 73 77 69 74 63 68 28 20 63 6f 64 65 20 29 7b 0a  switch( code ){.
7ba0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
7bb0: 43 4f 50 59 20 20 20 20 20 20 20 20 20 20 20 20  COPY            
7bc0: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
7bd0: 45 5f 43 4f 50 59 22 3b 20 62 72 65 61 6b 3b 0a  E_COPY"; break;.
7be0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
7bf0: 43 52 45 41 54 45 5f 49 4e 44 45 58 20 20 20 20  CREATE_INDEX    
7c00: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
7c10: 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 22 3b  E_CREATE_INDEX";
7c20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
7c30: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
7c40: 41 42 4c 45 20 20 20 20 20 20 3a 20 7a 43 6f 64  ABLE      : zCod
7c50: 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45  e="SQLITE_CREATE
7c60: 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a  _TABLE"; break;.
7c70: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
7c80: 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45  CREATE_TEMP_INDE
7c90: 58 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54  X : zCode="SQLIT
7ca0: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e  E_CREATE_TEMP_IN
7cb0: 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  DEX"; break;.   
7cc0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45   case SQLITE_CRE
7cd0: 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 20 3a  ATE_TEMP_TABLE :
7ce0: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43   zCode="SQLITE_C
7cf0: 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45  REATE_TEMP_TABLE
7d00: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
7d10: 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45  se SQLITE_CREATE
7d20: 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 3a 20 7a  _TEMP_TRIGGER: z
7d30: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45  Code="SQLITE_CRE
7d40: 41 54 45 5f 54 45 4d 50 5f 54 52 49 47 47 45 52  ATE_TEMP_TRIGGER
7d50: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
7d60: 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45  se SQLITE_CREATE
7d70: 5f 54 45 4d 50 5f 56 49 45 57 20 20 3a 20 7a 43  _TEMP_VIEW  : zC
7d80: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41  ode="SQLITE_CREA
7d90: 54 45 5f 54 45 4d 50 5f 56 49 45 57 22 3b 20 62  TE_TEMP_VIEW"; b
7da0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
7db0: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 52 49  QLITE_CREATE_TRI
7dc0: 47 47 45 52 20 20 20 20 3a 20 7a 43 6f 64 65 3d  GGER    : zCode=
7dd0: 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54  "SQLITE_CREATE_T
7de0: 52 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a  RIGGER"; break;.
7df0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
7e00: 43 52 45 41 54 45 5f 56 49 45 57 20 20 20 20 20  CREATE_VIEW     
7e10: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
7e20: 45 5f 43 52 45 41 54 45 5f 56 49 45 57 22 3b 20  E_CREATE_VIEW"; 
7e30: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
7e40: 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 20 20 20  SQLITE_DELETE   
7e50: 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65           : zCode
7e60: 3d 22 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 22  ="SQLITE_DELETE"
7e70: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
7e80: 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e  e SQLITE_DROP_IN
7e90: 44 45 58 20 20 20 20 20 20 20 20 3a 20 7a 43 6f  DEX        : zCo
7ea0: 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f  de="SQLITE_DROP_
7eb0: 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20  INDEX"; break;. 
7ec0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
7ed0: 52 4f 50 5f 54 41 42 4c 45 20 20 20 20 20 20 20  ROP_TABLE       
7ee0: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
7ef0: 5f 44 52 4f 50 5f 54 41 42 4c 45 22 3b 20 62 72  _DROP_TABLE"; br
7f00: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
7f10: 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49  LITE_DROP_TEMP_I
7f20: 4e 44 45 58 20 20 20 3a 20 7a 43 6f 64 65 3d 22  NDEX   : zCode="
7f30: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
7f40: 5f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a  _INDEX"; break;.
7f50: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
7f60: 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 20  DROP_TEMP_TABLE 
7f70: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
7f80: 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c  E_DROP_TEMP_TABL
7f90: 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  E"; break;.    c
7fa0: 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  ase SQLITE_DROP_
7fb0: 54 45 4d 50 5f 54 52 49 47 47 45 52 20 3a 20 7a  TEMP_TRIGGER : z
7fc0: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f  Code="SQLITE_DRO
7fd0: 50 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 22 3b  P_TEMP_TRIGGER";
7fe0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
7ff0: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d   SQLITE_DROP_TEM
8000: 50 5f 56 49 45 57 20 20 20 20 3a 20 7a 43 6f 64  P_VIEW    : zCod
8010: 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54  e="SQLITE_DROP_T
8020: 45 4d 50 5f 56 49 45 57 22 3b 20 62 72 65 61 6b  EMP_VIEW"; break
8030: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
8040: 45 5f 44 52 4f 50 5f 54 52 49 47 47 45 52 20 20  E_DROP_TRIGGER  
8050: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
8060: 49 54 45 5f 44 52 4f 50 5f 54 52 49 47 47 45 52  ITE_DROP_TRIGGER
8070: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
8080: 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56  se SQLITE_DROP_V
8090: 49 45 57 20 20 20 20 20 20 20 20 20 3a 20 7a 43  IEW         : zC
80a0: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50  ode="SQLITE_DROP
80b0: 5f 56 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20  _VIEW"; break;. 
80c0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
80d0: 4e 53 45 52 54 20 20 20 20 20 20 20 20 20 20 20  NSERT           
80e0: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
80f0: 5f 49 4e 53 45 52 54 22 3b 20 62 72 65 61 6b 3b  _INSERT"; break;
8100: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
8110: 5f 50 52 41 47 4d 41 20 20 20 20 20 20 20 20 20  _PRAGMA         
8120: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
8130: 54 45 5f 50 52 41 47 4d 41 22 3b 20 62 72 65 61  TE_PRAGMA"; brea
8140: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
8150: 54 45 5f 52 45 41 44 20 20 20 20 20 20 20 20 20  TE_READ         
8160: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
8170: 4c 49 54 45 5f 52 45 41 44 22 3b 20 62 72 65 61  LITE_READ"; brea
8180: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
8190: 54 45 5f 53 45 4c 45 43 54 20 20 20 20 20 20 20  TE_SELECT       
81a0: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
81b0: 4c 49 54 45 5f 53 45 4c 45 43 54 22 3b 20 62 72  LITE_SELECT"; br
81c0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
81d0: 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e  LITE_TRANSACTION
81e0: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
81f0: 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49  SQLITE_TRANSACTI
8200: 4f 4e 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  ON"; break;.    
8210: 63 61 73 65 20 53 51 4c 49 54 45 5f 55 50 44 41  case SQLITE_UPDA
8220: 54 45 20 20 20 20 20 20 20 20 20 20 20 20 3a 20  TE            : 
8230: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 55 50  zCode="SQLITE_UP
8240: 44 41 54 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20  DATE"; break;.  
8250: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 54    case SQLITE_AT
8260: 54 41 43 48 20 20 20 20 20 20 20 20 20 20 20 20  TACH            
8270: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
8280: 41 54 54 41 43 48 22 3b 20 62 72 65 61 6b 3b 0a  ATTACH"; break;.
8290: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
82a0: 44 45 54 41 43 48 20 20 20 20 20 20 20 20 20 20  DETACH          
82b0: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
82c0: 45 5f 44 45 54 41 43 48 22 3b 20 62 72 65 61 6b  E_DETACH"; break
82d0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
82e0: 45 5f 41 4c 54 45 52 5f 54 41 42 4c 45 20 20 20  E_ALTER_TABLE   
82f0: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
8300: 49 54 45 5f 41 4c 54 45 52 5f 54 41 42 4c 45 22  ITE_ALTER_TABLE"
8310: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
8320: 65 20 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58  e SQLITE_REINDEX
8330: 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f             : zCo
8340: 64 65 3d 22 53 51 4c 49 54 45 5f 52 45 49 4e 44  de="SQLITE_REIND
8350: 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  EX"; break;.    
8360: 63 61 73 65 20 53 51 4c 49 54 45 5f 41 4e 41 4c  case SQLITE_ANAL
8370: 59 5a 45 20 20 20 20 20 20 20 20 20 20 20 3a 20  YZE           : 
8380: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 41 4e  zCode="SQLITE_AN
8390: 41 4c 59 5a 45 22 3b 20 62 72 65 61 6b 3b 0a 20  ALYZE"; break;. 
83a0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
83b0: 52 45 41 54 45 5f 56 54 41 42 4c 45 20 20 20 20  REATE_VTABLE    
83c0: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
83d0: 5f 43 52 45 41 54 45 5f 56 54 41 42 4c 45 22 3b  _CREATE_VTABLE";
83e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
83f0: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54 41   SQLITE_DROP_VTA
8400: 42 4c 45 20 20 20 20 20 20 20 3a 20 7a 43 6f 64  BLE       : zCod
8410: 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56  e="SQLITE_DROP_V
8420: 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20  TABLE"; break;. 
8430: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
8440: 55 4e 43 54 49 4f 4e 20 20 20 20 20 20 20 20 20  UNCTION         
8450: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
8460: 5f 46 55 4e 43 54 49 4f 4e 22 3b 20 62 72 65 61  _FUNCTION"; brea
8470: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
8480: 54 45 5f 53 41 56 45 50 4f 49 4e 54 20 20 20 20  TE_SAVEPOINT    
8490: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
84a0: 4c 49 54 45 5f 53 41 56 45 50 4f 49 4e 54 22 3b  LITE_SAVEPOINT";
84b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
84c0: 20 53 51 4c 49 54 45 5f 52 45 43 55 52 53 49 56   SQLITE_RECURSIV
84d0: 45 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64  E         : zCod
84e0: 65 3d 22 53 51 4c 49 54 45 5f 52 45 43 55 52 53  e="SQLITE_RECURS
84f0: 49 56 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  IVE"; break;.   
8500: 20 64 65 66 61 75 6c 74 20 20 20 20 20 20 20 20   default        
8510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3a                 :
8520: 20 7a 43 6f 64 65 3d 22 3f 3f 3f 3f 22 3b 20 62   zCode="????"; b
8530: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f  reak;.  }.  Tcl_
8540: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72  DStringInit(&str
8550: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
8560: 41 70 70 65 6e 64 28 26 73 74 72 2c 20 70 44 62  Append(&str, pDb
8570: 2d 3e 7a 41 75 74 68 2c 20 2d 31 29 3b 0a 20 20  ->zAuth, -1);.  
8580: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
8590: 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a  dElement(&str, z
85a0: 43 6f 64 65 29 3b 0a 20 20 54 63 6c 5f 44 53 74  Code);.  Tcl_DSt
85b0: 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e  ringAppendElemen
85c0: 74 28 26 73 74 72 2c 20 7a 41 72 67 31 20 3f 20  t(&str, zArg1 ? 
85d0: 7a 41 72 67 31 20 3a 20 22 22 29 3b 0a 20 20 54  zArg1 : "");.  T
85e0: 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64  cl_DStringAppend
85f0: 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41  Element(&str, zA
8600: 72 67 32 20 3f 20 7a 41 72 67 32 20 3a 20 22 22  rg2 ? zArg2 : ""
8610: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
8620: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73  AppendElement(&s
8630: 74 72 2c 20 7a 41 72 67 33 20 3f 20 7a 41 72 67  tr, zArg3 ? zArg
8640: 33 20 3a 20 22 22 29 3b 0a 20 20 54 63 6c 5f 44  3 : "");.  Tcl_D
8650: 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d  StringAppendElem
8660: 65 6e 74 28 26 73 74 72 2c 20 7a 41 72 67 34 20  ent(&str, zArg4 
8670: 3f 20 7a 41 72 67 34 20 3a 20 22 22 29 3b 0a 23  ? zArg4 : "");.#
8680: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 53 45  ifdef SQLITE_USE
8690: 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e  R_AUTHENTICATION
86a0: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70  .  Tcl_DStringAp
86b0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72  pendElement(&str
86c0: 2c 20 7a 41 72 67 35 20 3f 20 7a 41 72 67 35 20  , zArg5 ? zArg5 
86d0: 3a 20 22 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20  : "");.#endif.  
86e0: 72 63 20 3d 20 54 63 6c 5f 47 6c 6f 62 61 6c 45  rc = Tcl_GlobalE
86f0: 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c  val(pDb->interp,
8700: 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75   Tcl_DStringValu
8710: 65 28 26 73 74 72 29 29 3b 0a 20 20 54 63 6c 5f  e(&str));.  Tcl_
8720: 44 53 74 72 69 6e 67 46 72 65 65 28 26 73 74 72  DStringFree(&str
8730: 29 3b 0a 20 20 7a 52 65 70 6c 79 20 3d 20 72 63  );.  zReply = rc
8740: 3d 3d 54 43 4c 5f 4f 4b 20 3f 20 54 63 6c 5f 47  ==TCL_OK ? Tcl_G
8750: 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70  etStringResult(p
8760: 44 62 2d 3e 69 6e 74 65 72 70 29 20 3a 20 22 53  Db->interp) : "S
8770: 51 4c 49 54 45 5f 44 45 4e 59 22 3b 0a 20 20 69  QLITE_DENY";.  i
8780: 66 28 20 73 74 72 63 6d 70 28 7a 52 65 70 6c 79  f( strcmp(zReply
8790: 2c 22 53 51 4c 49 54 45 5f 4f 4b 22 29 3d 3d 30  ,"SQLITE_OK")==0
87a0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
87b0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20  ITE_OK;.  }else 
87c0: 69 66 28 20 73 74 72 63 6d 70 28 7a 52 65 70 6c  if( strcmp(zRepl
87d0: 79 2c 22 53 51 4c 49 54 45 5f 44 45 4e 59 22 29  y,"SQLITE_DENY")
87e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
87f0: 53 51 4c 49 54 45 5f 44 45 4e 59 3b 0a 20 20 7d  SQLITE_DENY;.  }
8800: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
8810: 7a 52 65 70 6c 79 2c 22 53 51 4c 49 54 45 5f 49  zReply,"SQLITE_I
8820: 47 4e 4f 52 45 22 29 3d 3d 30 20 29 7b 0a 20 20  GNORE")==0 ){.  
8830: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 47    rc = SQLITE_IG
8840: 4e 4f 52 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  NORE;.  }else{. 
8850: 20 20 20 72 63 20 3d 20 39 39 39 3b 0a 20 20 7d     rc = 999;.  }
8860: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
8870: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
8880: 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
8890: 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  ION */../*.** Th
88a0: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 61 64 73  is routine reads
88b0: 20 61 20 6c 69 6e 65 20 6f 66 20 74 65 78 74 20   a line of text 
88c0: 66 72 6f 6d 20 46 49 4c 45 20 69 6e 2c 20 73 74  from FILE in, st
88d0: 6f 72 65 73 0a 2a 2a 20 74 68 65 20 74 65 78 74  ores.** the text
88e0: 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69   in memory obtai
88f0: 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28  ned from malloc(
8900: 29 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20  ) and returns a 
8910: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
8920: 65 20 74 65 78 74 2e 20 20 4e 55 4c 4c 20 69 73  e text.  NULL is
8930: 20 72 65 74 75 72 6e 65 64 20 61 74 20 65 6e 64   returned at end
8940: 20 6f 66 20 66 69 6c 65 2c 20 6f 72 20 69 66 20   of file, or if 
8950: 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 66 61 69 6c  malloc().** fail
8960: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74  s..**.** The int
8970: 65 72 66 61 63 65 20 69 73 20 6c 69 6b 65 20 22  erface is like "
8980: 72 65 61 64 6c 69 6e 65 22 20 62 75 74 20 6e 6f  readline" but no
8990: 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 65 64   command-line ed
89a0: 69 74 69 6e 67 0a 2a 2a 20 69 73 20 64 6f 6e 65  iting.** is done
89b0: 2e 0a 2a 2a 0a 2a 2a 20 63 6f 70 69 65 64 20 66  ..**.** copied f
89c0: 72 6f 6d 20 73 68 65 6c 6c 2e 63 20 66 72 6f 6d  rom shell.c from
89d0: 20 27 2e 69 6d 70 6f 72 74 27 20 63 6f 6d 6d 61   '.import' comma
89e0: 6e 64 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  nd.*/.static cha
89f0: 72 20 2a 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65  r *local_getline
8a00: 28 63 68 61 72 20 2a 7a 50 72 6f 6d 70 74 2c 20  (char *zPrompt, 
8a10: 46 49 4c 45 20 2a 69 6e 29 7b 0a 20 20 63 68 61  FILE *in){.  cha
8a20: 72 20 2a 7a 4c 69 6e 65 3b 0a 20 20 69 6e 74 20  r *zLine;.  int 
8a30: 6e 4c 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a  nLine;.  int n;.
8a40: 0a 20 20 6e 4c 69 6e 65 20 3d 20 31 30 30 3b 0a  .  nLine = 100;.
8a50: 20 20 7a 4c 69 6e 65 20 3d 20 6d 61 6c 6c 6f 63    zLine = malloc
8a60: 28 20 6e 4c 69 6e 65 20 29 3b 0a 20 20 69 66 28  ( nLine );.  if(
8a70: 20 7a 4c 69 6e 65 3d 3d 30 20 29 20 72 65 74 75   zLine==0 ) retu
8a80: 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20  rn 0;.  n = 0;. 
8a90: 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
8aa0: 20 69 66 28 20 6e 2b 31 30 30 3e 6e 4c 69 6e 65   if( n+100>nLine
8ab0: 20 29 7b 0a 20 20 20 20 20 20 6e 4c 69 6e 65 20   ){.      nLine 
8ac0: 3d 20 6e 4c 69 6e 65 2a 32 20 2b 20 31 30 30 3b  = nLine*2 + 100;
8ad0: 0a 20 20 20 20 20 20 7a 4c 69 6e 65 20 3d 20 72  .      zLine = r
8ae0: 65 61 6c 6c 6f 63 28 7a 4c 69 6e 65 2c 20 6e 4c  ealloc(zLine, nL
8af0: 69 6e 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ine);.      if( 
8b00: 7a 4c 69 6e 65 3d 3d 30 20 29 20 72 65 74 75 72  zLine==0 ) retur
8b10: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 0;.    }.    i
8b20: 66 28 20 66 67 65 74 73 28 26 7a 4c 69 6e 65 5b  f( fgets(&zLine[
8b30: 6e 5d 2c 20 6e 4c 69 6e 65 20 2d 20 6e 2c 20 69  n], nLine - n, i
8b40: 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  n)==0 ){.      i
8b50: 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( n==0 ){.     
8b60: 20 20 20 66 72 65 65 28 7a 4c 69 6e 65 29 3b 0a     free(zLine);.
8b70: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
8b80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8b90: 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20  zLine[n] = 0;.  
8ba0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
8bb0: 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e  .    while( zLin
8bc0: 65 5b 6e 5d 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20  e[n] ){ n++; }. 
8bd0: 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20 7a 4c     if( n>0 && zL
8be0: 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 6e 27 20 29  ine[n-1]=='\n' )
8bf0: 7b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20  {.      n--;.   
8c00: 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b     zLine[n] = 0;
8c10: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8c20: 20 20 7d 0a 20 20 7d 0a 20 20 7a 4c 69 6e 65 20    }.  }.  zLine 
8c30: 3d 20 72 65 61 6c 6c 6f 63 28 20 7a 4c 69 6e 65  = realloc( zLine
8c40: 2c 20 6e 2b 31 20 29 3b 0a 20 20 72 65 74 75 72  , n+1 );.  retur
8c50: 6e 20 7a 4c 69 6e 65 3b 0a 7d 0a 0a 0a 2f 2a 0a  n zLine;.}.../*.
8c60: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
8c70: 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
8c80: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
8c90: 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64 3a 0a 2a  f the command:.*
8ca0: 2a 0a 2a 2a 20 20 20 24 64 62 20 74 72 61 6e 73  *.**   $db trans
8cb0: 61 63 74 69 6f 6e 20 5b 2d 64 65 66 65 72 72 65  action [-deferre
8cc0: 64 7c 2d 69 6d 6d 65 64 69 61 74 65 7c 2d 65 78  d|-immediate|-ex
8cd0: 63 6c 75 73 69 76 65 5d 20 53 43 52 49 50 54 0a  clusive] SCRIPT.
8ce0: 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6e 76 6f  **.** It is invo
8cf0: 6b 65 64 20 61 66 74 65 72 20 65 76 61 6c 75 61  ked after evalua
8d00: 74 69 6e 67 20 74 68 65 20 73 63 72 69 70 74 20  ting the script 
8d10: 53 43 52 49 50 54 20 74 6f 20 63 6f 6d 6d 69 74  SCRIPT to commit
8d20: 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20   or rollback.** 
8d30: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
8d40: 6f 72 20 73 61 76 65 70 6f 69 6e 74 20 6f 70 65  or savepoint ope
8d50: 6e 65 64 20 62 79 20 74 68 65 20 5b 74 72 61 6e  ned by the [tran
8d60: 73 61 63 74 69 6f 6e 5d 20 63 6f 6d 6d 61 6e 64  saction] command
8d70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8d80: 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 44 62  SQLITE_TCLAPI Db
8d90: 54 72 61 6e 73 50 6f 73 74 43 6d 64 28 0a 20 20  TransPostCmd(.  
8da0: 43 6c 69 65 6e 74 44 61 74 61 20 64 61 74 61 5b  ClientData data[
8db0: 5d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ],              
8dc0: 20 20 20 20 20 2f 2a 20 64 61 74 61 5b 30 5d 20       /* data[0] 
8dd0: 69 73 20 74 68 65 20 53 71 6c 69 74 65 33 44 62  is the Sqlite3Db
8de0: 2a 20 66 6f 72 20 24 64 62 20 2a 2f 0a 20 20 54  * for $db */.  T
8df0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
8e00: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
8e10: 20 20 20 20 2f 2a 20 54 63 6c 20 69 6e 74 65 72      /* Tcl inter
8e20: 70 72 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  preter */.  int 
8e30: 72 65 73 75 6c 74 20 20 20 20 20 20 20 20 20 20  result          
8e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e50: 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 65 76   /* Result of ev
8e60: 61 6c 75 61 74 69 6e 67 20 53 43 52 49 50 54 20  aluating SCRIPT 
8e70: 2a 2f 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 63  */.){.  static c
8e80: 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74  onst char *const
8e90: 20 61 7a 45 6e 64 5b 5d 20 3d 20 7b 0a 20 20 20   azEnd[] = {.   
8ea0: 20 22 52 45 4c 45 41 53 45 20 5f 74 63 6c 5f 74   "RELEASE _tcl_t
8eb0: 72 61 6e 73 61 63 74 69 6f 6e 22 2c 20 20 20 20  ransaction",    
8ec0: 20 20 20 20 2f 2a 20 72 63 3d 3d 54 43 4c 5f 45      /* rc==TCL_E
8ed0: 52 52 4f 52 2c 20 6e 54 72 61 6e 73 61 63 74 69  RROR, nTransacti
8ee0: 6f 6e 21 3d 30 20 2a 2f 0a 20 20 20 20 22 43 4f  on!=0 */.    "CO
8ef0: 4d 4d 49 54 22 2c 20 20 20 20 20 20 20 20 20 20  MMIT",          
8f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f10: 2f 2a 20 72 63 21 3d 54 43 4c 5f 45 52 52 4f 52  /* rc!=TCL_ERROR
8f20: 2c 20 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  , nTransaction==
8f30: 30 20 2a 2f 0a 20 20 20 20 22 52 4f 4c 4c 42 41  0 */.    "ROLLBA
8f40: 43 4b 20 54 4f 20 5f 74 63 6c 5f 74 72 61 6e 73  CK TO _tcl_trans
8f50: 61 63 74 69 6f 6e 20 3b 20 52 45 4c 45 41 53 45  action ; RELEASE
8f60: 20 5f 74 63 6c 5f 74 72 61 6e 73 61 63 74 69 6f   _tcl_transactio
8f70: 6e 22 2c 0a 20 20 20 20 22 52 4f 4c 4c 42 41 43  n",.    "ROLLBAC
8f80: 4b 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K"              
8f90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 63             /* rc
8fa0: 3d 3d 54 43 4c 5f 45 52 52 4f 52 2c 20 6e 54 72  ==TCL_ERROR, nTr
8fb0: 61 6e 73 61 63 74 69 6f 6e 3d 3d 30 20 2a 2f 0a  ansaction==0 */.
8fc0: 20 20 7d 3b 0a 20 20 53 71 6c 69 74 65 44 62 20    };.  SqliteDb 
8fd0: 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62  *pDb = (SqliteDb
8fe0: 2a 29 64 61 74 61 5b 30 5d 3b 0a 20 20 69 6e 74  *)data[0];.  int
8ff0: 20 72 63 20 3d 20 72 65 73 75 6c 74 3b 0a 20 20   rc = result;.  
9000: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e 64  const char *zEnd
9010: 3b 0a 0a 20 20 70 44 62 2d 3e 6e 54 72 61 6e 73  ;..  pDb->nTrans
9020: 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 7a 45 6e 64  action--;.  zEnd
9030: 20 3d 20 61 7a 45 6e 64 5b 28 72 63 3d 3d 54 43   = azEnd[(rc==TC
9040: 4c 5f 45 52 52 4f 52 29 2a 32 20 2b 20 28 70 44  L_ERROR)*2 + (pD
9050: 62 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  b->nTransaction=
9060: 3d 30 29 5d 3b 0a 0a 20 20 70 44 62 2d 3e 64 69  =0)];..  pDb->di
9070: 73 61 62 6c 65 41 75 74 68 2b 2b 3b 0a 20 20 69  sableAuth++;.  i
9080: 66 28 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  f( sqlite3_exec(
9090: 70 44 62 2d 3e 64 62 2c 20 7a 45 6e 64 2c 20 30  pDb->db, zEnd, 0
90a0: 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  , 0, 0) ){.     
90b0: 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 74 72   /* This is a tr
90c0: 69 63 6b 79 20 73 63 65 6e 61 72 69 6f 20 74 6f  icky scenario to
90d0: 20 68 61 6e 64 6c 65 2e 20 54 68 65 20 6d 6f 73   handle. The mos
90e0: 74 20 6c 69 6b 65 6c 79 20 63 61 75 73 65 20 6f  t likely cause o
90f0: 66 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 65 72  f an.      ** er
9100: 72 6f 72 20 69 73 20 74 68 61 74 20 74 68 65 20  ror is that the 
9110: 65 78 65 63 28 29 20 61 62 6f 76 65 20 77 61 73  exec() above was
9120: 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 63   an attempt to c
9130: 6f 6d 6d 69 74 20 74 68 65 0a 20 20 20 20 20 20  ommit the.      
9140: 2a 2a 20 74 6f 70 2d 6c 65 76 65 6c 20 74 72 61  ** top-level tra
9150: 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20 72 65  nsaction that re
9160: 74 75 72 6e 65 64 20 53 51 4c 49 54 45 5f 42 55  turned SQLITE_BU
9170: 53 59 2e 20 4f 72 2c 20 6c 65 73 73 20 6c 69 6b  SY. Or, less lik
9180: 65 6c 79 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68  ely,.      ** th
9190: 61 74 20 61 6e 20 49 4f 2d 65 72 72 6f 72 20 68  at an IO-error h
91a0: 61 73 20 6f 63 63 75 72 72 65 64 2e 20 49 6e 20  as occurred. In 
91b0: 65 69 74 68 65 72 20 63 61 73 65 2c 20 74 68 72  either case, thr
91c0: 6f 77 20 61 20 54 63 6c 20 65 78 63 65 70 74 69  ow a Tcl excepti
91d0: 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  on.      ** and 
91e0: 74 72 79 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  try to rollback 
91f0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
9200: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
9210: 2a 2a 20 42 75 74 20 69 74 20 63 6f 75 6c 64 20  ** But it could 
9220: 61 6c 73 6f 20 62 65 20 74 68 61 74 20 74 68 65  also be that the
9230: 20 75 73 65 72 20 65 78 65 63 75 74 65 64 20 6f   user executed o
9240: 6e 65 20 6f 72 20 6d 6f 72 65 20 42 45 47 49 4e  ne or more BEGIN
9250: 2c 0a 20 20 20 20 20 20 2a 2a 20 43 4f 4d 4d 49  ,.      ** COMMI
9260: 54 2c 20 53 41 56 45 50 4f 49 4e 54 2c 20 52 45  T, SAVEPOINT, RE
9270: 4c 45 41 53 45 20 6f 72 20 52 4f 4c 4c 42 41 43  LEASE or ROLLBAC
9280: 4b 20 63 6f 6d 6d 61 6e 64 73 20 74 68 61 74 20  K commands that 
9290: 61 72 65 20 63 6f 6e 66 75 73 69 6e 67 0a 20 20  are confusing.  
92a0: 20 20 20 20 2a 2a 20 74 68 69 73 20 6d 65 74 68      ** this meth
92b0: 6f 64 27 73 20 6c 6f 67 69 63 2e 20 4e 6f 74 20  od's logic. Not 
92c0: 63 6c 65 61 72 20 68 6f 77 20 74 68 69 73 20 77  clear how this w
92d0: 6f 75 6c 64 20 62 65 20 62 65 73 74 20 68 61 6e  ould be best han
92e0: 64 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  dled..      */. 
92f0: 20 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 45     if( rc!=TCL_E
9300: 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 54 63  RROR ){.      Tc
9310: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
9320: 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 5f 65  nterp, sqlite3_e
9330: 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20  rrmsg(pDb->db), 
9340: 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
9350: 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b   rc = TCL_ERROR;
9360: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
9370: 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62 2c  e3_exec(pDb->db,
9380: 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c 20   "ROLLBACK", 0, 
9390: 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 70 44 62  0, 0);.  }.  pDb
93a0: 2d 3e 64 69 73 61 62 6c 65 41 75 74 68 2d 2d 3b  ->disableAuth--;
93b0: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
93c0: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 53  ../*.** Unless S
93d0: 51 4c 49 54 45 5f 54 45 53 54 20 69 73 20 64 65  QLITE_TEST is de
93e0: 66 69 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63  fined, this func
93f0: 74 69 6f 6e 20 69 73 20 61 20 73 69 6d 70 6c 65  tion is a simple
9400: 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 0a   wrapper around.
9410: 2a 2a 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  ** sqlite3_prepa
9420: 72 65 5f 76 32 28 29 2e 20 49 66 20 53 51 4c 49  re_v2(). If SQLI
9430: 54 45 5f 54 45 53 54 20 69 73 20 64 65 66 69 6e  TE_TEST is defin
9440: 65 64 2c 20 74 68 65 6e 20 69 74 20 75 73 65 73  ed, then it uses
9450: 20 65 69 74 68 65 72 0a 2a 2a 20 73 71 6c 69 74   either.** sqlit
9460: 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 29 20  e3_prepare_v2() 
9470: 6f 72 20 6c 65 67 61 63 79 20 69 6e 74 65 72 66  or legacy interf
9480: 61 63 65 20 73 71 6c 69 74 65 33 5f 70 72 65 70  ace sqlite3_prep
9490: 61 72 65 28 29 2c 20 64 65 70 65 6e 64 69 6e 67  are(), depending
94a0: 0a 2a 2a 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  .** on whether o
94b0: 72 20 6e 6f 74 20 74 68 65 20 5b 64 62 5f 75 73  r not the [db_us
94c0: 65 5f 6c 65 67 61 63 79 5f 70 72 65 70 61 72 65  e_legacy_prepare
94d0: 5d 20 63 6f 6d 6d 61 6e 64 20 68 61 73 20 62 65  ] command has be
94e0: 65 6e 20 75 73 65 64 20 74 6f 0a 2a 2a 20 63 6f  en used to.** co
94f0: 6e 66 69 67 75 72 65 20 74 68 65 20 63 6f 6e 6e  nfigure the conn
9500: 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ection..*/.stati
9510: 63 20 69 6e 74 20 64 62 50 72 65 70 61 72 65 28  c int dbPrepare(
9520: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
9530: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9540: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6f     /* Database o
9550: 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  bject */.  const
9560: 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 20 20 20   char *zSql,    
9570: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51             /* SQ
9580: 4c 20 74 6f 20 63 6f 6d 70 69 6c 65 20 2a 2f 0a  L to compile */.
9590: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
95a0: 2a 70 70 53 74 6d 74 2c 20 20 20 20 20 20 20 20  *ppStmt,        
95b0: 20 20 2f 2a 20 4f 55 54 3a 20 50 72 65 70 61 72    /* OUT: Prepar
95c0: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  ed statement */.
95d0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70    const char **p
95e0: 7a 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20  zOut            
95f0: 20 20 2f 2a 20 4f 55 54 3a 20 50 6f 69 6e 74 65    /* OUT: Pointe
9600: 72 20 74 6f 20 6e 65 78 74 20 53 51 4c 20 73 74  r to next SQL st
9610: 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 23 69  atement */.){.#i
9620: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
9630: 0a 20 20 69 66 28 20 70 44 62 2d 3e 62 4c 65 67  .  if( pDb->bLeg
9640: 61 63 79 50 72 65 70 61 72 65 20 29 7b 0a 20 20  acyPrepare ){.  
9650: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
9660: 5f 70 72 65 70 61 72 65 28 70 44 62 2d 3e 64 62  _prepare(pDb->db
9670: 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 70 70 53 74  , zSql, -1, ppSt
9680: 6d 74 2c 20 70 7a 4f 75 74 29 3b 0a 20 20 7d 0a  mt, pzOut);.  }.
9690: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
96a0: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
96b0: 76 32 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c  v2(pDb->db, zSql
96c0: 2c 20 2d 31 2c 20 70 70 53 74 6d 74 2c 20 70 7a  , -1, ppStmt, pz
96d0: 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  Out);.}../*.** S
96e0: 65 61 72 63 68 20 74 68 65 20 63 61 63 68 65 20  earch the cache 
96f0: 66 6f 72 20 61 20 70 72 65 70 61 72 65 64 2d 73  for a prepared-s
9700: 74 61 74 65 6d 65 6e 74 20 6f 62 6a 65 63 74 20  tatement object 
9710: 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
9720: 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 53 51 4c  the.** first SQL
9730: 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 74 68   statement in th
9740: 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  e buffer pointed
9750: 20 74 6f 20 62 79 20 70 61 72 61 6d 65 74 65 72   to by parameter
9760: 20 7a 49 6e 2e 20 49 66 0a 2a 2a 20 6e 6f 20 73   zIn. If.** no s
9770: 75 63 68 20 70 72 65 70 61 72 65 64 2d 73 74 61  uch prepared-sta
9780: 74 65 6d 65 6e 74 20 63 61 6e 20 62 65 20 66 6f  tement can be fo
9790: 75 6e 64 2c 20 61 6c 6c 6f 63 61 74 65 20 61 6e  und, allocate an
97a0: 64 20 70 72 65 70 61 72 65 20 61 20 6e 65 77 0a  d prepare a new.
97b0: 2a 2a 20 6f 6e 65 2e 20 49 6e 20 65 69 74 68 65  ** one. In eithe
97c0: 72 20 63 61 73 65 2c 20 62 69 6e 64 20 74 68 65  r case, bind the
97d0: 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 73 20   current values 
97e0: 6f 66 20 74 68 65 20 72 65 6c 65 76 61 6e 74 20  of the relevant 
97f0: 54 63 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 73  Tcl.** variables
9800: 20 74 6f 20 61 6e 79 20 24 76 61 72 2c 20 3a 76   to any $var, :v
9810: 61 72 20 6f 72 20 40 76 61 72 20 76 61 72 69 61  ar or @var varia
9820: 62 6c 65 73 20 69 6e 20 74 68 65 20 73 74 61 74  bles in the stat
9830: 65 6d 65 6e 74 2e 20 42 65 66 6f 72 65 0a 2a 2a  ement. Before.**
9840: 20 72 65 74 75 72 6e 69 6e 67 2c 20 73 65 74 20   returning, set 
9850: 2a 70 70 50 72 65 53 74 6d 74 20 74 6f 20 70 6f  *ppPreStmt to po
9860: 69 6e 74 20 74 6f 20 74 68 65 20 70 72 65 70 61  int to the prepa
9870: 72 65 64 2d 73 74 61 74 65 6d 65 6e 74 20 6f 62  red-statement ob
9880: 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 4f 75 74 70  ject..**.** Outp
9890: 75 74 20 70 61 72 61 6d 65 74 65 72 20 2a 70 7a  ut parameter *pz
98a0: 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 70 6f  Out is set to po
98b0: 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20  int to the next 
98c0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  SQL statement in
98d0: 0a 2a 2a 20 62 75 66 66 65 72 20 7a 49 6e 2c 20  .** buffer zIn, 
98e0: 6f 72 20 74 6f 20 74 68 65 20 27 5c 30 27 20 62  or to the '\0' b
98f0: 79 74 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  yte at the end o
9900: 66 20 7a 49 6e 20 69 66 20 74 68 65 72 65 20 69  f zIn if there i
9910: 73 20 6e 6f 0a 2a 2a 20 6e 65 78 74 20 73 74 61  s no.** next sta
9920: 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  tement..**.** If
9930: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 54 43 4c   successful, TCL
9940: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
9950: 20 4f 74 68 65 72 77 69 73 65 2c 20 54 43 4c 5f   Otherwise, TCL_
9960: 45 52 52 4f 52 20 69 73 20 72 65 74 75 72 6e 65  ERROR is returne
9970: 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f  d.** and an erro
9980: 72 20 6d 65 73 73 61 67 65 20 6c 6f 61 64 65 64  r message loaded
9990: 20 69 6e 74 6f 20 69 6e 74 65 72 70 72 65 74 65   into interprete
99a0: 72 20 70 44 62 2d 3e 69 6e 74 65 72 70 2e 0a 2a  r pDb->interp..*
99b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 62 50  /.static int dbP
99c0: 72 65 70 61 72 65 41 6e 64 42 69 6e 64 28 0a 20  repareAndBind(. 
99d0: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 2c 20   SqliteDb *pDb, 
99e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99f0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6f 62 6a   /* Database obj
9a00: 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f  ect */.  char co
9a10: 6e 73 74 20 2a 7a 49 6e 2c 20 20 20 20 20 20 20  nst *zIn,       
9a20: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20           /* SQL 
9a30: 74 6f 20 63 6f 6d 70 69 6c 65 20 2a 2f 0a 20 20  to compile */.  
9a40: 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 4f  char const **pzO
9a50: 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ut,             
9a60: 2f 2a 20 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20  /* OUT: Pointer 
9a70: 74 6f 20 6e 65 78 74 20 53 51 4c 20 73 74 61 74  to next SQL stat
9a80: 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 71 6c 50 72  ement */.  SqlPr
9a90: 65 70 61 72 65 64 53 74 6d 74 20 2a 2a 70 70 50  eparedStmt **ppP
9aa0: 72 65 53 74 6d 74 20 20 20 20 20 2f 2a 20 4f 55  reStmt     /* OU
9ab0: 54 3a 20 4f 62 6a 65 63 74 20 75 73 65 64 20 74  T: Object used t
9ac0: 6f 20 63 61 63 68 65 20 73 74 61 74 65 6d 65 6e  o cache statemen
9ad0: 74 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  t */.){.  const 
9ae0: 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 7a 49 6e  char *zSql = zIn
9af0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  ;         /* Poi
9b00: 6e 74 65 72 20 74 6f 20 66 69 72 73 74 20 53 51  nter to first SQ
9b10: 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 7a  L statement in z
9b20: 49 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  In */.  sqlite3_
9b30: 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b  stmt *pStmt = 0;
9b40: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 70 61          /* Prepa
9b50: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 6f 62  red statement ob
9b60: 6a 65 63 74 20 2a 2f 0a 20 20 53 71 6c 50 72 65  ject */.  SqlPre
9b70: 70 61 72 65 64 53 74 6d 74 20 2a 70 50 72 65 53  paredStmt *pPreS
9b80: 74 6d 74 3b 20 20 20 20 20 20 2f 2a 20 50 6f 69  tmt;      /* Poi
9b90: 6e 74 65 72 20 74 6f 20 63 61 63 68 65 64 20 73  nter to cached s
9ba0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
9bb0: 74 20 6e 53 71 6c 3b 20 20 20 20 20 20 20 20 20  t nSql;         
9bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9bd0: 20 4c 65 6e 67 74 68 20 6f 66 20 7a 53 71 6c 20   Length of zSql 
9be0: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e  in bytes */.  in
9bf0: 74 20 6e 56 61 72 20 3d 20 30 3b 20 20 20 20 20  t nVar = 0;     
9c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9c10: 20 4e 75 6d 62 65 72 20 6f 66 20 76 61 72 69 61   Number of varia
9c20: 62 6c 65 73 20 69 6e 20 73 74 61 74 65 6d 65 6e  bles in statemen
9c30: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d  t */.  int iParm
9c40: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
9c50: 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 66         /* Next f
9c60: 72 65 65 20 65 6e 74 72 79 20 69 6e 20 61 70 50  ree entry in apP
9c70: 61 72 6d 20 2a 2f 0a 20 20 63 68 61 72 20 63 3b  arm */.  char c;
9c80: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 54 63 6c 5f  .  int i;.  Tcl_
9c90: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 20 3d  Interp *interp =
9ca0: 20 70 44 62 2d 3e 69 6e 74 65 72 70 3b 0a 0a 20   pDb->interp;.. 
9cb0: 20 2a 70 70 50 72 65 53 74 6d 74 20 3d 20 30 3b   *ppPreStmt = 0;
9cc0: 0a 0a 20 20 2f 2a 20 54 72 69 6d 20 73 70 61 63  ..  /* Trim spac
9cd0: 65 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 72  es from the star
9ce0: 74 20 6f 66 20 7a 53 71 6c 20 61 6e 64 20 63 61  t of zSql and ca
9cf0: 6c 63 75 6c 61 74 65 20 74 68 65 20 72 65 6d 61  lculate the rema
9d00: 69 6e 69 6e 67 20 6c 65 6e 67 74 68 2e 20 2a 2f  ining length. */
9d10: 0a 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 7a  .  while( (c = z
9d20: 53 71 6c 5b 30 5d 29 3d 3d 27 20 27 20 7c 7c 20  Sql[0])==' ' || 
9d30: 63 3d 3d 27 5c 74 27 20 7c 7c 20 63 3d 3d 27 5c  c=='\t' || c=='\
9d40: 72 27 20 7c 7c 20 63 3d 3d 27 5c 6e 27 20 29 7b  r' || c=='\n' ){
9d50: 20 7a 53 71 6c 2b 2b 3b 20 7d 0a 20 20 6e 53 71   zSql++; }.  nSq
9d60: 6c 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 53 71  l = strlen30(zSq
9d70: 6c 29 3b 0a 0a 20 20 66 6f 72 28 70 50 72 65 53  l);..  for(pPreS
9d80: 74 6d 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c  tmt = pDb->stmtL
9d90: 69 73 74 3b 20 70 50 72 65 53 74 6d 74 3b 20 70  ist; pPreStmt; p
9da0: 50 72 65 53 74 6d 74 3d 70 50 72 65 53 74 6d 74  PreStmt=pPreStmt
9db0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e  ->pNext){.    in
9dc0: 74 20 6e 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e  t n = pPreStmt->
9dd0: 6e 53 71 6c 3b 0a 20 20 20 20 69 66 28 20 6e 53  nSql;.    if( nS
9de0: 71 6c 3e 3d 6e 0a 20 20 20 20 20 20 20 20 26 26  ql>=n.        &&
9df0: 20 6d 65 6d 63 6d 70 28 70 50 72 65 53 74 6d 74   memcmp(pPreStmt
9e00: 2d 3e 7a 53 71 6c 2c 20 7a 53 71 6c 2c 20 6e 29  ->zSql, zSql, n)
9e10: 3d 3d 30 0a 20 20 20 20 20 20 20 20 26 26 20 28  ==0.        && (
9e20: 7a 53 71 6c 5b 6e 5d 3d 3d 30 20 7c 7c 20 7a 53  zSql[n]==0 || zS
9e30: 71 6c 5b 6e 2d 31 5d 3d 3d 27 3b 27 29 0a 20 20  ql[n-1]==';').  
9e40: 20 20 29 7b 0a 20 20 20 20 20 20 70 53 74 6d 74    ){.      pStmt
9e50: 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 53 74   = pPreStmt->pSt
9e60: 6d 74 3b 0a 20 20 20 20 20 20 2a 70 7a 4f 75 74  mt;.      *pzOut
9e70: 20 3d 20 26 7a 53 71 6c 5b 70 50 72 65 53 74 6d   = &zSql[pPreStm
9e80: 74 2d 3e 6e 53 71 6c 5d 3b 0a 0a 20 20 20 20 20  t->nSql];..     
9e90: 20 2f 2a 20 57 68 65 6e 20 61 20 70 72 65 70 61   /* When a prepa
9ea0: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 69 73  red statement is
9eb0: 20 66 6f 75 6e 64 2c 20 75 6e 6c 69 6e 6b 20 69   found, unlink i
9ec0: 74 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 20  t from the.     
9ed0: 20 2a 2a 20 63 61 63 68 65 20 6c 69 73 74 2e 20   ** cache list. 
9ee0: 20 49 74 20 77 69 6c 6c 20 6c 61 74 65 72 20 62   It will later b
9ef0: 65 20 61 64 64 65 64 20 62 61 63 6b 20 74 6f 20  e added back to 
9f00: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20  the beginning.  
9f10: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 63 61      ** of the ca
9f20: 63 68 65 20 6c 69 73 74 20 69 6e 20 6f 72 64 65  che list in orde
9f30: 72 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 4c  r to implement L
9f40: 52 55 20 72 65 70 6c 61 63 65 6d 65 6e 74 2e 0a  RU replacement..
9f50: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
9f60: 66 28 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72  f( pPreStmt->pPr
9f70: 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  ev ){.        pP
9f80: 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 2d 3e 70  reStmt->pPrev->p
9f90: 4e 65 78 74 20 3d 20 70 50 72 65 53 74 6d 74 2d  Next = pPreStmt-
9fa0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 65  >pNext;.      }e
9fb0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62  lse{.        pDb
9fc0: 2d 3e 73 74 6d 74 4c 69 73 74 20 3d 20 70 50 72  ->stmtList = pPr
9fd0: 65 53 74 6d 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  eStmt->pNext;.  
9fe0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
9ff0: 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 20  pPreStmt->pNext 
a000: 29 7b 0a 20 20 20 20 20 20 20 20 70 50 72 65 53  ){.        pPreS
a010: 74 6d 74 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  tmt->pNext->pPre
a020: 76 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 50  v = pPreStmt->pP
a030: 72 65 76 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  rev;.      }else
a040: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73  {.        pDb->s
a050: 74 6d 74 4c 61 73 74 20 3d 20 70 50 72 65 53 74  tmtLast = pPreSt
a060: 6d 74 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20  mt->pPrev;.     
a070: 20 7d 0a 20 20 20 20 20 20 70 44 62 2d 3e 6e 53   }.      pDb->nS
a080: 74 6d 74 2d 2d 3b 0a 20 20 20 20 20 20 6e 56 61  tmt--;.      nVa
a090: 72 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  r = sqlite3_bind
a0a0: 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74  _parameter_count
a0b0: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 62  (pStmt);.      b
a0c0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
a0d0: 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 70 72 65 70  .  /* If no prep
a0e0: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 77  ared statement w
a0f0: 61 73 20 66 6f 75 6e 64 2e 20 43 6f 6d 70 69 6c  as found. Compil
a100: 65 20 74 68 65 20 53 51 4c 20 74 65 78 74 2e 20  e the SQL text. 
a110: 41 6c 73 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20  Also allocate.  
a120: 2a 2a 20 61 20 6e 65 77 20 53 71 6c 50 72 65 70  ** a new SqlPrep
a130: 61 72 65 64 53 74 6d 74 20 73 74 72 75 63 74 75  aredStmt structu
a140: 72 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  re.  */.  if( pP
a150: 72 65 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20  reStmt==0 ){.   
a160: 20 69 6e 74 20 6e 42 79 74 65 3b 0a 0a 20 20 20   int nByte;..   
a170: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
a180: 64 62 50 72 65 70 61 72 65 28 70 44 62 2c 20 7a  dbPrepare(pDb, z
a190: 53 71 6c 2c 20 26 70 53 74 6d 74 2c 20 70 7a 4f  Sql, &pStmt, pzO
a1a0: 75 74 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  ut) ){.      Tcl
a1b0: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
a1c0: 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72  terp, Tcl_NewStr
a1d0: 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65  ingObj(sqlite3_e
a1e0: 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20  rrmsg(pDb->db), 
a1f0: 2d 31 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  -1));.      retu
a200: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
a210: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 74 6d    }.    if( pStm
a220: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  t==0 ){.      if
a230: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
a240: 69 74 65 33 5f 65 72 72 63 6f 64 65 28 70 44 62  ite3_errcode(pDb
a250: 2d 3e 64 62 29 20 29 7b 0a 20 20 20 20 20 20 20  ->db) ){.       
a260: 20 2f 2a 20 41 20 63 6f 6d 70 69 6c 65 2d 74 69   /* A compile-ti
a270: 6d 65 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20  me error in the 
a280: 73 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20  statement. */.  
a290: 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a        Tcl_SetObj
a2a0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
a2b0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
a2c0: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
a2d0: 44 62 2d 3e 64 62 29 2c 20 2d 31 29 29 3b 0a 20  Db->db), -1));. 
a2e0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
a2f0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  L_ERROR;.      }
a300: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
a310: 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 77   The statement w
a320: 61 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 43 6f 6e  as a no-op.  Con
a330: 74 69 6e 75 65 20 74 6f 20 74 68 65 20 6e 65 78  tinue to the nex
a340: 74 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20  t statement.    
a350: 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 53 51      ** in the SQ
a360: 4c 20 73 74 72 69 6e 67 2e 0a 20 20 20 20 20 20  L string..      
a370: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74    */.        ret
a380: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20  urn TCL_OK;.    
a390: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61    }.    }..    a
a3a0: 73 73 65 72 74 28 20 70 50 72 65 53 74 6d 74 3d  ssert( pPreStmt=
a3b0: 3d 30 20 29 3b 0a 20 20 20 20 6e 56 61 72 20 3d  =0 );.    nVar =
a3c0: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61   sqlite3_bind_pa
a3d0: 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28 70 53  rameter_count(pS
a3e0: 74 6d 74 29 3b 0a 20 20 20 20 6e 42 79 74 65 20  tmt);.    nByte 
a3f0: 3d 20 73 69 7a 65 6f 66 28 53 71 6c 50 72 65 70  = sizeof(SqlPrep
a400: 61 72 65 64 53 74 6d 74 29 20 2b 20 6e 56 61 72  aredStmt) + nVar
a410: 2a 73 69 7a 65 6f 66 28 54 63 6c 5f 4f 62 6a 20  *sizeof(Tcl_Obj 
a420: 2a 29 3b 0a 20 20 20 20 70 50 72 65 53 74 6d 74  *);.    pPreStmt
a430: 20 3d 20 28 53 71 6c 50 72 65 70 61 72 65 64 53   = (SqlPreparedS
a440: 74 6d 74 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 6e  tmt*)Tcl_Alloc(n
a450: 42 79 74 65 29 3b 0a 20 20 20 20 6d 65 6d 73 65  Byte);.    memse
a460: 74 28 70 50 72 65 53 74 6d 74 2c 20 30 2c 20 6e  t(pPreStmt, 0, n
a470: 42 79 74 65 29 3b 0a 0a 20 20 20 20 70 50 72 65  Byte);..    pPre
a480: 53 74 6d 74 2d 3e 70 53 74 6d 74 20 3d 20 70 53  Stmt->pStmt = pS
a490: 74 6d 74 3b 0a 20 20 20 20 70 50 72 65 53 74 6d  tmt;.    pPreStm
a4a0: 74 2d 3e 6e 53 71 6c 20 3d 20 28 69 6e 74 29 28  t->nSql = (int)(
a4b0: 2a 70 7a 4f 75 74 20 2d 20 7a 53 71 6c 29 3b 0a  *pzOut - zSql);.
a4c0: 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 7a 53      pPreStmt->zS
a4d0: 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 73 71 6c  ql = sqlite3_sql
a4e0: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 70 50 72  (pStmt);.    pPr
a4f0: 65 53 74 6d 74 2d 3e 61 70 50 61 72 6d 20 3d 20  eStmt->apParm = 
a500: 28 54 63 6c 5f 4f 62 6a 20 2a 2a 29 26 70 50 72  (Tcl_Obj **)&pPr
a510: 65 53 74 6d 74 5b 31 5d 3b 0a 23 69 66 64 65 66  eStmt[1];.#ifdef
a520: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20   SQLITE_TEST.   
a530: 20 69 66 28 20 70 50 72 65 53 74 6d 74 2d 3e 7a   if( pPreStmt->z
a540: 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Sql==0 ){.      
a550: 63 68 61 72 20 2a 7a 43 6f 70 79 20 3d 20 54 63  char *zCopy = Tc
a560: 6c 5f 41 6c 6c 6f 63 28 70 50 72 65 53 74 6d 74  l_Alloc(pPreStmt
a570: 2d 3e 6e 53 71 6c 20 2b 20 31 29 3b 0a 20 20 20  ->nSql + 1);.   
a580: 20 20 20 6d 65 6d 63 70 79 28 7a 43 6f 70 79 2c     memcpy(zCopy,
a590: 20 7a 53 71 6c 2c 20 70 50 72 65 53 74 6d 74 2d   zSql, pPreStmt-
a5a0: 3e 6e 53 71 6c 29 3b 0a 20 20 20 20 20 20 7a 43  >nSql);.      zC
a5b0: 6f 70 79 5b 70 50 72 65 53 74 6d 74 2d 3e 6e 53  opy[pPreStmt->nS
a5c0: 71 6c 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  ql] = '\0';.    
a5d0: 20 20 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c    pPreStmt->zSql
a5e0: 20 3d 20 7a 43 6f 70 79 3b 0a 20 20 20 20 7d 0a   = zCopy;.    }.
a5f0: 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 61 73 73  #endif.  }.  ass
a600: 65 72 74 28 20 70 50 72 65 53 74 6d 74 20 29 3b  ert( pPreStmt );
a610: 0a 20 20 61 73 73 65 72 74 28 20 73 74 72 6c 65  .  assert( strle
a620: 6e 33 30 28 70 50 72 65 53 74 6d 74 2d 3e 7a 53  n30(pPreStmt->zS
a630: 71 6c 29 3d 3d 70 50 72 65 53 74 6d 74 2d 3e 6e  ql)==pPreStmt->n
a640: 53 71 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Sql );.  assert(
a650: 20 30 3d 3d 6d 65 6d 63 6d 70 28 70 50 72 65 53   0==memcmp(pPreS
a660: 74 6d 74 2d 3e 7a 53 71 6c 2c 20 7a 53 71 6c 2c  tmt->zSql, zSql,
a670: 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 29   pPreStmt->nSql)
a680: 20 29 3b 0a 0a 20 20 2f 2a 20 42 69 6e 64 20 76   );..  /* Bind v
a690: 61 6c 75 65 73 20 74 6f 20 70 61 72 61 6d 65 74  alues to paramet
a6a0: 65 72 73 20 74 68 61 74 20 62 65 67 69 6e 20 77  ers that begin w
a6b0: 69 74 68 20 24 20 6f 72 20 3a 20 2a 2f 0a 20 20  ith $ or : */.  
a6c0: 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 56 61 72  for(i=1; i<=nVar
a6d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73  ; i++){.    cons
a6e0: 74 20 63 68 61 72 20 2a 7a 56 61 72 20 3d 20 73  t char *zVar = s
a6f0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61  qlite3_bind_para
a700: 6d 65 74 65 72 5f 6e 61 6d 65 28 70 53 74 6d 74  meter_name(pStmt
a710: 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20 7a 56  , i);.    if( zV
a720: 61 72 21 3d 30 20 26 26 20 28 7a 56 61 72 5b 30  ar!=0 && (zVar[0
a730: 5d 3d 3d 27 24 27 20 7c 7c 20 7a 56 61 72 5b 30  ]=='$' || zVar[0
a740: 5d 3d 3d 27 3a 27 20 7c 7c 20 7a 56 61 72 5b 30  ]==':' || zVar[0
a750: 5d 3d 3d 27 40 27 29 20 29 7b 0a 20 20 20 20 20  ]=='@') ){.     
a760: 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 72 20 3d   Tcl_Obj *pVar =
a770: 20 54 63 6c 5f 47 65 74 56 61 72 32 45 78 28 69   Tcl_GetVar2Ex(i
a780: 6e 74 65 72 70 2c 20 26 7a 56 61 72 5b 31 5d 2c  nterp, &zVar[1],
a790: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
a7a0: 28 20 70 56 61 72 20 29 7b 0a 20 20 20 20 20 20  ( pVar ){.      
a7b0: 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20    int n;.       
a7c0: 20 75 38 20 2a 64 61 74 61 3b 0a 20 20 20 20 20   u8 *data;.     
a7d0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
a7e0: 54 79 70 65 20 3d 20 28 70 56 61 72 2d 3e 74 79  Type = (pVar->ty
a7f0: 70 65 50 74 72 20 3f 20 70 56 61 72 2d 3e 74 79  pePtr ? pVar->ty
a800: 70 65 50 74 72 2d 3e 6e 61 6d 65 20 3a 20 22 22  pePtr->name : ""
a810: 29 3b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a  );.        c = z
a820: 54 79 70 65 5b 30 5d 3b 0a 20 20 20 20 20 20 20  Type[0];.       
a830: 20 69 66 28 20 7a 56 61 72 5b 30 5d 3d 3d 27 40   if( zVar[0]=='@
a840: 27 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  ' ||.           
a850: 28 63 3d 3d 27 62 27 20 26 26 20 73 74 72 63 6d  (c=='b' && strcm
a860: 70 28 7a 54 79 70 65 2c 22 62 79 74 65 61 72 72  p(zType,"bytearr
a870: 61 79 22 29 3d 3d 30 20 26 26 20 70 56 61 72 2d  ay")==0 && pVar-
a880: 3e 62 79 74 65 73 3d 3d 30 29 20 29 7b 0a 20 20  >bytes==0) ){.  
a890: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 61 64 20          /* Load 
a8a0: 61 20 42 4c 4f 42 20 74 79 70 65 20 69 66 20 74  a BLOB type if t
a8b0: 68 65 20 54 63 6c 20 76 61 72 69 61 62 6c 65 20  he Tcl variable 
a8c0: 69 73 20 61 20 62 79 74 65 61 72 72 61 79 20 61  is a bytearray a
a8d0: 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nd.          ** 
a8e0: 69 74 20 68 61 73 20 6e 6f 20 73 74 72 69 6e 67  it has no string
a8f0: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
a900: 6f 72 20 74 68 65 20 68 6f 73 74 0a 20 20 20 20  or the host.    
a910: 20 20 20 20 20 20 2a 2a 20 70 61 72 61 6d 65 74        ** paramet
a920: 65 72 20 6e 61 6d 65 20 62 65 67 69 6e 73 20 77  er name begins w
a930: 69 74 68 20 22 40 22 2e 20 2a 2f 0a 20 20 20 20  ith "@". */.    
a940: 20 20 20 20 20 20 64 61 74 61 20 3d 20 54 63 6c        data = Tcl
a950: 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f  _GetByteArrayFro
a960: 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a  mObj(pVar, &n);.
a970: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
a980: 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d  3_bind_blob(pStm
a990: 74 2c 20 69 2c 20 64 61 74 61 2c 20 6e 2c 20 53  t, i, data, n, S
a9a0: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
a9b0: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63           Tcl_Inc
a9c0: 72 52 65 66 43 6f 75 6e 74 28 70 56 61 72 29 3b  rRefCount(pVar);
a9d0: 0a 20 20 20 20 20 20 20 20 20 20 70 50 72 65 53  .          pPreS
a9e0: 74 6d 74 2d 3e 61 70 50 61 72 6d 5b 69 50 61 72  tmt->apParm[iPar
a9f0: 6d 2b 2b 5d 20 3d 20 70 56 61 72 3b 0a 20 20 20  m++] = pVar;.   
aa00: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
aa10: 3d 3d 27 62 27 20 26 26 20 73 74 72 63 6d 70 28  =='b' && strcmp(
aa20: 7a 54 79 70 65 2c 22 62 6f 6f 6c 65 61 6e 22 29  zType,"boolean")
aa30: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
aa40: 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
aa50: 62 6a 28 69 6e 74 65 72 70 2c 20 70 56 61 72 2c  bj(interp, pVar,
aa60: 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20   &n);.          
aa70: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
aa80: 28 70 53 74 6d 74 2c 20 69 2c 20 6e 29 3b 0a 20  (pStmt, i, n);. 
aa90: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
aaa0: 20 63 3d 3d 27 64 27 20 26 26 20 73 74 72 63 6d   c=='d' && strcm
aab0: 70 28 7a 54 79 70 65 2c 22 64 6f 75 62 6c 65 22  p(zType,"double"
aac0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
aad0: 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20    double r;.    
aae0: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 44 6f 75        Tcl_GetDou
aaf0: 62 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  bleFromObj(inter
ab00: 70 2c 20 70 56 61 72 2c 20 26 72 29 3b 0a 20 20  p, pVar, &r);.  
ab10: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
ab20: 62 69 6e 64 5f 64 6f 75 62 6c 65 28 70 53 74 6d  bind_double(pStm
ab30: 74 2c 20 69 2c 20 72 29 3b 0a 20 20 20 20 20 20  t, i, r);.      
ab40: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 63 3d 3d    }else if( (c==
ab50: 27 77 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54  'w' && strcmp(zT
ab60: 79 70 65 2c 22 77 69 64 65 49 6e 74 22 29 3d 3d  ype,"wideInt")==
ab70: 30 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  0) ||.          
ab80: 20 20 20 20 28 63 3d 3d 27 69 27 20 26 26 20 73      (c=='i' && s
ab90: 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 69 6e 74  trcmp(zType,"int
aba0: 22 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  ")==0) ){.      
abb0: 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20      Tcl_WideInt 
abc0: 76 3b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  v;.          Tcl
abd0: 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f  _GetWideIntFromO
abe0: 62 6a 28 69 6e 74 65 72 70 2c 20 70 56 61 72 2c  bj(interp, pVar,
abf0: 20 26 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20   &v);.          
ac00: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
ac10: 36 34 28 70 53 74 6d 74 2c 20 69 2c 20 76 29 3b  64(pStmt, i, v);
ac20: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
ac30: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 20 3d            data =
ac40: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
ac50: 2a 29 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  *)Tcl_GetStringF
ac60: 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29  romObj(pVar, &n)
ac70: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
ac80: 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53  te3_bind_text(pS
ac90: 74 6d 74 2c 20 69 2c 20 28 63 68 61 72 20 2a 29  tmt, i, (char *)
aca0: 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f  data, n, SQLITE_
acb0: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20  STATIC);.       
acc0: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
acd0: 75 6e 74 28 70 56 61 72 29 3b 0a 20 20 20 20 20  unt(pVar);.     
ace0: 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 61       pPreStmt->a
acf0: 70 50 61 72 6d 5b 69 50 61 72 6d 2b 2b 5d 20 3d  pParm[iParm++] =
ad00: 20 70 56 61 72 3b 0a 20 20 20 20 20 20 20 20 7d   pVar;.        }
ad10: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
ad20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
ad30: 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 69  nd_null(pStmt, i
ad40: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
ad50: 0a 20 20 7d 0a 20 20 70 50 72 65 53 74 6d 74 2d  .  }.  pPreStmt-
ad60: 3e 6e 50 61 72 6d 20 3d 20 69 50 61 72 6d 3b 0a  >nParm = iParm;.
ad70: 20 20 2a 70 70 50 72 65 53 74 6d 74 20 3d 20 70    *ppPreStmt = p
ad80: 50 72 65 53 74 6d 74 3b 0a 0a 20 20 72 65 74 75  PreStmt;..  retu
ad90: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
ada0: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 73 74  .** Release a st
adb0: 61 74 65 6d 65 6e 74 20 72 65 66 65 72 65 6e 63  atement referenc
adc0: 65 20 6f 62 74 61 69 6e 65 64 20 62 79 20 63 61  e obtained by ca
add0: 6c 6c 69 6e 67 20 64 62 50 72 65 70 61 72 65 41  lling dbPrepareA
ade0: 6e 64 42 69 6e 64 28 29 2e 0a 2a 2a 20 54 68 65  ndBind()..** The
adf0: 72 65 20 73 68 6f 75 6c 64 20 62 65 20 65 78 61  re should be exa
ae00: 63 74 6c 79 20 6f 6e 65 20 63 61 6c 6c 20 74 6f  ctly one call to
ae10: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66   this function f
ae20: 6f 72 20 65 61 63 68 20 63 61 6c 6c 20 74 6f 0a  or each call to.
ae30: 2a 2a 20 64 62 50 72 65 70 61 72 65 41 6e 64 42  ** dbPrepareAndB
ae40: 69 6e 64 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ind()..**.** If 
ae50: 74 68 65 20 64 69 73 63 61 72 64 20 70 61 72 61  the discard para
ae60: 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72  meter is non-zer
ae70: 6f 2c 20 74 68 65 6e 20 74 68 65 20 73 74 61 74  o, then the stat
ae80: 65 6d 65 6e 74 20 69 73 20 64 65 6c 65 74 65 64  ement is deleted
ae90: 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  .** immediately.
aea0: 20 4f 74 68 65 72 77 69 73 65 20 69 74 20 69 73   Otherwise it is
aeb0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52   added to the LR
aec0: 55 20 6c 69 73 74 20 61 6e 64 20 6d 61 79 20 62  U list and may b
aed0: 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 62 79  e returned.** by
aee0: 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 63 61   a subsequent ca
aef0: 6c 6c 20 74 6f 20 64 62 50 72 65 70 61 72 65 41  ll to dbPrepareA
af00: 6e 64 42 69 6e 64 28 29 2e 0a 2a 2f 0a 73 74 61  ndBind()..*/.sta
af10: 74 69 63 20 76 6f 69 64 20 64 62 52 65 6c 65 61  tic void dbRelea
af20: 73 65 53 74 6d 74 28 0a 20 20 53 71 6c 69 74 65  seStmt(.  Sqlite
af30: 44 62 20 2a 70 44 62 2c 20 20 20 20 20 20 20 20  Db *pDb,        
af40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
af50: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
af60: 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d    SqlPreparedStm
af70: 74 20 2a 70 50 72 65 53 74 6d 74 2c 20 20 20 20  t *pPreStmt,    
af80: 20 20 2f 2a 20 50 72 65 70 61 72 65 64 20 73 74    /* Prepared st
af90: 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 20 74  atement handle t
afa0: 6f 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69  o release */.  i
afb0: 6e 74 20 64 69 73 63 61 72 64 20 20 20 20 20 20  nt discard      
afc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
afd0: 2a 20 54 72 75 65 20 74 6f 20 64 65 6c 65 74 65  * True to delete
afe0: 20 28 6e 6f 74 20 63 61 63 68 65 29 20 74 68 65   (not cache) the
aff0: 20 70 50 72 65 53 74 6d 74 20 2a 2f 0a 29 7b 0a   pPreStmt */.){.
b000: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 46    int i;..  /* F
b010: 72 65 65 20 74 68 65 20 62 6f 75 6e 64 20 73 74  ree the bound st
b020: 72 69 6e 67 20 61 6e 64 20 62 6c 6f 62 20 70 61  ring and blob pa
b030: 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 66 6f  rameters */.  fo
b040: 72 28 69 3d 30 3b 20 69 3c 70 50 72 65 53 74 6d  r(i=0; i<pPreStm
b050: 74 2d 3e 6e 50 61 72 6d 3b 20 69 2b 2b 29 7b 0a  t->nParm; i++){.
b060: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
b070: 6f 75 6e 74 28 70 50 72 65 53 74 6d 74 2d 3e 61  ount(pPreStmt->a
b080: 70 50 61 72 6d 5b 69 5d 29 3b 0a 20 20 7d 0a 20  pParm[i]);.  }. 
b090: 20 70 50 72 65 53 74 6d 74 2d 3e 6e 50 61 72 6d   pPreStmt->nParm
b0a0: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 44 62   = 0;..  if( pDb
b0b0: 2d 3e 6d 61 78 53 74 6d 74 3c 3d 30 20 7c 7c 20  ->maxStmt<=0 || 
b0c0: 64 69 73 63 61 72 64 20 29 7b 0a 20 20 20 20 2f  discard ){.    /
b0d0: 2a 20 49 66 20 74 68 65 20 63 61 63 68 65 20 69  * If the cache i
b0e0: 73 20 74 75 72 6e 65 64 20 6f 66 66 2c 20 64 65  s turned off, de
b0f0: 61 6c 6c 6f 63 61 74 65 64 20 74 68 65 20 73 74  allocated the st
b100: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 64  atement */.    d
b110: 62 46 72 65 65 53 74 6d 74 28 70 50 72 65 53 74  bFreeStmt(pPreSt
b120: 6d 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  mt);.  }else{.  
b130: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 70 72 65    /* Add the pre
b140: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
b150: 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
b160: 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 6c 69   of the cache li
b170: 73 74 2e 20 2a 2f 0a 20 20 20 20 70 50 72 65 53  st. */.    pPreS
b180: 74 6d 74 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62  tmt->pNext = pDb
b190: 2d 3e 73 74 6d 74 4c 69 73 74 3b 0a 20 20 20 20  ->stmtList;.    
b1a0: 70 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 20  pPreStmt->pPrev 
b1b0: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 44 62  = 0;.    if( pDb
b1c0: 2d 3e 73 74 6d 74 4c 69 73 74 20 29 7b 0a 20 20  ->stmtList ){.  
b1d0: 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74     pDb->stmtList
b1e0: 2d 3e 70 50 72 65 76 20 3d 20 70 50 72 65 53 74  ->pPrev = pPreSt
b1f0: 6d 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44  mt;.    }.    pD
b200: 62 2d 3e 73 74 6d 74 4c 69 73 74 20 3d 20 70 50  b->stmtList = pP
b210: 72 65 53 74 6d 74 3b 0a 20 20 20 20 69 66 28 20  reStmt;.    if( 
b220: 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 3d 3d 30  pDb->stmtLast==0
b230: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
b240: 28 20 70 44 62 2d 3e 6e 53 74 6d 74 3d 3d 30 20  ( pDb->nStmt==0 
b250: 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 73 74  );.      pDb->st
b260: 6d 74 4c 61 73 74 20 3d 20 70 50 72 65 53 74 6d  mtLast = pPreStm
b270: 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
b280: 20 20 20 20 61 73 73 65 72 74 28 20 70 44 62 2d      assert( pDb-
b290: 3e 6e 53 74 6d 74 3e 30 20 29 3b 0a 20 20 20 20  >nStmt>0 );.    
b2a0: 7d 0a 20 20 20 20 70 44 62 2d 3e 6e 53 74 6d 74  }.    pDb->nStmt
b2b0: 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77  ++;..    /* If w
b2c0: 65 20 68 61 76 65 20 74 6f 6f 20 6d 61 6e 79 20  e have too many 
b2d0: 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 63 61 63  statement in cac
b2e0: 68 65 2c 20 72 65 6d 6f 76 65 20 74 68 65 20 73  he, remove the s
b2f0: 75 72 70 6c 75 73 20 66 72 6f 6d 0a 20 20 20 20  urplus from.    
b300: 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  ** the end of th
b310: 65 20 63 61 63 68 65 20 6c 69 73 74 2e 20 20 2a  e cache list.  *
b320: 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70 44 62  /.    while( pDb
b330: 2d 3e 6e 53 74 6d 74 3e 70 44 62 2d 3e 6d 61 78  ->nStmt>pDb->max
b340: 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 53 71  Stmt ){.      Sq
b350: 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70  lPreparedStmt *p
b360: 4c 61 73 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74  Last = pDb->stmt
b370: 4c 61 73 74 3b 0a 20 20 20 20 20 20 70 44 62 2d  Last;.      pDb-
b380: 3e 73 74 6d 74 4c 61 73 74 20 3d 20 70 4c 61 73  >stmtLast = pLas
b390: 74 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20  t->pPrev;.      
b3a0: 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e 70  pDb->stmtLast->p
b3b0: 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Next = 0;.      
b3c0: 70 44 62 2d 3e 6e 53 74 6d 74 2d 2d 3b 0a 20 20  pDb->nStmt--;.  
b3d0: 20 20 20 20 64 62 46 72 65 65 53 74 6d 74 28 70      dbFreeStmt(p
b3e0: 4c 61 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Last);.    }.  }
b3f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74  .}../*.** Struct
b400: 75 72 65 20 75 73 65 64 20 77 69 74 68 20 64 62  ure used with db
b410: 45 76 61 6c 58 58 58 28 29 20 66 75 6e 63 74 69  EvalXXX() functi
b420: 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 64 62 45  ons:.**.**   dbE
b430: 76 61 6c 49 6e 69 74 28 29 0a 2a 2a 20 20 20 64  valInit().**   d
b440: 62 45 76 61 6c 53 74 65 70 28 29 0a 2a 2a 20 20  bEvalStep().**  
b450: 20 64 62 45 76 61 6c 46 69 6e 61 6c 69 7a 65 28   dbEvalFinalize(
b460: 29 0a 2a 2a 20 20 20 64 62 45 76 61 6c 52 6f 77  ).**   dbEvalRow
b470: 49 6e 66 6f 28 29 0a 2a 2a 20 20 20 64 62 45 76  Info().**   dbEv
b480: 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65 28 29 0a  alColumnValue().
b490: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
b4a0: 74 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20  t DbEvalContext 
b4b0: 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 3b 0a 73  DbEvalContext;.s
b4c0: 74 72 75 63 74 20 44 62 45 76 61 6c 43 6f 6e 74  truct DbEvalCont
b4d0: 65 78 74 20 7b 0a 20 20 53 71 6c 69 74 65 44 62  ext {.  SqliteDb
b4e0: 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20 20   *pDb;          
b4f0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
b500: 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ase handle */.  
b510: 54 63 6c 5f 4f 62 6a 20 2a 70 53 71 6c 3b 20 20  Tcl_Obj *pSql;  
b520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b530: 2f 2a 20 4f 62 6a 65 63 74 20 68 6f 6c 64 69 6e  /* Object holdin
b540: 67 20 73 74 72 69 6e 67 20 7a 53 71 6c 20 2a 2f  g string zSql */
b550: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
b560: 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sql;            
b570: 20 20 20 2f 2a 20 52 65 6d 61 69 6e 69 6e 67 20     /* Remaining 
b580: 53 51 4c 20 74 6f 20 65 78 65 63 75 74 65 20 2a  SQL to execute *
b590: 2f 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64 53  /.  SqlPreparedS
b5a0: 74 6d 74 20 2a 70 50 72 65 53 74 6d 74 3b 20 20  tmt *pPreStmt;  
b5b0: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73      /* Current s
b5c0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
b5d0: 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t nCol;         
b5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b5f0: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
b600: 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 70  ns returned by p
b610: 53 74 6d 74 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  Stmt */.  Tcl_Ob
b620: 6a 20 2a 70 41 72 72 61 79 3b 20 20 20 20 20 20  j *pArray;      
b630: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
b640: 65 20 6f 66 20 61 72 72 61 79 20 76 61 72 69 61  e of array varia
b650: 62 6c 65 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  ble */.  Tcl_Obj
b660: 20 2a 2a 61 70 43 6f 6c 4e 61 6d 65 3b 20 20 20   **apColName;   
b670: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
b680: 79 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  y of column name
b690: 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52  s */.};../*.** R
b6a0: 65 6c 65 61 73 65 20 61 6e 79 20 63 61 63 68 65  elease any cache
b6b0: 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73   of column names
b6c0: 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20   currently held 
b6d0: 61 73 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68  as part of.** th
b6e0: 65 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20  e DbEvalContext 
b6f0: 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64  structure passed
b700: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
b710: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
b720: 63 20 76 6f 69 64 20 64 62 52 65 6c 65 61 73 65  c void dbRelease
b730: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 44 62 45 76  ColumnNames(DbEv
b740: 61 6c 43 6f 6e 74 65 78 74 20 2a 70 29 7b 0a 20  alContext *p){. 
b750: 20 69 66 28 20 70 2d 3e 61 70 43 6f 6c 4e 61 6d   if( p->apColNam
b760: 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  e ){.    int i;.
b770: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
b780: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
b790: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
b7a0: 6f 75 6e 74 28 70 2d 3e 61 70 43 6f 6c 4e 61 6d  ount(p->apColNam
b7b0: 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  e[i]);.    }.   
b7c0: 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 20   Tcl_Free((char 
b7d0: 2a 29 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65 29 3b  *)p->apColName);
b7e0: 0a 20 20 20 20 70 2d 3e 61 70 43 6f 6c 4e 61 6d  .    p->apColNam
b7f0: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e  e = 0;.  }.  p->
b800: 6e 43 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  nCol = 0;.}../*.
b810: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20  ** Initialize a 
b820: 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 73 74  DbEvalContext st
b830: 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49  ructure..**.** I
b840: 66 20 70 41 72 72 61 79 20 69 73 20 6e 6f 74 20  f pArray is not 
b850: 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 63 6f  NULL, then it co
b860: 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 20  ntains the name 
b870: 6f 66 20 61 20 54 63 6c 20 61 72 72 61 79 0a 2a  of a Tcl array.*
b880: 2a 20 76 61 72 69 61 62 6c 65 2e 20 54 68 65 20  * variable. The 
b890: 22 2a 22 20 6d 65 6d 62 65 72 20 6f 66 20 74 68  "*" member of th
b8a0: 69 73 20 61 72 72 61 79 20 69 73 20 73 65 74 20  is array is set 
b8b0: 74 6f 20 61 20 6c 69 73 74 20 63 6f 6e 74 61 69  to a list contai
b8c0: 6e 69 6e 67 0a 2a 2a 20 74 68 65 20 6e 61 6d 65  ning.** the name
b8d0: 73 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73  s of the columns
b8e0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
b8f0: 20 73 74 61 74 65 6d 65 6e 74 20 61 73 20 70 61   statement as pa
b900: 72 74 20 6f 66 20 65 61 63 68 0a 2a 2a 20 63 61  rt of each.** ca
b910: 6c 6c 20 74 6f 20 64 62 45 76 61 6c 53 74 65 70  ll to dbEvalStep
b920: 28 29 2c 20 69 6e 20 6f 72 64 65 72 20 66 72 6f  (), in order fro
b930: 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e  m left to right.
b940: 20 65 2e 67 2e 20 69 66 20 74 68 65 20 6e 61 6d   e.g. if the nam
b950: 65 73 0a 2a 2a 20 6f 66 20 74 68 65 20 72 65 74  es.** of the ret
b960: 75 72 6e 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72  urned columns ar
b970: 65 20 61 2c 20 62 20 61 6e 64 20 63 2c 20 69 74  e a, b and c, it
b980: 20 64 6f 65 73 20 74 68 65 20 65 71 75 69 76 61   does the equiva
b990: 6c 65 6e 74 20 6f 66 20 74 68 65 0a 2a 2a 20 74  lent of the.** t
b9a0: 63 6c 20 63 6f 6d 6d 61 6e 64 3a 0a 2a 2a 0a 2a  cl command:.**.*
b9b0: 2a 20 20 20 20 20 73 65 74 20 24 7b 70 41 72 72  *     set ${pArr
b9c0: 61 79 7d 28 2a 29 20 7b 61 20 62 20 63 7d 0a 2a  ay}(*) {a b c}.*
b9d0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 62  /.static void db
b9e0: 45 76 61 6c 49 6e 69 74 28 0a 20 20 44 62 45 76  EvalInit(.  DbEv
b9f0: 61 6c 43 6f 6e 74 65 78 74 20 2a 70 2c 20 20 20  alContext *p,   
ba00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
ba10: 6f 69 6e 74 65 72 20 74 6f 20 73 74 72 75 63 74  ointer to struct
ba20: 75 72 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  ure to initializ
ba30: 65 20 2a 2f 0a 20 20 53 71 6c 69 74 65 44 62 20  e */.  SqliteDb 
ba40: 2a 70 44 62 2c 20 20 20 20 20 20 20 20 20 20 20  *pDb,           
ba50: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
ba60: 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 54  se handle */.  T
ba70: 63 6c 5f 4f 62 6a 20 2a 70 53 71 6c 2c 20 20 20  cl_Obj *pSql,   
ba80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ba90: 2a 20 4f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e  * Object contain
baa0: 69 6e 67 20 53 51 4c 20 73 63 72 69 70 74 20 2a  ing SQL script *
bab0: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 41 72  /.  Tcl_Obj *pAr
bac0: 72 61 79 20 20 20 20 20 20 20 20 20 20 20 20 20  ray             
bad0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 54      /* Name of T
bae0: 63 6c 20 61 72 72 61 79 20 74 6f 20 73 65 74 20  cl array to set 
baf0: 28 2a 29 20 65 6c 65 6d 65 6e 74 20 6f 66 20 2a  (*) element of *
bb00: 2f 0a 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c  /.){.  memset(p,
bb10: 20 30 2c 20 73 69 7a 65 6f 66 28 44 62 45 76 61   0, sizeof(DbEva
bb20: 6c 43 6f 6e 74 65 78 74 29 29 3b 0a 20 20 70 2d  lContext));.  p-
bb30: 3e 70 44 62 20 3d 20 70 44 62 3b 0a 20 20 70 2d  >pDb = pDb;.  p-
bb40: 3e 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74 53  >zSql = Tcl_GetS
bb50: 74 72 69 6e 67 28 70 53 71 6c 29 3b 0a 20 20 70  tring(pSql);.  p
bb60: 2d 3e 70 53 71 6c 20 3d 20 70 53 71 6c 3b 0a 20  ->pSql = pSql;. 
bb70: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
bb80: 74 28 70 53 71 6c 29 3b 0a 20 20 69 66 28 20 70  t(pSql);.  if( p
bb90: 41 72 72 61 79 20 29 7b 0a 20 20 20 20 70 2d 3e  Array ){.    p->
bba0: 70 41 72 72 61 79 20 3d 20 70 41 72 72 61 79 3b  pArray = pArray;
bbb0: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
bbc0: 43 6f 75 6e 74 28 70 41 72 72 61 79 29 3b 0a 20  Count(pArray);. 
bbd0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74 61   }.}../*.** Obta
bbe0: 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  in information a
bbf0: 62 6f 75 74 20 74 68 65 20 72 6f 77 20 74 68 61  bout the row tha
bc00: 74 20 74 68 65 20 44 62 45 76 61 6c 43 6f 6e 74  t the DbEvalCont
bc10: 65 78 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ext passed as th
bc20: 65 0a 2a 2a 20 66 69 72 73 74 20 61 72 67 75 6d  e.** first argum
bc30: 65 6e 74 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  ent currently po
bc40: 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74  ints to..*/.stat
bc50: 69 63 20 76 6f 69 64 20 64 62 45 76 61 6c 52 6f  ic void dbEvalRo
bc60: 77 49 6e 66 6f 28 0a 20 20 44 62 45 76 61 6c 43  wInfo(.  DbEvalC
bc70: 6f 6e 74 65 78 74 20 2a 70 2c 20 20 20 20 20 20  ontext *p,      
bc80: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 76 61 6c           /* Eval
bc90: 75 61 74 69 6f 6e 20 63 6f 6e 74 65 78 74 20 2a  uation context *
bca0: 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 6f 6c 2c 20  /.  int *pnCol, 
bcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcc0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 75 6d 62      /* OUT: Numb
bcd0: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d  er of column nam
bce0: 65 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  es */.  Tcl_Obj 
bcf0: 2a 2a 2a 70 61 70 43 6f 6c 4e 61 6d 65 20 20 20  ***papColName   
bd00: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
bd10: 41 72 72 61 79 20 6f 66 20 63 6f 6c 75 6d 6e 20  Array of column 
bd20: 6e 61 6d 65 73 20 2a 2f 0a 29 7b 0a 20 20 2f 2a  names */.){.  /*
bd30: 20 43 6f 6d 70 75 74 65 20 63 6f 6c 75 6d 6e 20   Compute column 
bd40: 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 66 28 20 30  names */.  if( 0
bd50: 3d 3d 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65 20 29  ==p->apColName )
bd60: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  {.    sqlite3_st
bd70: 6d 74 20 2a 70 53 74 6d 74 20 3d 20 70 2d 3e 70  mt *pStmt = p->p
bd80: 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74 3b 0a  PreStmt->pStmt;.
bd90: 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
bda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdb0: 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61    /* Iterator va
bdc0: 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e  riable */.    in
bdd0: 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t nCol;         
bde0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
bdf0: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
be00: 20 72 65 74 75 72 6e 65 64 20 62 79 20 70 53 74   returned by pSt
be10: 6d 74 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62  mt */.    Tcl_Ob
be20: 6a 20 2a 2a 61 70 43 6f 6c 4e 61 6d 65 20 3d 20  j **apColName = 
be30: 30 3b 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79  0;      /* Array
be40: 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73   of column names
be50: 20 2a 2f 0a 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c   */..    p->nCol
be60: 20 3d 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65   = nCol = sqlite
be70: 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70  3_column_count(p
be80: 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 6e  Stmt);.    if( n
be90: 43 6f 6c 3e 30 20 26 26 20 28 70 61 70 43 6f 6c  Col>0 && (papCol
bea0: 4e 61 6d 65 20 7c 7c 20 70 2d 3e 70 41 72 72 61  Name || p->pArra
beb0: 79 29 20 29 7b 0a 20 20 20 20 20 20 61 70 43 6f  y) ){.      apCo
bec0: 6c 4e 61 6d 65 20 3d 20 28 54 63 6c 5f 4f 62 6a  lName = (Tcl_Obj
bed0: 2a 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69  **)Tcl_Alloc( si
bee0: 7a 65 6f 66 28 54 63 6c 5f 4f 62 6a 2a 29 2a 6e  zeof(Tcl_Obj*)*n
bef0: 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 66 6f 72  Col );.      for
bf00: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
bf10: 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 70 43 6f  +){.        apCo
bf20: 6c 4e 61 6d 65 5b 69 5d 20 3d 20 54 63 6c 5f 4e  lName[i] = Tcl_N
bf30: 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69  ewStringObj(sqli
bf40: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28  te3_column_name(
bf50: 70 53 74 6d 74 2c 69 29 2c 20 2d 31 29 3b 0a 20  pStmt,i), -1);. 
bf60: 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52         Tcl_IncrR
bf70: 65 66 43 6f 75 6e 74 28 61 70 43 6f 6c 4e 61 6d  efCount(apColNam
bf80: 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  e[i]);.      }. 
bf90: 20 20 20 20 20 70 2d 3e 61 70 43 6f 6c 4e 61 6d       p->apColNam
bfa0: 65 20 3d 20 61 70 43 6f 6c 4e 61 6d 65 3b 0a 20  e = apColName;. 
bfb0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
bfc0: 72 65 73 75 6c 74 73 20 61 72 65 20 62 65 69 6e  results are bein
bfd0: 67 20 73 74 6f 72 65 64 20 69 6e 20 61 6e 20 61  g stored in an a
bfe0: 72 72 61 79 20 76 61 72 69 61 62 6c 65 2c 20 74  rray variable, t
bff0: 68 65 6e 20 63 72 65 61 74 65 0a 20 20 20 20 2a  hen create.    *
c000: 2a 20 74 68 65 20 61 72 72 61 79 28 2a 29 20 65  * the array(*) e
c010: 6e 74 72 79 20 66 6f 72 20 74 68 61 74 20 61 72  ntry for that ar
c020: 72 61 79 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ray.    */.    i
c030: 66 28 20 70 2d 3e 70 41 72 72 61 79 20 29 7b 0a  f( p->pArray ){.
c040: 20 20 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70        Tcl_Interp
c050: 20 2a 69 6e 74 65 72 70 20 3d 20 70 2d 3e 70 44   *interp = p->pD
c060: 62 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 20  b->interp;.     
c070: 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6f 6c 4c 69   Tcl_Obj *pColLi
c080: 73 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28  st = Tcl_NewObj(
c090: 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a  );.      Tcl_Obj
c0a0: 20 2a 70 53 74 61 72 20 3d 20 54 63 6c 5f 4e 65   *pStar = Tcl_Ne
c0b0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 2a 22 2c 20  wStringObj("*", 
c0c0: 2d 31 29 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28  -1);..      for(
c0d0: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
c0e0: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4c  ){.        Tcl_L
c0f0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
c100: 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 43 6f 6c  ent(interp, pCol
c110: 4c 69 73 74 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b  List, apColName[
c120: 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i]);.      }.   
c130: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
c140: 75 6e 74 28 70 53 74 61 72 29 3b 0a 20 20 20 20  unt(pStar);.    
c150: 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32    Tcl_ObjSetVar2
c160: 28 69 6e 74 65 72 70 2c 20 70 2d 3e 70 41 72 72  (interp, p->pArr
c170: 61 79 2c 20 70 53 74 61 72 2c 20 70 43 6f 6c 4c  ay, pStar, pColL
c180: 69 73 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 54  ist, 0);.      T
c190: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
c1a0: 70 53 74 61 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pStar);.    }.  
c1b0: 7d 0a 0a 20 20 69 66 28 20 70 61 70 43 6f 6c 4e  }..  if( papColN
c1c0: 61 6d 65 20 29 7b 0a 20 20 20 20 2a 70 61 70 43  ame ){.    *papC
c1d0: 6f 6c 4e 61 6d 65 20 3d 20 70 2d 3e 61 70 43 6f  olName = p->apCo
c1e0: 6c 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 69 66 28  lName;.  }.  if(
c1f0: 20 70 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 2a 70   pnCol ){.    *p
c200: 6e 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 3b 0a  nCol = p->nCol;.
c210: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
c220: 75 72 6e 20 6f 6e 65 20 6f 66 20 54 43 4c 5f 4f  urn one of TCL_O
c230: 4b 2c 20 54 43 4c 5f 42 52 45 41 4b 20 6f 72 20  K, TCL_BREAK or 
c240: 54 43 4c 5f 45 52 52 4f 52 2e 20 49 66 20 54 43  TCL_ERROR. If TC
c250: 4c 5f 45 52 52 4f 52 20 69 73 0a 2a 2a 20 72 65  L_ERROR is.** re
c260: 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 61 6e 20  turned, then an 
c270: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
c280: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 69   stored in the i
c290: 6e 74 65 72 70 72 65 74 65 72 20 62 65 66 6f 72  nterpreter befor
c2a0: 65 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2e 0a  e.** returning..
c2b0: 2a 2a 0a 2a 2a 20 41 20 72 65 74 75 72 6e 20 76  **.** A return v
c2c0: 61 6c 75 65 20 6f 66 20 54 43 4c 5f 4f 4b 20 6d  alue of TCL_OK m
c2d0: 65 61 6e 73 20 74 68 65 72 65 20 69 73 20 61 20  eans there is a 
c2e0: 72 6f 77 20 6f 66 20 64 61 74 61 20 61 76 61 69  row of data avai
c2f0: 6c 61 62 6c 65 2e 20 54 68 65 0a 2a 2a 20 64 61  lable. The.** da
c300: 74 61 20 6d 61 79 20 62 65 20 61 63 63 65 73 73  ta may be access
c310: 65 64 20 75 73 69 6e 67 20 64 62 45 76 61 6c 52  ed using dbEvalR
c320: 6f 77 49 6e 66 6f 28 29 20 61 6e 64 20 64 62 45  owInfo() and dbE
c330: 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65 28 29  valColumnValue()
c340: 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 61 6e 61  . This.** is ana
c350: 6c 6f 67 6f 75 73 20 74 6f 20 61 20 72 65 74 75  logous to a retu
c360: 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 52 4f 57  rn of SQLITE_ROW
c370: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 73 74   from sqlite3_st
c380: 65 70 28 29 2e 20 49 66 20 54 43 4c 5f 42 52 45  ep(). If TCL_BRE
c390: 41 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  AK.** is returne
c3a0: 64 2c 20 74 68 65 6e 20 74 68 65 20 53 51 4c 20  d, then the SQL 
c3b0: 73 63 72 69 70 74 20 68 61 73 20 66 69 6e 69 73  script has finis
c3c0: 68 65 64 20 65 78 65 63 75 74 69 6e 67 20 61 6e  hed executing an
c3d0: 64 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 6e  d there are.** n
c3e0: 6f 20 66 75 72 74 68 65 72 20 72 6f 77 73 20 61  o further rows a
c3f0: 76 61 69 6c 61 62 6c 65 2e 20 54 68 69 73 20 69  vailable. This i
c400: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 53 51 4c  s similar to SQL
c410: 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2f 0a 73 74 61  ITE_DONE..*/.sta
c420: 74 69 63 20 69 6e 74 20 64 62 45 76 61 6c 53 74  tic int dbEvalSt
c430: 65 70 28 44 62 45 76 61 6c 43 6f 6e 74 65 78 74  ep(DbEvalContext
c440: 20 2a 70 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68   *p){.  const ch
c450: 61 72 20 2a 7a 50 72 65 76 53 71 6c 20 3d 20 30  ar *zPrevSql = 0
c460: 3b 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69  ;       /* Previ
c470: 6f 75 73 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e  ous value of p->
c480: 7a 53 71 6c 20 2a 2f 0a 0a 20 20 77 68 69 6c 65  zSql */..  while
c490: 28 20 70 2d 3e 7a 53 71 6c 5b 30 5d 20 7c 7c 20  ( p->zSql[0] || 
c4a0: 70 2d 3e 70 50 72 65 53 74 6d 74 20 29 7b 0a 20  p->pPreStmt ){. 
c4b0: 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69     int rc;.    i
c4c0: 66 28 20 70 2d 3e 70 50 72 65 53 74 6d 74 3d 3d  f( p->pPreStmt==
c4d0: 30 20 29 7b 0a 20 20 20 20 20 20 7a 50 72 65 76  0 ){.      zPrev
c4e0: 53 71 6c 20 3d 20 28 70 2d 3e 7a 53 71 6c 3d 3d  Sql = (p->zSql==
c4f0: 7a 50 72 65 76 53 71 6c 20 3f 20 30 20 3a 20 70  zPrevSql ? 0 : p
c500: 2d 3e 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 72  ->zSql);.      r
c510: 63 20 3d 20 64 62 50 72 65 70 61 72 65 41 6e 64  c = dbPrepareAnd
c520: 42 69 6e 64 28 70 2d 3e 70 44 62 2c 20 70 2d 3e  Bind(p->pDb, p->
c530: 7a 53 71 6c 2c 20 26 70 2d 3e 7a 53 71 6c 2c 20  zSql, &p->zSql, 
c540: 26 70 2d 3e 70 50 72 65 53 74 6d 74 29 3b 0a 20  &p->pPreStmt);. 
c550: 20 20 20 20 20 69 66 28 20 72 63 21 3d 54 43 4c       if( rc!=TCL
c560: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
c570: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
c580: 20 20 69 6e 74 20 72 63 73 3b 0a 20 20 20 20 20    int rcs;.     
c590: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
c5a0: 20 70 2d 3e 70 44 62 3b 0a 20 20 20 20 20 20 53   p->pDb;.      S
c5b0: 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a  qlPreparedStmt *
c5c0: 70 50 72 65 53 74 6d 74 20 3d 20 70 2d 3e 70 50  pPreStmt = p->pP
c5d0: 72 65 53 74 6d 74 3b 0a 20 20 20 20 20 20 73 71  reStmt;.      sq
c5e0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
c5f0: 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 53  t = pPreStmt->pS
c600: 74 6d 74 3b 0a 0a 20 20 20 20 20 20 72 63 73 20  tmt;..      rcs 
c610: 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
c620: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28  Stmt);.      if(
c630: 20 72 63 73 3d 3d 53 51 4c 49 54 45 5f 52 4f 57   rcs==SQLITE_ROW
c640: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
c650: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 20  rn TCL_OK;.     
c660: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   }.      if( p->
c670: 70 41 72 72 61 79 20 29 7b 0a 20 20 20 20 20 20  pArray ){.      
c680: 20 20 64 62 45 76 61 6c 52 6f 77 49 6e 66 6f 28    dbEvalRowInfo(
c690: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 0, 0);.      
c6a0: 7d 0a 20 20 20 20 20 20 72 63 73 20 3d 20 73 71  }.      rcs = sq
c6b0: 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d  lite3_reset(pStm
c6c0: 74 29 3b 0a 0a 20 20 20 20 20 20 70 44 62 2d 3e  t);..      pDb->
c6d0: 6e 53 74 65 70 20 3d 20 73 71 6c 69 74 65 33 5f  nStep = sqlite3_
c6e0: 73 74 6d 74 5f 73 74 61 74 75 73 28 70 53 74 6d  stmt_status(pStm
c6f0: 74 2c 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  t,SQLITE_STMTSTA
c700: 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45  TUS_FULLSCAN_STE
c710: 50 2c 31 29 3b 0a 20 20 20 20 20 20 70 44 62 2d  P,1);.      pDb-
c720: 3e 6e 53 6f 72 74 20 3d 20 73 71 6c 69 74 65 33  >nSort = sqlite3
c730: 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70 53 74  _stmt_status(pSt
c740: 6d 74 2c 53 51 4c 49 54 45 5f 53 54 4d 54 53 54  mt,SQLITE_STMTST
c750: 41 54 55 53 5f 53 4f 52 54 2c 31 29 3b 0a 20 20  ATUS_SORT,1);.  
c760: 20 20 20 20 70 44 62 2d 3e 6e 49 6e 64 65 78 20      pDb->nIndex 
c770: 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73  = sqlite3_stmt_s
c780: 74 61 74 75 73 28 70 53 74 6d 74 2c 53 51 4c 49  tatus(pStmt,SQLI
c790: 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55  TE_STMTSTATUS_AU
c7a0: 54 4f 49 4e 44 45 58 2c 31 29 3b 0a 20 20 20 20  TOINDEX,1);.    
c7b0: 20 20 64 62 52 65 6c 65 61 73 65 43 6f 6c 75 6d    dbReleaseColum
c7c0: 6e 4e 61 6d 65 73 28 70 29 3b 0a 20 20 20 20 20  nNames(p);.     
c7d0: 20 70 2d 3e 70 50 72 65 53 74 6d 74 20 3d 20 30   p->pPreStmt = 0
c7e0: 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 73  ;..      if( rcs
c7f0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
c800: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 72         /* If a r
c810: 75 6e 2d 74 69 6d 65 20 65 72 72 6f 72 20 6f 63  un-time error oc
c820: 63 75 72 73 2c 20 72 65 70 6f 72 74 20 74 68 65  curs, report the
c830: 20 65 72 72 6f 72 20 61 6e 64 20 73 74 6f 70 20   error and stop 
c840: 72 65 61 64 69 6e 67 0a 20 20 20 20 20 20 20 20  reading.        
c850: 2a 2a 20 74 68 65 20 53 51 4c 2e 20 20 2a 2f 0a  ** the SQL.  */.
c860: 20 20 20 20 20 20 20 20 64 62 52 65 6c 65 61 73          dbReleas
c870: 65 53 74 6d 74 28 70 44 62 2c 20 70 50 72 65 53  eStmt(pDb, pPreS
c880: 74 6d 74 2c 20 31 29 3b 0a 23 69 66 20 53 51 4c  tmt, 1);.#if SQL
c890: 49 54 45 5f 54 45 53 54 0a 20 20 20 20 20 20 20  ITE_TEST.       
c8a0: 20 69 66 28 20 70 2d 3e 70 44 62 2d 3e 62 4c 65   if( p->pDb->bLe
c8b0: 67 61 63 79 50 72 65 70 61 72 65 20 26 26 20 72  gacyPrepare && r
c8c0: 63 73 3d 3d 53 51 4c 49 54 45 5f 53 43 48 45 4d  cs==SQLITE_SCHEM
c8d0: 41 20 26 26 20 7a 50 72 65 76 53 71 6c 20 29 7b  A && zPrevSql ){
c8e0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
c8f0: 20 74 68 65 20 72 75 6e 74 69 6d 65 20 65 72 72   the runtime err
c900: 6f 72 20 77 61 73 20 61 6e 20 53 51 4c 49 54 45  or was an SQLITE
c910: 5f 53 43 48 45 4d 41 2c 20 61 6e 64 20 74 68 65  _SCHEMA, and the
c920: 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20   database.      
c930: 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 20 69 73      ** handle is
c940: 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75   configured to u
c950: 73 65 20 74 68 65 20 6c 65 67 61 63 79 20 73 71  se the legacy sq
c960: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 29 0a  lite3_prepare().
c970: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74            ** int
c980: 65 72 66 61 63 65 2c 20 72 65 74 72 79 20 70 72  erface, retry pr
c990: 65 70 61 72 65 28 29 2f 73 74 65 70 28 29 20 6f  epare()/step() o
c9a0: 6e 20 74 68 65 20 73 61 6d 65 20 53 51 4c 20 73  n the same SQL s
c9b0: 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20  tatement..      
c9c0: 20 20 20 20 2a 2a 20 54 68 69 73 20 6f 6e 6c 79      ** This only
c9d0: 20 68 61 70 70 65 6e 73 20 6f 6e 63 65 2e 20 49   happens once. I
c9e0: 66 20 74 68 65 72 65 20 69 73 20 61 20 73 65 63  f there is a sec
c9f0: 6f 6e 64 20 53 51 4c 49 54 45 5f 53 43 48 45 4d  ond SQLITE_SCHEM
ca00: 41 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65  A.          ** e
ca10: 72 72 6f 72 2c 20 74 68 65 20 65 72 72 6f 72 20  rror, the error 
ca20: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
ca30: 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20   to the caller. 
ca40: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  */.          p->
ca50: 7a 53 71 6c 20 3d 20 7a 50 72 65 76 53 71 6c 3b  zSql = zPrevSql;
ca60: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
ca70: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23  nue;.        }.#
ca80: 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 54 63  endif.        Tc
ca90: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 70  l_SetObjResult(p
caa0: 44 62 2d 3e 69 6e 74 65 72 70 2c 0a 20 20 20 20  Db->interp,.    
cab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cac0: 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69       Tcl_NewStri
cad0: 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65 72  ngObj(sqlite3_er
cae0: 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 2d  rmsg(pDb->db), -
caf0: 31 29 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  1));.        ret
cb00: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
cb10: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
cb20: 20 20 20 20 64 62 52 65 6c 65 61 73 65 53 74 6d      dbReleaseStm
cb30: 74 28 70 44 62 2c 20 70 50 72 65 53 74 6d 74 2c  t(pDb, pPreStmt,
cb40: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
cb50: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e   }.  }..  /* Fin
cb60: 69 73 68 65 64 20 2a 2f 0a 20 20 72 65 74 75 72  ished */.  retur
cb70: 6e 20 54 43 4c 5f 42 52 45 41 4b 3b 0a 7d 0a 0a  n TCL_BREAK;.}..
cb80: 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 72  /*.** Free all r
cb90: 65 73 6f 75 72 63 65 73 20 63 75 72 72 65 6e 74  esources current
cba0: 6c 79 20 68 65 6c 64 20 62 79 20 74 68 65 20 44  ly held by the D
cbb0: 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 73 74 72  bEvalContext str
cbc0: 75 63 74 75 72 65 20 70 61 73 73 65 64 0a 2a 2a  ucture passed.**
cbd0: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
cbe0: 67 75 6d 65 6e 74 2e 20 54 68 65 72 65 20 73 68  gument. There sh
cbf0: 6f 75 6c 64 20 62 65 20 65 78 61 63 74 6c 79 20  ould be exactly 
cc00: 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  one call to this
cc10: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72   function.** for
cc20: 20 65 61 63 68 20 63 61 6c 6c 20 74 6f 20 64 62   each call to db
cc30: 45 76 61 6c 49 6e 69 74 28 29 2e 0a 2a 2f 0a 73  EvalInit()..*/.s
cc40: 74 61 74 69 63 20 76 6f 69 64 20 64 62 45 76 61  tatic void dbEva
cc50: 6c 46 69 6e 61 6c 69 7a 65 28 44 62 45 76 61 6c  lFinalize(DbEval
cc60: 43 6f 6e 74 65 78 74 20 2a 70 29 7b 0a 20 20 69  Context *p){.  i
cc70: 66 28 20 70 2d 3e 70 50 72 65 53 74 6d 74 20 29  f( p->pPreStmt )
cc80: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
cc90: 73 65 74 28 70 2d 3e 70 50 72 65 53 74 6d 74 2d  set(p->pPreStmt-
cca0: 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 64 62 52  >pStmt);.    dbR
ccb0: 65 6c 65 61 73 65 53 74 6d 74 28 70 2d 3e 70 44  eleaseStmt(p->pD
ccc0: 62 2c 20 70 2d 3e 70 50 72 65 53 74 6d 74 2c 20  b, p->pPreStmt, 
ccd0: 30 29 3b 0a 20 20 20 20 70 2d 3e 70 50 72 65 53  0);.    p->pPreS
cce0: 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  tmt = 0;.  }.  i
ccf0: 66 28 20 70 2d 3e 70 41 72 72 61 79 20 29 7b 0a  f( p->pArray ){.
cd00: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
cd10: 6f 75 6e 74 28 70 2d 3e 70 41 72 72 61 79 29 3b  ount(p->pArray);
cd20: 0a 20 20 20 20 70 2d 3e 70 41 72 72 61 79 20 3d  .    p->pArray =
cd30: 20 30 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 44 65   0;.  }.  Tcl_De
cd40: 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 53  crRefCount(p->pS
cd50: 71 6c 29 3b 0a 20 20 64 62 52 65 6c 65 61 73 65  ql);.  dbRelease
cd60: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 29 3b 0a  ColumnNames(p);.
cd70: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
cd80: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 54  a pointer to a T
cd90: 63 6c 5f 4f 62 6a 20 73 74 72 75 63 74 75 72 65  cl_Obj structure
cda0: 20 77 69 74 68 20 72 65 66 2d 63 6f 75 6e 74 20   with ref-count 
cdb0: 30 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a  0 that contains.
cdc0: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72  ** the value for
cdd0: 20 74 68 65 20 69 43 6f 6c 27 74 68 20 63 6f 6c   the iCol'th col
cde0: 75 6d 6e 20 6f 66 20 74 68 65 20 72 6f 77 20 63  umn of the row c
cdf0: 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 65 64  urrently pointed
ce00: 20 74 6f 20 62 79 0a 2a 2a 20 74 68 65 20 44 62   to by.** the Db
ce10: 45 76 61 6c 43 6f 6e 74 65 78 74 20 73 74 72 75  EvalContext stru
ce20: 63 74 75 72 65 20 70 61 73 73 65 64 20 61 73 20  cture passed as 
ce30: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
ce40: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 63  nt..*/.static Tc
ce50: 6c 5f 4f 62 6a 20 2a 64 62 45 76 61 6c 43 6f 6c  l_Obj *dbEvalCol
ce60: 75 6d 6e 56 61 6c 75 65 28 44 62 45 76 61 6c 43  umnValue(DbEvalC
ce70: 6f 6e 74 65 78 74 20 2a 70 2c 20 69 6e 74 20 69  ontext *p, int i
ce80: 43 6f 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  Col){.  sqlite3_
ce90: 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 70 2d  stmt *pStmt = p-
cea0: 3e 70 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74  >pPreStmt->pStmt
ceb0: 3b 0a 20 20 73 77 69 74 63 68 28 20 73 71 6c 69  ;.  switch( sqli
cec0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28  te3_column_type(
ced0: 70 53 74 6d 74 2c 20 69 43 6f 6c 29 20 29 7b 0a  pStmt, iCol) ){.
cee0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
cef0: 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e  BLOB: {.      in
cf00: 74 20 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65  t bytes = sqlite
cf10: 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70  3_column_bytes(p
cf20: 53 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 20  Stmt, iCol);.   
cf30: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
cf40: 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 63  Blob = sqlite3_c
cf50: 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74  olumn_blob(pStmt
cf60: 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 69  , iCol);.      i
cf70: 66 28 20 21 7a 42 6c 6f 62 20 29 20 62 79 74 65  f( !zBlob ) byte
cf80: 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  s = 0;.      ret
cf90: 75 72 6e 20 54 63 6c 5f 4e 65 77 42 79 74 65 41  urn Tcl_NewByteA
cfa0: 72 72 61 79 4f 62 6a 28 28 75 38 2a 29 7a 42 6c  rrayObj((u8*)zBl
cfb0: 6f 62 2c 20 62 79 74 65 73 29 3b 0a 20 20 20 20  ob, bytes);.    
cfc0: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
cfd0: 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20  E_INTEGER: {.   
cfe0: 20 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20     sqlite_int64 
cff0: 76 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  v = sqlite3_colu
d000: 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  mn_int64(pStmt, 
d010: 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  iCol);.      if(
d020: 20 76 3e 3d 2d 32 31 34 37 34 38 33 36 34 37 20   v>=-2147483647 
d030: 26 26 20 76 3c 3d 32 31 34 37 34 38 33 36 34 37  && v<=2147483647
d040: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
d050: 72 6e 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  rn Tcl_NewIntObj
d060: 28 28 69 6e 74 29 76 29 3b 0a 20 20 20 20 20 20  ((int)v);.      
d070: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
d080: 65 74 75 72 6e 20 54 63 6c 5f 4e 65 77 57 69 64  eturn Tcl_NewWid
d090: 65 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20 20  eIntObj(v);.    
d0a0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 63 61    }.    }.    ca
d0b0: 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a  se SQLITE_FLOAT:
d0c0: 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
d0d0: 54 63 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f 62 6a  Tcl_NewDoubleObj
d0e0: 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  (sqlite3_column_
d0f0: 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20 69 43  double(pStmt, iC
d100: 6f 6c 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ol));.    }.    
d110: 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  case SQLITE_NULL
d120: 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
d130: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
d140: 6a 28 70 2d 3e 70 44 62 2d 3e 7a 4e 75 6c 6c 2c  j(p->pDb->zNull,
d150: 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   -1);.    }.  }.
d160: 0a 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e 65  .  return Tcl_Ne
d170: 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72  wStringObj((char
d180: 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
d190: 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 43 6f  _text(pStmt, iCo
d1a0: 6c 29 2c 20 2d 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  l), -1);.}../*.*
d1b0: 2a 20 49 66 20 75 73 69 6e 67 20 54 63 6c 20 76  * If using Tcl v
d1c0: 65 72 73 69 6f 6e 20 38 2e 36 20 6f 72 20 67 72  ersion 8.6 or gr
d1d0: 65 61 74 65 72 2c 20 75 73 65 20 74 68 65 20 4e  eater, use the N
d1e0: 52 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 61  R functions to a
d1f0: 76 6f 69 64 0a 2a 2a 20 72 65 63 75 72 73 69 76  void.** recursiv
d200: 65 20 65 76 61 6c 75 74 69 6f 6e 20 6f 66 20 73  e evalution of s
d210: 63 72 69 70 74 73 20 62 79 20 74 68 65 20 5b 64  cripts by the [d
d220: 62 20 65 76 61 6c 5d 20 61 6e 64 20 5b 64 62 20  b eval] and [db 
d230: 74 72 61 6e 73 5d 0a 2a 2a 20 63 6f 6d 6d 61 6e  trans].** comman
d240: 64 73 2e 20 45 76 65 6e 20 69 66 20 74 68 65 20  ds. Even if the 
d250: 68 65 61 64 65 72 73 20 75 73 65 64 20 77 68 69  headers used whi
d260: 6c 65 20 63 6f 6d 70 69 6c 69 6e 67 20 74 68 65  le compiling the
d270: 20 65 78 74 65 6e 73 69 6f 6e 0a 2a 2a 20 61 72   extension.** ar
d280: 65 20 38 2e 36 20 6f 72 20 6e 65 77 65 72 2c 20  e 8.6 or newer, 
d290: 74 68 65 20 63 6f 64 65 20 73 74 69 6c 6c 20 74  the code still t
d2a0: 65 73 74 73 20 74 68 65 20 54 63 6c 20 76 65 72  ests the Tcl ver
d2b0: 73 69 6f 6e 20 61 74 20 72 75 6e 74 69 6d 65 2e  sion at runtime.
d2c0: 0a 2a 2a 20 54 68 69 73 20 61 6c 6c 6f 77 73 20  .** This allows 
d2d0: 73 74 75 62 73 2d 65 6e 61 62 6c 65 64 20 62 75  stubs-enabled bu
d2e0: 69 6c 64 73 20 74 6f 20 62 65 20 75 73 65 64 20  ilds to be used 
d2f0: 77 69 74 68 20 6f 6c 64 65 72 20 54 63 6c 20 6c  with older Tcl l
d300: 69 62 72 61 72 69 65 73 2e 0a 2a 2f 0a 23 69 66  ibraries..*/.#if
d310: 20 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49   TCL_MAJOR_VERSI
d320: 4f 4e 3e 38 20 7c 7c 20 28 54 43 4c 5f 4d 41 4a  ON>8 || (TCL_MAJ
d330: 4f 52 5f 56 45 52 53 49 4f 4e 3d 3d 38 20 26 26  OR_VERSION==8 &&
d340: 20 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49   TCL_MINOR_VERSI
d350: 4f 4e 3e 3d 36 29 0a 23 20 64 65 66 69 6e 65 20  ON>=6).# define 
d360: 53 51 4c 49 54 45 5f 54 43 4c 5f 4e 52 45 20 31  SQLITE_TCL_NRE 1
d370: 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 55 73  .static int DbUs
d380: 65 4e 72 65 28 76 6f 69 64 29 7b 0a 20 20 69 6e  eNre(void){.  in
d390: 74 20 6d 61 6a 6f 72 2c 20 6d 69 6e 6f 72 3b 0a  t major, minor;.
d3a0: 20 20 54 63 6c 5f 47 65 74 56 65 72 73 69 6f 6e    Tcl_GetVersion
d3b0: 28 26 6d 61 6a 6f 72 2c 20 26 6d 69 6e 6f 72 2c  (&major, &minor,
d3c0: 20 30 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e   0, 0);.  return
d3d0: 28 20 28 6d 61 6a 6f 72 3d 3d 38 20 26 26 20 6d  ( (major==8 && m
d3e0: 69 6e 6f 72 3e 3d 36 29 20 7c 7c 20 6d 61 6a 6f  inor>=6) || majo
d3f0: 72 3e 38 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 2f  r>8 );.}.#else./
d400: 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 69 6e 67 20 75  *.** Compiling u
d410: 73 69 6e 67 20 68 65 61 64 65 72 73 20 65 61 72  sing headers ear
d420: 6c 69 65 72 20 74 68 61 6e 20 38 2e 36 2e 20 49  lier than 8.6. I
d430: 6e 20 74 68 69 73 20 63 61 73 65 20 4e 52 20 63  n this case NR c
d440: 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 75 73 65 64  annot be.** used
d450: 2c 20 73 6f 20 44 62 55 73 65 4e 72 65 28 29 20  , so DbUseNre() 
d460: 74 6f 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e  to always return
d470: 20 7a 65 72 6f 2e 20 41 64 64 20 23 64 65 66 69   zero. Add #defi
d480: 6e 65 73 20 66 6f 72 20 74 68 65 20 6f 74 68 65  nes for the othe
d490: 72 0a 2a 2a 20 54 63 6c 5f 4e 52 78 78 78 28 29  r.** Tcl_NRxxx()
d4a0: 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 70 72   functions to pr
d4b0: 65 76 65 6e 74 20 74 68 65 6d 20 66 72 6f 6d 20  event them from 
d4c0: 63 61 75 73 69 6e 67 20 63 6f 6d 70 69 6c 61 74  causing compilat
d4d0: 69 6f 6e 20 65 72 72 6f 72 73 2c 0a 2a 2a 20 65  ion errors,.** e
d4e0: 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65 20 6f  ven though the o
d4f0: 6e 6c 79 20 69 6e 76 6f 63 61 74 69 6f 6e 73 20  nly invocations 
d500: 6f 66 20 74 68 65 6d 20 61 72 65 20 77 69 74 68  of them are with
d510: 69 6e 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 62  in conditional b
d520: 6c 6f 63 6b 73 0a 2a 2a 20 6f 66 20 74 68 65 20  locks.** of the 
d530: 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66  form:.**.**   if
d540: 28 20 44 62 55 73 65 4e 72 65 28 29 20 29 20 7b  ( DbUseNre() ) {
d550: 20 2e 2e 2e 20 7d 0a 2a 2f 0a 23 20 64 65 66 69   ... }.*/.# defi
d560: 6e 65 20 53 51 4c 49 54 45 5f 54 43 4c 5f 4e 52  ne SQLITE_TCL_NR
d570: 45 20 30 0a 23 20 64 65 66 69 6e 65 20 44 62 55  E 0.# define DbU
d580: 73 65 4e 72 65 28 29 20 30 0a 23 20 64 65 66 69  seNre() 0.# defi
d590: 6e 65 20 54 63 6c 5f 4e 52 41 64 64 43 61 6c 6c  ne Tcl_NRAddCall
d5a0: 62 61 63 6b 28 61 2c 62 2c 63 2c 64 2c 65 2c 66  back(a,b,c,d,e,f
d5b0: 29 20 28 76 6f 69 64 29 30 0a 23 20 64 65 66 69  ) (void)0.# defi
d5c0: 6e 65 20 54 63 6c 5f 4e 52 45 76 61 6c 4f 62 6a  ne Tcl_NREvalObj
d5d0: 28 61 2c 62 2c 63 29 20 30 0a 23 20 64 65 66 69  (a,b,c) 0.# defi
d5e0: 6e 65 20 54 63 6c 5f 4e 52 43 72 65 61 74 65 43  ne Tcl_NRCreateC
d5f0: 6f 6d 6d 61 6e 64 28 61 2c 62 2c 63 2c 64 2c 65  ommand(a,b,c,d,e
d600: 2c 66 29 20 28 76 6f 69 64 29 30 0a 23 65 6e 64  ,f) (void)0.#end
d610: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  if../*.** This f
d620: 75 6e 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20  unction is part 
d630: 6f 66 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  of the implement
d640: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6d  ation of the com
d650: 6d 61 6e 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 24 64  mand:.**.**   $d
d660: 62 20 65 76 61 6c 20 53 51 4c 20 3f 41 52 52 41  b eval SQL ?ARRA
d670: 59 4e 41 4d 45 3f 20 53 43 52 49 50 54 0a 2a 2f  YNAME? SCRIPT.*/
d680: 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
d690: 54 45 5f 54 43 4c 41 50 49 20 44 62 45 76 61 6c  TE_TCLAPI DbEval
d6a0: 4e 65 78 74 43 6d 64 28 0a 20 20 43 6c 69 65 6e  NextCmd(.  Clien
d6b0: 74 44 61 74 61 20 64 61 74 61 5b 5d 2c 20 20 20  tData data[],   
d6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6d0: 2f 2a 20 64 61 74 61 5b 30 5d 20 69 73 20 74 68  /* data[0] is th
d6e0: 65 20 28 44 62 45 76 61 6c 43 6f 6e 74 65 78 74  e (DbEvalContext
d6f0: 2a 29 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  *) */.  Tcl_Inte
d700: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 20  rp *interp,     
d710: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d720: 54 63 6c 20 69 6e 74 65 72 70 72 65 74 65 72 20  Tcl interpreter 
d730: 2a 2f 0a 20 20 69 6e 74 20 72 65 73 75 6c 74 20  */.  int result 
d740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d750: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
d760: 75 6c 74 20 73 6f 20 66 61 72 20 2a 2f 0a 29 7b  ult so far */.){
d770: 0a 20 20 69 6e 74 20 72 63 20 3d 20 72 65 73 75  .  int rc = resu
d780: 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  lt;             
d790: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
d7a0: 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20  n code */..  /* 
d7b0: 54 68 65 20 66 69 72 73 74 20 65 6c 65 6d 65 6e  The first elemen
d7c0: 74 20 6f 66 20 74 68 65 20 64 61 74 61 5b 5d 20  t of the data[] 
d7d0: 61 72 72 61 79 20 69 73 20 61 20 70 6f 69 6e 74  array is a point
d7e0: 65 72 20 74 6f 20 61 20 44 62 45 76 61 6c 43 6f  er to a DbEvalCo
d7f0: 6e 74 65 78 74 0a 20 20 2a 2a 20 73 74 72 75 63  ntext.  ** struc
d800: 74 75 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 75  ture allocated u
d810: 73 69 6e 67 20 54 63 6c 5f 41 6c 6c 6f 63 28 29  sing Tcl_Alloc()
d820: 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 65 6c 65  . The second ele
d830: 6d 65 6e 74 20 6f 66 20 64 61 74 61 5b 5d 0a 20  ment of data[]. 
d840: 20 2a 2a 20 69 73 20 61 20 70 6f 69 6e 74 65 72   ** is a pointer
d850: 20 74 6f 20 61 20 54 63 6c 5f 4f 62 6a 20 63 6f   to a Tcl_Obj co
d860: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 63 72  ntaining the scr
d870: 69 70 74 20 74 6f 20 72 75 6e 20 66 6f 72 20 65  ipt to run for e
d880: 61 63 68 20 72 6f 77 0a 20 20 2a 2a 20 72 65 74  ach row.  ** ret
d890: 75 72 6e 65 64 20 62 79 20 74 68 65 20 71 75 65  urned by the que
d8a0: 72 69 65 73 20 65 6e 63 61 70 73 75 6c 61 74 65  ries encapsulate
d8b0: 64 20 69 6e 20 64 61 74 61 5b 30 5d 2e 20 2a 2f  d in data[0]. */
d8c0: 0a 20 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74  .  DbEvalContext
d8d0: 20 2a 70 20 3d 20 28 44 62 45 76 61 6c 43 6f 6e   *p = (DbEvalCon
d8e0: 74 65 78 74 20 2a 29 64 61 74 61 5b 30 5d 3b 0a  text *)data[0];.
d8f0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69    Tcl_Obj *pScri
d900: 70 74 20 3d 20 28 54 63 6c 5f 4f 62 6a 20 2a 29  pt = (Tcl_Obj *)
d910: 64 61 74 61 5b 31 5d 3b 0a 20 20 54 63 6c 5f 4f  data[1];.  Tcl_O
d920: 62 6a 20 2a 70 41 72 72 61 79 20 3d 20 70 2d 3e  bj *pArray = p->
d930: 70 41 72 72 61 79 3b 0a 0a 20 20 77 68 69 6c 65  pArray;..  while
d940: 28 20 28 72 63 3d 3d 54 43 4c 5f 4f 4b 20 7c 7c  ( (rc==TCL_OK ||
d950: 20 72 63 3d 3d 54 43 4c 5f 43 4f 4e 54 49 4e 55   rc==TCL_CONTINU
d960: 45 29 20 26 26 20 54 43 4c 5f 4f 4b 3d 3d 28 72  E) && TCL_OK==(r
d970: 63 20 3d 20 64 62 45 76 61 6c 53 74 65 70 28 70  c = dbEvalStep(p
d980: 29 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  )) ){.    int i;
d990: 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20  .    int nCol;. 
d9a0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 43     Tcl_Obj **apC
d9b0: 6f 6c 4e 61 6d 65 3b 0a 20 20 20 20 64 62 45 76  olName;.    dbEv
d9c0: 61 6c 52 6f 77 49 6e 66 6f 28 70 2c 20 26 6e 43  alRowInfo(p, &nC
d9d0: 6f 6c 2c 20 26 61 70 43 6f 6c 4e 61 6d 65 29 3b  ol, &apColName);
d9e0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
d9f0: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
da00: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c 20    Tcl_Obj *pVal 
da10: 3d 20 64 62 45 76 61 6c 43 6f 6c 75 6d 6e 56 61  = dbEvalColumnVa
da20: 6c 75 65 28 70 2c 20 69 29 3b 0a 20 20 20 20 20  lue(p, i);.     
da30: 20 69 66 28 20 70 41 72 72 61 79 3d 3d 30 20 29   if( pArray==0 )
da40: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62  {.        Tcl_Ob
da50: 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c  jSetVar2(interp,
da60: 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20 30   apColName[i], 0
da70: 2c 20 70 56 61 6c 2c 20 30 29 3b 0a 20 20 20 20  , pVal, 0);.    
da80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
da90: 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28   Tcl_ObjSetVar2(
daa0: 69 6e 74 65 72 70 2c 20 70 41 72 72 61 79 2c 20  interp, pArray, 
dab0: 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20 70 56  apColName[i], pV
dac0: 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  al, 0);.      }.
dad0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
dae0: 65 20 72 65 71 75 69 72 65 64 20 69 6e 74 65 72  e required inter
daf0: 70 72 65 74 65 72 20 76 61 72 69 61 62 6c 65 73  preter variables
db00: 20 61 72 65 20 6e 6f 77 20 70 6f 70 75 6c 61 74   are now populat
db10: 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ed with the data
db20: 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65  .    ** from the
db30: 20 63 75 72 72 65 6e 74 20 72 6f 77 2e 20 49 66   current row. If
db40: 20 75 73 69 6e 67 20 4e 52 45 2c 20 73 63 68 65   using NRE, sche
db50: 64 75 6c 65 20 63 61 6c 6c 62 61 63 6b 73 20 74  dule callbacks t
db60: 6f 20 65 76 61 6c 75 61 74 65 0a 20 20 20 20 2a  o evaluate.    *
db70: 2a 20 73 63 72 69 70 74 20 70 53 63 72 69 70 74  * script pScript
db80: 2c 20 74 68 65 6e 20 74 6f 20 69 6e 76 6f 6b 65  , then to invoke
db90: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
dba0: 67 61 69 6e 20 74 6f 20 66 65 74 63 68 20 74 68  gain to fetch th
dbb0: 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 72 6f  e next.    ** ro
dbc0: 77 20 28 6f 72 20 63 6c 65 61 6e 20 75 70 20 69  w (or clean up i
dbd0: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  f there is no ne
dbe0: 78 74 20 72 6f 77 20 6f 72 20 74 68 65 20 73 63  xt row or the sc
dbf0: 72 69 70 74 20 74 68 72 6f 77 73 20 61 6e 0a 20  ript throws an. 
dc00: 20 20 20 2a 2a 20 65 78 63 65 70 74 69 6f 6e 29     ** exception)
dc10: 2e 20 41 66 74 65 72 20 73 63 68 65 64 75 6c 69  . After scheduli
dc20: 6e 67 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 73  ng the callbacks
dc30: 2c 20 72 65 74 75 72 6e 20 63 6f 6e 74 72 6f 6c  , return control
dc40: 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 63   to the.    ** c
dc50: 61 6c 6c 65 72 2e 0a 20 20 20 20 2a 2a 0a 20 20  aller..    **.  
dc60: 20 20 2a 2a 20 49 66 20 6e 6f 74 20 75 73 69 6e    ** If not usin
dc70: 67 20 4e 52 45 2c 20 65 76 61 6c 75 61 74 65 20  g NRE, evaluate 
dc80: 70 53 63 72 69 70 74 20 64 69 72 65 63 74 6c 79  pScript directly
dc90: 20 61 6e 64 20 63 6f 6e 74 69 6e 75 65 20 77 69   and continue wi
dca0: 74 68 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65  th the.    ** ne
dcb0: 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  xt iteration of 
dcc0: 74 68 69 73 20 77 68 69 6c 65 28 2e 2e 2e 29 20  this while(...) 
dcd0: 6c 6f 6f 70 2e 20 20 2a 2f 0a 20 20 20 20 69 66  loop.  */.    if
dce0: 28 20 44 62 55 73 65 4e 72 65 28 29 20 29 7b 0a  ( DbUseNre() ){.
dcf0: 20 20 20 20 20 20 54 63 6c 5f 4e 52 41 64 64 43        Tcl_NRAddC
dd00: 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20  allback(interp, 
dd10: 44 62 45 76 61 6c 4e 65 78 74 43 6d 64 2c 20 28  DbEvalNextCmd, (
dd20: 76 6f 69 64 2a 29 70 2c 20 28 76 6f 69 64 2a 29  void*)p, (void*)
dd30: 70 53 63 72 69 70 74 2c 20 30 2c 20 30 29 3b 0a  pScript, 0, 0);.
dd40: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c        return Tcl
dd50: 5f 4e 52 45 76 61 6c 4f 62 6a 28 69 6e 74 65 72  _NREvalObj(inter
dd60: 70 2c 20 70 53 63 72 69 70 74 2c 20 30 29 3b 0a  p, pScript, 0);.
dd70: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
dd80: 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62   rc = Tcl_EvalOb
dd90: 6a 45 78 28 69 6e 74 65 72 70 2c 20 70 53 63 72  jEx(interp, pScr
dda0: 69 70 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ipt, 0);.    }. 
ddb0: 20 7d 0a 0a 20 20 54 63 6c 5f 44 65 63 72 52 65   }..  Tcl_DecrRe
ddc0: 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b  fCount(pScript);
ddd0: 0a 20 20 64 62 45 76 61 6c 46 69 6e 61 6c 69 7a  .  dbEvalFinaliz
dde0: 65 28 70 29 3b 0a 20 20 54 63 6c 5f 46 72 65 65  e(p);.  Tcl_Free
ddf0: 28 28 63 68 61 72 20 2a 29 70 29 3b 0a 0a 20 20  ((char *)p);..  
de00: 69 66 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 7c  if( rc==TCL_OK |
de10: 7c 20 72 63 3d 3d 54 43 4c 5f 42 52 45 41 4b 20  | rc==TCL_BREAK 
de20: 29 7b 0a 20 20 20 20 54 63 6c 5f 52 65 73 65 74  ){.    Tcl_Reset
de30: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
de40: 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b      rc = TCL_OK;
de50: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
de60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
de70: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
de80: 20 62 79 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e   by the implemen
de90: 74 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 66  tations of the f
dea0: 6f 6c 6c 6f 77 69 6e 67 20 64 61 74 61 62 61 73  ollowing databas
deb0: 65 0a 2a 2a 20 68 61 6e 64 6c 65 20 73 75 62 2d  e.** handle sub-
dec0: 63 6f 6d 6d 61 6e 64 73 3a 0a 2a 2a 0a 2a 2a 20  commands:.**.** 
ded0: 20 20 24 64 62 20 75 70 64 61 74 65 5f 68 6f 6f    $db update_hoo
dee0: 6b 20 3f 53 43 52 49 50 54 3f 0a 2a 2a 20 20 20  k ?SCRIPT?.**   
def0: 24 64 62 20 77 61 6c 5f 68 6f 6f 6b 20 3f 53 43  $db wal_hook ?SC
df00: 52 49 50 54 3f 0a 2a 2a 20 20 20 24 64 62 20 63  RIPT?.**   $db c
df10: 6f 6d 6d 69 74 5f 68 6f 6f 6b 20 3f 53 43 52 49  ommit_hook ?SCRI
df20: 50 54 3f 0a 2a 2a 20 20 20 24 64 62 20 70 72 65  PT?.**   $db pre
df30: 75 70 64 61 74 65 20 68 6f 6f 6b 20 3f 53 43 52  update hook ?SCR
df40: 49 50 54 3f 0a 2a 2f 0a 73 74 61 74 69 63 20 76  IPT?.*/.static v
df50: 6f 69 64 20 44 62 48 6f 6f 6b 43 6d 64 28 0a 20  oid DbHookCmd(. 
df60: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
df70: 65 72 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  erp,            
df80: 20 2f 2a 20 54 63 6c 20 69 6e 74 65 72 70 72 65   /* Tcl interpre
df90: 74 65 72 20 2a 2f 0a 20 20 53 71 6c 69 74 65 44  ter */.  SqliteD
dfa0: 62 20 2a 70 44 62 2c 20 20 20 20 20 20 20 20 20  b *pDb,         
dfb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
dfc0: 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  base handle */. 
dfd0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 41 72 67 2c 20   Tcl_Obj *pArg, 
dfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dff0: 20 2f 2a 20 53 43 52 49 50 54 20 61 72 67 75 6d   /* SCRIPT argum
e000: 65 6e 74 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f  ent (or NULL) */
e010: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 70 70 48  .  Tcl_Obj **ppH
e020: 6f 6f 6b 20 20 20 20 20 20 20 20 20 20 20 20 20  ook             
e030: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
e040: 20 6d 65 6d 62 65 72 20 6f 66 20 53 71 6c 69 74   member of Sqlit
e050: 65 44 62 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  eDb */.){.  sqli
e060: 74 65 33 20 2a 64 62 20 3d 20 70 44 62 2d 3e 64  te3 *db = pDb->d
e070: 62 3b 0a 0a 20 20 69 66 28 20 2a 70 70 48 6f 6f  b;..  if( *ppHoo
e080: 6b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  k ){.    Tcl_Set
e090: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
e0a0: 2c 20 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20 20 20  , *ppHook);.    
e0b0: 69 66 28 20 70 41 72 67 20 29 7b 0a 20 20 20 20  if( pArg ){.    
e0c0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
e0d0: 6e 74 28 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20 20  nt(*ppHook);.   
e0e0: 20 20 20 2a 70 70 48 6f 6f 6b 20 3d 20 30 3b 0a     *ppHook = 0;.
e0f0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
e100: 70 41 72 67 20 29 7b 0a 20 20 20 20 61 73 73 65  pArg ){.    asse
e110: 72 74 28 20 21 28 2a 70 70 48 6f 6f 6b 29 20 29  rt( !(*ppHook) )
e120: 3b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65  ;.    if( Tcl_Ge
e130: 74 43 68 61 72 4c 65 6e 67 74 68 28 70 41 72 67  tCharLength(pArg
e140: 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 70  )>0 ){.      *pp
e150: 48 6f 6f 6b 20 3d 20 70 41 72 67 3b 0a 20 20 20  Hook = pArg;.   
e160: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
e170: 75 6e 74 28 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20  unt(*ppHook);.  
e180: 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20    }.  }..#ifdef 
e190: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52  SQLITE_ENABLE_PR
e1a0: 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 20 20 73  EUPDATE_HOOK.  s
e1b0: 71 6c 69 74 65 33 5f 70 72 65 75 70 64 61 74 65  qlite3_preupdate
e1c0: 5f 68 6f 6f 6b 28 64 62 2c 20 28 70 44 62 2d 3e  _hook(db, (pDb->
e1d0: 70 50 72 65 55 70 64 61 74 65 48 6f 6f 6b 3f 44  pPreUpdateHook?D
e1e0: 62 50 72 65 55 70 64 61 74 65 48 61 6e 64 6c 65  bPreUpdateHandle
e1f0: 72 3a 30 29 2c 20 70 44 62 29 3b 0a 23 65 6e 64  r:0), pDb);.#end
e200: 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 75 70 64  if.  sqlite3_upd
e210: 61 74 65 5f 68 6f 6f 6b 28 64 62 2c 20 28 70 44  ate_hook(db, (pD
e220: 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b 3f 44  b->pUpdateHook?D
e230: 62 55 70 64 61 74 65 48 61 6e 64 6c 65 72 3a 30  bUpdateHandler:0
e240: 29 2c 20 70 44 62 29 3b 0a 20 20 73 71 6c 69 74  ), pDb);.  sqlit
e250: 65 33 5f 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b  e3_rollback_hook
e260: 28 64 62 2c 20 28 70 44 62 2d 3e 70 52 6f 6c 6c  (db, (pDb->pRoll
e270: 62 61 63 6b 48 6f 6f 6b 3f 44 62 52 6f 6c 6c 62  backHook?DbRollb
e280: 61 63 6b 48 61 6e 64 6c 65 72 3a 30 29 2c 20 70  ackHandler:0), p
e290: 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 77  Db);.  sqlite3_w
e2a0: 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20 28 70 44 62  al_hook(db, (pDb
e2b0: 2d 3e 70 57 61 6c 48 6f 6f 6b 3f 44 62 57 61 6c  ->pWalHook?DbWal
e2c0: 48 61 6e 64 6c 65 72 3a 30 29 2c 20 70 44 62 29  Handler:0), pDb)
e2d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 22  ;.}../*.** The "
e2e0: 73 71 6c 69 74 65 22 20 63 6f 6d 6d 61 6e 64 20  sqlite" command 
e2f0: 62 65 6c 6f 77 20 63 72 65 61 74 65 73 20 61 20  below creates a 
e300: 6e 65 77 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20  new Tcl command 
e310: 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6e 6e  for each.** conn
e320: 65 63 74 69 6f 6e 20 69 74 20 6f 70 65 6e 73 20  ection it opens 
e330: 74 6f 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74  to an SQLite dat
e340: 61 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75  abase.  This rou
e350: 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 0a  tine is invoked.
e360: 2a 2a 20 77 68 65 6e 65 76 65 72 20 6f 6e 65 20  ** whenever one 
e370: 6f 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65 63 74  of those connect
e380: 69 6f 6e 2d 73 70 65 63 69 66 69 63 20 63 6f 6d  ion-specific com
e390: 6d 61 6e 64 73 20 69 73 20 65 78 65 63 75 74 65  mands is execute
e3a0: 64 0a 2a 2a 20 69 6e 20 54 63 6c 2e 20 20 46 6f  d.** in Tcl.  Fo
e3b0: 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 79 6f  r example, if yo
e3c0: 75 20 72 75 6e 20 54 63 6c 20 63 6f 64 65 20 6c  u run Tcl code l
e3d0: 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
e3e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 64 62        sqlite3 db
e3f0: 31 20 20 22 6d 79 5f 64 61 74 61 62 61 73 65 22  1  "my_database"
e400: 0a 2a 2a 20 20 20 20 20 20 20 64 62 31 20 63 6c  .**       db1 cl
e410: 6f 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  ose.**.** The fi
e420: 72 73 74 20 63 6f 6d 6d 61 6e 64 20 6f 70 65 6e  rst command open
e430: 73 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  s a connection t
e440: 6f 20 74 68 65 20 22 6d 79 5f 64 61 74 61 62 61  o the "my_databa
e450: 73 65 22 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  se" database.** 
e460: 61 6e 64 20 63 61 6c 6c 73 20 74 68 61 74 20 63  and calls that c
e470: 6f 6e 6e 65 63 74 69 6f 6e 20 22 64 62 31 22 2e  onnection "db1".
e480: 20 20 54 68 65 20 73 65 63 6f 6e 64 20 63 6f 6d    The second com
e490: 6d 61 6e 64 20 63 61 75 73 65 73 20 74 68 69 73  mand causes this
e4a0: 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65 20 74  .** subroutine t
e4b0: 6f 20 62 65 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f  o be invoked..*/
e4c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
e4d0: 54 45 5f 54 43 4c 41 50 49 20 44 62 4f 62 6a 43  TE_TCLAPI DbObjC
e4e0: 6d 64 28 0a 20 20 76 6f 69 64 20 2a 63 64 2c 0a  md(.  void *cd,.
e4f0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
e500: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
e510: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e  ,.  Tcl_Obj *con
e520: 73 74 2a 6f 62 6a 76 0a 29 7b 0a 20 20 53 71 6c  st*objv.){.  Sql
e530: 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71  iteDb *pDb = (Sq
e540: 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69 6e  liteDb*)cd;.  in
e550: 74 20 63 68 6f 69 63 65 3b 0a 20 20 69 6e 74 20  t choice;.  int 
e560: 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 73  rc = TCL_OK;.  s
e570: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
e580: 20 2a 44 42 5f 73 74 72 73 5b 5d 20 3d 20 7b 0a   *DB_strs[] = {.
e590: 20 20 20 20 22 61 75 74 68 6f 72 69 7a 65 72 22      "authorizer"
e5a0: 2c 20 20 20 20 20 20 20 20 20 22 62 61 63 6b 75  ,         "backu
e5b0: 70 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 22  p",            "
e5c0: 62 75 73 79 22 2c 0a 20 20 20 20 22 63 61 63 68  busy",.    "cach
e5d0: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
e5e0: 20 22 63 68 61 6e 67 65 73 22 2c 20 20 20 20 20   "changes",     
e5f0: 20 20 20 20 20 20 22 63 6c 6f 73 65 22 2c 0a 20        "close",. 
e600: 20 20 20 22 63 6f 6c 6c 61 74 65 22 2c 20 20 20     "collate",   
e610: 20 20 20 20 20 20 20 20 20 22 63 6f 6c 6c 61 74           "collat
e620: 69 6f 6e 5f 6e 65 65 64 65 64 22 2c 20 20 22 63  ion_needed",  "c
e630: 6f 6d 6d 69 74 5f 68 6f 6f 6b 22 2c 0a 20 20 20  ommit_hook",.   
e640: 20 22 63 6f 6d 70 6c 65 74 65 22 2c 20 20 20 20   "complete",    
e650: 20 20 20 20 20 20 20 22 63 6f 70 79 22 2c 20 20         "copy",  
e660: 20 20 20 20 20 20 20 20 20 20 20 20 22 65 6e 61              "ena
e670: 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69  ble_load_extensi
e680: 6f 6e 22 2c 0a 20 20 20 20 22 65 72 72 6f 72 63  on",.    "errorc
e690: 6f 64 65 22 2c 20 20 20 20 20 20 20 20 20 20 22  ode",          "
e6a0: 65 76 61 6c 22 2c 20 20 20 20 20 20 20 20 20 20  eval",          
e6b0: 20 20 20 20 22 65 78 69 73 74 73 22 2c 0a 20 20      "exists",.  
e6c0: 20 20 22 66 75 6e 63 74 69 6f 6e 22 2c 20 20 20    "function",   
e6d0: 20 20 20 20 20 20 20 20 22 69 6e 63 72 62 6c 6f          "incrblo
e6e0: 62 22 2c 20 20 20 20 20 20 20 20 20 20 22 69 6e  b",          "in
e6f0: 74 65 72 72 75 70 74 22 2c 0a 20 20 20 20 22 6c  terrupt",.    "l
e700: 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
e710: 22 2c 20 20 22 6e 75 6c 6c 76 61 6c 75 65 22 2c  ",  "nullvalue",
e720: 20 20 20 20 20 20 20 20 20 22 6f 6e 65 63 6f 6c           "onecol
e730: 75 6d 6e 22 2c 0a 20 20 20 20 22 70 72 65 75 70  umn",.    "preup
e740: 64 61 74 65 22 2c 20 20 20 20 20 20 20 20 20 20  date",          
e750: 22 70 72 6f 66 69 6c 65 22 2c 20 20 20 20 20 20  "profile",      
e760: 20 20 20 20 20 22 70 72 6f 67 72 65 73 73 22 2c       "progress",
e770: 0a 20 20 20 20 22 72 65 6b 65 79 22 2c 20 20 20  .    "rekey",   
e780: 20 20 20 20 20 20 20 20 20 20 20 22 72 65 73 74             "rest
e790: 6f 72 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ore",           
e7a0: 22 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 22 2c  "rollback_hook",
e7b0: 0a 20 20 20 20 22 73 74 61 74 75 73 22 2c 20 20  .    "status",  
e7c0: 20 20 20 20 20 20 20 20 20 20 20 22 74 69 6d 65             "time
e7d0: 6f 75 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  out",           
e7e0: 22 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 22 2c  "total_changes",
e7f0: 0a 20 20 20 20 22 74 72 61 63 65 22 2c 20 20 20  .    "trace",   
e800: 20 20 20 20 20 20 20 20 20 20 20 22 74 72 61 63             "trac
e810: 65 5f 76 32 22 2c 20 20 20 20 20 20 20 20 20 20  e_v2",          
e820: 22 74 72 61 6e 73 61 63 74 69 6f 6e 22 2c 0a 20  "transaction",. 
e830: 20 20 20 22 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66     "unlock_notif
e840: 79 22 2c 20 20 20 20 20 20 22 75 70 64 61 74 65  y",      "update
e850: 5f 68 6f 6f 6b 22 2c 20 20 20 20 20 20 20 22 76  _hook",       "v
e860: 65 72 73 69 6f 6e 22 2c 0a 20 20 20 20 22 77 61  ersion",.    "wa
e870: 6c 5f 68 6f 6f 6b 22 2c 0a 20 20 20 20 30 0a 20  l_hook",.    0. 
e880: 20 7d 3b 0a 20 20 65 6e 75 6d 20 44 42 5f 65 6e   };.  enum DB_en
e890: 75 6d 20 7b 0a 20 20 20 20 44 42 5f 41 55 54 48  um {.    DB_AUTH
e8a0: 4f 52 49 5a 45 52 2c 20 20 20 20 20 20 20 20 44  ORIZER,        D
e8b0: 42 5f 42 41 43 4b 55 50 2c 20 20 20 20 20 20 20  B_BACKUP,       
e8c0: 20 20 20 20 44 42 5f 42 55 53 59 2c 0a 20 20 20      DB_BUSY,.   
e8d0: 20 44 42 5f 43 41 43 48 45 2c 20 20 20 20 20 20   DB_CACHE,      
e8e0: 20 20 20 20 20 20 20 44 42 5f 43 48 41 4e 47 45         DB_CHANGE
e8f0: 53 2c 20 20 20 20 20 20 20 20 20 20 44 42 5f 43  S,          DB_C
e900: 4c 4f 53 45 2c 0a 20 20 20 20 44 42 5f 43 4f 4c  LOSE,.    DB_COL
e910: 4c 41 54 45 2c 20 20 20 20 20 20 20 20 20 20 20  LATE,           
e920: 44 42 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4e 45 45  DB_COLLATION_NEE
e930: 44 45 44 2c 20 44 42 5f 43 4f 4d 4d 49 54 5f 48  DED, DB_COMMIT_H
e940: 4f 4f 4b 2c 0a 20 20 20 20 44 42 5f 43 4f 4d 50  OOK,.    DB_COMP
e950: 4c 45 54 45 2c 20 20 20 20 20 20 20 20 20 20 44  LETE,          D
e960: 42 5f 43 4f 50 59 2c 20 20 20 20 20 20 20 20 20  B_COPY,         
e970: 20 20 20 20 44 42 5f 45 4e 41 42 4c 45 5f 4c 4f      DB_ENABLE_LO
e980: 41 44 5f 45 58 54 45 4e 53 49 4f 4e 2c 0a 20 20  AD_EXTENSION,.  
e990: 20 20 44 42 5f 45 52 52 4f 52 43 4f 44 45 2c 20    DB_ERRORCODE, 
e9a0: 20 20 20 20 20 20 20 20 44 42 5f 45 56 41 4c 2c          DB_EVAL,
e9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f               DB_
e9c0: 45 58 49 53 54 53 2c 0a 20 20 20 20 44 42 5f 46  EXISTS,.    DB_F
e9d0: 55 4e 43 54 49 4f 4e 2c 20 20 20 20 20 20 20 20  UNCTION,        
e9e0: 20 20 44 42 5f 49 4e 43 52 42 4c 4f 42 2c 20 20    DB_INCRBLOB,  
e9f0: 20 20 20 20 20 20 20 44 42 5f 49 4e 54 45 52 52         DB_INTERR
ea00: 55 50 54 2c 0a 20 20 20 20 44 42 5f 4c 41 53 54  UPT,.    DB_LAST
ea10: 5f 49 4e 53 45 52 54 5f 52 4f 57 49 44 2c 20 44  _INSERT_ROWID, D
ea20: 42 5f 4e 55 4c 4c 56 41 4c 55 45 2c 20 20 20 20  B_NULLVALUE,    
ea30: 20 20 20 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e      DB_ONECOLUMN
ea40: 2c 0a 20 20 20 20 44 42 5f 50 52 45 55 50 44 41  ,.    DB_PREUPDA
ea50: 54 45 2c 20 20 20 20 20 20 20 20 20 44 42 5f 50  TE,         DB_P
ea60: 52 4f 46 49 4c 45 2c 20 20 20 20 20 20 20 20 20  ROFILE,         
ea70: 20 44 42 5f 50 52 4f 47 52 45 53 53 2c 0a 20 20   DB_PROGRESS,.  
ea80: 20 20 44 42 5f 52 45 4b 45 59 2c 20 20 20 20 20    DB_REKEY,     
ea90: 20 20 20 20 20 20 20 20 44 42 5f 52 45 53 54 4f          DB_RESTO
eaa0: 52 45 2c 20 20 20 20 20 20 20 20 20 20 44 42 5f  RE,          DB_
eab0: 52 4f 4c 4c 42 41 43 4b 5f 48 4f 4f 4b 2c 0a 20  ROLLBACK_HOOK,. 
eac0: 20 20 20 44 42 5f 53 54 41 54 55 53 2c 20 20 20     DB_STATUS,   
ead0: 20 20 20 20 20 20 20 20 20 44 42 5f 54 49 4d 45           DB_TIME
eae0: 4f 55 54 2c 20 20 20 20 20 20 20 20 20 20 44 42  OUT,          DB
eaf0: 5f 54 4f 54 41 4c 5f 43 48 41 4e 47 45 53 2c 0a  _TOTAL_CHANGES,.
eb00: 20 20 20 20 44 42 5f 54 52 41 43 45 2c 20 20 20      DB_TRACE,   
eb10: 20 20 20 20 20 20 20 20 20 20 44 42 5f 54 52 41            DB_TRA
eb20: 43 45 5f 56 32 2c 20 20 20 20 20 20 20 20 20 44  CE_V2,         D
eb30: 42 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 0a 20  B_TRANSACTION,. 
eb40: 20 20 20 44 42 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54     DB_UNLOCK_NOT
eb50: 49 46 59 2c 20 20 20 20 20 44 42 5f 55 50 44 41  IFY,     DB_UPDA
eb60: 54 45 5f 48 4f 4f 4b 2c 20 20 20 20 20 20 44 42  TE_HOOK,      DB
eb70: 5f 56 45 52 53 49 4f 4e 2c 0a 20 20 20 20 44 42  _VERSION,.    DB
eb80: 5f 57 41 4c 5f 48 4f 4f 4b 2c 0a 20 20 7d 3b 0a  _WAL_HOOK,.  };.
eb90: 20 20 2f 2a 20 64 6f 6e 27 74 20 6c 65 61 76 65    /* don't leave
eba0: 20 74 72 61 69 6c 69 6e 67 20 63 6f 6d 6d 61 73   trailing commas
ebb0: 20 6f 6e 20 44 42 5f 65 6e 75 6d 2c 20 69 74 20   on DB_enum, it 
ebc0: 63 6f 6e 66 75 73 65 73 20 74 68 65 20 41 49 58  confuses the AIX
ebd0: 20 78 6c 63 20 63 6f 6d 70 69 6c 65 72 20 2a 2f   xlc compiler */
ebe0: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3c 32 20 29  ..  if( objc<2 )
ebf0: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
ec00: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
ec10: 2c 20 6f 62 6a 76 2c 20 22 53 55 42 43 4f 4d 4d  , objv, "SUBCOMM
ec20: 41 4e 44 20 2e 2e 2e 22 29 3b 0a 20 20 20 20 72  AND ...");.    r
ec30: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
ec40: 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47  .  }.  if( Tcl_G
ec50: 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69  etIndexFromObj(i
ec60: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20  nterp, objv[1], 
ec70: 44 42 5f 73 74 72 73 2c 20 22 6f 70 74 69 6f 6e  DB_strs, "option
ec80: 22 2c 20 30 2c 20 26 63 68 6f 69 63 65 29 20 29  ", 0, &choice) )
ec90: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
eca0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 73  _ERROR;.  }..  s
ecb0: 77 69 74 63 68 28 20 28 65 6e 75 6d 20 44 42 5f  witch( (enum DB_
ecc0: 65 6e 75 6d 29 63 68 6f 69 63 65 20 29 7b 0a 0a  enum)choice ){..
ecd0: 20 20 2f 2a 20 20 20 20 24 64 62 20 61 75 74 68    /*    $db auth
ece0: 6f 72 69 7a 65 72 20 3f 43 41 4c 4c 42 41 43 4b  orizer ?CALLBACK
ecf0: 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f  ?.  **.  ** Invo
ed00: 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c  ke the given cal
ed10: 6c 62 61 63 6b 20 74 6f 20 61 75 74 68 6f 72 69  lback to authori
ed20: 7a 65 20 65 61 63 68 20 53 51 4c 20 6f 70 65 72  ze each SQL oper
ed30: 61 74 69 6f 6e 20 61 73 20 69 74 20 69 73 0a 20  ation as it is. 
ed40: 20 2a 2a 20 63 6f 6d 70 69 6c 65 64 2e 20 20 35   ** compiled.  5
ed50: 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 61   arguments are a
ed60: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 63  ppended to the c
ed70: 61 6c 6c 62 61 63 6b 20 62 65 66 6f 72 65 20 69  allback before i
ed80: 74 20 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6b 65  t is.  ** invoke
ed90: 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28  d:.  **.  **   (
eda0: 31 29 20 54 68 65 20 61 75 74 68 6f 72 69 7a 61  1) The authoriza
edb0: 74 69 6f 6e 20 74 79 70 65 20 28 65 78 3a 20 53  tion type (ex: S
edc0: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42  QLITE_CREATE_TAB
edd0: 4c 45 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52  LE, SQLITE_INSER
ede0: 54 2c 20 2e 2e 2e 29 0a 20 20 2a 2a 20 20 20 28  T, ...).  **   (
edf0: 32 29 20 46 69 72 73 74 20 64 65 73 63 72 69 70  2) First descrip
ee00: 74 69 76 65 20 6e 61 6d 65 20 28 64 65 70 65 6e  tive name (depen
ee10: 64 73 20 6f 6e 20 61 75 74 68 6f 72 69 7a 61 74  ds on authorizat
ee20: 69 6f 6e 20 74 79 70 65 29 0a 20 20 2a 2a 20 20  ion type).  **  
ee30: 20 28 33 29 20 53 65 63 6f 6e 64 20 64 65 73 63   (3) Second desc
ee40: 72 69 70 74 69 76 65 20 6e 61 6d 65 0a 20 20 2a  riptive name.  *
ee50: 2a 20 20 20 28 34 29 20 4e 61 6d 65 20 6f 66 20  *   (4) Name of 
ee60: 74 68 65 20 64 61 74 61 62 61 73 65 20 28 65 78  the database (ex
ee70: 3a 20 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22  : "main", "temp"
ee80: 29 0a 20 20 2a 2a 20 20 20 28 35 29 20 4e 61 6d  ).  **   (5) Nam
ee90: 65 20 6f 66 20 74 72 69 67 67 65 72 20 74 68 61  e of trigger tha
eea0: 74 20 69 73 20 64 6f 69 6e 67 20 74 68 65 20 61  t is doing the a
eeb0: 63 63 65 73 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ccess.  **.  ** 
eec0: 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 73 68 6f  The callback sho
eed0: 75 6c 64 20 72 65 74 75 72 6e 20 6f 6e 20 6f 66  uld return on of
eee0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
eef0: 74 72 69 6e 67 73 3a 20 53 51 4c 49 54 45 5f 4f  trings: SQLITE_O
ef00: 4b 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 49  K,.  ** SQLITE_I
ef10: 47 4e 4f 52 45 2c 20 6f 72 20 53 51 4c 49 54 45  GNORE, or SQLITE
ef20: 5f 44 45 4e 59 2e 20 20 41 6e 79 20 6f 74 68 65  _DENY.  Any othe
ef30: 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  r return value i
ef40: 73 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 2a 2a  s an error..  **
ef50: 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 6d 65  .  ** If this me
ef60: 74 68 6f 64 20 69 73 20 69 6e 76 6f 6b 65 64 20  thod is invoked 
ef70: 77 69 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74  with no argument
ef80: 73 2c 20 74 68 65 20 63 75 72 72 65 6e 74 20 61  s, the current a
ef90: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 0a 20 20 2a  uthorization.  *
efa0: 2a 20 63 61 6c 6c 62 61 63 6b 20 73 74 72 69 6e  * callback strin
efb0: 67 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 20  g is returned.. 
efc0: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 41 55   */.  case DB_AU
efd0: 54 48 4f 52 49 5a 45 52 3a 20 7b 0a 23 69 66 64  THORIZER: {.#ifd
efe0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
eff0: 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20  UTHORIZATION.   
f000: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
f010: 74 28 69 6e 74 65 72 70 2c 20 22 61 75 74 68 6f  t(interp, "autho
f020: 72 69 7a 61 74 69 6f 6e 20 6e 6f 74 20 61 76 61  rization not ava
f030: 69 6c 61 62 6c 65 20 69 6e 20 74 68 69 73 20 62  ilable in this b
f040: 75 69 6c 64 22 2c 0a 20 20 20 20 20 20 20 20 20  uild",.         
f050: 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
f060: 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72  r*)0);.    retur
f070: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c  n TCL_ERROR;.#el
f080: 73 65 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e  se.    if( objc>
f090: 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
f0a0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
f0b0: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43  rp, 2, objv, "?C
f0c0: 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20  ALLBACK?");.    
f0d0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
f0e0: 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  OR;.    }else if
f0f0: 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20  ( objc==2 ){.   
f100: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74     if( pDb->zAut
f110: 68 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  h ){.        Tcl
f120: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
f130: 74 65 72 70 2c 20 70 44 62 2d 3e 7a 41 75 74 68  terp, pDb->zAuth
f140: 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
f150: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
f160: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 41 75 74        char *zAut
f170: 68 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  h;.      int len
f180: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  ;.      if( pDb-
f190: 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 20 20  >zAuth ){.      
f1a0: 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e    Tcl_Free(pDb->
f1b0: 7a 41 75 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a  zAuth);.      }.
f1c0: 20 20 20 20 20 20 7a 41 75 74 68 20 3d 20 54 63        zAuth = Tc
f1d0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
f1e0: 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e  bj(objv[2], &len
f1f0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41 75  );.      if( zAu
f200: 74 68 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20  th && len>0 ){. 
f210: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 41 75 74         pDb->zAut
f220: 68 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c  h = Tcl_Alloc( l
f230: 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20  en + 1 );.      
f240: 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 41    memcpy(pDb->zA
f250: 75 74 68 2c 20 7a 41 75 74 68 2c 20 6c 65 6e 2b  uth, zAuth, len+
f260: 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
f270: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 41  .        pDb->zA
f280: 75 74 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  uth = 0;.      }
f290: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
f2a0: 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 20 20 20  zAuth ){.       
f2b0: 20 74 79 70 65 64 65 66 20 69 6e 74 20 28 2a 73   typedef int (*s
f2c0: 71 6c 69 74 65 33 5f 61 75 74 68 5f 63 62 29 28  qlite3_auth_cb)(
f2d0: 0a 20 20 20 20 20 20 20 20 20 20 20 76 6f 69 64  .           void
f2e0: 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72  *,int,const char
f2f0: 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 0a 20  *,const char*,. 
f300: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
f310: 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72  char*,const char
f320: 2a 29 3b 0a 20 20 20 20 20 20 20 20 70 44 62 2d  *);.        pDb-
f330: 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  >interp = interp
f340: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
f350: 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65 72  3_set_authorizer
f360: 28 70 44 62 2d 3e 64 62 2c 28 73 71 6c 69 74 65  (pDb->db,(sqlite
f370: 33 5f 61 75 74 68 5f 63 62 29 61 75 74 68 5f 63  3_auth_cb)auth_c
f380: 61 6c 6c 62 61 63 6b 2c 70 44 62 29 3b 0a 20 20  allback,pDb);.  
f390: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f3a0: 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61     sqlite3_set_a
f3b0: 75 74 68 6f 72 69 7a 65 72 28 70 44 62 2d 3e 64  uthorizer(pDb->d
f3c0: 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  b, 0, 0);.      
f3d0: 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
f3e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
f3f0: 20 2f 2a 20 20 20 20 24 64 62 20 62 61 63 6b 75   /*    $db backu
f400: 70 20 3f 44 41 54 41 42 41 53 45 3f 20 46 49 4c  p ?DATABASE? FIL
f410: 45 4e 41 4d 45 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ENAME.  **.  ** 
f420: 4f 70 65 6e 20 6f 72 20 63 72 65 61 74 65 20 61  Open or create a
f430: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   database file n
f440: 61 6d 65 64 20 46 49 4c 45 4e 41 4d 45 2e 20 20  amed FILENAME.  
f450: 54 72 61 6e 73 66 65 72 20 74 68 65 0a 20 20 2a  Transfer the.  *
f460: 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 6c 6f 63  * content of loc
f470: 61 6c 20 64 61 74 61 62 61 73 65 20 44 41 54 41  al database DATA
f480: 42 41 53 45 20 28 64 65 66 61 75 6c 74 3a 20 22  BASE (default: "
f490: 6d 61 69 6e 22 29 20 69 6e 74 6f 20 74 68 65 0a  main") into the.
f4a0: 20 20 2a 2a 20 46 49 4c 45 4e 41 4d 45 20 64 61    ** FILENAME da
f4b0: 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63  tabase..  */.  c
f4c0: 61 73 65 20 44 42 5f 42 41 43 4b 55 50 3a 20 7b  ase DB_BACKUP: {
f4d0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
f4e0: 2a 7a 44 65 73 74 46 69 6c 65 3b 0a 20 20 20 20  *zDestFile;.    
f4f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 72 63  const char *zSrc
f500: 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20  Db;.    sqlite3 
f510: 2a 70 44 65 73 74 3b 0a 20 20 20 20 73 71 6c 69  *pDest;.    sqli
f520: 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63  te3_backup *pBac
f530: 6b 75 70 3b 0a 0a 20 20 20 20 69 66 28 20 6f 62  kup;..    if( ob
f540: 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 7a  jc==3 ){.      z
f550: 53 72 63 44 62 20 3d 20 22 6d 61 69 6e 22 3b 0a  SrcDb = "main";.
f560: 20 20 20 20 20 20 7a 44 65 73 74 46 69 6c 65 20        zDestFile 
f570: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
f580: 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 7d 65  objv[2]);.    }e
f590: 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20  lse if( objc==4 
f5a0: 29 7b 0a 20 20 20 20 20 20 7a 53 72 63 44 62 20  ){.      zSrcDb 
f5b0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
f5c0: 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 20 20  objv[2]);.      
f5d0: 7a 44 65 73 74 46 69 6c 65 20 3d 20 54 63 6c 5f  zDestFile = Tcl_
f5e0: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33  GetString(objv[3
f5f0: 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
f600: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
f610: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
f620: 20 6f 62 6a 76 2c 20 22 3f 44 41 54 41 42 41 53   objv, "?DATABAS
f630: 45 3f 20 46 49 4c 45 4e 41 4d 45 22 29 3b 0a 20  E? FILENAME");. 
f640: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
f650: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
f660: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70   rc = sqlite3_op
f670: 65 6e 5f 76 32 28 7a 44 65 73 74 46 69 6c 65 2c  en_v2(zDestFile,
f680: 20 26 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20   &pDest,.       
f690: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
f6a0: 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
f6b0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
f6c0: 54 45 7c 20 70 44 62 2d 3e 6f 70 65 6e 46 6c 61  TE| pDb->openFla
f6d0: 67 73 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  gs, 0);.    if( 
f6e0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
f6f0: 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
f700: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
f710: 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 74 61 72  "cannot open tar
f720: 67 65 74 20 64 61 74 61 62 61 73 65 3a 20 22 2c  get database: ",
f730: 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  .           sqli
f740: 74 65 33 5f 65 72 72 6d 73 67 28 70 44 65 73 74  te3_errmsg(pDest
f750: 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ), (char*)0);.  
f760: 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
f770: 65 28 70 44 65 73 74 29 3b 0a 20 20 20 20 20 20  e(pDest);.      
f780: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
f790: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 61 63  ;.    }.    pBac
f7a0: 6b 75 70 20 3d 20 73 71 6c 69 74 65 33 5f 62 61  kup = sqlite3_ba
f7b0: 63 6b 75 70 5f 69 6e 69 74 28 70 44 65 73 74 2c  ckup_init(pDest,
f7c0: 20 22 6d 61 69 6e 22 2c 20 70 44 62 2d 3e 64 62   "main", pDb->db
f7d0: 2c 20 7a 53 72 63 44 62 29 3b 0a 20 20 20 20 69  , zSrcDb);.    i
f7e0: 66 28 20 70 42 61 63 6b 75 70 3d 3d 30 20 29 7b  f( pBackup==0 ){
f7f0: 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
f800: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
f810: 22 62 61 63 6b 75 70 20 66 61 69 6c 65 64 3a 20  "backup failed: 
f820: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71  ",.           sq
f830: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 65  lite3_errmsg(pDe
f840: 73 74 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  st), (char*)0);.
f850: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c        sqlite3_cl
f860: 6f 73 65 28 70 44 65 73 74 29 3b 0a 20 20 20 20  ose(pDest);.    
f870: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
f880: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68  OR;.    }.    wh
f890: 69 6c 65 28 20 20 28 72 63 20 3d 20 73 71 6c 69  ile(  (rc = sqli
f8a0: 74 65 33 5f 62 61 63 6b 75 70 5f 73 74 65 70 28  te3_backup_step(
f8b0: 70 42 61 63 6b 75 70 2c 31 30 30 29 29 3d 3d 53  pBackup,100))==S
f8c0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 7d 0a 20 20 20  QLITE_OK ){}.   
f8d0: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f   sqlite3_backup_
f8e0: 66 69 6e 69 73 68 28 70 42 61 63 6b 75 70 29 3b  finish(pBackup);
f8f0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
f900: 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
f910: 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20    rc = TCL_OK;. 
f920: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f930: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
f940: 28 69 6e 74 65 72 70 2c 20 22 62 61 63 6b 75 70  (interp, "backup
f950: 20 66 61 69 6c 65 64 3a 20 22 2c 0a 20 20 20 20   failed: ",.    
f960: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65         sqlite3_e
f970: 72 72 6d 73 67 28 70 44 65 73 74 29 2c 20 28 63  rrmsg(pDest), (c
f980: 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72  har*)0);.      r
f990: 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  c = TCL_ERROR;. 
f9a0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
f9b0: 5f 63 6c 6f 73 65 28 70 44 65 73 74 29 3b 0a 20  _close(pDest);. 
f9c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
f9d0: 20 2f 2a 20 20 20 20 24 64 62 20 62 75 73 79 20   /*    $db busy 
f9e0: 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a  ?CALLBACK?.  **.
f9f0: 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20    ** Invoke the 
fa00: 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 69  given callback i
fa10: 66 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65  f an SQL stateme
fa20: 6e 74 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f  nt attempts to o
fa30: 70 65 6e 0a 20 20 2a 2a 20 61 20 6c 6f 63 6b 65  pen.  ** a locke
fa40: 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  d database file.
fa50: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
fa60: 42 55 53 59 3a 20 7b 0a 20 20 20 20 69 66 28 20  BUSY: {.    if( 
fa70: 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20  objc>3 ){.      
fa80: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
fa90: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
faa0: 2c 20 22 43 41 4c 4c 42 41 43 4b 22 29 3b 0a 20  , "CALLBACK");. 
fab0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
fac0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65  ERROR;.    }else
fad0: 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a   if( objc==2 ){.
fae0: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
faf0: 42 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Busy ){.        
fb00: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
fb10: 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 42  (interp, pDb->zB
fb20: 75 73 79 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  usy, (char*)0);.
fb30: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
fb40: 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  e{.      char *z
fb50: 42 75 73 79 3b 0a 20 20 20 20 20 20 69 6e 74 20  Busy;.      int 
fb60: 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70  len;.      if( p
fb70: 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20  Db->zBusy ){.   
fb80: 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44       Tcl_Free(pD
fb90: 62 2d 3e 7a 42 75 73 79 29 3b 0a 20 20 20 20 20  b->zBusy);.     
fba0: 20 7d 0a 20 20 20 20 20 20 7a 42 75 73 79 20 3d   }.      zBusy =
fbb0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
fbc0: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26  omObj(objv[2], &
fbd0: 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  len);.      if( 
fbe0: 7a 42 75 73 79 20 26 26 20 6c 65 6e 3e 30 20 29  zBusy && len>0 )
fbf0: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
fc00: 42 75 73 79 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63  Busy = Tcl_Alloc
fc10: 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20  ( len + 1 );.   
fc20: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d       memcpy(pDb-
fc30: 3e 7a 42 75 73 79 2c 20 7a 42 75 73 79 2c 20 6c  >zBusy, zBusy, l
fc40: 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c  en+1);.      }el
fc50: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d  se{.        pDb-
fc60: 3e 7a 42 75 73 79 20 3d 20 30 3b 0a 20 20 20 20  >zBusy = 0;.    
fc70: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44    }.      if( pD
fc80: 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20 20  b->zBusy ){.    
fc90: 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20      pDb->interp 
fca0: 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20  = interp;.      
fcb0: 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68    sqlite3_busy_h
fcc0: 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20  andler(pDb->db, 
fcd0: 44 62 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 70  DbBusyHandler, p
fce0: 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Db);.      }else
fcf0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
fd00: 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 70  3_busy_handler(p
fd10: 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20  Db->db, 0, 0);. 
fd20: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
fd30: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
fd40: 2a 20 20 20 20 20 24 64 62 20 63 61 63 68 65 20  *     $db cache 
fd50: 66 6c 75 73 68 0a 20 20 2a 2a 20 20 20 20 20 24  flush.  **     $
fd60: 64 62 20 63 61 63 68 65 20 73 69 7a 65 20 6e 0a  db cache size n.
fd70: 20 20 2a 2a 0a 20 20 2a 2a 20 46 6c 75 73 68 20    **.  ** Flush 
fd80: 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
fd90: 74 65 6d 65 6e 74 20 63 61 63 68 65 2c 20 6f 72  tement cache, or
fda0: 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d   set the maximum
fdb0: 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20   number of.  ** 
fdc0: 63 61 63 68 65 64 20 73 74 61 74 65 6d 65 6e 74  cached statement
fdd0: 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  s..  */.  case D
fde0: 42 5f 43 41 43 48 45 3a 20 7b 0a 20 20 20 20 63  B_CACHE: {.    c
fdf0: 68 61 72 20 2a 73 75 62 43 6d 64 3b 0a 20 20 20  har *subCmd;.   
fe00: 20 69 6e 74 20 6e 3b 0a 0a 20 20 20 20 69 66 28   int n;..    if(
fe10: 20 6f 62 6a 63 3c 3d 32 20 29 7b 0a 20 20 20 20   objc<=2 ){.    
fe20: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
fe30: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
fe40: 6a 76 2c 20 22 63 61 63 68 65 20 6f 70 74 69 6f  jv, "cache optio
fe50: 6e 20 3f 61 72 67 3f 22 29 3b 0a 20 20 20 20 20  n ?arg?");.     
fe60: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
fe70: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 75 62  R;.    }.    sub
fe80: 43 6d 64 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  Cmd = Tcl_GetStr
fe90: 69 6e 67 46 72 6f 6d 4f 62 6a 28 20 6f 62 6a 76  ingFromObj( objv
fea0: 5b 32 5d 2c 20 30 20 29 3b 0a 20 20 20 20 69 66  [2], 0 );.    if
feb0: 28 20 2a 73 75 62 43 6d 64 3d 3d 27 66 27 20 26  ( *subCmd=='f' &
fec0: 26 20 73 74 72 63 6d 70 28 73 75 62 43 6d 64 2c  & strcmp(subCmd,
fed0: 22 66 6c 75 73 68 22 29 3d 3d 30 20 29 7b 0a 20  "flush")==0 ){. 
fee0: 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33       if( objc!=3
fef0: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
ff00: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
ff10: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 66  erp, 2, objv, "f
ff20: 6c 75 73 68 22 29 3b 0a 20 20 20 20 20 20 20 20  lush");.        
ff30: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
ff40: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
ff50: 20 20 20 20 20 20 20 66 6c 75 73 68 53 74 6d 74         flushStmt
ff60: 43 61 63 68 65 28 20 70 44 62 20 29 3b 0a 20 20  Cache( pDb );.  
ff70: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
ff80: 69 66 28 20 2a 73 75 62 43 6d 64 3d 3d 27 73 27  if( *subCmd=='s'
ff90: 20 26 26 20 73 74 72 63 6d 70 28 73 75 62 43 6d   && strcmp(subCm
ffa0: 64 2c 22 73 69 7a 65 22 29 3d 3d 30 20 29 7b 0a  d,"size")==0 ){.
ffb0: 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d        if( objc!=
ffc0: 34 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  4 ){.        Tcl
ffd0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
ffe0: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
fff0: 73 69 7a 65 20 6e 22 29 3b 0a 20 20 20 20 20 20  size n");.      
10000 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
10010 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  OR;.      }else{
10020 0a 20 20 20 20 20 20 20 20 69 66 28 20 54 43 4c  .        if( TCL
10030 5f 45 52 52 4f 52 3d 3d 54 63 6c 5f 47 65 74 49  _ERROR==Tcl_GetI
10040 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
10050 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e 29 20 29  , objv[3], &n) )
10060 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  {.          Tcl_
10070 41 70 70 65 6e 64 52 65 73 75 6c 74 28 20 69 6e  AppendResult( in
10080 74 65 72 70 2c 20 22 63 61 6e 6e 6f 74 20 63 6f  terp, "cannot co
10090 6e 76 65 72 74 20 5c 22 22 2c 0a 20 20 20 20 20  nvert \"",.     
100a0 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65            Tcl_Ge
100b0 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
100c0 62 6a 76 5b 33 5d 2c 30 29 2c 20 22 5c 22 20 74  bjv[3],0), "\" t
100d0 6f 20 69 6e 74 65 67 65 72 22 2c 20 28 63 68 61  o integer", (cha
100e0 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 20 20 20  r*)0);.         
100f0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
10100 52 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  R;.        }else
10110 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
10120 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  n<0 ){.         
10130 20 20 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68     flushStmtCach
10140 65 28 20 70 44 62 20 29 3b 0a 20 20 20 20 20 20  e( pDb );.      
10150 20 20 20 20 20 20 6e 20 3d 20 30 3b 0a 20 20 20        n = 0;.   
10160 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
10170 20 6e 3e 4d 41 58 5f 50 52 45 50 41 52 45 44 5f   n>MAX_PREPARED_
10180 53 54 4d 54 53 20 29 7b 0a 20 20 20 20 20 20 20  STMTS ){.       
10190 20 20 20 20 20 6e 20 3d 20 4d 41 58 5f 50 52 45       n = MAX_PRE
101a0 50 41 52 45 44 5f 53 54 4d 54 53 3b 0a 20 20 20  PARED_STMTS;.   
101b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
101c0 20 20 20 70 44 62 2d 3e 6d 61 78 53 74 6d 74 20     pDb->maxStmt 
101d0 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = n;.        }. 
101e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
101f0 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
10200 6e 64 52 65 73 75 6c 74 28 20 69 6e 74 65 72 70  ndResult( interp
10210 2c 20 22 62 61 64 20 6f 70 74 69 6f 6e 20 5c 22  , "bad option \"
10220 22 2c 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  ",.          Tcl
10230 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
10240 6a 28 6f 62 6a 76 5b 32 5d 2c 30 29 2c 20 22 5c  j(objv[2],0), "\
10250 22 3a 20 6d 75 73 74 20 62 65 20 66 6c 75 73 68  ": must be flush
10260 20 6f 72 20 73 69 7a 65 22 2c 0a 20 20 20 20 20   or size",.     
10270 20 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b 0a       (char*)0);.
10280 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
10290 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
102a0 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
102b0 2f 2a 20 20 20 20 20 24 64 62 20 63 68 61 6e 67  /*     $db chang
102c0 65 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74  es.  **.  ** Ret
102d0 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
102e0 66 20 72 6f 77 73 20 74 68 61 74 20 77 65 72 65  f rows that were
102f0 20 6d 6f 64 69 66 69 65 64 2c 20 69 6e 73 65 72   modified, inser
10300 74 65 64 2c 20 6f 72 20 64 65 6c 65 74 65 64 20  ted, or deleted 
10310 62 79 0a 20 20 2a 2a 20 74 68 65 20 6d 6f 73 74  by.  ** the most
10320 20 72 65 63 65 6e 74 20 49 4e 53 45 52 54 2c 20   recent INSERT, 
10330 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
10340 20 73 74 61 74 65 6d 65 6e 74 2c 20 6e 6f 74 20   statement, not 
10350 69 6e 63 6c 75 64 69 6e 67 0a 20 20 2a 2a 20 61  including.  ** a
10360 6e 79 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20  ny changes made 
10370 62 79 20 74 72 69 67 67 65 72 20 70 72 6f 67 72  by trigger progr
10380 61 6d 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ams..  */.  case
10390 20 44 42 5f 43 48 41 4e 47 45 53 3a 20 7b 0a 20   DB_CHANGES: {. 
103a0 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73     Tcl_Obj *pRes
103b0 75 6c 74 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a  ult;.    if( obj
103c0 63 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=2 ){.      Tc
103d0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
103e0 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
103f0 22 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  "");.      retur
10400 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
10410 20 7d 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d   }.    pResult =
10420 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c   Tcl_GetObjResul
10430 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54  t(interp);.    T
10440 63 6c 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52 65  cl_SetIntObj(pRe
10450 73 75 6c 74 2c 20 73 71 6c 69 74 65 33 5f 63 68  sult, sqlite3_ch
10460 61 6e 67 65 73 28 70 44 62 2d 3e 64 62 29 29 3b  anges(pDb->db));
10470 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
10480 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 63 6c 6f  .  /*    $db clo
10490 73 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 68 75  se.  **.  ** Shu
104a0 74 64 6f 77 6e 20 74 68 65 20 64 61 74 61 62 61  tdown the databa
104b0 73 65 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  se.  */.  case D
104c0 42 5f 43 4c 4f 53 45 3a 20 7b 0a 20 20 20 20 54  B_CLOSE: {.    T
104d0 63 6c 5f 44 65 6c 65 74 65 43 6f 6d 6d 61 6e 64  cl_DeleteCommand
104e0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
104f0 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
10500 6a 76 5b 30 5d 2c 20 30 29 29 3b 0a 20 20 20 20  jv[0], 0));.    
10510 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
10520 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 63 6f  .  **     $db co
10530 6c 6c 61 74 65 20 4e 41 4d 45 20 53 43 52 49 50  llate NAME SCRIP
10540 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 72 65 61  T.  **.  ** Crea
10550 74 65 20 61 20 6e 65 77 20 53 51 4c 20 63 6f 6c  te a new SQL col
10560 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  lation function 
10570 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 57 68  called NAME.  Wh
10580 65 6e 65 76 65 72 0a 20 20 2a 2a 20 74 68 61 74  enever.  ** that
10590 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
105a0 6c 65 64 2c 20 69 6e 76 6f 6b 65 20 53 43 52 49  led, invoke SCRI
105b0 50 54 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  PT to evaluate t
105c0 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a  he function..  *
105d0 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f 4c 4c  /.  case DB_COLL
105e0 41 54 45 3a 20 7b 0a 20 20 20 20 53 71 6c 43 6f  ATE: {.    SqlCo
105f0 6c 6c 61 74 65 20 2a 70 43 6f 6c 6c 61 74 65 3b  llate *pCollate;
10600 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  .    char *zName
10610 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 63 72  ;.    char *zScr
10620 69 70 74 3b 0a 20 20 20 20 69 6e 74 20 6e 53 63  ipt;.    int nSc
10630 72 69 70 74 3b 0a 20 20 20 20 69 66 28 20 6f 62  ript;.    if( ob
10640 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 54  jc!=4 ){.      T
10650 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
10660 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
10670 20 22 4e 41 4d 45 20 53 43 52 49 50 54 22 29 3b   "NAME SCRIPT");
10680 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
10690 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
106a0 20 20 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47     zName = Tcl_G
106b0 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
106c0 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20  objv[2], 0);.   
106d0 20 7a 53 63 72 69 70 74 20 3d 20 54 63 6c 5f 47   zScript = Tcl_G
106e0 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
106f0 6f 62 6a 76 5b 33 5d 2c 20 26 6e 53 63 72 69 70  objv[3], &nScrip
10700 74 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65  t);.    pCollate
10710 20 3d 20 28 53 71 6c 43 6f 6c 6c 61 74 65 2a 29   = (SqlCollate*)
10720 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f  Tcl_Alloc( sizeo
10730 66 28 2a 70 43 6f 6c 6c 61 74 65 29 20 2b 20 6e  f(*pCollate) + n
10740 53 63 72 69 70 74 20 2b 20 31 20 29 3b 0a 20 20  Script + 1 );.  
10750 20 20 69 66 28 20 70 43 6f 6c 6c 61 74 65 3d 3d    if( pCollate==
10760 30 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  0 ) return TCL_E
10770 52 52 4f 52 3b 0a 20 20 20 20 70 43 6f 6c 6c 61  RROR;.    pColla
10780 74 65 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74  te->interp = int
10790 65 72 70 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74  erp;.    pCollat
107a0 65 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e  e->pNext = pDb->
107b0 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 70 43  pCollate;.    pC
107c0 6f 6c 6c 61 74 65 2d 3e 7a 53 63 72 69 70 74 20  ollate->zScript 
107d0 3d 20 28 63 68 61 72 2a 29 26 70 43 6f 6c 6c 61  = (char*)&pColla
107e0 74 65 5b 31 5d 3b 0a 20 20 20 20 70 44 62 2d 3e  te[1];.    pDb->
107f0 70 43 6f 6c 6c 61 74 65 20 3d 20 70 43 6f 6c 6c  pCollate = pColl
10800 61 74 65 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ate;.    memcpy(
10810 70 43 6f 6c 6c 61 74 65 2d 3e 7a 53 63 72 69 70  pCollate->zScrip
10820 74 2c 20 7a 53 63 72 69 70 74 2c 20 6e 53 63 72  t, zScript, nScr
10830 69 70 74 2b 31 29 3b 0a 20 20 20 20 69 66 28 20  ipt+1);.    if( 
10840 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
10850 6f 6c 6c 61 74 69 6f 6e 28 70 44 62 2d 3e 64 62  ollation(pDb->db
10860 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f  , zName, SQLITE_
10870 55 54 46 38 2c 0a 20 20 20 20 20 20 20 20 70 43  UTF8,.        pC
10880 6f 6c 6c 61 74 65 2c 20 74 63 6c 53 71 6c 43 6f  ollate, tclSqlCo
10890 6c 6c 61 74 65 29 20 29 7b 0a 20 20 20 20 20 20  llate) ){.      
108a0 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
108b0 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71  terp, (char *)sq
108c0 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62  lite3_errmsg(pDb
108d0 2d 3e 64 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54  ->db), TCL_VOLAT
108e0 49 4c 45 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ILE);.      retu
108f0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
10900 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
10910 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
10920 20 20 24 64 62 20 63 6f 6c 6c 61 74 69 6f 6e 5f    $db collation_
10930 6e 65 65 64 65 64 20 53 43 52 49 50 54 0a 20 20  needed SCRIPT.  
10940 2a 2a 0a 20 20 2a 2a 20 43 72 65 61 74 65 20 61  **.  ** Create a
10950 20 6e 65 77 20 53 51 4c 20 63 6f 6c 6c 61 74 69   new SQL collati
10960 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  on function call
10970 65 64 20 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76  ed NAME.  Whenev
10980 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 66 75 6e  er.  ** that fun
10990 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
109a0 20 69 6e 76 6f 6b 65 20 53 43 52 49 50 54 20 74   invoke SCRIPT t
109b0 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 66  o evaluate the f
109c0 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  unction..  */.  
109d0 63 61 73 65 20 44 42 5f 43 4f 4c 4c 41 54 49 4f  case DB_COLLATIO
109e0 4e 5f 4e 45 45 44 45 44 3a 20 7b 0a 20 20 20 20  N_NEEDED: {.    
109f0 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
10a00 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
10a10 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
10a20 20 6f 62 6a 76 2c 20 22 53 43 52 49 50 54 22 29   objv, "SCRIPT")
10a30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
10a40 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
10a50 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 43 6f      if( pDb->pCo
10a60 6c 6c 61 74 65 4e 65 65 64 65 64 20 29 7b 0a 20  llateNeeded ){. 
10a70 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66       Tcl_DecrRef
10a80 43 6f 75 6e 74 28 70 44 62 2d 3e 70 43 6f 6c 6c  Count(pDb->pColl
10a90 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 20 20  ateNeeded);.    
10aa0 7d 0a 20 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c  }.    pDb->pColl
10ab0 61 74 65 4e 65 65 64 65 64 20 3d 20 54 63 6c 5f  ateNeeded = Tcl_
10ac0 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 6f 62 6a  DuplicateObj(obj
10ad0 76 5b 32 5d 29 3b 0a 20 20 20 20 54 63 6c 5f 49  v[2]);.    Tcl_I
10ae0 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d  ncrRefCount(pDb-
10af0 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29  >pCollateNeeded)
10b00 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f  ;.    sqlite3_co
10b10 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 28 70  llation_needed(p
10b20 44 62 2d 3e 64 62 2c 20 70 44 62 2c 20 74 63 6c  Db->db, pDb, tcl
10b30 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a  CollateNeeded);.
10b40 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
10b50 20 20 2f 2a 20 20 20 20 24 64 62 20 63 6f 6d 6d    /*    $db comm
10b60 69 74 5f 68 6f 6f 6b 20 3f 43 41 4c 4c 42 41 43  it_hook ?CALLBAC
10b70 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76  K?.  **.  ** Inv
10b80 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63 61  oke the given ca
10b90 6c 6c 62 61 63 6b 20 6a 75 73 74 20 62 65 66 6f  llback just befo
10ba0 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 65 76  re committing ev
10bb0 65 72 79 20 53 51 4c 20 74 72 61 6e 73 61 63 74  ery SQL transact
10bc0 69 6f 6e 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65  ion..  ** If the
10bd0 20 63 61 6c 6c 62 61 63 6b 20 74 68 72 6f 77 73   callback throws
10be0 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 6f 72   an exception or
10bf0 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72   returns non-zer
10c00 6f 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a  o, then the.  **
10c10 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
10c20 61 62 6f 72 74 65 64 2e 20 20 49 66 20 43 41 4c  aborted.  If CAL
10c30 4c 42 41 43 4b 20 69 73 20 61 6e 20 65 6d 70 74  LBACK is an empt
10c40 79 20 73 74 72 69 6e 67 2c 20 74 68 65 20 63 61  y string, the ca
10c50 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 69 73 20 64  llback.  ** is d
10c60 69 73 61 62 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20  isabled..  */.  
10c70 63 61 73 65 20 44 42 5f 43 4f 4d 4d 49 54 5f 48  case DB_COMMIT_H
10c80 4f 4f 4b 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f  OOK: {.    if( o
10c90 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54  bjc>3 ){.      T
10ca0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
10cb0 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
10cc0 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a   "?CALLBACK?");.
10cd0 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
10ce0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73  _ERROR;.    }els
10cf0 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b  e if( objc==2 ){
10d00 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
10d10 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20  zCommit ){.     
10d20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
10d30 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d  ult(interp, pDb-
10d40 3e 7a 43 6f 6d 6d 69 74 2c 20 28 63 68 61 72 2a  >zCommit, (char*
10d50 29 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  )0);.      }.   
10d60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f   }else{.      co
10d70 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69  nst char *zCommi
10d80 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  t;.      int len
10d90 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  ;.      if( pDb-
10da0 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20  >zCommit ){.    
10db0 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
10dc0 2d 3e 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20  ->zCommit);.    
10dd0 20 20 7d 0a 20 20 20 20 20 20 7a 43 6f 6d 6d 69    }.      zCommi
10de0 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  t = Tcl_GetStrin
10df0 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
10e00 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69  , &len);.      i
10e10 66 28 20 7a 43 6f 6d 6d 69 74 20 26 26 20 6c 65  f( zCommit && le
10e20 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  n>0 ){.        p
10e30 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20 54 63  Db->zCommit = Tc
10e40 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31  l_Alloc( len + 1
10e50 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   );.        memc
10e60 70 79 28 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 2c  py(pDb->zCommit,
10e70 20 7a 43 6f 6d 6d 69 74 2c 20 6c 65 6e 2b 31 29   zCommit, len+1)
10e80 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
10e90 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 43 6f 6d         pDb->zCom
10ea0 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  mit = 0;.      }
10eb0 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
10ec0 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20  zCommit ){.     
10ed0 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d     pDb->interp =
10ee0 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20   interp;.       
10ef0 20 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f   sqlite3_commit_
10f00 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 20 44 62  hook(pDb->db, Db
10f10 43 6f 6d 6d 69 74 48 61 6e 64 6c 65 72 2c 20 70  CommitHandler, p
10f20 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Db);.      }else
10f30 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
10f40 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 70 44  3_commit_hook(pD
10f50 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  b->db, 0, 0);.  
10f60 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
10f70 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
10f80 20 20 20 20 24 64 62 20 63 6f 6d 70 6c 65 74 65      $db complete
10f90 20 53 51 4c 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52   SQL.  **.  ** R
10fa0 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 53 51  eturn TRUE if SQ
10fb0 4c 20 69 73 20 61 20 63 6f 6d 70 6c 65 74 65 20  L is a complete 
10fc0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  SQL statement.  
10fd0 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 0a  Return FALSE if.
10fe0 20 20 2a 2a 20 61 64 64 69 74 69 6f 6e 61 6c 20    ** additional 
10ff0 6c 69 6e 65 73 20 6f 66 20 69 6e 70 75 74 20 61  lines of input a
11000 72 65 20 6e 65 65 64 65 64 2e 20 20 54 68 69 73  re needed.  This
11010 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74   is similar to t
11020 68 65 0a 20 20 2a 2a 20 62 75 69 6c 74 2d 69 6e  he.  ** built-in
11030 20 22 69 6e 66 6f 20 63 6f 6d 70 6c 65 74 65 22   "info complete"
11040 20 63 6f 6d 6d 61 6e 64 20 6f 66 20 54 63 6c 2e   command of Tcl.
11050 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
11060 43 4f 4d 50 4c 45 54 45 3a 20 7b 0a 23 69 66 6e  COMPLETE: {.#ifn
11070 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11080 43 4f 4d 50 4c 45 54 45 0a 20 20 20 20 54 63 6c  COMPLETE.    Tcl
11090 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20  _Obj *pResult;. 
110a0 20 20 20 69 6e 74 20 69 73 43 6f 6d 70 6c 65 74     int isComplet
110b0 65 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  e;.    if( objc!
110c0 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =3 ){.      Tcl_
110d0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
110e0 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53  erp, 2, objv, "S
110f0 51 4c 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  QL");.      retu
11100 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
11110 20 20 7d 0a 20 20 20 20 69 73 43 6f 6d 70 6c 65    }.    isComple
11120 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6d  te = sqlite3_com
11130 70 6c 65 74 65 28 20 54 63 6c 5f 47 65 74 53 74  plete( Tcl_GetSt
11140 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
11150 5b 32 5d 2c 20 30 29 20 29 3b 0a 20 20 20 20 70  [2], 0) );.    p
11160 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74  Result = Tcl_Get
11170 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
11180 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 42 6f  );.    Tcl_SetBo
11190 6f 6c 65 61 6e 4f 62 6a 28 70 52 65 73 75 6c 74  oleanObj(pResult
111a0 2c 20 69 73 43 6f 6d 70 6c 65 74 65 29 3b 0a 23  , isComplete);.#
111b0 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b  endif.    break;
111c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64  .  }..  /*    $d
111d0 62 20 63 6f 70 79 20 63 6f 6e 66 6c 69 63 74 2d  b copy conflict-
111e0 61 6c 67 6f 72 69 74 68 6d 20 74 61 62 6c 65 20  algorithm table 
111f0 66 69 6c 65 6e 61 6d 65 20 3f 53 45 50 41 52 41  filename ?SEPARA
11200 54 4f 52 3f 20 3f 4e 55 4c 4c 49 4e 44 49 43 41  TOR? ?NULLINDICA
11210 54 4f 52 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43  TOR?.  **.  ** C
11220 6f 70 79 20 64 61 74 61 20 69 6e 74 6f 20 74 61  opy data into ta
11230 62 6c 65 20 66 72 6f 6d 20 66 69 6c 65 6e 61 6d  ble from filenam
11240 65 2c 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 75 73  e, optionally us
11250 69 6e 67 20 53 45 50 41 52 41 54 4f 52 0a 20 20  ing SEPARATOR.  
11260 2a 2a 20 61 73 20 63 6f 6c 75 6d 6e 20 73 65 70  ** as column sep
11270 61 72 61 74 6f 72 73 2e 20 20 49 66 20 61 20 63  arators.  If a c
11280 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61  olumn contains a
11290 20 6e 75 6c 6c 20 73 74 72 69 6e 67 2c 20 6f 72   null string, or
112a0 20 74 68 65 0a 20 20 2a 2a 20 76 61 6c 75 65 20   the.  ** value 
112b0 6f 66 20 4e 55 4c 4c 49 4e 44 49 43 41 54 4f 52  of NULLINDICATOR
112c0 2c 20 61 20 4e 55 4c 4c 20 69 73 20 69 6e 73 65  , a NULL is inse
112d0 72 74 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6c  rted for the col
112e0 75 6d 6e 2e 0a 20 20 2a 2a 20 63 6f 6e 66 6c 69  umn..  ** confli
112f0 63 74 2d 61 6c 67 6f 72 69 74 68 6d 20 69 73 20  ct-algorithm is 
11300 6f 6e 65 20 6f 66 20 74 68 65 20 73 71 6c 69 74  one of the sqlit
11310 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c 67 6f 72  e conflict algor
11320 69 74 68 6d 73 3a 0a 20 20 2a 2a 20 20 20 20 72  ithms:.  **    r
11330 6f 6c 6c 62 61 63 6b 2c 20 61 62 6f 72 74 2c 20  ollback, abort, 
11340 66 61 69 6c 2c 20 69 67 6e 6f 72 65 2c 20 72 65  fail, ignore, re
11350 70 6c 61 63 65 0a 20 20 2a 2a 20 4f 6e 20 73 75  place.  ** On su
11360 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20 74 68  ccess, return th
11370 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 69 6e 65  e number of line
11380 73 20 70 72 6f 63 65 73 73 65 64 2c 20 6e 6f 74  s processed, not
11390 20 6e 65 63 65 73 73 61 72 69 6c 79 20 73 61 6d   necessarily sam
113a0 65 0a 20 20 2a 2a 20 61 73 20 27 64 62 20 63 68  e.  ** as 'db ch
113b0 61 6e 67 65 73 27 20 64 75 65 20 74 6f 20 63 6f  anges' due to co
113c0 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d  nflict-algorithm
113d0 20 73 65 6c 65 63 74 65 64 2e 0a 20 20 2a 2a 0a   selected..  **.
113e0 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 69    ** This code i
113f0 73 20 62 61 73 69 63 61 6c 6c 79 20 61 6e 20 69  s basically an i
11400 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2f 65 6e  mplementation/en
11410 68 61 6e 63 65 6d 65 6e 74 20 6f 66 0a 20 20 2a  hancement of.  *
11420 2a 20 74 68 65 20 73 71 6c 69 74 65 33 20 73 68  * the sqlite3 sh
11430 65 6c 6c 2e 63 20 22 2e 69 6d 70 6f 72 74 22 20  ell.c ".import" 
11440 63 6f 6d 6d 61 6e 64 2e 0a 20 20 2a 2a 0a 20 20  command..  **.  
11450 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ** This command 
11460 75 73 61 67 65 20 69 73 20 65 71 75 69 76 61 6c  usage is equival
11470 65 6e 74 20 74 6f 20 74 68 65 20 73 71 6c 69 74  ent to the sqlit
11480 65 32 2e 78 20 43 4f 50 59 20 73 74 61 74 65 6d  e2.x COPY statem
11490 65 6e 74 2c 0a 20 20 2a 2a 20 77 68 69 63 68 20  ent,.  ** which 
114a0 69 6d 70 6f 72 74 73 20 66 69 6c 65 20 64 61 74  imports file dat
114b0 61 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 75  a into a table u
114c0 73 69 6e 67 20 74 68 65 20 50 6f 73 74 67 72 65  sing the Postgre
114d0 53 51 4c 20 43 4f 50 59 20 66 69 6c 65 20 66 6f  SQL COPY file fo
114e0 72 6d 61 74 3a 0a 20 20 2a 2a 20 20 20 24 64 62  rmat:.  **   $db
114f0 20 63 6f 70 79 20 24 63 6f 6e 66 6c 69 74 5f 61   copy $conflit_a
11500 6c 67 6f 20 24 74 61 62 6c 65 5f 6e 61 6d 65 20  lgo $table_name 
11510 24 66 69 6c 65 6e 61 6d 65 20 5c 74 20 5c 5c 4e  $filename \t \\N
11520 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
11530 43 4f 50 59 3a 20 7b 0a 20 20 20 20 63 68 61 72  COPY: {.    char
11540 20 2a 7a 54 61 62 6c 65 3b 20 20 20 20 20 20 20   *zTable;       
11550 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72          /* Inser
11560 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68 69 73  t data into this
11570 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 63 68   table */.    ch
11580 61 72 20 2a 7a 46 69 6c 65 3b 20 20 20 20 20 20  ar *zFile;      
11590 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
115a0 20 66 69 6c 65 20 66 72 6f 6d 20 77 68 69 63 68   file from which
115b0 20 74 6f 20 65 78 74 72 61 63 74 20 64 61 74 61   to extract data
115c0 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 43   */.    char *zC
115d0 6f 6e 66 6c 69 63 74 3b 20 20 20 20 20 20 20 20  onflict;        
115e0 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 66 6c      /* The confl
115f0 69 63 74 20 61 6c 67 6f 72 69 74 68 6d 20 74 6f  ict algorithm to
11600 20 75 73 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69   use */.    sqli
11610 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
11620 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 74 61          /* A sta
11630 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e  tement */.    in
11640 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t nCol;         
11650 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
11660 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
11670 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  n the table */. 
11680 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20     int nByte;   
11690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
116a0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
116b0 73 20 69 6e 20 61 6e 20 53 51 4c 20 73 74 72 69  s in an SQL stri
116c0 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c  ng */.    int i,
116d0 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
116e0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
116f0 75 6e 74 65 72 73 20 2a 2f 0a 20 20 20 20 69 6e  unters */.    in
11700 74 20 6e 53 65 70 3b 20 20 20 20 20 20 20 20 20  t nSep;         
11710 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
11720 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
11730 7a 53 65 70 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e  zSep[] */.    in
11740 74 20 6e 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20  t nNull;        
11750 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
11760 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
11770 7a 4e 75 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 63  zNull[] */.    c
11780 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20  har *zSql;      
11790 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
117a0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a   SQL statement *
117b0 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4c 69 6e  /.    char *zLin
117c0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
117d0 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c 69    /* A single li
117e0 6e 65 20 6f 66 20 69 6e 70 75 74 20 66 72 6f 6d  ne of input from
117f0 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20   the file */.   
11800 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 3b 20 20   char **azCol;  
11810 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11820 7a 4c 69 6e 65 5b 5d 20 62 72 6f 6b 65 6e 20 75  zLine[] broken u
11830 70 20 69 6e 74 6f 20 63 6f 6c 75 6d 6e 73 20 2a  p into columns *
11840 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  /.    const char
11850 20 2a 7a 43 6f 6d 6d 69 74 3b 20 20 20 20 20 20   *zCommit;      
11860 20 20 2f 2a 20 48 6f 77 20 74 6f 20 63 6f 6d 6d    /* How to comm
11870 69 74 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20  it changes */.  
11880 20 20 46 49 4c 45 20 2a 69 6e 3b 20 20 20 20 20    FILE *in;     
11890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
118a0 20 54 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20   The input file 
118b0 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 69 6e 65 6e  */.    int linen
118c0 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  o = 0;          
118d0 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65     /* Line numbe
118e0 72 20 6f 66 20 69 6e 70 75 74 20 66 69 6c 65 20  r of input file 
118f0 2a 2f 0a 20 20 20 20 63 68 61 72 20 7a 4c 69 6e  */.    char zLin
11900 65 4e 75 6d 5b 38 30 5d 3b 20 20 20 20 20 20 20  eNum[80];       
11910 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65     /* Line numbe
11920 72 20 70 72 69 6e 74 20 62 75 66 66 65 72 20 2a  r print buffer *
11930 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  /.    Tcl_Obj *p
11940 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20  Result;         
11950 20 20 2f 2a 20 69 6e 74 65 72 70 20 72 65 73 75    /* interp resu
11960 6c 74 20 2a 2f 0a 0a 20 20 20 20 63 6f 6e 73 74  lt */..    const
11970 20 63 68 61 72 20 2a 7a 53 65 70 3b 0a 20 20 20   char *zSep;.   
11980 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 75   const char *zNu
11990 6c 6c 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  ll;.    if( objc
119a0 3c 35 20 7c 7c 20 6f 62 6a 63 3e 37 20 29 7b 0a  <5 || objc>7 ){.
119b0 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
119c0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
119d0 2c 20 6f 62 6a 76 2c 0a 20 20 20 20 20 20 20 20  , objv,.        
119e0 20 22 43 4f 4e 46 4c 49 43 54 2d 41 4c 47 4f 52   "CONFLICT-ALGOR
119f0 49 54 48 4d 20 54 41 42 4c 45 20 46 49 4c 45 4e  ITHM TABLE FILEN
11a00 41 4d 45 20 3f 53 45 50 41 52 41 54 4f 52 3f 20  AME ?SEPARATOR? 
11a10 3f 4e 55 4c 4c 49 4e 44 49 43 41 54 4f 52 3f 22  ?NULLINDICATOR?"
11a20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
11a30 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
11a40 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 3d 36  .    if( objc>=6
11a50 20 29 7b 0a 20 20 20 20 20 20 7a 53 65 70 20 3d   ){.      zSep =
11a60 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
11a70 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 35 5d 2c 20 30  omObj(objv[5], 0
11a80 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
11a90 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 74 22 3b      zSep = "\t";
11aa0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f  .    }.    if( o
11ab0 62 6a 63 3e 3d 37 20 29 7b 0a 20 20 20 20 20 20  bjc>=7 ){.      
11ac0 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f 47 65 74 53  zNull = Tcl_GetS
11ad0 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
11ae0 76 5b 36 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 65  v[6], 0);.    }e
11af0 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4e 75 6c 6c  lse{.      zNull
11b00 20 3d 20 22 22 3b 0a 20 20 20 20 7d 0a 20 20 20   = "";.    }.   
11b10 20 7a 43 6f 6e 66 6c 69 63 74 20 3d 20 54 63 6c   zConflict = Tcl
11b20 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
11b30 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20  j(objv[2], 0);. 
11b40 20 20 20 7a 54 61 62 6c 65 20 3d 20 54 63 6c 5f     zTable = Tcl_
11b50 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
11b60 28 6f 62 6a 76 5b 33 5d 2c 20 30 29 3b 0a 20 20  (objv[3], 0);.  
11b70 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65    zFile = Tcl_Ge
11b80 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
11b90 62 6a 76 5b 34 5d 2c 20 30 29 3b 0a 20 20 20 20  bjv[4], 0);.    
11ba0 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e 33 30 28  nSep = strlen30(
11bb0 7a 53 65 70 29 3b 0a 20 20 20 20 6e 4e 75 6c 6c  zSep);.    nNull
11bc0 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 4e 75 6c   = strlen30(zNul
11bd0 6c 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 65 70  l);.    if( nSep
11be0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  ==0 ){.      Tcl
11bf0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
11c00 74 65 72 70 2c 22 45 72 72 6f 72 3a 20 6e 6f 6e  terp,"Error: non
11c10 2d 6e 75 6c 6c 20 73 65 70 61 72 61 74 6f 72 20  -null separator 
11c20 72 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f 70  required for cop
11c30 79 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  y",.            
11c40 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
11c50 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  *)0);.      retu
11c60 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
11c70 20 20 7d 0a 20 20 20 20 69 66 28 73 74 72 63 6d    }.    if(strcm
11c80 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 72 6f  p(zConflict, "ro
11c90 6c 6c 62 61 63 6b 22 29 20 21 3d 20 30 20 26 26  llback") != 0 &&
11ca0 0a 20 20 20 20 20 20 20 73 74 72 63 6d 70 28 7a  .       strcmp(z
11cb0 43 6f 6e 66 6c 69 63 74 2c 20 22 61 62 6f 72 74  Conflict, "abort
11cc0 22 20 20 20 29 20 21 3d 20 30 20 26 26 0a 20 20  "   ) != 0 &&.  
11cd0 20 20 20 20 20 73 74 72 63 6d 70 28 7a 43 6f 6e       strcmp(zCon
11ce0 66 6c 69 63 74 2c 20 22 66 61 69 6c 22 20 20 20  flict, "fail"   
11cf0 20 29 20 21 3d 20 30 20 26 26 0a 20 20 20 20 20   ) != 0 &&.     
11d00 20 20 73 74 72 63 6d 70 28 7a 43 6f 6e 66 6c 69    strcmp(zConfli
11d10 63 74 2c 20 22 69 67 6e 6f 72 65 22 20 20 29 20  ct, "ignore"  ) 
11d20 21 3d 20 30 20 26 26 0a 20 20 20 20 20 20 20 73  != 0 &&.       s
11d30 74 72 63 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c  trcmp(zConflict,
11d40 20 22 72 65 70 6c 61 63 65 22 20 29 20 21 3d 20   "replace" ) != 
11d50 30 20 29 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f  0 ) {.      Tcl_
11d60 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
11d70 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 5c 22 22  erp, "Error: \""
11d80 2c 20 7a 43 6f 6e 66 6c 69 63 74 2c 0a 20 20 20  , zConflict,.   
11d90 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 63 6f           "\", co
11da0 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d  nflict-algorithm
11db0 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 3a   must be one of:
11dc0 20 72 6f 6c 6c 62 61 63 6b 2c 20 22 0a 20 20 20   rollback, ".   
11dd0 20 20 20 20 20 20 20 20 20 22 61 62 6f 72 74 2c           "abort,
11de0 20 66 61 69 6c 2c 20 69 67 6e 6f 72 65 2c 20 6f   fail, ignore, o
11df0 72 20 72 65 70 6c 61 63 65 22 2c 20 28 63 68 61  r replace", (cha
11e00 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 65 74  r*)0);.      ret
11e10 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
11e20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d 20     }.    zSql = 
11e30 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
11e40 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 27  "SELECT * FROM '
11e50 25 71 27 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20  %q'", zTable);. 
11e60 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29     if( zSql==0 )
11e70 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
11e80 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
11e90 20 22 45 72 72 6f 72 3a 20 6e 6f 20 73 75 63 68   "Error: no such
11ea0 20 74 61 62 6c 65 3a 20 22 2c 20 7a 54 61 62 6c   table: ", zTabl
11eb0 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  e, (char*)0);.  
11ec0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
11ed0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
11ee0 6e 42 79 74 65 20 3d 20 73 74 72 6c 65 6e 33 30  nByte = strlen30
11ef0 28 7a 53 71 6c 29 3b 0a 20 20 20 20 72 63 20 3d  (zSql);.    rc =
11f00 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
11f10 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  (pDb->db, zSql, 
11f20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
11f30 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
11f40 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20  (zSql);.    if( 
11f50 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  rc ){.      Tcl_
11f60 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
11f70 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 22 2c 20  erp, "Error: ", 
11f80 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
11f90 44 62 2d 3e 64 62 29 2c 20 28 63 68 61 72 2a 29  Db->db), (char*)
11fa0 30 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 20 3d  0);.      nCol =
11fb0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
11fc0 20 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69       nCol = sqli
11fd0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  te3_column_count
11fe0 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20  (pStmt);.    }. 
11ff0 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
12000 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
12010 69 66 28 20 6e 43 6f 6c 3d 3d 30 20 29 20 7b 0a  if( nCol==0 ) {.
12020 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
12030 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
12040 20 20 7a 53 71 6c 20 3d 20 6d 61 6c 6c 6f 63 28    zSql = malloc(
12050 20 6e 42 79 74 65 20 2b 20 35 30 20 2b 20 6e 43   nByte + 50 + nC
12060 6f 6c 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20  ol*2 );.    if( 
12070 7a 53 71 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20  zSql==0 ) {.    
12080 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
12090 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f  lt(interp, "Erro
120a0 72 3a 20 63 61 6e 27 74 20 6d 61 6c 6c 6f 63 28  r: can't malloc(
120b0 29 22 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  )", (char*)0);. 
120c0 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
120d0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
120e0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
120f0 66 28 6e 42 79 74 65 2b 35 30 2c 20 7a 53 71 6c  f(nByte+50, zSql
12100 2c 20 22 49 4e 53 45 52 54 20 4f 52 20 25 71 20  , "INSERT OR %q 
12110 49 4e 54 4f 20 27 25 71 27 20 56 41 4c 55 45 53  INTO '%q' VALUES
12120 28 3f 22 2c 0a 20 20 20 20 20 20 20 20 20 7a 43  (?",.         zC
12130 6f 6e 66 6c 69 63 74 2c 20 7a 54 61 62 6c 65 29  onflict, zTable)
12140 3b 0a 20 20 20 20 6a 20 3d 20 73 74 72 6c 65 6e  ;.    j = strlen
12150 33 30 28 7a 53 71 6c 29 3b 0a 20 20 20 20 66 6f  30(zSql);.    fo
12160 72 28 69 3d 31 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=1; i<nCol; i
12170 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c 5b  ++){.      zSql[
12180 6a 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20  j++] = ',';.    
12190 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 3f    zSql[j++] = '?
121a0 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71  ';.    }.    zSq
121b0 6c 5b 6a 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20  l[j++] = ')';.  
121c0 20 20 7a 53 71 6c 5b 6a 5d 20 3d 20 30 3b 0a 20    zSql[j] = 0;. 
121d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
121e0 70 72 65 70 61 72 65 28 70 44 62 2d 3e 64 62 2c  prepare(pDb->db,
121f0 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
12200 74 2c 20 30 29 3b 0a 20 20 20 20 66 72 65 65 28  t, 0);.    free(
12210 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 72  zSql);.    if( r
12220 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  c ){.      Tcl_A
12230 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
12240 72 70 2c 20 22 45 72 72 6f 72 3a 20 22 2c 20 73  rp, "Error: ", s
12250 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44  qlite3_errmsg(pD
12260 62 2d 3e 64 62 29 2c 20 28 63 68 61 72 2a 29 30  b->db), (char*)0
12270 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
12280 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
12290 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
122a0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
122b0 20 20 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a      in = fopen(z
122c0 46 69 6c 65 2c 20 22 72 62 22 29 3b 0a 20 20 20  File, "rb");.   
122d0 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20   if( in==0 ){.  
122e0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
122f0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72  sult(interp, "Er
12300 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e  ror: cannot open
12310 20 66 69 6c 65 3a 20 22 2c 20 7a 46 69 6c 65 2c   file: ", zFile,
12320 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
12330 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
12340 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ze(pStmt);.     
12350 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
12360 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 7a 43  R;.    }.    azC
12370 6f 6c 20 3d 20 6d 61 6c 6c 6f 63 28 20 73 69 7a  ol = malloc( siz
12380 65 6f 66 28 61 7a 43 6f 6c 5b 30 5d 29 2a 28 6e  eof(azCol[0])*(n
12390 43 6f 6c 2b 31 29 20 29 3b 0a 20 20 20 20 69 66  Col+1) );.    if
123a0 28 20 61 7a 43 6f 6c 3d 3d 30 20 29 20 7b 0a 20  ( azCol==0 ) {. 
123b0 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
123c0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45  esult(interp, "E
123d0 72 72 6f 72 3a 20 63 61 6e 27 74 20 6d 61 6c 6c  rror: can't mall
123e0 6f 63 28 29 22 2c 20 28 63 68 61 72 2a 29 30 29  oc()", (char*)0)
123f0 3b 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28 69  ;.      fclose(i
12400 6e 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  n);.      return
12410 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
12420 7d 0a 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69  }.    (void)sqli
12430 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62  te3_exec(pDb->db
12440 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 2c  , "BEGIN", 0, 0,
12450 20 30 29 3b 0a 20 20 20 20 7a 43 6f 6d 6d 69 74   0);.    zCommit
12460 20 3d 20 22 43 4f 4d 4d 49 54 22 3b 0a 20 20 20   = "COMMIT";.   
12470 20 77 68 69 6c 65 28 20 28 7a 4c 69 6e 65 20 3d   while( (zLine =
12480 20 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28 30   local_getline(0
12490 2c 20 69 6e 29 29 21 3d 30 20 29 7b 0a 20 20 20  , in))!=0 ){.   
124a0 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20     char *z;.    
124b0 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20    lineno++;.    
124c0 20 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20 7a 4c 69    azCol[0] = zLi
124d0 6e 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ne;.      for(i=
124e0 30 2c 20 7a 3d 7a 4c 69 6e 65 3b 20 2a 7a 3b 20  0, z=zLine; *z; 
124f0 7a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  z++){.        if
12500 28 20 2a 7a 3d 3d 7a 53 65 70 5b 30 5d 20 26 26  ( *z==zSep[0] &&
12510 20 73 74 72 6e 63 6d 70 28 7a 2c 20 7a 53 65 70   strncmp(z, zSep
12520 2c 20 6e 53 65 70 29 3d 3d 30 20 29 7b 0a 20 20  , nSep)==0 ){.  
12530 20 20 20 20 20 20 20 20 2a 7a 20 3d 20 30 3b 0a          *z = 0;.
12540 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20            i++;. 
12550 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e           if( i<n
12560 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Col ){.         
12570 20 20 20 61 7a 43 6f 6c 5b 69 5d 20 3d 20 26 7a     azCol[i] = &z
12580 5b 6e 53 65 70 5d 3b 0a 20 20 20 20 20 20 20 20  [nSep];.        
12590 20 20 20 20 7a 20 2b 3d 20 6e 53 65 70 2d 31 3b      z += nSep-1;
125a0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
125b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
125c0 20 20 20 20 20 69 66 28 20 69 2b 31 21 3d 6e 43       if( i+1!=nC
125d0 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  ol ){.        ch
125e0 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20 20 20  ar *zErr;.      
125f0 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 73 74 72    int nErr = str
12600 6c 65 6e 33 30 28 7a 46 69 6c 65 29 20 2b 20 32  len30(zFile) + 2
12610 30 30 3b 0a 20 20 20 20 20 20 20 20 7a 45 72 72  00;.        zErr
12620 20 3d 20 6d 61 6c 6c 6f 63 28 6e 45 72 72 29 3b   = malloc(nErr);
12630 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 45 72  .        if( zEr
12640 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  r ){.          s
12650 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
12660 6e 45 72 72 2c 20 7a 45 72 72 2c 0a 20 20 20 20  nErr, zErr,.    
12670 20 20 20 20 20 20 20 20 20 22 45 72 72 6f 72 3a           "Error:
12680 20 25 73 20 6c 69 6e 65 20 25 64 3a 20 65 78 70   %s line %d: exp
12690 65 63 74 65 64 20 25 64 20 63 6f 6c 75 6d 6e 73  ected %d columns
126a0 20 6f 66 20 64 61 74 61 20 62 75 74 20 66 6f 75   of data but fou
126b0 6e 64 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20  nd %d",.        
126c0 20 20 20 20 20 7a 46 69 6c 65 2c 20 6c 69 6e 65       zFile, line
126d0 6e 6f 2c 20 6e 43 6f 6c 2c 20 69 2b 31 29 3b 0a  no, nCol, i+1);.
126e0 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70            Tcl_Ap
126f0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
12700 70 2c 20 7a 45 72 72 2c 20 28 63 68 61 72 2a 29  p, zErr, (char*)
12710 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 72  0);.          fr
12720 65 65 28 7a 45 72 72 29 3b 0a 20 20 20 20 20 20  ee(zErr);.      
12730 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 43 6f 6d    }.        zCom
12740 6d 69 74 20 3d 20 22 52 4f 4c 4c 42 41 43 4b 22  mit = "ROLLBACK"
12750 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
12760 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
12770 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
12780 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  i++){.        /*
12790 20 63 68 65 63 6b 20 66 6f 72 20 6e 75 6c 6c 20   check for null 
127a0 64 61 74 61 2c 20 69 66 20 73 6f 2c 20 62 69 6e  data, if so, bin
127b0 64 20 61 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20  d as null */.   
127c0 20 20 20 20 20 69 66 28 20 28 6e 4e 75 6c 6c 3e       if( (nNull>
127d0 30 20 26 26 20 73 74 72 63 6d 70 28 61 7a 43 6f  0 && strcmp(azCo
127e0 6c 5b 69 5d 2c 20 7a 4e 75 6c 6c 29 3d 3d 30 29  l[i], zNull)==0)
127f0 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 74  .          || st
12800 72 6c 65 6e 33 30 28 61 7a 43 6f 6c 5b 69 5d 29  rlen30(azCol[i])
12810 3d 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  ==0.        ){. 
12820 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
12830 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74  _bind_null(pStmt
12840 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  , i+1);.        
12850 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
12860 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
12870 78 74 28 70 53 74 6d 74 2c 20 69 2b 31 2c 20 61  xt(pStmt, i+1, a
12880 7a 43 6f 6c 5b 69 5d 2c 20 2d 31 2c 20 53 51 4c  zCol[i], -1, SQL
12890 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
128a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
128b0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65       sqlite3_ste
128c0 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  p(pStmt);.      
128d0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  rc = sqlite3_res
128e0 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  et(pStmt);.     
128f0 20 66 72 65 65 28 7a 4c 69 6e 65 29 3b 0a 20 20   free(zLine);.  
12900 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
12910 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
12920 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
12930 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 3a  t(interp,"Error:
12940 20 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d   ", sqlite3_errm
12950 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 28 63 68  sg(pDb->db), (ch
12960 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 20 20  ar*)0);.        
12970 7a 43 6f 6d 6d 69 74 20 3d 20 22 52 4f 4c 4c 42  zCommit = "ROLLB
12980 41 43 4b 22 3b 0a 20 20 20 20 20 20 20 20 62 72  ACK";.        br
12990 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
129a0 20 7d 0a 20 20 20 20 66 72 65 65 28 61 7a 43 6f   }.    free(azCo
129b0 6c 29 3b 0a 20 20 20 20 66 63 6c 6f 73 65 28 69  l);.    fclose(i
129c0 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  n);.    sqlite3_
129d0 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
129e0 0a 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74  .    (void)sqlit
129f0 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62 2c  e3_exec(pDb->db,
12a00 20 7a 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 2c 20   zCommit, 0, 0, 
12a10 30 29 3b 0a 0a 20 20 20 20 69 66 28 20 7a 43 6f  0);..    if( zCo
12a20 6d 6d 69 74 5b 30 5d 20 3d 3d 20 27 43 27 20 29  mmit[0] == 'C' )
12a30 7b 0a 20 20 20 20 20 20 2f 2a 20 73 75 63 63 65  {.      /* succe
12a40 73 73 2c 20 73 65 74 20 72 65 73 75 6c 74 20 61  ss, set result a
12a50 73 20 6e 75 6d 62 65 72 20 6f 66 20 6c 69 6e 65  s number of line
12a60 73 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20  s processed */. 
12a70 20 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54       pResult = T
12a80 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_GetObjResult(
12a90 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 20 20 54  interp);.      T
12aa0 63 6c 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52 65  cl_SetIntObj(pRe
12ab0 73 75 6c 74 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20  sult, lineno);. 
12ac0 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b       rc = TCL_OK
12ad0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
12ae0 20 20 20 2f 2a 20 66 61 69 6c 75 72 65 2c 20 61     /* failure, a
12af0 70 70 65 6e 64 20 6c 69 6e 65 6e 6f 20 77 68 65  ppend lineno whe
12b00 72 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20  re failed */.   
12b10 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
12b20 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c 69 6e 65  ntf(sizeof(zLine
12b30 4e 75 6d 29 2c 20 7a 4c 69 6e 65 4e 75 6d 2c 22  Num), zLineNum,"
12b40 25 64 22 2c 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20  %d",lineno);.   
12b50 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
12b60 75 6c 74 28 69 6e 74 65 72 70 2c 22 2c 20 66 61  ult(interp,", fa
12b70 69 6c 65 64 20 77 68 69 6c 65 20 70 72 6f 63 65  iled while proce
12b80 73 73 69 6e 67 20 6c 69 6e 65 3a 20 22 2c 7a 4c  ssing line: ",zL
12b90 69 6e 65 4e 75 6d 2c 0a 20 20 20 20 20 20 20 20  ineNum,.        
12ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
12bb0 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
12bc0 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  rc = TCL_ERROR;.
12bd0 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
12be0 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
12bf0 20 20 20 24 64 62 20 65 6e 61 62 6c 65 5f 6c 6f     $db enable_lo
12c00 61 64 5f 65 78 74 65 6e 73 69 6f 6e 20 42 4f 4f  ad_extension BOO
12c10 4c 45 41 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  LEAN.  **.  ** T
12c20 75 72 6e 20 74 68 65 20 65 78 74 65 6e 73 69 6f  urn the extensio
12c30 6e 20 6c 6f 61 64 69 6e 67 20 66 65 61 74 75 72  n loading featur
12c40 65 20 6f 6e 20 6f 72 20 6f 66 66 2e 20 20 49 74  e on or off.  It
12c50 20 69 66 20 6f 66 66 20 62 79 0a 20 20 2a 2a 20   if off by.  ** 
12c60 64 65 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20  default..  */.  
12c70 63 61 73 65 20 44 42 5f 45 4e 41 42 4c 45 5f 4c  case DB_ENABLE_L
12c80 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 3a 20 7b  OAD_EXTENSION: {
12c90 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12ca0 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
12cb0 49 4f 4e 0a 20 20 20 20 69 6e 74 20 6f 6e 6f 66  ION.    int onof
12cc0 66 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  f;.    if( objc!
12cd0 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =3 ){.      Tcl_
12ce0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
12cf0 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 42  erp, 2, objv, "B
12d00 4f 4f 4c 45 41 4e 22 29 3b 0a 20 20 20 20 20 20  OOLEAN");.      
12d10 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
12d20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
12d30 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
12d40 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
12d50 6a 76 5b 32 5d 2c 20 26 6f 6e 6f 66 66 29 20 29  jv[2], &onoff) )
12d60 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  {.      return T
12d70 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
12d80 20 20 20 20 73 71 6c 69 74 65 33 5f 65 6e 61 62      sqlite3_enab
12d90 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f  le_load_extensio
12da0 6e 28 70 44 62 2d 3e 64 62 2c 20 6f 6e 6f 66 66  n(pDb->db, onoff
12db0 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 23 65  );.    break;.#e
12dc0 6c 73 65 0a 20 20 20 20 54 63 6c 5f 41 70 70 65  lse.    Tcl_Appe
12dd0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
12de0 20 22 65 78 74 65 6e 73 69 6f 6e 20 6c 6f 61 64   "extension load
12df0 69 6e 67 20 69 73 20 74 75 72 6e 65 64 20 6f 66  ing is turned of
12e00 66 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  f at compile-tim
12e10 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e",.            
12e20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
12e30 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
12e40 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6e 64 69 66  CL_ERROR;.#endif
12e50 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
12e60 20 20 20 24 64 62 20 65 72 72 6f 72 63 6f 64 65     $db errorcode
12e70 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72  .  **.  ** Retur
12e80 6e 20 74 68 65 20 6e 75 6d 65 72 69 63 20 65 72  n the numeric er
12e90 72 6f 72 20 63 6f 64 65 20 74 68 61 74 20 77 61  ror code that wa
12ea0 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  s returned by th
12eb0 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 20 20  e most recent.  
12ec0 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  ** call to sqlit
12ed0 65 33 5f 65 78 65 63 28 29 2e 0a 20 20 2a 2f 0a  e3_exec()..  */.
12ee0 20 20 63 61 73 65 20 44 42 5f 45 52 52 4f 52 43    case DB_ERRORC
12ef0 4f 44 45 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 53  ODE: {.    Tcl_S
12f00 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
12f10 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
12f20 6a 28 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  j(sqlite3_errcod
12f30 65 28 70 44 62 2d 3e 64 62 29 29 29 3b 0a 20 20  e(pDb->db)));.  
12f40 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
12f50 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 65  /*.  **    $db e
12f60 78 69 73 74 73 20 24 73 71 6c 0a 20 20 2a 2a 20  xists $sql.  ** 
12f70 20 20 20 24 64 62 20 6f 6e 65 63 6f 6c 75 6d 6e     $db onecolumn
12f80 20 24 73 71 6c 0a 20 20 2a 2a 0a 20 20 2a 2a 20   $sql.  **.  ** 
12f90 54 68 65 20 6f 6e 65 63 6f 6c 75 6d 6e 20 6d 65  The onecolumn me
12fa0 74 68 6f 64 20 69 73 20 74 68 65 20 65 71 75 69  thod is the equi
12fb0 76 61 6c 65 6e 74 20 6f 66 3a 0a 20 20 2a 2a 20  valent of:.  ** 
12fc0 20 20 20 20 6c 69 6e 64 65 78 20 5b 24 64 62 20      lindex [$db 
12fd0 65 76 61 6c 20 24 73 71 6c 5d 20 30 0a 20 20 2a  eval $sql] 0.  *
12fe0 2f 0a 20 20 63 61 73 65 20 44 42 5f 45 58 49 53  /.  case DB_EXIS
12ff0 54 53 3a 0a 20 20 63 61 73 65 20 44 42 5f 4f 4e  TS:.  case DB_ON
13000 45 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 54  ECOLUMN: {.    T
13010 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 20  cl_Obj *pResult 
13020 3d 20 30 3b 0a 20 20 20 20 44 62 45 76 61 6c 43  = 0;.    DbEvalC
13030 6f 6e 74 65 78 74 20 73 45 76 61 6c 3b 0a 20 20  ontext sEval;.  
13040 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
13050 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
13060 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
13070 32 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 22 29 3b  2, objv, "SQL");
13080 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
13090 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
130a0 20 20 20 20 64 62 45 76 61 6c 49 6e 69 74 28 26      dbEvalInit(&
130b0 73 45 76 61 6c 2c 20 70 44 62 2c 20 6f 62 6a 76  sEval, pDb, objv
130c0 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20 72 63 20  [2], 0);.    rc 
130d0 3d 20 64 62 45 76 61 6c 53 74 65 70 28 26 73 45  = dbEvalStep(&sE
130e0 76 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 63 68  val);.    if( ch
130f0 6f 69 63 65 3d 3d 44 42 5f 4f 4e 45 43 4f 4c 55  oice==DB_ONECOLU
13100 4d 4e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  MN ){.      if( 
13110 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20  rc==TCL_OK ){.  
13120 20 20 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20        pResult = 
13130 64 62 45 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75  dbEvalColumnValu
13140 65 28 26 73 45 76 61 6c 2c 20 30 29 3b 0a 20 20  e(&sEval, 0);.  
13150 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
13160 3d 3d 54 43 4c 5f 42 52 45 41 4b 20 29 7b 0a 20  ==TCL_BREAK ){. 
13170 20 20 20 20 20 20 20 54 63 6c 5f 52 65 73 65 74         Tcl_Reset
13180 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
13190 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
131a0 65 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 42 52  e if( rc==TCL_BR
131b0 45 41 4b 20 7c 7c 20 72 63 3d 3d 54 43 4c 5f 4f  EAK || rc==TCL_O
131c0 4b 20 29 7b 0a 20 20 20 20 20 20 70 52 65 73 75  K ){.      pResu
131d0 6c 74 20 3d 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c  lt = Tcl_NewBool
131e0 65 61 6e 4f 62 6a 28 72 63 3d 3d 54 43 4c 5f 4f  eanObj(rc==TCL_O
131f0 4b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62  K);.    }.    db
13200 45 76 61 6c 46 69 6e 61 6c 69 7a 65 28 26 73 45  EvalFinalize(&sE
13210 76 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 70 52  val);.    if( pR
13220 65 73 75 6c 74 20 29 20 54 63 6c 5f 53 65 74 4f  esult ) Tcl_SetO
13230 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
13240 20 70 52 65 73 75 6c 74 29 3b 0a 0a 20 20 20 20   pResult);..    
13250 69 66 28 20 72 63 3d 3d 54 43 4c 5f 42 52 45 41  if( rc==TCL_BREA
13260 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
13270 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  TCL_OK;.    }.  
13280 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
13290 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 65  /*.  **    $db e
132a0 76 61 6c 20 24 73 71 6c 20 3f 61 72 72 61 79 3f  val $sql ?array?
132b0 20 3f 7b 20 20 2e 2e 2e 63 6f 64 65 2e 2e 2e 20   ?{  ...code... 
132c0 7d 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  }?.  **.  ** The
132d0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69   SQL statement i
132e0 6e 20 24 73 71 6c 20 69 73 20 65 76 61 6c 75 61  n $sql is evalua
132f0 74 65 64 2e 20 20 46 6f 72 20 65 61 63 68 20 72  ted.  For each r
13300 6f 77 2c 20 74 68 65 20 76 61 6c 75 65 73 20 61  ow, the values a
13310 72 65 0a 20 20 2a 2a 20 70 6c 61 63 65 64 20 69  re.  ** placed i
13320 6e 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  n elements of th
13330 65 20 61 72 72 61 79 20 6e 61 6d 65 64 20 22 61  e array named "a
13340 72 72 61 79 22 20 61 6e 64 20 2e 2e 2e 63 6f 64  rray" and ...cod
13350 65 2e 2e 2e 20 69 73 20 65 78 65 63 75 74 65 64  e... is executed
13360 2e 0a 20 20 2a 2a 20 49 66 20 22 61 72 72 61 79  ..  ** If "array
13370 22 20 61 6e 64 20 22 63 6f 64 65 22 20 61 72 65  " and "code" are
13380 20 6f 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 6e   omitted, then n
13390 6f 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 65 76  o callback is ev
133a0 65 72 79 20 69 6e 76 6f 6b 65 64 2e 0a 20 20 2a  ery invoked..  *
133b0 2a 20 49 66 20 22 61 72 72 61 79 22 20 69 73 20  * If "array" is 
133c0 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c  an empty string,
133d0 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 73   then the values
133e0 20 61 72 65 20 70 6c 61 63 65 64 20 69 6e 20 76   are placed in v
133f0 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 74 68  ariables.  ** th
13400 61 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  at have the same
13410 20 6e 61 6d 65 20 61 73 20 74 68 65 20 66 69 65   name as the fie
13420 6c 64 73 20 65 78 74 72 61 63 74 65 64 20 62 79  lds extracted by
13430 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f   the query..  */
13440 0a 20 20 63 61 73 65 20 44 42 5f 45 56 41 4c 3a  .  case DB_EVAL:
13450 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3c   {.    if( objc<
13460 33 20 7c 7c 20 6f 62 6a 63 3e 35 20 29 7b 0a 20  3 || objc>5 ){. 
13470 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
13480 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
13490 20 6f 62 6a 76 2c 20 22 53 51 4c 20 3f 41 52 52   objv, "SQL ?ARR
134a0 41 59 2d 4e 41 4d 45 3f 20 3f 53 43 52 49 50 54  AY-NAME? ?SCRIPT
134b0 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ?");.      retur
134c0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
134d0 20 7d 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63   }..    if( objc
134e0 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 44 62 45  ==3 ){.      DbE
134f0 76 61 6c 43 6f 6e 74 65 78 74 20 73 45 76 61 6c  valContext sEval
13500 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20  ;.      Tcl_Obj 
13510 2a 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f  *pRet = Tcl_NewO
13520 62 6a 28 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f  bj();.      Tcl_
13530 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 52 65  IncrRefCount(pRe
13540 74 29 3b 0a 20 20 20 20 20 20 64 62 45 76 61 6c  t);.      dbEval
13550 49 6e 69 74 28 26 73 45 76 61 6c 2c 20 70 44 62  Init(&sEval, pDb
13560 2c 20 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20  , objv[2], 0);. 
13570 20 20 20 20 20 77 68 69 6c 65 28 20 54 43 4c 5f       while( TCL_
13580 4f 4b 3d 3d 28 72 63 20 3d 20 64 62 45 76 61 6c  OK==(rc = dbEval
13590 53 74 65 70 28 26 73 45 76 61 6c 29 29 20 29 7b  Step(&sEval)) ){
135a0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  .        int i;.
135b0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c          int nCol
135c0 3b 0a 20 20 20 20 20 20 20 20 64 62 45 76 61 6c  ;.        dbEval
135d0 52 6f 77 49 6e 66 6f 28 26 73 45 76 61 6c 2c 20  RowInfo(&sEval, 
135e0 26 6e 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 20  &nCol, 0);.     
135f0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
13600 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
13610 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
13620 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
13630 65 72 70 2c 20 70 52 65 74 2c 20 64 62 45 76 61  erp, pRet, dbEva
13640 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65 28 26 73 45  lColumnValue(&sE
13650 76 61 6c 2c 20 69 29 29 3b 0a 20 20 20 20 20 20  val, i));.      
13660 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
13670 20 20 64 62 45 76 61 6c 46 69 6e 61 6c 69 7a 65    dbEvalFinalize
13680 28 26 73 45 76 61 6c 29 3b 0a 20 20 20 20 20 20  (&sEval);.      
13690 69 66 28 20 72 63 3d 3d 54 43 4c 5f 42 52 45 41  if( rc==TCL_BREA
136a0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  K ){.        Tcl
136b0 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
136c0 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 20 20 20  terp, pRet);.   
136d0 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b       rc = TCL_OK
136e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
136f0 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
13700 28 70 52 65 74 29 3b 0a 20 20 20 20 7d 65 6c 73  (pRet);.    }els
13710 65 7b 0a 20 20 20 20 20 20 43 6c 69 65 6e 74 44  e{.      ClientD
13720 61 74 61 20 63 64 32 5b 32 5d 3b 0a 20 20 20 20  ata cd2[2];.    
13730 20 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20    DbEvalContext 
13740 2a 70 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62  *p;.      Tcl_Ob
13750 6a 20 2a 70 41 72 72 61 79 20 3d 20 30 3b 0a 20  j *pArray = 0;. 
13760 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53       Tcl_Obj *pS
13770 63 72 69 70 74 3b 0a 0a 20 20 20 20 20 20 69 66  cript;..      if
13780 28 20 6f 62 6a 63 3d 3d 35 20 26 26 20 2a 28 63  ( objc==5 && *(c
13790 68 61 72 20 2a 29 54 63 6c 5f 47 65 74 53 74 72  har *)Tcl_GetStr
137a0 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 20 29 7b 0a  ing(objv[3]) ){.
137b0 20 20 20 20 20 20 20 20 70 41 72 72 61 79 20 3d          pArray =
137c0 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20 20 20 20   objv[3];.      
137d0 7d 0a 20 20 20 20 20 20 70 53 63 72 69 70 74 20  }.      pScript 
137e0 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 3b 0a  = objv[objc-1];.
137f0 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65        Tcl_IncrRe
13800 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b  fCount(pScript);
13810 0a 0a 20 20 20 20 20 20 70 20 3d 20 28 44 62 45  ..      p = (DbE
13820 76 61 6c 43 6f 6e 74 65 78 74 20 2a 29 54 63 6c  valContext *)Tcl
13830 5f 41 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 44 62  _Alloc(sizeof(Db
13840 45 76 61 6c 43 6f 6e 74 65 78 74 29 29 3b 0a 20  EvalContext));. 
13850 20 20 20 20 20 64 62 45 76 61 6c 49 6e 69 74 28       dbEvalInit(
13860 70 2c 20 70 44 62 2c 20 6f 62 6a 76 5b 32 5d 2c  p, pDb, objv[2],
13870 20 70 41 72 72 61 79 29 3b 0a 0a 20 20 20 20 20   pArray);..     
13880 20 63 64 32 5b 30 5d 20 3d 20 28 76 6f 69 64 20   cd2[0] = (void 
13890 2a 29 70 3b 0a 20 20 20 20 20 20 63 64 32 5b 31  *)p;.      cd2[1
138a0 5d 20 3d 20 28 76 6f 69 64 20 2a 29 70 53 63 72  ] = (void *)pScr
138b0 69 70 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ipt;.      rc = 
138c0 44 62 45 76 61 6c 4e 65 78 74 43 6d 64 28 63 64  DbEvalNextCmd(cd
138d0 32 2c 20 69 6e 74 65 72 70 2c 20 54 43 4c 5f 4f  2, interp, TCL_O
138e0 4b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72  K);.    }.    br
138f0 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
13900 20 2a 2a 20 20 20 20 20 24 64 62 20 66 75 6e 63   **     $db func
13910 74 69 6f 6e 20 4e 41 4d 45 20 5b 2d 61 72 67 63  tion NAME [-argc
13920 6f 75 6e 74 20 4e 5d 20 5b 2d 64 65 74 65 72 6d  ount N] [-determ
13930 69 6e 69 73 74 69 63 5d 20 53 43 52 49 50 54 0a  inistic] SCRIPT.
13940 20 20 2a 2a 0a 20 20 2a 2a 20 43 72 65 61 74 65    **.  ** Create
13950 20 61 20 6e 65 77 20 53 51 4c 20 66 75 6e 63 74   a new SQL funct
13960 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e  ion called NAME.
13970 20 20 57 68 65 6e 65 76 65 72 20 74 68 61 74 20    Whenever that 
13980 66 75 6e 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a  function is.  **
13990 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65 20   called, invoke 
139a0 53 43 52 49 50 54 20 74 6f 20 65 76 61 6c 75 61  SCRIPT to evalua
139b0 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e  te the function.
139c0 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
139d0 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20  FUNCTION: {.    
139e0 69 6e 74 20 66 6c 61 67 73 20 3d 20 53 51 4c 49  int flags = SQLI
139f0 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 53 71 6c  TE_UTF8;.    Sql
13a00 46 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20 20  Func *pFunc;.   
13a10 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70   Tcl_Obj *pScrip
13a20 74 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 61  t;.    char *zNa
13a30 6d 65 3b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67  me;.    int nArg
13a40 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20 69   = -1;.    int i
13a50 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3c 34  ;.    if( objc<4
13a60 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
13a70 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
13a80 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d  p, 2, objv, "NAM
13a90 45 20 3f 53 57 49 54 43 48 45 53 3f 20 53 43 52  E ?SWITCHES? SCR
13aa0 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65 74  IPT");.      ret
13ab0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
13ac0 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 33     }.    for(i=3
13ad0 3b 20 69 3c 28 6f 62 6a 63 2d 31 29 3b 20 69 2b  ; i<(objc-1); i+
13ae0 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  +){.      const 
13af0 63 68 61 72 20 2a 7a 20 3d 20 54 63 6c 5f 47 65  char *z = Tcl_Ge
13b00 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69 5d 29  tString(objv[i])
13b10 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  ;.      int n = 
13b20 73 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20  strlen30(z);.   
13b30 20 20 20 69 66 28 20 6e 3e 32 20 26 26 20 73 74     if( n>2 && st
13b40 72 6e 63 6d 70 28 7a 2c 20 22 2d 61 72 67 63 6f  rncmp(z, "-argco
13b50 75 6e 74 22 2c 6e 29 3d 3d 30 20 29 7b 0a 20 20  unt",n)==0 ){.  
13b60 20 20 20 20 20 20 69 66 28 20 69 3d 3d 28 6f 62        if( i==(ob
13b70 6a 63 2d 32 29 20 29 7b 0a 20 20 20 20 20 20 20  jc-2) ){.       
13b80 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
13b90 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6f 70 74  ult(interp, "opt
13ba0 69 6f 6e 20 72 65 71 75 69 72 65 73 20 61 6e 20  ion requires an 
13bb0 61 72 67 75 6d 65 6e 74 3a 20 22 2c 20 7a 2c 28  argument: ", z,(
13bc0 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
13bd0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
13be0 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a  RROR;.        }.
13bf0 20 20 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f          if( Tcl_
13c00 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
13c10 74 65 72 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c  terp, objv[i+1],
13c20 20 26 6e 41 72 67 29 20 29 20 72 65 74 75 72 6e   &nArg) ) return
13c30 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
13c40 20 20 20 20 69 66 28 20 6e 41 72 67 3c 30 20 29      if( nArg<0 )
13c50 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  {.          Tcl_
13c60 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
13c70 65 72 70 2c 20 22 6e 75 6d 62 65 72 20 6f 66 20  erp, "number of 
13c80 61 72 67 75 6d 65 6e 74 73 20 6d 75 73 74 20 62  arguments must b
13c90 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 22 2c  e non-negative",
13ca0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13cb0 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
13cc0 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 20 20 20  r*)0);.         
13cd0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
13ce0 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  R;.        }.   
13cf0 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
13d00 7d 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20  }else.      if( 
13d10 6e 3e 32 20 26 26 20 73 74 72 6e 63 6d 70 28 7a  n>2 && strncmp(z
13d20 2c 20 22 2d 64 65 74 65 72 6d 69 6e 69 73 74 69  , "-deterministi
13d30 63 22 2c 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  c",n)==0 ){.    
13d40 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c      flags |= SQL
13d50 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
13d60 43 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  C;.      }else{.
13d70 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65          Tcl_Appe
13d80 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
13d90 20 22 62 61 64 20 6f 70 74 69 6f 6e 20 5c 22 22   "bad option \""
13da0 2c 20 7a 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , z,.           
13db0 20 22 5c 22 3a 20 6d 75 73 74 20 62 65 20 2d 61   "\": must be -a
13dc0 72 67 63 6f 75 6e 74 20 6f 72 20 2d 64 65 74 65  rgcount or -dete
13dd0 72 6d 69 6e 69 73 74 69 63 22 2c 20 28 63 68 61  rministic", (cha
13de0 72 2a 29 30 0a 20 20 20 20 20 20 20 20 29 3b 0a  r*)0.        );.
13df0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
13e00 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
13e10 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 53 63  }.    }..    pSc
13e20 72 69 70 74 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63  ript = objv[objc
13e30 2d 31 5d 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  -1];.    zName =
13e40 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
13e50 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30  omObj(objv[2], 0
13e60 29 3b 0a 20 20 20 20 70 46 75 6e 63 20 3d 20 66  );.    pFunc = f
13e70 69 6e 64 53 71 6c 46 75 6e 63 28 70 44 62 2c 20  indSqlFunc(pDb, 
13e80 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  zName);.    if( 
13e90 70 46 75 6e 63 3d 3d 30 20 29 20 72 65 74 75 72  pFunc==0 ) retur
13ea0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
13eb0 20 69 66 28 20 70 46 75 6e 63 2d 3e 70 53 63 72   if( pFunc->pScr
13ec0 69 70 74 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  ipt ){.      Tcl
13ed0 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 46  _DecrRefCount(pF
13ee0 75 6e 63 2d 3e 70 53 63 72 69 70 74 29 3b 0a 20  unc->pScript);. 
13ef0 20 20 20 7d 0a 20 20 20 20 70 46 75 6e 63 2d 3e     }.    pFunc->
13f00 70 53 63 72 69 70 74 20 3d 20 70 53 63 72 69 70  pScript = pScrip
13f10 74 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  t;.    Tcl_IncrR
13f20 65 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29  efCount(pScript)
13f30 3b 0a 20 20 20 20 70 46 75 6e 63 2d 3e 75 73 65  ;.    pFunc->use
13f40 45 76 61 6c 4f 62 6a 76 20 3d 20 73 61 66 65 54  EvalObjv = safeT
13f50 6f 55 73 65 45 76 61 6c 4f 62 6a 76 28 69 6e 74  oUseEvalObjv(int
13f60 65 72 70 2c 20 70 53 63 72 69 70 74 29 3b 0a 20  erp, pScript);. 
13f70 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
13f80 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
13f90 70 44 62 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20  pDb->db, zName, 
13fa0 6e 41 72 67 2c 20 66 6c 61 67 73 2c 0a 20 20 20  nArg, flags,.   
13fb0 20 20 20 20 20 70 46 75 6e 63 2c 20 74 63 6c 53       pFunc, tclS
13fc0 71 6c 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20  qlFunc, 0, 0);. 
13fd0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
13fe0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
13ff0 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20   = TCL_ERROR;.  
14000 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
14010 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
14020 2a 29 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  *)sqlite3_errmsg
14030 28 70 44 62 2d 3e 64 62 29 2c 20 54 43 4c 5f 56  (pDb->db), TCL_V
14040 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 7d 0a  OLATILE);.    }.
14050 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
14060 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64    /*.  **     $d
14070 62 20 69 6e 63 72 62 6c 6f 62 20 3f 2d 72 65 61  b incrblob ?-rea
14080 64 6f 6e 6c 79 3f 20 3f 44 42 3f 20 54 41 42 4c  donly? ?DB? TABL
14090 45 20 43 4f 4c 55 4d 4e 20 52 4f 57 49 44 0a 20  E COLUMN ROWID. 
140a0 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 49 4e   */.  case DB_IN
140b0 43 52 42 4c 4f 42 3a 20 7b 0a 23 69 66 64 65 66  CRBLOB: {.#ifdef
140c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
140d0 52 42 4c 4f 42 0a 20 20 20 20 54 63 6c 5f 41 70  RBLOB.    Tcl_Ap
140e0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
140f0 70 2c 20 22 69 6e 63 72 62 6c 6f 62 20 6e 6f 74  p, "incrblob not
14100 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68   available in th
14110 69 73 20 62 75 69 6c 64 22 2c 20 28 63 68 61 72  is build", (char
14120 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  *)0);.    return
14130 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73   TCL_ERROR;.#els
14140 65 0a 20 20 20 20 69 6e 74 20 69 73 52 65 61 64  e.    int isRead
14150 6f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 63 6f  only = 0;.    co
14160 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20  nst char *zDb = 
14170 22 6d 61 69 6e 22 3b 0a 20 20 20 20 63 6f 6e 73  "main";.    cons
14180 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 3b 0a  t char *zTable;.
14190 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
141a0 7a 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 54 63 6c  zColumn;.    Tcl
141b0 5f 57 69 64 65 49 6e 74 20 69 52 6f 77 3b 0a 0a  _WideInt iRow;..
141c0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72      /* Check for
141d0 20 74 68 65 20 2d 72 65 61 64 6f 6e 6c 79 20 6f   the -readonly o
141e0 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 28  ption */.    if(
141f0 20 6f 62 6a 63 3e 33 20 26 26 20 73 74 72 63 6d   objc>3 && strcm
14200 70 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  p(Tcl_GetString(
14210 6f 62 6a 76 5b 32 5d 29 2c 20 22 2d 72 65 61 64  objv[2]), "-read
14220 6f 6e 6c 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20  only")==0 ){.   
14230 20 20 20 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20     isReadonly = 
14240 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  1;.    }..    if
14250 28 20 6f 62 6a 63 21 3d 28 35 2b 69 73 52 65 61  ( objc!=(5+isRea
14260 64 6f 6e 6c 79 29 20 26 26 20 6f 62 6a 63 21 3d  donly) && objc!=
14270 28 36 2b 69 73 52 65 61 64 6f 6e 6c 79 29 20 29  (6+isReadonly) )
14280 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
14290 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
142a0 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 2d 72 65 61   2, objv, "?-rea
142b0 64 6f 6e 6c 79 3f 20 3f 44 42 3f 20 54 41 42 4c  donly? ?DB? TABL
142c0 45 20 43 4f 4c 55 4d 4e 20 52 4f 57 49 44 22 29  E COLUMN ROWID")
142d0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
142e0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
142f0 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 28  .    if( objc==(
14300 36 2b 69 73 52 65 61 64 6f 6e 6c 79 29 20 29 7b  6+isReadonly) ){
14310 0a 20 20 20 20 20 20 7a 44 62 20 3d 20 54 63 6c  .      zDb = Tcl
14320 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
14330 32 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  2]);.    }.    z
14340 54 61 62 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53  Table = Tcl_GetS
14350 74 72 69 6e 67 28 6f 62 6a 76 5b 6f 62 6a 63 2d  tring(objv[objc-
14360 33 5d 29 3b 0a 20 20 20 20 7a 43 6f 6c 75 6d 6e  3]);.    zColumn
14370 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
14380 28 6f 62 6a 76 5b 6f 62 6a 63 2d 32 5d 29 3b 0a  (objv[objc-2]);.
14390 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 47 65 74      rc = Tcl_Get
143a0 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  WideIntFromObj(i
143b0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 6f 62 6a 63  nterp, objv[objc
143c0 2d 31 5d 2c 20 26 69 52 6f 77 29 3b 0a 0a 20 20  -1], &iRow);..  
143d0 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b    if( rc==TCL_OK
143e0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 63   ){.      rc = c
143f0 72 65 61 74 65 49 6e 63 72 62 6c 6f 62 43 68 61  reateIncrblobCha
14400 6e 6e 65 6c 28 0a 20 20 20 20 20 20 20 20 20 20  nnel(.          
14410 69 6e 74 65 72 70 2c 20 70 44 62 2c 20 7a 44 62  interp, pDb, zDb
14420 2c 20 7a 54 61 62 6c 65 2c 20 7a 43 6f 6c 75 6d  , zTable, zColum
14430 6e 2c 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  n, (sqlite3_int6
14440 34 29 69 52 6f 77 2c 20 69 73 52 65 61 64 6f 6e  4)iRow, isReadon
14450 6c 79 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  ly.      );.    
14460 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65  }.#endif.    bre
14470 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
14480 2a 2a 20 20 20 20 20 24 64 62 20 69 6e 74 65 72  **     $db inter
14490 72 75 70 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  rupt.  **.  ** I
144a0 6e 74 65 72 72 75 70 74 20 74 68 65 20 65 78 65  nterrupt the exe
144b0 63 75 74 69 6f 6e 20 6f 66 20 74 68 65 20 69 6e  cution of the in
144c0 6e 65 72 2d 6d 6f 73 74 20 53 51 4c 20 69 6e 74  ner-most SQL int
144d0 65 72 70 72 65 74 65 72 2e 20 20 54 68 69 73 0a  erpreter.  This.
144e0 20 20 2a 2a 20 63 61 75 73 65 73 20 74 68 65 20    ** causes the 
144f0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  SQL statement to
14500 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
14510 20 6f 66 20 53 51 4c 49 54 45 5f 49 4e 54 45 52   of SQLITE_INTER
14520 52 55 50 54 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  RUPT..  */.  cas
14530 65 20 44 42 5f 49 4e 54 45 52 52 55 50 54 3a 20  e DB_INTERRUPT: 
14540 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  {.    sqlite3_in
14550 74 65 72 72 75 70 74 28 70 44 62 2d 3e 64 62 29  terrupt(pDb->db)
14560 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
14570 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20  ..  /*.  **     
14580 24 64 62 20 6e 75 6c 6c 76 61 6c 75 65 20 3f 53  $db nullvalue ?S
14590 54 52 49 4e 47 3f 0a 20 20 2a 2a 0a 20 20 2a 2a  TRING?.  **.  **
145a0 20 43 68 61 6e 67 65 20 74 65 78 74 20 75 73 65   Change text use
145b0 64 20 77 68 65 6e 20 61 20 4e 55 4c 4c 20 63 6f  d when a NULL co
145c0 6d 65 73 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  mes back from th
145d0 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 3f  e database. If ?
145e0 53 54 52 49 4e 47 3f 0a 20 20 2a 2a 20 69 73 20  STRING?.  ** is 
145f0 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20 74 68 65  not present, the
14600 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  n the current st
14610 72 69 6e 67 20 75 73 65 64 20 66 6f 72 20 4e 55  ring used for NU
14620 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  LL is returned..
14630 20 20 2a 2a 20 49 66 20 53 54 52 49 4e 47 20 69    ** If STRING i
14640 73 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20  s present, then 
14650 53 54 52 49 4e 47 20 69 73 20 72 65 74 75 72 6e  STRING is return
14660 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2f 0a 20 20  ed..  **.  */.  
14670 63 61 73 65 20 44 42 5f 4e 55 4c 4c 56 41 4c 55  case DB_NULLVALU
14680 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a  E: {.    if( obj
14690 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33 20  c!=2 && objc!=3 
146a0 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
146b0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
146c0 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 55 4c 4c  , 2, objv, "NULL
146d0 56 41 4c 55 45 22 29 3b 0a 20 20 20 20 20 20 72  VALUE");.      r
146e0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
146f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f  .    }.    if( o
14700 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc==3 ){.      
14710 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 63  int len;.      c
14720 68 61 72 20 2a 7a 4e 75 6c 6c 20 3d 20 54 63 6c  har *zNull = Tcl
14730 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
14740 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29  j(objv[2], &len)
14750 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  ;.      if( pDb-
14760 3e 7a 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  >zNull ){.      
14770 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e    Tcl_Free(pDb->
14780 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a  zNull);.      }.
14790 20 20 20 20 20 20 69 66 28 20 7a 4e 75 6c 6c 20        if( zNull 
147a0 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20  && len>0 ){.    
147b0 20 20 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 3d      pDb->zNull =
147c0 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20   Tcl_Alloc( len 
147d0 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d  + 1 );.        m
147e0 65 6d 63 70 79 28 70 44 62 2d 3e 7a 4e 75 6c 6c  emcpy(pDb->zNull
147f0 2c 20 7a 4e 75 6c 6c 2c 20 6c 65 6e 29 3b 0a 20  , zNull, len);. 
14800 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 75 6c         pDb->zNul
14810 6c 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20  l[len] = '\0';. 
14820 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
14830 20 20 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 3d      pDb->zNull =
14840 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
14850 7d 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  }.    Tcl_SetObj
14860 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
14870 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
14880 70 44 62 2d 3e 7a 4e 75 6c 6c 2c 20 2d 31 29 29  pDb->zNull, -1))
14890 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
148a0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20  ..  /*.  **     
148b0 24 64 62 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f  $db last_insert_
148c0 72 6f 77 69 64 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rowid.  **.  ** 
148d0 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65  Return an intege
148e0 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 52  r which is the R
148f0 4f 57 49 44 20 66 6f 72 20 74 68 65 20 6d 6f 73  OWID for the mos
14900 74 20 72 65 63 65 6e 74 20 69 6e 73 65 72 74 2e  t recent insert.
14910 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
14920 4c 41 53 54 5f 49 4e 53 45 52 54 5f 52 4f 57 49  LAST_INSERT_ROWI
14930 44 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  D: {.    Tcl_Obj
14940 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20 20 54   *pResult;.    T
14950 63 6c 5f 57 69 64 65 49 6e 74 20 72 6f 77 69 64  cl_WideInt rowid
14960 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ;.    if( objc!=
14970 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  2 ){.      Tcl_W
14980 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
14990 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 22 29  rp, 2, objv, "")
149a0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
149b0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
149c0 20 20 20 20 72 6f 77 69 64 20 3d 20 73 71 6c 69      rowid = sqli
149d0 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f  te3_last_insert_
149e0 72 6f 77 69 64 28 70 44 62 2d 3e 64 62 29 3b 0a  rowid(pDb->db);.
149f0 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63      pResult = Tc
14a00 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_GetObjResult(i
14a10 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f  nterp);.    Tcl_
14a20 53 65 74 57 69 64 65 49 6e 74 4f 62 6a 28 70 52  SetWideIntObj(pR
14a30 65 73 75 6c 74 2c 20 72 6f 77 69 64 29 3b 0a 20  esult, rowid);. 
14a40 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
14a50 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 44 42 5f   /*.  ** The DB_
14a60 4f 4e 45 43 4f 4c 55 4d 4e 20 6d 65 74 68 6f 64  ONECOLUMN method
14a70 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
14a80 74 6f 67 65 74 68 65 72 20 77 69 74 68 20 44 42  together with DB
14a90 5f 45 58 49 53 54 53 2e 0a 20 20 2a 2f 0a 0a 20  _EXISTS..  */.. 
14aa0 20 2f 2a 20 20 20 20 24 64 62 20 70 72 6f 67 72   /*    $db progr
14ab0 65 73 73 20 3f 4e 20 43 41 4c 4c 42 41 43 4b 3f  ess ?N CALLBACK?
14ac0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b  .  **.  ** Invok
14ad0 65 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c  e the given call
14ae0 62 61 63 6b 20 65 76 65 72 79 20 4e 20 76 69 72  back every N vir
14af0 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 6f 70 63  tual machine opc
14b00 6f 64 65 73 20 77 68 69 6c 65 20 65 78 65 63 75  odes while execu
14b10 74 69 6e 67 0a 20 20 2a 2a 20 71 75 65 72 69 65  ting.  ** querie
14b20 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  s..  */.  case D
14b30 42 5f 50 52 4f 47 52 45 53 53 3a 20 7b 0a 20 20  B_PROGRESS: {.  
14b40 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b    if( objc==2 ){
14b50 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
14b60 7a 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20 20  zProgress ){.   
14b70 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
14b80 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44  esult(interp, pD
14b90 62 2d 3e 7a 50 72 6f 67 72 65 73 73 2c 20 28 63  b->zProgress, (c
14ba0 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 7d  har*)0);.      }
14bb0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
14bc0 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20  bjc==4 ){.      
14bd0 63 68 61 72 20 2a 7a 50 72 6f 67 72 65 73 73 3b  char *zProgress;
14be0 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a  .      int len;.
14bf0 20 20 20 20 20 20 69 6e 74 20 4e 3b 0a 20 20 20        int N;.   
14c00 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54     if( TCL_OK!=T
14c10 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
14c20 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
14c30 2c 20 26 4e 29 20 29 7b 0a 20 20 20 20 20 20 20  , &N) ){.       
14c40 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
14c50 52 3b 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  R;.      };.    
14c60 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67    if( pDb->zProg
14c70 72 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ress ){.        
14c80 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 50  Tcl_Free(pDb->zP
14c90 72 6f 67 72 65 73 73 29 3b 0a 20 20 20 20 20 20  rogress);.      
14ca0 7d 0a 20 20 20 20 20 20 7a 50 72 6f 67 72 65 73  }.      zProgres
14cb0 73 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  s = Tcl_GetStrin
14cc0 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d  gFromObj(objv[3]
14cd0 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69  , &len);.      i
14ce0 66 28 20 7a 50 72 6f 67 72 65 73 73 20 26 26 20  f( zProgress && 
14cf0 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  len>0 ){.       
14d00 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20   pDb->zProgress 
14d10 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e  = Tcl_Alloc( len
14d20 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20   + 1 );.        
14d30 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 50 72 6f  memcpy(pDb->zPro
14d40 67 72 65 73 73 2c 20 7a 50 72 6f 67 72 65 73 73  gress, zProgress
14d50 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20  , len+1);.      
14d60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
14d70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 3d 20  Db->zProgress = 
14d80 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64  0;.      }.#ifnd
14d90 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
14da0 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b  ROGRESS_CALLBACK
14db0 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
14dc0 7a 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20 20  zProgress ){.   
14dd0 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70       pDb->interp
14de0 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20   = interp;.     
14df0 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 67 72     sqlite3_progr
14e00 65 73 73 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d  ess_handler(pDb-
14e10 3e 64 62 2c 20 4e 2c 20 44 62 50 72 6f 67 72 65  >db, N, DbProgre
14e20 73 73 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b  ssHandler, pDb);
14e30 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
14e40 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72        sqlite3_pr
14e50 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65 72 28 70  ogress_handler(p
14e60 44 62 2d 3e 64 62 2c 20 30 2c 20 30 2c 20 30 29  Db->db, 0, 0, 0)
14e70 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
14e80 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
14e90 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
14ea0 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
14eb0 6a 76 2c 20 22 4e 20 43 41 4c 4c 42 41 43 4b 22  jv, "N CALLBACK"
14ec0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
14ed0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
14ee0 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
14ef0 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 70 72 6f  .  /*    $db pro
14f00 66 69 6c 65 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a  file ?CALLBACK?.
14f10 20 20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20 61    **.  ** Make a
14f20 72 72 61 6e 67 65 6d 65 6e 74 73 20 74 6f 20 69  rrangements to i
14f30 6e 76 6f 6b 65 20 74 68 65 20 43 41 4c 4c 42 41  nvoke the CALLBA
14f40 43 4b 20 72 6f 75 74 69 6e 65 20 61 66 74 65 72  CK routine after
14f50 20 65 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d   each SQL statem
14f60 65 6e 74 0a 20 20 2a 2a 20 74 68 61 74 20 68 61  ent.  ** that ha
14f70 73 20 72 75 6e 2e 20 20 54 68 65 20 74 65 78 74  s run.  The text
14f80 20 6f 66 20 74 68 65 20 53 51 4c 20 61 6e 64 20   of the SQL and 
14f90 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 65 6c  the amount of el
14fa0 61 70 73 65 20 74 69 6d 65 20 61 72 65 0a 20 20  apse time are.  
14fb0 2a 2a 20 61 70 70 65 6e 64 65 64 20 74 6f 20 43  ** appended to C
14fc0 41 4c 4c 42 41 43 4b 20 62 65 66 6f 72 65 20 74  ALLBACK before t
14fd0 68 65 20 73 63 72 69 70 74 20 69 73 20 72 75 6e  he script is run
14fe0 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
14ff0 5f 50 52 4f 46 49 4c 45 3a 20 7b 0a 20 20 20 20  _PROFILE: {.    
15000 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20  if( objc>3 ){.  
15010 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
15020 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
15030 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b  objv, "?CALLBACK
15040 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ?");.      retur
15050 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
15060 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d   }else if( objc=
15070 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =2 ){.      if( 
15080 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b  pDb->zProfile ){
15090 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70  .        Tcl_App
150a0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
150b0 2c 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 2c  , pDb->zProfile,
150c0 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
150d0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
150e0 20 20 20 20 20 63 68 61 72 20 2a 7a 50 72 6f 66       char *zProf
150f0 69 6c 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c  ile;.      int l
15100 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44  en;.      if( pD
15110 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a 20  b->zProfile ){. 
15120 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28         Tcl_Free(
15130 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 29 3b 0a  pDb->zProfile);.
15140 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 50        }.      zP
15150 72 6f 66 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74  rofile = Tcl_Get
15160 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
15170 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20  jv[2], &len);.  
15180 20 20 20 20 69 66 28 20 7a 50 72 6f 66 69 6c 65      if( zProfile
15190 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20   && len>0 ){.   
151a0 20 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f 66 69       pDb->zProfi
151b0 6c 65 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20  le = Tcl_Alloc( 
151c0 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20  len + 1 );.     
151d0 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a     memcpy(pDb->z
151e0 50 72 6f 66 69 6c 65 2c 20 7a 50 72 6f 66 69 6c  Profile, zProfil
151f0 65 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20  e, len+1);.     
15200 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
15210 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 3d 20  pDb->zProfile = 
15220 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 21  0;.      }.#if !
15230 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
15240 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 21 64  MIT_TRACE) && !d
15250 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
15260 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
15270 54 29 20 26 26 20 5c 0a 20 20 20 20 21 64 65 66  T) && \.    !def
15280 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
15290 5f 44 45 50 52 45 43 41 54 45 44 29 0a 20 20 20  _DEPRECATED).   
152a0 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f     if( pDb->zPro
152b0 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  file ){.        
152c0 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e  pDb->interp = in
152d0 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71  terp;.        sq
152e0 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65 28 70 44  lite3_profile(pD
152f0 62 2d 3e 64 62 2c 20 44 62 50 72 6f 66 69 6c 65  b->db, DbProfile
15300 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20  Handler, pDb);. 
15310 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
15320 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 66      sqlite3_prof
15330 69 6c 65 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20  ile(pDb->db, 0, 
15340 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  0);.      }.#end
15350 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65  if.    }.    bre
15360 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
15370 2a 2a 20 20 20 20 20 24 64 62 20 72 65 6b 65 79  **     $db rekey
15380 20 4b 45 59 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43   KEY.  **.  ** C
15390 68 61 6e 67 65 20 74 68 65 20 65 6e 63 72 79 70  hange the encryp
153a0 74 69 6f 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20  tion key on the 
153b0 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20 64  currently open d
153c0 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  atabase..  */.  
153d0 63 61 73 65 20 44 42 5f 52 45 4b 45 59 3a 20 7b  case DB_REKEY: {
153e0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
153f0 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 29 20 26  ITE_HAS_CODEC) &
15400 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
15410 45 5f 4f 4d 49 54 5f 43 4f 44 45 43 5f 46 52 4f  E_OMIT_CODEC_FRO
15420 4d 5f 54 43 4c 29 0a 20 20 20 20 69 6e 74 20 6e  M_TCL).    int n
15430 4b 65 79 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70  Key;.    void *p
15440 4b 65 79 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  Key;.#endif.    
15450 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
15460 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
15470 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
15480 20 6f 62 6a 76 2c 20 22 4b 45 59 22 29 3b 0a 20   objv, "KEY");. 
15490 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
154a0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 69 66  ERROR;.    }.#if
154b0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
154c0 48 41 53 5f 43 4f 44 45 43 29 20 26 26 20 21 64  HAS_CODEC) && !d
154d0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
154e0 49 54 5f 43 4f 44 45 43 5f 46 52 4f 4d 5f 54 43  IT_CODEC_FROM_TC
154f0 4c 29 0a 20 20 20 20 70 4b 65 79 20 3d 20 54 63  L).    pKey = Tc
15500 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72  l_GetByteArrayFr
15510 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26  omObj(objv[2], &
15520 6e 4b 65 79 29 3b 0a 20 20 20 20 72 63 20 3d 20  nKey);.    rc = 
15530 73 71 6c 69 74 65 33 5f 72 65 6b 65 79 28 70 44  sqlite3_rekey(pD
15540 62 2d 3e 64 62 2c 20 70 4b 65 79 2c 20 6e 4b 65  b->db, pKey, nKe
15550 79 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  y);.    if( rc )
15560 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
15570 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
15580 20 73 71 6c 69 74 65 33 5f 65 72 72 73 74 72 28   sqlite3_errstr(
15590 72 63 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  rc), (char*)0);.
155a0 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45        rc = TCL_E
155b0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  RROR;.    }.#end
155c0 69 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  if.    break;.  
155d0 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 72  }..  /*    $db r
155e0 65 73 74 6f 72 65 20 3f 44 41 54 41 42 41 53 45  estore ?DATABASE
155f0 3f 20 46 49 4c 45 4e 41 4d 45 0a 20 20 2a 2a 0a  ? FILENAME.  **.
15600 20 20 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61    ** Open a data
15610 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 64 20  base file named 
15620 46 49 4c 45 4e 41 4d 45 2e 20 20 54 72 61 6e 73  FILENAME.  Trans
15630 66 65 72 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a  fer the content.
15640 20 20 2a 2a 20 6f 66 20 46 49 4c 45 4e 41 4d 45    ** of FILENAME
15650 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20   into the local 
15660 64 61 74 61 62 61 73 65 20 44 41 54 41 42 41 53  database DATABAS
15670 45 20 28 64 65 66 61 75 6c 74 3a 20 22 6d 61 69  E (default: "mai
15680 6e 22 29 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  n")..  */.  case
15690 20 44 42 5f 52 45 53 54 4f 52 45 3a 20 7b 0a 20   DB_RESTORE: {. 
156a0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
156b0 53 72 63 46 69 6c 65 3b 0a 20 20 20 20 63 6f 6e  SrcFile;.    con
156c0 73 74 20 63 68 61 72 20 2a 7a 44 65 73 74 44 62  st char *zDestDb
156d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 70  ;.    sqlite3 *p
156e0 53 72 63 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Src;.    sqlite3
156f0 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b 75 70  _backup *pBackup
15700 3b 0a 20 20 20 20 69 6e 74 20 6e 54 69 6d 65 6f  ;.    int nTimeo
15710 75 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  ut = 0;..    if(
15720 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20   objc==3 ){.    
15730 20 20 7a 44 65 73 74 44 62 20 3d 20 22 6d 61 69    zDestDb = "mai
15740 6e 22 3b 0a 20 20 20 20 20 20 7a 53 72 63 46 69  n";.      zSrcFi
15750 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  le = Tcl_GetStri
15760 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20  ng(objv[2]);.   
15770 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d   }else if( objc=
15780 3d 34 20 29 7b 0a 20 20 20 20 20 20 7a 44 65 73  =4 ){.      zDes
15790 74 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  tDb = Tcl_GetStr
157a0 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
157b0 20 20 20 20 7a 53 72 63 46 69 6c 65 20 3d 20 54      zSrcFile = T
157c0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
157d0 76 5b 33 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  v[3]);.    }else
157e0 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
157f0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
15800 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 44 41 54 41   2, objv, "?DATA
15810 42 41 53 45 3f 20 46 49 4c 45 4e 41 4d 45 22 29  BASE? FILENAME")
15820 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
15830 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
15840 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
15850 5f 6f 70 65 6e 5f 76 32 28 7a 53 72 63 46 69 6c  _open_v2(zSrcFil
15860 65 2c 20 26 70 53 72 63 2c 0a 20 20 20 20 20 20  e, &pSrc,.      
15870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15880 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
15890 45 41 44 4f 4e 4c 59 20 7c 20 70 44 62 2d 3e 6f  EADONLY | pDb->o
158a0 70 65 6e 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20  penFlags, 0);.  
158b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
158c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  _OK ){.      Tcl
158d0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
158e0 74 65 72 70 2c 20 22 63 61 6e 6e 6f 74 20 6f 70  terp, "cannot op
158f0 65 6e 20 73 6f 75 72 63 65 20 64 61 74 61 62 61  en source databa
15900 73 65 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20  se: ",.         
15910 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67    sqlite3_errmsg
15920 28 70 53 72 63 29 2c 20 28 63 68 61 72 2a 29 30  (pSrc), (char*)0
15930 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
15940 5f 63 6c 6f 73 65 28 70 53 72 63 29 3b 0a 20 20  _close(pSrc);.  
15950 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
15960 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
15970 70 42 61 63 6b 75 70 20 3d 20 73 71 6c 69 74 65  pBackup = sqlite
15980 33 5f 62 61 63 6b 75 70 5f 69 6e 69 74 28 70 44  3_backup_init(pD
15990 62 2d 3e 64 62 2c 20 7a 44 65 73 74 44 62 2c 20  b->db, zDestDb, 
159a0 70 53 72 63 2c 20 22 6d 61 69 6e 22 29 3b 0a 20  pSrc, "main");. 
159b0 20 20 20 69 66 28 20 70 42 61 63 6b 75 70 3d 3d     if( pBackup==
159c0 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  0 ){.      Tcl_A
159d0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
159e0 72 70 2c 20 22 72 65 73 74 6f 72 65 20 66 61 69  rp, "restore fai
159f0 6c 65 64 3a 20 22 2c 0a 20 20 20 20 20 20 20 20  led: ",.        
15a00 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73     sqlite3_errms
15a10 67 28 70 44 62 2d 3e 64 62 29 2c 20 28 63 68 61  g(pDb->db), (cha
15a20 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  r*)0);.      sql
15a30 69 74 65 33 5f 63 6c 6f 73 65 28 70 53 72 63 29  ite3_close(pSrc)
15a40 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
15a50 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
15a60 20 20 20 20 77 68 69 6c 65 28 20 28 72 63 20 3d      while( (rc =
15a70 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f   sqlite3_backup_
15a80 73 74 65 70 28 70 42 61 63 6b 75 70 2c 31 30 30  step(pBackup,100
15a90 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  ))==SQLITE_OK.  
15aa0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 72              || r
15ab0 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  c==SQLITE_BUSY )
15ac0 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  {.      if( rc==
15ad0 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20  SQLITE_BUSY ){. 
15ae0 20 20 20 20 20 20 20 69 66 28 20 6e 54 69 6d 65         if( nTime
15af0 6f 75 74 2b 2b 20 3e 3d 20 33 20 29 20 62 72 65  out++ >= 3 ) bre
15b00 61 6b 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ak;.        sqli
15b10 74 65 33 5f 73 6c 65 65 70 28 31 30 30 29 3b 0a  te3_sleep(100);.
15b20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
15b30 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70    sqlite3_backup
15b40 5f 66 69 6e 69 73 68 28 70 42 61 63 6b 75 70 29  _finish(pBackup)
15b50 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
15b60 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
15b70 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a     rc = TCL_OK;.
15b80 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
15b90 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c  ==SQLITE_BUSY ||
15ba0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b   rc==SQLITE_LOCK
15bb0 45 44 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  ED ){.      Tcl_
15bc0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
15bd0 65 72 70 2c 20 22 72 65 73 74 6f 72 65 20 66 61  erp, "restore fa
15be0 69 6c 65 64 3a 20 73 6f 75 72 63 65 20 64 61 74  iled: source dat
15bf0 61 62 61 73 65 20 62 75 73 79 22 2c 0a 20 20 20  abase busy",.   
15c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c10 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b 0a 20      (char*)0);. 
15c20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52       rc = TCL_ER
15c30 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ROR;.    }else{.
15c40 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
15c50 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
15c60 72 65 73 74 6f 72 65 20 66 61 69 6c 65 64 3a 20  restore failed: 
15c70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71  ",.           sq
15c80 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62  lite3_errmsg(pDb
15c90 2d 3e 64 62 29 2c 20 28 63 68 61 72 2a 29 30 29  ->db), (char*)0)
15ca0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c  ;.      rc = TCL
15cb0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
15cc0 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28    sqlite3_close(
15cd0 70 53 72 63 29 3b 0a 20 20 20 20 62 72 65 61 6b  pSrc);.    break
15ce0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
15cf0 20 20 20 20 20 24 64 62 20 73 74 61 74 75 73 20       $db status 
15d00 28 73 74 65 70 7c 73 6f 72 74 7c 61 75 74 6f 69  (step|sort|autoi
15d10 6e 64 65 78 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ndex).  **.  ** 
15d20 44 69 73 70 6c 61 79 20 53 51 4c 49 54 45 5f 53  Display SQLITE_S
15d30 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43  TMTSTATUS_FULLSC
15d40 41 4e 5f 53 54 45 50 20 6f 72 0a 20 20 2a 2a 20  AN_STEP or.  ** 
15d50 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
15d60 53 5f 53 4f 52 54 20 66 6f 72 20 74 68 65 20 6d  S_SORT for the m
15d70 6f 73 74 20 72 65 63 65 6e 74 20 65 76 61 6c 2e  ost recent eval.
15d80 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
15d90 53 54 41 54 55 53 3a 20 7b 0a 20 20 20 20 69 6e  STATUS: {.    in
15da0 74 20 76 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  t v;.    const c
15db0 68 61 72 20 2a 7a 4f 70 3b 0a 20 20 20 20 69 66  har *zOp;.    if
15dc0 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
15dd0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
15de0 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
15df0 62 6a 76 2c 20 22 28 73 74 65 70 7c 73 6f 72 74  bjv, "(step|sort
15e00 7c 61 75 74 6f 69 6e 64 65 78 29 22 29 3b 0a 20  |autoindex)");. 
15e10 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
15e20 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
15e30 20 7a 4f 70 20 3d 20 54 63 6c 5f 47 65 74 53 74   zOp = Tcl_GetSt
15e40 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
15e50 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4f     if( strcmp(zO
15e60 70 2c 20 22 73 74 65 70 22 29 3d 3d 30 20 29 7b  p, "step")==0 ){
15e70 0a 20 20 20 20 20 20 76 20 3d 20 70 44 62 2d 3e  .      v = pDb->
15e80 6e 53 74 65 70 3b 0a 20 20 20 20 7d 65 6c 73 65  nStep;.    }else
15e90 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4f 70 2c   if( strcmp(zOp,
15ea0 20 22 73 6f 72 74 22 29 3d 3d 30 20 29 7b 0a 20   "sort")==0 ){. 
15eb0 20 20 20 20 20 76 20 3d 20 70 44 62 2d 3e 6e 53       v = pDb->nS
15ec0 6f 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ort;.    }else i
15ed0 66 28 20 73 74 72 63 6d 70 28 7a 4f 70 2c 20 22  f( strcmp(zOp, "
15ee0 61 75 74 6f 69 6e 64 65 78 22 29 3d 3d 30 20 29  autoindex")==0 )
15ef0 7b 0a 20 20 20 20 20 20 76 20 3d 20 70 44 62 2d  {.      v = pDb-
15f00 3e 6e 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c  >nIndex;.    }el
15f10 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  se{.      Tcl_Ap
15f20 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
15f30 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  p,.            "
15f40 62 61 64 20 61 72 67 75 6d 65 6e 74 3a 20 73 68  bad argument: sh
15f50 6f 75 6c 64 20 62 65 20 61 75 74 6f 69 6e 64 65  ould be autoinde
15f60 78 2c 20 73 74 65 70 2c 20 6f 72 20 73 6f 72 74  x, step, or sort
15f70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  ",.            (
15f80 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
15f90 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
15fa0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f  ;.    }.    Tcl_
15fb0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
15fc0 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
15fd0 62 6a 28 76 29 29 3b 0a 20 20 20 20 62 72 65 61  bj(v));.    brea
15fe0 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
15ff0 2a 20 20 20 20 20 24 64 62 20 74 69 6d 65 6f 75  *     $db timeou
16000 74 20 4d 49 4c 4c 45 53 45 43 4f 4e 44 53 0a 20  t MILLESECONDS. 
16010 20 2a 2a 0a 20 20 2a 2a 20 44 65 6c 61 79 20 66   **.  ** Delay f
16020 6f 72 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  or the number of
16030 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 70   milliseconds sp
16040 65 63 69 66 69 65 64 20 77 68 65 6e 20 61 20 66  ecified when a f
16050 69 6c 65 20 69 73 20 6c 6f 63 6b 65 64 2e 0a 20  ile is locked.. 
16060 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 54 49   */.  case DB_TI
16070 4d 45 4f 55 54 3a 20 7b 0a 20 20 20 20 69 6e 74  MEOUT: {.    int
16080 20 6d 73 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a   ms;.    if( obj
16090 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=3 ){.      Tc
160a0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
160b0 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
160c0 22 4d 49 4c 4c 49 53 45 43 4f 4e 44 53 22 29 3b  "MILLISECONDS");
160d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
160e0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
160f0 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e     if( Tcl_GetIn
16100 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
16110 20 6f 62 6a 76 5b 32 5d 2c 20 26 6d 73 29 20 29   objv[2], &ms) )
16120 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
16130 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  R;.    sqlite3_b
16140 75 73 79 5f 74 69 6d 65 6f 75 74 28 70 44 62 2d  usy_timeout(pDb-
16150 3e 64 62 2c 20 6d 73 29 3b 0a 20 20 20 20 62 72  >db, ms);.    br
16160 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
16170 20 2a 2a 20 20 20 20 20 24 64 62 20 74 6f 74 61   **     $db tota
16180 6c 5f 63 68 61 6e 67 65 73 0a 20 20 2a 2a 0a 20  l_changes.  **. 
16190 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e   ** Return the n
161a0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68  umber of rows th
161b0 61 74 20 77 65 72 65 20 6d 6f 64 69 66 69 65 64  at were modified
161c0 2c 20 69 6e 73 65 72 74 65 64 2c 20 6f 72 20 64  , inserted, or d
161d0 65 6c 65 74 65 64 0a 20 20 2a 2a 20 73 69 6e 63  eleted.  ** sinc
161e0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  e the database h
161f0 61 6e 64 6c 65 20 77 61 73 20 63 72 65 61 74 65  andle was create
16200 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  d..  */.  case D
16210 42 5f 54 4f 54 41 4c 5f 43 48 41 4e 47 45 53 3a  B_TOTAL_CHANGES:
16220 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a   {.    Tcl_Obj *
16230 70 52 65 73 75 6c 74 3b 0a 20 20 20 20 69 66 28  pResult;.    if(
16240 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
16250 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
16260 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
16270 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 72  jv, "");.      r
16280 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
16290 0a 20 20 20 20 7d 0a 20 20 20 20 70 52 65 73 75  .    }.    pResu
162a0 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52  lt = Tcl_GetObjR
162b0 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
162c0 20 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f 62 6a     Tcl_SetIntObj
162d0 28 70 52 65 73 75 6c 74 2c 20 73 71 6c 69 74 65  (pResult, sqlite
162e0 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28  3_total_changes(
162f0 70 44 62 2d 3e 64 62 29 29 3b 0a 20 20 20 20 62  pDb->db));.    b
16300 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  reak;.  }..  /* 
16310 20 20 20 24 64 62 20 74 72 61 63 65 20 3f 43 41     $db trace ?CA
16320 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a  LLBACK?.  **.  *
16330 2a 20 4d 61 6b 65 20 61 72 72 61 6e 67 65 6d 65  * Make arrangeme
16340 6e 74 73 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68  nts to invoke th
16350 65 20 43 41 4c 4c 42 41 43 4b 20 72 6f 75 74 69  e CALLBACK routi
16360 6e 65 20 66 6f 72 20 65 61 63 68 20 53 51 4c 20  ne for each SQL 
16370 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74  statement.  ** t
16380 68 61 74 20 69 73 20 65 78 65 63 75 74 65 64 2e  hat is executed.
16390 20 20 54 68 65 20 74 65 78 74 20 6f 66 20 74 68    The text of th
163a0 65 20 53 51 4c 20 69 73 20 61 70 70 65 6e 64 65  e SQL is appende
163b0 64 20 74 6f 20 43 41 4c 4c 42 41 43 4b 20 62 65  d to CALLBACK be
163c0 66 6f 72 65 0a 20 20 2a 2a 20 69 74 20 69 73 20  fore.  ** it is 
163d0 65 78 65 63 75 74 65 64 2e 0a 20 20 2a 2f 0a 20  executed..  */. 
163e0 20 63 61 73 65 20 44 42 5f 54 52 41 43 45 3a 20   case DB_TRACE: 
163f0 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33  {.    if( objc>3
16400 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
16410 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
16420 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41  p, 2, objv, "?CA
16430 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20  LLBACK?");.     
16440 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
16450 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  R;.    }else if(
16460 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20   objc==2 ){.    
16470 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63    if( pDb->zTrac
16480 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  e ){.        Tcl
16490 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
164a0 74 65 72 70 2c 20 70 44 62 2d 3e 7a 54 72 61 63  terp, pDb->zTrac
164b0 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  e, (char*)0);.  
164c0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
164d0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 72  .      char *zTr
164e0 61 63 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c  ace;.      int l
164f0 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44  en;.      if( pD
16500 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20 20  b->zTrace ){.   
16510 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44       Tcl_Free(pD
16520 62 2d 3e 7a 54 72 61 63 65 29 3b 0a 20 20 20 20  b->zTrace);.    
16530 20 20 7d 0a 20 20 20 20 20 20 7a 54 72 61 63 65    }.      zTrace
16540 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
16550 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
16560 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66   &len);.      if
16570 28 20 7a 54 72 61 63 65 20 26 26 20 6c 65 6e 3e  ( zTrace && len>
16580 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  0 ){.        pDb
16590 2d 3e 7a 54 72 61 63 65 20 3d 20 54 63 6c 5f 41  ->zTrace = Tcl_A
165a0 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b  lloc( len + 1 );
165b0 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
165c0 70 44 62 2d 3e 7a 54 72 61 63 65 2c 20 7a 54 72  pDb->zTrace, zTr
165d0 61 63 65 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20  ace, len+1);.   
165e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
165f0 20 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 3d 20    pDb->zTrace = 
16600 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 21  0;.      }.#if !
16610 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
16620 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 21 64  MIT_TRACE) && !d
16630 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
16640 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
16650 54 29 20 26 26 20 5c 0a 20 20 20 20 21 64 65 66  T) && \.    !def
16660 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
16670 5f 44 45 50 52 45 43 41 54 45 44 29 0a 20 20 20  _DEPRECATED).   
16680 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61     if( pDb->zTra
16690 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  ce ){.        pD
166a0 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65  b->interp = inte
166b0 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  rp;.        sqli
166c0 74 65 33 5f 74 72 61 63 65 28 70 44 62 2d 3e 64  te3_trace(pDb->d
166d0 62 2c 20 44 62 54 72 61 63 65 48 61 6e 64 6c 65  b, DbTraceHandle
166e0 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d  r, pDb);.      }
166f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
16700 6c 69 74 65 33 5f 74 72 61 63 65 28 70 44 62 2d  lite3_trace(pDb-
16710 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  >db, 0, 0);.    
16720 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
16730 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
16740 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 74 72 61  .  /*    $db tra
16750 63 65 5f 76 32 20 3f 43 41 4c 4c 42 41 43 4b 3f  ce_v2 ?CALLBACK?
16760 20 3f 4d 41 53 4b 3f 0a 20 20 2a 2a 0a 20 20 2a   ?MASK?.  **.  *
16770 2a 20 4d 61 6b 65 20 61 72 72 61 6e 67 65 6d 65  * Make arrangeme
16780 6e 74 73 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68  nts to invoke th
16790 65 20 43 41 4c 4c 42 41 43 4b 20 72 6f 75 74 69  e CALLBACK routi
167a0 6e 65 20 66 6f 72 20 65 61 63 68 20 74 72 61 63  ne for each trac
167b0 65 20 65 76 65 6e 74 0a 20 20 2a 2a 20 6d 61 74  e event.  ** mat
167c0 63 68 69 6e 67 20 74 68 65 20 6d 61 73 6b 20 74  ching the mask t
167d0 68 61 74 20 69 73 20 67 65 6e 65 72 61 74 65 64  hat is generated
167e0 2e 20 20 54 68 65 20 70 61 72 61 6d 65 74 65 72  .  The parameter
167f0 73 20 61 72 65 20 61 70 70 65 6e 64 65 64 20 74  s are appended t
16800 6f 0a 20 20 2a 2a 20 43 41 4c 4c 42 41 43 4b 20  o.  ** CALLBACK 
16810 62 65 66 6f 72 65 20 69 74 20 69 73 20 65 78 65  before it is exe
16820 63 75 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61  cuted..  */.  ca
16830 73 65 20 44 42 5f 54 52 41 43 45 5f 56 32 3a 20  se DB_TRACE_V2: 
16840 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 34  {.    if( objc>4
16850 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
16860 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
16870 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41  p, 2, objv, "?CA
16880 4c 4c 42 41 43 4b 3f 20 3f 4d 41 53 4b 3f 22 29  LLBACK? ?MASK?")
16890 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
168a0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65  CL_ERROR;.    }e
168b0 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20  lse if( objc==2 
168c0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  ){.      if( pDb
168d0 2d 3e 7a 54 72 61 63 65 56 32 20 29 7b 0a 20 20  ->zTraceV2 ){.  
168e0 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
168f0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
16900 44 62 2d 3e 7a 54 72 61 63 65 56 32 2c 20 28 63  Db->zTraceV2, (c
16910 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 7d  har*)0);.      }
16920 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16930 20 20 63 68 61 72 20 2a 7a 54 72 61 63 65 56 32    char *zTraceV2
16940 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b  ;.      int len;
16950 0a 20 20 20 20 20 20 54 63 6c 5f 57 69 64 65 49  .      Tcl_WideI
16960 6e 74 20 77 4d 61 73 6b 20 3d 20 30 3b 0a 20 20  nt wMask = 0;.  
16970 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20      if( objc==4 
16980 29 7b 0a 20 20 20 20 20 20 20 20 73 74 61 74 69  ){.        stati
16990 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 54 54  c const char *TT
169a0 59 50 45 5f 73 74 72 73 5b 5d 20 3d 20 7b 0a 20  YPE_strs[] = {. 
169b0 20 20 20 20 20 20 20 20 20 22 73 74 61 74 65 6d           "statem
169c0 65 6e 74 22 2c 20 22 70 72 6f 66 69 6c 65 22 2c  ent", "profile",
169d0 20 22 72 6f 77 22 2c 20 22 63 6c 6f 73 65 22 2c   "row", "close",
169e0 20 30 0a 20 20 20 20 20 20 20 20 7d 3b 0a 20 20   0.        };.  
169f0 20 20 20 20 20 20 65 6e 75 6d 20 54 54 59 50 45        enum TTYPE
16a00 5f 65 6e 75 6d 20 7b 0a 20 20 20 20 20 20 20 20  _enum {.        
16a10 20 20 54 54 59 50 45 5f 53 54 4d 54 2c 20 54 54    TTYPE_STMT, TT
16a20 59 50 45 5f 50 52 4f 46 49 4c 45 2c 20 54 54 59  YPE_PROFILE, TTY
16a30 50 45 5f 52 4f 57 2c 20 54 54 59 50 45 5f 43 4c  PE_ROW, TTYPE_CL
16a40 4f 53 45 0a 20 20 20 20 20 20 20 20 7d 3b 0a 20  OSE.        };. 
16a50 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20         int i;.  
16a60 20 20 20 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b        if( TCL_OK
16a70 21 3d 54 63 6c 5f 4c 69 73 74 4f 62 6a 4c 65 6e  !=Tcl_ListObjLen
16a80 67 74 68 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  gth(interp, objv
16a90 5b 33 5d 2c 20 26 6c 65 6e 29 20 29 7b 0a 20 20  [3], &len) ){.  
16aa0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
16ab0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
16ac0 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28    }.        for(
16ad0 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29  i=0; i<len; i++)
16ae0 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  {.          Tcl_
16af0 4f 62 6a 20 2a 70 4f 62 6a 3b 0a 20 20 20 20 20  Obj *pObj;.     
16b00 20 20 20 20 20 69 6e 74 20 74 74 79 70 65 3b 0a       int ttype;.
16b10 20 20 20 20 20 20 20 20 20 20 69 66 28 20 54 43            if( TC
16b20 4c 5f 4f 4b 21 3d 54 63 6c 5f 4c 69 73 74 4f 62  L_OK!=Tcl_ListOb
16b30 6a 49 6e 64 65 78 28 69 6e 74 65 72 70 2c 20 6f  jIndex(interp, o
16b40 62 6a 76 5b 33 5d 2c 20 69 2c 20 26 70 4f 62 6a  bjv[3], i, &pObj
16b50 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
16b60 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
16b70 52 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  R;.          }. 
16b80 20 20 20 20 20 20 20 20 20 69 66 28 20 54 63 6c           if( Tcl
16b90 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a  _GetIndexFromObj
16ba0 28 69 6e 74 65 72 70 2c 20 70 4f 62 6a 2c 20 54  (interp, pObj, T
16bb0 54 59 50 45 5f 73 74 72 73 2c 20 22 74 72 61 63  TYPE_strs, "trac
16bc0 65 20 74 79 70 65 22 2c 0a 20 20 20 20 20 20 20  e type",.       
16bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16be0 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 26 74             0, &t
16bf0 74 79 70 65 29 21 3d 54 43 4c 5f 4f 4b 20 29 7b  type)!=TCL_OK ){
16c00 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c  .            Tcl
16c10 5f 57 69 64 65 49 6e 74 20 77 54 79 70 65 3b 0a  _WideInt wType;.
16c20 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
16c30 4f 62 6a 20 2a 70 45 72 72 6f 72 20 3d 20 54 63  Obj *pError = Tc
16c40 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 54  l_DuplicateObj(T
16c50 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_GetObjResult(
16c60 69 6e 74 65 72 70 29 29 3b 0a 20 20 20 20 20 20  interp));.      
16c70 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65        Tcl_IncrRe
16c80 66 43 6f 75 6e 74 28 70 45 72 72 6f 72 29 3b 0a  fCount(pError);.
16c90 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
16ca0 54 43 4c 5f 4f 4b 3d 3d 54 63 6c 5f 47 65 74 57  TCL_OK==Tcl_GetW
16cb0 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  ideIntFromObj(in
16cc0 74 65 72 70 2c 20 70 4f 62 6a 2c 20 26 77 54 79  terp, pObj, &wTy
16cd0 70 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pe) ){.         
16ce0 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66       Tcl_DecrRef
16cf0 43 6f 75 6e 74 28 70 45 72 72 6f 72 29 3b 0a 20  Count(pError);. 
16d00 20 20 20 20 20 20 20 20 20 20 20 20 20 77 4d 61               wMa
16d10 73 6b 20 7c 3d 20 77 54 79 70 65 3b 0a 20 20 20  sk |= wType;.   
16d20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
16d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63                Tc
16d40 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
16d50 6e 74 65 72 70 2c 20 70 45 72 72 6f 72 29 3b 0a  nterp, pError);.
16d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63                Tc
16d70 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
16d80 45 72 72 6f 72 29 3b 0a 20 20 20 20 20 20 20 20  Error);.        
16d90 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
16da0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
16db0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
16dc0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
16dd0 20 20 20 73 77 69 74 63 68 28 20 28 65 6e 75 6d     switch( (enum
16de0 20 54 54 59 50 45 5f 65 6e 75 6d 29 74 74 79 70   TTYPE_enum)ttyp
16df0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
16e00 20 20 20 63 61 73 65 20 54 54 59 50 45 5f 53 54     case TTYPE_ST
16e10 4d 54 3a 20 20 20 20 77 4d 61 73 6b 20 7c 3d 20  MT:    wMask |= 
16e20 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 53 54 4d  SQLITE_TRACE_STM
16e30 54 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  T;    break;.   
16e40 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20             case 
16e50 54 54 59 50 45 5f 50 52 4f 46 49 4c 45 3a 20 77  TTYPE_PROFILE: w
16e60 4d 61 73 6b 20 7c 3d 20 53 51 4c 49 54 45 5f 54  Mask |= SQLITE_T
16e70 52 41 43 45 5f 50 52 4f 46 49 4c 45 3b 20 62 72  RACE_PROFILE; br
16e80 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
16e90 20 20 20 63 61 73 65 20 54 54 59 50 45 5f 52 4f     case TTYPE_RO
16ea0 57 3a 20 20 20 20 20 77 4d 61 73 6b 20 7c 3d 20  W:     wMask |= 
16eb0 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 52 4f 57  SQLITE_TRACE_ROW
16ec0 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
16ed0 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20             case 
16ee0 54 54 59 50 45 5f 43 4c 4f 53 45 3a 20 20 20 77  TTYPE_CLOSE:   w
16ef0 4d 61 73 6b 20 7c 3d 20 53 51 4c 49 54 45 5f 54  Mask |= SQLITE_T
16f00 52 41 43 45 5f 43 4c 4f 53 45 3b 20 20 20 62 72  RACE_CLOSE;   br
16f10 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
16f20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
16f30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
16f40 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 77 4d  else{.        wM
16f50 61 73 6b 20 3d 20 53 51 4c 49 54 45 5f 54 52 41  ask = SQLITE_TRA
16f60 43 45 5f 53 54 4d 54 3b 20 2f 2a 20 75 73 65 20  CE_STMT; /* use 
16f70 74 68 65 20 22 6c 65 67 61 63 79 22 20 64 65 66  the "legacy" def
16f80 61 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  ault */.      }.
16f90 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
16fa0 54 72 61 63 65 56 32 20 29 7b 0a 20 20 20 20 20  TraceV2 ){.     
16fb0 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d     Tcl_Free(pDb-
16fc0 3e 7a 54 72 61 63 65 56 32 29 3b 0a 20 20 20 20  >zTraceV2);.    
16fd0 20 20 7d 0a 20 20 20 20 20 20 7a 54 72 61 63 65    }.      zTrace
16fe0 56 32 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  V2 = Tcl_GetStri
16ff0 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
17000 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20  ], &len);.      
17010 69 66 28 20 7a 54 72 61 63 65 56 32 20 26 26 20  if( zTraceV2 && 
17020 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  len>0 ){.       
17030 20 70 44 62 2d 3e 7a 54 72 61 63 65 56 32 20 3d   pDb->zTraceV2 =
17040 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20   Tcl_Alloc( len 
17050 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d  + 1 );.        m
17060 65 6d 63 70 79 28 70 44 62 2d 3e 7a 54 72 61 63  emcpy(pDb->zTrac
17070 65 56 32 2c 20 7a 54 72 61 63 65 56 32 2c 20 6c  eV2, zTraceV2, l
17080 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c  en+1);.      }el
17090 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d  se{.        pDb-
170a0 3e 7a 54 72 61 63 65 56 32 20 3d 20 30 3b 0a 20  >zTraceV2 = 0;. 
170b0 20 20 20 20 20 7d 0a 23 69 66 20 21 64 65 66 69       }.#if !defi
170c0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
170d0 54 52 41 43 45 29 20 26 26 20 21 64 65 66 69 6e  TRACE) && !defin
170e0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ed(SQLITE_OMIT_F
170f0 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20  LOATING_POINT). 
17100 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 54       if( pDb->zT
17110 72 61 63 65 56 32 20 29 7b 0a 20 20 20 20 20 20  raceV2 ){.      
17120 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20    pDb->interp = 
17130 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20  interp;.        
17140 73 71 6c 69 74 65 33 5f 74 72 61 63 65 5f 76 32  sqlite3_trace_v2
17150 28 70 44 62 2d 3e 64 62 2c 20 28 75 6e 73 69 67  (pDb->db, (unsig
17160 6e 65 64 29 77 4d 61 73 6b 2c 20 44 62 54 72 61  ned)wMask, DbTra
17170 63 65 56 32 48 61 6e 64 6c 65 72 2c 20 70 44 62  ceV2Handler, pDb
17180 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
17190 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
171a0 74 72 61 63 65 5f 76 32 28 70 44 62 2d 3e 64 62  trace_v2(pDb->db
171b0 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
171c0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
171d0 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
171e0 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 74 72 61  .  /*    $db tra
171f0 6e 73 61 63 74 69 6f 6e 20 5b 2d 64 65 66 65 72  nsaction [-defer
17200 72 65 64 7c 2d 69 6d 6d 65 64 69 61 74 65 7c 2d  red|-immediate|-
17210 65 78 63 6c 75 73 69 76 65 5d 20 53 43 52 49 50  exclusive] SCRIP
17220 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 74 61 72  T.  **.  ** Star
17230 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74  t a new transact
17240 69 6f 6e 20 28 69 66 20 77 65 20 61 72 65 20 6e  ion (if we are n
17250 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  ot already in th
17260 65 20 6d 69 64 73 74 20 6f 66 20 61 0a 20 20 2a  e midst of a.  *
17270 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 20 61  * transaction) a
17280 6e 64 20 65 78 65 63 75 74 65 20 74 68 65 20 54  nd execute the T
17290 43 4c 20 73 63 72 69 70 74 20 53 43 52 49 50 54  CL script SCRIPT
172a0 2e 20 20 41 66 74 65 72 20 53 43 52 49 50 54 0a  .  After SCRIPT.
172b0 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 73 2c 20    ** completes, 
172c0 65 69 74 68 65 72 20 63 6f 6d 6d 69 74 20 74 68  either commit th
172d0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72  e transaction or
172e0 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 69 66   roll it back if
172f0 20 53 43 52 49 50 54 0a 20 20 2a 2a 20 74 68 72   SCRIPT.  ** thr
17300 6f 77 73 20 61 6e 20 65 78 63 65 70 74 69 6f 6e  ows an exception
17310 2e 20 20 4f 72 20 69 66 20 6e 6f 20 6e 65 77 20  .  Or if no new 
17320 74 72 61 6e 73 61 74 69 6f 6e 20 77 61 73 20 73  transation was s
17330 74 61 72 74 65 64 2c 20 64 6f 20 6e 6f 74 68 69  tarted, do nothi
17340 6e 67 2e 0a 20 20 2a 2a 20 70 61 73 73 20 74 68  ng..  ** pass th
17350 65 20 65 78 63 65 70 74 69 6f 6e 20 6f 6e 20 75  e exception on u
17360 70 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 2a  p the stack..  *
17370 2a 0a 20 20 2a 2a 20 54 68 69 73 20 63 6f 6d 6d  *.  ** This comm
17380 61 6e 64 20 77 61 73 20 69 6e 73 70 69 72 65 64  and was inspired
17390 20 62 79 20 44 61 76 65 20 54 68 6f 6d 61 73 27   by Dave Thomas'
173a0 73 20 74 61 6c 6b 20 6f 6e 20 52 75 62 79 20 61  s talk on Ruby a
173b0 74 20 74 68 65 0a 20 20 2a 2a 20 32 30 30 35 20  t the.  ** 2005 
173c0 4f 27 52 65 69 6c 6c 79 20 4f 70 65 6e 20 53 6f  O'Reilly Open So
173d0 75 72 63 65 20 43 6f 6e 76 65 6e 74 69 6f 6e 20  urce Convention 
173e0 28 4f 53 43 4f 4e 29 2e 0a 20 20 2a 2f 0a 20 20  (OSCON)..  */.  
173f0 63 61 73 65 20 44 42 5f 54 52 41 4e 53 41 43 54  case DB_TRANSACT
17400 49 4f 4e 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f  ION: {.    Tcl_O
17410 62 6a 20 2a 70 53 63 72 69 70 74 3b 0a 20 20 20  bj *pScript;.   
17420 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 65   const char *zBe
17430 67 69 6e 20 3d 20 22 53 41 56 45 50 4f 49 4e 54  gin = "SAVEPOINT
17440 20 5f 74 63 6c 5f 74 72 61 6e 73 61 63 74 69 6f   _tcl_transactio
17450 6e 22 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  n";.    if( objc
17460 21 3d 33 20 26 26 20 6f 62 6a 63 21 3d 34 20 29  !=3 && objc!=4 )
17470 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
17480 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
17490 20 32 2c 20 6f 62 6a 76 2c 20 22 5b 54 59 50 45   2, objv, "[TYPE
174a0 5d 20 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20  ] SCRIPT");.    
174b0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
174c0 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  OR;.    }..    i
174d0 66 28 20 70 44 62 2d 3e 6e 54 72 61 6e 73 61 63  f( pDb->nTransac
174e0 74 69 6f 6e 3d 3d 30 20 26 26 20 6f 62 6a 63 3d  tion==0 && objc=
174f0 3d 34 20 29 7b 0a 20 20 20 20 20 20 73 74 61 74  =4 ){.      stat
17500 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 54  ic const char *T
17510 54 59 50 45 5f 73 74 72 73 5b 5d 20 3d 20 7b 0a  TYPE_strs[] = {.
17520 20 20 20 20 20 20 20 20 22 64 65 66 65 72 72 65          "deferre
17530 64 22 2c 20 20 20 22 65 78 63 6c 75 73 69 76 65  d",   "exclusive
17540 22 2c 20 20 22 69 6d 6d 65 64 69 61 74 65 22 2c  ",  "immediate",
17550 20 30 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20   0.      };.    
17560 20 20 65 6e 75 6d 20 54 54 59 50 45 5f 65 6e 75    enum TTYPE_enu
17570 6d 20 7b 0a 20 20 20 20 20 20 20 20 54 54 59 50  m {.        TTYP
17580 45 5f 44 45 46 45 52 52 45 44 2c 20 54 54 59 50  E_DEFERRED, TTYP
17590 45 5f 45 58 43 4c 55 53 49 56 45 2c 20 54 54 59  E_EXCLUSIVE, TTY
175a0 50 45 5f 49 4d 4d 45 44 49 41 54 45 0a 20 20 20  PE_IMMEDIATE.   
175b0 20 20 20 7d 3b 0a 20 20 20 20 20 20 69 6e 74 20     };.      int 
175c0 74 74 79 70 65 3b 0a 20 20 20 20 20 20 69 66 28  ttype;.      if(
175d0 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f   Tcl_GetIndexFro
175e0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
175f0 76 5b 32 5d 2c 20 54 54 59 50 45 5f 73 74 72 73  v[2], TTYPE_strs
17600 2c 20 22 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  , "transaction t
17610 79 70 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ype",.          
17620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17630 20 20 20 20 30 2c 20 26 74 74 79 70 65 29 20 29      0, &ttype) )
17640 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
17650 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
17660 20 20 7d 0a 20 20 20 20 20 20 73 77 69 74 63 68    }.      switch
17670 28 20 28 65 6e 75 6d 20 54 54 59 50 45 5f 65 6e  ( (enum TTYPE_en
17680 75 6d 29 74 74 79 70 65 20 29 7b 0a 20 20 20 20  um)ttype ){.    
17690 20 20 20 20 63 61 73 65 20 54 54 59 50 45 5f 44      case TTYPE_D
176a0 45 46 45 52 52 45 44 3a 20 20 20 20 2f 2a 20 6e  EFERRED:    /* n
176b0 6f 2d 6f 70 20 2a 2f 3b 20 20 20 20 20 20 20 20  o-op */;        
176c0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
176d0 20 20 20 20 20 20 20 20 63 61 73 65 20 54 54 59          case TTY
176e0 50 45 5f 45 58 43 4c 55 53 49 56 45 3a 20 20 20  PE_EXCLUSIVE:   
176f0 7a 42 65 67 69 6e 20 3d 20 22 42 45 47 49 4e 20  zBegin = "BEGIN 
17700 45 58 43 4c 55 53 49 56 45 22 3b 20 20 62 72 65  EXCLUSIVE";  bre
17710 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
17720 20 54 54 59 50 45 5f 49 4d 4d 45 44 49 41 54 45   TTYPE_IMMEDIATE
17730 3a 20 20 20 7a 42 65 67 69 6e 20 3d 20 22 42 45  :   zBegin = "BE
17740 47 49 4e 20 49 4d 4d 45 44 49 41 54 45 22 3b 20  GIN IMMEDIATE"; 
17750 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
17760 20 20 20 20 7d 0a 20 20 20 20 70 53 63 72 69 70      }.    pScrip
17770 74 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d  t = objv[objc-1]
17780 3b 0a 0a 20 20 20 20 2f 2a 20 52 75 6e 20 74 68  ;..    /* Run th
17790 65 20 53 51 4c 69 74 65 20 42 45 47 49 4e 20 63  e SQLite BEGIN c
177a0 6f 6d 6d 61 6e 64 20 74 6f 20 6f 70 65 6e 20 61  ommand to open a
177b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20   transaction or 
177c0 73 61 76 65 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20  savepoint. */.  
177d0 20 20 70 44 62 2d 3e 64 69 73 61 62 6c 65 41 75    pDb->disableAu
177e0 74 68 2b 2b 3b 0a 20 20 20 20 72 63 20 3d 20 73  th++;.    rc = s
177f0 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d  qlite3_exec(pDb-
17800 3e 64 62 2c 20 7a 42 65 67 69 6e 2c 20 30 2c 20  >db, zBegin, 0, 
17810 30 2c 20 30 29 3b 0a 20 20 20 20 70 44 62 2d 3e  0, 0);.    pDb->
17820 64 69 73 61 62 6c 65 41 75 74 68 2d 2d 3b 0a 20  disableAuth--;. 
17830 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
17840 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54 63  E_OK ){.      Tc
17850 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
17860 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 5f 65  nterp, sqlite3_e
17870 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20  rrmsg(pDb->db), 
17880 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
17890 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
178a0 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 62  R;.    }.    pDb
178b0 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b  ->nTransaction++
178c0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 75 73 69  ;..    /* If usi
178d0 6e 67 20 4e 52 45 2c 20 73 63 68 65 64 75 6c 65  ng NRE, schedule
178e0 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 69   a callback to i
178f0 6e 76 6f 6b 65 20 74 68 65 20 73 63 72 69 70 74  nvoke the script
17900 20 70 53 63 72 69 70 74 2c 20 74 68 65 6e 0a 20   pScript, then. 
17910 20 20 20 2a 2a 20 61 20 73 65 63 6f 6e 64 20 63     ** a second c
17920 61 6c 6c 62 61 63 6b 20 74 6f 20 63 6f 6d 6d 69  allback to commi
17930 74 20 28 6f 72 20 72 6f 6c 6c 62 61 63 6b 29 20  t (or rollback) 
17940 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
17950 6f 72 20 73 61 76 65 70 6f 69 6e 74 0a 20 20 20  or savepoint.   
17960 20 2a 2a 20 6f 70 65 6e 65 64 20 61 62 6f 76 65   ** opened above
17970 2e 20 49 66 20 6e 6f 74 20 75 73 69 6e 67 20 4e  . If not using N
17980 52 45 2c 20 65 76 61 6c 75 61 74 65 20 74 68 65  RE, evaluate the
17990 20 73 63 72 69 70 74 20 64 69 72 65 63 74 6c 79   script directly
179a0 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 63 61  , then.    ** ca
179b0 6c 6c 20 66 75 6e 63 74 69 6f 6e 20 44 62 54 72  ll function DbTr
179c0 61 6e 73 50 6f 73 74 43 6d 64 28 29 20 74 6f 20  ansPostCmd() to 
179d0 63 6f 6d 6d 69 74 20 28 6f 72 20 72 6f 6c 6c 62  commit (or rollb
179e0 61 63 6b 29 20 74 68 65 20 74 72 61 6e 73 61 63  ack) the transac
179f0 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6f 72 20 73  tion.    ** or s
17a00 61 76 65 70 6f 69 6e 74 2e 20 20 2a 2f 0a 20 20  avepoint.  */.  
17a10 20 20 69 66 28 20 44 62 55 73 65 4e 72 65 28 29    if( DbUseNre()
17a20 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 4e 52   ){.      Tcl_NR
17a30 41 64 64 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65  AddCallback(inte
17a40 72 70 2c 20 44 62 54 72 61 6e 73 50 6f 73 74 43  rp, DbTransPostC
17a50 6d 64 2c 20 63 64 2c 20 30 2c 20 30 2c 20 30 29  md, cd, 0, 0, 0)
17a60 3b 0a 20 20 20 20 20 20 28 76 6f 69 64 29 54 63  ;.      (void)Tc
17a70 6c 5f 4e 52 45 76 61 6c 4f 62 6a 28 69 6e 74 65  l_NREvalObj(inte
17a80 72 70 2c 20 70 53 63 72 69 70 74 2c 20 30 29 3b  rp, pScript, 0);
17a90 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
17aa0 20 20 72 63 20 3d 20 44 62 54 72 61 6e 73 50 6f    rc = DbTransPo
17ab0 73 74 43 6d 64 28 26 63 64 2c 20 69 6e 74 65 72  stCmd(&cd, inter
17ac0 70 2c 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78  p, Tcl_EvalObjEx
17ad0 28 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74  (interp, pScript
17ae0 2c 20 30 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  , 0));.    }.   
17af0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
17b00 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 75 6e  *.  **    $db un
17b10 6c 6f 63 6b 5f 6e 6f 74 69 66 79 20 3f 73 63 72  lock_notify ?scr
17b20 69 70 74 3f 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ipt?.  */.  case
17b30 20 44 42 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46   DB_UNLOCK_NOTIF
17b40 59 3a 20 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  Y: {.#ifndef SQL
17b50 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43  ITE_ENABLE_UNLOC
17b60 4b 5f 4e 4f 54 49 46 59 0a 20 20 20 20 54 63 6c  K_NOTIFY.    Tcl
17b70 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
17b80 74 65 72 70 2c 20 22 75 6e 6c 6f 63 6b 5f 6e 6f  terp, "unlock_no
17b90 74 69 66 79 20 6e 6f 74 20 61 76 61 69 6c 61 62  tify not availab
17ba0 6c 65 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64  le in this build
17bb0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
17bc0 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 30          (char*)0
17bd0 29 3b 0a 20 20 20 20 72 63 20 3d 20 54 43 4c 5f  );.    rc = TCL_
17be0 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 20  ERROR;.#else.   
17bf0 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 26 26 20   if( objc!=2 && 
17c00 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20  objc!=3 ){.     
17c10 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
17c20 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
17c30 76 2c 20 22 3f 53 43 52 49 50 54 3f 22 29 3b 0a  v, "?SCRIPT?");.
17c40 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45        rc = TCL_E
17c50 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  RROR;.    }else{
17c60 0a 20 20 20 20 20 20 76 6f 69 64 20 28 2a 78 4e  .      void (*xN
17c70 6f 74 69 66 79 29 28 76 6f 69 64 20 2a 2a 2c 20  otify)(void **, 
17c80 69 6e 74 29 20 3d 20 30 3b 0a 20 20 20 20 20 20  int) = 0;.      
17c90 76 6f 69 64 20 2a 70 4e 6f 74 69 66 79 41 72 67  void *pNotifyArg
17ca0 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69 66 28   = 0;..      if(
17cb0 20 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74   pDb->pUnlockNot
17cc0 69 66 79 20 29 7b 0a 20 20 20 20 20 20 20 20 54  ify ){.        T
17cd0 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
17ce0 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69  pDb->pUnlockNoti
17cf0 66 79 29 3b 0a 20 20 20 20 20 20 20 20 70 44 62  fy);.        pDb
17d00 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 20  ->pUnlockNotify 
17d10 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  = 0;.      }..  
17d20 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20      if( objc==3 
17d30 29 7b 0a 20 20 20 20 20 20 20 20 78 4e 6f 74 69  ){.        xNoti
17d40 66 79 20 3d 20 44 62 55 6e 6c 6f 63 6b 4e 6f 74  fy = DbUnlockNot
17d50 69 66 79 3b 0a 20 20 20 20 20 20 20 20 70 4e 6f  ify;.        pNo
17d60 74 69 66 79 41 72 67 20 3d 20 28 76 6f 69 64 20  tifyArg = (void 
17d70 2a 29 70 44 62 3b 0a 20 20 20 20 20 20 20 20 70  *)pDb;.        p
17d80 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66  Db->pUnlockNotif
17d90 79 20 3d 20 6f 62 6a 76 5b 32 5d 3b 0a 20 20 20  y = objv[2];.   
17da0 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66       Tcl_IncrRef
17db0 43 6f 75 6e 74 28 70 44 62 2d 3e 70 55 6e 6c 6f  Count(pDb->pUnlo
17dc0 63 6b 4e 6f 74 69 66 79 29 3b 0a 20 20 20 20 20  ckNotify);.     
17dd0 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 73 71   }..      if( sq
17de0 6c 69 74 65 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74  lite3_unlock_not
17df0 69 66 79 28 70 44 62 2d 3e 64 62 2c 20 78 4e 6f  ify(pDb->db, xNo
17e00 74 69 66 79 2c 20 70 4e 6f 74 69 66 79 41 72 67  tify, pNotifyArg
17e10 29 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  ) ){.        Tcl
17e20 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
17e30 74 65 72 70 2c 20 73 71 6c 69 74 65 33 5f 65 72  terp, sqlite3_er
17e40 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 28  rmsg(pDb->db), (
17e50 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
17e60 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52    rc = TCL_ERROR
17e70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
17e80 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b  #endif.    break
17e90 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
17ea0 20 20 20 20 24 64 62 20 70 72 65 75 70 64 61 74      $db preupdat
17eb0 65 5f 68 6f 6f 6b 20 63 6f 75 6e 74 0a 20 20 2a  e_hook count.  *
17ec0 2a 20 20 20 20 24 64 62 20 70 72 65 75 70 64 61  *    $db preupda
17ed0 74 65 5f 68 6f 6f 6b 20 68 6f 6f 6b 20 3f 53 43  te_hook hook ?SC
17ee0 52 49 50 54 3f 0a 20 20 2a 2a 20 20 20 20 24 64  RIPT?.  **    $d
17ef0 62 20 70 72 65 75 70 64 61 74 65 5f 68 6f 6f 6b  b preupdate_hook
17f00 20 6e 65 77 20 49 4e 44 45 58 0a 20 20 2a 2a 20   new INDEX.  ** 
17f10 20 20 20 24 64 62 20 70 72 65 75 70 64 61 74 65     $db preupdate
17f20 5f 68 6f 6f 6b 20 6f 6c 64 20 49 4e 44 45 58 0a  _hook old INDEX.
17f30 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 50    */.  case DB_P
17f40 52 45 55 50 44 41 54 45 3a 20 7b 0a 23 69 66 6e  REUPDATE: {.#ifn
17f50 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
17f60 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b  E_PREUPDATE_HOOK
17f70 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
17f80 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 70  esult(interp, "p
17f90 72 65 75 70 64 61 74 65 5f 68 6f 6f 6b 20 77 61  reupdate_hook wa
17fa0 73 20 6f 6d 69 74 74 65 64 20 61 74 20 63 6f 6d  s omitted at com
17fb0 70 69 6c 65 2d 74 69 6d 65 22 2c 20 0a 20 20 20  pile-time", .   
17fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fd0 20 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20    (char*)0);.   
17fe0 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b   rc = TCL_ERROR;
17ff0 0a 23 65 6c 73 65 0a 20 20 20 20 73 74 61 74 69  .#else.    stati
18000 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a  c const char *az
18010 53 75 62 5b 5d 20 3d 20 7b 22 63 6f 75 6e 74 22  Sub[] = {"count"
18020 2c 20 22 64 65 70 74 68 22 2c 20 22 68 6f 6f 6b  , "depth", "hook
18030 22 2c 20 22 6e 65 77 22 2c 20 22 6f 6c 64 22 2c  ", "new", "old",
18040 20 30 7d 3b 0a 20 20 20 20 65 6e 75 6d 20 44 62   0};.    enum Db
18050 50 72 65 75 70 64 61 74 65 53 75 62 43 6d 64 20  PreupdateSubCmd 
18060 7b 0a 20 20 20 20 20 20 50 52 45 5f 43 4f 55 4e  {.      PRE_COUN
18070 54 2c 20 50 52 45 5f 44 45 50 54 48 2c 20 50 52  T, PRE_DEPTH, PR
18080 45 5f 48 4f 4f 4b 2c 20 50 52 45 5f 4e 45 57 2c  E_HOOK, PRE_NEW,
18090 20 50 52 45 5f 4f 4c 44 0a 20 20 20 20 7d 3b 0a   PRE_OLD.    };.
180a0 20 20 20 20 69 6e 74 20 69 53 75 62 3b 0a 0a 20      int iSub;.. 
180b0 20 20 20 69 66 28 20 6f 62 6a 63 3c 33 20 29 7b     if( objc<3 ){
180c0 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
180d0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
180e0 32 2c 20 6f 62 6a 76 2c 20 22 53 55 42 2d 43 4f  2, objv, "SUB-CO
180f0 4d 4d 41 4e 44 20 3f 41 52 47 53 3f 22 29 3b 0a  MMAND ?ARGS?");.
18100 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 54 63      }.    if( Tc
18110 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62  l_GetIndexFromOb
18120 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
18130 5d 2c 20 61 7a 53 75 62 2c 20 22 73 75 62 2d 63  ], azSub, "sub-c
18140 6f 6d 6d 61 6e 64 22 2c 20 30 2c 20 26 69 53 75  ommand", 0, &iSu
18150 62 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  b) ){.      retu
18160 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
18170 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 28    }..    switch(
18180 20 28 65 6e 75 6d 20 44 62 50 72 65 75 70 64 61   (enum DbPreupda
18190 74 65 53 75 62 43 6d 64 29 69 53 75 62 20 29 7b  teSubCmd)iSub ){
181a0 0a 20 20 20 20 20 20 63 61 73 65 20 50 52 45 5f  .      case PRE_
181b0 43 4f 55 4e 54 3a 20 7b 0a 20 20 20 20 20 20 20  COUNT: {.       
181c0 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 73 71 6c 69   int nCol = sqli
181d0 74 65 33 5f 70 72 65 75 70 64 61 74 65 5f 63 6f  te3_preupdate_co
181e0 75 6e 74 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20  unt(pDb->db);.  
181f0 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a        Tcl_SetObj
18200 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
18210 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 43 6f  cl_NewIntObj(nCo
18220 6c 29 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  l));.        bre
18230 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ak;.      }..   
18240 20 20 20 63 61 73 65 20 50 52 45 5f 48 4f 4f 4b     case PRE_HOOK
18250 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  : {.        if( 
18260 6f 62 6a 63 3e 34 20 29 7b 0a 20 20 20 20 20 20  objc>4 ){.      
18270 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
18280 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
18290 6f 62 6a 76 2c 20 22 68 6f 6f 6b 20 3f 53 43 52  objv, "hook ?SCR
182a0 49 50 54 3f 22 29 3b 0a 20 20 20 20 20 20 20 20  IPT?");.        
182b0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
182c0 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OR;.        }.  
182d0 20 20 20 20 20 20 44 62 48 6f 6f 6b 43 6d 64 28        DbHookCmd(
182e0 69 6e 74 65 72 70 2c 20 70 44 62 2c 20 28 6f 62  interp, pDb, (ob
182f0 6a 63 3d 3d 34 20 3f 20 6f 62 6a 76 5b 33 5d 20  jc==4 ? objv[3] 
18300 3a 20 30 29 2c 20 26 70 44 62 2d 3e 70 50 72 65  : 0), &pDb->pPre
18310 55 70 64 61 74 65 48 6f 6f 6b 29 3b 0a 20 20 20  UpdateHook);.   
18320 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
18330 20 20 7d 0a 0a 20 20 20 20 20 20 63 61 73 65 20    }..      case 
18340 50 52 45 5f 44 45 50 54 48 3a 20 7b 0a 20 20 20  PRE_DEPTH: {.   
18350 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52       Tcl_Obj *pR
18360 65 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  et;.        if( 
18370 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20  objc!=3 ){.     
18380 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
18390 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 33 2c  mArgs(interp, 3,
183a0 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20   objv, "");.    
183b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
183c0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
183d0 7d 0a 20 20 20 20 20 20 20 20 70 52 65 74 20 3d  }.        pRet =
183e0 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73   Tcl_NewIntObj(s
183f0 71 6c 69 74 65 33 5f 70 72 65 75 70 64 61 74 65  qlite3_preupdate
18400 5f 64 65 70 74 68 28 70 44 62 2d 3e 64 62 29 29  _depth(pDb->db))
18410 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65  ;.        Tcl_Se
18420 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
18430 70 2c 20 70 52 65 74 29 3b 0a 20 20 20 20 20 20  p, pRet);.      
18440 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
18450 0a 0a 20 20 20 20 20 20 63 61 73 65 20 50 52 45  ..      case PRE
18460 5f 4e 45 57 3a 0a 20 20 20 20 20 20 63 61 73 65  _NEW:.      case
18470 20 50 52 45 5f 4f 4c 44 3a 20 7b 0a 20 20 20 20   PRE_OLD: {.    
18480 20 20 20 20 69 6e 74 20 69 49 64 78 3b 0a 20 20      int iIdx;.  
18490 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61        sqlite3_va
184a0 6c 75 65 20 2a 70 56 61 6c 75 65 3b 0a 20 20 20  lue *pValue;.   
184b0 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 34       if( objc!=4
184c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63   ){.          Tc
184d0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
184e0 6e 74 65 72 70 2c 20 33 2c 20 6f 62 6a 76 2c 20  nterp, 3, objv, 
184f0 22 49 4e 44 45 58 22 29 3b 0a 20 20 20 20 20 20  "INDEX");.      
18500 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
18510 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a  RROR;.        }.
18520 20 20 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f          if( Tcl_
18530 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
18540 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  terp, objv[3], &
18550 69 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20 20  iIdx) ){.       
18560 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
18570 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  ROR;.        }..
18580 20 20 20 20 20 20 20 20 69 66 28 20 69 53 75 62          if( iSub
18590 3d 3d 50 52 45 5f 4f 4c 44 20 29 7b 0a 20 20 20  ==PRE_OLD ){.   
185a0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
185b0 74 65 33 5f 70 72 65 75 70 64 61 74 65 5f 6f 6c  te3_preupdate_ol
185c0 64 28 70 44 62 2d 3e 64 62 2c 20 69 49 64 78 2c  d(pDb->db, iIdx,
185d0 20 26 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 20   &pValue);.     
185e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
185f0 20 20 20 20 61 73 73 65 72 74 28 20 69 53 75 62      assert( iSub
18600 3d 3d 50 52 45 5f 4e 45 57 20 29 3b 0a 20 20 20  ==PRE_NEW );.   
18610 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
18620 74 65 33 5f 70 72 65 75 70 64 61 74 65 5f 6e 65  te3_preupdate_ne
18630 77 28 70 44 62 2d 3e 64 62 2c 20 69 49 64 78 2c  w(pDb->db, iIdx,
18640 20 26 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 20   &pValue);.     
18650 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66     }..        if
18660 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18670 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  ){.          Tcl
18680 5f 4f 62 6a 20 2a 70 4f 62 6a 3b 0a 20 20 20 20  _Obj *pObj;.    
18690 20 20 20 20 20 20 70 4f 62 6a 20 3d 20 54 63 6c        pObj = Tcl
186a0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63  _NewStringObj((c
186b0 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
186c0 75 65 5f 74 65 78 74 28 70 56 61 6c 75 65 29 2c  ue_text(pValue),
186d0 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20   -1);.          
186e0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
186f0 28 69 6e 74 65 72 70 2c 20 70 4f 62 6a 29 3b 0a  (interp, pObj);.
18700 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
18710 20 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70           Tcl_App
18720 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
18730 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
18740 28 70 44 62 2d 3e 64 62 29 2c 20 28 63 68 61 72  (pDb->db), (char
18750 2a 29 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  *)0);.          
18760 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
18770 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
18780 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
18790 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
187a0 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b  E_PREUPDATE_HOOK
187b0 20 2a 2f 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20   */.    break;. 
187c0 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
187d0 20 24 64 62 20 77 61 6c 5f 68 6f 6f 6b 20 3f 73   $db wal_hook ?s
187e0 63 72 69 70 74 3f 0a 20 20 2a 2a 20 20 20 20 24  cript?.  **    $
187f0 64 62 20 75 70 64 61 74 65 5f 68 6f 6f 6b 20 3f  db update_hook ?
18800 73 63 72 69 70 74 3f 0a 20 20 2a 2a 20 20 20 20  script?.  **    
18810 24 64 62 20 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f  $db rollback_hoo
18820 6b 20 3f 73 63 72 69 70 74 3f 0a 20 20 2a 2f 0a  k ?script?.  */.
18830 20 20 63 61 73 65 20 44 42 5f 57 41 4c 5f 48 4f    case DB_WAL_HO
18840 4f 4b 3a 0a 20 20 63 61 73 65 20 44 42 5f 55 50  OK:.  case DB_UP
18850 44 41 54 45 5f 48 4f 4f 4b 3a 0a 20 20 63 61 73  DATE_HOOK:.  cas
18860 65 20 44 42 5f 52 4f 4c 4c 42 41 43 4b 5f 48 4f  e DB_ROLLBACK_HO
18870 4f 4b 3a 20 7b 0a 20 20 20 20 2f 2a 20 73 65 74  OK: {.    /* set
18880 20 70 70 48 6f 6f 6b 20 74 6f 20 70 6f 69 6e 74   ppHook to point
18890 20 61 74 20 70 55 70 64 61 74 65 48 6f 6f 6b 20   at pUpdateHook 
188a0 6f 72 20 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b  or pRollbackHook
188b0 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 0a 20  , depending on. 
188c0 20 20 20 2a 2a 20 77 68 65 74 68 65 72 20 5b 24     ** whether [$
188d0 64 62 20 75 70 64 61 74 65 5f 68 6f 6f 6b 5d 20  db update_hook] 
188e0 6f 72 20 5b 24 64 62 20 72 6f 6c 6c 62 61 63 6b  or [$db rollback
188f0 5f 68 6f 6f 6b 5d 20 77 61 73 20 69 6e 76 6f 6b  _hook] was invok
18900 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 54  ed..    */.    T
18910 63 6c 5f 4f 62 6a 20 2a 2a 70 70 48 6f 6f 6b 20  cl_Obj **ppHook 
18920 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 63 68 6f  = 0;.    if( cho
18930 69 63 65 3d 3d 44 42 5f 57 41 4c 5f 48 4f 4f 4b  ice==DB_WAL_HOOK
18940 20 29 20 70 70 48 6f 6f 6b 20 3d 20 26 70 44 62   ) ppHook = &pDb
18950 2d 3e 70 57 61 6c 48 6f 6f 6b 3b 0a 20 20 20 20  ->pWalHook;.    
18960 69 66 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f 55  if( choice==DB_U
18970 50 44 41 54 45 5f 48 4f 4f 4b 20 29 20 70 70 48  PDATE_HOOK ) ppH
18980 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e 70 55 70 64  ook = &pDb->pUpd
18990 61 74 65 48 6f 6f 6b 3b 0a 20 20 20 20 69 66 28  ateHook;.    if(
189a0 20 63 68 6f 69 63 65 3d 3d 44 42 5f 52 4f 4c 4c   choice==DB_ROLL
189b0 42 41 43 4b 5f 48 4f 4f 4b 20 29 20 70 70 48 6f  BACK_HOOK ) ppHo
189c0 6f 6b 20 3d 20 26 70 44 62 2d 3e 70 52 6f 6c 6c  ok = &pDb->pRoll
189d0 62 61 63 6b 48 6f 6f 6b 3b 0a 20 20 20 20 69 66  backHook;.    if
189e0 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20  ( objc>3 ){.    
189f0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
18a00 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
18a10 62 6a 76 2c 20 22 3f 53 43 52 49 50 54 3f 22 29  bjv, "?SCRIPT?")
18a20 3b 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  ;.       return 
18a30 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
18a40 0a 0a 20 20 20 20 44 62 48 6f 6f 6b 43 6d 64 28  ..    DbHookCmd(
18a50 69 6e 74 65 72 70 2c 20 70 44 62 2c 20 28 6f 62  interp, pDb, (ob
18a60 6a 63 3d 3d 33 20 3f 20 6f 62 6a 76 5b 32 5d 20  jc==3 ? objv[2] 
18a70 3a 20 30 29 2c 20 70 70 48 6f 6f 6b 29 3b 0a 20  : 0), ppHook);. 
18a80 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
18a90 20 2f 2a 20 20 20 20 24 64 62 20 76 65 72 73 69   /*    $db versi
18aa0 6f 6e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74  on.  **.  ** Ret
18ab0 75 72 6e 20 74 68 65 20 76 65 72 73 69 6f 6e 20  urn the version 
18ac0 73 74 72 69 6e 67 20 66 6f 72 20 74 68 69 73 20  string for this 
18ad0 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20  database..  */. 
18ae0 20 63 61 73 65 20 44 42 5f 56 45 52 53 49 4f 4e   case DB_VERSION
18af0 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52  : {.    Tcl_SetR
18b00 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
18b10 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6c 69  har *)sqlite3_li
18b20 62 76 65 72 73 69 6f 6e 28 29 2c 20 54 43 4c 5f  bversion(), TCL_
18b30 53 54 41 54 49 43 29 3b 0a 20 20 20 20 62 72 65  STATIC);.    bre
18b40 61 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 7d 20 2f 2a  ak;.  }...  } /*
18b50 20 45 6e 64 20 6f 66 20 74 68 65 20 53 57 49 54   End of the SWIT
18b60 43 48 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CH statement */.
18b70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
18b80 23 69 66 20 53 51 4c 49 54 45 5f 54 43 4c 5f 4e  #if SQLITE_TCL_N
18b90 52 45 0a 2f 2a 0a 2a 2a 20 41 64 61 70 74 6f 72  RE./*.** Adaptor
18ba0 20 74 68 61 74 20 70 72 6f 76 69 64 65 73 20 61   that provides a
18bb0 6e 20 6f 62 6a 43 6d 64 20 69 6e 74 65 72 66 61  n objCmd interfa
18bc0 63 65 20 74 6f 20 74 68 65 20 4e 52 45 2d 65 6e  ce to the NRE-en
18bd0 61 62 6c 65 64 0a 2a 2a 20 69 6e 74 65 72 66 61  abled.** interfa
18be0 63 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ce implementatio
18bf0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
18c00 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 44   SQLITE_TCLAPI D
18c10 62 4f 62 6a 43 6d 64 41 64 61 70 74 6f 72 28 0a  bObjCmdAdaptor(.
18c20 20 20 76 6f 69 64 20 2a 63 64 2c 0a 20 20 54 63    void *cd,.  Tc
18c30 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
18c40 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
18c50 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f  Tcl_Obj *const*o
18c60 62 6a 76 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20  bjv.){.  return 
18c70 54 63 6c 5f 4e 52 43 61 6c 6c 4f 62 6a 50 72 6f  Tcl_NRCallObjPro
18c80 63 28 69 6e 74 65 72 70 2c 20 44 62 4f 62 6a 43  c(interp, DbObjC
18c90 6d 64 2c 20 63 64 2c 20 6f 62 6a 63 2c 20 6f 62  md, cd, objc, ob
18ca0 6a 76 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  jv);.}.#endif /*
18cb0 20 53 51 4c 49 54 45 5f 54 43 4c 5f 4e 52 45 20   SQLITE_TCL_NRE 
18cc0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 20 20 73 71 6c 69  */../*.**   sqli
18cd0 74 65 33 20 44 42 4e 41 4d 45 20 46 49 4c 45 4e  te3 DBNAME FILEN
18ce0 41 4d 45 20 3f 2d 76 66 73 20 56 46 53 4e 41 4d  AME ?-vfs VFSNAM
18cf0 45 3f 20 3f 2d 6b 65 79 20 4b 45 59 3f 20 3f 2d  E? ?-key KEY? ?-
18d00 72 65 61 64 6f 6e 6c 79 20 42 4f 4f 4c 45 41 4e  readonly BOOLEAN
18d10 3f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ?.**            
18d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3f                 ?
18d30 2d 63 72 65 61 74 65 20 42 4f 4f 4c 45 41 4e 3f  -create BOOLEAN?
18d40 20 3f 2d 6e 6f 6d 75 74 65 78 20 42 4f 4f 4c 45   ?-nomutex BOOLE
18d50 41 4e 3f 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  AN?.**.** This i
18d60 73 20 74 68 65 20 6d 61 69 6e 20 54 63 6c 20 63  s the main Tcl c
18d70 6f 6d 6d 61 6e 64 2e 20 20 57 68 65 6e 20 74 68  ommand.  When th
18d80 65 20 22 73 71 6c 69 74 65 22 20 54 63 6c 20 63  e "sqlite" Tcl c
18d90 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 69 6e 76  ommand is.** inv
18da0 6f 6b 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69  oked, this routi
18db0 6e 65 20 72 75 6e 73 20 74 6f 20 70 72 6f 63 65  ne runs to proce
18dc0 73 73 20 74 68 61 74 20 63 6f 6d 6d 61 6e 64 2e  ss that command.
18dd0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
18de0 20 61 72 67 75 6d 65 6e 74 2c 20 44 42 4e 41 4d   argument, DBNAM
18df0 45 2c 20 69 73 20 61 6e 20 61 72 62 69 74 72 61  E, is an arbitra
18e00 72 79 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65  ry name for a ne
18e10 77 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f  w.** database co
18e20 6e 6e 65 63 74 69 6f 6e 2e 20 20 54 68 69 73 20  nnection.  This 
18e30 63 6f 6d 6d 61 6e 64 20 63 72 65 61 74 65 73 20  command creates 
18e40 61 20 6e 65 77 20 63 6f 6d 6d 61 6e 64 20 6e 61  a new command na
18e50 6d 65 64 0a 2a 2a 20 44 42 4e 41 4d 45 20 74 68  med.** DBNAME th
18e60 61 74 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f  at is used to co
18e70 6e 74 72 6f 6c 20 74 68 61 74 20 63 6f 6e 6e 65  ntrol that conne
18e80 63 74 69 6f 6e 2e 20 20 54 68 65 20 64 61 74 61  ction.  The data
18e90 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  base.** connecti
18ea0 6f 6e 20 69 73 20 64 65 6c 65 74 65 64 20 77 68  on is deleted wh
18eb0 65 6e 20 74 68 65 20 44 42 4e 41 4d 45 20 63 6f  en the DBNAME co
18ec0 6d 6d 61 6e 64 20 69 73 20 64 65 6c 65 74 65 64  mmand is deleted
18ed0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f  ..**.** The seco
18ee0 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  nd argument is t
18ef0 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
18f00 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
18f10 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
18f20 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 44 62 4d  QLITE_TCLAPI DbM
18f30 61 69 6e 28 0a 20 20 76 6f 69 64 20 2a 63 64 2c  ain(.  void *cd,
18f40 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
18f50 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
18f60 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  c,.  Tcl_Obj *co
18f70 6e 73 74 2a 6f 62 6a 76 0a 29 7b 0a 20 20 53 71  nst*objv.){.  Sq
18f80 6c 69 74 65 44 62 20 2a 70 3b 0a 20 20 63 6f 6e  liteDb *p;.  con
18f90 73 74 20 63 68 61 72 20 2a 7a 41 72 67 3b 0a 20  st char *zArg;. 
18fa0 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 3b 0a   char *zErrMsg;.
18fb0 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74    int i;.  const
18fc0 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20   char *zFile;.  
18fd0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73  const char *zVfs
18fe0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 66 6c 61 67   = 0;.  int flag
18ff0 73 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  s;.  Tcl_DString
19000 20 74 72 61 6e 73 6c 61 74 65 64 46 69 6c 65 6e   translatedFilen
19010 61 6d 65 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  ame;.#if defined
19020 28 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45  (SQLITE_HAS_CODE
19030 43 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  C) && !defined(S
19040 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 44 45 43  QLITE_OMIT_CODEC
19050 5f 46 52 4f 4d 5f 54 43 4c 29 0a 20 20 76 6f 69  _FROM_TCL).  voi
19060 64 20 2a 70 4b 65 79 20 3d 20 30 3b 0a 20 20 69  d *pKey = 0;.  i
19070 6e 74 20 6e 4b 65 79 20 3d 20 30 3b 0a 23 65 6e  nt nKey = 0;.#en
19080 64 69 66 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  dif.  int rc;.. 
19090 20 2f 2a 20 49 6e 20 6e 6f 72 6d 61 6c 20 75 73   /* In normal us
190a0 65 2c 20 65 61 63 68 20 54 43 4c 20 69 6e 74 65  e, each TCL inte
190b0 72 70 72 65 74 65 72 20 72 75 6e 73 20 69 6e 20  rpreter runs in 
190c0 61 20 73 69 6e 67 6c 65 20 74 68 72 65 61 64 2e  a single thread.
190d0 20 20 53 6f 0a 20 20 2a 2a 20 62 79 20 64 65 66    So.  ** by def
190e0 61 75 6c 74 2c 20 77 65 20 63 61 6e 20 74 75 72  ault, we can tur
190f0 6e 20 6f 66 20 6d 75 74 65 78 69 6e 67 20 6f 6e  n of mutexing on
19100 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
19110 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20   connections..  
19120 2a 2a 20 48 6f 77 65 76 65 72 2c 20 66 6f 72 20  ** However, for 
19130 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73  testing purposes
19140 20 69 74 20 69 73 20 75 73 65 66 75 6c 20 74 6f   it is useful to
19150 20 68 61 76 65 20 6d 75 74 65 78 65 73 20 74 75   have mutexes tu
19160 72 6e 65 64 0a 20 20 2a 2a 20 6f 6e 2e 20 20 53  rned.  ** on.  S
19170 6f 2c 20 62 79 20 64 65 66 61 75 6c 74 2c 20 6d  o, by default, m
19180 75 74 65 78 65 73 20 64 65 66 61 75 6c 74 20 6f  utexes default o
19190 66 66 2e 20 20 42 75 74 20 69 66 20 63 6f 6d 70  ff.  But if comp
191a0 69 6c 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 53  iled with.  ** S
191b0 51 4c 49 54 45 5f 54 43 4c 5f 44 45 46 41 55 4c  QLITE_TCL_DEFAUL
191c0 54 5f 46 55 4c 4c 4d 55 54 45 58 20 74 68 65 6e  T_FULLMUTEX then
191d0 20 6d 75 74 65 78 65 73 20 64 65 66 61 75 6c 74   mutexes default
191e0 20 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66   on..  */.#ifdef
191f0 20 53 51 4c 49 54 45 5f 54 43 4c 5f 44 45 46 41   SQLITE_TCL_DEFA
19200 55 4c 54 5f 46 55 4c 4c 4d 55 54 45 58 0a 20 20  ULT_FULLMUTEX.  
19210 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f  flags = SQLITE_O
19220 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
19230 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
19240 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
19250 5f 46 55 4c 4c 4d 55 54 45 58 3b 0a 23 65 6c 73  _FULLMUTEX;.#els
19260 65 0a 20 20 66 6c 61 67 73 20 3d 20 53 51 4c 49  e.  flags = SQLI
19270 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
19280 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
19290 43 52 45 41 54 45 20 7c 20 53 51 4c 49 54 45 5f  CREATE | SQLITE_
192a0 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 3b 0a 23 65  OPEN_NOMUTEX;.#e
192b0 6e 64 69 66 0a 0a 20 20 69 66 28 20 6f 62 6a 63  ndif..  if( objc
192c0 3d 3d 32 20 29 7b 0a 20 20 20 20 7a 41 72 67 20  ==2 ){.    zArg 
192d0 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
192e0 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20  romObj(objv[1], 
192f0 30 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63  0);.    if( strc
19300 6d 70 28 7a 41 72 67 2c 22 2d 76 65 72 73 69 6f  mp(zArg,"-versio
19310 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  n")==0 ){.      
19320 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
19330 28 69 6e 74 65 72 70 2c 73 71 6c 69 74 65 33 5f  (interp,sqlite3_
19340 6c 69 62 76 65 72 73 69 6f 6e 28 29 2c 20 28 63  libversion(), (c
19350 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72  har*)0);.      r
19360 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20  eturn TCL_OK;.  
19370 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72 63    }.    if( strc
19380 6d 70 28 7a 41 72 67 2c 22 2d 73 6f 75 72 63 65  mp(zArg,"-source
19390 69 64 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  id")==0 ){.     
193a0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
193b0 74 28 69 6e 74 65 72 70 2c 73 71 6c 69 74 65 33  t(interp,sqlite3
193c0 5f 73 6f 75 72 63 65 69 64 28 29 2c 20 28 63 68  _sourceid(), (ch
193d0 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 65  ar*)0);.      re
193e0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20  turn TCL_OK;.   
193f0 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d   }.    if( strcm
19400 70 28 7a 41 72 67 2c 22 2d 68 61 73 2d 63 6f 64  p(zArg,"-has-cod
19410 65 63 22 29 3d 3d 30 20 29 7b 0a 23 69 66 20 64  ec")==0 ){.#if d
19420 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41  efined(SQLITE_HA
19430 53 5f 43 4f 44 45 43 29 20 26 26 20 21 64 65 66  S_CODEC) && !def
19440 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
19450 5f 43 4f 44 45 43 5f 46 52 4f 4d 5f 54 43 4c 29  _CODEC_FROM_TCL)
19460 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
19470 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22  dResult(interp,"
19480 31 22 2c 28 63 68 61 72 2a 29 30 29 3b 0a 23 65  1",(char*)0);.#e
19490 6c 73 65 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  lse.      Tcl_Ap
194a0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
194b0 70 2c 22 30 22 2c 28 63 68 61 72 2a 29 30 29 3b  p,"0",(char*)0);
194c0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 65  .#endif.      re
194d0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20  turn TCL_OK;.   
194e0 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 33   }.  }.  for(i=3
194f0 3b 20 69 2b 31 3c 6f 62 6a 63 3b 20 69 2b 3d 32  ; i+1<objc; i+=2
19500 29 7b 0a 20 20 20 20 7a 41 72 67 20 3d 20 54 63  ){.    zArg = Tc
19510 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
19520 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 73 74  [i]);.    if( st
19530 72 63 6d 70 28 7a 41 72 67 2c 22 2d 6b 65 79 22  rcmp(zArg,"-key"
19540 29 3d 3d 30 20 29 7b 0a 23 69 66 20 64 65 66 69  )==0 ){.#if defi
19550 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 53 5f 43  ned(SQLITE_HAS_C
19560 4f 44 45 43 29 20 26 26 20 21 64 65 66 69 6e 65  ODEC) && !define
19570 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  d(SQLITE_OMIT_CO
19580 44 45 43 5f 46 52 4f 4d 5f 54 43 4c 29 0a 20 20  DEC_FROM_TCL).  
19590 20 20 20 20 70 4b 65 79 20 3d 20 54 63 6c 5f 47      pKey = Tcl_G
195a0 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f  etByteArrayFromO
195b0 62 6a 28 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 6e  bj(objv[i+1], &n
195c0 4b 65 79 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  Key);.#endif.   
195d0 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
195e0 70 28 7a 41 72 67 2c 20 22 2d 76 66 73 22 29 3d  p(zArg, "-vfs")=
195f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 56 66 73  =0 ){.      zVfs
19600 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
19610 28 6f 62 6a 76 5b 69 2b 31 5d 29 3b 0a 20 20 20  (objv[i+1]);.   
19620 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
19630 70 28 7a 41 72 67 2c 20 22 2d 72 65 61 64 6f 6e  p(zArg, "-readon
19640 6c 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ly")==0 ){.     
19650 20 69 6e 74 20 62 3b 0a 20 20 20 20 20 20 69 66   int b;.      if
19660 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e  ( Tcl_GetBoolean
19670 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
19680 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 62 29 20 29  objv[i+1], &b) )
19690 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
196a0 52 3b 0a 20 20 20 20 20 20 69 66 28 20 62 20 29  R;.      if( b )
196b0 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  {.        flags 
196c0 26 3d 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e  &= ~(SQLITE_OPEN
196d0 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
196e0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a  E_OPEN_CREATE);.
196f0 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d          flags |=
19700 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
19710 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c  DONLY;.      }el
19720 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67  se{.        flag
19730 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45  s &= ~SQLITE_OPE
19740 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  N_READONLY;.    
19750 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c      flags |= SQL
19760 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
19770 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  TE;.      }.    
19780 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
19790 28 7a 41 72 67 2c 20 22 2d 63 72 65 61 74 65 22  (zArg, "-create"
197a0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
197b0 74 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20 54  t b;.      if( T
197c0 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f  cl_GetBooleanFro
197d0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
197e0 76 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20 72 65  v[i+1], &b) ) re
197f0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
19800 20 20 20 20 20 20 69 66 28 20 62 20 26 26 20 28        if( b && (
19810 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
19820 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3d 3d 30  PEN_READONLY)==0
19830 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67   ){.        flag
19840 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  s |= SQLITE_OPEN
19850 5f 43 52 45 41 54 45 3b 0a 20 20 20 20 20 20 7d  _CREATE;.      }
19860 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6c  else{.        fl
19870 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f  ags &= ~SQLITE_O
19880 50 45 4e 5f 43 52 45 41 54 45 3b 0a 20 20 20 20  PEN_CREATE;.    
19890 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
198a0 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22  ( strcmp(zArg, "
198b0 2d 6e 6f 6d 75 74 65 78 22 29 3d 3d 30 20 29 7b  -nomutex")==0 ){
198c0 0a 20 20 20 20 20 20 69 6e 74 20 62 3b 0a 20 20  .      int b;.  
198d0 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42      if( Tcl_GetB
198e0 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
198f0 74 65 72 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c  terp, objv[i+1],
19900 20 26 62 29 20 29 20 72 65 74 75 72 6e 20 54 43   &b) ) return TC
19910 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 69  L_ERROR;.      i
19920 66 28 20 62 20 29 7b 0a 20 20 20 20 20 20 20 20  f( b ){.        
19930 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
19940 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 3b 0a 20 20  OPEN_NOMUTEX;.  
19950 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e        flags &= ~
19960 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c  SQLITE_OPEN_FULL
19970 4d 55 54 45 58 3b 0a 20 20 20 20 20 20 7d 65 6c  MUTEX;.      }el
19980 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67  se{.        flag
19990 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45  s &= ~SQLITE_OPE
199a0 4e 5f 4e 4f 4d 55 54 45 58 3b 0a 20 20 20 20 20  N_NOMUTEX;.     
199b0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
199c0 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d   strcmp(zArg, "-
199d0 66 75 6c 6c 6d 75 74 65 78 22 29 3d 3d 30 20 29  fullmutex")==0 )
199e0 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 3b 0a 20  {.      int b;. 
199f0 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74       if( Tcl_Get
19a00 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
19a10 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d  nterp, objv[i+1]
19a20 2c 20 26 62 29 20 29 20 72 65 74 75 72 6e 20 54  , &b) ) return T
19a30 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
19a40 69 66 28 20 62 20 29 7b 0a 20 20 20 20 20 20 20  if( b ){.       
19a50 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45   flags |= SQLITE
19a60 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 3b  _OPEN_FULLMUTEX;
19a70 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 26  .        flags &
19a80 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e  = ~SQLITE_OPEN_N
19a90 4f 4d 55 54 45 58 3b 0a 20 20 20 20 20 20 7d 65  OMUTEX;.      }e
19aa0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 61  lse{.        fla
19ab0 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50  gs &= ~SQLITE_OP
19ac0 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 3b 0a 20 20  EN_FULLMUTEX;.  
19ad0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
19ae0 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c  if( strcmp(zArg,
19af0 20 22 2d 75 72 69 22 29 3d 3d 30 20 29 7b 0a 20   "-uri")==0 ){. 
19b00 20 20 20 20 20 69 6e 74 20 62 3b 0a 20 20 20 20       int b;.    
19b10 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f    if( Tcl_GetBoo
19b20 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
19b30 72 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26  rp, objv[i+1], &
19b40 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
19b50 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 69 66 28  ERROR;.      if(
19b60 20 62 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c   b ){.        fl
19b70 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50  ags |= SQLITE_OP
19b80 45 4e 5f 55 52 49 3b 0a 20 20 20 20 20 20 7d 65  EN_URI;.      }e
19b90 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 61  lse{.        fla
19ba0 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50  gs &= ~SQLITE_OP
19bb0 45 4e 5f 55 52 49 3b 0a 20 20 20 20 20 20 7d 0a  EN_URI;.      }.
19bc0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19bd0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
19be0 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 6b 6e 6f  t(interp, "unkno
19bf0 77 6e 20 6f 70 74 69 6f 6e 3a 20 22 2c 20 7a 41  wn option: ", zA
19c00 72 67 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  rg, (char*)0);. 
19c10 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
19c20 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d  ERROR;.    }.  }
19c30 0a 20 20 69 66 28 20 6f 62 6a 63 3c 33 20 7c 7c  .  if( objc<3 ||
19c40 20 28 6f 62 6a 63 26 31 29 21 3d 31 20 29 7b 0a   (objc&1)!=1 ){.
19c50 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
19c60 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
19c70 6f 62 6a 76 2c 0a 20 20 20 20 20 20 22 48 41 4e  objv,.      "HAN
19c80 44 4c 45 20 46 49 4c 45 4e 41 4d 45 20 3f 2d 76  DLE FILENAME ?-v
19c90 66 73 20 56 46 53 4e 41 4d 45 3f 20 3f 2d 72 65  fs VFSNAME? ?-re
19ca0 61 64 6f 6e 6c 79 20 42 4f 4f 4c 45 41 4e 3f 20  adonly BOOLEAN? 
19cb0 3f 2d 63 72 65 61 74 65 20 42 4f 4f 4c 45 41 4e  ?-create BOOLEAN
19cc0 3f 22 0a 20 20 20 20 20 20 22 20 3f 2d 6e 6f 6d  ?".      " ?-nom
19cd0 75 74 65 78 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d  utex BOOLEAN? ?-
19ce0 66 75 6c 6c 6d 75 74 65 78 20 42 4f 4f 4c 45 41  fullmutex BOOLEA
19cf0 4e 3f 20 3f 2d 75 72 69 20 42 4f 4f 4c 45 41 4e  N? ?-uri BOOLEAN
19d00 3f 22 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  ?".#if defined(S
19d10 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 29  QLITE_HAS_CODEC)
19d20 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
19d30 49 54 45 5f 4f 4d 49 54 5f 43 4f 44 45 43 5f 46  ITE_OMIT_CODEC_F
19d40 52 4f 4d 5f 54 43 4c 29 0a 20 20 20 20 20 20 22  ROM_TCL).      "
19d50 20 3f 2d 6b 65 79 20 43 4f 44 45 43 4b 45 59 3f   ?-key CODECKEY?
19d60 22 0a 23 65 6e 64 69 66 0a 20 20 20 20 29 3b 0a  ".#endif.    );.
19d70 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
19d80 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 45 72 72  RROR;.  }.  zErr
19d90 4d 73 67 20 3d 20 30 3b 0a 20 20 70 20 3d 20 28  Msg = 0;.  p = (
19da0 53 71 6c 69 74 65 44 62 2a 29 54 63 6c 5f 41 6c  SqliteDb*)Tcl_Al
19db0 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29 20  loc( sizeof(*p) 
19dc0 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30  );.  memset(p, 0
19dd0 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20  , sizeof(*p));. 
19de0 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74   zFile = Tcl_Get
19df0 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
19e00 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 7a 46 69  jv[2], 0);.  zFi
19e10 6c 65 20 3d 20 54 63 6c 5f 54 72 61 6e 73 6c 61  le = Tcl_Transla
19e20 74 65 46 69 6c 65 4e 61 6d 65 28 69 6e 74 65 72  teFileName(inter
19e30 70 2c 20 7a 46 69 6c 65 2c 20 26 74 72 61 6e 73  p, zFile, &trans
19e40 6c 61 74 65 64 46 69 6c 65 6e 61 6d 65 29 3b 0a  latedFilename);.
19e50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f    rc = sqlite3_o
19e60 70 65 6e 5f 76 32 28 7a 46 69 6c 65 2c 20 26 70  pen_v2(zFile, &p
19e70 2d 3e 64 62 2c 20 66 6c 61 67 73 2c 20 7a 56 66  ->db, flags, zVf
19e80 73 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  s);.  Tcl_DStrin
19e90 67 46 72 65 65 28 26 74 72 61 6e 73 6c 61 74 65  gFree(&translate
19ea0 64 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66  dFilename);.  if
19eb0 28 20 70 2d 3e 64 62 20 29 7b 0a 20 20 20 20 69  ( p->db ){.    i
19ec0 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
19ed0 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 70 2d  lite3_errcode(p-
19ee0 3e 64 62 29 20 29 7b 0a 20 20 20 20 20 20 7a 45  >db) ){.      zE
19ef0 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrMsg = sqlite3_
19f00 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71  mprintf("%s", sq
19f10 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e  lite3_errmsg(p->
19f20 64 62 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  db));.      sqli
19f30 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 29  te3_close(p->db)
19f40 3b 0a 20 20 20 20 20 20 70 2d 3e 64 62 20 3d 20  ;.      p->db = 
19f50 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  0;.    }.  }else
19f60 7b 0a 20 20 20 20 7a 45 72 72 4d 73 67 20 3d 20  {.    zErrMsg = 
19f70 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
19f80 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  "%s", sqlite3_er
19f90 72 73 74 72 28 72 63 29 29 3b 0a 20 20 7d 0a 23  rstr(rc));.  }.#
19fa0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
19fb0 45 5f 48 41 53 5f 43 4f 44 45 43 29 20 26 26 20  E_HAS_CODEC) && 
19fc0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
19fd0 4f 4d 49 54 5f 43 4f 44 45 43 5f 46 52 4f 4d 5f  OMIT_CODEC_FROM_
19fe0 54 43 4c 29 0a 20 20 69 66 28 20 70 2d 3e 64 62  TCL).  if( p->db
19ff0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
1a000 6b 65 79 28 70 2d 3e 64 62 2c 20 70 4b 65 79 2c  key(p->db, pKey,
1a010 20 6e 4b 65 79 29 3b 0a 20 20 7d 0a 23 65 6e 64   nKey);.  }.#end
1a020 69 66 0a 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d  if.  if( p->db==
1a030 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  0 ){.    Tcl_Set
1a040 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
1a050 45 72 72 4d 73 67 2c 20 54 43 4c 5f 56 4f 4c 41  ErrMsg, TCL_VOLA
1a060 54 49 4c 45 29 3b 0a 20 20 20 20 54 63 6c 5f 46  TILE);.    Tcl_F
1a070 72 65 65 28 28 63 68 61 72 2a 29 70 29 3b 0a 20  ree((char*)p);. 
1a080 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1a090 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 72 65  zErrMsg);.    re
1a0a0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1a0b0 20 20 7d 0a 20 20 70 2d 3e 6d 61 78 53 74 6d 74    }.  p->maxStmt
1a0c0 20 3d 20 4e 55 4d 5f 50 52 45 50 41 52 45 44 5f   = NUM_PREPARED_
1a0d0 53 54 4d 54 53 3b 0a 20 20 70 2d 3e 6f 70 65 6e  STMTS;.  p->open
1a0e0 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 20 26 20  Flags = flags & 
1a0f0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b  SQLITE_OPEN_URI;
1a100 0a 20 20 70 2d 3e 69 6e 74 65 72 70 20 3d 20 69  .  p->interp = i
1a110 6e 74 65 72 70 3b 0a 20 20 7a 41 72 67 20 3d 20  nterp;.  zArg = 
1a120 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
1a130 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29  mObj(objv[1], 0)
1a140 3b 0a 20 20 69 66 28 20 44 62 55 73 65 4e 72 65  ;.  if( DbUseNre
1a150 28 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 4e 52  () ){.    Tcl_NR
1a160 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e  CreateCommand(in
1a170 74 65 72 70 2c 20 7a 41 72 67 2c 20 44 62 4f 62  terp, zArg, DbOb
1a180 6a 43 6d 64 41 64 61 70 74 6f 72 2c 20 44 62 4f  jCmdAdaptor, DbO
1a190 62 6a 43 6d 64 2c 0a 20 20 20 20 20 20 20 20 20  bjCmd,.         
1a1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1a1b0 63 68 61 72 2a 29 70 2c 20 44 62 44 65 6c 65 74  char*)p, DbDelet
1a1c0 65 43 6d 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  eCmd);.  }else{.
1a1d0 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
1a1e0 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
1a1f0 20 7a 41 72 67 2c 20 44 62 4f 62 6a 43 6d 64 2c   zArg, DbObjCmd,
1a200 20 28 63 68 61 72 2a 29 70 2c 20 44 62 44 65 6c   (char*)p, DbDel
1a210 65 74 65 43 6d 64 29 3b 0a 20 20 7d 0a 20 20 72  eteCmd);.  }.  r
1a220 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1a230 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20 61  ./*.** Provide a
1a240 20 64 75 6d 6d 79 20 54 63 6c 5f 49 6e 69 74 53   dummy Tcl_InitS
1a250 74 75 62 73 20 69 66 20 77 65 20 61 72 65 20 75  tubs if we are u
1a260 73 69 6e 67 20 74 68 69 73 20 61 73 20 61 20 73  sing this as a s
1a270 74 61 74 69 63 0a 2a 2a 20 6c 69 62 72 61 72 79  tatic.** library
1a280 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 55 53 45  ..*/.#ifndef USE
1a290 5f 54 43 4c 5f 53 54 55 42 53 0a 23 20 75 6e 64  _TCL_STUBS.# und
1a2a0 65 66 20 20 54 63 6c 5f 49 6e 69 74 53 74 75 62  ef  Tcl_InitStub
1a2b0 73 0a 23 20 64 65 66 69 6e 65 20 54 63 6c 5f 49  s.# define Tcl_I
1a2c0 6e 69 74 53 74 75 62 73 28 61 2c 62 2c 63 29 20  nitStubs(a,b,c) 
1a2d0 54 43 4c 5f 56 45 52 53 49 4f 4e 0a 23 65 6e 64  TCL_VERSION.#end
1a2e0 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  if../*.** Make s
1a2f0 75 72 65 20 77 65 20 68 61 76 65 20 61 20 50 41  ure we have a PA
1a300 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 20 6d 61  CKAGE_VERSION ma
1a310 63 72 6f 20 64 65 66 69 6e 65 64 2e 20 20 54 68  cro defined.  Th
1a320 69 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65  is will be.** de
1a330 66 69 6e 65 64 20 61 75 74 6f 6d 61 74 69 63 61  fined automatica
1a340 6c 6c 79 20 62 79 20 74 68 65 20 54 45 41 20 6d  lly by the TEA m
1a350 61 6b 65 66 69 6c 65 2e 20 20 42 75 74 20 6f 74  akefile.  But ot
1a360 68 65 72 20 6d 61 6b 65 66 69 6c 65 73 0a 2a 2a  her makefiles.**
1a370 20 64 6f 20 6e 6f 74 20 64 65 66 69 6e 65 20 69   do not define i
1a380 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 50 41  t..*/.#ifndef PA
1a390 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 0a 23 20  CKAGE_VERSION.# 
1a3a0 64 65 66 69 6e 65 20 50 41 43 4b 41 47 45 5f 56  define PACKAGE_V
1a3b0 45 52 53 49 4f 4e 20 53 51 4c 49 54 45 5f 56 45  ERSION SQLITE_VE
1a3c0 52 53 49 4f 4e 0a 23 65 6e 64 69 66 0a 0a 2f 2a  RSION.#endif../*
1a3d0 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  .** Initialize t
1a3e0 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2a 0a 2a  his module..**.*
1a3f0 2a 20 54 68 69 73 20 54 63 6c 20 6d 6f 64 75 6c  * This Tcl modul
1a400 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20  e contains only 
1a410 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 54 63 6c  a single new Tcl
1a420 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 64 20 22   command named "
1a430 73 71 6c 69 74 65 22 2e 0a 2a 2a 20 28 48 65 6e  sqlite"..** (Hen
1a440 63 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  ce there is no n
1a450 61 6d 65 73 70 61 63 65 2e 20 20 54 68 65 72 65  amespace.  There
1a460 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20   is no point in 
1a470 75 73 69 6e 67 20 61 20 6e 61 6d 65 73 70 61 63  using a namespac
1a480 65 0a 2a 2a 20 69 66 20 74 68 65 20 65 78 74 65  e.** if the exte
1a490 6e 73 69 6f 6e 20 6f 6e 6c 79 20 73 75 70 70 6c  nsion only suppl
1a4a0 69 65 73 20 6f 6e 65 20 6e 65 77 20 6e 61 6d 65  ies one new name
1a4b0 21 29 20 20 54 68 65 20 22 73 71 6c 69 74 65 22  !)  The "sqlite"
1a4c0 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 75   command is.** u
1a4d0 73 65 64 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65  sed to open a ne
1a4e0 77 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  w SQLite databas
1a4f0 65 2e 20 20 53 65 65 20 74 68 65 20 44 62 4d 61  e.  See the DbMa
1a500 69 6e 28 29 20 72 6f 75 74 69 6e 65 20 61 62 6f  in() routine abo
1a510 76 65 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74 69  ve.** for additi
1a520 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
1a530 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 58 54 45  ..**.** The EXTE
1a540 52 4e 20 6d 61 63 72 6f 73 20 61 72 65 20 72 65  RN macros are re
1a550 71 75 69 72 65 64 20 62 79 20 54 43 4c 20 69 6e  quired by TCL in
1a560 20 6f 72 64 65 72 20 74 6f 20 77 6f 72 6b 20 6f   order to work o
1a570 6e 20 77 69 6e 64 6f 77 73 2e 0a 2a 2f 0a 45 58  n windows..*/.EX
1a580 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74 65 33  TERN int Sqlite3
1a590 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1a5a0 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 69 6e 74   *interp){.  int
1a5b0 20 72 63 20 3d 20 54 63 6c 5f 49 6e 69 74 53 74   rc = Tcl_InitSt
1a5c0 75 62 73 28 69 6e 74 65 72 70 2c 20 22 38 2e 34  ubs(interp, "8.4
1a5d0 22 2c 20 30 29 20 3f 20 54 43 4c 5f 4f 4b 20 3a  ", 0) ? TCL_OK :
1a5e0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
1a5f0 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a  ( rc==TCL_OK ){.
1a600 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
1a610 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
1a620 20 22 73 71 6c 69 74 65 33 22 2c 20 28 54 63 6c   "sqlite3", (Tcl
1a630 5f 4f 62 6a 43 6d 64 50 72 6f 63 2a 29 44 62 4d  _ObjCmdProc*)DbM
1a640 61 69 6e 2c 20 30 2c 20 30 29 3b 0a 23 69 66 6e  ain, 0, 0);.#ifn
1a650 64 65 66 20 53 51 4c 49 54 45 5f 33 5f 53 55 46  def SQLITE_3_SUF
1a660 46 49 58 5f 4f 4e 4c 59 0a 20 20 20 20 2f 2a 20  FIX_ONLY.    /* 
1a670 54 68 65 20 22 73 71 6c 69 74 65 22 20 61 6c 69  The "sqlite" ali
1a680 61 73 20 69 73 20 75 6e 64 6f 63 75 6d 65 6e 74  as is undocument
1a690 65 64 2e 20 20 49 74 20 69 73 20 68 65 72 65 20  ed.  It is here 
1a6a0 6f 6e 6c 79 20 74 6f 20 73 75 70 70 6f 72 74 0a  only to support.
1a6b0 20 20 20 20 2a 2a 20 6c 65 67 61 63 79 20 73 63      ** legacy sc
1a6c0 72 69 70 74 73 2e 20 20 41 6c 6c 20 6e 65 77 20  ripts.  All new 
1a6d0 73 63 72 69 70 74 73 20 73 68 6f 75 6c 64 20 75  scripts should u
1a6e0 73 65 20 6f 6e 6c 79 20 74 68 65 20 22 73 71 6c  se only the "sql
1a6f0 69 74 65 33 22 0a 20 20 20 20 2a 2a 20 63 6f 6d  ite3".    ** com
1a700 6d 61 6e 64 2e 20 2a 2f 0a 20 20 20 20 54 63 6c  mand. */.    Tcl
1a710 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
1a720 64 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  d(interp, "sqlit
1a730 65 22 2c 20 28 54 63 6c 5f 4f 62 6a 43 6d 64 50  e", (Tcl_ObjCmdP
1a740 72 6f 63 2a 29 44 62 4d 61 69 6e 2c 20 30 2c 20  roc*)DbMain, 0, 
1a750 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72  0);.#endif.    r
1a760 63 20 3d 20 54 63 6c 5f 50 6b 67 50 72 6f 76 69  c = Tcl_PkgProvi
1a770 64 65 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  de(interp, "sqli
1a780 74 65 33 22 2c 20 50 41 43 4b 41 47 45 5f 56 45  te3", PACKAGE_VE
1a790 52 53 49 4f 4e 29 3b 0a 20 20 7d 0a 20 20 72 65  RSION);.  }.  re
1a7a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 45 58 54 45 52  turn rc;.}.EXTER
1a7b0 4e 20 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 33  N int Tclsqlite3
1a7c0 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1a7d0 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72   *interp){ retur
1a7e0 6e 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69  n Sqlite3_Init(i
1a7f0 6e 74 65 72 70 29 3b 20 7d 0a 45 58 54 45 52 4e  nterp); }.EXTERN
1a800 20 69 6e 74 20 53 71 6c 69 74 65 33 5f 55 6e 6c   int Sqlite3_Unl
1a810 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  oad(Tcl_Interp *
1a820 69 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c 61 67  interp, int flag
1a830 73 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  s){ return TCL_O
1a840 4b 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20  K; }.EXTERN int 
1a850 54 63 6c 73 71 6c 69 74 65 33 5f 55 6e 6c 6f 61  Tclsqlite3_Unloa
1a860 64 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  d(Tcl_Interp *in
1a870 74 65 72 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  terp, int flags)
1a880 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b  { return TCL_OK;
1a890 20 7d 0a 0a 2f 2a 20 42 65 63 61 75 73 65 20 69   }../* Because i
1a8a0 74 20 61 63 63 65 73 73 65 73 20 74 68 65 20 66  t accesses the f
1a8b0 69 6c 65 2d 73 79 73 74 65 6d 20 61 6e 64 20 75  ile-system and u
1a8c0 73 65 73 20 70 65 72 73 69 73 74 65 6e 74 20 73  ses persistent s
1a8d0 74 61 74 65 2c 20 53 51 4c 69 74 65 0a 2a 2a 20  tate, SQLite.** 
1a8e0 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65  is not considere
1a8f0 64 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  d appropriate fo
1a900 72 20 73 61 66 65 20 69 6e 74 65 72 70 72 65 74  r safe interpret
1a910 65 72 73 2e 20 20 48 65 6e 63 65 2c 20 77 65 20  ers.  Hence, we 
1a920 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 5f 53 61  cause.** the _Sa
1a930 66 65 49 6e 69 74 28 29 20 69 6e 74 65 72 66 61  feInit() interfa
1a940 63 65 73 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ces return TCL_E
1a950 52 52 4f 52 2e 0a 2a 2f 0a 45 58 54 45 52 4e 20  RROR..*/.EXTERN 
1a960 69 6e 74 20 53 71 6c 69 74 65 33 5f 53 61 66 65  int Sqlite3_Safe
1a970 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
1a980 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e  *interp){ return
1a990 20 54 43 4c 5f 45 52 52 4f 52 3b 20 7d 0a 45 58   TCL_ERROR; }.EX
1a9a0 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74 65 33  TERN int Sqlite3
1a9b0 5f 53 61 66 65 55 6e 6c 6f 61 64 28 54 63 6c 5f  _SafeUnload(Tcl_
1a9c0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
1a9d0 69 6e 74 20 66 6c 61 67 73 29 7b 72 65 74 75 72  int flags){retur
1a9e0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 7d 0a 0a 0a  n TCL_ERROR;}...
1a9f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1aa00 33 5f 53 55 46 46 49 58 5f 4f 4e 4c 59 0a 69 6e  3_SUFFIX_ONLY.in
1aa10 74 20 53 71 6c 69 74 65 5f 49 6e 69 74 28 54 63  t Sqlite_Init(Tc
1aa20 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1aa30 29 7b 20 72 65 74 75 72 6e 20 53 71 6c 69 74 65  ){ return Sqlite
1aa40 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 20  3_Init(interp); 
1aa50 7d 0a 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 5f  }.int Tclsqlite_
1aa60 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
1aa70 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e  *interp){ return
1aa80 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e   Sqlite3_Init(in
1aa90 74 65 72 70 29 3b 20 7d 0a 69 6e 74 20 53 71 6c  terp); }.int Sql
1aaa0 69 74 65 5f 55 6e 6c 6f 61 64 28 54 63 6c 5f 49  ite_Unload(Tcl_I
1aab0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
1aac0 6e 74 20 66 6c 61 67 73 29 7b 20 72 65 74 75 72  nt flags){ retur
1aad0 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 69 6e 74 20  n TCL_OK; }.int 
1aae0 54 63 6c 73 71 6c 69 74 65 5f 55 6e 6c 6f 61 64  Tclsqlite_Unload
1aaf0 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
1ab00 65 72 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  erp, int flags){
1ab10 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20   return TCL_OK; 
1ab20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
1ab30 20 54 43 4c 53 48 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a   TCLSH./********
1ab40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ab50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ab60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ab70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ab80 2a 2a 2a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20  *****.** All of 
1ab90 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 66 6f  the code that fo
1aba0 6c 6c 6f 77 73 20 69 73 20 75 73 65 64 20 74 6f  llows is used to
1abb0 20 62 75 69 6c 64 20 73 74 61 6e 64 61 6c 6f 6e   build standalon
1abc0 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
1abd0 72 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 73  rs.** that are s
1abe0 74 61 74 69 63 61 6c 6c 79 20 6c 69 6e 6b 65 64  tatically linked
1abf0 20 77 69 74 68 20 53 51 4c 69 74 65 2e 20 20 45   with SQLite.  E
1ac00 6e 61 62 6c 65 20 74 68 65 73 65 20 62 79 20 63  nable these by c
1ac10 6f 6d 70 69 6c 69 6e 67 0a 2a 2a 20 77 69 74 68  ompiling.** with
1ac20 20 2d 44 54 43 4c 53 48 3d 6e 20 77 68 65 72 65   -DTCLSH=n where
1ac30 20 6e 20 63 61 6e 20 62 65 20 31 20 6f 72 20 32   n can be 1 or 2
1ac40 2e 20 20 41 6e 20 6e 20 6f 66 20 31 20 67 65 6e  .  An n of 1 gen
1ac50 65 72 61 74 65 73 20 61 20 73 74 61 6e 64 61 72  erates a standar
1ac60 64 0a 2a 2a 20 74 63 6c 73 68 20 62 75 74 20 77  d.** tclsh but w
1ac70 69 74 68 20 53 51 4c 69 74 65 20 62 75 69 6c 74  ith SQLite built
1ac80 20 69 6e 2e 20 20 41 6e 20 6e 20 6f 66 20 32 20   in.  An n of 2 
1ac90 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 53 51  generates the SQ
1aca0 4c 69 74 65 20 73 70 61 63 65 0a 2a 2a 20 61 6e  Lite space.** an
1acb0 61 6c 79 73 69 73 20 70 72 6f 67 72 61 6d 2e 0a  alysis program..
1acc0 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  */..#if defined(
1acd0 53 51 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c 20  SQLITE_TEST) || 
1ace0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
1acf0 43 4c 4d 44 35 29 0a 2f 2a 0a 20 2a 20 54 68 69  CLMD5)./*. * Thi
1ad00 73 20 63 6f 64 65 20 69 6d 70 6c 65 6d 65 6e 74  s code implement
1ad10 73 20 74 68 65 20 4d 44 35 20 6d 65 73 73 61 67  s the MD5 messag
1ad20 65 2d 64 69 67 65 73 74 20 61 6c 67 6f 72 69 74  e-digest algorit
1ad30 68 6d 2e 0a 20 2a 20 54 68 65 20 61 6c 67 6f 72  hm.. * The algor
1ad40 69 74 68 6d 20 69 73 20 64 75 65 20 74 6f 20 52  ithm is due to R
1ad50 6f 6e 20 52 69 76 65 73 74 2e 20 20 54 68 69 73  on Rivest.  This
1ad60 20 63 6f 64 65 20 77 61 73 0a 20 2a 20 77 72 69   code was. * wri
1ad70 74 74 65 6e 20 62 79 20 43 6f 6c 69 6e 20 50 6c  tten by Colin Pl
1ad80 75 6d 62 20 69 6e 20 31 39 39 33 2c 20 6e 6f 20  umb in 1993, no 
1ad90 63 6f 70 79 72 69 67 68 74 20 69 73 20 63 6c 61  copyright is cla
1ada0 69 6d 65 64 2e 0a 20 2a 20 54 68 69 73 20 63 6f  imed.. * This co
1adb0 64 65 20 69 73 20 69 6e 20 74 68 65 20 70 75 62  de is in the pub
1adc0 6c 69 63 20 64 6f 6d 61 69 6e 3b 20 64 6f 20 77  lic domain; do w
1add0 69 74 68 20 69 74 20 77 68 61 74 20 79 6f 75 20  ith it what you 
1ade0 77 69 73 68 2e 0a 20 2a 0a 20 2a 20 45 71 75 69  wish.. *. * Equi
1adf0 76 61 6c 65 6e 74 20 63 6f 64 65 20 69 73 20 61  valent code is a
1ae00 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20 52 53  vailable from RS
1ae10 41 20 44 61 74 61 20 53 65 63 75 72 69 74 79 2c  A Data Security,
1ae20 20 49 6e 63 2e 0a 20 2a 20 54 68 69 73 20 63 6f   Inc.. * This co
1ae30 64 65 20 68 61 73 20 62 65 65 6e 20 74 65 73 74  de has been test
1ae40 65 64 20 61 67 61 69 6e 73 74 20 74 68 61 74 2c  ed against that,
1ae50 20 61 6e 64 20 69 73 20 65 71 75 69 76 61 6c 65   and is equivale
1ae60 6e 74 2c 0a 20 2a 20 65 78 63 65 70 74 20 74 68  nt,. * except th
1ae70 61 74 20 79 6f 75 20 64 6f 6e 27 74 20 6e 65 65  at you don't nee
1ae80 64 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 77 6f  d to include two
1ae90 20 70 61 67 65 73 20 6f 66 20 6c 65 67 61 6c 65   pages of legale
1aea0 73 65 0a 20 2a 20 77 69 74 68 20 65 76 65 72 79  se. * with every
1aeb0 20 63 6f 70 79 2e 0a 20 2a 0a 20 2a 20 54 6f 20   copy.. *. * To 
1aec0 63 6f 6d 70 75 74 65 20 74 68 65 20 6d 65 73 73  compute the mess
1aed0 61 67 65 20 64 69 67 65 73 74 20 6f 66 20 61 20  age digest of a 
1aee0 63 68 75 6e 6b 20 6f 66 20 62 79 74 65 73 2c 20  chunk of bytes, 
1aef0 64 65 63 6c 61 72 65 20 61 6e 0a 20 2a 20 4d 44  declare an. * MD
1af00 35 43 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75  5Context structu
1af10 72 65 2c 20 70 61 73 73 20 69 74 20 74 6f 20 4d  re, pass it to M
1af20 44 35 49 6e 69 74 2c 20 63 61 6c 6c 20 4d 44 35  D5Init, call MD5
1af30 55 70 64 61 74 65 20 61 73 0a 20 2a 20 6e 65 65  Update as. * nee
1af40 64 65 64 20 6f 6e 20 62 75 66 66 65 72 73 20 66  ded on buffers f
1af50 75 6c 6c 20 6f 66 20 62 79 74 65 73 2c 20 61 6e  ull of bytes, an
1af60 64 20 74 68 65 6e 20 63 61 6c 6c 20 4d 44 35 46  d then call MD5F
1af70 69 6e 61 6c 2c 20 77 68 69 63 68 0a 20 2a 20 77  inal, which. * w
1af80 69 6c 6c 20 66 69 6c 6c 20 61 20 73 75 70 70 6c  ill fill a suppl
1af90 69 65 64 20 31 36 2d 62 79 74 65 20 61 72 72 61  ied 16-byte arra
1afa0 79 20 77 69 74 68 20 74 68 65 20 64 69 67 65 73  y with the diges
1afb0 74 2e 0a 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 49 66  t.. */../*. * If
1afc0 20 63 6f 6d 70 69 6c 65 64 20 6f 6e 20 61 20 6d   compiled on a m
1afd0 61 63 68 69 6e 65 20 74 68 61 74 20 64 6f 65 73  achine that does
1afe0 6e 27 74 20 68 61 76 65 20 61 20 33 32 2d 62 69  n't have a 32-bi
1aff0 74 20 69 6e 74 65 67 65 72 2c 0a 20 2a 20 79 6f  t integer,. * yo
1b000 75 20 6a 75 73 74 20 73 65 74 20 22 75 69 6e 74  u just set "uint
1b010 33 32 22 20 74 6f 20 74 68 65 20 61 70 70 72 6f  32" to the appro
1b020 70 72 69 61 74 65 20 64 61 74 61 74 79 70 65 20  priate datatype 
1b030 66 6f 72 20 61 6e 0a 20 2a 20 75 6e 73 69 67 6e  for an. * unsign
1b040 65 64 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65  ed 32-bit intege
1b050 72 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a  r.  For example:
1b060 0a 20 2a 0a 20 2a 20 20 20 20 20 20 20 63 63 20  . *. *       cc 
1b070 2d 44 75 69 6e 74 33 32 3d 27 75 6e 73 69 67 6e  -Duint32='unsign
1b080 65 64 20 6c 6f 6e 67 27 20 6d 64 35 2e 63 0a 20  ed long' md5.c. 
1b090 2a 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 75 69  *. */.#ifndef ui
1b0a0 6e 74 33 32 0a 23 20 20 64 65 66 69 6e 65 20 75  nt32.#  define u
1b0b0 69 6e 74 33 32 20 75 6e 73 69 67 6e 65 64 20 69  int32 unsigned i
1b0c0 6e 74 0a 23 65 6e 64 69 66 0a 0a 73 74 72 75 63  nt.#endif..struc
1b0d0 74 20 4d 44 35 43 6f 6e 74 65 78 74 20 7b 0a 20  t MD5Context {. 
1b0e0 20 69 6e 74 20 69 73 49 6e 69 74 3b 0a 20 20 75   int isInit;.  u
1b0f0 69 6e 74 33 32 20 62 75 66 5b 34 5d 3b 0a 20 20  int32 buf[4];.  
1b100 75 69 6e 74 33 32 20 62 69 74 73 5b 32 5d 3b 0a  uint32 bits[2];.
1b110 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1b120 69 6e 5b 36 34 5d 3b 0a 7d 3b 0a 74 79 70 65 64  in[64];.};.typed
1b130 65 66 20 73 74 72 75 63 74 20 4d 44 35 43 6f 6e  ef struct MD5Con
1b140 74 65 78 74 20 4d 44 35 43 6f 6e 74 65 78 74 3b  text MD5Context;
1b150 0a 0a 2f 2a 0a 20 2a 20 4e 6f 74 65 3a 20 74 68  ../*. * Note: th
1b160 69 73 20 63 6f 64 65 20 69 73 20 68 61 72 6d 6c  is code is harml
1b170 65 73 73 20 6f 6e 20 6c 69 74 74 6c 65 2d 65 6e  ess on little-en
1b180 64 69 61 6e 20 6d 61 63 68 69 6e 65 73 2e 0a 20  dian machines.. 
1b190 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
1b1a0 79 74 65 52 65 76 65 72 73 65 20 28 75 6e 73 69  yteReverse (unsi
1b1b0 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20  gned char *buf, 
1b1c0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 73 29 7b  unsigned longs){
1b1d0 0a 20 20 20 20 20 20 20 20 75 69 6e 74 33 32 20  .        uint32 
1b1e0 74 3b 0a 20 20 20 20 20 20 20 20 64 6f 20 7b 0a  t;.        do {.
1b1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b200 74 20 3d 20 28 75 69 6e 74 33 32 29 28 28 75 6e  t = (uint32)((un
1b210 73 69 67 6e 65 64 29 62 75 66 5b 33 5d 3c 3c 38  signed)buf[3]<<8
1b220 20 7c 20 62 75 66 5b 32 5d 29 20 3c 3c 20 31 36   | buf[2]) << 16
1b230 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
1b240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1b250 28 75 6e 73 69 67 6e 65 64 29 62 75 66 5b 31 5d  (unsigned)buf[1]
1b260 3c 3c 38 20 7c 20 62 75 66 5b 30 5d 29 3b 0a 20  <<8 | buf[0]);. 
1b270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
1b280 28 75 69 6e 74 33 32 20 2a 29 62 75 66 20 3d 20  (uint32 *)buf = 
1b290 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t;.             
1b2a0 20 20 20 62 75 66 20 2b 3d 20 34 3b 0a 20 20 20     buf += 4;.   
1b2b0 20 20 20 20 20 7d 20 77 68 69 6c 65 20 28 2d 2d       } while (--
1b2c0 6c 6f 6e 67 73 29 3b 0a 7d 0a 2f 2a 20 54 68 65  longs);.}./* The
1b2d0 20 66 6f 75 72 20 63 6f 72 65 20 66 75 6e 63 74   four core funct
1b2e0 69 6f 6e 73 20 2d 20 46 31 20 69 73 20 6f 70 74  ions - F1 is opt
1b2f0 69 6d 69 7a 65 64 20 73 6f 6d 65 77 68 61 74 20  imized somewhat 
1b300 2a 2f 0a 0a 2f 2a 20 23 64 65 66 69 6e 65 20 46  */../* #define F
1b310 31 28 78 2c 20 79 2c 20 7a 29 20 28 78 20 26 20  1(x, y, z) (x & 
1b320 79 20 7c 20 7e 78 20 26 20 7a 29 20 2a 2f 0a 23  y | ~x & z) */.#
1b330 64 65 66 69 6e 65 20 46 31 28 78 2c 20 79 2c 20  define F1(x, y, 
1b340 7a 29 20 28 7a 20 5e 20 28 78 20 26 20 28 79 20  z) (z ^ (x & (y 
1b350 5e 20 7a 29 29 29 0a 23 64 65 66 69 6e 65 20 46  ^ z))).#define F
1b360 32 28 78 2c 20 79 2c 20 7a 29 20 46 31 28 7a 2c  2(x, y, z) F1(z,
1b370 20 78 2c 20 79 29 0a 23 64 65 66 69 6e 65 20 46   x, y).#define F
1b380 33 28 78 2c 20 79 2c 20 7a 29 20 28 78 20 5e 20  3(x, y, z) (x ^ 
1b390 79 20 5e 20 7a 29 0a 23 64 65 66 69 6e 65 20 46  y ^ z).#define F
1b3a0 34 28 78 2c 20 79 2c 20 7a 29 20 28 79 20 5e 20  4(x, y, z) (y ^ 
1b3b0 28 78 20 7c 20 7e 7a 29 29 0a 0a 2f 2a 20 54 68  (x | ~z))../* Th
1b3c0 69 73 20 69 73 20 74 68 65 20 63 65 6e 74 72 61  is is the centra
1b3d0 6c 20 73 74 65 70 20 69 6e 20 74 68 65 20 4d 44  l step in the MD
1b3e0 35 20 61 6c 67 6f 72 69 74 68 6d 2e 20 2a 2f 0a  5 algorithm. */.
1b3f0 23 64 65 66 69 6e 65 20 4d 44 35 53 54 45 50 28  #define MD5STEP(
1b400 66 2c 20 77 2c 20 78 2c 20 79 2c 20 7a 2c 20 64  f, w, x, y, z, d
1b410 61 74 61 2c 20 73 29 20 5c 0a 20 20 20 20 20 20  ata, s) \.      
1b420 20 20 28 20 77 20 2b 3d 20 66 28 78 2c 20 79 2c    ( w += f(x, y,
1b430 20 7a 29 20 2b 20 64 61 74 61 2c 20 20 77 20 3d   z) + data,  w =
1b440 20 77 3c 3c 73 20 7c 20 77 3e 3e 28 33 32 2d 73   w<<s | w>>(32-s
1b450 29 2c 20 20 77 20 2b 3d 20 78 20 29 0a 0a 2f 2a  ),  w += x )../*
1b460 0a 20 2a 20 54 68 65 20 63 6f 72 65 20 6f 66 20  . * The core of 
1b470 74 68 65 20 4d 44 35 20 61 6c 67 6f 72 69 74 68  the MD5 algorith
1b480 6d 2c 20 74 68 69 73 20 61 6c 74 65 72 73 20 61  m, this alters a
1b490 6e 20 65 78 69 73 74 69 6e 67 20 4d 44 35 20 68  n existing MD5 h
1b4a0 61 73 68 20 74 6f 0a 20 2a 20 72 65 66 6c 65 63  ash to. * reflec
1b4b0 74 20 74 68 65 20 61 64 64 69 74 69 6f 6e 20 6f  t the addition o
1b4c0 66 20 31 36 20 6c 6f 6e 67 77 6f 72 64 73 20 6f  f 16 longwords o
1b4d0 66 20 6e 65 77 20 64 61 74 61 2e 20 20 4d 44 35  f new data.  MD5
1b4e0 55 70 64 61 74 65 20 62 6c 6f 63 6b 73 0a 20 2a  Update blocks. *
1b4f0 20 74 68 65 20 64 61 74 61 20 61 6e 64 20 63 6f   the data and co
1b500 6e 76 65 72 74 73 20 62 79 74 65 73 20 69 6e 74  nverts bytes int
1b510 6f 20 6c 6f 6e 67 77 6f 72 64 73 20 66 6f 72 20  o longwords for 
1b520 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 20 2a  this routine.. *
1b530 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 4d 44  /.static void MD
1b540 35 54 72 61 6e 73 66 6f 72 6d 28 75 69 6e 74 33  5Transform(uint3
1b550 32 20 62 75 66 5b 34 5d 2c 20 63 6f 6e 73 74 20  2 buf[4], const 
1b560 75 69 6e 74 33 32 20 69 6e 5b 31 36 5d 29 7b 0a  uint32 in[16]){.
1b570 20 20 20 20 20 20 20 20 72 65 67 69 73 74 65 72          register
1b580 20 75 69 6e 74 33 32 20 61 2c 20 62 2c 20 63 2c   uint32 a, b, c,
1b590 20 64 3b 0a 0a 20 20 20 20 20 20 20 20 61 20 3d   d;..        a =
1b5a0 20 62 75 66 5b 30 5d 3b 0a 20 20 20 20 20 20 20   buf[0];.       
1b5b0 20 62 20 3d 20 62 75 66 5b 31 5d 3b 0a 20 20 20   b = buf[1];.   
1b5c0 20 20 20 20 20 63 20 3d 20 62 75 66 5b 32 5d 3b       c = buf[2];
1b5d0 0a 20 20 20 20 20 20 20 20 64 20 3d 20 62 75 66  .        d = buf
1b5e0 5b 33 5d 3b 0a 0a 20 20 20 20 20 20 20 20 4d 44  [3];..        MD
1b5f0 35 53 54 45 50 28 46 31 2c 20 61 2c 20 62 2c 20  5STEP(F1, a, b, 
1b600 63 2c 20 64 2c 20 69 6e 5b 20 30 5d 2b 30 78 64  c, d, in[ 0]+0xd
1b610 37 36 61 61 34 37 38 2c 20 20 37 29 3b 0a 20 20  76aa478,  7);.  
1b620 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31        MD5STEP(F1
1b630 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e  , d, a, b, c, in
1b640 5b 20 31 5d 2b 30 78 65 38 63 37 62 37 35 36 2c  [ 1]+0xe8c7b756,
1b650 20 31 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   12);.        MD
1b660 35 53 54 45 50 28 46 31 2c 20 63 2c 20 64 2c 20  5STEP(F1, c, d, 
1b670 61 2c 20 62 2c 20 69 6e 5b 20 32 5d 2b 30 78 32  a, b, in[ 2]+0x2
1b680 34 32 30 37 30 64 62 2c 20 31 37 29 3b 0a 20 20  42070db, 17);.  
1b690 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31        MD5STEP(F1
1b6a0 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
1b6b0 5b 20 33 5d 2b 30 78 63 31 62 64 63 65 65 65 2c  [ 3]+0xc1bdceee,
1b6c0 20 32 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   22);.        MD
1b6d0 35 53 54 45 50 28 46 31 2c 20 61 2c 20 62 2c 20  5STEP(F1, a, b, 
1b6e0 63 2c 20 64 2c 20 69 6e 5b 20 34 5d 2b 30 78 66  c, d, in[ 4]+0xf
1b6f0 35 37 63 30 66 61 66 2c 20 20 37 29 3b 0a 20 20  57c0faf,  7);.  
1b700 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31        MD5STEP(F1
1b710 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e  , d, a, b, c, in
1b720 5b 20 35 5d 2b 30 78 34 37 38 37 63 36 32 61 2c  [ 5]+0x4787c62a,
1b730 20 31 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   12);.        MD
1b740 35 53 54 45 50 28 46 31 2c 20 63 2c 20 64 2c 20  5STEP(F1, c, d, 
1b750 61 2c 20 62 2c 20 69 6e 5b 20 36 5d 2b 30 78 61  a, b, in[ 6]+0xa
1b760 38 33 30 34 36 31 33 2c 20 31 37 29 3b 0a 20 20  8304613, 17);.  
1b770 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31        MD5STEP(F1
1b780 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
1b790 5b 20 37 5d 2b 30 78 66 64 34 36 39 35 30 31 2c  [ 7]+0xfd469501,
1b7a0 20 32 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   22);.        MD
1b7b0 35 53 54 45 50 28 46 31 2c 20 61 2c 20 62 2c 20  5STEP(F1, a, b, 
1b7c0 63 2c 20 64 2c 20 69 6e 5b 20 38 5d 2b 30 78 36  c, d, in[ 8]+0x6
1b7d0 39 38 30 39 38 64 38 2c 20 20 37 29 3b 0a 20 20  98098d8,  7);.  
1b7e0 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31        MD5STEP(F1
1b7f0 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e  , d, a, b, c, in
1b800 5b 20 39 5d 2b 30 78 38 62 34 34 66 37 61 66 2c  [ 9]+0x8b44f7af,
1b810 20 31 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   12);.        MD
1b820 35 53 54 45 50 28 46 31 2c 20 63 2c 20 64 2c 20  5STEP(F1, c, d, 
1b830 61 2c 20 62 2c 20 69 6e 5b 31 30 5d 2b 30 78 66  a, b, in[10]+0xf
1b840 66 66 66 35 62 62 31 2c 20 31 37 29 3b 0a 20 20  fff5bb1, 17);.  
1b850 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31        MD5STEP(F1
1b860 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
1b870 5b 31 31 5d 2b 30 78 38 39 35 63 64 37 62 65 2c  [11]+0x895cd7be,
1b880 20 32 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   22);.        MD
1b890 35 53 54 45 50 28 46 31 2c 20 61 2c 20 62 2c 20  5STEP(F1, a, b, 
1b8a0 63 2c 20 64 2c 20 69 6e 5b 31 32 5d 2b 30 78 36  c, d, in[12]+0x6
1b8b0 62 39 30 31 31 32 32 2c 20 20 37 29 3b 0a 20 20  b901122,  7);.  
1b8c0 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31        MD5STEP(F1
1b8d0 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e  , d, a, b, c, in
1b8e0 5b 31 33 5d 2b 30 78 66 64 39 38 37 31 39 33 2c  [13]+0xfd987193,
1b8f0 20 31 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   12);.        MD
1b900 35 53 54 45 50 28 46 31 2c 20 63 2c 20 64 2c 20  5STEP(F1, c, d, 
1b910 61 2c 20 62 2c 20 69 6e 5b 31 34 5d 2b 30 78 61  a, b, in[14]+0xa
1b920 36 37 39 34 33 38 65 2c 20 31 37 29 3b 0a 20 20  679438e, 17);.  
1b930 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31        MD5STEP(F1
1b940 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
1b950 5b 31 35 5d 2b 30 78 34 39 62 34 30 38 32 31 2c  [15]+0x49b40821,
1b960 20 32 32 29 3b 0a 0a 20 20 20 20 20 20 20 20 4d   22);..        M
1b970 44 35 53 54 45 50 28 46 32 2c 20 61 2c 20 62 2c  D5STEP(F2, a, b,
1b980 20 63 2c 20 64 2c 20 69 6e 5b 20 31 5d 2b 30 78   c, d, in[ 1]+0x
1b990 66 36 31 65 32 35 36 32 2c 20 20 35 29 3b 0a 20  f61e2562,  5);. 
1b9a0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
1b9b0 32 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69  2, d, a, b, c, i
1b9c0 6e 5b 20 36 5d 2b 30 78 63 30 34 30 62 33 34 30  n[ 6]+0xc040b340
1b9d0 2c 20 20 39 29 3b 0a 20 20 20 20 20 20 20 20 4d  ,  9);.        M
1b9e0 44 35 53 54 45 50 28 46 32 2c 20 63 2c 20 64 2c  D5STEP(F2, c, d,
1b9f0 20 61 2c 20 62 2c 20 69 6e 5b 31 31 5d 2b 30 78   a, b, in[11]+0x
1ba00 32 36 35 65 35 61 35 31 2c 20 31 34 29 3b 0a 20  265e5a51, 14);. 
1ba10 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
1ba20 32 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  2, b, c, d, a, i
1ba30 6e 5b 20 30 5d 2b 30 78 65 39 62 36 63 37 61 61  n[ 0]+0xe9b6c7aa
1ba40 2c 20 32 30 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 20);.        M
1ba50 44 35 53 54 45 50 28 46 32 2c 20 61 2c 20 62 2c  D5STEP(F2, a, b,
1ba60 20 63 2c 20 64 2c 20 69 6e 5b 20 35 5d 2b 30 78   c, d, in[ 5]+0x
1ba70 64 36 32 66 31 30 35 64 2c 20 20 35 29 3b 0a 20  d62f105d,  5);. 
1ba80 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
1ba90 32 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69  2, d, a, b, c, i
1baa0 6e 5b 31 30 5d 2b 30 78 30 32 34 34 31 34 35 33  n[10]+0x02441453
1bab0 2c 20 20 39 29 3b 0a 20 20 20 20 20 20 20 20 4d  ,  9);.        M
1bac0 44 35 53 54 45 50 28 46 32 2c 20 63 2c 20 64 2c  D5STEP(F2, c, d,
1bad0 20 61 2c 20 62 2c 20 69 6e 5b 31 35 5d 2b 30 78   a, b, in[15]+0x
1bae0 64 38 61 31 65 36 38 31 2c 20 31 34 29 3b 0a 20  d8a1e681, 14);. 
1baf0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
1bb00 32 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  2, b, c, d, a, i
1bb10 6e 5b 20 34 5d 2b 30 78 65 37 64 33 66 62 63 38  n[ 4]+0xe7d3fbc8
1bb20 2c 20 32 30 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 20);.        M
1bb30 44 35 53 54 45 50 28 46 32 2c 20 61 2c 20 62 2c  D5STEP(F2, a, b,
1bb40 20 63 2c 20 64 2c 20 69 6e 5b 20 39 5d 2b 30 78   c, d, in[ 9]+0x
1bb50 32 31 65 31 63 64 65 36 2c 20 20 35 29 3b 0a 20  21e1cde6,  5);. 
1bb60 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
1bb70 32 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69  2, d, a, b, c, i
1bb80 6e 5b 31 34 5d 2b 30 78 63 33 33 37 30 37 64 36  n[14]+0xc33707d6
1bb90 2c 20 20 39 29 3b 0a 20 20 20 20 20 20 20 20 4d  ,  9);.        M
1bba0 44 35 53 54 45 50 28 46 32 2c 20 63 2c 20 64 2c  D5STEP(F2, c, d,
1bbb0 20 61 2c 20 62 2c 20 69 6e 5b 20 33 5d 2b 30 78   a, b, in[ 3]+0x
1bbc0 66 34 64 35 30 64 38 37 2c 20 31 34 29 3b 0a 20  f4d50d87, 14);. 
1bbd0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
1bbe0 32 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  2, b, c, d, a, i
1bbf0 6e 5b 20 38 5d 2b 30 78 34 35 35 61 31 34 65 64  n[ 8]+0x455a14ed
1bc00 2c 20 32 30 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 20);.        M
1bc10 44 35 53 54 45 50 28 46 32 2c 20 61 2c 20 62 2c  D5STEP(F2, a, b,
1bc20 20 63 2c 20 64 2c 20 69 6e 5b 31 33 5d 2b 30 78   c, d, in[13]+0x
1bc30 61 39 65 33 65 39 30 35 2c 20 20 35 29 3b 0a 20  a9e3e905,  5);. 
1bc40 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
1bc50 32 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69  2, d, a, b, c, i
1bc60 6e 5b 20 32 5d 2b 30 78 66 63 65 66 61 33 66 38  n[ 2]+0xfcefa3f8
1bc70 2c 20 20 39 29 3b 0a 20 20 20 20 20 20 20 20 4d  ,  9);.        M
1bc80 44 35 53 54 45 50 28 46 32 2c 20 63 2c 20 64 2c  D5STEP(F2, c, d,
1bc90 20 61 2c 20 62 2c 20 69 6e 5b 20 37 5d 2b 30 78   a, b, in[ 7]+0x
1bca0 36 37 36 66 30 32 64 39 2c 20 31 34 29 3b 0a 20  676f02d9, 14);. 
1bcb0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
1bcc0 32 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  2, b, c, d, a, i
1bcd0 6e 5b 31 32 5d 2b 30 78 38 64 32 61 34 63 38 61  n[12]+0x8d2a4c8a
1bce0 2c 20 32 30 29 3b 0a 0a 20 20 20 20 20 20 20 20  , 20);..        
1bcf0 4d 44 35 53 54 45 50 28 46 33 2c 20 61 2c 20 62  MD5STEP(F3, a, b
1bd00 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 35 5d 2b 30  , c, d, in[ 5]+0
1bd10 78 66 66 66 61 33 39 34 32 2c 20 20 34 29 3b 0a  xfffa3942,  4);.
1bd20 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
1bd30 46 33 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20  F3, d, a, b, c, 
1bd40 69 6e 5b 20 38 5d 2b 30 78 38 37 37 31 66 36 38  in[ 8]+0x8771f68
1bd50 31 2c 20 31 31 29 3b 0a 20 20 20 20 20 20 20 20  1, 11);.        
1bd60 4d 44 35 53 54 45 50 28 46 33 2c 20 63 2c 20 64  MD5STEP(F3, c, d
1bd70 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 31 5d 2b 30  , a, b, in[11]+0
1bd80 78 36 64 39 64 36 31 32 32 2c 20 31 36 29 3b 0a  x6d9d6122, 16);.
1bd90 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
1bda0 46 33 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20  F3, b, c, d, a, 
1bdb0 69 6e 5b 31 34 5d 2b 30 78 66 64 65 35 33 38 30  in[14]+0xfde5380
1bdc0 63 2c 20 32 33 29 3b 0a 20 20 20 20 20 20 20 20  c, 23);.        
1bdd0 4d 44 35 53 54 45 50 28 46 33 2c 20 61 2c 20 62  MD5STEP(F3, a, b
1bde0 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 31 5d 2b 30  , c, d, in[ 1]+0
1bdf0 78 61 34 62 65 65 61 34 34 2c 20 20 34 29 3b 0a  xa4beea44,  4);.
1be00 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
1be10 46 33 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20  F3, d, a, b, c, 
1be20 69 6e 5b 20 34 5d 2b 30 78 34 62 64 65 63 66 61  in[ 4]+0x4bdecfa
1be30 39 2c 20 31 31 29 3b 0a 20 20 20 20 20 20 20 20  9, 11);.        
1be40 4d 44 35 53 54 45 50 28 46 33 2c 20 63 2c 20 64  MD5STEP(F3, c, d
1be50 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 37 5d 2b 30  , a, b, in[ 7]+0
1be60 78 66 36 62 62 34 62 36 30 2c 20 31 36 29 3b 0a  xf6bb4b60, 16);.
1be70 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
1be80 46 33 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20  F3, b, c, d, a, 
1be90 69 6e 5b 31 30 5d 2b 30 78 62 65 62 66 62 63 37  in[10]+0xbebfbc7
1bea0 30 2c 20 32 33 29 3b 0a 20 20 20 20 20 20 20 20  0, 23);.        
1beb0 4d 44 35 53 54 45 50 28 46 33 2c 20 61 2c 20 62  MD5STEP(F3, a, b
1bec0 2c 20 63 2c 20 64 2c 20 69 6e 5b 31 33 5d 2b 30  , c, d, in[13]+0
1bed0 78 32 38 39 62 37 65 63 36 2c 20 20 34 29 3b 0a  x289b7ec6,  4);.
1bee0 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
1bef0 46 33 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20  F3, d, a, b, c, 
1bf00 69 6e 5b 20 30 5d 2b 30 78 65 61 61 31 32 37 66  in[ 0]+0xeaa127f
1bf10 61 2c 20 31 31 29 3b 0a 20 20 20 20 20 20 20 20  a, 11);.        
1bf20 4d 44 35 53 54 45 50 28 46 33 2c 20 63 2c 20 64  MD5STEP(F3, c, d
1bf30 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 33 5d 2b 30  , a, b, in[ 3]+0
1bf40 78 64 34 65 66 33 30 38 35 2c 20 31 36 29 3b 0a  xd4ef3085, 16);.
1bf50 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
1bf60 46 33 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20  F3, b, c, d, a, 
1bf70 69 6e 5b 20 36 5d 2b 30 78 30 34 38 38 31 64 30  in[ 6]+0x04881d0
1bf80 35 2c 20 32 33 29 3b 0a 20 20 20 20 20 20 20 20  5, 23);.        
1bf90 4d 44 35 53 54 45 50 28 46 33 2c 20 61 2c 20 62  MD5STEP(F3, a, b
1bfa0 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 39 5d 2b 30  , c, d, in[ 9]+0
1bfb0 78 64 39 64 34 64 30 33 39 2c 20 20 34 29 3b 0a  xd9d4d039,  4);.
1bfc0 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
1bfd0 46 33 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20  F3, d, a, b, c, 
1bfe0 69 6e 5b 31 32 5d 2b 30 78 65 36 64 62 39 39 65  in[12]+0xe6db99e
1bff0 35 2c 20 31 31 29 3b 0a 20 20 20 20 20 20 20 20  5, 11);.        
1c000 4d 44 35 53 54 45 50 28 46 33 2c 20 63 2c 20 64  MD5STEP(F3, c, d
1c010 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 35 5d 2b 30  , a, b, in[15]+0
1c020 78 31 66 61 32 37 63 66 38 2c 20 31 36 29 3b 0a  x1fa27cf8, 16);.
1c030 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
1c040 46 33 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20  F3, b, c, d, a, 
1c050 69 6e 5b 20 32 5d 2b 30 78 63 34 61 63 35 36 36  in[ 2]+0xc4ac566
1c060 35 2c 20 32 33 29 3b 0a 0a 20 20 20 20 20 20 20  5, 23);..       
1c070 20 4d 44 35 53 54 45 50 28 46 34 2c 20 61 2c 20   MD5STEP(F4, a, 
1c080 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 30 5d 2b  b, c, d, in[ 0]+
1c090 30 78 66 34 32 39 32 32 34 34 2c 20 20 36 29 3b  0xf4292244,  6);
1c0a0 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1c0b0 28 46 34 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c  (F4, d, a, b, c,
1c0c0 20 69 6e 5b 20 37 5d 2b 30 78 34 33 32 61 66 66   in[ 7]+0x432aff
1c0d0 39 37 2c 20 31 30 29 3b 0a 20 20 20 20 20 20 20  97, 10);.       
1c0e0 20 4d 44 35 53 54 45 50 28 46 34 2c 20 63 2c 20   MD5STEP(F4, c, 
1c0f0 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 34 5d 2b  d, a, b, in[14]+
1c100 30 78 61 62 39 34 32 33 61 37 2c 20 31 35 29 3b  0xab9423a7, 15);
1c110 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1c120 28 46 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c  (F4, b, c, d, a,
1c130 20 69 6e 5b 20 35 5d 2b 30 78 66 63 39 33 61 30   in[ 5]+0xfc93a0
1c140 33 39 2c 20 32 31 29 3b 0a 20 20 20 20 20 20 20  39, 21);.       
1c150 20 4d 44 35 53 54 45 50 28 46 34 2c 20 61 2c 20   MD5STEP(F4, a, 
1c160 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 31 32 5d 2b  b, c, d, in[12]+
1c170 30 78 36 35 35 62 35 39 63 33 2c 20 20 36 29 3b  0x655b59c3,  6);
1c180 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1c190 28 46 34 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c  (F4, d, a, b, c,
1c1a0 20 69 6e 5b 20 33 5d 2b 30 78 38 66 30 63 63 63   in[ 3]+0x8f0ccc
1c1b0 39 32 2c 20 31 30 29 3b 0a 20 20 20 20 20 20 20  92, 10);.       
1c1c0 20 4d 44 35 53 54 45 50 28 46 34 2c 20 63 2c 20   MD5STEP(F4, c, 
1c1d0 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 30 5d 2b  d, a, b, in[10]+
1c1e0 30 78 66 66 65 66 66 34 37 64 2c 20 31 35 29 3b  0xffeff47d, 15);
1c1f0 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1c200 28 46 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c  (F4, b, c, d, a,
1c210 20 69 6e 5b 20 31 5d 2b 30 78 38 35 38 34 35 64   in[ 1]+0x85845d
1c220 64 31 2c 20 32 31 29 3b 0a 20 20 20 20 20 20 20  d1, 21);.       
1c230 20 4d 44 35 53 54 45 50 28 46 34 2c 20 61 2c 20   MD5STEP(F4, a, 
1c240 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 38 5d 2b  b, c, d, in[ 8]+
1c250 30 78 36 66 61 38 37 65 34 66 2c 20 20 36 29 3b  0x6fa87e4f,  6);
1c260 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1c270 28 46 34 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c  (F4, d, a, b, c,
1c280 20 69 6e 5b 31 35 5d 2b 30 78 66 65 32 63 65 36   in[15]+0xfe2ce6
1c290 65 30 2c 20 31 30 29 3b 0a 20 20 20 20 20 20 20  e0, 10);.       
1c2a0 20 4d 44 35 53 54 45 50 28 46 34 2c 20 63 2c 20   MD5STEP(F4, c, 
1c2b0 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 36 5d 2b  d, a, b, in[ 6]+
1c2c0 30 78 61 33 30 31 34 33 31 34 2c 20 31 35 29 3b  0xa3014314, 15);
1c2d0 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1c2e0 28 46 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c  (F4, b, c, d, a,
1c2f0 20 69 6e 5b 31 33 5d 2b 30 78 34 65 30 38 31 31   in[13]+0x4e0811
1c300 61 31 2c 20 32 31 29 3b 0a 20 20 20 20 20 20 20  a1, 21);.       
1c310 20 4d 44 35 53 54 45 50 28 46 34 2c 20 61 2c 20   MD5STEP(F4, a, 
1c320 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 34 5d 2b  b, c, d, in[ 4]+
1c330 30 78 66 37 35 33 37 65 38 32 2c 20 20 36 29 3b  0xf7537e82,  6);
1c340 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1c350 28 46 34 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c  (F4, d, a, b, c,
1c360 20 69 6e 5b 31 31 5d 2b 30 78 62 64 33 61 66 32   in[11]+0xbd3af2
1c370 33 35 2c 20 31 30 29 3b 0a 20 20 20 20 20 20 20  35, 10);.       
1c380 20 4d 44 35 53 54 45 50 28 46 34 2c 20 63 2c 20   MD5STEP(F4, c, 
1c390 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 32 5d 2b  d, a, b, in[ 2]+
1c3a0 30 78 32 61 64 37 64 32 62 62 2c 20 31 35 29 3b  0x2ad7d2bb, 15);
1c3b0 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1c3c0 28 46 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c  (F4, b, c, d, a,
1c3d0 20 69 6e 5b 20 39 5d 2b 30 78 65 62 38 36 64 33   in[ 9]+0xeb86d3
1c3e0 39 31 2c 20 32 31 29 3b 0a 0a 20 20 20 20 20 20  91, 21);..      
1c3f0 20 20 62 75 66 5b 30 5d 20 2b 3d 20 61 3b 0a 20    buf[0] += a;. 
1c400 20 20 20 20 20 20 20 62 75 66 5b 31 5d 20 2b 3d         buf[1] +=
1c410 20 62 3b 0a 20 20 20 20 20 20 20 20 62 75 66 5b   b;.        buf[
1c420 32 5d 20 2b 3d 20 63 3b 0a 20 20 20 20 20 20 20  2] += c;.       
1c430 20 62 75 66 5b 33 5d 20 2b 3d 20 64 3b 0a 7d 0a   buf[3] += d;.}.
1c440 0a 2f 2a 0a 20 2a 20 53 74 61 72 74 20 4d 44 35  ./*. * Start MD5
1c450 20 61 63 63 75 6d 75 6c 61 74 69 6f 6e 2e 20 20   accumulation.  
1c460 53 65 74 20 62 69 74 20 63 6f 75 6e 74 20 74 6f  Set bit count to
1c470 20 30 20 61 6e 64 20 62 75 66 66 65 72 20 74 6f   0 and buffer to
1c480 20 6d 79 73 74 65 72 69 6f 75 73 0a 20 2a 20 69   mysterious. * i
1c490 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 63 6f  nitialization co
1c4a0 6e 73 74 61 6e 74 73 2e 0a 20 2a 2f 0a 73 74 61  nstants.. */.sta
1c4b0 74 69 63 20 76 6f 69 64 20 4d 44 35 49 6e 69 74  tic void MD5Init
1c4c0 28 4d 44 35 43 6f 6e 74 65 78 74 20 2a 63 74 78  (MD5Context *ctx
1c4d0 29 7b 0a 20 20 20 20 20 20 20 20 63 74 78 2d 3e  ){.        ctx->
1c4e0 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20  isInit = 1;.    
1c4f0 20 20 20 20 63 74 78 2d 3e 62 75 66 5b 30 5d 20      ctx->buf[0] 
1c500 3d 20 30 78 36 37 34 35 32 33 30 31 3b 0a 20 20  = 0x67452301;.  
1c510 20 20 20 20 20 20 63 74 78 2d 3e 62 75 66 5b 31        ctx->buf[1
1c520 5d 20 3d 20 30 78 65 66 63 64 61 62 38 39 3b 0a  ] = 0xefcdab89;.
1c530 20 20 20 20 20 20 20 20 63 74 78 2d 3e 62 75 66          ctx->buf
1c540 5b 32 5d 20 3d 20 30 78 39 38 62 61 64 63 66 65  [2] = 0x98badcfe
1c550 3b 0a 20 20 20 20 20 20 20 20 63 74 78 2d 3e 62  ;.        ctx->b
1c560 75 66 5b 33 5d 20 3d 20 30 78 31 30 33 32 35 34  uf[3] = 0x103254
1c570 37 36 3b 0a 20 20 20 20 20 20 20 20 63 74 78 2d  76;.        ctx-
1c580 3e 62 69 74 73 5b 30 5d 20 3d 20 30 3b 0a 20 20  >bits[0] = 0;.  
1c590 20 20 20 20 20 20 63 74 78 2d 3e 62 69 74 73 5b        ctx->bits[
1c5a0 31 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  1] = 0;.}../*. *
1c5b0 20 55 70 64 61 74 65 20 63 6f 6e 74 65 78 74 20   Update context 
1c5c0 74 6f 20 72 65 66 6c 65 63 74 20 74 68 65 20 63  to reflect the c
1c5d0 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 20 6f 66 20  oncatenation of 
1c5e0 61 6e 6f 74 68 65 72 20 62 75 66 66 65 72 20 66  another buffer f
1c5f0 75 6c 6c 0a 20 2a 20 6f 66 20 62 79 74 65 73 2e  ull. * of bytes.
1c600 0a 20 2a 2f 0a 73 74 61 74 69 63 0a 76 6f 69 64  . */.static.void
1c610 20 4d 44 35 55 70 64 61 74 65 28 4d 44 35 43 6f   MD5Update(MD5Co
1c620 6e 74 65 78 74 20 2a 63 74 78 2c 20 63 6f 6e 73  ntext *ctx, cons
1c630 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
1c640 2a 62 75 66 2c 20 75 6e 73 69 67 6e 65 64 20 69  *buf, unsigned i
1c650 6e 74 20 6c 65 6e 29 7b 0a 20 20 20 20 20 20 20  nt len){.       
1c660 20 75 69 6e 74 33 32 20 74 3b 0a 0a 20 20 20 20   uint32 t;..    
1c670 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 62 69      /* Update bi
1c680 74 63 6f 75 6e 74 20 2a 2f 0a 0a 20 20 20 20 20  tcount */..     
1c690 20 20 20 74 20 3d 20 63 74 78 2d 3e 62 69 74 73     t = ctx->bits
1c6a0 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 20  [0];.        if 
1c6b0 28 28 63 74 78 2d 3e 62 69 74 73 5b 30 5d 20 3d  ((ctx->bits[0] =
1c6c0 20 74 20 2b 20 28 28 75 69 6e 74 33 32 29 6c 65   t + ((uint32)le
1c6d0 6e 20 3c 3c 20 33 29 29 20 3c 20 74 29 0a 20 20  n << 3)) < t).  
1c6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 74                ct
1c6f0 78 2d 3e 62 69 74 73 5b 31 5d 2b 2b 3b 20 2f 2a  x->bits[1]++; /*
1c700 20 43 61 72 72 79 20 66 72 6f 6d 20 6c 6f 77 20   Carry from low 
1c710 74 6f 20 68 69 67 68 20 2a 2f 0a 20 20 20 20 20  to high */.     
1c720 20 20 20 63 74 78 2d 3e 62 69 74 73 5b 31 5d 20     ctx->bits[1] 
1c730 2b 3d 20 6c 65 6e 20 3e 3e 20 32 39 3b 0a 0a 20  += len >> 29;.. 
1c740 20 20 20 20 20 20 20 74 20 3d 20 28 74 20 3e 3e         t = (t >>
1c750 20 33 29 20 26 20 30 78 33 66 3b 20 20 20 20 2f   3) & 0x3f;    /
1c760 2a 20 42 79 74 65 73 20 61 6c 72 65 61 64 79 20  * Bytes already 
1c770 69 6e 20 73 68 73 49 6e 66 6f 2d 3e 64 61 74 61  in shsInfo->data
1c780 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20   */..        /* 
1c790 48 61 6e 64 6c 65 20 61 6e 79 20 6c 65 61 64 69  Handle any leadi
1c7a0 6e 67 20 6f 64 64 2d 73 69 7a 65 64 20 63 68 75  ng odd-sized chu
1c7b0 6e 6b 73 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  nks */..        
1c7c0 69 66 20 28 20 74 20 29 20 7b 0a 20 20 20 20 20  if ( t ) {.     
1c7d0 20 20 20 20 20 20 20 20 20 20 20 75 6e 73 69 67             unsig
1c7e0 6e 65 64 20 63 68 61 72 20 2a 70 20 3d 20 28 75  ned char *p = (u
1c7f0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 63  nsigned char *)c
1c800 74 78 2d 3e 69 6e 20 2b 20 74 3b 0a 0a 20 20 20  tx->in + t;..   
1c810 20 20 20 20 20 20 20 20 20 20 20 20 20 74 20 3d               t =
1c820 20 36 34 2d 74 3b 0a 20 20 20 20 20 20 20 20 20   64-t;.         
1c830 20 20 20 20 20 20 20 69 66 20 28 6c 65 6e 20 3c         if (len <
1c840 20 74 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20   t) {.          
1c850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65                me
1c860 6d 63 70 79 28 70 2c 20 62 75 66 2c 20 6c 65 6e  mcpy(p, buf, len
1c870 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1c880 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
1c890 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n;.             
1c8a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1c8b0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 2c 20 62       memcpy(p, b
1c8c0 75 66 2c 20 74 29 3b 0a 20 20 20 20 20 20 20 20  uf, t);.        
1c8d0 20 20 20 20 20 20 20 20 62 79 74 65 52 65 76 65          byteReve
1c8e0 72 73 65 28 63 74 78 2d 3e 69 6e 2c 20 31 36 29  rse(ctx->in, 16)
1c8f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1c900 20 20 4d 44 35 54 72 61 6e 73 66 6f 72 6d 28 63    MD5Transform(c
1c910 74 78 2d 3e 62 75 66 2c 20 28 75 69 6e 74 33 32  tx->buf, (uint32
1c920 20 2a 29 63 74 78 2d 3e 69 6e 29 3b 0a 20 20 20   *)ctx->in);.   
1c930 20 20 20 20 20 20 20 20 20 20 20 20 20 62 75 66               buf
1c940 20 2b 3d 20 74 3b 0a 20 20 20 20 20 20 20 20 20   += t;.         
1c950 20 20 20 20 20 20 20 6c 65 6e 20 2d 3d 20 74 3b         len -= t;
1c960 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
1c970 20 20 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 64      /* Process d
1c980 61 74 61 20 69 6e 20 36 34 2d 62 79 74 65 20 63  ata in 64-byte c
1c990 68 75 6e 6b 73 20 2a 2f 0a 0a 20 20 20 20 20 20  hunks */..      
1c9a0 20 20 77 68 69 6c 65 20 28 6c 65 6e 20 3e 3d 20    while (len >= 
1c9b0 36 34 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  64) {.          
1c9c0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 63 74 78        memcpy(ctx
1c9d0 2d 3e 69 6e 2c 20 62 75 66 2c 20 36 34 29 3b 0a  ->in, buf, 64);.
1c9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c9f0 62 79 74 65 52 65 76 65 72 73 65 28 63 74 78 2d  byteReverse(ctx-
1ca00 3e 69 6e 2c 20 31 36 29 3b 0a 20 20 20 20 20 20  >in, 16);.      
1ca10 20 20 20 20 20 20 20 20 20 20 4d 44 35 54 72 61            MD5Tra
1ca20 6e 73 66 6f 72 6d 28 63 74 78 2d 3e 62 75 66 2c  nsform(ctx->buf,
1ca30 20 28 75 69 6e 74 33 32 20 2a 29 63 74 78 2d 3e   (uint32 *)ctx->
1ca40 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  in);.           
1ca50 20 20 20 20 20 62 75 66 20 2b 3d 20 36 34 3b 0a       buf += 64;.
1ca60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca70 6c 65 6e 20 2d 3d 20 36 34 3b 0a 20 20 20 20 20  len -= 64;.     
1ca80 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
1ca90 20 48 61 6e 64 6c 65 20 61 6e 79 20 72 65 6d 61   Handle any rema
1caa0 69 6e 69 6e 67 20 62 79 74 65 73 20 6f 66 20 64  ining bytes of d
1cab0 61 74 61 2e 20 2a 2f 0a 0a 20 20 20 20 20 20 20  ata. */..       
1cac0 20 6d 65 6d 63 70 79 28 63 74 78 2d 3e 69 6e 2c   memcpy(ctx->in,
1cad0 20 62 75 66 2c 20 6c 65 6e 29 3b 0a 7d 0a 0a 2f   buf, len);.}../
1cae0 2a 0a 20 2a 20 46 69 6e 61 6c 20 77 72 61 70 75  *. * Final wrapu
1caf0 70 20 2d 20 70 61 64 20 74 6f 20 36 34 2d 62 79  p - pad to 64-by
1cb00 74 65 20 62 6f 75 6e 64 61 72 79 20 77 69 74 68  te boundary with
1cb10 20 74 68 65 20 62 69 74 20 70 61 74 74 65 72 6e   the bit pattern
1cb20 0a 20 2a 20 31 20 30 2a 20 28 36 34 2d 62 69 74  . * 1 0* (64-bit
1cb30 20 63 6f 75 6e 74 20 6f 66 20 62 69 74 73 20 70   count of bits p
1cb40 72 6f 63 65 73 73 65 64 2c 20 4d 53 42 2d 66 69  rocessed, MSB-fi
1cb50 72 73 74 29 0a 20 2a 2f 0a 73 74 61 74 69 63 20  rst). */.static 
1cb60 76 6f 69 64 20 4d 44 35 46 69 6e 61 6c 28 75 6e  void MD5Final(un
1cb70 73 69 67 6e 65 64 20 63 68 61 72 20 64 69 67 65  signed char dige
1cb80 73 74 5b 31 36 5d 2c 20 4d 44 35 43 6f 6e 74 65  st[16], MD5Conte
1cb90 78 74 20 2a 63 74 78 29 7b 0a 20 20 20 20 20 20  xt *ctx){.      
1cba0 20 20 75 6e 73 69 67 6e 65 64 20 63 6f 75 6e 74    unsigned count
1cbb0 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e  ;.        unsign
1cbc0 65 64 20 63 68 61 72 20 2a 70 3b 0a 0a 20 20 20  ed char *p;..   
1cbd0 20 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20       /* Compute 
1cbe0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
1cbf0 6d 6f 64 20 36 34 20 2a 2f 0a 20 20 20 20 20 20  mod 64 */.      
1cc00 20 20 63 6f 75 6e 74 20 3d 20 28 63 74 78 2d 3e    count = (ctx->
1cc10 62 69 74 73 5b 30 5d 20 3e 3e 20 33 29 20 26 20  bits[0] >> 3) & 
1cc20 30 78 33 46 3b 0a 0a 20 20 20 20 20 20 20 20 2f  0x3F;..        /
1cc30 2a 20 53 65 74 20 74 68 65 20 66 69 72 73 74 20  * Set the first 
1cc40 63 68 61 72 20 6f 66 20 70 61 64 64 69 6e 67 20  char of padding 
1cc50 74 6f 20 30 78 38 30 2e 20 20 54 68 69 73 20 69  to 0x80.  This i
1cc60 73 20 73 61 66 65 20 73 69 6e 63 65 20 74 68 65  s safe since the
1cc70 72 65 20 69 73 0a 20 20 20 20 20 20 20 20 20 20  re is.          
1cc80 20 61 6c 77 61 79 73 20 61 74 20 6c 65 61 73 74   always at least
1cc90 20 6f 6e 65 20 62 79 74 65 20 66 72 65 65 20 2a   one byte free *
1cca0 2f 0a 20 20 20 20 20 20 20 20 70 20 3d 20 63 74  /.        p = ct
1ccb0 78 2d 3e 69 6e 20 2b 20 63 6f 75 6e 74 3b 0a 20  x->in + count;. 
1ccc0 20 20 20 20 20 20 20 2a 70 2b 2b 20 3d 20 30 78         *p++ = 0x
1ccd0 38 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  80;..        /* 
1cce0 42 79 74 65 73 20 6f 66 20 70 61 64 64 69 6e 67  Bytes of padding
1ccf0 20 6e 65 65 64 65 64 20 74 6f 20 6d 61 6b 65 20   needed to make 
1cd00 36 34 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20  64 bytes */.    
1cd10 20 20 20 20 63 6f 75 6e 74 20 3d 20 36 34 20 2d      count = 64 -
1cd20 20 31 20 2d 20 63 6f 75 6e 74 3b 0a 0a 20 20 20   1 - count;..   
1cd30 20 20 20 20 20 2f 2a 20 50 61 64 20 6f 75 74 20       /* Pad out 
1cd40 74 6f 20 35 36 20 6d 6f 64 20 36 34 20 2a 2f 0a  to 56 mod 64 */.
1cd50 20 20 20 20 20 20 20 20 69 66 20 28 63 6f 75 6e          if (coun
1cd60 74 20 3c 20 38 29 20 7b 0a 20 20 20 20 20 20 20  t < 8) {.       
1cd70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20           /* Two 
1cd80 6c 6f 74 73 20 6f 66 20 70 61 64 64 69 6e 67 3a  lots of padding:
1cd90 20 20 50 61 64 20 74 68 65 20 66 69 72 73 74 20    Pad the first 
1cda0 62 6c 6f 63 6b 20 74 6f 20 36 34 20 62 79 74 65  block to 64 byte
1cdb0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  s */.           
1cdc0 20 20 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30       memset(p, 0
1cdd0 2c 20 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20  , count);.      
1cde0 20 20 20 20 20 20 20 20 20 20 62 79 74 65 52 65            byteRe
1cdf0 76 65 72 73 65 28 63 74 78 2d 3e 69 6e 2c 20 31  verse(ctx->in, 1
1ce00 36 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  6);.            
1ce10 20 20 20 20 4d 44 35 54 72 61 6e 73 66 6f 72 6d      MD5Transform
1ce20 28 63 74 78 2d 3e 62 75 66 2c 20 28 75 69 6e 74  (ctx->buf, (uint
1ce30 33 32 20 2a 29 63 74 78 2d 3e 69 6e 29 3b 0a 0a  32 *)ctx->in);..
1ce40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce50 2f 2a 20 4e 6f 77 20 66 69 6c 6c 20 74 68 65 20  /* Now fill the 
1ce60 6e 65 78 74 20 62 6c 6f 63 6b 20 77 69 74 68 20  next block with 
1ce70 35 36 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20  56 bytes */.    
1ce80 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73              mems
1ce90 65 74 28 63 74 78 2d 3e 69 6e 2c 20 30 2c 20 35  et(ctx->in, 0, 5
1cea0 36 29 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c  6);.        } el
1ceb0 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  se {.           
1cec0 20 20 20 20 20 2f 2a 20 50 61 64 20 62 6c 6f 63       /* Pad bloc
1ced0 6b 20 74 6f 20 35 36 20 62 79 74 65 73 20 2a 2f  k to 56 bytes */
1cee0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1cef0 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 63 6f   memset(p, 0, co
1cf00 75 6e 74 2d 38 29 3b 0a 20 20 20 20 20 20 20 20  unt-8);.        
1cf10 7d 0a 20 20 20 20 20 20 20 20 62 79 74 65 52 65  }.        byteRe
1cf20 76 65 72 73 65 28 63 74 78 2d 3e 69 6e 2c 20 31  verse(ctx->in, 1
1cf30 34 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  4);..        /* 
1cf40 41 70 70 65 6e 64 20 6c 65 6e 67 74 68 20 69 6e  Append length in
1cf50 20 62 69 74 73 20 61 6e 64 20 74 72 61 6e 73 66   bits and transf
1cf60 6f 72 6d 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d  orm */.        m
1cf70 65 6d 63 70 79 28 63 74 78 2d 3e 69 6e 20 2b 20  emcpy(ctx->in + 
1cf80 31 34 2a 34 2c 20 63 74 78 2d 3e 62 69 74 73 2c  14*4, ctx->bits,
1cf90 20 38 29 3b 0a 0a 20 20 20 20 20 20 20 20 4d 44   8);..        MD
1cfa0 35 54 72 61 6e 73 66 6f 72 6d 28 63 74 78 2d 3e  5Transform(ctx->
1cfb0 62 75 66 2c 20 28 75 69 6e 74 33 32 20 2a 29 63  buf, (uint32 *)c
1cfc0 74 78 2d 3e 69 6e 29 3b 0a 20 20 20 20 20 20 20  tx->in);.       
1cfd0 20 62 79 74 65 52 65 76 65 72 73 65 28 28 75 6e   byteReverse((un
1cfe0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 63 74  signed char *)ct
1cff0 78 2d 3e 62 75 66 2c 20 34 29 3b 0a 20 20 20 20  x->buf, 4);.    
1d000 20 20 20 20 6d 65 6d 63 70 79 28 64 69 67 65 73      memcpy(diges
1d010 74 2c 20 63 74 78 2d 3e 62 75 66 2c 20 31 36 29  t, ctx->buf, 16)
1d020 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  ;.}../*.** Conve
1d030 72 74 20 61 20 31 32 38 2d 62 69 74 20 4d 44 35  rt a 128-bit MD5
1d040 20 64 69 67 65 73 74 20 69 6e 74 6f 20 61 20 33   digest into a 3
1d050 32 2d 64 69 67 69 74 20 62 61 73 65 2d 31 36 20  2-digit base-16 
1d060 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  number..*/.stati
1d070 63 20 76 6f 69 64 20 4d 44 35 44 69 67 65 73 74  c void MD5Digest
1d080 54 6f 42 61 73 65 31 36 28 75 6e 73 69 67 6e 65  ToBase16(unsigne
1d090 64 20 63 68 61 72 20 2a 64 69 67 65 73 74 2c 20  d char *digest, 
1d0a0 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73  char *zBuf){.  s
1d0b0 74 61 74 69 63 20 63 68 61 72 20 63 6f 6e 73 74  tatic char const
1d0c0 20 7a 45 6e 63 6f 64 65 5b 5d 20 3d 20 22 30 31   zEncode[] = "01
1d0d0 32 33 34 35 36 37 38 39 61 62 63 64 65 66 22 3b  23456789abcdef";
1d0e0 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20  .  int i, j;..  
1d0f0 66 6f 72 28 6a 3d 69 3d 30 3b 20 69 3c 31 36 3b  for(j=i=0; i<16;
1d100 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 61   i++){.    int a
1d110 20 3d 20 64 69 67 65 73 74 5b 69 5d 3b 0a 20 20   = digest[i];.  
1d120 20 20 7a 42 75 66 5b 6a 2b 2b 5d 20 3d 20 7a 45    zBuf[j++] = zE
1d130 6e 63 6f 64 65 5b 28 61 3e 3e 34 29 26 30 78 66  ncode[(a>>4)&0xf
1d140 5d 3b 0a 20 20 20 20 7a 42 75 66 5b 6a 2b 2b 5d  ];.    zBuf[j++]
1d150 20 3d 20 7a 45 6e 63 6f 64 65 5b 61 20 26 20 30   = zEncode[a & 0
1d160 78 66 5d 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b  xf];.  }.  zBuf[
1d170 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  j] = 0;.}.../*.*
1d180 2a 20 43 6f 6e 76 65 72 74 20 61 20 31 32 38 2d  * Convert a 128-
1d190 62 69 74 20 4d 44 35 20 64 69 67 65 73 74 20 69  bit MD5 digest i
1d1a0 6e 74 6f 20 73 65 71 75 65 6e 63 79 20 6f 66 20  nto sequency of 
1d1b0 65 69 67 68 74 20 35 2d 64 69 67 69 74 20 69 6e  eight 5-digit in
1d1c0 74 65 67 65 72 73 0a 2a 2a 20 65 61 63 68 20 72  tegers.** each r
1d1d0 65 70 72 65 73 65 6e 74 69 6e 67 20 31 36 20 62  epresenting 16 b
1d1e0 69 74 73 20 6f 66 20 74 68 65 20 64 69 67 65 73  its of the diges
1d1f0 74 20 61 6e 64 20 73 65 70 61 72 61 74 65 64 20  t and separated 
1d200 66 72 6f 6d 20 65 61 63 68 0a 2a 2a 20 6f 74 68  from each.** oth
1d210 65 72 20 62 79 20 61 20 22 2d 22 20 63 68 61 72  er by a "-" char
1d220 61 63 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  acter..*/.static
1d230 20 76 6f 69 64 20 4d 44 35 44 69 67 65 73 74 54   void MD5DigestT
1d240 6f 42 61 73 65 31 30 78 38 28 75 6e 73 69 67 6e  oBase10x8(unsign
1d250 65 64 20 63 68 61 72 20 64 69 67 65 73 74 5b 31  ed char digest[1
1d260 36 5d 2c 20 63 68 61 72 20 7a 44 69 67 65 73 74  6], char zDigest
1d270 5b 35 30 5d 29 7b 0a 20 20 69 6e 74 20 69 2c 20  [50]){.  int i, 
1d280 6a 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  j;.  unsigned in
1d290 74 20 78 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  t x;.  for(i=j=0
1d2a0 3b 20 69 3c 31 36 3b 20 69 2b 3d 32 29 7b 0a 20  ; i<16; i+=2){. 
1d2b0 20 20 20 78 20 3d 20 64 69 67 65 73 74 5b 69 5d     x = digest[i]
1d2c0 2a 32 35 36 20 2b 20 64 69 67 65 73 74 5b 69 2b  *256 + digest[i+
1d2d0 31 5d 3b 0a 20 20 20 20 69 66 28 20 69 3e 30 20  1];.    if( i>0 
1d2e0 29 20 7a 44 69 67 65 73 74 5b 6a 2b 2b 5d 20 3d  ) zDigest[j++] =
1d2f0 20 27 2d 27 3b 0a 20 20 20 20 73 71 6c 69 74 65   '-';.    sqlite
1d300 33 5f 73 6e 70 72 69 6e 74 66 28 35 30 2d 6a 2c  3_snprintf(50-j,
1d310 20 26 7a 44 69 67 65 73 74 5b 6a 5d 2c 20 22 25   &zDigest[j], "%
1d320 30 35 75 22 2c 20 78 29 3b 0a 20 20 20 20 6a 20  05u", x);.    j 
1d330 2b 3d 20 35 3b 0a 20 20 7d 0a 20 20 7a 44 69 67  += 5;.  }.  zDig
1d340 65 73 74 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f  est[j] = 0;.}../
1d350 2a 0a 2a 2a 20 41 20 54 43 4c 20 63 6f 6d 6d 61  *.** A TCL comma
1d360 6e 64 20 66 6f 72 20 6d 64 35 2e 20 20 54 68 65  nd for md5.  The
1d370 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
1d380 20 74 65 78 74 20 74 6f 20 62 65 20 68 61 73 68   text to be hash
1d390 65 64 2e 20 20 54 68 65 0a 2a 2a 20 52 65 73 75  ed.  The.** Resu
1d3a0 6c 74 20 69 73 20 74 68 65 20 68 61 73 68 20 69  lt is the hash i
1d3b0 6e 20 62 61 73 65 36 34 2e 0a 2a 2f 0a 73 74 61  n base64..*/.sta
1d3c0 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
1d3d0 43 4c 41 50 49 20 6d 64 35 5f 63 6d 64 28 0a 20  CLAPI md5_cmd(. 
1d3e0 20 76 6f 69 64 2a 63 64 2c 0a 20 20 54 63 6c 5f   void*cd,.  Tcl_
1d3f0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1d400 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 6f    int argc,.  co
1d410 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67 76 0a  nst char **argv.
1d420 29 7b 0a 20 20 4d 44 35 43 6f 6e 74 65 78 74 20  ){.  MD5Context 
1d430 63 74 78 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  ctx;.  unsigned 
1d440 63 68 61 72 20 64 69 67 65 73 74 5b 31 36 5d 3b  char digest[16];
1d450 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d  .  char zBuf[50]
1d460 3b 0a 20 20 76 6f 69 64 20 28 2a 63 6f 6e 76 65  ;.  void (*conve
1d470 72 74 65 72 29 28 75 6e 73 69 67 6e 65 64 20 63  rter)(unsigned c
1d480 68 61 72 2a 2c 20 63 68 61 72 2a 29 3b 0a 0a 20  har*, char*);.. 
1d490 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a   if( argc!=2 ){.
1d4a0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1d4b0 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 77 72 6f  sult(interp,"wro
1d4c0 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1d4d0 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
1d4e0 5d 2c 0a 20 20 20 20 20 20 20 20 22 20 54 45 58  ],.        " TEX
1d4f0 54 5c 22 22 2c 20 28 63 68 61 72 2a 29 30 29 3b  T\"", (char*)0);
1d500 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1d510 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 4d 44 35  ERROR;.  }.  MD5
1d520 49 6e 69 74 28 26 63 74 78 29 3b 0a 20 20 4d 44  Init(&ctx);.  MD
1d530 35 55 70 64 61 74 65 28 26 63 74 78 2c 20 28 75  5Update(&ctx, (u
1d540 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 61 72  nsigned char*)ar
1d550 67 76 5b 31 5d 2c 20 28 75 6e 73 69 67 6e 65 64  gv[1], (unsigned
1d560 29 73 74 72 6c 65 6e 28 61 72 67 76 5b 31 5d 29  )strlen(argv[1])
1d570 29 3b 0a 20 20 4d 44 35 46 69 6e 61 6c 28 64 69  );.  MD5Final(di
1d580 67 65 73 74 2c 20 26 63 74 78 29 3b 0a 20 20 63  gest, &ctx);.  c
1d590 6f 6e 76 65 72 74 65 72 20 3d 20 28 76 6f 69 64  onverter = (void
1d5a0 28 2a 29 28 75 6e 73 69 67 6e 65 64 20 63 68 61  (*)(unsigned cha
1d5b0 72 2a 2c 63 68 61 72 2a 29 29 63 64 3b 0a 20 20  r*,char*))cd;.  
1d5c0 63 6f 6e 76 65 72 74 65 72 28 64 69 67 65 73 74  converter(digest
1d5d0 2c 20 7a 42 75 66 29 3b 0a 20 20 54 63 6c 5f 41  , zBuf);.  Tcl_A
1d5e0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1d5f0 72 70 2c 20 7a 42 75 66 2c 20 28 63 68 61 72 2a  rp, zBuf, (char*
1d600 29 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  )0);.  return TC
1d610 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  L_OK;.}../*.** A
1d620 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 74 6f 20   TCL command to 
1d630 74 61 6b 65 20 74 68 65 20 6d 64 35 20 68 61 73  take the md5 has
1d640 68 20 6f 66 20 61 20 66 69 6c 65 2e 20 20 54 68  h of a file.  Th
1d650 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  e argument is th
1d660 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65  e.** name of the
1d670 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
1d680 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
1d690 50 49 20 6d 64 35 66 69 6c 65 5f 63 6d 64 28 0a  PI md5file_cmd(.
1d6a0 20 20 76 6f 69 64 2a 63 64 2c 0a 20 20 54 63 6c    void*cd,.  Tcl
1d6b0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1d6c0 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63  .  int argc,.  c
1d6d0 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67 76  onst char **argv
1d6e0 0a 29 7b 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 0a  .){.  FILE *in;.
1d6f0 20 20 4d 44 35 43 6f 6e 74 65 78 74 20 63 74 78    MD5Context ctx
1d700 3b 0a 20 20 76 6f 69 64 20 28 2a 63 6f 6e 76 65  ;.  void (*conve
1d710 72 74 65 72 29 28 75 6e 73 69 67 6e 65 64 20 63  rter)(unsigned c
1d720 68 61 72 2a 2c 20 63 68 61 72 2a 29 3b 0a 20 20  har*, char*);.  
1d730 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64 69  unsigned char di
1d740 67 65 73 74 5b 31 36 5d 3b 0a 20 20 63 68 61 72  gest[16];.  char
1d750 20 7a 42 75 66 5b 31 30 32 34 30 5d 3b 0a 0a 20   zBuf[10240];.. 
1d760 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a   if( argc!=2 ){.
1d770 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1d780 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 77 72 6f  sult(interp,"wro
1d790 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1d7a0 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
1d7b0 5d 2c 0a 20 20 20 20 20 20 20 20 22 20 46 49 4c  ],.        " FIL
1d7c0 45 4e 41 4d 45 5c 22 22 2c 20 28 63 68 61 72 2a  ENAME\"", (char*
1d7d0 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )0);.    return 
1d7e0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1d7f0 20 69 6e 20 3d 20 66 6f 70 65 6e 28 61 72 67 76   in = fopen(argv
1d800 5b 31 5d 2c 22 72 62 22 29 3b 0a 20 20 69 66 28  [1],"rb");.  if(
1d810 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63   in==0 ){.    Tc
1d820 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1d830 6e 74 65 72 70 2c 22 75 6e 61 62 6c 65 20 74 6f  nterp,"unable to
1d840 20 6f 70 65 6e 20 66 69 6c 65 20 5c 22 22 2c 20   open file \"", 
1d850 61 72 67 76 5b 31 5d 2c 0a 20 20 20 20 20 20 20  argv[1],.       
1d860 20 20 22 5c 22 20 66 6f 72 20 72 65 61 64 69 6e    "\" for readin
1d870 67 22 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  g", (char*)0);. 
1d880 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1d890 52 4f 52 3b 0a 20 20 7d 0a 20 20 4d 44 35 49 6e  ROR;.  }.  MD5In
1d8a0 69 74 28 26 63 74 78 29 3b 0a 20 20 66 6f 72 28  it(&ctx);.  for(
1d8b0 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a  ;;){.    int n;.
1d8c0 20 20 20 20 6e 20 3d 20 28 69 6e 74 29 66 72 65      n = (int)fre
1d8d0 61 64 28 7a 42 75 66 2c 20 31 2c 20 73 69 7a 65  ad(zBuf, 1, size
1d8e0 6f 66 28 7a 42 75 66 29 2c 20 69 6e 29 3b 0a 20  of(zBuf), in);. 
1d8f0 20 20 20 69 66 28 20 6e 3c 3d 30 20 29 20 62 72     if( n<=0 ) br
1d900 65 61 6b 3b 0a 20 20 20 20 4d 44 35 55 70 64 61  eak;.    MD5Upda
1d910 74 65 28 26 63 74 78 2c 20 28 75 6e 73 69 67 6e  te(&ctx, (unsign
1d920 65 64 20 63 68 61 72 2a 29 7a 42 75 66 2c 20 28  ed char*)zBuf, (
1d930 75 6e 73 69 67 6e 65 64 29 6e 29 3b 0a 20 20 7d  unsigned)n);.  }
1d940 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20  .  fclose(in);. 
1d950 20 4d 44 35 46 69 6e 61 6c 28 64 69 67 65 73 74   MD5Final(digest
1d960 2c 20 26 63 74 78 29 3b 0a 20 20 63 6f 6e 76 65  , &ctx);.  conve
1d970 72 74 65 72 20 3d 20 28 76 6f 69 64 28 2a 29 28  rter = (void(*)(
1d980 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 2c 63  unsigned char*,c
1d990 68 61 72 2a 29 29 63 64 3b 0a 20 20 63 6f 6e 76  har*))cd;.  conv
1d9a0 65 72 74 65 72 28 64 69 67 65 73 74 2c 20 7a 42  erter(digest, zB
1d9b0 75 66 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  uf);.  Tcl_Appen
1d9c0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1d9d0 7a 42 75 66 2c 20 28 63 68 61 72 2a 29 30 29 3b  zBuf, (char*)0);
1d9e0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1d9f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  ;.}../*.** Regis
1da00 74 65 72 20 74 68 65 20 66 6f 75 72 20 6e 65 77  ter the four new
1da10 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 73 20 66 6f   TCL commands fo
1da20 72 20 67 65 6e 65 72 61 74 69 6e 67 20 4d 44 35  r generating MD5
1da30 20 63 68 65 63 6b 73 75 6d 73 0a 2a 2a 20 77 69   checksums.** wi
1da40 74 68 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72  th the TCL inter
1da50 70 72 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 4d  preter..*/.int M
1da60 64 35 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  d5_Init(Tcl_Inte
1da70 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 54  rp *interp){.  T
1da80 63 6c 5f 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64  cl_CreateCommand
1da90 28 69 6e 74 65 72 70 2c 20 22 6d 64 35 22 2c 20  (interp, "md5", 
1daa0 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 6d 64  (Tcl_CmdProc*)md
1dab0 35 5f 63 6d 64 2c 0a 20 20 20 20 20 20 20 20 20  5_cmd,.         
1dac0 20 20 20 20 20 20 20 20 20 20 20 4d 44 35 44 69             MD5Di
1dad0 67 65 73 74 54 6f 42 61 73 65 31 36 2c 20 30 29  gestToBase16, 0)
1dae0 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 43 6f  ;.  Tcl_CreateCo
1daf0 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 6d  mmand(interp, "m
1db00 64 35 2d 31 30 78 38 22 2c 20 28 54 63 6c 5f 43  d5-10x8", (Tcl_C
1db10 6d 64 50 72 6f 63 2a 29 6d 64 35 5f 63 6d 64 2c  mdProc*)md5_cmd,
1db20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1db30 20 20 20 20 20 4d 44 35 44 69 67 65 73 74 54 6f       MD5DigestTo
1db40 42 61 73 65 31 30 78 38 2c 20 30 29 3b 0a 20 20  Base10x8, 0);.  
1db50 54 63 6c 5f 43 72 65 61 74 65 43 6f 6d 6d 61 6e  Tcl_CreateComman
1db60 64 28 69 6e 74 65 72 70 2c 20 22 6d 64 35 66 69  d(interp, "md5fi
1db70 6c 65 22 2c 20 28 54 63 6c 5f 43 6d 64 50 72 6f  le", (Tcl_CmdPro
1db80 63 2a 29 6d 64 35 66 69 6c 65 5f 63 6d 64 2c 0a  c*)md5file_cmd,.
1db90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dba0 20 20 20 20 4d 44 35 44 69 67 65 73 74 54 6f 42      MD5DigestToB
1dbb0 61 73 65 31 36 2c 20 30 29 3b 0a 20 20 54 63 6c  ase16, 0);.  Tcl
1dbc0 5f 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69  _CreateCommand(i
1dbd0 6e 74 65 72 70 2c 20 22 6d 64 35 66 69 6c 65 2d  nterp, "md5file-
1dbe0 31 30 78 38 22 2c 20 28 54 63 6c 5f 43 6d 64 50  10x8", (Tcl_CmdP
1dbf0 72 6f 63 2a 29 6d 64 35 66 69 6c 65 5f 63 6d 64  roc*)md5file_cmd
1dc00 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1dc10 20 20 20 20 20 20 4d 44 35 44 69 67 65 73 74 54        MD5DigestT
1dc20 6f 42 61 73 65 31 30 78 38 2c 20 30 29 3b 0a 20  oBase10x8, 0);. 
1dc30 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1dc40 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  }.#endif /* defi
1dc50 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
1dc60 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
1dc70 54 45 5f 54 43 4c 4d 44 35 29 20 2a 2f 0a 0a 23  TE_TCLMD5) */..#
1dc80 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1dc90 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 44 75  E_TEST)./*.** Du
1dca0 72 69 6e 67 20 74 65 73 74 69 6e 67 2c 20 74 68  ring testing, th
1dcb0 65 20 73 70 65 63 69 61 6c 20 6d 64 35 73 75 6d  e special md5sum
1dcc0 28 29 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  () aggregate fun
1dcd0 63 74 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62  ction is availab
1dce0 6c 65 2e 0a 2a 2a 20 69 6e 73 69 64 65 20 53 51  le..** inside SQ
1dcf0 4c 69 74 65 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  Lite.  The follo
1dd00 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 69 6d  wing routines im
1dd10 70 6c 65 6d 65 6e 74 20 74 68 61 74 20 66 75 6e  plement that fun
1dd20 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
1dd30 20 76 6f 69 64 20 6d 64 35 73 74 65 70 28 73 71   void md5step(sq
1dd40 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
1dd50 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
1dd60 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
1dd70 2a 2a 61 72 67 76 29 7b 0a 20 20 4d 44 35 43 6f  **argv){.  MD5Co
1dd80 6e 74 65 78 74 20 2a 70 3b 0a 20 20 69 6e 74 20  ntext *p;.  int 
1dd90 69 3b 0a 20 20 69 66 28 20 61 72 67 63 3c 31 20  i;.  if( argc<1 
1dda0 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 20 3d 20  ) return;.  p = 
1ddb0 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
1ddc0 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78  e_context(contex
1ddd0 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  t, sizeof(*p));.
1dde0 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
1ddf0 75 72 6e 3b 0a 20 20 69 66 28 20 21 70 2d 3e 69  urn;.  if( !p->i
1de00 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 4d 44 35  sInit ){.    MD5
1de10 49 6e 69 74 28 70 29 3b 0a 20 20 7d 0a 20 20 66  Init(p);.  }.  f
1de20 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20  or(i=0; i<argc; 
1de30 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  i++){.    const 
1de40 63 68 61 72 20 2a 7a 44 61 74 61 20 3d 20 28 63  char *zData = (c
1de50 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
1de60 75 65 5f 74 65 78 74 28 61 72 67 76 5b 69 5d 29  ue_text(argv[i])
1de70 3b 0a 20 20 20 20 69 66 28 20 7a 44 61 74 61 20  ;.    if( zData 
1de80 29 7b 0a 20 20 20 20 20 20 4d 44 35 55 70 64 61  ){.      MD5Upda
1de90 74 65 28 70 2c 20 28 75 6e 73 69 67 6e 65 64 20  te(p, (unsigned 
1dea0 63 68 61 72 2a 29 7a 44 61 74 61 2c 20 28 69 6e  char*)zData, (in
1deb0 74 29 73 74 72 6c 65 6e 28 7a 44 61 74 61 29 29  t)strlen(zData))
1dec0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74  ;.    }.  }.}.st
1ded0 61 74 69 63 20 76 6f 69 64 20 6d 64 35 66 69 6e  atic void md5fin
1dee0 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f  alize(sqlite3_co
1def0 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b  ntext *context){
1df00 0a 20 20 4d 44 35 43 6f 6e 74 65 78 74 20 2a 70  .  MD5Context *p
1df10 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
1df20 72 20 64 69 67 65 73 74 5b 31 36 5d 3b 0a 20 20  r digest[16];.  
1df30 63 68 61 72 20 7a 42 75 66 5b 33 33 5d 3b 0a 20  char zBuf[33];. 
1df40 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67   p = sqlite3_agg
1df50 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63  regate_context(c
1df60 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a  ontext, sizeof(*
1df70 70 29 29 3b 0a 20 20 4d 44 35 46 69 6e 61 6c 28  p));.  MD5Final(
1df80 64 69 67 65 73 74 2c 70 29 3b 0a 20 20 4d 44 35  digest,p);.  MD5
1df90 44 69 67 65 73 74 54 6f 42 61 73 65 31 36 28 64  DigestToBase16(d
1dfa0 69 67 65 73 74 2c 20 7a 42 75 66 29 3b 0a 20 20  igest, zBuf);.  
1dfb0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
1dfc0 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 42 75  ext(context, zBu
1dfd0 66 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52  f, -1, SQLITE_TR
1dfe0 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a 69 6e 74 20  ANSIENT);.}.int 
1dff0 4d 64 35 5f 52 65 67 69 73 74 65 72 28 0a 20 20  Md5_Register(.  
1e000 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63  sqlite3 *db,.  c
1e010 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 2c 0a  har **pzErrMsg,.
1e020 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f    const sqlite3_
1e030 61 70 69 5f 72 6f 75 74 69 6e 65 73 20 2a 70 54  api_routines *pT
1e040 68 75 6e 6b 0a 29 7b 0a 20 20 69 6e 74 20 72 63  hunk.){.  int rc
1e050 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
1e060 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22  e_function(db, "
1e070 6d 64 35 73 75 6d 22 2c 20 2d 31 2c 20 53 51 4c  md5sum", -1, SQL
1e080 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 30 2c 0a  ITE_UTF8, 0, 0,.
1e090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e0b0 20 6d 64 35 73 74 65 70 2c 20 6d 64 35 66 69 6e   md5step, md5fin
1e0c0 61 6c 69 7a 65 29 3b 0a 20 20 73 71 6c 69 74 65  alize);.  sqlite
1e0d0 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74  3_overload_funct
1e0e0 69 6f 6e 28 64 62 2c 20 22 6d 64 35 73 75 6d 22  ion(db, "md5sum"
1e0f0 2c 20 2d 31 29 3b 20 20 2f 2a 20 54 6f 20 65 78  , -1);  /* To ex
1e100 65 72 63 69 73 65 20 74 68 69 73 20 41 50 49 20  ercise this API 
1e110 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  */.  return rc;.
1e120 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  }.#endif /* defi
1e130 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
1e140 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74   */.../*.** If t
1e150 68 65 20 6d 61 63 72 6f 20 54 43 4c 53 48 20 69  he macro TCLSH i
1e160 73 20 6f 6e 65 2c 20 74 68 65 6e 20 70 75 74 20  s one, then put 
1e170 69 6e 20 63 6f 64 65 20 74 68 69 73 20 66 6f 72  in code this for
1e180 20 74 68 65 0a 2a 2a 20 22 6d 61 69 6e 22 20 72   the.** "main" r
1e190 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c  outine that will
1e1a0 20 69 6e 69 74 69 61 6c 69 7a 65 20 54 63 6c 20   initialize Tcl 
1e1b0 61 6e 64 20 74 61 6b 65 20 69 6e 70 75 74 20 66  and take input f
1e1c0 72 6f 6d 0a 2a 2a 20 73 74 61 6e 64 61 72 64 20  rom.** standard 
1e1d0 69 6e 70 75 74 2c 20 6f 72 20 69 66 20 61 20 66  input, or if a f
1e1e0 69 6c 65 20 69 73 20 6e 61 6d 65 64 20 6f 6e 20  ile is named on 
1e1f0 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  the command line
1e200 0a 2a 2a 20 74 68 65 20 54 43 4c 20 69 6e 74 65  .** the TCL inte
1e210 72 70 72 65 74 65 72 20 72 65 61 64 73 20 61 6e  rpreter reads an
1e220 64 20 65 76 61 6c 75 61 74 65 73 20 74 68 61 74  d evaluates that
1e230 20 66 69 6c 65 2e 0a 2a 2f 0a 23 69 66 20 54 43   file..*/.#if TC
1e240 4c 53 48 3d 3d 31 0a 73 74 61 74 69 63 20 63 6f  LSH==1.static co
1e250 6e 73 74 20 63 68 61 72 20 2a 74 63 6c 73 68 5f  nst char *tclsh_
1e260 6d 61 69 6e 5f 6c 6f 6f 70 28 76 6f 69 64 29 7b  main_loop(void){
1e270 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
1e280 63 68 61 72 20 7a 4d 61 69 6e 6c 6f 6f 70 5b 5d  char zMainloop[]
1e290 20 3d 0a 20 20 20 20 22 73 65 74 20 6c 69 6e 65   =.    "set line
1e2a0 20 7b 7d 5c 6e 22 0a 20 20 20 20 22 77 68 69 6c   {}\n".    "whil
1e2b0 65 20 7b 21 5b 65 6f 66 20 73 74 64 69 6e 5d 7d  e {![eof stdin]}
1e2c0 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22 69 66 20   {\n".      "if 
1e2d0 7b 24 6c 69 6e 65 21 3d 5c 22 5c 22 7d 20 7b 5c  {$line!=\"\"} {\
1e2e0 6e 22 0a 20 20 20 20 20 20 20 20 22 70 75 74 73  n".        "puts
1e2f0 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 5c 22 3e 20   -nonewline \"> 
1e300 5c 22 5c 6e 22 0a 20 20 20 20 20 20 22 7d 20 65  \"\n".      "} e
1e310 6c 73 65 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20  lse {\n".       
1e320 20 22 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e   "puts -nonewlin
1e330 65 20 5c 22 25 20 5c 22 5c 6e 22 0a 20 20 20 20  e \"% \"\n".    
1e340 20 20 22 7d 5c 6e 22 0a 20 20 20 20 20 20 22 66    "}\n".      "f
1e350 6c 75 73 68 20 73 74 64 6f 75 74 5c 6e 22 0a 20  lush stdout\n". 
1e360 20 20 20 20 20 22 61 70 70 65 6e 64 20 6c 69 6e       "append lin
1e370 65 20 5b 67 65 74 73 20 73 74 64 69 6e 5d 5c 6e  e [gets stdin]\n
1e380 22 0a 20 20 20 20 20 20 22 69 66 20 7b 5b 69 6e  ".      "if {[in
1e390 66 6f 20 63 6f 6d 70 6c 65 74 65 20 24 6c 69 6e  fo complete $lin
1e3a0 65 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20  e]} {\n".       
1e3b0 20 22 69 66 20 7b 5b 63 61 74 63 68 20 7b 75 70   "if {[catch {up
1e3c0 6c 65 76 65 6c 20 23 30 20 24 6c 69 6e 65 7d 20  level #0 $line} 
1e3d0 72 65 73 75 6c 74 5d 7d 20 7b 5c 6e 22 0a 20 20  result]} {\n".  
1e3e0 20 20 20 20 20 20 20 20 22 70 75 74 73 20 73 74          "puts st
1e3f0 64 65 72 72 20 5c 22 45 72 72 6f 72 3a 20 24 72  derr \"Error: $r
1e400 65 73 75 6c 74 5c 22 5c 6e 22 0a 20 20 20 20 20  esult\"\n".     
1e410 20 20 20 22 7d 20 65 6c 73 65 69 66 20 7b 24 72     "} elseif {$r
1e420 65 73 75 6c 74 21 3d 5c 22 5c 22 7d 20 7b 5c 6e  esult!=\"\"} {\n
1e430 22 0a 20 20 20 20 20 20 20 20 20 20 22 70 75 74  ".          "put
1e440 73 20 24 72 65 73 75 6c 74 5c 6e 22 0a 20 20 20  s $result\n".   
1e450 20 20 20 20 20 22 7d 5c 6e 22 0a 20 20 20 20 20       "}\n".     
1e460 20 20 20 22 73 65 74 20 6c 69 6e 65 20 7b 7d 5c     "set line {}\
1e470 6e 22 0a 20 20 20 20 20 20 22 7d 20 65 6c 73 65  n".      "} else
1e480 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 61   {\n".        "a
1e490 70 70 65 6e 64 20 6c 69 6e 65 20 5c 5c 6e 5c 6e  ppend line \\n\n
1e4a0 22 0a 20 20 20 20 20 20 22 7d 5c 6e 22 0a 20 20  ".      "}\n".  
1e4b0 20 20 22 7d 5c 6e 22 0a 20 20 3b 0a 20 20 72 65    "}\n".  ;.  re
1e4c0 74 75 72 6e 20 7a 4d 61 69 6e 6c 6f 6f 70 3b 0a  turn zMainloop;.
1e4d0 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 54 43 4c  }.#endif.#if TCL
1e4e0 53 48 3d 3d 32 0a 73 74 61 74 69 63 20 63 6f 6e  SH==2.static con
1e4f0 73 74 20 63 68 61 72 20 2a 74 63 6c 73 68 5f 6d  st char *tclsh_m
1e500 61 69 6e 5f 6c 6f 6f 70 28 76 6f 69 64 29 3b 0a  ain_loop(void);.
1e510 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
1e520 51 4c 49 54 45 5f 54 45 53 54 0a 73 74 61 74 69  QLITE_TEST.stati
1e530 63 20 76 6f 69 64 20 69 6e 69 74 5f 61 6c 6c 28  c void init_all(
1e540 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29 3b 0a 73  Tcl_Interp *);.s
1e550 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
1e560 5f 54 43 4c 41 50 49 20 69 6e 69 74 5f 61 6c 6c  _TCLAPI init_all
1e570 5f 63 6d 64 28 0a 20 20 43 6c 69 65 6e 74 44 61  _cmd(.  ClientDa
1e580 74 61 20 63 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  ta cd,.  Tcl_Int
1e590 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1e5a0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1e5b0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1e5c0 0a 29 7b 0a 0a 20 20 54 63 6c 5f 49 6e 74 65 72  .){..  Tcl_Inter
1e5d0 70 20 2a 73 6c 61 76 65 3b 0a 20 20 69 66 28 20  p *slave;.  if( 
1e5e0 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
1e5f0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
1e600 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
1e610 20 22 53 4c 41 56 45 22 29 3b 0a 20 20 20 20 72   "SLAVE");.    r
1e620 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1e630 0a 20 20 7d 0a 0a 20 20 73 6c 61 76 65 20 3d 20  .  }..  slave = 
1e640 54 63 6c 5f 47 65 74 53 6c 61 76 65 28 69 6e 74  Tcl_GetSlave(int
1e650 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
1e660 6e 67 28 6f 62 6a 76 5b 31 5d 29 29 3b 0a 20 20  ng(objv[1]));.  
1e670 69 66 28 20 21 73 6c 61 76 65 20 29 7b 0a 20 20  if( !slave ){.  
1e680 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1e690 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 6e 69 74 5f  OR;.  }..  init_
1e6a0 61 6c 6c 28 73 6c 61 76 65 29 3b 0a 20 20 72 65  all(slave);.  re
1e6b0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1e6c0 2f 2a 0a 2a 2a 20 54 63 6c 63 6d 64 3a 20 64 62  /*.** Tclcmd: db
1e6d0 5f 75 73 65 5f 6c 65 67 61 63 79 5f 70 72 65 70  _use_legacy_prep
1e6e0 61 72 65 20 44 42 20 42 4f 4f 4c 45 41 4e 0a 2a  are DB BOOLEAN.*
1e6f0 2a 0a 2a 2a 20 20 20 54 68 65 20 66 69 72 73 74  *.**   The first
1e700 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
1e710 73 20 63 6f 6d 6d 61 6e 64 20 6d 75 73 74 20 62  s command must b
1e720 65 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6d  e a database com
1e730 6d 61 6e 64 20 63 72 65 61 74 65 64 20 62 79 0a  mand created by.
1e740 2a 2a 20 20 20 5b 73 71 6c 69 74 65 33 5d 2e 20  **   [sqlite3]. 
1e750 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
1e760 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c 20  gument is true, 
1e770 74 68 65 6e 20 74 68 65 20 68 61 6e 64 6c 65 20  then the handle 
1e780 69 73 20 63 6f 6e 66 69 67 75 72 65 64 0a 2a 2a  is configured.**
1e790 20 20 20 74 6f 20 75 73 65 20 74 68 65 20 73 71     to use the sq
1e7a0 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
1e7b0 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 70  () function to p
1e7c0 72 65 70 61 72 65 20 73 74 61 74 65 6d 65 6e 74  repare statement
1e7d0 73 2e 20 49 66 20 69 74 0a 2a 2a 20 20 20 69 73  s. If it.**   is
1e7e0 20 66 61 6c 73 65 2c 20 73 71 6c 69 74 65 33 5f   false, sqlite3_
1e7f0 70 72 65 70 61 72 65 28 29 2e 0a 2a 2f 0a 73 74  prepare()..*/.st
1e800 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
1e810 54 43 4c 41 50 49 20 64 62 5f 75 73 65 5f 6c 65  TCLAPI db_use_le
1e820 67 61 63 79 5f 70 72 65 70 61 72 65 5f 63 6d 64  gacy_prepare_cmd
1e830 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
1e840 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
1e850 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
1e860 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
1e870 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
1e880 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d    Tcl_CmdInfo cm
1e890 64 49 6e 66 6f 3b 0a 20 20 53 71 6c 69 74 65 44  dInfo;.  SqliteD
1e8a0 62 20 2a 70 44 62 3b 0a 20 20 69 6e 74 20 62 50  b *pDb;.  int bP
1e8b0 72 65 70 61 72 65 3b 0a 0a 20 20 69 66 28 20 6f  repare;..  if( o
1e8c0 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
1e8d0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
1e8e0 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
1e8f0 22 44 42 20 42 4f 4f 4c 45 41 4e 22 29 3b 0a 20  "DB BOOLEAN");. 
1e900 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1e910 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
1e920 21 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49  !Tcl_GetCommandI
1e930 6e 66 6f 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  nfo(interp, Tcl_
1e940 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
1e950 5d 29 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29 7b  ]), &cmdInfo) ){
1e960 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1e970 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e  esult(interp, "n
1e980 6f 20 73 75 63 68 20 64 62 3a 20 22 2c 20 54 63  o such db: ", Tc
1e990 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1e9a0 5b 31 5d 29 2c 20 28 63 68 61 72 2a 29 30 29 3b  [1]), (char*)0);
1e9b0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1e9c0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 44 62  ERROR;.  }.  pDb
1e9d0 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 6d   = (SqliteDb*)cm
1e9e0 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44  dInfo.objClientD
1e9f0 61 74 61 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ata;.  if( Tcl_G
1ea00 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
1ea10 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
1ea20 2c 20 26 62 50 72 65 70 61 72 65 29 20 29 7b 0a  , &bPrepare) ){.
1ea30 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1ea40 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 70 44 62  RROR;.  }..  pDb
1ea50 2d 3e 62 4c 65 67 61 63 79 50 72 65 70 61 72 65  ->bLegacyPrepare
1ea60 20 3d 20 62 50 72 65 70 61 72 65 3b 0a 0a 20 20   = bPrepare;..  
1ea70 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28  Tcl_ResetResult(
1ea80 69 6e 74 65 72 70 29 3b 0a 20 20 72 65 74 75 72  interp);.  retur
1ea90 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1eaa0 2a 2a 20 54 63 6c 63 6d 64 3a 20 64 62 5f 6c 61  ** Tclcmd: db_la
1eab0 73 74 5f 73 74 6d 74 5f 70 74 72 20 44 42 0a 2a  st_stmt_ptr DB.*
1eac0 2a 0a 2a 2a 20 20 20 49 66 20 74 68 65 20 73 74  *.**   If the st
1ead0 61 74 65 6d 65 6e 74 20 63 61 63 68 65 20 61 73  atement cache as
1eae0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 64 61  sociated with da
1eaf0 74 61 62 61 73 65 20 44 42 20 69 73 20 6e 6f 74  tabase DB is not
1eb00 20 65 6d 70 74 79 2c 0a 2a 2a 20 20 20 72 65 74   empty,.**   ret
1eb10 75 72 6e 20 74 68 65 20 74 65 78 74 20 72 65 70  urn the text rep
1eb20 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
1eb30 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
1eb40 20 75 73 65 64 20 73 74 61 74 65 6d 65 6e 74 0a   used statement.
1eb50 2a 2a 20 20 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a  **   handle..*/.
1eb60 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
1eb70 45 5f 54 43 4c 41 50 49 20 64 62 5f 6c 61 73 74  E_TCLAPI db_last
1eb80 5f 73 74 6d 74 5f 70 74 72 28 0a 20 20 43 6c 69  _stmt_ptr(.  Cli
1eb90 65 6e 74 44 61 74 61 20 63 64 2c 0a 20 20 54 63  entData cd,.  Tc
1eba0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1ebb0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1ebc0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1ebd0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 65 78 74 65 72  bjv[].){.  exter
1ebe0 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 54 65 73  n int sqlite3Tes
1ebf0 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28  tMakePointerStr(
1ec00 54 63 6c 5f 49 6e 74 65 72 70 2a 2c 20 63 68 61  Tcl_Interp*, cha
1ec10 72 2a 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 54 63  r*, void*);.  Tc
1ec20 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49 6e 66  l_CmdInfo cmdInf
1ec30 6f 3b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  o;.  SqliteDb *p
1ec40 44 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  Db;.  sqlite3_st
1ec50 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20  mt *pStmt = 0;. 
1ec60 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b   char zBuf[100];
1ec70 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
1ec80 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
1ec90 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
1eca0 31 2c 20 6f 62 6a 76 2c 20 22 44 42 22 29 3b 0a  1, objv, "DB");.
1ecb0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1ecc0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
1ecd0 20 21 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64   !Tcl_GetCommand
1ece0 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 54 63 6c  Info(interp, Tcl
1ecf0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1ed00 31 5d 29 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29  1]), &cmdInfo) )
1ed10 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1ed20 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1ed30 6e 6f 20 73 75 63 68 20 64 62 3a 20 22 2c 20 54  no such db: ", T
1ed40 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1ed50 76 5b 31 5d 29 2c 20 28 63 68 61 72 2a 29 30 29  v[1]), (char*)0)
1ed60 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1ed70 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 44  _ERROR;.  }.  pD
1ed80 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63  b = (SqliteDb*)c
1ed90 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74  mdInfo.objClient
1eda0 44 61 74 61 3b 0a 0a 20 20 69 66 28 20 70 44 62  Data;..  if( pDb
1edb0 2d 3e 73 74 6d 74 4c 69 73 74 20 29 20 70 53 74  ->stmtList ) pSt
1edc0 6d 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69  mt = pDb->stmtLi
1edd0 73 74 2d 3e 70 53 74 6d 74 3b 0a 20 20 69 66 28  st->pStmt;.  if(
1ede0 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65   sqlite3TestMake
1edf0 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72  PointerStr(inter
1ee00 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74 29 20  p, zBuf, pStmt) 
1ee10 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
1ee20 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54  L_ERROR;.  }.  T
1ee30 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
1ee40 65 72 70 2c 20 7a 42 75 66 2c 20 54 43 4c 5f 56  erp, zBuf, TCL_V
1ee50 4f 4c 41 54 49 4c 45 29 3b 0a 0a 20 20 72 65 74  OLATILE);..  ret
1ee60 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65  urn TCL_OK;.}.#e
1ee70 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54  ndif /* SQLITE_T
1ee80 45 53 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f  EST */../*.** Co
1ee90 6e 66 69 67 75 72 65 20 74 68 65 20 69 6e 74 65  nfigure the inte
1eea0 72 70 72 65 74 65 72 20 70 61 73 73 65 64 20 61  rpreter passed a
1eeb0 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
1eec0 6d 65 6e 74 20 74 6f 20 68 61 76 65 20 61 63 63  ment to have acc
1eed0 65 73 73 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f  ess.** to the co
1eee0 6d 6d 61 6e 64 73 20 61 6e 64 20 6c 69 6e 6b 65  mmands and linke
1eef0 64 20 76 61 72 69 61 62 6c 65 73 20 74 68 61 74  d variables that
1ef00 20 6d 61 6b 65 20 75 70 3a 0a 2a 2a 0a 2a 2a 20   make up:.**.** 
1ef10 20 20 2a 20 74 68 65 20 5b 73 71 6c 69 74 65 33    * the [sqlite3
1ef20 5d 20 65 78 74 65 6e 73 69 6f 6e 20 69 74 73 65  ] extension itse
1ef30 6c 66 2c 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66  lf,.**.**   * If
1ef40 20 53 51 4c 49 54 45 5f 54 43 4c 4d 44 35 20 6f   SQLITE_TCLMD5 o
1ef50 72 20 53 51 4c 49 54 45 5f 54 45 53 54 20 69 73  r SQLITE_TEST is
1ef60 20 64 65 66 69 6e 65 64 2c 20 74 68 65 20 4d 64   defined, the Md
1ef70 35 20 63 6f 6d 6d 61 6e 64 73 2c 20 61 6e 64 0a  5 commands, and.
1ef80 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 53 51 4c  **.**   * If SQL
1ef90 49 54 45 5f 54 45 53 54 20 69 73 20 73 65 74 2c  ITE_TEST is set,
1efa0 20 74 68 65 20 76 61 72 69 6f 75 73 20 74 65 73   the various tes
1efb0 74 20 69 6e 74 65 72 66 61 63 65 73 20 75 73 65  t interfaces use
1efc0 64 20 62 79 20 74 68 65 20 54 63 6c 0a 2a 2a 20  d by the Tcl.** 
1efd0 20 20 20 20 74 65 73 74 20 73 75 69 74 65 2e 0a      test suite..
1efe0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
1eff0 6e 69 74 5f 61 6c 6c 28 54 63 6c 5f 49 6e 74 65  nit_all(Tcl_Inte
1f000 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 53  rp *interp){.  S
1f010 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74 65  qlite3_Init(inte
1f020 72 70 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65  rp);..#if define
1f030 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 7c  d(SQLITE_TEST) |
1f040 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
1f050 5f 54 43 4c 4d 44 35 29 0a 20 20 4d 64 35 5f 49  _TCLMD5).  Md5_I
1f060 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 23 65 6e  nit(interp);.#en
1f070 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
1f080 54 45 5f 54 45 53 54 0a 20 20 7b 0a 20 20 20 20  TE_TEST.  {.    
1f090 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1f0a0 65 63 6f 6e 66 69 67 5f 49 6e 69 74 28 54 63 6c  econfig_Init(Tcl
1f0b0 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1f0c0 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1f0d0 74 65 73 74 31 5f 49 6e 69 74 28 54 63 6c 5f 49  test1_Init(Tcl_I
1f0e0 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1f0f0 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1f100 73 74 32 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  st2_Init(Tcl_Int
1f110 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1f120 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1f130 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  3_Init(Tcl_Inter
1f140 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1f150 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 34 5f  int Sqlitetest4_
1f160 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1f170 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
1f180 74 20 53 71 6c 69 74 65 74 65 73 74 35 5f 49 6e  t Sqlitetest5_In
1f190 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1f1a0 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1f1b0 53 71 6c 69 74 65 74 65 73 74 36 5f 49 6e 69 74  Sqlitetest6_Init
1f1c0 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1f1d0 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1f1e0 6c 69 74 65 74 65 73 74 37 5f 49 6e 69 74 28 54  litetest7_Init(T
1f1f0 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1f200 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1f210 74 65 74 65 73 74 38 5f 49 6e 69 74 28 54 63 6c  tetest8_Init(Tcl
1f220 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1f230 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1f240 74 65 73 74 39 5f 49 6e 69 74 28 54 63 6c 5f 49  test9_Init(Tcl_I
1f250 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1f260 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1f270 73 74 61 73 79 6e 63 5f 49 6e 69 74 28 54 63 6c  stasync_Init(Tcl
1f280 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1f290 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1f2a0 74 65 73 74 5f 61 75 74 6f 65 78 74 5f 49 6e 69  test_autoext_Ini
1f2b0 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
1f2c0 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1f2d0 71 6c 69 74 65 74 65 73 74 5f 62 6c 6f 62 5f 49  qlitetest_blob_I
1f2e0 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
1f2f0 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
1f300 20 53 71 6c 69 74 65 74 65 73 74 5f 64 65 6d 6f   Sqlitetest_demo
1f310 76 66 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  vfs_Init(Tcl_Int
1f320 65 72 70 20 2a 29 3b 0a 20 20 20 20 65 78 74 65  erp *);.    exte
1f330 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1f340 74 5f 66 75 6e 63 5f 49 6e 69 74 28 54 63 6c 5f  t_func_Init(Tcl_
1f350 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
1f360 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1f370 65 73 74 5f 68 65 78 69 6f 5f 49 6e 69 74 28 54  est_hexio_Init(T
1f380 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1f390 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1f3a0 74 65 74 65 73 74 5f 69 6e 69 74 5f 49 6e 69 74  tetest_init_Init
1f3b0 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1f3c0 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1f3d0 6c 69 74 65 74 65 73 74 5f 6d 61 6c 6c 6f 63 5f  litetest_malloc_
1f3e0 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1f3f0 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
1f400 74 20 53 71 6c 69 74 65 74 65 73 74 5f 6d 75 74  t Sqlitetest_mut
1f410 65 78 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  ex_Init(Tcl_Inte
1f420 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
1f430 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 73   int Sqlitetests
1f440 63 68 65 6d 61 5f 49 6e 69 74 28 54 63 6c 5f 49  chema_Init(Tcl_I
1f450 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1f460 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1f470 73 74 73 73 65 5f 49 6e 69 74 28 54 63 6c 5f 49  stsse_Init(Tcl_I
1f480 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1f490 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1f4a0 73 74 74 63 6c 76 61 72 5f 49 6e 69 74 28 54 63  sttclvar_Init(Tc
1f4b0 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1f4c0 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1f4d0 65 74 65 73 74 66 73 5f 49 6e 69 74 28 54 63 6c  etestfs_Init(Tcl
1f4e0 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1f4f0 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1f500 74 65 73 74 54 68 72 65 61 64 5f 49 6e 69 74 28  testThread_Init(
1f510 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1f520 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1f530 69 74 65 74 65 73 74 4f 6e 65 66 69 6c 65 5f 49  itetestOnefile_I
1f540 6e 69 74 28 29 3b 0a 20 20 20 20 65 78 74 65 72  nit();.    exter
1f550 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1f560 4f 73 69 6e 73 74 5f 49 6e 69 74 28 54 63 6c 5f  Osinst_Init(Tcl_
1f570 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
1f580 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1f590 65 73 74 62 61 63 6b 75 70 5f 49 6e 69 74 28 54  estbackup_Init(T
1f5a0 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1f5b0 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1f5c0 74 65 74 65 73 74 69 6e 74 61 72 72 61 79 5f 49  tetestintarray_I
1f5d0 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
1f5e0 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
1f5f0 20 53 71 6c 69 74 65 74 65 73 74 76 66 73 5f 49   Sqlitetestvfs_I
1f600 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nit(Tcl_Interp *
1f610 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
1f620 74 20 53 71 6c 69 74 65 74 65 73 74 72 74 72 65  t Sqlitetestrtre
1f630 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  e_Init(Tcl_Inter
1f640 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1f650 69 6e 74 20 53 71 6c 69 74 65 71 75 6f 74 61 5f  int Sqlitequota_
1f660 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1f670 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
1f680 74 20 53 71 6c 69 74 65 6d 75 6c 74 69 70 6c 65  t Sqlitemultiple
1f690 78 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  x_Init(Tcl_Inter
1f6a0 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1f6b0 69 6e 74 20 53 71 6c 69 74 65 53 75 70 65 72 6c  int SqliteSuperl
1f6c0 6f 63 6b 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  ock_Init(Tcl_Int
1f6d0 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1f6e0 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1f6f0 53 79 73 63 61 6c 6c 5f 49 6e 69 74 28 54 63 6c  Syscall_Init(Tcl
1f700 5f 49 6e 74 65 72 70 2a 29 3b 0a 23 69 66 20 64  _Interp*);.#if d
1f710 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
1f720 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 20 26 26  ABLE_SESSION) &&
1f730 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1f740 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45  ENABLE_PREUPDATE
1f750 5f 48 4f 4f 4b 29 0a 20 20 20 20 65 78 74 65 72  _HOOK).    exter
1f760 6e 20 69 6e 74 20 54 65 73 74 53 65 73 73 69 6f  n int TestSessio
1f770 6e 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  n_Init(Tcl_Inter
1f780 70 2a 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  p*);.#endif.    
1f790 65 78 74 65 72 6e 20 69 6e 74 20 46 74 73 35 74  extern int Fts5t
1f7a0 63 6c 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  cl_Init(Tcl_Inte
1f7b0 72 70 20 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  rp *);.    exter
1f7c0 6e 20 69 6e 74 20 53 71 6c 69 74 65 52 62 75 5f  n int SqliteRbu_
1f7d0 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1f7e0 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
1f7f0 74 20 53 71 6c 69 74 65 74 65 73 74 74 63 6c 5f  t Sqlitetesttcl_
1f800 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1f810 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  );.#if defined(S
1f820 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53  QLITE_ENABLE_FTS
1f830 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  3) || defined(SQ
1f840 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 34  LITE_ENABLE_FTS4
1f850 29 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ).    extern int
1f860 20 53 71 6c 69 74 65 74 65 73 74 66 74 73 33 5f   Sqlitetestfts3_
1f870 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
1f880 2a 69 6e 74 65 72 70 29 3b 0a 23 65 6e 64 69 66  *interp);.#endif
1f890 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1f8a0 45 4e 41 42 4c 45 5f 5a 49 50 56 46 53 0a 20 20  ENABLE_ZIPVFS.  
1f8b0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 5a 69 70    extern int Zip
1f8c0 76 66 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  vfs_Init(Tcl_Int
1f8d0 65 72 70 2a 29 3b 0a 20 20 20 20 5a 69 70 76 66  erp*);.    Zipvf
1f8e0 73 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  s_Init(interp);.
1f8f0 23 65 6e 64 69 66 0a 0a 20 20 20 20 53 71 6c 69  #endif..    Sqli
1f900 74 65 63 6f 6e 66 69 67 5f 49 6e 69 74 28 69 6e  teconfig_Init(in
1f910 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
1f920 65 74 65 73 74 31 5f 49 6e 69 74 28 69 6e 74 65  etest1_Init(inte
1f930 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
1f940 65 73 74 32 5f 49 6e 69 74 28 69 6e 74 65 72 70  est2_Init(interp
1f950 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
1f960 74 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  t3_Init(interp);
1f970 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 34  .    Sqlitetest4
1f980 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
1f990 20 20 20 53 71 6c 69 74 65 74 65 73 74 35 5f 49     Sqlitetest5_I
1f9a0 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1f9b0 20 53 71 6c 69 74 65 74 65 73 74 36 5f 49 6e 69   Sqlitetest6_Ini
1f9c0 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
1f9d0 71 6c 69 74 65 74 65 73 74 37 5f 49 6e 69 74 28  qlitetest7_Init(
1f9e0 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
1f9f0 69 74 65 74 65 73 74 38 5f 49 6e 69 74 28 69 6e  itetest8_Init(in
1fa00 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
1fa10 65 74 65 73 74 39 5f 49 6e 69 74 28 69 6e 74 65  etest9_Init(inte
1fa20 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
1fa30 65 73 74 61 73 79 6e 63 5f 49 6e 69 74 28 69 6e  estasync_Init(in
1fa40 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
1fa50 65 74 65 73 74 5f 61 75 74 6f 65 78 74 5f 49 6e  etest_autoext_In
1fa60 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1fa70 53 71 6c 69 74 65 74 65 73 74 5f 62 6c 6f 62 5f  Sqlitetest_blob_
1fa80 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
1fa90 20 20 53 71 6c 69 74 65 74 65 73 74 5f 64 65 6d    Sqlitetest_dem
1faa0 6f 76 66 73 5f 49 6e 69 74 28 69 6e 74 65 72 70  ovfs_Init(interp
1fab0 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
1fac0 74 5f 66 75 6e 63 5f 49 6e 69 74 28 69 6e 74 65  t_func_Init(inte
1fad0 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
1fae0 65 73 74 5f 68 65 78 69 6f 5f 49 6e 69 74 28 69  est_hexio_Init(i
1faf0 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1fb00 74 65 74 65 73 74 5f 69 6e 69 74 5f 49 6e 69 74  tetest_init_Init
1fb10 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1fb20 6c 69 74 65 74 65 73 74 5f 6d 61 6c 6c 6f 63 5f  litetest_malloc_
1fb30 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
1fb40 20 20 53 71 6c 69 74 65 74 65 73 74 5f 6d 75 74    Sqlitetest_mut
1fb50 65 78 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  ex_Init(interp);
1fb60 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 73  .    Sqlitetests
1fb70 63 68 65 6d 61 5f 49 6e 69 74 28 69 6e 74 65 72  chema_Init(inter
1fb80 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
1fb90 73 74 74 63 6c 76 61 72 5f 49 6e 69 74 28 69 6e  sttclvar_Init(in
1fba0 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
1fbb0 65 74 65 73 74 66 73 5f 49 6e 69 74 28 69 6e 74  etestfs_Init(int
1fbc0 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1fbd0 74 65 73 74 54 68 72 65 61 64 5f 49 6e 69 74 28  testThread_Init(
1fbe0 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
1fbf0 69 74 65 74 65 73 74 4f 6e 65 66 69 6c 65 5f 49  itetestOnefile_I
1fc00 6e 69 74 28 29 3b 0a 20 20 20 20 53 71 6c 69 74  nit();.    Sqlit
1fc10 65 74 65 73 74 4f 73 69 6e 73 74 5f 49 6e 69 74  etestOsinst_Init
1fc20 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1fc30 6c 69 74 65 74 65 73 74 62 61 63 6b 75 70 5f 49  litetestbackup_I
1fc40 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1fc50 20 53 71 6c 69 74 65 74 65 73 74 69 6e 74 61 72   Sqlitetestintar
1fc60 72 61 79 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  ray_Init(interp)
1fc70 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
1fc80 76 66 73 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  vfs_Init(interp)
1fc90 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
1fca0 72 74 72 65 65 5f 49 6e 69 74 28 69 6e 74 65 72  rtree_Init(inter
1fcb0 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 71 75  p);.    Sqlitequ
1fcc0 6f 74 61 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  ota_Init(interp)
1fcd0 3b 0a 20 20 20 20 53 71 6c 69 74 65 6d 75 6c 74  ;.    Sqlitemult
1fce0 69 70 6c 65 78 5f 49 6e 69 74 28 69 6e 74 65 72  iplex_Init(inter
1fcf0 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 53 75  p);.    SqliteSu
1fd00 70 65 72 6c 6f 63 6b 5f 49 6e 69 74 28 69 6e 74  perlock_Init(int
1fd10 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1fd20 74 65 73 74 53 79 73 63 61 6c 6c 5f 49 6e 69 74  testSyscall_Init
1fd30 28 69 6e 74 65 72 70 29 3b 0a 23 69 66 20 64 65  (interp);.#if de
1fd40 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
1fd50 42 4c 45 5f 53 45 53 53 49 4f 4e 29 20 26 26 20  BLE_SESSION) && 
1fd60 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
1fd70 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f  NABLE_PREUPDATE_
1fd80 48 4f 4f 4b 29 0a 20 20 20 20 54 65 73 74 53 65  HOOK).    TestSe
1fd90 73 73 69 6f 6e 5f 49 6e 69 74 28 69 6e 74 65 72  ssion_Init(inter
1fda0 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 46  p);.#endif.    F
1fdb0 74 73 35 74 63 6c 5f 49 6e 69 74 28 69 6e 74 65  ts5tcl_Init(inte
1fdc0 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 52  rp);.    SqliteR
1fdd0 62 75 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  bu_Init(interp);
1fde0 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 74  .    Sqlitetestt
1fdf0 63 6c 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  cl_Init(interp);
1fe00 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
1fe10 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33  LITE_ENABLE_FTS3
1fe20 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
1fe30 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 34 29  ITE_ENABLE_FTS4)
1fe40 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 66  .    Sqlitetestf
1fe50 74 73 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  ts3_Init(interp)
1fe60 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 54 63  ;.#endif..    Tc
1fe70 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
1fe80 6e 64 28 0a 20 20 20 20 20 20 20 20 69 6e 74 65  nd(.        inte
1fe90 72 70 2c 20 22 6c 6f 61 64 5f 74 65 73 74 66 69  rp, "load_testfi
1fea0 78 74 75 72 65 5f 65 78 74 65 6e 73 69 6f 6e 73  xture_extensions
1feb0 22 2c 20 69 6e 69 74 5f 61 6c 6c 5f 63 6d 64 2c  ", init_all_cmd,
1fec0 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20 20   0, 0.    );.   
1fed0 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
1fee0 6d 6d 61 6e 64 28 0a 20 20 20 20 20 20 20 20 69  mmand(.        i
1fef0 6e 74 65 72 70 2c 20 22 64 62 5f 75 73 65 5f 6c  nterp, "db_use_l
1ff00 65 67 61 63 79 5f 70 72 65 70 61 72 65 22 2c 20  egacy_prepare", 
1ff10 64 62 5f 75 73 65 5f 6c 65 67 61 63 79 5f 70 72  db_use_legacy_pr
1ff20 65 70 61 72 65 5f 63 6d 64 2c 20 30 2c 20 30 0a  epare_cmd, 0, 0.
1ff30 20 20 20 20 29 3b 0a 20 20 20 20 54 63 6c 5f 43      );.    Tcl_C
1ff40 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
1ff50 0a 20 20 20 20 20 20 20 20 69 6e 74 65 72 70 2c  .        interp,
1ff60 20 22 64 62 5f 6c 61 73 74 5f 73 74 6d 74 5f 70   "db_last_stmt_p
1ff70 74 72 22 2c 20 64 62 5f 6c 61 73 74 5f 73 74 6d  tr", db_last_stm
1ff80 74 5f 70 74 72 2c 20 30 2c 20 30 0a 20 20 20 20  t_ptr, 0, 0.    
1ff90 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  );..#ifdef SQLIT
1ffa0 45 5f 53 53 45 0a 20 20 20 20 53 71 6c 69 74 65  E_SSE.    Sqlite
1ffb0 74 65 73 74 73 73 65 5f 49 6e 69 74 28 69 6e 74  testsse_Init(int
1ffc0 65 72 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  erp);.#endif.  }
1ffd0 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 20 4e 65  .#endif.}../* Ne
1ffe0 65 64 65 64 20 66 6f 72 20 74 68 65 20 73 65 74  eded for the set
1fff0 72 6c 69 6d 69 74 28 29 20 73 79 73 74 65 6d 20  rlimit() system 
20000 63 61 6c 6c 20 6f 6e 20 75 6e 69 78 20 2a 2f 0a  call on unix */.
20010 23 69 66 20 64 65 66 69 6e 65 64 28 75 6e 69 78  #if defined(unix
20020 29 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  ).#include <sys/
20030 72 65 73 6f 75 72 63 65 2e 68 3e 0a 23 65 6e 64  resource.h>.#end
20040 69 66 0a 0a 23 64 65 66 69 6e 65 20 54 43 4c 53  if..#define TCLS
20050 48 5f 4d 41 49 4e 20 6d 61 69 6e 20 20 20 2f 2a  H_MAIN main   /*
20060 20 4e 65 65 64 65 64 20 74 6f 20 66 61 6b 65 20   Needed to fake 
20070 6f 75 74 20 6d 6b 74 63 6c 61 70 70 20 2a 2f 0a  out mktclapp */.
20080 69 6e 74 20 53 51 4c 49 54 45 5f 43 44 45 43 4c  int SQLITE_CDECL
20090 20 54 43 4c 53 48 5f 4d 41 49 4e 28 69 6e 74 20   TCLSH_MAIN(int 
200a0 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67  argc, char **arg
200b0 76 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  v){.  Tcl_Interp
200c0 20 2a 69 6e 74 65 72 70 3b 0a 0a 23 69 66 20 21   *interp;..#if !
200d0 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 5f 57  defined(_WIN32_W
200e0 43 45 29 0a 20 20 69 66 28 20 67 65 74 65 6e 76  CE).  if( getenv
200f0 28 22 42 52 45 41 4b 22 29 20 29 7b 0a 20 20 20  ("BREAK") ){.   
20100 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
20110 0a 20 20 20 20 20 20 20 20 22 61 74 74 61 63 68  .        "attach
20120 20 64 65 62 75 67 67 65 72 20 74 6f 20 70 72 6f   debugger to pro
20130 63 65 73 73 20 25 64 20 61 6e 64 20 70 72 65 73  cess %d and pres
20140 73 20 61 6e 79 20 6b 65 79 20 74 6f 20 63 6f 6e  s any key to con
20150 74 69 6e 75 65 2e 5c 6e 22 2c 0a 20 20 20 20 20  tinue.\n",.     
20160 20 20 20 47 45 54 50 49 44 28 29 29 3b 0a 20 20     GETPID());.  
20170 20 20 66 67 65 74 63 28 73 74 64 69 6e 29 3b 0a    fgetc(stdin);.
20180 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
20190 20 53 69 6e 63 65 20 74 68 65 20 70 72 69 6d 61   Since the prima
201a0 72 79 20 75 73 65 20 63 61 73 65 20 66 6f 72 20  ry use case for 
201b0 74 68 69 73 20 62 69 6e 61 72 79 20 69 73 20 74  this binary is t
201c0 65 73 74 69 6e 67 20 6f 66 20 53 51 4c 69 74 65  esting of SQLite
201d0 2c 0a 20 20 2a 2a 20 62 65 20 73 75 72 65 20 74  ,.  ** be sure t
201e0 6f 20 67 65 6e 65 72 61 74 65 20 63 6f 72 65 20  o generate core 
201f0 66 69 6c 65 73 20 69 66 20 77 65 20 63 72 61 73  files if we cras
20200 68 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  h */.#if defined
20210 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26  (SQLITE_TEST) &&
20220 20 64 65 66 69 6e 65 64 28 75 6e 69 78 29 0a 20   defined(unix). 
20230 20 7b 20 73 74 72 75 63 74 20 72 6c 69 6d 69 74   { struct rlimit
20240 20 78 3b 0a 20 20 20 20 67 65 74 72 6c 69 6d 69   x;.    getrlimi
20250 74 28 52 4c 49 4d 49 54 5f 43 4f 52 45 2c 20 26  t(RLIMIT_CORE, &
20260 78 29 3b 0a 20 20 20 20 78 2e 72 6c 69 6d 5f 63  x);.    x.rlim_c
20270 75 72 20 3d 20 78 2e 72 6c 69 6d 5f 6d 61 78 3b  ur = x.rlim_max;
20280 0a 20 20 20 20 73 65 74 72 6c 69 6d 69 74 28 52  .    setrlimit(R
20290 4c 49 4d 49 54 5f 43 4f 52 45 2c 20 26 78 29 3b  LIMIT_CORE, &x);
202a0 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
202b0 51 4c 49 54 45 5f 54 45 53 54 20 26 26 20 75 6e  QLITE_TEST && un
202c0 69 78 20 2a 2f 0a 0a 0a 20 20 2f 2a 20 43 61 6c  ix */...  /* Cal
202d0 6c 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f  l sqlite3_shutdo
202e0 77 6e 28 29 20 6f 6e 63 65 20 62 65 66 6f 72 65  wn() once before
202f0 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20   doing anything 
20300 65 6c 73 65 2e 20 54 68 69 73 20 69 73 20 74 6f  else. This is to
20310 0a 20 20 2a 2a 20 74 65 73 74 20 74 68 61 74 20  .  ** test that 
20320 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e  sqlite3_shutdown
20330 28 29 20 63 61 6e 20 62 65 20 73 61 66 65 6c 79  () can be safely
20340 20 63 61 6c 6c 65 64 20 62 79 20 61 20 70 72 6f   called by a pro
20350 63 65 73 73 20 62 65 66 6f 72 65 0a 20 20 2a 2a  cess before.  **
20360 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
20370 69 7a 65 28 29 20 69 73 2e 20 2a 2f 0a 20 20 73  ize() is. */.  s
20380 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28  qlite3_shutdown(
20390 29 3b 0a 0a 20 20 54 63 6c 5f 46 69 6e 64 45 78  );..  Tcl_FindEx
203a0 65 63 75 74 61 62 6c 65 28 61 72 67 76 5b 30 5d  ecutable(argv[0]
203b0 29 3b 0a 20 20 54 63 6c 5f 53 65 74 53 79 73 74  );.  Tcl_SetSyst
203c0 65 6d 45 6e 63 6f 64 69 6e 67 28 4e 55 4c 4c 2c  emEncoding(NULL,
203d0 20 22 75 74 66 2d 38 22 29 3b 0a 20 20 69 6e 74   "utf-8");.  int
203e0 65 72 70 20 3d 20 54 63 6c 5f 43 72 65 61 74 65  erp = Tcl_Create
203f0 49 6e 74 65 72 70 28 29 3b 0a 0a 23 69 66 20 54  Interp();..#if T
20400 43 4c 53 48 3d 3d 32 0a 20 20 73 71 6c 69 74 65  CLSH==2.  sqlite
20410 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f  3_config(SQLITE_
20420 43 4f 4e 46 49 47 5f 53 49 4e 47 4c 45 54 48 52  CONFIG_SINGLETHR
20430 45 41 44 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  EAD);.#endif..  
20440 69 6e 69 74 5f 61 6c 6c 28 69 6e 74 65 72 70 29  init_all(interp)
20450 3b 0a 20 20 69 66 28 20 61 72 67 63 3e 3d 32 20  ;.  if( argc>=2 
20460 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
20470 20 20 63 68 61 72 20 7a 41 72 67 63 5b 33 32 5d    char zArgc[32]
20480 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
20490 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 41  printf(sizeof(zA
204a0 72 67 63 29 2c 20 7a 41 72 67 63 2c 20 22 25 64  rgc), zArgc, "%d
204b0 22 2c 20 61 72 67 63 2d 28 33 2d 54 43 4c 53 48  ", argc-(3-TCLSH
204c0 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 56  ));.    Tcl_SetV
204d0 61 72 28 69 6e 74 65 72 70 2c 22 61 72 67 63 22  ar(interp,"argc"
204e0 2c 20 7a 41 72 67 63 2c 20 54 43 4c 5f 47 4c 4f  , zArgc, TCL_GLO
204f0 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 54  BAL_ONLY);.    T
20500 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70  cl_SetVar(interp
20510 2c 22 61 72 67 76 30 22 2c 61 72 67 76 5b 31 5d  ,"argv0",argv[1]
20520 2c 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59  ,TCL_GLOBAL_ONLY
20530 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 56 61  );.    Tcl_SetVa
20540 72 28 69 6e 74 65 72 70 2c 22 61 72 67 76 22 2c  r(interp,"argv",
20550 20 22 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f   "", TCL_GLOBAL_
20560 4f 4e 4c 59 29 3b 0a 20 20 20 20 66 6f 72 28 69  ONLY);.    for(i
20570 3d 33 2d 54 43 4c 53 48 3b 20 69 3c 61 72 67 63  =3-TCLSH; i<argc
20580 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63  ; i++){.      Tc
20590 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c  l_SetVar(interp,
205a0 20 22 61 72 67 76 22 2c 20 61 72 67 76 5b 69 5d   "argv", argv[i]
205b0 2c 0a 20 20 20 20 20 20 20 20 20 20 54 43 4c 5f  ,.          TCL_
205c0 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 20 7c 20 54 43  GLOBAL_ONLY | TC
205d0 4c 5f 4c 49 53 54 5f 45 4c 45 4d 45 4e 54 20 7c  L_LIST_ELEMENT |
205e0 20 54 43 4c 5f 41 50 50 45 4e 44 5f 56 41 4c 55   TCL_APPEND_VALU
205f0 45 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  E);.    }.    if
20600 28 20 54 43 4c 53 48 3d 3d 31 20 26 26 20 54 63  ( TCLSH==1 && Tc
20610 6c 5f 45 76 61 6c 46 69 6c 65 28 69 6e 74 65 72  l_EvalFile(inter
20620 70 2c 20 61 72 67 76 5b 31 5d 29 21 3d 54 43 4c  p, argv[1])!=TCL
20630 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  _OK ){.      con
20640 73 74 20 63 68 61 72 20 2a 7a 49 6e 66 6f 20 3d  st char *zInfo =
20650 20 54 63 6c 5f 47 65 74 56 61 72 28 69 6e 74 65   Tcl_GetVar(inte
20660 72 70 2c 20 22 65 72 72 6f 72 49 6e 66 6f 22 2c  rp, "errorInfo",
20670 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59   TCL_GLOBAL_ONLY
20680 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 49 6e  );.      if( zIn
20690 66 6f 3d 3d 30 20 29 20 7a 49 6e 66 6f 20 3d 20  fo==0 ) zInfo = 
206a0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73  Tcl_GetStringRes
206b0 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  ult(interp);.   
206c0 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
206d0 72 2c 22 25 73 3a 20 25 73 5c 6e 22 2c 20 2a 61  r,"%s: %s\n", *a
206e0 72 67 76 2c 20 7a 49 6e 66 6f 29 3b 0a 20 20 20  rgv, zInfo);.   
206f0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
20700 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 54 43 4c   }.  }.  if( TCL
20710 53 48 3d 3d 32 20 7c 7c 20 61 72 67 63 3c 3d 31  SH==2 || argc<=1
20720 20 29 7b 0a 20 20 20 20 54 63 6c 5f 47 6c 6f 62   ){.    Tcl_Glob
20730 61 6c 45 76 61 6c 28 69 6e 74 65 72 70 2c 20 74  alEval(interp, t
20740 63 6c 73 68 5f 6d 61 69 6e 5f 6c 6f 6f 70 28 29  clsh_main_loop()
20750 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
20760 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 54  0;.}.#endif /* T
20770 43 4c 53 48 20 2a 2f 0a                          CLSH */.