/ Hex Artifact Content
Login

Artifact 651b10698c87bbc3ae5772e2491e3444c5bbf153:


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 23 69 6e 63 6c 75 64 65 20 22 74  ..*/.#include "t
0450: 63 6c 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c  cl.h".#include <
0460: 65 72 72 6e 6f 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20  errno.h>../*.** 
0470: 53 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  Some additional 
0480: 69 6e 63 6c 75 64 65 20 66 69 6c 65 73 20 61 72  include files ar
0490: 65 20 6e 65 65 64 65 64 20 69 66 20 74 68 69 73  e needed if this
04a0: 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20   file is not.** 
04b0: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
04c0: 61 6d 61 6c 67 61 6d 61 74 69 6f 6e 2e 0a 2a 2f  amalgamation..*/
04d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
04e0: 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 0a 23 20 69  AMALGAMATION.# i
04f0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33 2e  nclude "sqlite3.
0500: 68 22 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 74  h".# include <st
0510: 64 6c 69 62 2e 68 3e 0a 23 20 69 6e 63 6c 75 64  dlib.h>.# includ
0520: 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 20 69  e <string.h>.# i
0530: 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68  nclude <assert.h
0540: 3e 0a 20 20 74 79 70 65 64 65 66 20 75 6e 73 69  >.  typedef unsi
0550: 67 6e 65 64 20 63 68 61 72 20 75 38 3b 0a 23 65  gned char u8;.#e
0560: 6e 64 69 66 0a 23 69 6e 63 6c 75 64 65 20 3c 63  ndif.#include <c
0570: 74 79 70 65 2e 68 3e 0a 0a 2f 2a 20 55 73 65 64  type.h>../* Used
0580: 20 74 6f 20 67 65 74 20 74 68 65 20 63 75 72 72   to get the curr
0590: 65 6e 74 20 70 72 6f 63 65 73 73 20 49 44 20 2a  ent process ID *
05a0: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f  /.#if !defined(_
05b0: 57 49 4e 33 32 29 0a 23 20 69 6e 63 6c 75 64 65  WIN32).# include
05c0: 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 20 64 65   <unistd.h>.# de
05d0: 66 69 6e 65 20 47 45 54 50 49 44 20 67 65 74 70  fine GETPID getp
05e0: 69 64 0a 23 65 6c 69 66 20 21 64 65 66 69 6e 65  id.#elif !define
05f0: 64 28 5f 57 49 4e 33 32 5f 57 43 45 29 0a 23 20  d(_WIN32_WCE).# 
0600: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 41 4d  ifndef SQLITE_AM
0610: 41 4c 47 41 4d 41 54 49 4f 4e 0a 23 20 20 64 65  ALGAMATION.#  de
0620: 66 69 6e 65 20 57 49 4e 33 32 5f 4c 45 41 4e 5f  fine WIN32_LEAN_
0630: 41 4e 44 5f 4d 45 41 4e 0a 23 20 20 69 6e 63 6c  AND_MEAN.#  incl
0640: 75 64 65 20 3c 77 69 6e 64 6f 77 73 2e 68 3e 0a  ude <windows.h>.
0650: 23 20 65 6e 64 69 66 0a 23 20 64 65 66 69 6e 65  # endif.# define
0660: 20 47 45 54 50 49 44 20 28 69 6e 74 29 47 65 74   GETPID (int)Get
0670: 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
0680: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 57  .#endif../*. * W
0690: 69 6e 64 6f 77 73 20 6e 65 65 64 73 20 74 6f 20  indows needs to 
06a0: 6b 6e 6f 77 20 77 68 69 63 68 20 73 79 6d 62 6f  know which symbo
06b0: 6c 73 20 74 6f 20 65 78 70 6f 72 74 2e 20 20 55  ls to export.  U
06c0: 6e 69 78 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 2a  nix does not.. *
06d0: 20 42 55 49 4c 44 5f 73 71 6c 69 74 65 20 73 68   BUILD_sqlite sh
06e0: 6f 75 6c 64 20 62 65 20 75 6e 64 65 66 69 6e 65  ould be undefine
06f0: 64 20 66 6f 72 20 55 6e 69 78 2e 0a 20 2a 2f 0a  d for Unix.. */.
0700: 23 69 66 64 65 66 20 42 55 49 4c 44 5f 73 71 6c  #ifdef BUILD_sql
0710: 69 74 65 0a 23 75 6e 64 65 66 20 54 43 4c 5f 53  ite.#undef TCL_S
0720: 54 4f 52 41 47 45 5f 43 4c 41 53 53 0a 23 64 65  TORAGE_CLASS.#de
0730: 66 69 6e 65 20 54 43 4c 5f 53 54 4f 52 41 47 45  fine TCL_STORAGE
0740: 5f 43 4c 41 53 53 20 44 4c 4c 45 58 50 4f 52 54  _CLASS DLLEXPORT
0750: 0a 23 65 6e 64 69 66 20 2f 2a 20 42 55 49 4c 44  .#endif /* BUILD
0760: 5f 73 71 6c 69 74 65 20 2a 2f 0a 0a 23 64 65 66  _sqlite */..#def
0770: 69 6e 65 20 4e 55 4d 5f 50 52 45 50 41 52 45 44  ine NUM_PREPARED
0780: 5f 53 54 4d 54 53 20 31 30 0a 23 64 65 66 69 6e  _STMTS 10.#defin
0790: 65 20 4d 41 58 5f 50 52 45 50 41 52 45 44 5f 53  e MAX_PREPARED_S
07a0: 54 4d 54 53 20 31 30 30 0a 0a 2f 2a 20 46 6f 72  TMTS 100../* For
07b0: 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
07c0: 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75   */.typedef stru
07d0: 63 74 20 53 71 6c 69 74 65 44 62 20 53 71 6c 69  ct SqliteDb Sqli
07e0: 74 65 44 62 3b 0a 0a 2f 2a 0a 2a 2a 20 4e 65 77  teDb;../*.** New
07f0: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20 63   SQL functions c
0800: 61 6e 20 62 65 20 63 72 65 61 74 65 64 20 61 73  an be created as
0810: 20 54 43 4c 20 73 63 72 69 70 74 73 2e 20 20 45   TCL scripts.  E
0820: 61 63 68 20 73 75 63 68 20 66 75 6e 63 74 69 6f  ach such functio
0830: 6e 0a 2a 2a 20 69 73 20 64 65 73 63 72 69 62 65  n.** is describe
0840: 64 20 62 79 20 61 6e 20 69 6e 73 74 61 6e 63 65  d by an instance
0850: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
0860: 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  g structure..*/.
0870: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53  typedef struct S
0880: 71 6c 46 75 6e 63 20 53 71 6c 46 75 6e 63 3b 0a  qlFunc SqlFunc;.
0890: 73 74 72 75 63 74 20 53 71 6c 46 75 6e 63 20 7b  struct SqlFunc {
08a0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
08b0: 6e 74 65 72 70 3b 20 20 20 2f 2a 20 54 68 65 20  nterp;   /* The 
08c0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 20 74 6f  TCL interpret to
08d0: 20 65 78 65 63 75 74 65 20 74 68 65 20 66 75 6e   execute the fun
08e0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ction */.  Tcl_O
08f0: 62 6a 20 2a 70 53 63 72 69 70 74 3b 20 20 20 20  bj *pScript;    
0900: 20 2f 2a 20 54 68 65 20 54 63 6c 5f 4f 62 6a 20   /* The Tcl_Obj 
0910: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
0920: 66 20 74 68 65 20 73 63 72 69 70 74 20 2a 2f 0a  f the script */.
0930: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 3b    SqliteDb *pDb;
0940: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
0950: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  ase connection t
0960: 68 61 74 20 6f 77 6e 73 20 74 68 69 73 20 66 75  hat owns this fu
0970: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  nction */.  int 
0980: 75 73 65 45 76 61 6c 4f 62 6a 76 3b 20 20 20 20  useEvalObjv;    
0990: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 74 20    /* True if it 
09a0: 69 73 20 73 61 66 65 20 74 6f 20 75 73 65 20 54  is safe to use T
09b0: 63 6c 5f 45 76 61 6c 4f 62 6a 76 20 2a 2f 0a 20  cl_EvalObjv */. 
09c0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
09d0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
09e0: 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
09f0: 2a 2f 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70 4e  */.  SqlFunc *pN
0a00: 65 78 74 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65  ext;       /* Ne
0a10: 78 74 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 20 74  xt function on t
0a20: 68 65 20 6c 69 73 74 20 6f 66 20 74 68 65 6d 20  he list of them 
0a30: 61 6c 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  all */.};../*.**
0a40: 20 4e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   New collation s
0a50: 65 71 75 65 6e 63 65 73 20 66 75 6e 63 74 69 6f  equences functio
0a60: 6e 20 63 61 6e 20 62 65 20 63 72 65 61 74 65 64  n can be created
0a70: 20 61 73 20 54 43 4c 20 73 63 72 69 70 74 73 2e   as TCL scripts.
0a80: 20 20 45 61 63 68 20 73 75 63 68 0a 2a 2a 20 66    Each such.** f
0a90: 75 6e 63 74 69 6f 6e 20 69 73 20 64 65 73 63 72  unction is descr
0aa0: 69 62 65 64 20 62 79 20 61 6e 20 69 6e 73 74 61  ibed by an insta
0ab0: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
0ac0: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
0ad0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
0ae0: 74 20 53 71 6c 43 6f 6c 6c 61 74 65 20 53 71 6c  t SqlCollate Sql
0af0: 43 6f 6c 6c 61 74 65 3b 0a 73 74 72 75 63 74 20  Collate;.struct 
0b00: 53 71 6c 43 6f 6c 6c 61 74 65 20 7b 0a 20 20 54  SqlCollate {.  T
0b10: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
0b20: 70 3b 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  p;   /* The TCL 
0b30: 69 6e 74 65 72 70 72 65 74 20 74 6f 20 65 78 65  interpret to exe
0b40: 63 75 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f  cute the functio
0b50: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 63  n */.  char *zSc
0b60: 72 69 70 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  ript;        /* 
0b70: 54 68 65 20 73 63 72 69 70 74 20 74 6f 20 62 65  The script to be
0b80: 20 72 75 6e 20 2a 2f 0a 20 20 53 71 6c 43 6f 6c   run */.  SqlCol
0b90: 6c 61 74 65 20 2a 70 4e 65 78 74 3b 20 20 20 20  late *pNext;    
0ba0: 2f 2a 20 4e 65 78 74 20 66 75 6e 63 74 69 6f 6e  /* Next function
0bb0: 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20   on the list of 
0bc0: 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 7d 3b 0a 0a  them all */.};..
0bd0: 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 64 20 73  /*.** Prepared s
0be0: 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 63 61  tatements are ca
0bf0: 63 68 65 64 20 66 6f 72 20 66 61 73 74 65 72 20  ched for faster 
0c00: 65 78 65 63 75 74 69 6f 6e 2e 20 20 45 61 63 68  execution.  Each
0c10: 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73 74 61   prepared.** sta
0c20: 74 65 6d 65 6e 74 20 69 73 20 64 65 73 63 72 69  tement is descri
0c30: 62 65 64 20 62 79 20 61 6e 20 69 6e 73 74 61 6e  bed by an instan
0c40: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
0c50: 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ing structure..*
0c60: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
0c70: 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74   SqlPreparedStmt
0c80: 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74   SqlPreparedStmt
0c90: 3b 0a 73 74 72 75 63 74 20 53 71 6c 50 72 65 70  ;.struct SqlPrep
0ca0: 61 72 65 64 53 74 6d 74 20 7b 0a 20 20 53 71 6c  aredStmt {.  Sql
0cb0: 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70 4e  PreparedStmt *pN
0cc0: 65 78 74 3b 20 20 2f 2a 20 4e 65 78 74 20 69 6e  ext;  /* Next in
0cd0: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 2a 2f 0a   linked list */.
0ce0: 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d    SqlPreparedStm
0cf0: 74 20 2a 70 50 72 65 76 3b 20 20 2f 2a 20 50 72  t *pPrev;  /* Pr
0d00: 65 76 69 6f 75 73 20 6f 6e 20 74 68 65 20 6c 69  evious on the li
0d10: 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  st */.  sqlite3_
0d20: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20  stmt *pStmt;    
0d30: 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65 64   /* The prepared
0d40: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
0d50: 69 6e 74 20 6e 53 71 6c 3b 20 20 20 20 20 20 20  int nSql;       
0d60: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 68 61 72           /* char
0d70: 73 20 69 6e 20 7a 53 71 6c 5b 5d 20 2a 2f 0a 20  s in zSql[] */. 
0d80: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
0d90: 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78  l;        /* Tex
0da0: 74 20 6f 66 20 74 68 65 20 53 51 4c 20 73 74 61  t of the SQL sta
0db0: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
0dc0: 6e 50 61 72 6d 3b 20 20 20 20 20 20 20 20 20 20  nParm;          
0dd0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
0de0: 61 70 50 61 72 6d 20 61 72 72 61 79 20 2a 2f 0a  apParm array */.
0df0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 50 61    Tcl_Obj **apPa
0e00: 72 6d 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 72  rm;        /* Ar
0e10: 72 61 79 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ray of reference
0e20: 64 20 6f 62 6a 65 63 74 20 70 6f 69 6e 74 65 72  d object pointer
0e30: 73 20 2a 2f 0a 7d 3b 0a 0a 74 79 70 65 64 65 66  s */.};..typedef
0e40: 20 73 74 72 75 63 74 20 49 6e 63 72 62 6c 6f 62   struct Incrblob
0e50: 43 68 61 6e 6e 65 6c 20 49 6e 63 72 62 6c 6f 62  Channel Incrblob
0e60: 43 68 61 6e 6e 65 6c 3b 0a 0a 2f 2a 0a 2a 2a 20  Channel;../*.** 
0e70: 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73  There is one ins
0e80: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74  tance of this st
0e90: 72 75 63 74 75 72 65 20 66 6f 72 20 65 61 63 68  ructure for each
0ea0: 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
0eb0: 0a 2a 2a 20 74 68 61 74 20 68 61 73 20 62 65 65  .** that has bee
0ec0: 6e 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20  n opened by the 
0ed0: 53 51 4c 69 74 65 20 54 43 4c 20 69 6e 74 65 72  SQLite TCL inter
0ee0: 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  face..**.** If t
0ef0: 68 69 73 20 6d 6f 64 75 6c 65 20 69 73 20 62 75  his module is bu
0f00: 69 6c 74 20 77 69 74 68 20 53 51 4c 49 54 45 5f  ilt with SQLITE_
0f10: 54 45 53 54 20 64 65 66 69 6e 65 64 20 28 74 6f  TEST defined (to
0f20: 20 63 72 65 61 74 65 20 74 68 65 20 53 51 4c 69   create the SQLi
0f30: 74 65 0a 2a 2a 20 74 65 73 74 66 69 78 74 75 72  te.** testfixtur
0f40: 65 20 65 78 65 63 75 74 61 62 6c 65 29 2c 20 74  e executable), t
0f50: 68 65 6e 20 69 74 20 6d 61 79 20 62 65 20 63 6f  hen it may be co
0f60: 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73 65 20  nfigured to use 
0f70: 65 69 74 68 65 72 0a 2a 2a 20 73 71 6c 69 74 65  either.** sqlite
0f80: 33 5f 70 72 65 70 61 72 65 5f 76 32 28 29 20 6f  3_prepare_v2() o
0f90: 72 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  r sqlite3_prepar
0fa0: 65 28 29 20 74 6f 20 70 72 65 70 61 72 65 20 53  e() to prepare S
0fb0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  QL statements..*
0fc0: 2a 20 49 66 20 53 71 6c 69 74 65 44 62 2e 62 4c  * If SqliteDb.bL
0fd0: 65 67 61 63 79 50 72 65 70 61 72 65 20 69 73 20  egacyPrepare is 
0fe0: 74 72 75 65 2c 20 73 71 6c 69 74 65 33 5f 70 72  true, sqlite3_pr
0ff0: 65 70 61 72 65 28 29 20 69 73 20 75 73 65 64 2e  epare() is used.
1000: 0a 2a 2f 0a 73 74 72 75 63 74 20 53 71 6c 69 74  .*/.struct Sqlit
1010: 65 44 62 20 7b 0a 20 20 73 71 6c 69 74 65 33 20  eDb {.  sqlite3 
1020: 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  *db;            
1030: 20 20 20 2f 2a 20 54 68 65 20 22 72 65 61 6c 22     /* The "real"
1040: 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74   database struct
1050: 75 72 65 2e 20 4d 55 53 54 20 42 45 20 46 49 52  ure. MUST BE FIR
1060: 53 54 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  ST */.  Tcl_Inte
1070: 72 70 20 2a 69 6e 74 65 72 70 3b 20 20 20 20 20  rp *interp;     
1080: 20 20 20 2f 2a 20 54 68 65 20 69 6e 74 65 72 70     /* The interp
1090: 72 65 74 65 72 20 75 73 65 64 20 66 6f 72 20 74  reter used for t
10a0: 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  his database */.
10b0: 20 20 63 68 61 72 20 2a 7a 42 75 73 79 3b 20 20    char *zBusy;  
10c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10d0: 54 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  The busy callbac
10e0: 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63  k routine */.  c
10f0: 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 20 20 20  har *zCommit;   
1100: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1110: 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 63 61 6c   commit hook cal
1120: 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f  lback routine */
1130: 0a 20 20 63 68 61 72 20 2a 7a 54 72 61 63 65 3b  .  char *zTrace;
1140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1150: 20 54 68 65 20 74 72 61 63 65 20 63 61 6c 6c 62   The trace callb
1160: 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  ack routine */. 
1170: 20 63 68 61 72 20 2a 7a 50 72 6f 66 69 6c 65 3b   char *zProfile;
1180: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1190: 68 65 20 70 72 6f 66 69 6c 65 20 63 61 6c 6c 62  he profile callb
11a0: 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  ack routine */. 
11b0: 20 63 68 61 72 20 2a 7a 50 72 6f 67 72 65 73 73   char *zProgress
11c0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
11d0: 68 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c  he progress call
11e0: 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a  back routine */.
11f0: 20 20 63 68 61 72 20 2a 7a 41 75 74 68 3b 20 20    char *zAuth;  
1200: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1210: 54 68 65 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  The authorizatio
1220: 6e 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69  n callback routi
1230: 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 61  ne */.  int disa
1240: 62 6c 65 41 75 74 68 3b 20 20 20 20 20 20 20 20  bleAuth;        
1250: 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 74 68     /* Disable th
1260: 65 20 61 75 74 68 6f 72 69 7a 65 72 20 69 66 20  e authorizer if 
1270: 69 74 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 63  it exists */.  c
1280: 68 61 72 20 2a 7a 4e 75 6c 6c 3b 20 20 20 20 20  har *zNull;     
1290: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
12a0: 74 20 74 6f 20 73 75 62 73 74 69 74 75 74 65 20  t to substitute 
12b0: 66 6f 72 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 20  for an SQL NULL 
12c0: 76 61 6c 75 65 20 2a 2f 0a 20 20 53 71 6c 46 75  value */.  SqlFu
12d0: 6e 63 20 2a 70 46 75 6e 63 3b 20 20 20 20 20 20  nc *pFunc;      
12e0: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
12f0: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20 2a   SQL functions *
1300: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 55 70  /.  Tcl_Obj *pUp
1310: 64 61 74 65 48 6f 6f 6b 3b 20 20 20 20 20 20 2f  dateHook;      /
1320: 2a 20 55 70 64 61 74 65 20 68 6f 6f 6b 20 73 63  * Update hook sc
1330: 72 69 70 74 20 28 69 66 20 61 6e 79 29 20 2a 2f  ript (if any) */
1340: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 6f 6c  .  Tcl_Obj *pRol
1350: 6c 62 61 63 6b 48 6f 6f 6b 3b 20 20 20 20 2f 2a  lbackHook;    /*
1360: 20 52 6f 6c 6c 62 61 63 6b 20 68 6f 6f 6b 20 73   Rollback hook s
1370: 63 72 69 70 74 20 28 69 66 20 61 6e 79 29 20 2a  cript (if any) *
1380: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 57 61  /.  Tcl_Obj *pWa
1390: 6c 48 6f 6f 6b 3b 20 20 20 20 20 20 20 20 20 2f  lHook;         /
13a0: 2a 20 57 41 4c 20 68 6f 6f 6b 20 73 63 72 69 70  * WAL hook scrip
13b0: 74 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20 20  t (if any) */.  
13c0: 54 63 6c 5f 4f 62 6a 20 2a 70 55 6e 6c 6f 63 6b  Tcl_Obj *pUnlock
13d0: 4e 6f 74 69 66 79 3b 20 20 20 20 2f 2a 20 55 6e  Notify;    /* Un
13e0: 6c 6f 63 6b 20 6e 6f 74 69 66 79 20 73 63 72 69  lock notify scri
13f0: 70 74 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20  pt (if any) */. 
1400: 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 43 6f   SqlCollate *pCo
1410: 6c 6c 61 74 65 3b 20 20 20 20 20 20 2f 2a 20 4c  llate;      /* L
1420: 69 73 74 20 6f 66 20 53 51 4c 20 63 6f 6c 6c 61  ist of SQL colla
1430: 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 73 20 2a  tion functions *
1440: 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
1450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1460: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 6f 66  * Return code of
1470: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c   most recent sql
1480: 69 74 65 33 5f 65 78 65 63 28 29 20 2a 2f 0a 20  ite3_exec() */. 
1490: 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6f 6c 6c 61   Tcl_Obj *pColla
14a0: 74 65 4e 65 65 64 65 64 3b 20 20 20 2f 2a 20 43  teNeeded;   /* C
14b0: 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65 64 65 64 20  ollation needed 
14c0: 73 63 72 69 70 74 20 2a 2f 0a 20 20 53 71 6c 50  script */.  SqlP
14d0: 72 65 70 61 72 65 64 53 74 6d 74 20 2a 73 74 6d  reparedStmt *stm
14e0: 74 4c 69 73 74 3b 20 2f 2a 20 4c 69 73 74 20 6f  tList; /* List o
14f0: 66 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  f prepared state
1500: 6d 65 6e 74 73 2a 2f 0a 20 20 53 71 6c 50 72 65  ments*/.  SqlPre
1510: 70 61 72 65 64 53 74 6d 74 20 2a 73 74 6d 74 4c  paredStmt *stmtL
1520: 61 73 74 3b 20 2f 2a 20 4c 61 73 74 20 73 74 61  ast; /* Last sta
1530: 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 6c 69  tement in the li
1540: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 53  st */.  int maxS
1550: 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tmt;            
1560: 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 6d     /* The next m
1570: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
1580: 20 73 74 6d 74 4c 69 73 74 20 2a 2f 0a 20 20 69   stmtList */.  i
1590: 6e 74 20 6e 53 74 6d 74 3b 20 20 20 20 20 20 20  nt nStmt;       
15a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
15b0: 62 65 72 20 6f 66 20 73 74 61 74 65 6d 65 6e 74  ber of statement
15c0: 73 20 69 6e 20 73 74 6d 74 4c 69 73 74 20 2a 2f  s in stmtList */
15d0: 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  .  IncrblobChann
15e0: 65 6c 20 2a 70 49 6e 63 72 62 6c 6f 62 3b 2f 2a  el *pIncrblob;/*
15f0: 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   Linked list of 
1600: 6f 70 65 6e 20 69 6e 63 72 62 6c 6f 62 20 63 68  open incrblob ch
1610: 61 6e 6e 65 6c 73 20 2a 2f 0a 20 20 69 6e 74 20  annels */.  int 
1620: 6e 53 74 65 70 2c 20 6e 53 6f 72 74 2c 20 6e 49  nStep, nSort, nI
1630: 6e 64 65 78 3b 20 20 2f 2a 20 53 74 61 74 69 73  ndex;  /* Statis
1640: 74 69 63 73 20 66 6f 72 20 6d 6f 73 74 20 72 65  tics for most re
1650: 63 65 6e 74 20 6f 70 65 72 61 74 69 6f 6e 20 2a  cent operation *
1660: 2f 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 61 63  /.  int nTransac
1670: 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 2f  tion;          /
1680: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 73 74  * Number of nest
1690: 65 64 20 5b 74 72 61 6e 73 61 63 74 69 6f 6e 5d  ed [transaction]
16a0: 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23 69 66 64   methods */.#ifd
16b0: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
16c0: 20 69 6e 74 20 62 4c 65 67 61 63 79 50 72 65 70   int bLegacyPrep
16d0: 61 72 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  are;        /* T
16e0: 72 75 65 20 74 6f 20 75 73 65 20 73 71 6c 69 74  rue to use sqlit
16f0: 65 33 5f 70 72 65 70 61 72 65 28 29 20 2a 2f 0a  e3_prepare() */.
1700: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 73 74 72 75 63  #endif.};..struc
1710: 74 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65  t IncrblobChanne
1720: 6c 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c  l {.  sqlite3_bl
1730: 6f 62 20 2a 70 42 6c 6f 62 3b 20 20 20 20 20 20  ob *pBlob;      
1740: 2f 2a 20 73 71 6c 69 74 65 33 20 62 6c 6f 62 20  /* sqlite3 blob 
1750: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 53 71 6c 69  handle */.  Sqli
1760: 74 65 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20  teDb *pDb;      
1770: 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61        /* Associa
1780: 74 65 64 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ted database con
1790: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
17a0: 20 69 53 65 65 6b 3b 20 20 20 20 20 20 20 20 20   iSeek;         
17b0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
17c0: 74 20 73 65 65 6b 20 6f 66 66 73 65 74 20 2a 2f  t seek offset */
17d0: 0a 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63  .  Tcl_Channel c
17e0: 68 61 6e 6e 65 6c 3b 20 20 20 20 20 20 2f 2a 20  hannel;      /* 
17f0: 43 68 61 6e 6e 65 6c 20 69 64 65 6e 74 69 66 69  Channel identifi
1800: 65 72 20 2a 2f 0a 20 20 49 6e 63 72 62 6c 6f 62  er */.  Incrblob
1810: 43 68 61 6e 6e 65 6c 20 2a 70 4e 65 78 74 3b 20  Channel *pNext; 
1820: 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74    /* Linked list
1830: 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 69 6e 63   of all open inc
1840: 72 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 73 20 2a  rblob channels *
1850: 2f 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e  /.  IncrblobChan
1860: 6e 65 6c 20 2a 70 50 72 65 76 3b 20 20 20 2f 2a  nel *pPrev;   /*
1870: 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   Linked list of 
1880: 61 6c 6c 20 6f 70 65 6e 20 69 6e 63 72 62 6c 6f  all open incrblo
1890: 62 20 63 68 61 6e 6e 65 6c 73 20 2a 2f 0a 7d 3b  b channels */.};
18a0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
18b0: 61 20 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  a string length 
18c0: 74 68 61 74 20 69 73 20 6c 69 6d 69 74 65 64 20  that is limited 
18d0: 74 6f 20 77 68 61 74 20 63 61 6e 20 62 65 20 73  to what can be s
18e0: 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 6c 6f 77 65  tored in.** lowe
18f0: 72 20 33 30 20 62 69 74 73 20 6f 66 20 61 20 33  r 30 bits of a 3
1900: 32 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74  2-bit signed int
1910: 65 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eger..*/.static 
1920: 69 6e 74 20 73 74 72 6c 65 6e 33 30 28 63 6f 6e  int strlen30(con
1930: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 63  st char *z){.  c
1940: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 20 3d 20  onst char *z2 = 
1950: 7a 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a 32 20  z;.  while( *z2 
1960: 29 7b 20 7a 32 2b 2b 3b 20 7d 0a 20 20 72 65 74  ){ z2++; }.  ret
1970: 75 72 6e 20 30 78 33 66 66 66 66 66 66 66 20 26  urn 0x3fffffff &
1980: 20 28 69 6e 74 29 28 7a 32 20 2d 20 7a 29 3b 0a   (int)(z2 - z);.
1990: 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  }...#ifndef SQLI
19a0: 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
19b0: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c  ./*.** Close all
19c0: 20 69 6e 63 72 62 6c 6f 62 20 63 68 61 6e 6e 65   incrblob channe
19d0: 6c 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20  ls opened using 
19e0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
19f0: 69 6f 6e 20 70 44 62 2e 0a 2a 2a 20 54 68 69 73  ion pDb..** This
1a00: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
1a10: 73 68 75 74 74 69 6e 67 20 64 6f 77 6e 20 74 68  shutting down th
1a20: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
1a30: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
1a40: 20 76 6f 69 64 20 63 6c 6f 73 65 49 6e 63 72 62   void closeIncrb
1a50: 6c 6f 62 43 68 61 6e 6e 65 6c 73 28 53 71 6c 69  lobChannels(Sqli
1a60: 74 65 44 62 20 2a 70 44 62 29 7b 0a 20 20 49 6e  teDb *pDb){.  In
1a70: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70  crblobChannel *p
1a80: 3b 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e  ;.  IncrblobChan
1a90: 6e 65 6c 20 2a 70 4e 65 78 74 3b 0a 0a 20 20 66  nel *pNext;..  f
1aa0: 6f 72 28 70 3d 70 44 62 2d 3e 70 49 6e 63 72 62  or(p=pDb->pIncrb
1ab0: 6c 6f 62 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29  lob; p; p=pNext)
1ac0: 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d  {.    pNext = p-
1ad0: 3e 70 4e 65 78 74 3b 0a 0a 20 20 20 20 2f 2a 20  >pNext;..    /* 
1ae0: 4e 6f 74 65 3a 20 43 61 6c 6c 69 6e 67 20 75 6e  Note: Calling un
1af0: 72 65 67 69 73 74 65 72 20 68 65 72 65 20 63 61  register here ca
1b00: 6c 6c 20 54 63 6c 5f 43 6c 6f 73 65 20 6f 6e 20  ll Tcl_Close on 
1b10: 74 68 65 20 69 6e 63 72 62 6c 6f 62 20 63 68 61  the incrblob cha
1b20: 6e 6e 65 6c 2c 20 0a 20 20 20 20 2a 2a 20 77 68  nnel, .    ** wh
1b30: 69 63 68 20 64 65 6c 65 74 65 73 20 74 68 65 20  ich deletes the 
1b40: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20  IncrblobChannel 
1b50: 73 74 72 75 63 74 75 72 65 20 61 74 20 2a 70 2e  structure at *p.
1b60: 20 53 6f 20 64 6f 20 6e 6f 74 0a 20 20 20 20 2a   So do not.    *
1b70: 2a 20 63 61 6c 6c 20 54 63 6c 5f 46 72 65 65 28  * call Tcl_Free(
1b80: 29 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20  ) here..    */. 
1b90: 20 20 20 54 63 6c 5f 55 6e 72 65 67 69 73 74 65     Tcl_Unregiste
1ba0: 72 43 68 61 6e 6e 65 6c 28 70 44 62 2d 3e 69 6e  rChannel(pDb->in
1bb0: 74 65 72 70 2c 20 70 2d 3e 63 68 61 6e 6e 65 6c  terp, p->channel
1bc0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1bd0: 43 6c 6f 73 65 20 61 6e 20 69 6e 63 72 65 6d 65  Close an increme
1be0: 6e 74 61 6c 20 62 6c 6f 62 20 63 68 61 6e 6e 65  ntal blob channe
1bf0: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
1c00: 20 69 6e 63 72 62 6c 6f 62 43 6c 6f 73 65 28 43   incrblobClose(C
1c10: 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e  lientData instan
1c20: 63 65 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65  ceData, Tcl_Inte
1c30: 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 49  rp *interp){.  I
1c40: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a  ncrblobChannel *
1c50: 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68 61  p = (IncrblobCha
1c60: 6e 6e 65 6c 20 2a 29 69 6e 73 74 61 6e 63 65 44  nnel *)instanceD
1c70: 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ata;.  int rc = 
1c80: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f  sqlite3_blob_clo
1c90: 73 65 28 70 2d 3e 70 42 6c 6f 62 29 3b 0a 20 20  se(p->pBlob);.  
1ca0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
1cb0: 3e 70 44 62 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20  >pDb->db;..  /* 
1cc0: 52 65 6d 6f 76 65 20 74 68 65 20 63 68 61 6e 6e  Remove the chann
1cd0: 65 6c 20 66 72 6f 6d 20 74 68 65 20 53 71 6c 69  el from the Sqli
1ce0: 74 65 44 62 2e 70 49 6e 63 72 62 6c 6f 62 20 6c  teDb.pIncrblob l
1cf0: 69 73 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d  ist. */.  if( p-
1d00: 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d  >pNext ){.    p-
1d10: 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
1d20: 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20  p->pPrev;.  }.  
1d30: 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a  if( p->pPrev ){.
1d40: 20 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e      p->pPrev->pN
1d50: 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
1d60: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 44 62    }.  if( p->pDb
1d70: 2d 3e 70 49 6e 63 72 62 6c 6f 62 3d 3d 70 20 29  ->pIncrblob==p )
1d80: 7b 0a 20 20 20 20 70 2d 3e 70 44 62 2d 3e 70 49  {.    p->pDb->pI
1d90: 6e 63 72 62 6c 6f 62 20 3d 20 70 2d 3e 70 4e 65  ncrblob = p->pNe
1da0: 78 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72  xt;.  }..  /* Fr
1db0: 65 65 20 74 68 65 20 49 6e 63 72 62 6c 6f 62 43  ee the IncrblobC
1dc0: 68 61 6e 6e 65 6c 20 73 74 72 75 63 74 75 72 65  hannel structure
1dd0: 20 2a 2f 0a 20 20 54 63 6c 5f 46 72 65 65 28 28   */.  Tcl_Free((
1de0: 63 68 61 72 20 2a 29 70 29 3b 0a 0a 20 20 69 66  char *)p);..  if
1df0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1e00: 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65  ){.    Tcl_SetRe
1e10: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
1e20: 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 65 72 72  ar *)sqlite3_err
1e30: 6d 73 67 28 64 62 29 2c 20 54 43 4c 5f 56 4f 4c  msg(db), TCL_VOL
1e40: 41 54 49 4c 45 29 3b 0a 20 20 20 20 72 65 74 75  ATILE);.    retu
1e50: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1e60: 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
1e70: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  K;.}../*.** Read
1e80: 20 64 61 74 61 20 66 72 6f 6d 20 61 6e 20 69 6e   data from an in
1e90: 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63  cremental blob c
1ea0: 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69  hannel..*/.stati
1eb0: 63 20 69 6e 74 20 69 6e 63 72 62 6c 6f 62 49 6e  c int incrblobIn
1ec0: 70 75 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  put(.  ClientDat
1ed0: 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20  a instanceData, 
1ee0: 0a 20 20 63 68 61 72 20 2a 62 75 66 2c 20 0a 20  .  char *buf, . 
1ef0: 20 69 6e 74 20 62 75 66 53 69 7a 65 2c 0a 20 20   int bufSize,.  
1f00: 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50 74  int *errorCodePt
1f10: 72 0a 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43  r.){.  IncrblobC
1f20: 68 61 6e 6e 65 6c 20 2a 70 20 3d 20 28 49 6e 63  hannel *p = (Inc
1f30: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 69  rblobChannel *)i
1f40: 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 69  nstanceData;.  i
1f50: 6e 74 20 6e 52 65 61 64 20 3d 20 62 75 66 53 69  nt nRead = bufSi
1f60: 7a 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ze;         /* N
1f70: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
1f80: 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20  o read */.  int 
1f90: 6e 42 6c 6f 62 3b 20 20 20 20 20 20 20 20 20 20  nBlob;          
1fa0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
1fb0: 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c  l size of the bl
1fc0: 6f 62 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ob */.  int rc; 
1fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe0: 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 20 65       /* sqlite e
1ff0: 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  rror code */..  
2000: 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f  nBlob = sqlite3_
2010: 62 6c 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70 42  blob_bytes(p->pB
2020: 6c 6f 62 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e  lob);.  if( (p->
2030: 69 53 65 65 6b 2b 6e 52 65 61 64 29 3e 6e 42 6c  iSeek+nRead)>nBl
2040: 6f 62 20 29 7b 0a 20 20 20 20 6e 52 65 61 64 20  ob ){.    nRead 
2050: 3d 20 6e 42 6c 6f 62 2d 70 2d 3e 69 53 65 65 6b  = nBlob-p->iSeek
2060: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 61  ;.  }.  if( nRea
2070: 64 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  d<=0 ){.    retu
2080: 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  rn 0;.  }..  rc 
2090: 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72  = sqlite3_blob_r
20a0: 65 61 64 28 70 2d 3e 70 42 6c 6f 62 2c 20 28 76  ead(p->pBlob, (v
20b0: 6f 69 64 20 2a 29 62 75 66 2c 20 6e 52 65 61 64  oid *)buf, nRead
20c0: 2c 20 70 2d 3e 69 53 65 65 6b 29 3b 0a 20 20 69  , p->iSeek);.  i
20d0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
20e0: 20 29 7b 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f   ){.    *errorCo
20f0: 64 65 50 74 72 20 3d 20 72 63 3b 0a 20 20 20 20  dePtr = rc;.    
2100: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 0a  return -1;.  }..
2110: 20 20 70 2d 3e 69 53 65 65 6b 20 2b 3d 20 6e 52    p->iSeek += nR
2120: 65 61 64 3b 0a 20 20 72 65 74 75 72 6e 20 6e 52  ead;.  return nR
2130: 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72  ead;.}../*.** Wr
2140: 69 74 65 20 64 61 74 61 20 74 6f 20 61 6e 20 69  ite data to an i
2150: 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20  ncremental blob 
2160: 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74  channel..*/.stat
2170: 69 63 20 69 6e 74 20 69 6e 63 72 62 6c 6f 62 4f  ic int incrblobO
2180: 75 74 70 75 74 28 0a 20 20 43 6c 69 65 6e 74 44  utput(.  ClientD
2190: 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61  ata instanceData
21a0: 2c 20 0a 20 20 43 4f 4e 53 54 20 63 68 61 72 20  , .  CONST char 
21b0: 2a 62 75 66 2c 20 0a 20 20 69 6e 74 20 74 6f 57  *buf, .  int toW
21c0: 72 69 74 65 2c 0a 20 20 69 6e 74 20 2a 65 72 72  rite,.  int *err
21d0: 6f 72 43 6f 64 65 50 74 72 0a 29 7b 0a 20 20 49  orCodePtr.){.  I
21e0: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a  ncrblobChannel *
21f0: 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68 61  p = (IncrblobCha
2200: 6e 6e 65 6c 20 2a 29 69 6e 73 74 61 6e 63 65 44  nnel *)instanceD
2210: 61 74 61 3b 0a 20 20 69 6e 74 20 6e 57 72 69 74  ata;.  int nWrit
2220: 65 20 3d 20 74 6f 57 72 69 74 65 3b 20 20 20 20  e = toWrite;    
2230: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2240: 20 62 79 74 65 73 20 74 6f 20 77 72 69 74 65 20   bytes to write 
2250: 2a 2f 0a 20 20 69 6e 74 20 6e 42 6c 6f 62 3b 20  */.  int nBlob; 
2260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2270: 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20    /* Total size 
2280: 6f 66 20 74 68 65 20 62 6c 6f 62 20 2a 2f 0a 20  of the blob */. 
2290: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
22a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22b0: 20 73 71 6c 69 74 65 20 65 72 72 6f 72 20 63 6f   sqlite error co
22c0: 64 65 20 2a 2f 0a 0a 20 20 6e 42 6c 6f 62 20 3d  de */..  nBlob =
22d0: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79   sqlite3_blob_by
22e0: 74 65 73 28 70 2d 3e 70 42 6c 6f 62 29 3b 0a 20  tes(p->pBlob);. 
22f0: 20 69 66 28 20 28 70 2d 3e 69 53 65 65 6b 2b 6e   if( (p->iSeek+n
2300: 57 72 69 74 65 29 3e 6e 42 6c 6f 62 20 29 7b 0a  Write)>nBlob ){.
2310: 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74      *errorCodePt
2320: 72 20 3d 20 45 49 4e 56 41 4c 3b 0a 20 20 20 20  r = EINVAL;.    
2330: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20  return -1;.  }. 
2340: 20 69 66 28 20 6e 57 72 69 74 65 3c 3d 30 20 29   if( nWrite<=0 )
2350: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
2360: 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69    }..  rc = sqli
2370: 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65 28 70  te3_blob_write(p
2380: 2d 3e 70 42 6c 6f 62 2c 20 28 76 6f 69 64 20 2a  ->pBlob, (void *
2390: 29 62 75 66 2c 20 6e 57 72 69 74 65 2c 20 70 2d  )buf, nWrite, p-
23a0: 3e 69 53 65 65 6b 29 3b 0a 20 20 69 66 28 20 72  >iSeek);.  if( r
23b0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
23c0: 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74      *errorCodePt
23d0: 72 20 3d 20 45 49 4f 3b 0a 20 20 20 20 72 65 74  r = EIO;.    ret
23e0: 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 70  urn -1;.  }..  p
23f0: 2d 3e 69 53 65 65 6b 20 2b 3d 20 6e 57 72 69 74  ->iSeek += nWrit
2400: 65 3b 0a 20 20 72 65 74 75 72 6e 20 6e 57 72 69  e;.  return nWri
2410: 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65  te;.}../*.** See
2420: 6b 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  k an incremental
2430: 20 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a   blob channel..*
2440: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63  /.static int inc
2450: 72 62 6c 6f 62 53 65 65 6b 28 0a 20 20 43 6c 69  rblobSeek(.  Cli
2460: 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65  entData instance
2470: 44 61 74 61 2c 20 0a 20 20 6c 6f 6e 67 20 6f 66  Data, .  long of
2480: 66 73 65 74 2c 0a 20 20 69 6e 74 20 73 65 65 6b  fset,.  int seek
2490: 4d 6f 64 65 2c 0a 20 20 69 6e 74 20 2a 65 72 72  Mode,.  int *err
24a0: 6f 72 43 6f 64 65 50 74 72 0a 29 7b 0a 20 20 49  orCodePtr.){.  I
24b0: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a  ncrblobChannel *
24c0: 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68 61  p = (IncrblobCha
24d0: 6e 6e 65 6c 20 2a 29 69 6e 73 74 61 6e 63 65 44  nnel *)instanceD
24e0: 61 74 61 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  ata;..  switch( 
24f0: 73 65 65 6b 4d 6f 64 65 20 29 7b 0a 20 20 20 20  seekMode ){.    
2500: 63 61 73 65 20 53 45 45 4b 5f 53 45 54 3a 0a 20  case SEEK_SET:. 
2510: 20 20 20 20 20 70 2d 3e 69 53 65 65 6b 20 3d 20       p->iSeek = 
2520: 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 62 72  offset;.      br
2530: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 45  eak;.    case SE
2540: 45 4b 5f 43 55 52 3a 0a 20 20 20 20 20 20 70 2d  EK_CUR:.      p-
2550: 3e 69 53 65 65 6b 20 2b 3d 20 6f 66 66 73 65 74  >iSeek += offset
2560: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
2570: 20 20 20 63 61 73 65 20 53 45 45 4b 5f 45 4e 44     case SEEK_END
2580: 3a 0a 20 20 20 20 20 20 70 2d 3e 69 53 65 65 6b  :.      p->iSeek
2590: 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f   = sqlite3_blob_
25a0: 62 79 74 65 73 28 70 2d 3e 70 42 6c 6f 62 29 20  bytes(p->pBlob) 
25b0: 2b 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  + offset;.      
25c0: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61  break;..    defa
25d0: 75 6c 74 3a 20 61 73 73 65 72 74 28 21 22 42 61  ult: assert(!"Ba
25e0: 64 20 73 65 65 6b 4d 6f 64 65 22 29 3b 0a 20 20  d seekMode");.  
25f0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 69  }..  return p->i
2600: 53 65 65 6b 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63  Seek;.}...static
2610: 20 76 6f 69 64 20 69 6e 63 72 62 6c 6f 62 57 61   void incrblobWa
2620: 74 63 68 28 43 6c 69 65 6e 74 44 61 74 61 20 69  tch(ClientData i
2630: 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 69 6e 74  nstanceData, int
2640: 20 6d 6f 64 65 29 7b 20 0a 20 20 2f 2a 20 4e 4f   mode){ .  /* NO
2650: 2d 4f 50 20 2a 2f 20 0a 7d 0a 73 74 61 74 69 63  -OP */ .}.static
2660: 20 69 6e 74 20 69 6e 63 72 62 6c 6f 62 48 61 6e   int incrblobHan
2670: 64 6c 65 28 43 6c 69 65 6e 74 44 61 74 61 20 69  dle(ClientData i
2680: 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 69 6e 74  nstanceData, int
2690: 20 64 69 72 2c 20 43 6c 69 65 6e 74 44 61 74 61   dir, ClientData
26a0: 20 2a 68 50 74 72 29 7b 0a 20 20 72 65 74 75 72   *hPtr){.  retur
26b0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a  n TCL_ERROR;.}..
26c0: 73 74 61 74 69 63 20 54 63 6c 5f 43 68 61 6e 6e  static Tcl_Chann
26d0: 65 6c 54 79 70 65 20 49 6e 63 72 62 6c 6f 62 43  elType IncrblobC
26e0: 68 61 6e 6e 65 6c 54 79 70 65 20 3d 20 7b 0a 20  hannelType = {. 
26f0: 20 22 69 6e 63 72 62 6c 6f 62 22 2c 20 20 20 20   "incrblob",    
2700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2710: 20 20 20 20 2f 2a 20 74 79 70 65 4e 61 6d 65 20      /* typeName 
2720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2730: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2740: 20 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56 45 52   TCL_CHANNEL_VER
2750: 53 49 4f 4e 5f 32 2c 20 20 20 20 20 20 20 20 20  SION_2,         
2760: 20 20 20 20 2f 2a 20 76 65 72 73 69 6f 6e 20 20      /* version  
2770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2780: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2790: 20 69 6e 63 72 62 6c 6f 62 43 6c 6f 73 65 2c 20   incrblobClose, 
27a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b0: 20 20 20 20 2f 2a 20 63 6c 6f 73 65 50 72 6f 63      /* closeProc
27c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
27e0: 20 69 6e 63 72 62 6c 6f 62 49 6e 70 75 74 2c 20   incrblobInput, 
27f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2800: 20 20 20 20 2f 2a 20 69 6e 70 75 74 50 72 6f 63      /* inputProc
2810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2820: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2830: 20 69 6e 63 72 62 6c 6f 62 4f 75 74 70 75 74 2c   incrblobOutput,
2840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2850: 20 20 20 20 2f 2a 20 6f 75 74 70 75 74 50 72 6f      /* outputPro
2860: 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
2870: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2880: 20 69 6e 63 72 62 6c 6f 62 53 65 65 6b 2c 20 20   incrblobSeek,  
2890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a0: 20 20 20 20 2f 2a 20 73 65 65 6b 50 72 6f 63 20      /* seekProc 
28b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
28d0: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
28e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f0: 20 20 20 20 2f 2a 20 73 65 74 4f 70 74 69 6f 6e      /* setOption
2900: 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20  Proc            
2910: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2920: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
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 67 65 74 4f 70 74 69 6f 6e      /* getOption
2950: 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20  Proc            
2960: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2970: 20 69 6e 63 72 62 6c 6f 62 57 61 74 63 68 2c 20   incrblobWatch, 
2980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2990: 20 20 20 20 2f 2a 20 77 61 74 63 68 50 72 6f 63      /* watchProc
29a0: 20 28 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f   (this is a no-o
29b0: 70 29 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  p)          */. 
29c0: 20 69 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 2c   incrblobHandle,
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 67 65 74 48 61 6e 64 6c 65      /* getHandle
29f0: 50 72 6f 63 20 28 61 6c 77 61 79 73 20 72 65 74  Proc (always ret
2a00: 75 72 6e 73 20 65 72 72 6f 72 29 20 2a 2f 0a 20  urns error) */. 
2a10: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a30: 20 20 20 20 2f 2a 20 63 6c 6f 73 65 32 50 72 6f      /* close2Pro
2a40: 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
2a50: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2a60: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
2a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a80: 20 20 20 20 2f 2a 20 62 6c 6f 63 6b 4d 6f 64 65      /* blockMode
2a90: 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20  Proc            
2aa0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2ab0: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
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 66 6c 75 73 68 50 72 6f 63      /* flushProc
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 68 61 6e 64 6c 65 72 50 72      /* handlerPr
2b30: 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  oc              
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 77 69 64 65 53 65 65 6b 50      /* wideSeekP
2b80: 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20  roc             
2b90: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 7d              */.}
2ba0: 3b 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  ;../*.** Create 
2bb0: 61 20 6e 65 77 20 69 6e 63 72 62 6c 6f 62 20 63  a new incrblob c
2bc0: 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69  hannel..*/.stati
2bd0: 63 20 69 6e 74 20 63 72 65 61 74 65 49 6e 63 72  c int createIncr
2be0: 62 6c 6f 62 43 68 61 6e 6e 65 6c 28 0a 20 20 54  blobChannel(.  T
2bf0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2c00: 70 2c 20 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  p, .  SqliteDb *
2c10: 70 44 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68  pDb, .  const ch
2c20: 61 72 20 2a 7a 44 62 2c 0a 20 20 63 6f 6e 73 74  ar *zDb,.  const
2c30: 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 2c 20 0a   char *zTable, .
2c40: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
2c50: 6f 6c 75 6d 6e 2c 20 0a 20 20 73 71 6c 69 74 65  olumn, .  sqlite
2c60: 5f 69 6e 74 36 34 20 69 52 6f 77 2c 0a 20 20 69  _int64 iRow,.  i
2c70: 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 0a 29 7b  nt isReadonly.){
2c80: 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  .  IncrblobChann
2c90: 65 6c 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33  el *p;.  sqlite3
2ca0: 20 2a 64 62 20 3d 20 70 44 62 2d 3e 64 62 3b 0a   *db = pDb->db;.
2cb0: 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a    sqlite3_blob *
2cc0: 70 42 6c 6f 62 3b 0a 20 20 69 6e 74 20 72 63 3b  pBlob;.  int rc;
2cd0: 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 54  .  int flags = T
2ce0: 43 4c 5f 52 45 41 44 41 42 4c 45 7c 28 69 73 52  CL_READABLE|(isR
2cf0: 65 61 64 6f 6e 6c 79 20 3f 20 30 20 3a 20 54 43  eadonly ? 0 : TC
2d00: 4c 5f 57 52 49 54 41 42 4c 45 29 3b 0a 0a 20 20  L_WRITABLE);..  
2d10: 2f 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65  /* This variable
2d20: 20 69 73 20 75 73 65 64 20 74 6f 20 6e 61 6d 65   is used to name
2d30: 20 74 68 65 20 63 68 61 6e 6e 65 6c 73 3a 20 22   the channels: "
2d40: 69 6e 63 72 62 6c 6f 62 5f 5b 69 6e 63 72 20 63  incrblob_[incr c
2d50: 6f 75 6e 74 5d 22 20 2a 2f 0a 20 20 73 74 61 74  ount]" */.  stat
2d60: 69 63 20 69 6e 74 20 63 6f 75 6e 74 20 3d 20 30  ic int count = 0
2d70: 3b 0a 20 20 63 68 61 72 20 7a 43 68 61 6e 6e 65  ;.  char zChanne
2d80: 6c 5b 36 34 5d 3b 0a 0a 20 20 72 63 20 3d 20 73  l[64];..  rc = s
2d90: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e  qlite3_blob_open
2da0: 28 64 62 2c 20 7a 44 62 2c 20 7a 54 61 62 6c 65  (db, zDb, zTable
2db0: 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 69 52 6f 77 2c  , zColumn, iRow,
2dc0: 20 21 69 73 52 65 61 64 6f 6e 6c 79 2c 20 26 70   !isReadonly, &p
2dd0: 42 6c 6f 62 29 3b 0a 20 20 69 66 28 20 72 63 21  Blob);.  if( rc!
2de0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2df0: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
2e00: 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
2e10: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
2e20: 44 62 2d 3e 64 62 29 2c 20 54 43 4c 5f 56 4f 4c  Db->db), TCL_VOL
2e30: 41 54 49 4c 45 29 3b 0a 20 20 20 20 72 65 74 75  ATILE);.    retu
2e40: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2e50: 7d 0a 0a 20 20 70 20 3d 20 28 49 6e 63 72 62 6c  }..  p = (Incrbl
2e60: 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 54 63 6c 5f  obChannel *)Tcl_
2e70: 41 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 49 6e 63  Alloc(sizeof(Inc
2e80: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 29 29 3b 0a  rblobChannel));.
2e90: 20 20 70 2d 3e 69 53 65 65 6b 20 3d 20 30 3b 0a    p->iSeek = 0;.
2ea0: 20 20 70 2d 3e 70 42 6c 6f 62 20 3d 20 70 42 6c    p->pBlob = pBl
2eb0: 6f 62 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73  ob;..  sqlite3_s
2ec0: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
2ed0: 43 68 61 6e 6e 65 6c 29 2c 20 7a 43 68 61 6e 6e  Channel), zChann
2ee0: 65 6c 2c 20 22 69 6e 63 72 62 6c 6f 62 5f 25 64  el, "incrblob_%d
2ef0: 22 2c 20 2b 2b 63 6f 75 6e 74 29 3b 0a 20 20 70  ", ++count);.  p
2f00: 2d 3e 63 68 61 6e 6e 65 6c 20 3d 20 54 63 6c 5f  ->channel = Tcl_
2f10: 43 72 65 61 74 65 43 68 61 6e 6e 65 6c 28 26 49  CreateChannel(&I
2f20: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 54 79  ncrblobChannelTy
2f30: 70 65 2c 20 7a 43 68 61 6e 6e 65 6c 2c 20 70 2c  pe, zChannel, p,
2f40: 20 66 6c 61 67 73 29 3b 0a 20 20 54 63 6c 5f 52   flags);.  Tcl_R
2f50: 65 67 69 73 74 65 72 43 68 61 6e 6e 65 6c 28 69  egisterChannel(i
2f60: 6e 74 65 72 70 2c 20 70 2d 3e 63 68 61 6e 6e 65  nterp, p->channe
2f70: 6c 29 3b 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74  l);..  /* Link t
2f80: 68 65 20 6e 65 77 20 63 68 61 6e 6e 65 6c 20 69  he new channel i
2f90: 6e 74 6f 20 74 68 65 20 53 71 6c 69 74 65 44 62  nto the SqliteDb
2fa0: 2e 70 49 6e 63 72 62 6c 6f 62 20 6c 69 73 74 2e  .pIncrblob list.
2fb0: 20 2a 2f 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d   */.  p->pNext =
2fc0: 20 70 44 62 2d 3e 70 49 6e 63 72 62 6c 6f 62 3b   pDb->pIncrblob;
2fd0: 0a 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b  .  p->pPrev = 0;
2fe0: 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20  .  if( p->pNext 
2ff0: 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d  ){.    p->pNext-
3000: 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 7d 0a  >pPrev = p;.  }.
3010: 20 20 70 44 62 2d 3e 70 49 6e 63 72 62 6c 6f 62    pDb->pIncrblob
3020: 20 3d 20 70 3b 0a 20 20 70 2d 3e 70 44 62 20 3d   = p;.  p->pDb =
3030: 20 70 44 62 3b 0a 0a 20 20 54 63 6c 5f 53 65 74   pDb;..  Tcl_Set
3040: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
3050: 63 68 61 72 20 2a 29 54 63 6c 5f 47 65 74 43 68  char *)Tcl_GetCh
3060: 61 6e 6e 65 6c 4e 61 6d 65 28 70 2d 3e 63 68 61  annelName(p->cha
3070: 6e 6e 65 6c 29 2c 20 54 43 4c 5f 56 4f 4c 41 54  nnel), TCL_VOLAT
3080: 49 4c 45 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  ILE);.  return T
3090: 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6c 73 65 20 20  CL_OK;.}.#else  
30a0: 2f 2a 20 65 6c 73 65 20 63 6c 61 75 73 65 20 66  /* else clause f
30b0: 6f 72 20 22 23 69 66 6e 64 65 66 20 53 51 4c 49  or "#ifndef SQLI
30c0: 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
30d0: 22 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 63  " */.  #define c
30e0: 6c 6f 73 65 49 6e 63 72 62 6c 6f 62 43 68 61 6e  loseIncrblobChan
30f0: 6e 65 6c 73 28 70 44 62 29 0a 23 65 6e 64 69 66  nels(pDb).#endif
3100: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 61 74 20  ../*.** Look at 
3110: 74 68 65 20 73 63 72 69 70 74 20 70 72 65 66 69  the script prefi
3120: 78 20 69 6e 20 70 43 6d 64 2e 20 20 57 65 20 77  x in pCmd.  We w
3130: 69 6c 6c 20 62 65 20 65 78 65 63 75 74 69 6e 67  ill be executing
3140: 20 74 68 69 73 20 73 63 72 69 70 74 0a 2a 2a 20   this script.** 
3150: 61 66 74 65 72 20 66 69 72 73 74 20 61 70 70 65  after first appe
3160: 6e 64 69 6e 67 20 6f 6e 65 20 6f 72 20 6d 6f 72  nding one or mor
3170: 65 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 54 68  e arguments.  Th
3180: 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c 79  is routine analy
3190: 7a 65 73 0a 2a 2a 20 74 68 65 20 73 63 72 69 70  zes.** the scrip
31a0: 74 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 69  t to see if it i
31b0: 73 20 73 61 66 65 20 74 6f 20 75 73 65 20 54 63  s safe to use Tc
31c0: 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20 6f 6e 20  l_EvalObjv() on 
31d0: 74 68 65 20 73 63 72 69 70 74 0a 2a 2a 20 72 61  the script.** ra
31e0: 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6d 6f  ther than the mo
31f0: 72 65 20 67 65 6e 65 72 61 6c 20 54 63 6c 5f 45  re general Tcl_E
3200: 76 61 6c 45 78 28 29 2e 20 20 54 63 6c 5f 45 76  valEx().  Tcl_Ev
3210: 61 6c 4f 62 6a 76 28 29 20 69 73 20 6d 75 63 68  alObjv() is much
3220: 0a 2a 2a 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a  .** faster..**.*
3230: 2a 20 53 63 72 69 70 74 73 20 74 68 61 74 20 61  * Scripts that a
3240: 72 65 20 73 61 66 65 20 74 6f 20 75 73 65 20 77  re safe to use w
3250: 69 74 68 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76  ith Tcl_EvalObjv
3260: 28 29 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  () consists of a
3270: 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65  .** command name
3280: 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 7a 65 72   followed by zer
3290: 6f 20 6f 72 20 6d 6f 72 65 20 61 72 67 75 6d 65  o or more argume
32a0: 6e 74 73 20 77 69 74 68 20 6e 6f 20 5b 2e 2e 2e  nts with no [...
32b0: 5d 20 6f 72 20 24 0a 2a 2a 20 6f 72 20 7b 2e 2e  ] or $.** or {..
32c0: 2e 7d 20 6f 72 20 3b 20 74 6f 20 62 65 20 73 65  .} or ; to be se
32d0: 65 6e 20 61 6e 79 77 68 65 72 65 2e 20 20 4d 6f  en anywhere.  Mo
32e0: 73 74 20 63 61 6c 6c 62 61 63 6b 20 73 63 72 69  st callback scri
32f0: 70 74 73 20 63 6f 6e 73 69 73 74 0a 2a 2a 20 6f  pts consist.** o
3300: 66 20 6a 75 73 74 20 61 20 73 69 6e 67 6c 65 20  f just a single 
3310: 70 72 6f 63 65 64 75 72 65 20 6e 61 6d 65 20 61  procedure name a
3320: 6e 64 20 74 68 65 79 20 6d 65 65 74 20 74 68 69  nd they meet thi
3330: 73 20 72 65 71 75 69 72 65 6d 65 6e 74 2e 0a 2a  s requirement..*
3340: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 66  /.static int saf
3350: 65 54 6f 55 73 65 45 76 61 6c 4f 62 6a 76 28 54  eToUseEvalObjv(T
3360: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
3370: 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64  p, Tcl_Obj *pCmd
3380: 29 7b 0a 20 20 2f 2a 20 57 65 20 63 6f 75 6c 64  ){.  /* We could
3390: 20 74 72 79 20 74 6f 20 64 6f 20 73 6f 6d 65 74   try to do somet
33a0: 68 69 6e 67 20 77 69 74 68 20 54 63 6c 5f 50 61  hing with Tcl_Pa
33b0: 72 73 65 28 29 2e 20 20 42 75 74 20 77 65 20 77  rse().  But we w
33c0: 69 6c 6c 20 69 6e 73 74 65 61 64 0a 20 20 2a 2a  ill instead.  **
33d0: 20 6a 75 73 74 20 64 6f 20 61 20 73 65 61 72 63   just do a searc
33e0: 68 20 66 6f 72 20 66 6f 72 62 69 64 64 65 6e 20  h for forbidden 
33f0: 63 68 61 72 61 63 74 65 72 73 2e 20 20 49 66 20  characters.  If 
3400: 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 72 62 69  any of the forbi
3410: 64 64 65 6e 0a 20 20 2a 2a 20 63 68 61 72 61 63  dden.  ** charac
3420: 74 65 72 73 20 61 70 70 65 61 72 20 69 6e 20 70  ters appear in p
3430: 43 6d 64 2c 20 77 65 20 77 69 6c 6c 20 72 65 70  Cmd, we will rep
3440: 6f 72 74 20 74 68 65 20 73 74 72 69 6e 67 20 61  ort the string a
3450: 73 20 75 6e 73 61 66 65 2e 0a 20 20 2a 2f 0a 20  s unsafe..  */. 
3460: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
3470: 20 20 69 6e 74 20 6e 3b 0a 20 20 7a 20 3d 20 54    int n;.  z = T
3480: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
3490: 4f 62 6a 28 70 43 6d 64 2c 20 26 6e 29 3b 0a 20  Obj(pCmd, &n);. 
34a0: 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20   while( n-- > 0 
34b0: 29 7b 0a 20 20 20 20 69 6e 74 20 63 20 3d 20 2a  ){.    int c = *
34c0: 28 7a 2b 2b 29 3b 0a 20 20 20 20 69 66 28 20 63  (z++);.    if( c
34d0: 3d 3d 27 24 27 20 7c 7c 20 63 3d 3d 27 5b 27 20  =='$' || c=='[' 
34e0: 7c 7c 20 63 3d 3d 27 3b 27 20 29 20 72 65 74 75  || c==';' ) retu
34f0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
3500: 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  rn 1;.}../*.** F
3510: 69 6e 64 20 61 6e 20 53 71 6c 46 75 6e 63 20 73  ind an SqlFunc s
3520: 74 72 75 63 74 75 72 65 20 77 69 74 68 20 74 68  tructure with th
3530: 65 20 67 69 76 65 6e 20 6e 61 6d 65 2e 20 20 4f  e given name.  O
3540: 72 20 63 72 65 61 74 65 20 61 20 6e 65 77 0a 2a  r create a new.*
3550: 2a 20 6f 6e 65 20 69 66 20 61 6e 20 65 78 69 73  * one if an exis
3560: 74 69 6e 67 20 6f 6e 65 20 63 61 6e 6e 6f 74 20  ting one cannot 
3570: 62 65 20 66 6f 75 6e 64 2e 20 20 52 65 74 75 72  be found.  Retur
3580: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
3590: 68 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  he.** structure.
35a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 53 71 6c 46 75  .*/.static SqlFu
35b0: 6e 63 20 2a 66 69 6e 64 53 71 6c 46 75 6e 63 28  nc *findSqlFunc(
35c0: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 2c 20 63  SqliteDb *pDb, c
35d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
35e0: 29 7b 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70 2c  ){.  SqlFunc *p,
35f0: 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 4e   *pNew;.  int nN
3600: 61 6d 65 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a  ame = strlen30(z
3610: 4e 61 6d 65 29 3b 0a 20 20 70 4e 65 77 20 3d 20  Name);.  pNew = 
3620: 28 53 71 6c 46 75 6e 63 2a 29 54 63 6c 5f 41 6c  (SqlFunc*)Tcl_Al
3630: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65  loc( sizeof(*pNe
3640: 77 29 20 2b 20 6e 4e 61 6d 65 20 2b 20 31 20 29  w) + nName + 1 )
3650: 3b 0a 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20  ;.  pNew->zName 
3660: 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31  = (char*)&pNew[1
3670: 5d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65 77  ];.  memcpy(pNew
3680: 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20  ->zName, zName, 
3690: 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 66 6f 72 28  nName+1);.  for(
36a0: 70 3d 70 44 62 2d 3e 70 46 75 6e 63 3b 20 70 3b  p=pDb->pFunc; p;
36b0: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 20 0a 20   p=p->pNext){ . 
36c0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
36d0: 74 72 69 63 6d 70 28 70 2d 3e 7a 4e 61 6d 65 2c  tricmp(p->zName,
36e0: 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 29 3d 3d 30   pNew->zName)==0
36f0: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 46 72   ){.      Tcl_Fr
3700: 65 65 28 28 63 68 61 72 2a 29 70 4e 65 77 29 3b  ee((char*)pNew);
3710: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 3b  .      return p;
3720: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e 65  .    }.  }.  pNe
3730: 77 2d 3e 69 6e 74 65 72 70 20 3d 20 70 44 62 2d  w->interp = pDb-
3740: 3e 69 6e 74 65 72 70 3b 0a 20 20 70 4e 65 77 2d  >interp;.  pNew-
3750: 3e 70 44 62 20 3d 20 70 44 62 3b 0a 20 20 70 4e  >pDb = pDb;.  pN
3760: 65 77 2d 3e 70 53 63 72 69 70 74 20 3d 20 30 3b  ew->pScript = 0;
3770: 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d  .  pNew->pNext =
3780: 20 70 44 62 2d 3e 70 46 75 6e 63 3b 0a 20 20 70   pDb->pFunc;.  p
3790: 44 62 2d 3e 70 46 75 6e 63 20 3d 20 70 4e 65 77  Db->pFunc = pNew
37a0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  ;.  return pNew;
37b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
37c0: 20 73 69 6e 67 6c 65 20 53 71 6c 50 72 65 70 61   single SqlPrepa
37d0: 72 65 64 53 74 6d 74 20 6f 62 6a 65 63 74 2e 0a  redStmt object..
37e0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
37f0: 62 46 72 65 65 53 74 6d 74 28 53 71 6c 50 72 65  bFreeStmt(SqlPre
3800: 70 61 72 65 64 53 74 6d 74 20 2a 70 53 74 6d 74  paredStmt *pStmt
3810: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
3820: 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69  _TEST.  if( sqli
3830: 74 65 33 5f 73 71 6c 28 70 53 74 6d 74 2d 3e 70  te3_sql(pStmt->p
3840: 53 74 6d 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Stmt)==0 ){.    
3850: 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 20 2a  Tcl_Free((char *
3860: 29 70 53 74 6d 74 2d 3e 7a 53 71 6c 29 3b 0a 20  )pStmt->zSql);. 
3870: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
3880: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
3890: 6d 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 54 63  mt->pStmt);.  Tc
38a0: 6c 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 70  l_Free((char *)p
38b0: 53 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Stmt);.}../*.** 
38c0: 46 69 6e 61 6c 69 7a 65 20 61 6e 64 20 66 72 65  Finalize and fre
38d0: 65 20 61 20 6c 69 73 74 20 6f 66 20 70 72 65 70  e a list of prep
38e0: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 0a  ared statements.
38f0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
3900: 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28 53 71  lushStmtCache(Sq
3910: 6c 69 74 65 44 62 20 2a 70 44 62 29 7b 0a 20 20  liteDb *pDb){.  
3920: 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20  SqlPreparedStmt 
3930: 2a 70 50 72 65 53 74 6d 74 3b 0a 20 20 53 71 6c  *pPreStmt;.  Sql
3940: 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70 4e  PreparedStmt *pN
3950: 65 78 74 3b 0a 0a 20 20 66 6f 72 28 70 50 72 65  ext;..  for(pPre
3960: 53 74 6d 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74  Stmt = pDb->stmt
3970: 4c 69 73 74 3b 20 70 50 72 65 53 74 6d 74 3b 20  List; pPreStmt; 
3980: 70 50 72 65 53 74 6d 74 3d 70 4e 65 78 74 29 7b  pPreStmt=pNext){
3990: 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50 72  .    pNext = pPr
39a0: 65 53 74 6d 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  eStmt->pNext;.  
39b0: 20 20 64 62 46 72 65 65 53 74 6d 74 28 70 50 72    dbFreeStmt(pPr
39c0: 65 53 74 6d 74 29 3b 0a 20 20 7d 0a 20 20 70 44  eStmt);.  }.  pD
39d0: 62 2d 3e 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  b->nStmt = 0;.  
39e0: 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20  pDb->stmtLast = 
39f0: 30 3b 0a 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69  0;.  pDb->stmtLi
3a00: 73 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  st = 0;.}../*.**
3a10: 20 54 43 4c 20 63 61 6c 6c 73 20 74 68 69 73 20   TCL calls this 
3a20: 70 72 6f 63 65 64 75 72 65 20 77 68 65 6e 20 61  procedure when a
3a30: 6e 20 73 71 6c 69 74 65 33 20 64 61 74 61 62 61  n sqlite3 databa
3a40: 73 65 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a  se command is.**
3a50: 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61   deleted..*/.sta
3a60: 74 69 63 20 76 6f 69 64 20 44 62 44 65 6c 65 74  tic void DbDelet
3a70: 65 43 6d 64 28 76 6f 69 64 20 2a 64 62 29 7b 0a  eCmd(void *db){.
3a80: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
3a90: 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 64 62 3b  = (SqliteDb*)db;
3aa0: 0a 20 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68  .  flushStmtCach
3ab0: 65 28 70 44 62 29 3b 0a 20 20 63 6c 6f 73 65 49  e(pDb);.  closeI
3ac0: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 73 28  ncrblobChannels(
3ad0: 70 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pDb);.  sqlite3_
3ae0: 63 6c 6f 73 65 28 70 44 62 2d 3e 64 62 29 3b 0a  close(pDb->db);.
3af0: 20 20 77 68 69 6c 65 28 20 70 44 62 2d 3e 70 46    while( pDb->pF
3b00: 75 6e 63 20 29 7b 0a 20 20 20 20 53 71 6c 46 75  unc ){.    SqlFu
3b10: 6e 63 20 2a 70 46 75 6e 63 20 3d 20 70 44 62 2d  nc *pFunc = pDb-
3b20: 3e 70 46 75 6e 63 3b 0a 20 20 20 20 70 44 62 2d  >pFunc;.    pDb-
3b30: 3e 70 46 75 6e 63 20 3d 20 70 46 75 6e 63 2d 3e  >pFunc = pFunc->
3b40: 70 4e 65 78 74 3b 0a 20 20 20 20 61 73 73 65 72  pNext;.    asser
3b50: 74 28 20 70 46 75 6e 63 2d 3e 70 44 62 3d 3d 70  t( pFunc->pDb==p
3b60: 44 62 20 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65  Db );.    Tcl_De
3b70: 63 72 52 65 66 43 6f 75 6e 74 28 70 46 75 6e 63  crRefCount(pFunc
3b80: 2d 3e 70 53 63 72 69 70 74 29 3b 0a 20 20 20 20  ->pScript);.    
3b90: 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29  Tcl_Free((char*)
3ba0: 70 46 75 6e 63 29 3b 0a 20 20 7d 0a 20 20 77 68  pFunc);.  }.  wh
3bb0: 69 6c 65 28 20 70 44 62 2d 3e 70 43 6f 6c 6c 61  ile( pDb->pColla
3bc0: 74 65 20 29 7b 0a 20 20 20 20 53 71 6c 43 6f 6c  te ){.    SqlCol
3bd0: 6c 61 74 65 20 2a 70 43 6f 6c 6c 61 74 65 20 3d  late *pCollate =
3be0: 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 3b 0a   pDb->pCollate;.
3bf0: 20 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74      pDb->pCollat
3c00: 65 20 3d 20 70 43 6f 6c 6c 61 74 65 2d 3e 70 4e  e = pCollate->pN
3c10: 65 78 74 3b 0a 20 20 20 20 54 63 6c 5f 46 72 65  ext;.    Tcl_Fre
3c20: 65 28 28 63 68 61 72 2a 29 70 43 6f 6c 6c 61 74  e((char*)pCollat
3c30: 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44  e);.  }.  if( pD
3c40: 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20 20  b->zBusy ){.    
3c50: 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 42  Tcl_Free(pDb->zB
3c60: 75 73 79 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  usy);.  }.  if( 
3c70: 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20  pDb->zTrace ){. 
3c80: 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d     Tcl_Free(pDb-
3c90: 3e 7a 54 72 61 63 65 29 3b 0a 20 20 7d 0a 20 20  >zTrace);.  }.  
3ca0: 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c  if( pDb->zProfil
3cb0: 65 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65  e ){.    Tcl_Fre
3cc0: 65 28 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 29  e(pDb->zProfile)
3cd0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d  ;.  }.  if( pDb-
3ce0: 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 54 63  >zAuth ){.    Tc
3cf0: 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 41 75 74  l_Free(pDb->zAut
3d00: 68 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44  h);.  }.  if( pD
3d10: 62 2d 3e 7a 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  b->zNull ){.    
3d20: 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 4e  Tcl_Free(pDb->zN
3d30: 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ull);.  }.  if( 
3d40: 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b  pDb->pUpdateHook
3d50: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72   ){.    Tcl_Decr
3d60: 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 55  RefCount(pDb->pU
3d70: 70 64 61 74 65 48 6f 6f 6b 29 3b 0a 20 20 7d 0a  pdateHook);.  }.
3d80: 20 20 69 66 28 20 70 44 62 2d 3e 70 52 6f 6c 6c    if( pDb->pRoll
3d90: 62 61 63 6b 48 6f 6f 6b 20 29 7b 0a 20 20 20 20  backHook ){.    
3da0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
3db0: 28 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48  (pDb->pRollbackH
3dc0: 6f 6f 6b 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ook);.  }.  if( 
3dd0: 70 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 20 29 7b  pDb->pWalHook ){
3de0: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
3df0: 43 6f 75 6e 74 28 70 44 62 2d 3e 70 57 61 6c 48  Count(pDb->pWalH
3e00: 6f 6f 6b 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ook);.  }.  if( 
3e10: 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65  pDb->pCollateNee
3e20: 64 65 64 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44  ded ){.    Tcl_D
3e30: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d  ecrRefCount(pDb-
3e40: 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29  >pCollateNeeded)
3e50: 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 46 72 65 65  ;.  }.  Tcl_Free
3e60: 28 28 63 68 61 72 2a 29 70 44 62 29 3b 0a 7d 0a  ((char*)pDb);.}.
3e70: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
3e80: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
3e90: 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69  en a database fi
3ea0: 6c 65 20 69 73 20 6c 6f 63 6b 65 64 20 77 68 69  le is locked whi
3eb0: 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20  le trying.** to 
3ec0: 65 78 65 63 75 74 65 20 53 51 4c 2e 0a 2a 2f 0a  execute SQL..*/.
3ed0: 73 74 61 74 69 63 20 69 6e 74 20 44 62 42 75 73  static int DbBus
3ee0: 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63  yHandler(void *c
3ef0: 64 2c 20 69 6e 74 20 6e 54 72 69 65 73 29 7b 0a  d, int nTries){.
3f00: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
3f10: 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b  = (SqliteDb*)cd;
3f20: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61  .  int rc;.  cha
3f30: 72 20 7a 56 61 6c 5b 33 30 5d 3b 0a 0a 20 20 73  r zVal[30];..  s
3f40: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
3f50: 73 69 7a 65 6f 66 28 7a 56 61 6c 29 2c 20 7a 56  sizeof(zVal), zV
3f60: 61 6c 2c 20 22 25 64 22 2c 20 6e 54 72 69 65 73  al, "%d", nTries
3f70: 29 3b 0a 20 20 72 63 20 3d 20 54 63 6c 5f 56 61  );.  rc = Tcl_Va
3f80: 72 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72  rEval(pDb->inter
3f90: 70 2c 20 70 44 62 2d 3e 7a 42 75 73 79 2c 20 22  p, pDb->zBusy, "
3fa0: 20 22 2c 20 7a 56 61 6c 2c 20 28 63 68 61 72 2a   ", zVal, (char*
3fb0: 29 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 54  )0);.  if( rc!=T
3fc0: 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28 54 63  CL_OK || atoi(Tc
3fd0: 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
3fe0: 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 29 20  t(pDb->interp)) 
3ff0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
4000: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
4010: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
4020: 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53  TE_OMIT_PROGRESS
4030: 5f 43 41 4c 4c 42 41 43 4b 0a 2f 2a 0a 2a 2a 20  _CALLBACK./*.** 
4040: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
4050: 69 6e 76 6f 6b 65 64 20 61 73 20 74 68 65 20 27  invoked as the '
4060: 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63  progress callbac
4070: 6b 27 20 66 6f 72 20 74 68 65 20 64 61 74 61 62  k' for the datab
4080: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ase..*/.static i
4090: 6e 74 20 44 62 50 72 6f 67 72 65 73 73 48 61 6e  nt DbProgressHan
40a0: 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 29 7b 0a  dler(void *cd){.
40b0: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
40c0: 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b  = (SqliteDb*)cd;
40d0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
40e0: 73 65 72 74 28 20 70 44 62 2d 3e 7a 50 72 6f 67  sert( pDb->zProg
40f0: 72 65 73 73 20 29 3b 0a 20 20 72 63 20 3d 20 54  ress );.  rc = T
4100: 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74  cl_Eval(pDb->int
4110: 65 72 70 2c 20 70 44 62 2d 3e 7a 50 72 6f 67 72  erp, pDb->zProgr
4120: 65 73 73 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ess);.  if( rc!=
4130: 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28 54  TCL_OK || atoi(T
4140: 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
4150: 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 29  lt(pDb->interp))
4160: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
4170: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
4180: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
4190: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
41a0: 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73  TRACE./*.** This
41b0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
41c0: 65 64 20 62 79 20 74 68 65 20 53 51 4c 69 74 65  ed by the SQLite
41d0: 20 74 72 61 63 65 20 68 61 6e 64 6c 65 72 20 77   trace handler w
41e0: 68 65 6e 65 76 65 72 20 61 20 6e 65 77 0a 2a 2a  henever a new.**
41f0: 20 62 6c 6f 63 6b 20 6f 66 20 53 51 4c 20 69 73   block of SQL is
4200: 20 65 78 65 63 75 74 65 64 2e 20 20 54 68 65 20   executed.  The 
4210: 54 43 4c 20 73 63 72 69 70 74 20 69 6e 20 70 44  TCL script in pD
4220: 62 2d 3e 7a 54 72 61 63 65 20 69 73 20 65 78 65  b->zTrace is exe
4230: 63 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  cuted..*/.static
4240: 20 76 6f 69 64 20 44 62 54 72 61 63 65 48 61 6e   void DbTraceHan
4250: 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 2c 20 63  dler(void *cd, c
4260: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 29  onst char *zSql)
4270: 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  {.  SqliteDb *pD
4280: 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63  b = (SqliteDb*)c
4290: 64 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  d;.  Tcl_DString
42a0: 20 73 74 72 3b 0a 0a 20 20 54 63 6c 5f 44 53 74   str;..  Tcl_DSt
42b0: 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a  ringInit(&str);.
42c0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
42d0: 65 6e 64 28 26 73 74 72 2c 20 70 44 62 2d 3e 7a  end(&str, pDb->z
42e0: 54 72 61 63 65 2c 20 2d 31 29 3b 0a 20 20 54 63  Trace, -1);.  Tc
42f0: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45  l_DStringAppendE
4300: 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 53 71  lement(&str, zSq
4310: 6c 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 28 70  l);.  Tcl_Eval(p
4320: 44 62 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f  Db->interp, Tcl_
4330: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74  DStringValue(&st
4340: 72 29 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  r));.  Tcl_DStri
4350: 6e 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20  ngFree(&str);.  
4360: 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28  Tcl_ResetResult(
4370: 70 44 62 2d 3e 69 6e 74 65 72 70 29 3b 0a 7d 0a  pDb->interp);.}.
4380: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
4390: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
43a0: 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E./*.** This rou
43b0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62  tine is called b
43c0: 79 20 74 68 65 20 53 51 4c 69 74 65 20 70 72 6f  y the SQLite pro
43d0: 66 69 6c 65 20 68 61 6e 64 6c 65 72 20 61 66 74  file handler aft
43e0: 65 72 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a  er a statement.*
43f0: 2a 20 53 51 4c 20 68 61 73 20 65 78 65 63 75 74  * SQL has execut
4400: 65 64 2e 20 20 54 68 65 20 54 43 4c 20 73 63 72  ed.  The TCL scr
4410: 69 70 74 20 69 6e 20 70 44 62 2d 3e 7a 50 72 6f  ipt in pDb->zPro
4420: 66 69 6c 65 20 69 73 20 65 76 61 6c 75 61 74 65  file is evaluate
4430: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
4440: 64 20 44 62 50 72 6f 66 69 6c 65 48 61 6e 64 6c  d DbProfileHandl
4450: 65 72 28 76 6f 69 64 20 2a 63 64 2c 20 63 6f 6e  er(void *cd, con
4460: 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 73  st char *zSql, s
4470: 71 6c 69 74 65 5f 75 69 6e 74 36 34 20 74 6d 29  qlite_uint64 tm)
4480: 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  {.  SqliteDb *pD
4490: 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63  b = (SqliteDb*)c
44a0: 64 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  d;.  Tcl_DString
44b0: 20 73 74 72 3b 0a 20 20 63 68 61 72 20 7a 54 6d   str;.  char zTm
44c0: 5b 31 30 30 5d 3b 0a 0a 20 20 73 71 6c 69 74 65  [100];..  sqlite
44d0: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
44e0: 66 28 7a 54 6d 29 2d 31 2c 20 7a 54 6d 2c 20 22  f(zTm)-1, zTm, "
44f0: 25 6c 6c 64 22 2c 20 74 6d 29 3b 0a 20 20 54 63  %lld", tm);.  Tc
4500: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73  l_DStringInit(&s
4510: 74 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  tr);.  Tcl_DStri
4520: 6e 67 41 70 70 65 6e 64 28 26 73 74 72 2c 20 70  ngAppend(&str, p
4530: 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 2c 20 2d 31  Db->zProfile, -1
4540: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
4550: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73  AppendElement(&s
4560: 74 72 2c 20 7a 53 71 6c 29 3b 0a 20 20 54 63 6c  tr, zSql);.  Tcl
4570: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c  _DStringAppendEl
4580: 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 54 6d 29  ement(&str, zTm)
4590: 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 28 70 44 62  ;.  Tcl_Eval(pDb
45a0: 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44 53  ->interp, Tcl_DS
45b0: 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29  tringValue(&str)
45c0: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
45d0: 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20 54 63  Free(&str);.  Tc
45e0: 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 70 44  l_ResetResult(pD
45f0: 62 2d 3e 69 6e 74 65 72 70 29 3b 0a 7d 0a 23 65  b->interp);.}.#e
4600: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
4610: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
4620: 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61  ed when a transa
4630: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74  ction is committ
4640: 65 64 2e 20 20 54 68 65 0a 2a 2a 20 54 43 4c 20  ed.  The.** TCL 
4650: 73 63 72 69 70 74 20 69 6e 20 70 44 62 2d 3e 7a  script in pDb->z
4660: 43 6f 6d 6d 69 74 20 69 73 20 65 78 65 63 75 74  Commit is execut
4670: 65 64 2e 20 20 49 66 20 69 74 20 72 65 74 75 72  ed.  If it retur
4680: 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 0a 2a  ns non-zero or.*
4690: 2a 20 69 66 20 69 74 20 74 68 72 6f 77 73 20 61  * if it throws a
46a0: 6e 20 65 78 63 65 70 74 69 6f 6e 2c 20 74 68 65  n exception, the
46b0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
46c0: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 73 74  rolled back inst
46d0: 65 61 64 0a 2a 2a 20 6f 66 20 62 65 69 6e 67 20  ead.** of being 
46e0: 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2f 0a 73 74  committed..*/.st
46f0: 61 74 69 63 20 69 6e 74 20 44 62 43 6f 6d 6d 69  atic int DbCommi
4700: 74 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63  tHandler(void *c
4710: 64 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  d){.  SqliteDb *
4720: 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a  pDb = (SqliteDb*
4730: 29 63 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  )cd;.  int rc;..
4740: 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 28    rc = Tcl_Eval(
4750: 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62  pDb->interp, pDb
4760: 2d 3e 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66  ->zCommit);.  if
4770: 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20  ( rc!=TCL_OK || 
4780: 61 74 6f 69 28 54 63 6c 5f 47 65 74 53 74 72 69  atoi(Tcl_GetStri
4790: 6e 67 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e  ngResult(pDb->in
47a0: 74 65 72 70 29 29 20 29 7b 0a 20 20 20 20 72 65  terp)) ){.    re
47b0: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
47c0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69  turn 0;.}..stati
47d0: 63 20 76 6f 69 64 20 44 62 52 6f 6c 6c 62 61 63  c void DbRollbac
47e0: 6b 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63  kHandler(void *c
47f0: 6c 69 65 6e 74 44 61 74 61 29 7b 0a 20 20 53 71  lientData){.  Sq
4800: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53  liteDb *pDb = (S
4810: 71 6c 69 74 65 44 62 2a 29 63 6c 69 65 6e 74 44  qliteDb*)clientD
4820: 61 74 61 3b 0a 20 20 61 73 73 65 72 74 28 70 44  ata;.  assert(pD
4830: 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b  b->pRollbackHook
4840: 29 3b 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21  );.  if( TCL_OK!
4850: 3d 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70  =Tcl_EvalObjEx(p
4860: 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d  Db->interp, pDb-
4870: 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 2c 20  >pRollbackHook, 
4880: 30 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 42 61  0) ){.    Tcl_Ba
4890: 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 70 44  ckgroundError(pD
48a0: 62 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a  b->interp);.  }.
48b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 70 72  }../*.** This pr
48c0: 6f 63 65 64 75 72 65 20 68 61 6e 64 6c 65 73 20  ocedure handles 
48d0: 77 61 6c 5f 68 6f 6f 6b 20 63 61 6c 6c 62 61 63  wal_hook callbac
48e0: 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ks..*/.static in
48f0: 74 20 44 62 57 61 6c 48 61 6e 64 6c 65 72 28 0a  t DbWalHandler(.
4900: 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61    void *clientDa
4910: 74 61 2c 20 0a 20 20 73 71 6c 69 74 65 33 20 2a  ta, .  sqlite3 *
4920: 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  db, .  const cha
4930: 72 20 2a 7a 44 62 2c 20 0a 20 20 69 6e 74 20 6e  r *zDb, .  int n
4940: 45 6e 74 72 79 0a 29 7b 0a 20 20 69 6e 74 20 72  Entry.){.  int r
4950: 65 74 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  et = SQLITE_OK;.
4960: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 3b 0a 20 20    Tcl_Obj *p;.  
4970: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20  SqliteDb *pDb = 
4980: 28 53 71 6c 69 74 65 44 62 2a 29 63 6c 69 65 6e  (SqliteDb*)clien
4990: 74 44 61 74 61 3b 0a 20 20 54 63 6c 5f 49 6e 74  tData;.  Tcl_Int
49a0: 65 72 70 20 2a 69 6e 74 65 72 70 20 3d 20 70 44  erp *interp = pD
49b0: 62 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 61 73 73  b->interp;.  ass
49c0: 65 72 74 28 70 44 62 2d 3e 70 57 61 6c 48 6f 6f  ert(pDb->pWalHoo
49d0: 6b 29 3b 0a 0a 20 20 70 20 3d 20 54 63 6c 5f 44  k);..  p = Tcl_D
49e0: 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 44 62 2d  uplicateObj(pDb-
49f0: 3e 70 57 61 6c 48 6f 6f 6b 29 3b 0a 20 20 54 63  >pWalHook);.  Tc
4a00: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
4a10: 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
4a20: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
4a30: 74 65 72 70 2c 20 70 2c 20 54 63 6c 5f 4e 65 77  terp, p, Tcl_New
4a40: 53 74 72 69 6e 67 4f 62 6a 28 7a 44 62 2c 20 2d  StringObj(zDb, -
4a50: 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  1));.  Tcl_ListO
4a60: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
4a70: 69 6e 74 65 72 70 2c 20 70 2c 20 54 63 6c 5f 4e  interp, p, Tcl_N
4a80: 65 77 49 6e 74 4f 62 6a 28 6e 45 6e 74 72 79 29  ewIntObj(nEntry)
4a90: 29 3b 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21  );.  if( TCL_OK!
4aa0: 3d 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69  =Tcl_EvalObjEx(i
4ab0: 6e 74 65 72 70 2c 20 70 2c 20 30 29 20 0a 20 20  nterp, p, 0) .  
4ac0: 20 7c 7c 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f   || TCL_OK!=Tcl_
4ad0: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
4ae0: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 4f 62 6a  terp, Tcl_GetObj
4af0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20  Result(interp), 
4b00: 26 72 65 74 29 0a 20 20 29 7b 0a 20 20 20 20 54  &ret).  ){.    T
4b10: 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72  cl_BackgroundErr
4b20: 6f 72 28 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a  or(interp);.  }.
4b30: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
4b40: 6e 74 28 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e  nt(p);..  return
4b50: 20 72 65 74 3b 0a 7d 0a 0a 23 69 66 20 64 65 66   ret;.}..#if def
4b60: 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
4b70: 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
4b80: 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43  ITE_ENABLE_UNLOC
4b90: 4b 5f 4e 4f 54 49 46 59 29 0a 73 74 61 74 69 63  K_NOTIFY).static
4ba0: 20 76 6f 69 64 20 73 65 74 54 65 73 74 55 6e 6c   void setTestUnl
4bb0: 6f 63 6b 4e 6f 74 69 66 79 56 61 72 73 28 54 63  ockNotifyVars(Tc
4bc0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
4bd0: 2c 20 69 6e 74 20 69 41 72 67 2c 20 69 6e 74 20  , int iArg, int 
4be0: 6e 41 72 67 29 7b 0a 20 20 63 68 61 72 20 7a 42  nArg){.  char zB
4bf0: 75 66 5b 36 34 5d 3b 0a 20 20 73 70 72 69 6e 74  uf[64];.  sprint
4c00: 66 28 7a 42 75 66 2c 20 22 25 64 22 2c 20 69 41  f(zBuf, "%d", iA
4c10: 72 67 29 3b 0a 20 20 54 63 6c 5f 53 65 74 56 61  rg);.  Tcl_SetVa
4c20: 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
4c30: 65 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 5f  e_unlock_notify_
4c40: 61 72 67 22 2c 20 7a 42 75 66 2c 20 54 43 4c 5f  arg", zBuf, TCL_
4c50: 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20  GLOBAL_ONLY);.  
4c60: 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25  sprintf(zBuf, "%
4c70: 64 22 2c 20 6e 41 72 67 29 3b 0a 20 20 54 63 6c  d", nArg);.  Tcl
4c80: 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 20  _SetVar(interp, 
4c90: 22 73 71 6c 69 74 65 5f 75 6e 6c 6f 63 6b 5f 6e  "sqlite_unlock_n
4ca0: 6f 74 69 66 79 5f 61 72 67 63 6f 75 6e 74 22 2c  otify_argcount",
4cb0: 20 7a 42 75 66 2c 20 54 43 4c 5f 47 4c 4f 42 41   zBuf, TCL_GLOBA
4cc0: 4c 5f 4f 4e 4c 59 29 3b 0a 7d 0a 23 65 6c 73 65  L_ONLY);.}.#else
4cd0: 0a 23 20 64 65 66 69 6e 65 20 73 65 74 54 65 73  .# define setTes
4ce0: 74 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 56 61 72  tUnlockNotifyVar
4cf0: 73 28 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a  s(x,y,z).#endif.
4d00: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
4d10: 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54  NABLE_UNLOCK_NOT
4d20: 49 46 59 0a 73 74 61 74 69 63 20 76 6f 69 64 20  IFY.static void 
4d30: 44 62 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 28 76  DbUnlockNotify(v
4d40: 6f 69 64 20 2a 2a 61 70 41 72 67 2c 20 69 6e 74  oid **apArg, int
4d50: 20 6e 41 72 67 29 7b 0a 20 20 69 6e 74 20 69 3b   nArg){.  int i;
4d60: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41  .  for(i=0; i<nA
4d70: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f  rg; i++){.    co
4d80: 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  nst int flags = 
4d90: 28 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c  (TCL_EVAL_GLOBAL
4da0: 7c 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54  |TCL_EVAL_DIRECT
4db0: 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 44 62 20  );.    SqliteDb 
4dc0: 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62  *pDb = (SqliteDb
4dd0: 20 2a 29 61 70 41 72 67 5b 69 5d 3b 0a 20 20 20   *)apArg[i];.   
4de0: 20 73 65 74 54 65 73 74 55 6e 6c 6f 63 6b 4e 6f   setTestUnlockNo
4df0: 74 69 66 79 56 61 72 73 28 70 44 62 2d 3e 69 6e  tifyVars(pDb->in
4e00: 74 65 72 70 2c 20 69 2c 20 6e 41 72 67 29 3b 0a  terp, i, nArg);.
4e10: 20 20 20 20 61 73 73 65 72 74 28 20 70 44 62 2d      assert( pDb-
4e20: 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 29 3b  >pUnlockNotify);
4e30: 0a 20 20 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  .    Tcl_EvalObj
4e40: 45 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20  Ex(pDb->interp, 
4e50: 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69  pDb->pUnlockNoti
4e60: 66 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  fy, flags);.    
4e70: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
4e80: 28 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74  (pDb->pUnlockNot
4e90: 69 66 79 29 3b 0a 20 20 20 20 70 44 62 2d 3e 70  ify);.    pDb->p
4ea0: 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 20 3d 20 30  UnlockNotify = 0
4eb0: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
4ec0: 73 74 61 74 69 63 20 76 6f 69 64 20 44 62 55 70  static void DbUp
4ed0: 64 61 74 65 48 61 6e 64 6c 65 72 28 0a 20 20 76  dateHandler(.  v
4ee0: 6f 69 64 20 2a 70 2c 20 0a 20 20 69 6e 74 20 6f  oid *p, .  int o
4ef0: 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  p,.  const char 
4f00: 2a 7a 44 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63  *zDb, .  const c
4f10: 68 61 72 20 2a 7a 54 62 6c 2c 20 0a 20 20 73 71  har *zTbl, .  sq
4f20: 6c 69 74 65 5f 69 6e 74 36 34 20 72 6f 77 69 64  lite_int64 rowid
4f30: 0a 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  .){.  SqliteDb *
4f40: 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 20  pDb = (SqliteDb 
4f50: 2a 29 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  *)p;.  Tcl_Obj *
4f60: 70 43 6d 64 3b 0a 0a 20 20 61 73 73 65 72 74 28  pCmd;..  assert(
4f70: 20 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f   pDb->pUpdateHoo
4f80: 6b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  k );.  assert( o
4f90: 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  p==SQLITE_INSERT
4fa0: 20 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 55   || op==SQLITE_U
4fb0: 50 44 41 54 45 20 7c 7c 20 6f 70 3d 3d 53 51 4c  PDATE || op==SQL
4fc0: 49 54 45 5f 44 45 4c 45 54 45 20 29 3b 0a 0a 20  ITE_DELETE );.. 
4fd0: 20 70 43 6d 64 20 3d 20 54 63 6c 5f 44 75 70 6c   pCmd = Tcl_Dupl
4fe0: 69 63 61 74 65 4f 62 6a 28 70 44 62 2d 3e 70 55  icateObj(pDb->pU
4ff0: 70 64 61 74 65 48 6f 6f 6b 29 3b 0a 20 20 54 63  pdateHook);.  Tc
5000: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
5010: 43 6d 64 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  Cmd);.  Tcl_List
5020: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
5030: 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65  (0, pCmd, Tcl_Ne
5040: 77 53 74 72 69 6e 67 4f 62 6a 28 0a 20 20 20 20  wStringObj(.    
5050: 28 20 28 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e  ( (op==SQLITE_IN
5060: 53 45 52 54 29 3f 22 49 4e 53 45 52 54 22 3a 28  SERT)?"INSERT":(
5070: 6f 70 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41 54  op==SQLITE_UPDAT
5080: 45 29 3f 22 55 50 44 41 54 45 22 3a 22 44 45 4c  E)?"UPDATE":"DEL
5090: 45 54 45 22 29 2c 20 2d 31 29 29 3b 0a 20 20 54  ETE"), -1));.  T
50a0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
50b0: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c  Element(0, pCmd,
50c0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
50d0: 6a 28 7a 44 62 2c 20 2d 31 29 29 3b 0a 20 20 54  j(zDb, -1));.  T
50e0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
50f0: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c  Element(0, pCmd,
5100: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
5110: 6a 28 7a 54 62 6c 2c 20 2d 31 29 29 3b 0a 20 20  j(zTbl, -1));.  
5120: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
5130: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64  dElement(0, pCmd
5140: 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74  , Tcl_NewWideInt
5150: 4f 62 6a 28 72 6f 77 69 64 29 29 3b 0a 20 20 54  Obj(rowid));.  T
5160: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62  cl_EvalObjEx(pDb
5170: 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20  ->interp, pCmd, 
5180: 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29  TCL_EVAL_DIRECT)
5190: 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43  ;.  Tcl_DecrRefC
51a0: 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 7d 0a 0a 73  ount(pCmd);.}..s
51b0: 74 61 74 69 63 20 76 6f 69 64 20 74 63 6c 43 6f  tatic void tclCo
51c0: 6c 6c 61 74 65 4e 65 65 64 65 64 28 0a 20 20 76  llateNeeded(.  v
51d0: 6f 69 64 20 2a 70 43 74 78 2c 0a 20 20 73 71 6c  oid *pCtx,.  sql
51e0: 69 74 65 33 20 2a 64 62 2c 0a 20 20 69 6e 74 20  ite3 *db,.  int 
51f0: 65 6e 63 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  enc,.  const cha
5200: 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 53 71  r *zName.){.  Sq
5210: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53  liteDb *pDb = (S
5220: 71 6c 69 74 65 44 62 20 2a 29 70 43 74 78 3b 0a  qliteDb *)pCtx;.
5230: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69    Tcl_Obj *pScri
5240: 70 74 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  pt = Tcl_Duplica
5250: 74 65 4f 62 6a 28 70 44 62 2d 3e 70 43 6f 6c 6c  teObj(pDb->pColl
5260: 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 54 63  ateNeeded);.  Tc
5270: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
5280: 53 63 72 69 70 74 29 3b 0a 20 20 54 63 6c 5f 4c  Script);.  Tcl_L
5290: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
52a0: 65 6e 74 28 30 2c 20 70 53 63 72 69 70 74 2c 20  ent(0, pScript, 
52b0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
52c0: 28 7a 4e 61 6d 65 2c 20 2d 31 29 29 3b 0a 20 20  (zName, -1));.  
52d0: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44  Tcl_EvalObjEx(pD
52e0: 62 2d 3e 69 6e 74 65 72 70 2c 20 70 53 63 72 69  b->interp, pScri
52f0: 70 74 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65  pt, 0);.  Tcl_De
5300: 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69  crRefCount(pScri
5310: 70 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  pt);.}../*.** Th
5320: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
5330: 6c 6c 65 64 20 74 6f 20 65 76 61 6c 75 61 74 65  lled to evaluate
5340: 20 61 6e 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f   an SQL collatio
5350: 6e 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65  n function imple
5360: 6d 65 6e 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20  mented.** using 
5370: 54 43 4c 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 73  TCL script..*/.s
5380: 74 61 74 69 63 20 69 6e 74 20 74 63 6c 53 71 6c  tatic int tclSql
5390: 43 6f 6c 6c 61 74 65 28 0a 20 20 76 6f 69 64 20  Collate(.  void 
53a0: 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e 41 2c  *pCtx,.  int nA,
53b0: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
53c0: 41 2c 0a 20 20 69 6e 74 20 6e 42 2c 0a 20 20 63  A,.  int nB,.  c
53d0: 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 0a 29 7b  onst void *zB.){
53e0: 0a 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70  .  SqlCollate *p
53f0: 20 3d 20 28 53 71 6c 43 6f 6c 6c 61 74 65 20 2a   = (SqlCollate *
5400: 29 70 43 74 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a  )pCtx;.  Tcl_Obj
5410: 20 2a 70 43 6d 64 3b 0a 0a 20 20 70 43 6d 64 20   *pCmd;..  pCmd 
5420: 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  = Tcl_NewStringO
5430: 62 6a 28 70 2d 3e 7a 53 63 72 69 70 74 2c 20 2d  bj(p->zScript, -
5440: 31 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65  1);.  Tcl_IncrRe
5450: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20  fCount(pCmd);.  
5460: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
5470: 64 45 6c 65 6d 65 6e 74 28 70 2d 3e 69 6e 74 65  dElement(p->inte
5480: 72 70 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65  rp, pCmd, Tcl_Ne
5490: 77 53 74 72 69 6e 67 4f 62 6a 28 7a 41 2c 20 6e  wStringObj(zA, n
54a0: 41 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  A));.  Tcl_ListO
54b0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
54c0: 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c  p->interp, pCmd,
54d0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
54e0: 6a 28 7a 42 2c 20 6e 42 29 29 3b 0a 20 20 54 63  j(zB, nB));.  Tc
54f0: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69  l_EvalObjEx(p->i
5500: 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 43 4c  nterp, pCmd, TCL
5510: 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20  _EVAL_DIRECT);. 
5520: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
5530: 74 28 70 43 6d 64 29 3b 0a 20 20 72 65 74 75 72  t(pCmd);.  retur
5540: 6e 20 28 61 74 6f 69 28 54 63 6c 5f 47 65 74 53  n (atoi(Tcl_GetS
5550: 74 72 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69  tringResult(p->i
5560: 6e 74 65 72 70 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a  nterp)));.}../*.
5570: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
5580: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 65 76 61  is called to eva
5590: 6c 75 61 74 65 20 61 6e 20 53 51 4c 20 66 75 6e  luate an SQL fun
55a0: 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 65  ction implemente
55b0: 64 0a 2a 2a 20 75 73 69 6e 67 20 54 43 4c 20 73  d.** using TCL s
55c0: 63 72 69 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  cript..*/.static
55d0: 20 76 6f 69 64 20 74 63 6c 53 71 6c 46 75 6e 63   void tclSqlFunc
55e0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
55f0: 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61   *context, int a
5600: 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  rgc, sqlite3_val
5610: 75 65 2a 2a 61 72 67 76 29 7b 0a 20 20 53 71 6c  ue**argv){.  Sql
5620: 46 75 6e 63 20 2a 70 20 3d 20 73 71 6c 69 74 65  Func *p = sqlite
5630: 33 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74  3_user_data(cont
5640: 65 78 74 29 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  ext);.  Tcl_Obj 
5650: 2a 70 43 6d 64 3b 0a 20 20 69 6e 74 20 69 3b 0a  *pCmd;.  int i;.
5660: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
5670: 20 61 72 67 63 3d 3d 30 20 29 7b 0a 20 20 20 20   argc==0 ){.    
5680: 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
5690: 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  no arguments to 
56a0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 2c 20 63 61  the function, ca
56b0: 6c 6c 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78  ll Tcl_EvalObjEx
56c0: 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 73   on the.    ** s
56d0: 63 72 69 70 74 20 6f 62 6a 65 63 74 20 64 69 72  cript object dir
56e0: 65 63 74 6c 79 2e 20 20 54 68 69 73 20 61 6c 6c  ectly.  This all
56f0: 6f 77 73 20 74 68 65 20 54 43 4c 20 63 6f 6d 70  ows the TCL comp
5700: 69 6c 65 72 20 74 6f 20 67 65 6e 65 72 61 74 65  iler to generate
5710: 0a 20 20 20 20 2a 2a 20 62 79 74 65 63 6f 64 65  .    ** bytecode
5720: 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 61 6e 64   for the command
5730: 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 69 6e   on the first in
5740: 76 6f 63 61 74 69 6f 6e 20 61 6e 64 20 74 68 75  vocation and thu
5750: 73 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75  s make.    ** su
5760: 62 73 65 71 75 65 6e 74 20 69 6e 76 6f 63 61 74  bsequent invocat
5770: 69 6f 6e 73 20 6d 75 63 68 20 66 61 73 74 65 72  ions much faster
5780: 2e 20 2a 2f 0a 20 20 20 20 70 43 6d 64 20 3d 20  . */.    pCmd = 
5790: 70 2d 3e 70 53 63 72 69 70 74 3b 0a 20 20 20 20  p->pScript;.    
57a0: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
57b0: 28 70 43 6d 64 29 3b 0a 20 20 20 20 72 63 20 3d  (pCmd);.    rc =
57c0: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70   Tcl_EvalObjEx(p
57d0: 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20  ->interp, pCmd, 
57e0: 30 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72  0);.    Tcl_Decr
57f0: 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a  RefCount(pCmd);.
5800: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
5810: 49 66 20 74 68 65 72 65 20 61 72 65 20 61 72 67  If there are arg
5820: 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 66 75  uments to the fu
5830: 6e 63 74 69 6f 6e 2c 20 6d 61 6b 65 20 61 20 73  nction, make a s
5840: 68 61 6c 6c 6f 77 20 63 6f 70 79 20 6f 66 20 74  hallow copy of t
5850: 68 65 0a 20 20 20 20 2a 2a 20 73 63 72 69 70 74  he.    ** script
5860: 20 6f 62 6a 65 63 74 2c 20 6c 61 70 70 65 6e 64   object, lappend
5870: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 2c 20   the arguments, 
5880: 74 68 65 6e 20 65 76 61 6c 75 61 74 65 20 74 68  then evaluate th
5890: 65 20 63 6f 70 79 2e 0a 20 20 20 20 2a 2a 0a 20  e copy..    **. 
58a0: 20 20 20 2a 2a 20 42 79 20 22 73 68 61 6c 6c 6f     ** By "shallo
58b0: 77 22 20 63 6f 70 79 2c 20 77 65 20 6d 65 61 6e  w" copy, we mean
58c0: 20 61 20 6f 6e 6c 79 20 74 68 65 20 6f 75 74 65   a only the oute
58d0: 72 20 6c 69 73 74 20 54 63 6c 5f 4f 62 6a 20 69  r list Tcl_Obj i
58e0: 73 20 64 75 70 6c 69 63 61 74 65 64 2e 0a 20 20  s duplicated..  
58f0: 20 20 2a 2a 20 54 68 65 20 6e 65 77 20 54 63 6c    ** The new Tcl
5900: 5f 4f 62 6a 20 63 6f 6e 74 61 69 6e 73 20 70 6f  _Obj contains po
5910: 69 6e 74 65 72 73 20 74 6f 20 74 68 65 20 6f 72  inters to the or
5920: 69 67 69 6e 61 6c 20 6c 69 73 74 20 65 6c 65 6d  iginal list elem
5930: 65 6e 74 73 2e 20 0a 20 20 20 20 2a 2a 20 54 68  ents. .    ** Th
5940: 61 74 20 77 61 79 2c 20 77 68 65 6e 20 54 63 6c  at way, when Tcl
5950: 5f 45 76 61 6c 4f 62 6a 76 28 29 20 69 73 20 72  _EvalObjv() is r
5960: 75 6e 20 61 6e 64 20 73 68 69 6d 6d 65 72 73 20  un and shimmers 
5970: 74 68 65 20 66 69 72 73 74 20 65 6c 65 6d 65 6e  the first elemen
5980: 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  t.    ** of the 
5990: 6c 69 73 74 20 74 6f 20 74 63 6c 43 6d 64 4e 61  list to tclCmdNa
59a0: 6d 65 54 79 70 65 2c 20 74 68 61 74 20 61 6c 74  meType, that alt
59b0: 65 72 6e 61 74 65 20 72 65 70 72 65 73 65 6e 74  ernate represent
59c0: 61 74 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a  ation will.    *
59d0: 2a 20 62 65 20 70 72 65 73 65 72 76 65 64 20 61  * be preserved a
59e0: 6e 64 20 72 65 75 73 65 64 20 6f 6e 20 74 68 65  nd reused on the
59f0: 20 6e 65 78 74 20 69 6e 76 6f 63 61 74 69 6f 6e   next invocation
5a00: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c  ..    */.    Tcl
5a10: 5f 4f 62 6a 20 2a 2a 61 41 72 67 3b 0a 20 20 20  _Obj **aArg;.   
5a20: 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69   int nArg;.    i
5a30: 66 28 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65  f( Tcl_ListObjGe
5a40: 74 45 6c 65 6d 65 6e 74 73 28 70 2d 3e 69 6e 74  tElements(p->int
5a50: 65 72 70 2c 20 70 2d 3e 70 53 63 72 69 70 74 2c  erp, p->pScript,
5a60: 20 26 6e 41 72 67 2c 20 26 61 41 72 67 29 20 29   &nArg, &aArg) )
5a70: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
5a80: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e  result_error(con
5a90: 74 65 78 74 2c 20 54 63 6c 5f 47 65 74 53 74 72  text, Tcl_GetStr
5aa0: 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74  ingResult(p->int
5ab0: 65 72 70 29 2c 20 2d 31 29 3b 20 0a 20 20 20 20  erp), -1); .    
5ac0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 20    return;.    } 
5ad0: 20 20 20 20 0a 20 20 20 20 70 43 6d 64 20 3d 20      .    pCmd = 
5ae0: 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 6e  Tcl_NewListObj(n
5af0: 41 72 67 2c 20 61 41 72 67 29 3b 0a 20 20 20 20  Arg, aArg);.    
5b00: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
5b10: 28 70 43 6d 64 29 3b 0a 20 20 20 20 66 6f 72 28  (pCmd);.    for(
5b20: 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b  i=0; i<argc; i++
5b30: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
5b40: 5f 76 61 6c 75 65 20 2a 70 49 6e 20 3d 20 61 72  _value *pIn = ar
5b50: 67 76 5b 69 5d 3b 0a 20 20 20 20 20 20 54 63 6c  gv[i];.      Tcl
5b60: 5f 4f 62 6a 20 2a 70 56 61 6c 3b 0a 20 20 20 20  _Obj *pVal;.    
5b70: 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f          .      /
5b80: 2a 20 53 65 74 20 70 56 61 6c 20 74 6f 20 63 6f  * Set pVal to co
5b90: 6e 74 61 69 6e 20 74 68 65 20 69 27 74 68 20 63  ntain the i'th c
5ba0: 6f 6c 75 6d 6e 20 6f 66 20 74 68 69 73 20 72 6f  olumn of this ro
5bb0: 77 2e 20 2a 2f 0a 20 20 20 20 20 20 73 77 69 74  w. */.      swit
5bc0: 63 68 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ch( sqlite3_valu
5bd0: 65 5f 74 79 70 65 28 70 49 6e 29 20 29 7b 0a 20  e_type(pIn) ){. 
5be0: 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
5bf0: 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20  TE_BLOB: {.     
5c00: 20 20 20 20 20 69 6e 74 20 62 79 74 65 73 20 3d       int bytes =
5c10: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
5c20: 79 74 65 73 28 70 49 6e 29 3b 0a 20 20 20 20 20  ytes(pIn);.     
5c30: 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f       pVal = Tcl_
5c40: 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28  NewByteArrayObj(
5c50: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
5c60: 6f 62 28 70 49 6e 29 2c 20 62 79 74 65 73 29 3b  ob(pIn), bytes);
5c70: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
5c80: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5c90: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
5ca0: 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20  INTEGER: {.     
5cb0: 20 20 20 20 20 73 71 6c 69 74 65 5f 69 6e 74 36       sqlite_int6
5cc0: 34 20 76 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  4 v = sqlite3_va
5cd0: 6c 75 65 5f 69 6e 74 36 34 28 70 49 6e 29 3b 0a  lue_int64(pIn);.
5ce0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 76 3e            if( v>
5cf0: 3d 2d 32 31 34 37 34 38 33 36 34 37 20 26 26 20  =-2147483647 && 
5d00: 76 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29 7b  v<=2147483647 ){
5d10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 56 61  .            pVa
5d20: 6c 20 3d 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  l = Tcl_NewIntOb
5d30: 6a 28 28 69 6e 74 29 76 29 3b 0a 20 20 20 20 20  j((int)v);.     
5d40: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
5d50: 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54          pVal = T
5d60: 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a  cl_NewWideIntObj
5d70: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  (v);.          }
5d80: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
5d90: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5da0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
5db0: 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 20  FLOAT: {.       
5dc0: 20 20 20 64 6f 75 62 6c 65 20 72 20 3d 20 73 71     double r = sq
5dd0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62  lite3_value_doub
5de0: 6c 65 28 70 49 6e 29 3b 0a 20 20 20 20 20 20 20  le(pIn);.       
5df0: 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65     pVal = Tcl_Ne
5e00: 77 44 6f 75 62 6c 65 4f 62 6a 28 72 29 3b 0a 20  wDoubleObj(r);. 
5e10: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
5e20: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5e30: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55    case SQLITE_NU
5e40: 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  LL: {.          
5e50: 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 53 74  pVal = Tcl_NewSt
5e60: 72 69 6e 67 4f 62 6a 28 70 2d 3e 70 44 62 2d 3e  ringObj(p->pDb->
5e70: 7a 4e 75 6c 6c 2c 20 2d 31 29 3b 0a 20 20 20 20  zNull, -1);.    
5e80: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5e90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 64       }.        d
5ea0: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
5eb0: 20 20 20 20 69 6e 74 20 62 79 74 65 73 20 3d 20      int bytes = 
5ec0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
5ed0: 74 65 73 28 70 49 6e 29 3b 0a 20 20 20 20 20 20  tes(pIn);.      
5ee0: 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e      pVal = Tcl_N
5ef0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61  ewStringObj((cha
5f00: 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  r *)sqlite3_valu
5f10: 65 5f 74 65 78 74 28 70 49 6e 29 2c 20 62 79 74  e_text(pIn), byt
5f20: 65 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  es);.          b
5f30: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
5f40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
5f50: 20 3d 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70   = Tcl_ListObjAp
5f60: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70 2d 3e 69  pendElement(p->i
5f70: 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 70 56 61  nterp, pCmd, pVa
5f80: 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  l);.      if( rc
5f90: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
5fa0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d  DecrRefCount(pCm
5fb0: 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  d);.        sqli
5fc0: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
5fd0: 28 63 6f 6e 74 65 78 74 2c 20 54 63 6c 5f 47 65  (context, Tcl_Ge
5fe0: 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 2d  tStringResult(p-
5ff0: 3e 69 6e 74 65 72 70 29 2c 20 2d 31 29 3b 20 0a  >interp), -1); .
6000: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
6010: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
6020: 20 20 69 66 28 20 21 70 2d 3e 75 73 65 45 76 61    if( !p->useEva
6030: 6c 4f 62 6a 76 20 29 7b 0a 20 20 20 20 20 20 2f  lObjv ){.      /
6040: 2a 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28  * Tcl_EvalObjEx(
6050: 29 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63  ) will automatic
6060: 61 6c 6c 79 20 63 61 6c 6c 20 54 63 6c 5f 45 76  ally call Tcl_Ev
6070: 61 6c 4f 62 6a 76 28 29 20 69 66 20 70 43 6d 64  alObjv() if pCmd
6080: 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61 20 6c  .      ** is a l
6090: 69 73 74 20 77 69 74 68 6f 75 74 20 61 20 73 74  ist without a st
60a0: 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74  ring representat
60b0: 69 6f 6e 2e 20 20 54 6f 20 70 72 65 76 65 6e 74  ion.  To prevent
60c0: 20 74 68 69 73 20 66 72 6f 6d 0a 20 20 20 20 20   this from.     
60d0: 20 2a 2a 20 68 61 70 70 65 6e 69 6e 67 2c 20 6d   ** happening, m
60e0: 61 6b 65 20 73 75 72 65 20 70 43 6d 64 20 68 61  ake sure pCmd ha
60f0: 73 20 61 20 76 61 6c 69 64 20 73 74 72 69 6e 67  s a valid string
6100: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
6110: 2a 2f 0a 20 20 20 20 20 20 54 63 6c 5f 47 65 74  */.      Tcl_Get
6120: 53 74 72 69 6e 67 28 70 43 6d 64 29 3b 0a 20 20  String(pCmd);.  
6130: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 54 63 6c    }.    rc = Tcl
6140: 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e  _EvalObjEx(p->in
6150: 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 43 4c 5f  terp, pCmd, TCL_
6160: 45 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20  EVAL_DIRECT);.  
6170: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
6180: 6e 74 28 70 43 6d 64 29 3b 0a 20 20 7d 0a 0a 20  nt(pCmd);.  }.. 
6190: 20 69 66 28 20 72 63 20 26 26 20 72 63 21 3d 54   if( rc && rc!=T
61a0: 43 4c 5f 52 45 54 55 52 4e 20 29 7b 0a 20 20 20  CL_RETURN ){.   
61b0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
61c0: 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 54  error(context, T
61d0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
61e0: 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c 20 2d  lt(p->interp), -
61f0: 31 29 3b 20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  1); .  }else{.  
6200: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 72 20    Tcl_Obj *pVar 
6210: 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75  = Tcl_GetObjResu
6220: 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 3b 0a 20  lt(p->interp);. 
6230: 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 75 38     int n;.    u8
6240: 20 2a 64 61 74 61 3b 0a 20 20 20 20 63 6f 6e 73   *data;.    cons
6250: 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20  t char *zType = 
6260: 28 70 56 61 72 2d 3e 74 79 70 65 50 74 72 20 3f  (pVar->typePtr ?
6270: 20 70 56 61 72 2d 3e 74 79 70 65 50 74 72 2d 3e   pVar->typePtr->
6280: 6e 61 6d 65 20 3a 20 22 22 29 3b 0a 20 20 20 20  name : "");.    
6290: 63 68 61 72 20 63 20 3d 20 7a 54 79 70 65 5b 30  char c = zType[0
62a0: 5d 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 62  ];.    if( c=='b
62b0: 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70  ' && strcmp(zTyp
62c0: 65 2c 22 62 79 74 65 61 72 72 61 79 22 29 3d 3d  e,"bytearray")==
62d0: 30 20 26 26 20 70 56 61 72 2d 3e 62 79 74 65 73  0 && pVar->bytes
62e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
62f0: 4f 6e 6c 79 20 72 65 74 75 72 6e 20 61 20 42 4c  Only return a BL
6300: 4f 42 20 74 79 70 65 20 69 66 20 74 68 65 20 54  OB type if the T
6310: 63 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 61  cl variable is a
6320: 20 62 79 74 65 61 72 72 61 79 20 61 6e 64 0a 20   bytearray and. 
6330: 20 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 20 73       ** has no s
6340: 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61  tring representa
6350: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 64  tion. */.      d
6360: 61 74 61 20 3d 20 54 63 6c 5f 47 65 74 42 79 74  ata = Tcl_GetByt
6370: 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 70 56  eArrayFromObj(pV
6380: 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 73  ar, &n);.      s
6390: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c  qlite3_result_bl
63a0: 6f 62 28 63 6f 6e 74 65 78 74 2c 20 64 61 74 61  ob(context, data
63b0: 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  , n, SQLITE_TRAN
63c0: 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73  SIENT);.    }els
63d0: 65 20 69 66 28 20 63 3d 3d 27 62 27 20 26 26 20  e if( c=='b' && 
63e0: 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 62 6f  strcmp(zType,"bo
63f0: 6f 6c 65 61 6e 22 29 3d 3d 30 20 29 7b 0a 20 20  olean")==0 ){.  
6400: 20 20 20 20 54 63 6c 5f 47 65 74 49 6e 74 46 72      Tcl_GetIntFr
6410: 6f 6d 4f 62 6a 28 30 2c 20 70 56 61 72 2c 20 26  omObj(0, pVar, &
6420: 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
6430: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e  3_result_int(con
6440: 74 65 78 74 2c 20 6e 29 3b 0a 20 20 20 20 7d 65  text, n);.    }e
6450: 6c 73 65 20 69 66 28 20 63 3d 3d 27 64 27 20 26  lse if( c=='d' &
6460: 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22  & strcmp(zType,"
6470: 64 6f 75 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20  double")==0 ){. 
6480: 20 20 20 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20       double r;. 
6490: 20 20 20 20 20 54 63 6c 5f 47 65 74 44 6f 75 62       Tcl_GetDoub
64a0: 6c 65 46 72 6f 6d 4f 62 6a 28 30 2c 20 70 56 61  leFromObj(0, pVa
64b0: 72 2c 20 26 72 29 3b 0a 20 20 20 20 20 20 73 71  r, &r);.      sq
64c0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75  lite3_result_dou
64d0: 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 72 29 3b  ble(context, r);
64e0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
64f0: 63 3d 3d 27 77 27 20 26 26 20 73 74 72 63 6d 70  c=='w' && strcmp
6500: 28 7a 54 79 70 65 2c 22 77 69 64 65 49 6e 74 22  (zType,"wideInt"
6510: 29 3d 3d 30 29 20 7c 7c 0a 20 20 20 20 20 20 20  )==0) ||.       
6520: 20 20 20 28 63 3d 3d 27 69 27 20 26 26 20 73 74     (c=='i' && st
6530: 72 63 6d 70 28 7a 54 79 70 65 2c 22 69 6e 74 22  rcmp(zType,"int"
6540: 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 54  )==0) ){.      T
6550: 63 6c 5f 57 69 64 65 49 6e 74 20 76 3b 0a 20 20  cl_WideInt v;.  
6560: 20 20 20 20 54 63 6c 5f 47 65 74 57 69 64 65 49      Tcl_GetWideI
6570: 6e 74 46 72 6f 6d 4f 62 6a 28 30 2c 20 70 56 61  ntFromObj(0, pVa
6580: 72 2c 20 26 76 29 3b 0a 20 20 20 20 20 20 73 71  r, &v);.      sq
6590: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
65a0: 36 34 28 63 6f 6e 74 65 78 74 2c 20 76 29 3b 0a  64(context, v);.
65b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
65c0: 20 64 61 74 61 20 3d 20 28 75 6e 73 69 67 6e 65   data = (unsigne
65d0: 64 20 63 68 61 72 20 2a 29 54 63 6c 5f 47 65 74  d char *)Tcl_Get
65e0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 56  StringFromObj(pV
65f0: 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 73  ar, &n);.      s
6600: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
6610: 78 74 28 63 6f 6e 74 65 78 74 2c 20 28 63 68 61  xt(context, (cha
6620: 72 20 2a 29 64 61 74 61 2c 20 6e 2c 20 53 51 4c  r *)data, n, SQL
6630: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
6640: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66      }.  }.}..#if
6650: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
6660: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 2f  _AUTHORIZATION./
6670: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65  *.** This is the
6680: 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20   authentication 
6690: 66 75 6e 63 74 69 6f 6e 2e 20 20 49 74 20 61 70  function.  It ap
66a0: 70 65 6e 64 73 20 74 68 65 20 61 75 74 68 65 6e  pends the authen
66b0: 74 69 63 61 74 69 6f 6e 0a 2a 2a 20 74 79 70 65  tication.** type
66c0: 20 63 6f 64 65 20 61 6e 64 20 74 68 65 20 74 77   code and the tw
66d0: 6f 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 7a  o arguments to z
66e0: 43 6d 64 5b 5d 20 74 68 65 6e 20 69 6e 76 6f 6b  Cmd[] then invok
66f0: 65 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a  es the result.**
6700: 20 6f 6e 20 74 68 65 20 69 6e 74 65 72 70 72 65   on the interpre
6710: 74 65 72 2e 20 20 54 68 65 20 72 65 70 6c 79 20  ter.  The reply 
6720: 69 73 20 65 78 61 6d 69 6e 65 64 20 74 6f 20 64  is examined to d
6730: 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 0a  etermine if the.
6740: 2a 2a 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f  ** authenticatio
6750: 6e 20 66 61 69 6c 73 20 6f 72 20 73 75 63 63 65  n fails or succe
6760: 65 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  eds..*/.static i
6770: 6e 74 20 61 75 74 68 5f 63 61 6c 6c 62 61 63 6b  nt auth_callback
6780: 28 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 2c 0a  (.  void *pArg,.
6790: 20 20 69 6e 74 20 63 6f 64 65 2c 0a 20 20 63 6f    int code,.  co
67a0: 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 31 2c  nst char *zArg1,
67b0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
67c0: 41 72 67 32 2c 0a 20 20 63 6f 6e 73 74 20 63 68  Arg2,.  const ch
67d0: 61 72 20 2a 7a 41 72 67 33 2c 0a 20 20 63 6f 6e  ar *zArg3,.  con
67e0: 73 74 20 63 68 61 72 20 2a 7a 41 72 67 34 0a 29  st char *zArg4.)
67f0: 7b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 64 65 3b  {.  char *zCode;
6800: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73  .  Tcl_DString s
6810: 74 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  tr;.  int rc;.  
6820: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 70  const char *zRep
6830: 6c 79 3b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  ly;.  SqliteDb *
6840: 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a  pDb = (SqliteDb*
6850: 29 70 41 72 67 3b 0a 20 20 69 66 28 20 70 44 62  )pArg;.  if( pDb
6860: 2d 3e 64 69 73 61 62 6c 65 41 75 74 68 20 29 20  ->disableAuth ) 
6870: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
6880: 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 63 6f 64  ;..  switch( cod
6890: 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  e ){.    case SQ
68a0: 4c 49 54 45 5f 43 4f 50 59 20 20 20 20 20 20 20  LITE_COPY       
68b0: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
68c0: 53 51 4c 49 54 45 5f 43 4f 50 59 22 3b 20 62 72  SQLITE_COPY"; br
68d0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
68e0: 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45  LITE_CREATE_INDE
68f0: 58 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22  X      : zCode="
6900: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e  SQLITE_CREATE_IN
6910: 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  DEX"; break;.   
6920: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45   case SQLITE_CRE
6930: 41 54 45 5f 54 41 42 4c 45 20 20 20 20 20 20 3a  ATE_TABLE      :
6940: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43   zCode="SQLITE_C
6950: 52 45 41 54 45 5f 54 41 42 4c 45 22 3b 20 62 72  REATE_TABLE"; br
6960: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
6970: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50  LITE_CREATE_TEMP
6980: 5f 49 4e 44 45 58 20 3a 20 7a 43 6f 64 65 3d 22  _INDEX : zCode="
6990: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
69a0: 4d 50 5f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b  MP_INDEX"; break
69b0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
69c0: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41  E_CREATE_TEMP_TA
69d0: 42 4c 45 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c  BLE : zCode="SQL
69e0: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
69f0: 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20  TABLE"; break;. 
6a00: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
6a10: 52 45 41 54 45 5f 54 45 4d 50 5f 54 52 49 47 47  REATE_TEMP_TRIGG
6a20: 45 52 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54  ER: zCode="SQLIT
6a30: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 52  E_CREATE_TEMP_TR
6a40: 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20  IGGER"; break;. 
6a50: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
6a60: 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 20  REATE_TEMP_VIEW 
6a70: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
6a80: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45  _CREATE_TEMP_VIE
6a90: 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  W"; break;.    c
6aa0: 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54  ase SQLITE_CREAT
6ab0: 45 5f 54 52 49 47 47 45 52 20 20 20 20 3a 20 7a  E_TRIGGER    : z
6ac0: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45  Code="SQLITE_CRE
6ad0: 41 54 45 5f 54 52 49 47 47 45 52 22 3b 20 62 72  ATE_TRIGGER"; br
6ae0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
6af0: 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57  LITE_CREATE_VIEW
6b00: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
6b10: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49  SQLITE_CREATE_VI
6b20: 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  EW"; break;.    
6b30: 63 61 73 65 20 53 51 4c 49 54 45 5f 44 45 4c 45  case SQLITE_DELE
6b40: 54 45 20 20 20 20 20 20 20 20 20 20 20 20 3a 20  TE            : 
6b50: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 45  zCode="SQLITE_DE
6b60: 4c 45 54 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20  LETE"; break;.  
6b70: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52    case SQLITE_DR
6b80: 4f 50 5f 49 4e 44 45 58 20 20 20 20 20 20 20 20  OP_INDEX        
6b90: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
6ba0: 44 52 4f 50 5f 49 4e 44 45 58 22 3b 20 62 72 65  DROP_INDEX"; bre
6bb0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
6bc0: 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 20 20  ITE_DROP_TABLE  
6bd0: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
6be0: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45  QLITE_DROP_TABLE
6bf0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
6c00: 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54  se SQLITE_DROP_T
6c10: 45 4d 50 5f 49 4e 44 45 58 20 20 20 3a 20 7a 43  EMP_INDEX   : zC
6c20: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50  ode="SQLITE_DROP
6c30: 5f 54 45 4d 50 5f 49 4e 44 45 58 22 3b 20 62 72  _TEMP_INDEX"; br
6c40: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
6c50: 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54  LITE_DROP_TEMP_T
6c60: 41 42 4c 45 20 20 20 3a 20 7a 43 6f 64 65 3d 22  ABLE   : zCode="
6c70: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
6c80: 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a  _TABLE"; break;.
6c90: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
6ca0: 44 52 4f 50 5f 54 45 4d 50 5f 54 52 49 47 47 45  DROP_TEMP_TRIGGE
6cb0: 52 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54  R : zCode="SQLIT
6cc0: 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 52 49 47  E_DROP_TEMP_TRIG
6cd0: 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  GER"; break;.   
6ce0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f   case SQLITE_DRO
6cf0: 50 5f 54 45 4d 50 5f 56 49 45 57 20 20 20 20 3a  P_TEMP_VIEW    :
6d00: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44   zCode="SQLITE_D
6d10: 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 22 3b 20  ROP_TEMP_VIEW"; 
6d20: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
6d30: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 52 49 47  SQLITE_DROP_TRIG
6d40: 47 45 52 20 20 20 20 20 20 3a 20 7a 43 6f 64 65  GER      : zCode
6d50: 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 52  ="SQLITE_DROP_TR
6d60: 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20  IGGER"; break;. 
6d70: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
6d80: 52 4f 50 5f 56 49 45 57 20 20 20 20 20 20 20 20  ROP_VIEW        
6d90: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
6da0: 5f 44 52 4f 50 5f 56 49 45 57 22 3b 20 62 72 65  _DROP_VIEW"; bre
6db0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
6dc0: 49 54 45 5f 49 4e 53 45 52 54 20 20 20 20 20 20  ITE_INSERT      
6dd0: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
6de0: 51 4c 49 54 45 5f 49 4e 53 45 52 54 22 3b 20 62  QLITE_INSERT"; b
6df0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
6e00: 51 4c 49 54 45 5f 50 52 41 47 4d 41 20 20 20 20  QLITE_PRAGMA    
6e10: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
6e20: 22 53 51 4c 49 54 45 5f 50 52 41 47 4d 41 22 3b  "SQLITE_PRAGMA";
6e30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
6e40: 20 53 51 4c 49 54 45 5f 52 45 41 44 20 20 20 20   SQLITE_READ    
6e50: 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64            : zCod
6e60: 65 3d 22 53 51 4c 49 54 45 5f 52 45 41 44 22 3b  e="SQLITE_READ";
6e70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
6e80: 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 20 20   SQLITE_SELECT  
6e90: 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64            : zCod
6ea0: 65 3d 22 53 51 4c 49 54 45 5f 53 45 4c 45 43 54  e="SQLITE_SELECT
6eb0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
6ec0: 73 65 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41  se SQLITE_TRANSA
6ed0: 43 54 49 4f 4e 20 20 20 20 20 20 20 3a 20 7a 43  CTION       : zC
6ee0: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 54 52 41 4e  ode="SQLITE_TRAN
6ef0: 53 41 43 54 49 4f 4e 22 3b 20 62 72 65 61 6b 3b  SACTION"; break;
6f00: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
6f10: 5f 55 50 44 41 54 45 20 20 20 20 20 20 20 20 20  _UPDATE         
6f20: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
6f30: 54 45 5f 55 50 44 41 54 45 22 3b 20 62 72 65 61  TE_UPDATE"; brea
6f40: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
6f50: 54 45 5f 41 54 54 41 43 48 20 20 20 20 20 20 20  TE_ATTACH       
6f60: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
6f70: 4c 49 54 45 5f 41 54 54 41 43 48 22 3b 20 62 72  LITE_ATTACH"; br
6f80: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
6f90: 4c 49 54 45 5f 44 45 54 41 43 48 20 20 20 20 20  LITE_DETACH     
6fa0: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
6fb0: 53 51 4c 49 54 45 5f 44 45 54 41 43 48 22 3b 20  SQLITE_DETACH"; 
6fc0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
6fd0: 53 51 4c 49 54 45 5f 41 4c 54 45 52 5f 54 41 42  SQLITE_ALTER_TAB
6fe0: 4c 45 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65  LE       : zCode
6ff0: 3d 22 53 51 4c 49 54 45 5f 41 4c 54 45 52 5f 54  ="SQLITE_ALTER_T
7000: 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20  ABLE"; break;.  
7010: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45    case SQLITE_RE
7020: 49 4e 44 45 58 20 20 20 20 20 20 20 20 20 20 20  INDEX           
7030: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
7040: 52 45 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b  REINDEX"; break;
7050: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
7060: 5f 41 4e 41 4c 59 5a 45 20 20 20 20 20 20 20 20  _ANALYZE        
7070: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
7080: 54 45 5f 41 4e 41 4c 59 5a 45 22 3b 20 62 72 65  TE_ANALYZE"; bre
7090: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
70a0: 49 54 45 5f 43 52 45 41 54 45 5f 56 54 41 42 4c  ITE_CREATE_VTABL
70b0: 45 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53  E     : zCode="S
70c0: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 54 41  QLITE_CREATE_VTA
70d0: 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  BLE"; break;.   
70e0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f   case SQLITE_DRO
70f0: 50 5f 56 54 41 42 4c 45 20 20 20 20 20 20 20 3a  P_VTABLE       :
7100: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44   zCode="SQLITE_D
7110: 52 4f 50 5f 56 54 41 42 4c 45 22 3b 20 62 72 65  ROP_VTABLE"; bre
7120: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
7130: 49 54 45 5f 46 55 4e 43 54 49 4f 4e 20 20 20 20  ITE_FUNCTION    
7140: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
7150: 51 4c 49 54 45 5f 46 55 4e 43 54 49 4f 4e 22 3b  QLITE_FUNCTION";
7160: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
7170: 20 53 51 4c 49 54 45 5f 53 41 56 45 50 4f 49 4e   SQLITE_SAVEPOIN
7180: 54 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64  T         : zCod
7190: 65 3d 22 53 51 4c 49 54 45 5f 53 41 56 45 50 4f  e="SQLITE_SAVEPO
71a0: 49 4e 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  INT"; break;.   
71b0: 20 64 65 66 61 75 6c 74 20 20 20 20 20 20 20 20   default        
71c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3a                 :
71d0: 20 7a 43 6f 64 65 3d 22 3f 3f 3f 3f 22 3b 20 62   zCode="????"; b
71e0: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f  reak;.  }.  Tcl_
71f0: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72  DStringInit(&str
7200: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
7210: 41 70 70 65 6e 64 28 26 73 74 72 2c 20 70 44 62  Append(&str, pDb
7220: 2d 3e 7a 41 75 74 68 2c 20 2d 31 29 3b 0a 20 20  ->zAuth, -1);.  
7230: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
7240: 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a  dElement(&str, z
7250: 43 6f 64 65 29 3b 0a 20 20 54 63 6c 5f 44 53 74  Code);.  Tcl_DSt
7260: 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e  ringAppendElemen
7270: 74 28 26 73 74 72 2c 20 7a 41 72 67 31 20 3f 20  t(&str, zArg1 ? 
7280: 7a 41 72 67 31 20 3a 20 22 22 29 3b 0a 20 20 54  zArg1 : "");.  T
7290: 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64  cl_DStringAppend
72a0: 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41  Element(&str, zA
72b0: 72 67 32 20 3f 20 7a 41 72 67 32 20 3a 20 22 22  rg2 ? zArg2 : ""
72c0: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
72d0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73  AppendElement(&s
72e0: 74 72 2c 20 7a 41 72 67 33 20 3f 20 7a 41 72 67  tr, zArg3 ? zArg
72f0: 33 20 3a 20 22 22 29 3b 0a 20 20 54 63 6c 5f 44  3 : "");.  Tcl_D
7300: 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d  StringAppendElem
7310: 65 6e 74 28 26 73 74 72 2c 20 7a 41 72 67 34 20  ent(&str, zArg4 
7320: 3f 20 7a 41 72 67 34 20 3a 20 22 22 29 3b 0a 20  ? zArg4 : "");. 
7330: 20 72 63 20 3d 20 54 63 6c 5f 47 6c 6f 62 61 6c   rc = Tcl_Global
7340: 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70  Eval(pDb->interp
7350: 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c  , Tcl_DStringVal
7360: 75 65 28 26 73 74 72 29 29 3b 0a 20 20 54 63 6c  ue(&str));.  Tcl
7370: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 73 74  _DStringFree(&st
7380: 72 29 3b 0a 20 20 7a 52 65 70 6c 79 20 3d 20 72  r);.  zReply = r
7390: 63 3d 3d 54 43 4c 5f 4f 4b 20 3f 20 54 63 6c 5f  c==TCL_OK ? Tcl_
73a0: 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28  GetStringResult(
73b0: 70 44 62 2d 3e 69 6e 74 65 72 70 29 20 3a 20 22  pDb->interp) : "
73c0: 53 51 4c 49 54 45 5f 44 45 4e 59 22 3b 0a 20 20  SQLITE_DENY";.  
73d0: 69 66 28 20 73 74 72 63 6d 70 28 7a 52 65 70 6c  if( strcmp(zRepl
73e0: 79 2c 22 53 51 4c 49 54 45 5f 4f 4b 22 29 3d 3d  y,"SQLITE_OK")==
73f0: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
7400: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
7410: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 52 65 70   if( strcmp(zRep
7420: 6c 79 2c 22 53 51 4c 49 54 45 5f 44 45 4e 59 22  ly,"SQLITE_DENY"
7430: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  )==0 ){.    rc =
7440: 20 53 51 4c 49 54 45 5f 44 45 4e 59 3b 0a 20 20   SQLITE_DENY;.  
7450: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
7460: 28 7a 52 65 70 6c 79 2c 22 53 51 4c 49 54 45 5f  (zReply,"SQLITE_
7470: 49 47 4e 4f 52 45 22 29 3d 3d 30 20 29 7b 0a 20  IGNORE")==0 ){. 
7480: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
7490: 47 4e 4f 52 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a  GNORE;.  }else{.
74a0: 20 20 20 20 72 63 20 3d 20 39 39 39 3b 0a 20 20      rc = 999;.  
74b0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
74c0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
74d0: 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
74e0: 54 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  TION */../*.** T
74f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 61 64  his routine read
7500: 73 20 61 20 6c 69 6e 65 20 6f 66 20 74 65 78 74  s a line of text
7510: 20 66 72 6f 6d 20 46 49 4c 45 20 69 6e 2c 20 73   from FILE in, s
7520: 74 6f 72 65 73 0a 2a 2a 20 74 68 65 20 74 65 78  tores.** the tex
7530: 74 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61  t in memory obta
7540: 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
7550: 28 29 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61  () and returns a
7560: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
7570: 68 65 20 74 65 78 74 2e 20 20 4e 55 4c 4c 20 69  he text.  NULL i
7580: 73 20 72 65 74 75 72 6e 65 64 20 61 74 20 65 6e  s returned at en
7590: 64 20 6f 66 20 66 69 6c 65 2c 20 6f 72 20 69 66  d of file, or if
75a0: 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 66 61 69   malloc().** fai
75b0: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e  ls..**.** The in
75c0: 74 65 72 66 61 63 65 20 69 73 20 6c 69 6b 65 20  terface is like 
75d0: 22 72 65 61 64 6c 69 6e 65 22 20 62 75 74 20 6e  "readline" but n
75e0: 6f 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 65  o command-line e
75f0: 64 69 74 69 6e 67 0a 2a 2a 20 69 73 20 64 6f 6e  diting.** is don
7600: 65 2e 0a 2a 2a 0a 2a 2a 20 63 6f 70 69 65 64 20  e..**.** copied 
7610: 66 72 6f 6d 20 73 68 65 6c 6c 2e 63 20 66 72 6f  from shell.c fro
7620: 6d 20 27 2e 69 6d 70 6f 72 74 27 20 63 6f 6d 6d  m '.import' comm
7630: 61 6e 64 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  and.*/.static ch
7640: 61 72 20 2a 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e  ar *local_getlin
7650: 65 28 63 68 61 72 20 2a 7a 50 72 6f 6d 70 74 2c  e(char *zPrompt,
7660: 20 46 49 4c 45 20 2a 69 6e 29 7b 0a 20 20 63 68   FILE *in){.  ch
7670: 61 72 20 2a 7a 4c 69 6e 65 3b 0a 20 20 69 6e 74  ar *zLine;.  int
7680: 20 6e 4c 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 3b   nLine;.  int n;
7690: 0a 0a 20 20 6e 4c 69 6e 65 20 3d 20 31 30 30 3b  ..  nLine = 100;
76a0: 0a 20 20 7a 4c 69 6e 65 20 3d 20 6d 61 6c 6c 6f  .  zLine = mallo
76b0: 63 28 20 6e 4c 69 6e 65 20 29 3b 0a 20 20 69 66  c( nLine );.  if
76c0: 28 20 7a 4c 69 6e 65 3d 3d 30 20 29 20 72 65 74  ( zLine==0 ) ret
76d0: 75 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 30 3b 0a  urn 0;.  n = 0;.
76e0: 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
76f0: 20 20 69 66 28 20 6e 2b 31 30 30 3e 6e 4c 69 6e    if( n+100>nLin
7700: 65 20 29 7b 0a 20 20 20 20 20 20 6e 4c 69 6e 65  e ){.      nLine
7710: 20 3d 20 6e 4c 69 6e 65 2a 32 20 2b 20 31 30 30   = nLine*2 + 100
7720: 3b 0a 20 20 20 20 20 20 7a 4c 69 6e 65 20 3d 20  ;.      zLine = 
7730: 72 65 61 6c 6c 6f 63 28 7a 4c 69 6e 65 2c 20 6e  realloc(zLine, n
7740: 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Line);.      if(
7750: 20 7a 4c 69 6e 65 3d 3d 30 20 29 20 72 65 74 75   zLine==0 ) retu
7760: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
7770: 69 66 28 20 66 67 65 74 73 28 26 7a 4c 69 6e 65  if( fgets(&zLine
7780: 5b 6e 5d 2c 20 6e 4c 69 6e 65 20 2d 20 6e 2c 20  [n], nLine - n, 
7790: 69 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  in)==0 ){.      
77a0: 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  if( n==0 ){.    
77b0: 20 20 20 20 66 72 65 65 28 7a 4c 69 6e 65 29 3b      free(zLine);
77c0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
77d0: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
77e0: 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20   zLine[n] = 0;. 
77f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7800: 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 4c 69  }.    while( zLi
7810: 6e 65 5b 6e 5d 20 29 7b 20 6e 2b 2b 3b 20 7d 0a  ne[n] ){ n++; }.
7820: 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20 7a      if( n>0 && z
7830: 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 6e 27 20  Line[n-1]=='\n' 
7840: 29 7b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20  ){.      n--;.  
7850: 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30      zLine[n] = 0
7860: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
7870: 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 4c 69 6e 65     }.  }.  zLine
7880: 20 3d 20 72 65 61 6c 6c 6f 63 28 20 7a 4c 69 6e   = realloc( zLin
7890: 65 2c 20 6e 2b 31 20 29 3b 0a 20 20 72 65 74 75  e, n+1 );.  retu
78a0: 72 6e 20 7a 4c 69 6e 65 3b 0a 7d 0a 0a 0a 2f 2a  rn zLine;.}.../*
78b0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
78c0: 6e 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  n is part of the
78d0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
78e0: 6f 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64 3a 0a  of the command:.
78f0: 2a 2a 0a 2a 2a 20 20 20 24 64 62 20 74 72 61 6e  **.**   $db tran
7900: 73 61 63 74 69 6f 6e 20 5b 2d 64 65 66 65 72 72  saction [-deferr
7910: 65 64 7c 2d 69 6d 6d 65 64 69 61 74 65 7c 2d 65  ed|-immediate|-e
7920: 78 63 6c 75 73 69 76 65 5d 20 53 43 52 49 50 54  xclusive] SCRIPT
7930: 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6e 76  .**.** It is inv
7940: 6f 6b 65 64 20 61 66 74 65 72 20 65 76 61 6c 75  oked after evalu
7950: 61 74 69 6e 67 20 74 68 65 20 73 63 72 69 70 74  ating the script
7960: 20 53 43 52 49 50 54 20 74 6f 20 63 6f 6d 6d 69   SCRIPT to commi
7970: 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  t or rollback.**
7980: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
7990: 20 6f 72 20 73 61 76 65 70 6f 69 6e 74 20 6f 70   or savepoint op
79a0: 65 6e 65 64 20 62 79 20 74 68 65 20 5b 74 72 61  ened by the [tra
79b0: 6e 73 61 63 74 69 6f 6e 5d 20 63 6f 6d 6d 61 6e  nsaction] comman
79c0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
79d0: 20 44 62 54 72 61 6e 73 50 6f 73 74 43 6d 64 28   DbTransPostCmd(
79e0: 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 64 61  .  ClientData da
79f0: 74 61 5b 5d 2c 20 20 20 20 20 20 20 20 20 20 20  ta[],           
7a00: 20 20 20 20 20 20 20 20 2f 2a 20 64 61 74 61 5b          /* data[
7a10: 30 5d 20 69 73 20 74 68 65 20 53 71 6c 69 74 65  0] is the Sqlite
7a20: 33 44 62 2a 20 66 6f 72 20 24 64 62 20 2a 2f 0a  3Db* for $db */.
7a30: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
7a40: 74 65 72 70 2c 20 20 20 20 20 20 20 20 20 20 20  terp,           
7a50: 20 20 20 20 20 20 20 2f 2a 20 54 63 6c 20 69 6e         /* Tcl in
7a60: 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 20 20 69  terpreter */.  i
7a70: 6e 74 20 72 65 73 75 6c 74 20 20 20 20 20 20 20  nt result       
7a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a90: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66      /* Result of
7aa0: 20 65 76 61 6c 75 61 74 69 6e 67 20 53 43 52 49   evaluating SCRI
7ab0: 50 54 20 2a 2f 0a 29 7b 0a 20 20 73 74 61 74 69  PT */.){.  stati
7ac0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a  c const char *az
7ad0: 45 6e 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 52  End[] = {.    "R
7ae0: 45 4c 45 41 53 45 20 5f 74 63 6c 5f 74 72 61 6e  ELEASE _tcl_tran
7af0: 73 61 63 74 69 6f 6e 22 2c 20 20 20 20 20 20 20  saction",       
7b00: 20 2f 2a 20 72 63 3d 3d 54 43 4c 5f 45 52 52 4f   /* rc==TCL_ERRO
7b10: 52 2c 20 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21  R, nTransaction!
7b20: 3d 30 20 2a 2f 0a 20 20 20 20 22 43 4f 4d 4d 49  =0 */.    "COMMI
7b30: 54 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  T",             
7b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7b50: 72 63 21 3d 54 43 4c 5f 45 52 52 4f 52 2c 20 6e  rc!=TCL_ERROR, n
7b60: 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 30 20 2a  Transaction==0 *
7b70: 2f 0a 20 20 20 20 22 52 4f 4c 4c 42 41 43 4b 20  /.    "ROLLBACK 
7b80: 54 4f 20 5f 74 63 6c 5f 74 72 61 6e 73 61 63 74  TO _tcl_transact
7b90: 69 6f 6e 20 3b 20 52 45 4c 45 41 53 45 20 5f 74  ion ; RELEASE _t
7ba0: 63 6c 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22 2c  cl_transaction",
7bb0: 0a 20 20 20 20 22 52 4f 4c 4c 42 41 43 4b 22 20  .    "ROLLBACK" 
7bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7bd0: 20 20 20 20 20 20 20 20 2f 2a 20 72 63 3d 3d 54          /* rc==T
7be0: 43 4c 5f 45 52 52 4f 52 2c 20 6e 54 72 61 6e 73  CL_ERROR, nTrans
7bf0: 61 63 74 69 6f 6e 3d 3d 30 20 2a 2f 0a 20 20 7d  action==0 */.  }
7c00: 3b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  ;.  SqliteDb *pD
7c10: 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 64  b = (SqliteDb*)d
7c20: 61 74 61 5b 30 5d 3b 0a 20 20 69 6e 74 20 72 63  ata[0];.  int rc
7c30: 20 3d 20 72 65 73 75 6c 74 3b 0a 20 20 63 6f 6e   = result;.  con
7c40: 73 74 20 63 68 61 72 20 2a 7a 45 6e 64 3b 0a 0a  st char *zEnd;..
7c50: 20 20 70 44 62 2d 3e 6e 54 72 61 6e 73 61 63 74    pDb->nTransact
7c60: 69 6f 6e 2d 2d 3b 0a 20 20 7a 45 6e 64 20 3d 20  ion--;.  zEnd = 
7c70: 61 7a 45 6e 64 5b 28 72 63 3d 3d 54 43 4c 5f 45  azEnd[(rc==TCL_E
7c80: 52 52 4f 52 29 2a 32 20 2b 20 28 70 44 62 2d 3e  RROR)*2 + (pDb->
7c90: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 30 29  nTransaction==0)
7ca0: 5d 3b 0a 0a 20 20 70 44 62 2d 3e 64 69 73 61 62  ];..  pDb->disab
7cb0: 6c 65 41 75 74 68 2b 2b 3b 0a 20 20 69 66 28 20  leAuth++;.  if( 
7cc0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62  sqlite3_exec(pDb
7cd0: 2d 3e 64 62 2c 20 7a 45 6e 64 2c 20 30 2c 20 30  ->db, zEnd, 0, 0
7ce0: 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  , 0) ){.      /*
7cf0: 20 54 68 69 73 20 69 73 20 61 20 74 72 69 63 6b   This is a trick
7d00: 79 20 73 63 65 6e 61 72 69 6f 20 74 6f 20 68 61  y scenario to ha
7d10: 6e 64 6c 65 2e 20 54 68 65 20 6d 6f 73 74 20 6c  ndle. The most l
7d20: 69 6b 65 6c 79 20 63 61 75 73 65 20 6f 66 20 61  ikely cause of a
7d30: 6e 0a 20 20 20 20 20 20 2a 2a 20 65 72 72 6f 72  n.      ** error
7d40: 20 69 73 20 74 68 61 74 20 74 68 65 20 65 78 65   is that the exe
7d50: 63 28 29 20 61 62 6f 76 65 20 77 61 73 20 61 6e  c() above was an
7d60: 20 61 74 74 65 6d 70 74 20 74 6f 20 63 6f 6d 6d   attempt to comm
7d70: 69 74 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  it the .      **
7d80: 20 74 6f 70 2d 6c 65 76 65 6c 20 74 72 61 6e 73   top-level trans
7d90: 61 63 74 69 6f 6e 20 74 68 61 74 20 72 65 74 75  action that retu
7da0: 72 6e 65 64 20 53 51 4c 49 54 45 5f 42 55 53 59  rned SQLITE_BUSY
7db0: 2e 20 4f 72 2c 20 6c 65 73 73 20 6c 69 6b 65 6c  . Or, less likel
7dc0: 79 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  y,.      ** that
7dd0: 20 61 6e 20 49 4f 2d 65 72 72 6f 72 20 68 61 73   an IO-error has
7de0: 20 6f 63 63 75 72 72 65 64 2e 20 49 6e 20 65 69   occurred. In ei
7df0: 74 68 65 72 20 63 61 73 65 2c 20 74 68 72 6f 77  ther case, throw
7e00: 20 61 20 54 63 6c 20 65 78 63 65 70 74 69 6f 6e   a Tcl exception
7e10: 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 72  .      ** and tr
7e20: 79 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68  y to rollback th
7e30: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  e transaction.. 
7e40: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
7e50: 20 42 75 74 20 69 74 20 63 6f 75 6c 64 20 61 6c   But it could al
7e60: 73 6f 20 62 65 20 74 68 61 74 20 74 68 65 20 75  so be that the u
7e70: 73 65 72 20 65 78 65 63 75 74 65 64 20 6f 6e 65  ser executed one
7e80: 20 6f 72 20 6d 6f 72 65 20 42 45 47 49 4e 2c 20   or more BEGIN, 
7e90: 0a 20 20 20 20 20 20 2a 2a 20 43 4f 4d 4d 49 54  .      ** COMMIT
7ea0: 2c 20 53 41 56 45 50 4f 49 4e 54 2c 20 52 45 4c  , SAVEPOINT, REL
7eb0: 45 41 53 45 20 6f 72 20 52 4f 4c 4c 42 41 43 4b  EASE or ROLLBACK
7ec0: 20 63 6f 6d 6d 61 6e 64 73 20 74 68 61 74 20 61   commands that a
7ed0: 72 65 20 63 6f 6e 66 75 73 69 6e 67 0a 20 20 20  re confusing.   
7ee0: 20 20 20 2a 2a 20 74 68 69 73 20 6d 65 74 68 6f     ** this metho
7ef0: 64 27 73 20 6c 6f 67 69 63 2e 20 4e 6f 74 20 63  d's logic. Not c
7f00: 6c 65 61 72 20 68 6f 77 20 74 68 69 73 20 77 6f  lear how this wo
7f10: 75 6c 64 20 62 65 20 62 65 73 74 20 68 61 6e 64  uld be best hand
7f20: 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  led..      */.  
7f30: 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 45 52    if( rc!=TCL_ER
7f40: 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  ROR ){.      Tcl
7f50: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
7f60: 74 65 72 70 2c 20 73 71 6c 69 74 65 33 5f 65 72  terp, sqlite3_er
7f70: 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 30  rmsg(pDb->db), 0
7f80: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43  );.      rc = TC
7f90: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
7fa0: 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28     sqlite3_exec(
7fb0: 70 44 62 2d 3e 64 62 2c 20 22 52 4f 4c 4c 42 41  pDb->db, "ROLLBA
7fc0: 43 4b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  CK", 0, 0, 0);. 
7fd0: 20 7d 0a 20 20 70 44 62 2d 3e 64 69 73 61 62 6c   }.  pDb->disabl
7fe0: 65 41 75 74 68 2d 2d 3b 0a 0a 20 20 72 65 74 75  eAuth--;..  retu
7ff0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
8000: 55 6e 6c 65 73 73 20 53 51 4c 49 54 45 5f 54 45  Unless SQLITE_TE
8010: 53 54 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74  ST is defined, t
8020: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
8030: 61 20 73 69 6d 70 6c 65 20 77 72 61 70 70 65 72  a simple wrapper
8040: 20 61 72 6f 75 6e 64 0a 2a 2a 20 73 71 6c 69 74   around.** sqlit
8050: 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 29 2e  e3_prepare_v2().
8060: 20 49 66 20 53 51 4c 49 54 45 5f 54 45 53 54 20   If SQLITE_TEST 
8070: 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e  is defined, then
8080: 20 69 74 20 75 73 65 73 20 65 69 74 68 65 72 0a   it uses either.
8090: 2a 2a 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  ** sqlite3_prepa
80a0: 72 65 5f 76 32 28 29 20 6f 72 20 6c 65 67 61 63  re_v2() or legac
80b0: 79 20 69 6e 74 65 72 66 61 63 65 20 73 71 6c 69  y interface sqli
80c0: 74 65 33 5f 70 72 65 70 61 72 65 28 29 2c 20 64  te3_prepare(), d
80d0: 65 70 65 6e 64 69 6e 67 0a 2a 2a 20 6f 6e 20 77  epending.** on w
80e0: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
80f0: 65 20 5b 64 62 5f 75 73 65 5f 6c 65 67 61 63 79  e [db_use_legacy
8100: 5f 70 72 65 70 61 72 65 5d 20 63 6f 6d 6d 61 6e  _prepare] comman
8110: 64 20 68 61 73 20 62 65 65 6e 20 75 73 65 64 20  d has been used 
8120: 74 6f 20 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 65  to .** configure
8130: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e   the connection.
8140: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
8150: 62 50 72 65 70 61 72 65 28 0a 20 20 53 71 6c 69  bPrepare(.  Sqli
8160: 74 65 44 62 20 2a 70 44 62 2c 20 20 20 20 20 20  teDb *pDb,      
8170: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
8180: 61 74 61 62 61 73 65 20 6f 62 6a 65 63 74 20 2a  atabase object *
8190: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
81a0: 7a 53 71 6c 2c 20 20 20 20 20 20 20 20 20 20 20  zSql,           
81b0: 20 20 20 20 2f 2a 20 53 51 4c 20 74 6f 20 63 6f      /* SQL to co
81c0: 6d 70 69 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74  mpile */.  sqlit
81d0: 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74  e3_stmt **ppStmt
81e0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55  ,          /* OU
81f0: 54 3a 20 50 72 65 70 61 72 65 64 20 73 74 61 74  T: Prepared stat
8200: 65 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  ement */.  const
8210: 20 63 68 61 72 20 2a 2a 70 7a 4f 75 74 20 20 20   char **pzOut   
8220: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
8230: 54 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65  T: Pointer to ne
8240: 78 74 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  xt SQL statement
8250: 20 2a 2f 0a 29 7b 0a 23 69 66 64 65 66 20 53 51   */.){.#ifdef SQ
8260: 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20  LITE_TEST.  if( 
8270: 70 44 62 2d 3e 62 4c 65 67 61 63 79 50 72 65 70  pDb->bLegacyPrep
8280: 61 72 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  are ){.    retur
8290: 6e 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  n sqlite3_prepar
82a0: 65 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c  e(pDb->db, zSql,
82b0: 20 2d 31 2c 20 70 70 53 74 6d 74 2c 20 70 7a 4f   -1, ppStmt, pzO
82c0: 75 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ut);.  }.#endif.
82d0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
82e0: 5f 70 72 65 70 61 72 65 5f 76 32 28 70 44 62 2d  _prepare_v2(pDb-
82f0: 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 70  >db, zSql, -1, p
8300: 70 53 74 6d 74 2c 20 70 7a 4f 75 74 29 3b 0a 7d  pStmt, pzOut);.}
8310: 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74  ../*.** Search t
8320: 68 65 20 63 61 63 68 65 20 66 6f 72 20 61 20 70  he cache for a p
8330: 72 65 70 61 72 65 64 2d 73 74 61 74 65 6d 65 6e  repared-statemen
8340: 74 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 6d  t object that im
8350: 70 6c 65 6d 65 6e 74 73 20 74 68 65 0a 2a 2a 20  plements the.** 
8360: 66 69 72 73 74 20 53 51 4c 20 73 74 61 74 65 6d  first SQL statem
8370: 65 6e 74 20 69 6e 20 74 68 65 20 62 75 66 66 65  ent in the buffe
8380: 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  r pointed to by 
8390: 70 61 72 61 6d 65 74 65 72 20 7a 49 6e 2e 20 49  parameter zIn. I
83a0: 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 70 72 65  f.** no such pre
83b0: 70 61 72 65 64 2d 73 74 61 74 65 6d 65 6e 74 20  pared-statement 
83c0: 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 61 6c  can be found, al
83d0: 6c 6f 63 61 74 65 20 61 6e 64 20 70 72 65 70 61  locate and prepa
83e0: 72 65 20 61 20 6e 65 77 0a 2a 2a 20 6f 6e 65 2e  re a new.** one.
83f0: 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c   In either case,
8400: 20 62 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e   bind the curren
8410: 74 20 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20  t values of the 
8420: 72 65 6c 65 76 61 6e 74 20 54 63 6c 0a 2a 2a 20  relevant Tcl.** 
8430: 76 61 72 69 61 62 6c 65 73 20 74 6f 20 61 6e 79  variables to any
8440: 20 24 76 61 72 2c 20 3a 76 61 72 20 6f 72 20 40   $var, :var or @
8450: 76 61 72 20 76 61 72 69 61 62 6c 65 73 20 69 6e  var variables in
8460: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20   the statement. 
8470: 42 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75 72 6e  Before.** return
8480: 69 6e 67 2c 20 73 65 74 20 2a 70 70 50 72 65 53  ing, set *ppPreS
8490: 74 6d 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  tmt to point to 
84a0: 74 68 65 20 70 72 65 70 61 72 65 64 2d 73 74 61  the prepared-sta
84b0: 74 65 6d 65 6e 74 20 6f 62 6a 65 63 74 2e 0a 2a  tement object..*
84c0: 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 70 61 72 61  *.** Output para
84d0: 6d 65 74 65 72 20 2a 70 7a 4f 75 74 20 69 73 20  meter *pzOut is 
84e0: 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
84f0: 74 68 65 20 6e 65 78 74 20 53 51 4c 20 73 74 61  the next SQL sta
8500: 74 65 6d 65 6e 74 20 69 6e 0a 2a 2a 20 62 75 66  tement in.** buf
8510: 66 65 72 20 7a 49 6e 2c 20 6f 72 20 74 6f 20 74  fer zIn, or to t
8520: 68 65 20 27 5c 30 27 20 62 79 74 65 20 61 74 20  he '\0' byte at 
8530: 74 68 65 20 65 6e 64 20 6f 66 20 7a 49 6e 20 69  the end of zIn i
8540: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a  f there is no.**
8550: 20 6e 65 78 74 20 73 74 61 74 65 6d 65 6e 74 2e   next statement.
8560: 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
8570: 73 66 75 6c 2c 20 54 43 4c 5f 4f 4b 20 69 73 20  sful, TCL_OK is 
8580: 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
8590: 69 73 65 2c 20 54 43 4c 5f 45 52 52 4f 52 20 69  ise, TCL_ERROR i
85a0: 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e  s returned.** an
85b0: 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  d an error messa
85c0: 67 65 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 69  ge loaded into i
85d0: 6e 74 65 72 70 72 65 74 65 72 20 70 44 62 2d 3e  nterpreter pDb->
85e0: 69 6e 74 65 72 70 2e 0a 2a 2f 0a 73 74 61 74 69  interp..*/.stati
85f0: 63 20 69 6e 74 20 64 62 50 72 65 70 61 72 65 41  c int dbPrepareA
8600: 6e 64 42 69 6e 64 28 0a 20 20 53 71 6c 69 74 65  ndBind(.  Sqlite
8610: 44 62 20 2a 70 44 62 2c 20 20 20 20 20 20 20 20  Db *pDb,        
8620: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
8630: 61 62 61 73 65 20 6f 62 6a 65 63 74 20 2a 2f 0a  abase object */.
8640: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 49    char const *zI
8650: 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
8660: 20 20 2f 2a 20 53 51 4c 20 74 6f 20 63 6f 6d 70    /* SQL to comp
8670: 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f  ile */.  char co
8680: 6e 73 74 20 2a 2a 70 7a 4f 75 74 2c 20 20 20 20  nst **pzOut,    
8690: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
86a0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 78 74   Pointer to next
86b0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a   SQL statement *
86c0: 2f 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64 53  /.  SqlPreparedS
86d0: 74 6d 74 20 2a 2a 70 70 50 72 65 53 74 6d 74 20  tmt **ppPreStmt 
86e0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4f 62 6a 65      /* OUT: Obje
86f0: 63 74 20 75 73 65 64 20 74 6f 20 63 61 63 68 65  ct used to cache
8700: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b   statement */.){
8710: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
8720: 53 71 6c 20 3d 20 7a 49 6e 3b 20 20 20 20 20 20  Sql = zIn;      
8730: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
8740: 20 66 69 72 73 74 20 53 51 4c 20 73 74 61 74 65   first SQL state
8750: 6d 65 6e 74 20 69 6e 20 7a 49 6e 20 2a 2f 0a 20  ment in zIn */. 
8760: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
8770: 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stmt;           
8780: 20 2f 2a 20 50 72 65 70 61 72 65 64 20 73 74 61   /* Prepared sta
8790: 74 65 6d 65 6e 74 20 6f 62 6a 65 63 74 20 2a 2f  tement object */
87a0: 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74  .  SqlPreparedSt
87b0: 6d 74 20 2a 70 50 72 65 53 74 6d 74 3b 20 20 20  mt *pPreStmt;   
87c0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
87d0: 20 63 61 63 68 65 64 20 73 74 61 74 65 6d 65 6e   cached statemen
87e0: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 71 6c 3b  t */.  int nSql;
87f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8800: 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
8810: 20 6f 66 20 7a 53 71 6c 20 69 6e 20 62 79 74 65   of zSql in byte
8820: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72 3b  s */.  int nVar;
8830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8840: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
8850: 20 6f 66 20 76 61 72 69 61 62 6c 65 73 20 69 6e   of variables in
8860: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
8870: 69 6e 74 20 69 50 61 72 6d 20 3d 20 30 3b 20 20  int iParm = 0;  
8880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8890: 2f 2a 20 4e 65 78 74 20 66 72 65 65 20 65 6e 74  /* Next free ent
88a0: 72 79 20 69 6e 20 61 70 50 61 72 6d 20 2a 2f 0a  ry in apParm */.
88b0: 20 20 63 68 61 72 20 63 3b 0a 20 20 69 6e 74 20    char c;.  int 
88c0: 69 3b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  i;.  Tcl_Interp 
88d0: 2a 69 6e 74 65 72 70 20 3d 20 70 44 62 2d 3e 69  *interp = pDb->i
88e0: 6e 74 65 72 70 3b 0a 0a 20 20 2a 70 70 50 72 65  nterp;..  *ppPre
88f0: 53 74 6d 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  Stmt = 0;..  /* 
8900: 54 72 69 6d 20 73 70 61 63 65 73 20 66 72 6f 6d  Trim spaces from
8910: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 7a 53   the start of zS
8920: 71 6c 20 61 6e 64 20 63 61 6c 63 75 6c 61 74 65  ql and calculate
8930: 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 20 6c   the remaining l
8940: 65 6e 67 74 68 2e 20 2a 2f 0a 20 20 77 68 69 6c  ength. */.  whil
8950: 65 28 20 28 63 20 3d 20 7a 53 71 6c 5b 30 5d 29  e( (c = zSql[0])
8960: 3d 3d 27 20 27 20 7c 7c 20 63 3d 3d 27 5c 74 27  ==' ' || c=='\t'
8970: 20 7c 7c 20 63 3d 3d 27 5c 72 27 20 7c 7c 20 63   || c=='\r' || c
8980: 3d 3d 27 5c 6e 27 20 29 7b 20 7a 53 71 6c 2b 2b  =='\n' ){ zSql++
8990: 3b 20 7d 0a 20 20 6e 53 71 6c 20 3d 20 73 74 72  ; }.  nSql = str
89a0: 6c 65 6e 33 30 28 7a 53 71 6c 29 3b 0a 0a 20 20  len30(zSql);..  
89b0: 66 6f 72 28 70 50 72 65 53 74 6d 74 20 3d 20 70  for(pPreStmt = p
89c0: 44 62 2d 3e 73 74 6d 74 4c 69 73 74 3b 20 70 50  Db->stmtList; pP
89d0: 72 65 53 74 6d 74 3b 20 70 50 72 65 53 74 6d 74  reStmt; pPreStmt
89e0: 3d 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74  =pPreStmt->pNext
89f0: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70  ){.    int n = p
8a00: 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 3b 0a 20  PreStmt->nSql;. 
8a10: 20 20 20 69 66 28 20 6e 53 71 6c 3e 3d 6e 20 0a     if( nSql>=n .
8a20: 20 20 20 20 20 20 20 20 26 26 20 6d 65 6d 63 6d          && memcm
8a30: 70 28 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c  p(pPreStmt->zSql
8a40: 2c 20 7a 53 71 6c 2c 20 6e 29 3d 3d 30 0a 20 20  , zSql, n)==0.  
8a50: 20 20 20 20 20 20 26 26 20 28 7a 53 71 6c 5b 6e        && (zSql[n
8a60: 5d 3d 3d 30 20 7c 7c 20 7a 53 71 6c 5b 6e 2d 31  ]==0 || zSql[n-1
8a70: 5d 3d 3d 27 3b 27 29 0a 20 20 20 20 29 7b 0a 20  ]==';').    ){. 
8a80: 20 20 20 20 20 70 53 74 6d 74 20 3d 20 70 50 72       pStmt = pPr
8a90: 65 53 74 6d 74 2d 3e 70 53 74 6d 74 3b 0a 20 20  eStmt->pStmt;.  
8aa0: 20 20 20 20 2a 70 7a 4f 75 74 20 3d 20 26 7a 53      *pzOut = &zS
8ab0: 71 6c 5b 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71  ql[pPreStmt->nSq
8ac0: 6c 5d 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68  l];..      /* Wh
8ad0: 65 6e 20 61 20 70 72 65 70 61 72 65 64 20 73 74  en a prepared st
8ae0: 61 74 65 6d 65 6e 74 20 69 73 20 66 6f 75 6e 64  atement is found
8af0: 2c 20 75 6e 6c 69 6e 6b 20 69 74 20 66 72 6f 6d  , unlink it from
8b00: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61   the.      ** ca
8b10: 63 68 65 20 6c 69 73 74 2e 20 20 49 74 20 77 69  che list.  It wi
8b20: 6c 6c 20 6c 61 74 65 72 20 62 65 20 61 64 64 65  ll later be adde
8b30: 64 20 62 61 63 6b 20 74 6f 20 74 68 65 20 62 65  d back to the be
8b40: 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a  ginning.      **
8b50: 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 6c 69   of the cache li
8b60: 73 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69  st in order to i
8b70: 6d 70 6c 65 6d 65 6e 74 20 4c 52 55 20 72 65 70  mplement LRU rep
8b80: 6c 61 63 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20  lacement..      
8b90: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  */.      if( pPr
8ba0: 65 53 74 6d 74 2d 3e 70 50 72 65 76 20 29 7b 0a  eStmt->pPrev ){.
8bb0: 20 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74          pPreStmt
8bc0: 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d  ->pPrev->pNext =
8bd0: 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74   pPreStmt->pNext
8be0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
8bf0: 20 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74         pDb->stmt
8c00: 4c 69 73 74 20 3d 20 70 50 72 65 53 74 6d 74 2d  List = pPreStmt-
8c10: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
8c20: 20 20 20 20 20 20 69 66 28 20 70 50 72 65 53 74        if( pPreSt
8c30: 6d 74 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20  mt->pNext ){.   
8c40: 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 70       pPreStmt->p
8c50: 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 50  Next->pPrev = pP
8c60: 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 3b 0a 20  reStmt->pPrev;. 
8c70: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8c80: 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73      pDb->stmtLas
8c90: 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 50  t = pPreStmt->pP
8ca0: 72 65 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rev;.      }.   
8cb0: 20 20 20 70 44 62 2d 3e 6e 53 74 6d 74 2d 2d 3b     pDb->nStmt--;
8cc0: 0a 20 20 20 20 20 20 6e 56 61 72 20 3d 20 73 71  .      nVar = sq
8cd0: 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d  lite3_bind_param
8ce0: 65 74 65 72 5f 63 6f 75 6e 74 28 70 53 74 6d 74  eter_count(pStmt
8cf0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
8d00: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f      }.  }.  .  /
8d10: 2a 20 49 66 20 6e 6f 20 70 72 65 70 61 72 65 64  * If no prepared
8d20: 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 66   statement was f
8d30: 6f 75 6e 64 2e 20 43 6f 6d 70 69 6c 65 20 74 68  ound. Compile th
8d40: 65 20 53 51 4c 20 74 65 78 74 2e 20 41 6c 73 6f  e SQL text. Also
8d50: 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 61   allocate.  ** a
8d60: 20 6e 65 77 20 53 71 6c 50 72 65 70 61 72 65 64   new SqlPrepared
8d70: 53 74 6d 74 20 73 74 72 75 63 74 75 72 65 2e 20  Stmt structure. 
8d80: 20 2a 2f 0a 20 20 69 66 28 20 70 50 72 65 53 74   */.  if( pPreSt
8d90: 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  mt==0 ){.    int
8da0: 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20 69 66 28   nByte;..    if(
8db0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 64 62 50 72   SQLITE_OK!=dbPr
8dc0: 65 70 61 72 65 28 70 44 62 2c 20 7a 53 71 6c 2c  epare(pDb, zSql,
8dd0: 20 26 70 53 74 6d 74 2c 20 70 7a 4f 75 74 29 20   &pStmt, pzOut) 
8de0: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  ){.      Tcl_Set
8df0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
8e00: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
8e10: 62 6a 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  bj(sqlite3_errms
8e20: 67 28 70 44 62 2d 3e 64 62 29 2c 20 2d 31 29 29  g(pDb->db), -1))
8e30: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
8e40: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
8e50: 20 20 20 20 69 66 28 20 70 53 74 6d 74 3d 3d 30      if( pStmt==0
8e60: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 53 51   ){.      if( SQ
8e70: 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
8e80: 5f 65 72 72 63 6f 64 65 28 70 44 62 2d 3e 64 62  _errcode(pDb->db
8e90: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
8ea0: 41 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 65  A compile-time e
8eb0: 72 72 6f 72 20 69 6e 20 74 68 65 20 73 74 61 74  rror in the stat
8ec0: 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20  ement. */.      
8ed0: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
8ee0: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
8ef0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69  ewStringObj(sqli
8f00: 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e  te3_errmsg(pDb->
8f10: 64 62 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 20  db), -1));.     
8f20: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
8f30: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ROR;.      }else
8f40: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
8f50: 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 61   statement was a
8f60: 20 6e 6f 2d 6f 70 2e 20 20 43 6f 6e 74 69 6e 75   no-op.  Continu
8f70: 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 74  e to the next st
8f80: 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 20 20  atement.        
8f90: 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c 20 73 74  ** in the SQL st
8fa0: 72 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ring..        */
8fb0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
8fc0: 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  TCL_OK;.      }.
8fd0: 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72      }..    asser
8fe0: 74 28 20 70 50 72 65 53 74 6d 74 3d 3d 30 20 29  t( pPreStmt==0 )
8ff0: 3b 0a 20 20 20 20 6e 56 61 72 20 3d 20 73 71 6c  ;.    nVar = sql
9000: 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65  ite3_bind_parame
9010: 74 65 72 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29  ter_count(pStmt)
9020: 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 73 69  ;.    nByte = si
9030: 7a 65 6f 66 28 53 71 6c 50 72 65 70 61 72 65 64  zeof(SqlPrepared
9040: 53 74 6d 74 29 20 2b 20 6e 56 61 72 2a 73 69 7a  Stmt) + nVar*siz
9050: 65 6f 66 28 54 63 6c 5f 4f 62 6a 20 2a 29 3b 0a  eof(Tcl_Obj *);.
9060: 20 20 20 20 70 50 72 65 53 74 6d 74 20 3d 20 28      pPreStmt = (
9070: 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 2a  SqlPreparedStmt*
9080: 29 54 63 6c 5f 41 6c 6c 6f 63 28 6e 42 79 74 65  )Tcl_Alloc(nByte
9090: 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50  );.    memset(pP
90a0: 72 65 53 74 6d 74 2c 20 30 2c 20 6e 42 79 74 65  reStmt, 0, nByte
90b0: 29 3b 0a 0a 20 20 20 20 70 50 72 65 53 74 6d 74  );..    pPreStmt
90c0: 2d 3e 70 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b  ->pStmt = pStmt;
90d0: 0a 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 6e  .    pPreStmt->n
90e0: 53 71 6c 20 3d 20 28 69 6e 74 29 28 2a 70 7a 4f  Sql = (int)(*pzO
90f0: 75 74 20 2d 20 7a 53 71 6c 29 3b 0a 20 20 20 20  ut - zSql);.    
9100: 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 20 3d  pPreStmt->zSql =
9110: 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 74   sqlite3_sql(pSt
9120: 6d 74 29 3b 0a 20 20 20 20 70 50 72 65 53 74 6d  mt);.    pPreStm
9130: 74 2d 3e 61 70 50 61 72 6d 20 3d 20 28 54 63 6c  t->apParm = (Tcl
9140: 5f 4f 62 6a 20 2a 2a 29 26 70 50 72 65 53 74 6d  _Obj **)&pPreStm
9150: 74 5b 31 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c  t[1];.#ifdef SQL
9160: 49 54 45 5f 54 45 53 54 0a 20 20 20 20 69 66 28  ITE_TEST.    if(
9170: 20 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 3d   pPreStmt->zSql=
9180: 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  =0 ){.      char
9190: 20 2a 7a 43 6f 70 79 20 3d 20 54 63 6c 5f 41 6c   *zCopy = Tcl_Al
91a0: 6c 6f 63 28 70 50 72 65 53 74 6d 74 2d 3e 6e 53  loc(pPreStmt->nS
91b0: 71 6c 20 2b 20 31 29 3b 0a 20 20 20 20 20 20 6d  ql + 1);.      m
91c0: 65 6d 63 70 79 28 7a 43 6f 70 79 2c 20 7a 53 71  emcpy(zCopy, zSq
91d0: 6c 2c 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71  l, pPreStmt->nSq
91e0: 6c 29 3b 0a 20 20 20 20 20 20 7a 43 6f 70 79 5b  l);.      zCopy[
91f0: 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 5d 20  pPreStmt->nSql] 
9200: 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 70 50  = '\0';.      pP
9210: 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 20 3d 20 7a  reStmt->zSql = z
9220: 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  Copy;.    }.#end
9230: 69 66 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  if.  }.  assert(
9240: 20 70 50 72 65 53 74 6d 74 20 29 3b 0a 20 20 61   pPreStmt );.  a
9250: 73 73 65 72 74 28 20 73 74 72 6c 65 6e 33 30 28  ssert( strlen30(
9260: 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 29 3d  pPreStmt->zSql)=
9270: 3d 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 20  =pPreStmt->nSql 
9280: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d  );.  assert( 0==
9290: 6d 65 6d 63 6d 70 28 70 50 72 65 53 74 6d 74 2d  memcmp(pPreStmt-
92a0: 3e 7a 53 71 6c 2c 20 7a 53 71 6c 2c 20 70 50 72  >zSql, zSql, pPr
92b0: 65 53 74 6d 74 2d 3e 6e 53 71 6c 29 20 29 3b 0a  eStmt->nSql) );.
92c0: 0a 20 20 2f 2a 20 42 69 6e 64 20 76 61 6c 75 65  .  /* Bind value
92d0: 73 20 74 6f 20 70 61 72 61 6d 65 74 65 72 73 20  s to parameters 
92e0: 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20  that begin with 
92f0: 24 20 6f 72 20 3a 20 2a 2f 20 20 0a 20 20 66 6f  $ or : */  .  fo
9300: 72 28 69 3d 31 3b 20 69 3c 3d 6e 56 61 72 3b 20  r(i=1; i<=nVar; 
9310: 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  i++){.    const 
9320: 63 68 61 72 20 2a 7a 56 61 72 20 3d 20 73 71 6c  char *zVar = sql
9330: 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65  ite3_bind_parame
9340: 74 65 72 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 20  ter_name(pStmt, 
9350: 69 29 3b 0a 20 20 20 20 69 66 28 20 7a 56 61 72  i);.    if( zVar
9360: 21 3d 30 20 26 26 20 28 7a 56 61 72 5b 30 5d 3d  !=0 && (zVar[0]=
9370: 3d 27 24 27 20 7c 7c 20 7a 56 61 72 5b 30 5d 3d  ='$' || zVar[0]=
9380: 3d 27 3a 27 20 7c 7c 20 7a 56 61 72 5b 30 5d 3d  =':' || zVar[0]=
9390: 3d 27 40 27 29 20 29 7b 0a 20 20 20 20 20 20 54  ='@') ){.      T
93a0: 63 6c 5f 4f 62 6a 20 2a 70 56 61 72 20 3d 20 54  cl_Obj *pVar = T
93b0: 63 6c 5f 47 65 74 56 61 72 32 45 78 28 69 6e 74  cl_GetVar2Ex(int
93c0: 65 72 70 2c 20 26 7a 56 61 72 5b 31 5d 2c 20 30  erp, &zVar[1], 0
93d0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
93e0: 70 56 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20  pVar ){.        
93f0: 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20 20 75  int n;.        u
9400: 38 20 2a 64 61 74 61 3b 0a 20 20 20 20 20 20 20  8 *data;.       
9410: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
9420: 70 65 20 3d 20 28 70 56 61 72 2d 3e 74 79 70 65  pe = (pVar->type
9430: 50 74 72 20 3f 20 70 56 61 72 2d 3e 74 79 70 65  Ptr ? pVar->type
9440: 50 74 72 2d 3e 6e 61 6d 65 20 3a 20 22 22 29 3b  Ptr->name : "");
9450: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63 20  .        char c 
9460: 3d 20 7a 54 79 70 65 5b 30 5d 3b 0a 20 20 20 20  = zType[0];.    
9470: 20 20 20 20 69 66 28 20 7a 56 61 72 5b 30 5d 3d      if( zVar[0]=
9480: 3d 27 40 27 20 7c 7c 0a 20 20 20 20 20 20 20 20  ='@' ||.        
9490: 20 20 20 28 63 3d 3d 27 62 27 20 26 26 20 73 74     (c=='b' && st
94a0: 72 63 6d 70 28 7a 54 79 70 65 2c 22 62 79 74 65  rcmp(zType,"byte
94b0: 61 72 72 61 79 22 29 3d 3d 30 20 26 26 20 70 56  array")==0 && pV
94c0: 61 72 2d 3e 62 79 74 65 73 3d 3d 30 29 20 29 7b  ar->bytes==0) ){
94d0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f  .          /* Lo
94e0: 61 64 20 61 20 42 4c 4f 42 20 74 79 70 65 20 69  ad a BLOB type i
94f0: 66 20 74 68 65 20 54 63 6c 20 76 61 72 69 61 62  f the Tcl variab
9500: 6c 65 20 69 73 20 61 20 62 79 74 65 61 72 72 61  le is a bytearra
9510: 79 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20  y and.          
9520: 2a 2a 20 69 74 20 68 61 73 20 6e 6f 20 73 74 72  ** it has no str
9530: 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69  ing representati
9540: 6f 6e 20 6f 72 20 74 68 65 20 68 6f 73 74 0a 20  on or the host. 
9550: 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 72 61           ** para
9560: 6d 65 74 65 72 20 6e 61 6d 65 20 62 65 67 69 6e  meter name begin
9570: 73 20 77 69 74 68 20 22 40 22 2e 20 2a 2f 0a 20  s with "@". */. 
9580: 20 20 20 20 20 20 20 20 20 64 61 74 61 20 3d 20           data = 
9590: 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79  Tcl_GetByteArray
95a0: 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e  FromObj(pVar, &n
95b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
95c0: 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70  ite3_bind_blob(p
95d0: 53 74 6d 74 2c 20 69 2c 20 64 61 74 61 2c 20 6e  Stmt, i, data, n
95e0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
95f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  ;.          Tcl_
9600: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 56 61  IncrRefCount(pVa
9610: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  r);.          pP
9620: 72 65 53 74 6d 74 2d 3e 61 70 50 61 72 6d 5b 69  reStmt->apParm[i
9630: 50 61 72 6d 2b 2b 5d 20 3d 20 70 56 61 72 3b 0a  Parm++] = pVar;.
9640: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
9650: 28 20 63 3d 3d 27 62 27 20 26 26 20 73 74 72 63  ( c=='b' && strc
9660: 6d 70 28 7a 54 79 70 65 2c 22 62 6f 6f 6c 65 61  mp(zType,"boolea
9670: 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  n")==0 ){.      
9680: 20 20 20 20 54 63 6c 5f 47 65 74 49 6e 74 46 72      Tcl_GetIntFr
9690: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 56  omObj(interp, pV
96a0: 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20  ar, &n);.       
96b0: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
96c0: 69 6e 74 28 70 53 74 6d 74 2c 20 69 2c 20 6e 29  int(pStmt, i, n)
96d0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
96e0: 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20 73 74  if( c=='d' && st
96f0: 72 63 6d 70 28 7a 54 79 70 65 2c 22 64 6f 75 62  rcmp(zType,"doub
9700: 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  le")==0 ){.     
9710: 20 20 20 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20       double r;. 
9720: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74           Tcl_Get
9730: 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e  DoubleFromObj(in
9740: 74 65 72 70 2c 20 70 56 61 72 2c 20 26 72 29 3b  terp, pVar, &r);
9750: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
9760: 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28 70  e3_bind_double(p
9770: 53 74 6d 74 2c 20 69 2c 20 72 29 3b 0a 20 20 20  Stmt, i, r);.   
9780: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
9790: 63 3d 3d 27 77 27 20 26 26 20 73 74 72 63 6d 70  c=='w' && strcmp
97a0: 28 7a 54 79 70 65 2c 22 77 69 64 65 49 6e 74 22  (zType,"wideInt"
97b0: 29 3d 3d 30 29 20 7c 7c 0a 20 20 20 20 20 20 20  )==0) ||.       
97c0: 20 20 20 20 20 20 20 28 63 3d 3d 27 69 27 20 26         (c=='i' &
97d0: 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22  & strcmp(zType,"
97e0: 69 6e 74 22 29 3d 3d 30 29 20 29 7b 0a 20 20 20  int")==0) ){.   
97f0: 20 20 20 20 20 20 20 54 63 6c 5f 57 69 64 65 49         Tcl_WideI
9800: 6e 74 20 76 3b 0a 20 20 20 20 20 20 20 20 20 20  nt v;.          
9810: 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72  Tcl_GetWideIntFr
9820: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 56  omObj(interp, pV
9830: 61 72 2c 20 26 76 29 3b 0a 20 20 20 20 20 20 20  ar, &v);.       
9840: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
9850: 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 69 2c 20  int64(pStmt, i, 
9860: 76 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  v);.        }els
9870: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 64 61 74  e{.          dat
9880: 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  a = (unsigned ch
9890: 61 72 20 2a 29 54 63 6c 5f 47 65 74 53 74 72 69  ar *)Tcl_GetStri
98a0: 6e 67 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20  ngFromObj(pVar, 
98b0: 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  &n);.          s
98c0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
98d0: 28 70 53 74 6d 74 2c 20 69 2c 20 28 63 68 61 72  (pStmt, i, (char
98e0: 20 2a 29 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49   *)data, n, SQLI
98f0: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
9900: 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65        Tcl_IncrRe
9910: 66 43 6f 75 6e 74 28 70 56 61 72 29 3b 0a 20 20  fCount(pVar);.  
9920: 20 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74          pPreStmt
9930: 2d 3e 61 70 50 61 72 6d 5b 69 50 61 72 6d 2b 2b  ->apParm[iParm++
9940: 5d 20 3d 20 70 56 61 72 3b 0a 20 20 20 20 20 20  ] = pVar;.      
9950: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
9960: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
9970: 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74  _bind_null(pStmt
9980: 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , i);.      }.  
9990: 20 20 7d 0a 20 20 7d 0a 20 20 70 50 72 65 53 74    }.  }.  pPreSt
99a0: 6d 74 2d 3e 6e 50 61 72 6d 20 3d 20 69 50 61 72  mt->nParm = iPar
99b0: 6d 3b 0a 20 20 2a 70 70 50 72 65 53 74 6d 74 20  m;.  *ppPreStmt 
99c0: 3d 20 70 50 72 65 53 74 6d 74 3b 0a 0a 20 20 72  = pPreStmt;..  r
99d0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
99e0: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
99f0: 20 73 74 61 74 65 6d 65 6e 74 20 72 65 66 65 72   statement refer
9a00: 65 6e 63 65 20 6f 62 74 61 69 6e 65 64 20 62 79  ence obtained by
9a10: 20 63 61 6c 6c 69 6e 67 20 64 62 50 72 65 70 61   calling dbPrepa
9a20: 72 65 41 6e 64 42 69 6e 64 28 29 2e 0a 2a 2a 20  reAndBind()..** 
9a30: 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  There should be 
9a40: 65 78 61 63 74 6c 79 20 6f 6e 65 20 63 61 6c 6c  exactly one call
9a50: 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
9a60: 6e 20 66 6f 72 20 65 61 63 68 20 63 61 6c 6c 20  n for each call 
9a70: 74 6f 0a 2a 2a 20 64 62 50 72 65 70 61 72 65 41  to.** dbPrepareA
9a80: 6e 64 42 69 6e 64 28 29 2e 0a 2a 2a 0a 2a 2a 20  ndBind()..**.** 
9a90: 49 66 20 74 68 65 20 64 69 73 63 61 72 64 20 70  If the discard p
9aa0: 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d  arameter is non-
9ab0: 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 73  zero, then the s
9ac0: 74 61 74 65 6d 65 6e 74 20 69 73 20 64 65 6c 65  tatement is dele
9ad0: 74 65 64 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65  ted.** immediate
9ae0: 6c 79 2e 20 4f 74 68 65 72 77 69 73 65 20 69 74  ly. Otherwise it
9af0: 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
9b00: 20 4c 52 55 20 6c 69 73 74 20 61 6e 64 20 6d 61   LRU list and ma
9b10: 79 20 62 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a  y be returned.**
9b20: 20 62 79 20 61 20 73 75 62 73 65 71 75 65 6e 74   by a subsequent
9b30: 20 63 61 6c 6c 20 74 6f 20 64 62 50 72 65 70 61   call to dbPrepa
9b40: 72 65 41 6e 64 42 69 6e 64 28 29 2e 0a 2a 2f 0a  reAndBind()..*/.
9b50: 73 74 61 74 69 63 20 76 6f 69 64 20 64 62 52 65  static void dbRe
9b60: 6c 65 61 73 65 53 74 6d 74 28 0a 20 20 53 71 6c  leaseStmt(.  Sql
9b70: 69 74 65 44 62 20 2a 70 44 62 2c 20 20 20 20 20  iteDb *pDb,     
9b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9b90: 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  Database handle 
9ba0: 2a 2f 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64  */.  SqlPrepared
9bb0: 53 74 6d 74 20 2a 70 50 72 65 53 74 6d 74 2c 20  Stmt *pPreStmt, 
9bc0: 20 20 20 20 20 2f 2a 20 50 72 65 70 61 72 65 64       /* Prepared
9bd0: 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c   statement handl
9be0: 65 20 74 6f 20 72 65 6c 65 61 73 65 20 2a 2f 0a  e to release */.
9bf0: 20 20 69 6e 74 20 64 69 73 63 61 72 64 20 20 20    int discard   
9c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c10: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 65 6c    /* True to del
9c20: 65 74 65 20 28 6e 6f 74 20 63 61 63 68 65 29 20  ete (not cache) 
9c30: 74 68 65 20 70 50 72 65 53 74 6d 74 20 2a 2f 0a  the pPreStmt */.
9c40: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f  ){.  int i;..  /
9c50: 2a 20 46 72 65 65 20 74 68 65 20 62 6f 75 6e 64  * Free the bound
9c60: 20 73 74 72 69 6e 67 20 61 6e 64 20 62 6c 6f 62   string and blob
9c70: 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20   parameters */. 
9c80: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 72 65   for(i=0; i<pPre
9c90: 53 74 6d 74 2d 3e 6e 50 61 72 6d 3b 20 69 2b 2b  Stmt->nParm; i++
9ca0: 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52  ){.    Tcl_DecrR
9cb0: 65 66 43 6f 75 6e 74 28 70 50 72 65 53 74 6d 74  efCount(pPreStmt
9cc0: 2d 3e 61 70 50 61 72 6d 5b 69 5d 29 3b 0a 20 20  ->apParm[i]);.  
9cd0: 7d 0a 20 20 70 50 72 65 53 74 6d 74 2d 3e 6e 50  }.  pPreStmt->nP
9ce0: 61 72 6d 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  arm = 0;..  if( 
9cf0: 70 44 62 2d 3e 6d 61 78 53 74 6d 74 3c 3d 30 20  pDb->maxStmt<=0 
9d00: 7c 7c 20 64 69 73 63 61 72 64 20 29 7b 0a 20 20  || discard ){.  
9d10: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 63 68    /* If the cach
9d20: 65 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66 2c  e is turned off,
9d30: 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 74 68 65   deallocated the
9d40: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
9d50: 20 20 64 62 46 72 65 65 53 74 6d 74 28 70 50 72    dbFreeStmt(pPr
9d60: 65 53 74 6d 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  eStmt);.  }else{
9d70: 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20  .    /* Add the 
9d80: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
9d90: 6e 74 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  nt to the beginn
9da0: 69 6e 67 20 6f 66 20 74 68 65 20 63 61 63 68 65  ing of the cache
9db0: 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 20 20 70 50   list. */.    pP
9dc0: 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 20 3d 20  reStmt->pNext = 
9dd0: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 3b 0a 20  pDb->stmtList;. 
9de0: 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72     pPreStmt->pPr
9df0: 65 76 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ev = 0;.    if( 
9e00: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 29 7b  pDb->stmtList ){
9e10: 0a 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c  .     pDb->stmtL
9e20: 69 73 74 2d 3e 70 50 72 65 76 20 3d 20 70 50 72  ist->pPrev = pPr
9e30: 65 53 74 6d 74 3b 0a 20 20 20 20 7d 0a 20 20 20  eStmt;.    }.   
9e40: 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 3d   pDb->stmtList =
9e50: 20 70 50 72 65 53 74 6d 74 3b 0a 20 20 20 20 69   pPreStmt;.    i
9e60: 66 28 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74  f( pDb->stmtLast
9e70: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
9e80: 65 72 74 28 20 70 44 62 2d 3e 6e 53 74 6d 74 3d  ert( pDb->nStmt=
9e90: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 44 62 2d  =0 );.      pDb-
9ea0: 3e 73 74 6d 74 4c 61 73 74 20 3d 20 70 50 72 65  >stmtLast = pPre
9eb0: 53 74 6d 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Stmt;.    }else{
9ec0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9ed0: 44 62 2d 3e 6e 53 74 6d 74 3e 30 20 29 3b 0a 20  Db->nStmt>0 );. 
9ee0: 20 20 20 7d 0a 20 20 20 20 70 44 62 2d 3e 6e 53     }.    pDb->nS
9ef0: 74 6d 74 2b 2b 3b 0a 20 20 20 0a 20 20 20 20 2f  tmt++;.   .    /
9f00: 2a 20 49 66 20 77 65 20 68 61 76 65 20 74 6f 6f  * If we have too
9f10: 20 6d 61 6e 79 20 73 74 61 74 65 6d 65 6e 74 20   many statement 
9f20: 69 6e 20 63 61 63 68 65 2c 20 72 65 6d 6f 76 65  in cache, remove
9f30: 20 74 68 65 20 73 75 72 70 6c 75 73 20 66 72 6f   the surplus fro
9f40: 6d 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 6e  m .    ** the en
9f50: 64 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 6c  d of the cache l
9f60: 69 73 74 2e 20 20 2a 2f 0a 20 20 20 20 77 68 69  ist.  */.    whi
9f70: 6c 65 28 20 70 44 62 2d 3e 6e 53 74 6d 74 3e 70  le( pDb->nStmt>p
9f80: 44 62 2d 3e 6d 61 78 53 74 6d 74 20 29 7b 0a 20  Db->maxStmt ){. 
9f90: 20 20 20 20 20 53 71 6c 50 72 65 70 61 72 65 64       SqlPrepared
9fa0: 53 74 6d 74 20 2a 70 4c 61 73 74 20 3d 20 70 44  Stmt *pLast = pD
9fb0: 62 2d 3e 73 74 6d 74 4c 61 73 74 3b 0a 20 20 20  b->stmtLast;.   
9fc0: 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74     pDb->stmtLast
9fd0: 20 3d 20 70 4c 61 73 74 2d 3e 70 50 72 65 76 3b   = pLast->pPrev;
9fe0: 0a 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74  .      pDb->stmt
9ff0: 4c 61 73 74 2d 3e 70 4e 65 78 74 20 3d 20 30 3b  Last->pNext = 0;
a000: 0a 20 20 20 20 20 20 70 44 62 2d 3e 6e 53 74 6d  .      pDb->nStm
a010: 74 2d 2d 3b 0a 20 20 20 20 20 20 64 62 46 72 65  t--;.      dbFre
a020: 65 53 74 6d 74 28 70 4c 61 73 74 29 3b 0a 20 20  eStmt(pLast);.  
a030: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
a040: 20 53 74 72 75 63 74 75 72 65 20 75 73 65 64 20   Structure used 
a050: 77 69 74 68 20 64 62 45 76 61 6c 58 58 58 28 29  with dbEvalXXX()
a060: 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a   functions:.**.*
a070: 2a 20 20 20 64 62 45 76 61 6c 49 6e 69 74 28 29  *   dbEvalInit()
a080: 0a 2a 2a 20 20 20 64 62 45 76 61 6c 53 74 65 70  .**   dbEvalStep
a090: 28 29 0a 2a 2a 20 20 20 64 62 45 76 61 6c 46 69  ().**   dbEvalFi
a0a0: 6e 61 6c 69 7a 65 28 29 0a 2a 2a 20 20 20 64 62  nalize().**   db
a0b0: 45 76 61 6c 52 6f 77 49 6e 66 6f 28 29 0a 2a 2a  EvalRowInfo().**
a0c0: 20 20 20 64 62 45 76 61 6c 43 6f 6c 75 6d 6e 56     dbEvalColumnV
a0d0: 61 6c 75 65 28 29 0a 2a 2f 0a 74 79 70 65 64 65  alue().*/.typede
a0e0: 66 20 73 74 72 75 63 74 20 44 62 45 76 61 6c 43  f struct DbEvalC
a0f0: 6f 6e 74 65 78 74 20 44 62 45 76 61 6c 43 6f 6e  ontext DbEvalCon
a100: 74 65 78 74 3b 0a 73 74 72 75 63 74 20 44 62 45  text;.struct DbE
a110: 76 61 6c 43 6f 6e 74 65 78 74 20 7b 0a 20 20 53  valContext {.  S
a120: 71 6c 69 74 65 44 62 20 2a 70 44 62 3b 20 20 20  qliteDb *pDb;   
a130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a140: 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * Database handl
a150: 65 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  e */.  Tcl_Obj *
a160: 70 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20  pSql;           
a170: 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74         /* Object
a180: 20 68 6f 6c 64 69 6e 67 20 73 74 72 69 6e 67 20   holding string 
a190: 7a 53 71 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  zSql */.  const 
a1a0: 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20  char *zSql;     
a1b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d            /* Rem
a1c0: 61 69 6e 69 6e 67 20 53 51 4c 20 74 6f 20 65 78  aining SQL to ex
a1d0: 65 63 75 74 65 20 2a 2f 0a 20 20 53 71 6c 50 72  ecute */.  SqlPr
a1e0: 65 70 61 72 65 64 53 74 6d 74 20 2a 70 50 72 65  eparedStmt *pPre
a1f0: 53 74 6d 74 3b 20 20 20 20 20 20 2f 2a 20 43 75  Stmt;      /* Cu
a200: 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20  rrent statement 
a210: 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20  */.  int nCol;  
a220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a230: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
a240: 66 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e  f columns return
a250: 65 64 20 62 79 20 70 53 74 6d 74 20 2a 2f 0a 20  ed by pStmt */. 
a260: 20 54 63 6c 5f 4f 62 6a 20 2a 70 41 72 72 61 79   Tcl_Obj *pArray
a270: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a280: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 72 72 61   /* Name of arra
a290: 79 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  y variable */.  
a2a0: 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 43 6f 6c 4e  Tcl_Obj **apColN
a2b0: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
a2c0: 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 6f 6c 75  /* Array of colu
a2d0: 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 7d 3b 0a 0a  mn names */.};..
a2e0: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e  /*.** Release an
a2f0: 79 20 63 61 63 68 65 20 6f 66 20 63 6f 6c 75 6d  y cache of colum
a300: 6e 20 6e 61 6d 65 73 20 63 75 72 72 65 6e 74 6c  n names currentl
a310: 79 20 68 65 6c 64 20 61 73 20 70 61 72 74 20 6f  y held as part o
a320: 66 0a 2a 2a 20 74 68 65 20 44 62 45 76 61 6c 43  f.** the DbEvalC
a330: 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75 72 65  ontext structure
a340: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
a350: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  irst argument..*
a360: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 62  /.static void db
a370: 52 65 6c 65 61 73 65 43 6f 6c 75 6d 6e 4e 61 6d  ReleaseColumnNam
a380: 65 73 28 44 62 45 76 61 6c 43 6f 6e 74 65 78 74  es(DbEvalContext
a390: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61   *p){.  if( p->a
a3a0: 70 43 6f 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20  pColName ){.    
a3b0: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
a3c0: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  =0; i<p->nCol; i
a3d0: 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44  ++){.      Tcl_D
a3e0: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 61  ecrRefCount(p->a
a3f0: 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20  pColName[i]);.  
a400: 20 20 7d 0a 20 20 20 20 54 63 6c 5f 46 72 65 65    }.    Tcl_Free
a410: 28 28 63 68 61 72 20 2a 29 70 2d 3e 61 70 43 6f  ((char *)p->apCo
a420: 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 61  lName);.    p->a
a430: 70 43 6f 6c 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  pColName = 0;.  
a440: 7d 0a 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  }.  p->nCol = 0;
a450: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
a460: 6c 69 7a 65 20 61 20 44 62 45 76 61 6c 43 6f 6e  lize a DbEvalCon
a470: 74 65 78 74 20 73 74 72 75 63 74 75 72 65 2e 0a  text structure..
a480: 2a 2a 0a 2a 2a 20 49 66 20 70 41 72 72 61 79 20  **.** If pArray 
a490: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
a4a0: 6e 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  n it contains th
a4b0: 65 20 6e 61 6d 65 20 6f 66 20 61 20 54 63 6c 20  e name of a Tcl 
a4c0: 61 72 72 61 79 0a 2a 2a 20 76 61 72 69 61 62 6c  array.** variabl
a4d0: 65 2e 20 54 68 65 20 22 2a 22 20 6d 65 6d 62 65  e. The "*" membe
a4e0: 72 20 6f 66 20 74 68 69 73 20 61 72 72 61 79 20  r of this array 
a4f0: 69 73 20 73 65 74 20 74 6f 20 61 20 6c 69 73 74  is set to a list
a500: 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 74   containing.** t
a510: 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20  he names of the 
a520: 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64  columns returned
a530: 20 62 79 20 74 68 65 20 73 74 61 74 65 6d 65 6e   by the statemen
a540: 74 20 61 73 20 70 61 72 74 20 6f 66 20 65 61 63  t as part of eac
a550: 68 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 64 62 45  h.** call to dbE
a560: 76 61 6c 53 74 65 70 28 29 2c 20 69 6e 20 6f 72  valStep(), in or
a570: 64 65 72 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f  der from left to
a580: 20 72 69 67 68 74 2e 20 65 2e 67 2e 20 69 66 20   right. e.g. if 
a590: 74 68 65 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66  the names .** of
a5a0: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 63 6f   the returned co
a5b0: 6c 75 6d 6e 73 20 61 72 65 20 61 2c 20 62 20 61  lumns are a, b a
a5c0: 6e 64 20 63 2c 20 69 74 20 64 6f 65 73 20 74 68  nd c, it does th
a5d0: 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6f 66 20  e equivalent of 
a5e0: 74 68 65 20 0a 2a 2a 20 74 63 6c 20 63 6f 6d 6d  the .** tcl comm
a5f0: 61 6e 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73  and:.**.**     s
a600: 65 74 20 24 7b 70 41 72 72 61 79 7d 28 2a 29 20  et ${pArray}(*) 
a610: 7b 61 20 62 20 63 7d 0a 2a 2f 0a 73 74 61 74 69  {a b c}.*/.stati
a620: 63 20 76 6f 69 64 20 64 62 45 76 61 6c 49 6e 69  c void dbEvalIni
a630: 74 28 0a 20 20 44 62 45 76 61 6c 43 6f 6e 74 65  t(.  DbEvalConte
a640: 78 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  xt *p,          
a650: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
a660: 74 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  to structure to 
a670: 69 6e 69 74 69 61 6c 69 7a 65 20 2a 2f 0a 20 20  initialize */.  
a680: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 2c 20 20  SqliteDb *pDb,  
a690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6a0: 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64  /* Database hand
a6b0: 6c 65 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  le */.  Tcl_Obj 
a6c0: 2a 70 53 71 6c 2c 20 20 20 20 20 20 20 20 20 20  *pSql,          
a6d0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63          /* Objec
a6e0: 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 53 51 4c  t containing SQL
a6f0: 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 54 63 6c   script */.  Tcl
a700: 5f 4f 62 6a 20 2a 70 41 72 72 61 79 20 20 20 20  _Obj *pArray    
a710: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a720: 4e 61 6d 65 20 6f 66 20 54 63 6c 20 61 72 72 61  Name of Tcl arra
a730: 79 20 74 6f 20 73 65 74 20 28 2a 29 20 65 6c 65  y to set (*) ele
a740: 6d 65 6e 74 20 6f 66 20 2a 2f 0a 29 7b 0a 20 20  ment of */.){.  
a750: 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a  memset(p, 0, siz
a760: 65 6f 66 28 44 62 45 76 61 6c 43 6f 6e 74 65 78  eof(DbEvalContex
a770: 74 29 29 3b 0a 20 20 70 2d 3e 70 44 62 20 3d 20  t));.  p->pDb = 
a780: 70 44 62 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20 3d  pDb;.  p->zSql =
a790: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 70   Tcl_GetString(p
a7a0: 53 71 6c 29 3b 0a 20 20 70 2d 3e 70 53 71 6c 20  Sql);.  p->pSql 
a7b0: 3d 20 70 53 71 6c 3b 0a 20 20 54 63 6c 5f 49 6e  = pSql;.  Tcl_In
a7c0: 63 72 52 65 66 43 6f 75 6e 74 28 70 53 71 6c 29  crRefCount(pSql)
a7d0: 3b 0a 20 20 69 66 28 20 70 41 72 72 61 79 20 29  ;.  if( pArray )
a7e0: 7b 0a 20 20 20 20 70 2d 3e 70 41 72 72 61 79 20  {.    p->pArray 
a7f0: 3d 20 70 41 72 72 61 79 3b 0a 20 20 20 20 54 63  = pArray;.    Tc
a800: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
a810: 41 72 72 61 79 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Array);.  }.}../
a820: 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 69 6e 66 6f  *.** Obtain info
a830: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
a840: 65 20 72 6f 77 20 74 68 61 74 20 74 68 65 20 44  e row that the D
a850: 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 70 61 73  bEvalContext pas
a860: 73 65 64 20 61 73 20 74 68 65 0a 2a 2a 20 66 69  sed as the.** fi
a870: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 63 75 72  rst argument cur
a880: 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
a890: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a8a0: 20 64 62 45 76 61 6c 52 6f 77 49 6e 66 6f 28 0a   dbEvalRowInfo(.
a8b0: 20 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20    DbEvalContext 
a8c0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
a8d0: 20 20 2f 2a 20 45 76 61 6c 75 61 74 69 6f 6e 20    /* Evaluation 
a8e0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
a8f0: 20 2a 70 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20   *pnCol,        
a900: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a910: 4f 55 54 3a 20 4e 75 6d 62 65 72 20 6f 66 20 63  OUT: Number of c
a920: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20  olumn names */. 
a930: 20 54 63 6c 5f 4f 62 6a 20 2a 2a 2a 70 61 70 43   Tcl_Obj ***papC
a940: 6f 6c 4e 61 6d 65 20 20 20 20 20 20 20 20 20 20  olName          
a950: 20 2f 2a 20 4f 55 54 3a 20 41 72 72 61 79 20 6f   /* OUT: Array o
a960: 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a  f column names *
a970: 2f 0a 29 7b 0a 20 20 2f 2a 20 43 6f 6d 70 75 74  /.){.  /* Comput
a980: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a  e column names *
a990: 2f 0a 20 20 69 66 28 20 30 3d 3d 70 2d 3e 61 70  /.  if( 0==p->ap
a9a0: 43 6f 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73  ColName ){.    s
a9b0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
a9c0: 6d 74 20 3d 20 70 2d 3e 70 50 72 65 53 74 6d 74  mt = p->pPreStmt
a9d0: 2d 3e 70 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74  ->pStmt;.    int
a9e0: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
a9f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
aa00: 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20  erator variable 
aa10: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b  */.    int nCol;
aa20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa30: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
aa40: 66 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e  f columns return
aa50: 65 64 20 62 79 20 70 53 74 6d 74 20 2a 2f 0a 20  ed by pStmt */. 
aa60: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 43     Tcl_Obj **apC
aa70: 6f 6c 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  olName = 0;     
aa80: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 6f 6c   /* Array of col
aa90: 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 0a 20 20  umn names */..  
aaa0: 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c    p->nCol = nCol
aab0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
aac0: 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a  n_count(pStmt);.
aad0: 20 20 20 20 69 66 28 20 6e 43 6f 6c 3e 30 20 26      if( nCol>0 &
aae0: 26 20 28 70 61 70 43 6f 6c 4e 61 6d 65 20 7c 7c  & (papColName ||
aaf0: 20 70 2d 3e 70 41 72 72 61 79 29 20 29 7b 0a 20   p->pArray) ){. 
ab00: 20 20 20 20 20 61 70 43 6f 6c 4e 61 6d 65 20 3d       apColName =
ab10: 20 28 54 63 6c 5f 4f 62 6a 2a 2a 29 54 63 6c 5f   (Tcl_Obj**)Tcl_
ab20: 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54 63  Alloc( sizeof(Tc
ab30: 6c 5f 4f 62 6a 2a 29 2a 6e 43 6f 6c 20 29 3b 0a  l_Obj*)*nCol );.
ab40: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
ab50: 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
ab60: 20 20 20 20 20 61 70 43 6f 6c 4e 61 6d 65 5b 69       apColName[i
ab70: 5d 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  ] = Tcl_NewStrin
ab80: 67 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 6f 6c  gObj(sqlite3_col
ab90: 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69  umn_name(pStmt,i
aba0: 29 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  ), -1);.        
abb0: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
abc0: 28 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a  (apColName[i]);.
abd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d        }.      p-
abe0: 3e 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 61 70 43  >apColName = apC
abf0: 6f 6c 4e 61 6d 65 3b 0a 20 20 20 20 7d 0a 0a 20  olName;.    }.. 
ac00: 20 20 20 2f 2a 20 49 66 20 72 65 73 75 6c 74 73     /* If results
ac10: 20 61 72 65 20 62 65 69 6e 67 20 73 74 6f 72 65   are being store
ac20: 64 20 69 6e 20 61 6e 20 61 72 72 61 79 20 76 61  d in an array va
ac30: 72 69 61 62 6c 65 2c 20 74 68 65 6e 20 63 72 65  riable, then cre
ac40: 61 74 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 61  ate.    ** the a
ac50: 72 72 61 79 28 2a 29 20 65 6e 74 72 79 20 66 6f  rray(*) entry fo
ac60: 72 20 74 68 61 74 20 61 72 72 61 79 0a 20 20 20  r that array.   
ac70: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70   */.    if( p->p
ac80: 41 72 72 61 79 20 29 7b 0a 20 20 20 20 20 20 54  Array ){.      T
ac90: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
aca0: 70 20 3d 20 70 2d 3e 70 44 62 2d 3e 69 6e 74 65  p = p->pDb->inte
acb0: 72 70 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62  rp;.      Tcl_Ob
acc0: 6a 20 2a 70 43 6f 6c 4c 69 73 74 20 3d 20 54 63  j *pColList = Tc
acd0: 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20  l_NewObj();.    
ace0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 74 61 72    Tcl_Obj *pStar
acf0: 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67   = Tcl_NewString
ad00: 4f 62 6a 28 22 2a 22 2c 20 2d 31 29 3b 0a 0a 20  Obj("*", -1);.. 
ad10: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
ad20: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
ad30: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
ad40: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
ad50: 65 72 70 2c 20 70 43 6f 6c 4c 69 73 74 2c 20 61  erp, pColList, a
ad60: 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20  pColName[i]);.  
ad70: 20 20 20 20 7d 0a 20 20 20 20 20 20 54 63 6c 5f      }.      Tcl_
ad80: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 53 74  IncrRefCount(pSt
ad90: 61 72 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f  ar);.      Tcl_O
ada0: 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72 70  bjSetVar2(interp
adb0: 2c 20 70 2d 3e 70 41 72 72 61 79 2c 20 70 53 74  , p->pArray, pSt
adc0: 61 72 2c 20 70 43 6f 6c 4c 69 73 74 2c 20 30 29  ar, pColList, 0)
add0: 3b 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72  ;.      Tcl_Decr
ade0: 52 65 66 43 6f 75 6e 74 28 70 53 74 61 72 29 3b  RefCount(pStar);
adf0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
ae00: 28 20 70 61 70 43 6f 6c 4e 61 6d 65 20 29 7b 0a  ( papColName ){.
ae10: 20 20 20 20 2a 70 61 70 43 6f 6c 4e 61 6d 65 20      *papColName 
ae20: 3d 20 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65 3b 0a  = p->apColName;.
ae30: 20 20 7d 0a 20 20 69 66 28 20 70 6e 43 6f 6c 20    }.  if( pnCol 
ae40: 29 7b 0a 20 20 20 20 2a 70 6e 43 6f 6c 20 3d 20  ){.    *pnCol = 
ae50: 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7d 0a 7d 0a 0a  p->nCol;.  }.}..
ae60: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6f 6e 65  /*.** Return one
ae70: 20 6f 66 20 54 43 4c 5f 4f 4b 2c 20 54 43 4c 5f   of TCL_OK, TCL_
ae80: 42 52 45 41 4b 20 6f 72 20 54 43 4c 5f 45 52 52  BREAK or TCL_ERR
ae90: 4f 52 2e 20 49 66 20 54 43 4c 5f 45 52 52 4f 52  OR. If TCL_ERROR
aea0: 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2c   is.** returned,
aeb0: 20 74 68 65 6e 20 61 6e 20 65 72 72 6f 72 20 6d   then an error m
aec0: 65 73 73 61 67 65 20 69 73 20 73 74 6f 72 65 64  essage is stored
aed0: 20 69 6e 20 74 68 65 20 69 6e 74 65 72 70 72 65   in the interpre
aee0: 74 65 72 20 62 65 66 6f 72 65 0a 2a 2a 20 72 65  ter before.** re
aef0: 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41  turning..**.** A
af00: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
af10: 20 54 43 4c 5f 4f 4b 20 6d 65 61 6e 73 20 74 68   TCL_OK means th
af20: 65 72 65 20 69 73 20 61 20 72 6f 77 20 6f 66 20  ere is a row of 
af30: 64 61 74 61 20 61 76 61 69 6c 61 62 6c 65 2e 20  data available. 
af40: 54 68 65 0a 2a 2a 20 64 61 74 61 20 6d 61 79 20  The.** data may 
af50: 62 65 20 61 63 63 65 73 73 65 64 20 75 73 69 6e  be accessed usin
af60: 67 20 64 62 45 76 61 6c 52 6f 77 49 6e 66 6f 28  g dbEvalRowInfo(
af70: 29 20 61 6e 64 20 64 62 45 76 61 6c 43 6f 6c 75  ) and dbEvalColu
af80: 6d 6e 56 61 6c 75 65 28 29 2e 20 54 68 69 73 0a  mnValue(). This.
af90: 2a 2a 20 69 73 20 61 6e 61 6c 6f 67 6f 75 73 20  ** is analogous 
afa0: 74 6f 20 61 20 72 65 74 75 72 6e 20 6f 66 20 53  to a return of S
afb0: 51 4c 49 54 45 5f 52 4f 57 20 66 72 6f 6d 20 73  QLITE_ROW from s
afc0: 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20 49  qlite3_step(). I
afd0: 66 20 54 43 4c 5f 42 52 45 41 4b 0a 2a 2a 20 69  f TCL_BREAK.** i
afe0: 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e  s returned, then
aff0: 20 74 68 65 20 53 51 4c 20 73 63 72 69 70 74 20   the SQL script 
b000: 68 61 73 20 66 69 6e 69 73 68 65 64 20 65 78 65  has finished exe
b010: 63 75 74 69 6e 67 20 61 6e 64 20 74 68 65 72 65  cuting and there
b020: 20 61 72 65 0a 2a 2a 20 6e 6f 20 66 75 72 74 68   are.** no furth
b030: 65 72 20 72 6f 77 73 20 61 76 61 69 6c 61 62 6c  er rows availabl
b040: 65 2e 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c  e. This is simil
b050: 61 72 20 74 6f 20 53 51 4c 49 54 45 5f 44 4f 4e  ar to SQLITE_DON
b060: 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  E..*/.static int
b070: 20 64 62 45 76 61 6c 53 74 65 70 28 44 62 45 76   dbEvalStep(DbEv
b080: 61 6c 43 6f 6e 74 65 78 74 20 2a 70 29 7b 0a 20  alContext *p){. 
b090: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 72   const char *zPr
b0a0: 65 76 53 71 6c 20 3d 20 30 3b 20 20 20 20 20 20  evSql = 0;      
b0b0: 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 76 61 6c   /* Previous val
b0c0: 75 65 20 6f 66 20 70 2d 3e 7a 53 71 6c 20 2a 2f  ue of p->zSql */
b0d0: 0a 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 7a 53  ..  while( p->zS
b0e0: 71 6c 5b 30 5d 20 7c 7c 20 70 2d 3e 70 50 72 65  ql[0] || p->pPre
b0f0: 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  Stmt ){.    int 
b100: 72 63 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  rc;.    if( p->p
b110: 50 72 65 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20  PreStmt==0 ){.  
b120: 20 20 20 20 7a 50 72 65 76 53 71 6c 20 3d 20 28      zPrevSql = (
b130: 70 2d 3e 7a 53 71 6c 3d 3d 7a 50 72 65 76 53 71  p->zSql==zPrevSq
b140: 6c 20 3f 20 30 20 3a 20 70 2d 3e 7a 53 71 6c 29  l ? 0 : p->zSql)
b150: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 64 62 50  ;.      rc = dbP
b160: 72 65 70 61 72 65 41 6e 64 42 69 6e 64 28 70 2d  repareAndBind(p-
b170: 3e 70 44 62 2c 20 70 2d 3e 7a 53 71 6c 2c 20 26  >pDb, p->zSql, &
b180: 70 2d 3e 7a 53 71 6c 2c 20 26 70 2d 3e 70 50 72  p->zSql, &p->pPr
b190: 65 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 69 66  eStmt);.      if
b1a0: 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 20 72  ( rc!=TCL_OK ) r
b1b0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 65  eturn rc;.    }e
b1c0: 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  lse{.      int r
b1d0: 63 73 3b 0a 20 20 20 20 20 20 53 71 6c 69 74 65  cs;.      Sqlite
b1e0: 44 62 20 2a 70 44 62 20 3d 20 70 2d 3e 70 44 62  Db *pDb = p->pDb
b1f0: 3b 0a 20 20 20 20 20 20 53 71 6c 50 72 65 70 61  ;.      SqlPrepa
b200: 72 65 64 53 74 6d 74 20 2a 70 50 72 65 53 74 6d  redStmt *pPreStm
b210: 74 20 3d 20 70 2d 3e 70 50 72 65 53 74 6d 74 3b  t = p->pPreStmt;
b220: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
b230: 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 70 50 72  tmt *pStmt = pPr
b240: 65 53 74 6d 74 2d 3e 70 53 74 6d 74 3b 0a 0a 20  eStmt->pStmt;.. 
b250: 20 20 20 20 20 72 63 73 20 3d 20 73 71 6c 69 74       rcs = sqlit
b260: 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a  e3_step(pStmt);.
b270: 20 20 20 20 20 20 69 66 28 20 72 63 73 3d 3d 53        if( rcs==S
b280: 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
b290: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
b2a0: 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
b2b0: 20 20 69 66 28 20 70 2d 3e 70 41 72 72 61 79 20    if( p->pArray 
b2c0: 29 7b 0a 20 20 20 20 20 20 20 20 64 62 45 76 61  ){.        dbEva
b2d0: 6c 52 6f 77 49 6e 66 6f 28 70 2c 20 30 2c 20 30  lRowInfo(p, 0, 0
b2e0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
b2f0: 20 72 63 73 20 3d 20 73 71 6c 69 74 65 33 5f 72   rcs = sqlite3_r
b300: 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 0a 20 20  eset(pStmt);..  
b310: 20 20 20 20 70 44 62 2d 3e 6e 53 74 65 70 20 3d      pDb->nStep =
b320: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74   sqlite3_stmt_st
b330: 61 74 75 73 28 70 53 74 6d 74 2c 53 51 4c 49 54  atus(pStmt,SQLIT
b340: 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c  E_STMTSTATUS_FUL
b350: 4c 53 43 41 4e 5f 53 54 45 50 2c 31 29 3b 0a 20  LSCAN_STEP,1);. 
b360: 20 20 20 20 20 70 44 62 2d 3e 6e 53 6f 72 74 20       pDb->nSort 
b370: 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73  = sqlite3_stmt_s
b380: 74 61 74 75 73 28 70 53 74 6d 74 2c 53 51 4c 49  tatus(pStmt,SQLI
b390: 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 53 4f  TE_STMTSTATUS_SO
b3a0: 52 54 2c 31 29 3b 0a 20 20 20 20 20 20 70 44 62  RT,1);.      pDb
b3b0: 2d 3e 6e 49 6e 64 65 78 20 3d 20 73 71 6c 69 74  ->nIndex = sqlit
b3c0: 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70  e3_stmt_status(p
b3d0: 53 74 6d 74 2c 53 51 4c 49 54 45 5f 53 54 4d 54  Stmt,SQLITE_STMT
b3e0: 53 54 41 54 55 53 5f 41 55 54 4f 49 4e 44 45 58  STATUS_AUTOINDEX
b3f0: 2c 31 29 3b 0a 20 20 20 20 20 20 64 62 52 65 6c  ,1);.      dbRel
b400: 65 61 73 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  easeColumnNames(
b410: 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  p);.      p->pPr
b420: 65 53 74 6d 74 20 3d 20 30 3b 0a 0a 20 20 20 20  eStmt = 0;..    
b430: 20 20 69 66 28 20 72 63 73 21 3d 53 51 4c 49 54    if( rcs!=SQLIT
b440: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
b450: 2f 2a 20 49 66 20 61 20 72 75 6e 2d 74 69 6d 65  /* If a run-time
b460: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
b470: 65 70 6f 72 74 20 74 68 65 20 65 72 72 6f 72 20  eport the error 
b480: 61 6e 64 20 73 74 6f 70 20 72 65 61 64 69 6e 67  and stop reading
b490: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
b4a0: 53 51 4c 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  SQL.  */.       
b4b0: 20 64 62 52 65 6c 65 61 73 65 53 74 6d 74 28 70   dbReleaseStmt(p
b4c0: 44 62 2c 20 70 50 72 65 53 74 6d 74 2c 20 31 29  Db, pPreStmt, 1)
b4d0: 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 53  ;.#if SQLITE_TES
b4e0: 54 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  T.        if( p-
b4f0: 3e 70 44 62 2d 3e 62 4c 65 67 61 63 79 50 72 65  >pDb->bLegacyPre
b500: 70 61 72 65 20 26 26 20 72 63 73 3d 3d 53 51 4c  pare && rcs==SQL
b510: 49 54 45 5f 53 43 48 45 4d 41 20 26 26 20 7a 50  ITE_SCHEMA && zP
b520: 72 65 76 53 71 6c 20 29 7b 0a 20 20 20 20 20 20  revSql ){.      
b530: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 75      /* If the ru
b540: 6e 74 69 6d 65 20 65 72 72 6f 72 20 77 61 73 20  ntime error was 
b550: 61 6e 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41  an SQLITE_SCHEMA
b560: 2c 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  , and the databa
b570: 73 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  se.          ** 
b580: 68 61 6e 64 6c 65 20 69 73 20 63 6f 6e 66 69 67  handle is config
b590: 75 72 65 64 20 74 6f 20 75 73 65 20 74 68 65 20  ured to use the 
b5a0: 6c 65 67 61 63 79 20 73 71 6c 69 74 65 33 5f 70  legacy sqlite3_p
b5b0: 72 65 70 61 72 65 28 29 20 0a 20 20 20 20 20 20  repare() .      
b5c0: 20 20 20 20 2a 2a 20 69 6e 74 65 72 66 61 63 65      ** interface
b5d0: 2c 20 72 65 74 72 79 20 70 72 65 70 61 72 65 28  , retry prepare(
b5e0: 29 2f 73 74 65 70 28 29 20 6f 6e 20 74 68 65 20  )/step() on the 
b5f0: 73 61 6d 65 20 53 51 4c 20 73 74 61 74 65 6d 65  same SQL stateme
b600: 6e 74 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  nt..          **
b610: 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65   This only happe
b620: 6e 73 20 6f 6e 63 65 2e 20 49 66 20 74 68 65 72  ns once. If ther
b630: 65 20 69 73 20 61 20 73 65 63 6f 6e 64 20 53 51  e is a second SQ
b640: 4c 49 54 45 5f 53 43 48 45 4d 41 0a 20 20 20 20  LITE_SCHEMA.    
b650: 20 20 20 20 20 20 2a 2a 20 65 72 72 6f 72 2c 20        ** error, 
b660: 74 68 65 20 65 72 72 6f 72 20 77 69 6c 6c 20 62  the error will b
b670: 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  e returned to th
b680: 65 20 63 61 6c 6c 65 72 2e 20 2a 2f 0a 20 20 20  e caller. */.   
b690: 20 20 20 20 20 20 20 70 2d 3e 7a 53 71 6c 20 3d         p->zSql =
b6a0: 20 7a 50 72 65 76 53 71 6c 3b 0a 20 20 20 20 20   zPrevSql;.     
b6b0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
b6c0: 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
b6d0: 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f          Tcl_SetO
b6e0: 62 6a 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e  bjResult(pDb->in
b6f0: 74 65 72 70 2c 0a 20 20 20 20 20 20 20 20 20 20  terp,.          
b700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
b710: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
b720: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
b730: 44 62 2d 3e 64 62 29 2c 20 2d 31 29 29 3b 0a 20  Db->db), -1));. 
b740: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
b750: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  L_ERROR;.      }
b760: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 64 62  else{.        db
b770: 52 65 6c 65 61 73 65 53 74 6d 74 28 70 44 62 2c  ReleaseStmt(pDb,
b780: 20 70 50 72 65 53 74 6d 74 2c 20 30 29 3b 0a 20   pPreStmt, 0);. 
b790: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
b7a0: 0a 0a 20 20 2f 2a 20 46 69 6e 69 73 68 65 64 20  ..  /* Finished 
b7b0: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  */.  return TCL_
b7c0: 42 52 45 41 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  BREAK;.}../*.** 
b7d0: 46 72 65 65 20 61 6c 6c 20 72 65 73 6f 75 72 63  Free all resourc
b7e0: 65 73 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c  es currently hel
b7f0: 64 20 62 79 20 74 68 65 20 44 62 45 76 61 6c 43  d by the DbEvalC
b800: 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75 72 65  ontext structure
b810: 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68   passed.** as th
b820: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
b830: 2e 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62  . There should b
b840: 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 63 61  e exactly one ca
b850: 6c 6c 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ll to this funct
b860: 69 6f 6e 0a 2a 2a 20 66 6f 72 20 65 61 63 68 20  ion.** for each 
b870: 63 61 6c 6c 20 74 6f 20 64 62 45 76 61 6c 49 6e  call to dbEvalIn
b880: 69 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  it()..*/.static 
b890: 76 6f 69 64 20 64 62 45 76 61 6c 46 69 6e 61 6c  void dbEvalFinal
b8a0: 69 7a 65 28 44 62 45 76 61 6c 43 6f 6e 74 65 78  ize(DbEvalContex
b8b0: 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  t *p){.  if( p->
b8c0: 70 50 72 65 53 74 6d 74 20 29 7b 0a 20 20 20 20  pPreStmt ){.    
b8d0: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 2d  sqlite3_reset(p-
b8e0: 3e 70 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74  >pPreStmt->pStmt
b8f0: 29 3b 0a 20 20 20 20 64 62 52 65 6c 65 61 73 65  );.    dbRelease
b900: 53 74 6d 74 28 70 2d 3e 70 44 62 2c 20 70 2d 3e  Stmt(p->pDb, p->
b910: 70 50 72 65 53 74 6d 74 2c 20 30 29 3b 0a 20 20  pPreStmt, 0);.  
b920: 20 20 70 2d 3e 70 50 72 65 53 74 6d 74 20 3d 20    p->pPreStmt = 
b930: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  0;.  }.  if( p->
b940: 70 41 72 72 61 79 20 29 7b 0a 20 20 20 20 54 63  pArray ){.    Tc
b950: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
b960: 2d 3e 70 41 72 72 61 79 29 3b 0a 20 20 20 20 70  ->pArray);.    p
b970: 2d 3e 70 41 72 72 61 79 20 3d 20 30 3b 0a 20 20  ->pArray = 0;.  
b980: 7d 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43  }.  Tcl_DecrRefC
b990: 6f 75 6e 74 28 70 2d 3e 70 53 71 6c 29 3b 0a 20  ount(p->pSql);. 
b9a0: 20 64 62 52 65 6c 65 61 73 65 43 6f 6c 75 6d 6e   dbReleaseColumn
b9b0: 4e 61 6d 65 73 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  Names(p);.}../*.
b9c0: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
b9d0: 74 65 72 20 74 6f 20 61 20 54 63 6c 5f 4f 62 6a  ter to a Tcl_Obj
b9e0: 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68 20   structure with 
b9f0: 72 65 66 2d 63 6f 75 6e 74 20 30 20 74 68 61 74  ref-count 0 that
ba00: 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65   contains.** the
ba10: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 69   value for the i
ba20: 43 6f 6c 27 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  Col'th column of
ba30: 20 74 68 65 20 72 6f 77 20 63 75 72 72 65 6e 74   the row current
ba40: 6c 79 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ly pointed to by
ba50: 0a 2a 2a 20 74 68 65 20 44 62 45 76 61 6c 43 6f  .** the DbEvalCo
ba60: 6e 74 65 78 74 20 73 74 72 75 63 74 75 72 65 20  ntext structure 
ba70: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
ba80: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  rst argument..*/
ba90: 0a 73 74 61 74 69 63 20 54 63 6c 5f 4f 62 6a 20  .static Tcl_Obj 
baa0: 2a 64 62 45 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c  *dbEvalColumnVal
bab0: 75 65 28 44 62 45 76 61 6c 43 6f 6e 74 65 78 74  ue(DbEvalContext
bac0: 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a   *p, int iCol){.
bad0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
bae0: 70 53 74 6d 74 20 3d 20 70 2d 3e 70 50 72 65 53  pStmt = p->pPreS
baf0: 74 6d 74 2d 3e 70 53 74 6d 74 3b 0a 20 20 73 77  tmt->pStmt;.  sw
bb00: 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f 63 6f  itch( sqlite3_co
bb10: 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c  lumn_type(pStmt,
bb20: 20 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 63 61   iCol) ){.    ca
bb30: 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20  se SQLITE_BLOB: 
bb40: 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 79 74 65  {.      int byte
bb50: 73 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  s = sqlite3_colu
bb60: 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20  mn_bytes(pStmt, 
bb70: 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 63 6f 6e  iCol);.      con
bb80: 73 74 20 63 68 61 72 20 2a 7a 42 6c 6f 62 20 3d  st char *zBlob =
bb90: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
bba0: 62 6c 6f 62 28 70 53 74 6d 74 2c 20 69 43 6f 6c  blob(pStmt, iCol
bbb0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 42  );.      if( !zB
bbc0: 6c 6f 62 20 29 20 62 79 74 65 73 20 3d 20 30 3b  lob ) bytes = 0;
bbd0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 63  .      return Tc
bbe0: 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62  l_NewByteArrayOb
bbf0: 6a 28 28 75 38 2a 29 7a 42 6c 6f 62 2c 20 62 79  j((u8*)zBlob, by
bc00: 74 65 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tes);.    }.    
bc10: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45  case SQLITE_INTE
bc20: 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  GER: {.      sql
bc30: 69 74 65 5f 69 6e 74 36 34 20 76 20 3d 20 73 71  ite_int64 v = sq
bc40: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
bc50: 36 34 28 70 53 74 6d 74 2c 20 69 43 6f 6c 29 3b  64(pStmt, iCol);
bc60: 0a 20 20 20 20 20 20 69 66 28 20 76 3e 3d 2d 32  .      if( v>=-2
bc70: 31 34 37 34 38 33 36 34 37 20 26 26 20 76 3c 3d  147483647 && v<=
bc80: 32 31 34 37 34 38 33 36 34 37 20 29 7b 0a 20 20  2147483647 ){.  
bc90: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c        return Tcl
bca0: 5f 4e 65 77 49 6e 74 4f 62 6a 28 28 69 6e 74 29  _NewIntObj((int)
bcb0: 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  v);.      }else{
bcc0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
bcd0: 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62  Tcl_NewWideIntOb
bce0: 6a 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  j(v);.      }.  
bcf0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
bd00: 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20  ITE_FLOAT: {.   
bd10: 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e 65     return Tcl_Ne
bd20: 77 44 6f 75 62 6c 65 4f 62 6a 28 73 71 6c 69 74  wDoubleObj(sqlit
bd30: 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65  e3_column_double
bd40: 28 70 53 74 6d 74 2c 20 69 43 6f 6c 29 29 3b 0a  (pStmt, iCol));.
bd50: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
bd60: 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20  QLITE_NULL: {.  
bd70: 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e      return Tcl_N
bd80: 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 2d 3e 70  ewStringObj(p->p
bd90: 44 62 2d 3e 7a 4e 75 6c 6c 2c 20 2d 31 29 3b 0a  Db->zNull, -1);.
bda0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
bdb0: 75 72 6e 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  urn Tcl_NewStrin
bdc0: 67 4f 62 6a 28 28 63 68 61 72 2a 29 73 71 6c 69  gObj((char*)sqli
bdd0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
bde0: 70 53 74 6d 74 2c 20 69 43 6f 6c 29 2c 20 2d 31  pStmt, iCol), -1
bdf0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 75  );.}../*.** If u
be00: 73 69 6e 67 20 54 63 6c 20 76 65 72 73 69 6f 6e  sing Tcl version
be10: 20 38 2e 36 20 6f 72 20 67 72 65 61 74 65 72 2c   8.6 or greater,
be20: 20 75 73 65 20 74 68 65 20 4e 52 20 66 75 6e 63   use the NR func
be30: 74 69 6f 6e 73 20 74 6f 20 61 76 6f 69 64 0a 2a  tions to avoid.*
be40: 2a 20 72 65 63 75 72 73 69 76 65 20 65 76 61 6c  * recursive eval
be50: 75 74 69 6f 6e 20 6f 66 20 73 63 72 69 70 74 73  ution of scripts
be60: 20 62 79 20 74 68 65 20 5b 64 62 20 65 76 61 6c   by the [db eval
be70: 5d 20 61 6e 64 20 5b 64 62 20 74 72 61 6e 73 5d  ] and [db trans]
be80: 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 73 2e 20 45 76  .** commands. Ev
be90: 65 6e 20 69 66 20 74 68 65 20 68 65 61 64 65 72  en if the header
bea0: 73 20 75 73 65 64 20 77 68 69 6c 65 20 63 6f 6d  s used while com
beb0: 70 69 6c 69 6e 67 20 74 68 65 20 65 78 74 65 6e  piling the exten
bec0: 73 69 6f 6e 0a 2a 2a 20 61 72 65 20 38 2e 36 20  sion.** are 8.6 
bed0: 6f 72 20 6e 65 77 65 72 2c 20 74 68 65 20 63 6f  or newer, the co
bee0: 64 65 20 73 74 69 6c 6c 20 74 65 73 74 73 20 74  de still tests t
bef0: 68 65 20 54 63 6c 20 76 65 72 73 69 6f 6e 20 61  he Tcl version a
bf00: 74 20 72 75 6e 74 69 6d 65 2e 0a 2a 2a 20 54 68  t runtime..** Th
bf10: 69 73 20 61 6c 6c 6f 77 73 20 73 74 75 62 73 2d  is allows stubs-
bf20: 65 6e 61 62 6c 65 64 20 62 75 69 6c 64 73 20 74  enabled builds t
bf30: 6f 20 62 65 20 75 73 65 64 20 77 69 74 68 20 6f  o be used with o
bf40: 6c 64 65 72 20 54 63 6c 20 6c 69 62 72 61 72 69  lder Tcl librari
bf50: 65 73 2e 0a 2a 2f 0a 23 69 66 20 54 43 4c 5f 4d  es..*/.#if TCL_M
bf60: 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 3e 38 20 7c  AJOR_VERSION>8 |
bf70: 7c 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52  | (TCL_MAJOR_VER
bf80: 53 49 4f 4e 3d 3d 38 20 26 26 20 54 43 4c 5f 4d  SION==8 && TCL_M
bf90: 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 3e 3d 36 29  INOR_VERSION>=6)
bfa0: 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
bfb0: 5f 54 43 4c 5f 4e 52 45 20 31 0a 73 74 61 74 69  _TCL_NRE 1.stati
bfc0: 63 20 69 6e 74 20 44 62 55 73 65 4e 72 65 28 76  c int DbUseNre(v
bfd0: 6f 69 64 29 7b 0a 20 20 69 6e 74 20 6d 61 6a 6f  oid){.  int majo
bfe0: 72 2c 20 6d 69 6e 6f 72 3b 0a 20 20 54 63 6c 5f  r, minor;.  Tcl_
bff0: 47 65 74 56 65 72 73 69 6f 6e 28 26 6d 61 6a 6f  GetVersion(&majo
c000: 72 2c 20 26 6d 69 6e 6f 72 2c 20 30 2c 20 30 29  r, &minor, 0, 0)
c010: 3b 0a 20 20 72 65 74 75 72 6e 28 20 28 6d 61 6a  ;.  return( (maj
c020: 6f 72 3d 3d 38 20 26 26 20 6d 69 6e 6f 72 3e 3d  or==8 && minor>=
c030: 36 29 20 7c 7c 20 6d 61 6a 6f 72 3e 38 20 29 3b  6) || major>8 );
c040: 0a 7d 0a 23 65 6c 73 65 0a 2f 2a 20 0a 2a 2a 20  .}.#else./* .** 
c050: 43 6f 6d 70 69 6c 69 6e 67 20 75 73 69 6e 67 20  Compiling using 
c060: 68 65 61 64 65 72 73 20 65 61 72 6c 69 65 72 20  headers earlier 
c070: 74 68 61 6e 20 38 2e 36 2e 20 49 6e 20 74 68 69  than 8.6. In thi
c080: 73 20 63 61 73 65 20 4e 52 20 63 61 6e 6e 6f 74  s case NR cannot
c090: 20 62 65 0a 2a 2a 20 75 73 65 64 2c 20 73 6f 20   be.** used, so 
c0a0: 44 62 55 73 65 4e 72 65 28 29 20 74 6f 20 61 6c  DbUseNre() to al
c0b0: 77 61 79 73 20 72 65 74 75 72 6e 20 7a 65 72 6f  ways return zero
c0c0: 2e 20 41 64 64 20 23 64 65 66 69 6e 65 73 20 66  . Add #defines f
c0d0: 6f 72 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20  or the other.** 
c0e0: 54 63 6c 5f 4e 52 78 78 78 28 29 20 66 75 6e 63  Tcl_NRxxx() func
c0f0: 74 69 6f 6e 73 20 74 6f 20 70 72 65 76 65 6e 74  tions to prevent
c100: 20 74 68 65 6d 20 66 72 6f 6d 20 63 61 75 73 69   them from causi
c110: 6e 67 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 65  ng compilation e
c120: 72 72 6f 72 73 2c 0a 2a 2a 20 65 76 65 6e 20 74  rrors,.** even t
c130: 68 6f 75 67 68 20 74 68 65 20 6f 6e 6c 79 20 69  hough the only i
c140: 6e 76 6f 63 61 74 69 6f 6e 73 20 6f 66 20 74 68  nvocations of th
c150: 65 6d 20 61 72 65 20 77 69 74 68 69 6e 20 63 6f  em are within co
c160: 6e 64 69 74 69 6f 6e 61 6c 20 62 6c 6f 63 6b 73  nditional blocks
c170: 20 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 72 6d   .** of the form
c180: 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 44 62  :.**.**   if( Db
c190: 55 73 65 4e 72 65 28 29 20 29 20 7b 20 2e 2e 2e  UseNre() ) { ...
c1a0: 20 7d 0a 2a 2f 0a 23 20 64 65 66 69 6e 65 20 53   }.*/.# define S
c1b0: 51 4c 49 54 45 5f 54 43 4c 5f 4e 52 45 20 30 0a  QLITE_TCL_NRE 0.
c1c0: 23 20 64 65 66 69 6e 65 20 44 62 55 73 65 4e 72  # define DbUseNr
c1d0: 65 28 29 20 30 0a 23 20 64 65 66 69 6e 65 20 54  e() 0.# define T
c1e0: 63 6c 5f 4e 52 41 64 64 43 61 6c 6c 62 61 63 6b  cl_NRAddCallback
c1f0: 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 30 0a  (a,b,c,d,e,f) 0.
c200: 23 20 64 65 66 69 6e 65 20 54 63 6c 5f 4e 52 45  # define Tcl_NRE
c210: 76 61 6c 4f 62 6a 28 61 2c 62 2c 63 29 20 30 0a  valObj(a,b,c) 0.
c220: 23 20 64 65 66 69 6e 65 20 54 63 6c 5f 4e 52 43  # define Tcl_NRC
c230: 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 61 2c 62  reateCommand(a,b
c240: 2c 63 2c 64 2c 65 2c 66 29 20 30 0a 23 65 6e 64  ,c,d,e,f) 0.#end
c250: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  if../*.** This f
c260: 75 6e 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20  unction is part 
c270: 6f 66 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  of the implement
c280: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6d  ation of the com
c290: 6d 61 6e 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 24 64  mand:.**.**   $d
c2a0: 62 20 65 76 61 6c 20 53 51 4c 20 3f 41 52 52 41  b eval SQL ?ARRA
c2b0: 59 4e 41 4d 45 3f 20 53 43 52 49 50 54 0a 2a 2f  YNAME? SCRIPT.*/
c2c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 45 76  .static int DbEv
c2d0: 61 6c 4e 65 78 74 43 6d 64 28 0a 20 20 43 6c 69  alNextCmd(.  Cli
c2e0: 65 6e 74 44 61 74 61 20 64 61 74 61 5b 5d 2c 20  entData data[], 
c2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c300: 20 20 2f 2a 20 64 61 74 61 5b 30 5d 20 69 73 20    /* data[0] is 
c310: 74 68 65 20 28 44 62 45 76 61 6c 43 6f 6e 74 65  the (DbEvalConte
c320: 78 74 2a 29 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  xt*) */.  Tcl_In
c330: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
c340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c350: 2a 20 54 63 6c 20 69 6e 74 65 72 70 72 65 74 65  * Tcl interprete
c360: 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 75 6c  r */.  int resul
c370: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
c380: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
c390: 65 73 75 6c 74 20 73 6f 20 66 61 72 20 2a 2f 0a  esult so far */.
c3a0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 72 65  ){.  int rc = re
c3b0: 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20  sult;           
c3c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
c3d0: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f  urn code */..  /
c3e0: 2a 20 54 68 65 20 66 69 72 73 74 20 65 6c 65 6d  * The first elem
c3f0: 65 6e 74 20 6f 66 20 74 68 65 20 64 61 74 61 5b  ent of the data[
c400: 5d 20 61 72 72 61 79 20 69 73 20 61 20 70 6f 69  ] array is a poi
c410: 6e 74 65 72 20 74 6f 20 61 20 44 62 45 76 61 6c  nter to a DbEval
c420: 43 6f 6e 74 65 78 74 0a 20 20 2a 2a 20 73 74 72  Context.  ** str
c430: 75 63 74 75 72 65 20 61 6c 6c 6f 63 61 74 65 64  ucture allocated
c440: 20 75 73 69 6e 67 20 54 63 6c 5f 41 6c 6c 6f 63   using Tcl_Alloc
c450: 28 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 65  (). The second e
c460: 6c 65 6d 65 6e 74 20 6f 66 20 64 61 74 61 5b 5d  lement of data[]
c470: 0a 20 20 2a 2a 20 69 73 20 61 20 70 6f 69 6e 74  .  ** is a point
c480: 65 72 20 74 6f 20 61 20 54 63 6c 5f 4f 62 6a 20  er to a Tcl_Obj 
c490: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73  containing the s
c4a0: 63 72 69 70 74 20 74 6f 20 72 75 6e 20 66 6f 72  cript to run for
c4b0: 20 65 61 63 68 20 72 6f 77 0a 20 20 2a 2a 20 72   each row.  ** r
c4c0: 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 71  eturned by the q
c4d0: 75 65 72 69 65 73 20 65 6e 63 61 70 73 75 6c 61  ueries encapsula
c4e0: 74 65 64 20 69 6e 20 64 61 74 61 5b 30 5d 2e 20  ted in data[0]. 
c4f0: 2a 2f 0a 20 20 44 62 45 76 61 6c 43 6f 6e 74 65  */.  DbEvalConte
c500: 78 74 20 2a 70 20 3d 20 28 44 62 45 76 61 6c 43  xt *p = (DbEvalC
c510: 6f 6e 74 65 78 74 20 2a 29 64 61 74 61 5b 30 5d  ontext *)data[0]
c520: 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63  ;.  Tcl_Obj *pSc
c530: 72 69 70 74 20 3d 20 28 54 63 6c 5f 4f 62 6a 20  ript = (Tcl_Obj 
c540: 2a 29 64 61 74 61 5b 31 5d 3b 0a 20 20 54 63 6c  *)data[1];.  Tcl
c550: 5f 4f 62 6a 20 2a 70 41 72 72 61 79 20 3d 20 70  _Obj *pArray = p
c560: 2d 3e 70 41 72 72 61 79 3b 0a 0a 20 20 77 68 69  ->pArray;..  whi
c570: 6c 65 28 20 28 72 63 3d 3d 54 43 4c 5f 4f 4b 20  le( (rc==TCL_OK 
c580: 7c 7c 20 72 63 3d 3d 54 43 4c 5f 43 4f 4e 54 49  || rc==TCL_CONTI
c590: 4e 55 45 29 20 26 26 20 54 43 4c 5f 4f 4b 3d 3d  NUE) && TCL_OK==
c5a0: 28 72 63 20 3d 20 64 62 45 76 61 6c 53 74 65 70  (rc = dbEvalStep
c5b0: 28 70 29 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  (p)) ){.    int 
c5c0: 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b  i;.    int nCol;
c5d0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61  .    Tcl_Obj **a
c5e0: 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 20 20 64 62  pColName;.    db
c5f0: 45 76 61 6c 52 6f 77 49 6e 66 6f 28 70 2c 20 26  EvalRowInfo(p, &
c600: 6e 43 6f 6c 2c 20 26 61 70 43 6f 6c 4e 61 6d 65  nCol, &apColName
c610: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
c620: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
c630: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61      Tcl_Obj *pVa
c640: 6c 20 3d 20 64 62 45 76 61 6c 43 6f 6c 75 6d 6e  l = dbEvalColumn
c650: 56 61 6c 75 65 28 70 2c 20 69 29 3b 0a 20 20 20  Value(p, i);.   
c660: 20 20 20 69 66 28 20 70 41 72 72 61 79 3d 3d 30     if( pArray==0
c670: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
c680: 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72  ObjSetVar2(inter
c690: 70 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 2c  p, apColName[i],
c6a0: 20 30 2c 20 70 56 61 6c 2c 20 30 29 3b 0a 20 20   0, pVal, 0);.  
c6b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c6c0: 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72     Tcl_ObjSetVar
c6d0: 32 28 69 6e 74 65 72 70 2c 20 70 41 72 72 61 79  2(interp, pArray
c6e0: 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20  , apColName[i], 
c6f0: 70 56 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  pVal, 0);.      
c700: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
c710: 54 68 65 20 72 65 71 75 69 72 65 64 20 69 6e 74  The required int
c720: 65 72 70 72 65 74 65 72 20 76 61 72 69 61 62 6c  erpreter variabl
c730: 65 73 20 61 72 65 20 6e 6f 77 20 70 6f 70 75 6c  es are now popul
c740: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 64 61  ated with the da
c750: 74 61 20 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20  ta .    ** from 
c760: 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 2e  the current row.
c770: 20 49 66 20 75 73 69 6e 67 20 4e 52 45 2c 20 73   If using NRE, s
c780: 63 68 65 64 75 6c 65 20 63 61 6c 6c 62 61 63 6b  chedule callback
c790: 73 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 20 20  s to evaluate.  
c7a0: 20 20 2a 2a 20 73 63 72 69 70 74 20 70 53 63 72    ** script pScr
c7b0: 69 70 74 2c 20 74 68 65 6e 20 74 6f 20 69 6e 76  ipt, then to inv
c7c0: 6f 6b 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  oke this functio
c7d0: 6e 20 61 67 61 69 6e 20 74 6f 20 66 65 74 63 68  n again to fetch
c7e0: 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a   the next.    **
c7f0: 20 72 6f 77 20 28 6f 72 20 63 6c 65 61 6e 20 75   row (or clean u
c800: 70 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  p if there is no
c810: 20 6e 65 78 74 20 72 6f 77 20 6f 72 20 74 68 65   next row or the
c820: 20 73 63 72 69 70 74 20 74 68 72 6f 77 73 20 61   script throws a
c830: 6e 0a 20 20 20 20 2a 2a 20 65 78 63 65 70 74 69  n.    ** excepti
c840: 6f 6e 29 2e 20 41 66 74 65 72 20 73 63 68 65 64  on). After sched
c850: 75 6c 69 6e 67 20 74 68 65 20 63 61 6c 6c 62 61  uling the callba
c860: 63 6b 73 2c 20 72 65 74 75 72 6e 20 63 6f 6e 74  cks, return cont
c870: 72 6f 6c 20 74 6f 20 74 68 65 20 0a 20 20 20 20  rol to the .    
c880: 2a 2a 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 2a  ** caller..    *
c890: 2a 0a 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74 20  *.    ** If not 
c8a0: 75 73 69 6e 67 20 4e 52 45 2c 20 65 76 61 6c 75  using NRE, evalu
c8b0: 61 74 65 20 70 53 63 72 69 70 74 20 64 69 72 65  ate pScript dire
c8c0: 63 74 6c 79 20 61 6e 64 20 63 6f 6e 74 69 6e 75  ctly and continu
c8d0: 65 20 77 69 74 68 20 74 68 65 0a 20 20 20 20 2a  e with the.    *
c8e0: 2a 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e  * next iteration
c8f0: 20 6f 66 20 74 68 69 73 20 77 68 69 6c 65 28 2e   of this while(.
c900: 2e 2e 29 20 6c 6f 6f 70 2e 20 20 2a 2f 0a 20 20  ..) loop.  */.  
c910: 20 20 69 66 28 20 44 62 55 73 65 4e 72 65 28 29    if( DbUseNre()
c920: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 4e 52   ){.      Tcl_NR
c930: 41 64 64 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65  AddCallback(inte
c940: 72 70 2c 20 44 62 45 76 61 6c 4e 65 78 74 43 6d  rp, DbEvalNextCm
c950: 64 2c 20 28 76 6f 69 64 2a 29 70 2c 20 28 76 6f  d, (void*)p, (vo
c960: 69 64 2a 29 70 53 63 72 69 70 74 2c 20 30 2c 20  id*)pScript, 0, 
c970: 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
c980: 20 54 63 6c 5f 4e 52 45 76 61 6c 4f 62 6a 28 69   Tcl_NREvalObj(i
c990: 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20  nterp, pScript, 
c9a0: 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
c9b0: 20 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 45 76       rc = Tcl_Ev
c9c0: 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20  alObjEx(interp, 
c9d0: 70 53 63 72 69 70 74 2c 20 30 29 3b 0a 20 20 20  pScript, 0);.   
c9e0: 20 7d 0a 20 20 7d 0a 0a 20 20 54 63 6c 5f 44 65   }.  }..  Tcl_De
c9f0: 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69  crRefCount(pScri
ca00: 70 74 29 3b 0a 20 20 64 62 45 76 61 6c 46 69 6e  pt);.  dbEvalFin
ca10: 61 6c 69 7a 65 28 70 29 3b 0a 20 20 54 63 6c 5f  alize(p);.  Tcl_
ca20: 46 72 65 65 28 28 63 68 61 72 20 2a 29 70 29 3b  Free((char *)p);
ca30: 0a 0a 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f  ..  if( rc==TCL_
ca40: 4f 4b 20 7c 7c 20 72 63 3d 3d 54 43 4c 5f 42 52  OK || rc==TCL_BR
ca50: 45 41 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 52  EAK ){.    Tcl_R
ca60: 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  esetResult(inter
ca70: 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 54 43 4c  p);.    rc = TCL
ca80: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  _OK;.  }.  retur
ca90: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
caa0: 68 65 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d  he "sqlite" comm
cab0: 61 6e 64 20 62 65 6c 6f 77 20 63 72 65 61 74 65  and below create
cac0: 73 20 61 20 6e 65 77 20 54 63 6c 20 63 6f 6d 6d  s a new Tcl comm
cad0: 61 6e 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20  and for each.** 
cae0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 74 20 6f 70  connection it op
caf0: 65 6e 73 20 74 6f 20 61 6e 20 53 51 4c 69 74 65  ens to an SQLite
cb00: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
cb10: 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f   routine is invo
cb20: 6b 65 64 0a 2a 2a 20 77 68 65 6e 65 76 65 72 20  ked.** whenever 
cb30: 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e  one of those con
cb40: 6e 65 63 74 69 6f 6e 2d 73 70 65 63 69 66 69 63  nection-specific
cb50: 20 63 6f 6d 6d 61 6e 64 73 20 69 73 20 65 78 65   commands is exe
cb60: 63 75 74 65 64 0a 2a 2a 20 69 6e 20 54 63 6c 2e  cuted.** in Tcl.
cb70: 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69    For example, i
cb80: 66 20 79 6f 75 20 72 75 6e 20 54 63 6c 20 63 6f  f you run Tcl co
cb90: 64 65 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  de like this:.**
cba0: 0a 2a 2a 20 20 20 20 20 20 20 73 71 6c 69 74 65  .**       sqlite
cbb0: 33 20 64 62 31 20 20 22 6d 79 5f 64 61 74 61 62  3 db1  "my_datab
cbc0: 61 73 65 22 0a 2a 2a 20 20 20 20 20 20 20 64 62  ase".**       db
cbd0: 31 20 63 6c 6f 73 65 0a 2a 2a 0a 2a 2a 20 54 68  1 close.**.** Th
cbe0: 65 20 66 69 72 73 74 20 63 6f 6d 6d 61 6e 64 20  e first command 
cbf0: 6f 70 65 6e 73 20 61 20 63 6f 6e 6e 65 63 74 69  opens a connecti
cc00: 6f 6e 20 74 6f 20 74 68 65 20 22 6d 79 5f 64 61  on to the "my_da
cc10: 74 61 62 61 73 65 22 20 64 61 74 61 62 61 73 65  tabase" database
cc20: 0a 2a 2a 20 61 6e 64 20 63 61 6c 6c 73 20 74 68  .** and calls th
cc30: 61 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 22 64  at connection "d
cc40: 62 31 22 2e 20 20 54 68 65 20 73 65 63 6f 6e 64  b1".  The second
cc50: 20 63 6f 6d 6d 61 6e 64 20 63 61 75 73 65 73 20   command causes 
cc60: 74 68 69 73 0a 2a 2a 20 73 75 62 72 6f 75 74 69  this.** subrouti
cc70: 6e 65 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  ne to be invoked
cc80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
cc90: 44 62 4f 62 6a 43 6d 64 28 76 6f 69 64 20 2a 63  DbObjCmd(void *c
cca0: 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  d, Tcl_Interp *i
ccb0: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
ccc0: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f  Tcl_Obj *const*o
ccd0: 62 6a 76 29 7b 0a 20 20 53 71 6c 69 74 65 44 62  bjv){.  SqliteDb
cce0: 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44   *pDb = (SqliteD
ccf0: 62 2a 29 63 64 3b 0a 20 20 69 6e 74 20 63 68 6f  b*)cd;.  int cho
cd00: 69 63 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ice;.  int rc = 
cd10: 54 43 4c 5f 4f 4b 3b 0a 20 20 73 74 61 74 69 63  TCL_OK;.  static
cd20: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 44 42 5f   const char *DB_
cd30: 73 74 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 22  strs[] = {.    "
cd40: 61 75 74 68 6f 72 69 7a 65 72 22 2c 20 20 20 20  authorizer",    
cd50: 20 20 20 20 20 22 62 61 63 6b 75 70 22 2c 20 20       "backup",  
cd60: 20 20 20 20 20 20 20 20 20 20 22 62 75 73 79 22            "busy"
cd70: 2c 0a 20 20 20 20 22 63 61 63 68 65 22 2c 20 20  ,.    "cache",  
cd80: 20 20 20 20 20 20 20 20 20 20 20 20 22 63 68 61              "cha
cd90: 6e 67 65 73 22 2c 20 20 20 20 20 20 20 20 20 20  nges",          
cda0: 20 22 63 6c 6f 73 65 22 2c 0a 20 20 20 20 22 63   "close",.    "c
cdb0: 6f 6c 6c 61 74 65 22 2c 20 20 20 20 20 20 20 20  ollate",        
cdc0: 20 20 20 20 22 63 6f 6c 6c 61 74 69 6f 6e 5f 6e      "collation_n
cdd0: 65 65 64 65 64 22 2c 20 20 22 63 6f 6d 6d 69 74  eeded",  "commit
cde0: 5f 68 6f 6f 6b 22 2c 0a 20 20 20 20 22 63 6f 6d  _hook",.    "com
cdf0: 70 6c 65 74 65 22 2c 20 20 20 20 20 20 20 20 20  plete",         
ce00: 20 20 22 63 6f 70 79 22 2c 20 20 20 20 20 20 20    "copy",       
ce10: 20 20 20 20 20 20 20 22 65 6e 61 62 6c 65 5f 6c         "enable_l
ce20: 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 22 2c 0a  oad_extension",.
ce30: 20 20 20 20 22 65 72 72 6f 72 63 6f 64 65 22 2c      "errorcode",
ce40: 20 20 20 20 20 20 20 20 20 20 22 65 76 61 6c 22            "eval"
ce50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ,              "
ce60: 65 78 69 73 74 73 22 2c 0a 20 20 20 20 22 66 75  exists",.    "fu
ce70: 6e 63 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 20  nction",        
ce80: 20 20 20 22 69 6e 63 72 62 6c 6f 62 22 2c 20 20     "incrblob",  
ce90: 20 20 20 20 20 20 20 20 22 69 6e 74 65 72 72 75          "interru
cea0: 70 74 22 2c 0a 20 20 20 20 22 6c 61 73 74 5f 69  pt",.    "last_i
ceb0: 6e 73 65 72 74 5f 72 6f 77 69 64 22 2c 20 20 22  nsert_rowid",  "
cec0: 6e 75 6c 6c 76 61 6c 75 65 22 2c 20 20 20 20 20  nullvalue",     
ced0: 20 20 20 20 22 6f 6e 65 63 6f 6c 75 6d 6e 22 2c      "onecolumn",
cee0: 0a 20 20 20 20 22 70 72 6f 66 69 6c 65 22 2c 20  .    "profile", 
cef0: 20 20 20 20 20 20 20 20 20 20 20 22 70 72 6f 67             "prog
cf00: 72 65 73 73 22 2c 20 20 20 20 20 20 20 20 20 20  ress",          
cf10: 22 72 65 6b 65 79 22 2c 0a 20 20 20 20 22 72 65  "rekey",.    "re
cf20: 73 74 6f 72 65 22 2c 20 20 20 20 20 20 20 20 20  store",         
cf30: 20 20 20 22 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f     "rollback_hoo
cf40: 6b 22 2c 20 20 20 20 20 22 73 74 61 74 75 73 22  k",     "status"
cf50: 2c 0a 20 20 20 20 22 74 69 6d 65 6f 75 74 22 2c  ,.    "timeout",
cf60: 20 20 20 20 20 20 20 20 20 20 20 20 22 74 6f 74              "tot
cf70: 61 6c 5f 63 68 61 6e 67 65 73 22 2c 20 20 20 20  al_changes",    
cf80: 20 22 74 72 61 63 65 22 2c 0a 20 20 20 20 22 74   "trace",.    "t
cf90: 72 61 6e 73 61 63 74 69 6f 6e 22 2c 20 20 20 20  ransaction",    
cfa0: 20 20 20 20 22 75 6e 6c 6f 63 6b 5f 6e 6f 74 69      "unlock_noti
cfb0: 66 79 22 2c 20 20 20 20 20 22 75 70 64 61 74 65  fy",     "update
cfc0: 5f 68 6f 6f 6b 22 2c 0a 20 20 20 20 22 76 65 72  _hook",.    "ver
cfd0: 73 69 6f 6e 22 2c 20 20 20 20 20 20 20 20 20 20  sion",          
cfe0: 20 20 22 77 61 6c 5f 68 6f 6f 6b 22 2c 20 20 20    "wal_hook",   
cff0: 20 20 20 20 20 20 20 30 0a 20 20 7d 3b 0a 20 20         0.  };.  
d000: 65 6e 75 6d 20 44 42 5f 65 6e 75 6d 20 7b 0a 20  enum DB_enum {. 
d010: 20 20 20 44 42 5f 41 55 54 48 4f 52 49 5a 45 52     DB_AUTHORIZER
d020: 2c 20 20 20 20 20 20 20 20 44 42 5f 42 41 43 4b  ,        DB_BACK
d030: 55 50 2c 20 20 20 20 20 20 20 20 20 20 20 44 42  UP,           DB
d040: 5f 42 55 53 59 2c 0a 20 20 20 20 44 42 5f 43 41  _BUSY,.    DB_CA
d050: 43 48 45 2c 20 20 20 20 20 20 20 20 20 20 20 20  CHE,            
d060: 20 44 42 5f 43 48 41 4e 47 45 53 2c 20 20 20 20   DB_CHANGES,    
d070: 20 20 20 20 20 20 44 42 5f 43 4c 4f 53 45 2c 0a        DB_CLOSE,.
d080: 20 20 20 20 44 42 5f 43 4f 4c 4c 41 54 45 2c 20      DB_COLLATE, 
d090: 20 20 20 20 20 20 20 20 20 20 44 42 5f 43 4f 4c            DB_COL
d0a0: 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 2c 20 44  LATION_NEEDED, D
d0b0: 42 5f 43 4f 4d 4d 49 54 5f 48 4f 4f 4b 2c 0a 20  B_COMMIT_HOOK,. 
d0c0: 20 20 20 44 42 5f 43 4f 4d 50 4c 45 54 45 2c 20     DB_COMPLETE, 
d0d0: 20 20 20 20 20 20 20 20 20 44 42 5f 43 4f 50 59           DB_COPY
d0e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 44 42  ,             DB
d0f0: 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54  _ENABLE_LOAD_EXT
d100: 45 4e 53 49 4f 4e 2c 0a 20 20 20 20 44 42 5f 45  ENSION,.    DB_E
d110: 52 52 4f 52 43 4f 44 45 2c 20 20 20 20 20 20 20  RRORCODE,       
d120: 20 20 44 42 5f 45 56 41 4c 2c 20 20 20 20 20 20    DB_EVAL,      
d130: 20 20 20 20 20 20 20 44 42 5f 45 58 49 53 54 53         DB_EXISTS
d140: 2c 0a 20 20 20 20 44 42 5f 46 55 4e 43 54 49 4f  ,.    DB_FUNCTIO
d150: 4e 2c 20 20 20 20 20 20 20 20 20 20 44 42 5f 49  N,          DB_I
d160: 4e 43 52 42 4c 4f 42 2c 20 20 20 20 20 20 20 20  NCRBLOB,        
d170: 20 44 42 5f 49 4e 54 45 52 52 55 50 54 2c 0a 20   DB_INTERRUPT,. 
d180: 20 20 20 44 42 5f 4c 41 53 54 5f 49 4e 53 45 52     DB_LAST_INSER
d190: 54 5f 52 4f 57 49 44 2c 20 44 42 5f 4e 55 4c 4c  T_ROWID, DB_NULL
d1a0: 56 41 4c 55 45 2c 20 20 20 20 20 20 20 20 44 42  VALUE,        DB
d1b0: 5f 4f 4e 45 43 4f 4c 55 4d 4e 2c 0a 20 20 20 20  _ONECOLUMN,.    
d1c0: 44 42 5f 50 52 4f 46 49 4c 45 2c 20 20 20 20 20  DB_PROFILE,     
d1d0: 20 20 20 20 20 20 44 42 5f 50 52 4f 47 52 45 53        DB_PROGRES
d1e0: 53 2c 20 20 20 20 20 20 20 20 20 44 42 5f 52 45  S,         DB_RE
d1f0: 4b 45 59 2c 0a 20 20 20 20 44 42 5f 52 45 53 54  KEY,.    DB_REST
d200: 4f 52 45 2c 20 20 20 20 20 20 20 20 20 20 20 44  ORE,           D
d210: 42 5f 52 4f 4c 4c 42 41 43 4b 5f 48 4f 4f 4b 2c  B_ROLLBACK_HOOK,
d220: 20 20 20 20 44 42 5f 53 54 41 54 55 53 2c 0a 20      DB_STATUS,. 
d230: 20 20 20 44 42 5f 54 49 4d 45 4f 55 54 2c 20 20     DB_TIMEOUT,  
d240: 20 20 20 20 20 20 20 20 20 44 42 5f 54 4f 54 41           DB_TOTA
d250: 4c 5f 43 48 41 4e 47 45 53 2c 20 20 20 20 44 42  L_CHANGES,    DB
d260: 5f 54 52 41 43 45 2c 0a 20 20 20 20 44 42 5f 54  _TRACE,.    DB_T
d270: 52 41 4e 53 41 43 54 49 4f 4e 2c 20 20 20 20 20  RANSACTION,     
d280: 20 20 44 42 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49    DB_UNLOCK_NOTI
d290: 46 59 2c 20 20 20 20 44 42 5f 55 50 44 41 54 45  FY,    DB_UPDATE
d2a0: 5f 48 4f 4f 4b 2c 0a 20 20 20 20 44 42 5f 56 45  _HOOK,.    DB_VE
d2b0: 52 53 49 4f 4e 2c 20 20 20 20 20 20 20 20 20 20  RSION,          
d2c0: 20 44 42 5f 57 41 4c 5f 48 4f 4f 4b 0a 20 20 7d   DB_WAL_HOOK.  }
d2d0: 3b 0a 20 20 2f 2a 20 64 6f 6e 27 74 20 6c 65 61  ;.  /* don't lea
d2e0: 76 65 20 74 72 61 69 6c 69 6e 67 20 63 6f 6d 6d  ve trailing comm
d2f0: 61 73 20 6f 6e 20 44 42 5f 65 6e 75 6d 2c 20 69  as on DB_enum, i
d300: 74 20 63 6f 6e 66 75 73 65 73 20 74 68 65 20 41  t confuses the A
d310: 49 58 20 78 6c 63 20 63 6f 6d 70 69 6c 65 72 20  IX xlc compiler 
d320: 2a 2f 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3c 32  */..  if( objc<2
d330: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
d340: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
d350: 20 31 2c 20 6f 62 6a 76 2c 20 22 53 55 42 43 4f   1, objv, "SUBCO
d360: 4d 4d 41 4e 44 20 2e 2e 2e 22 29 3b 0a 20 20 20  MMAND ...");.   
d370: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
d380: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c  R;.  }.  if( Tcl
d390: 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a  _GetIndexFromObj
d3a0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d  (interp, objv[1]
d3b0: 2c 20 44 42 5f 73 74 72 73 2c 20 22 6f 70 74 69  , DB_strs, "opti
d3c0: 6f 6e 22 2c 20 30 2c 20 26 63 68 6f 69 63 65 29  on", 0, &choice)
d3d0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
d3e0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
d3f0: 20 73 77 69 74 63 68 28 20 28 65 6e 75 6d 20 44   switch( (enum D
d400: 42 5f 65 6e 75 6d 29 63 68 6f 69 63 65 20 29 7b  B_enum)choice ){
d410: 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 61 75  ..  /*    $db au
d420: 74 68 6f 72 69 7a 65 72 20 3f 43 41 4c 4c 42 41  thorizer ?CALLBA
d430: 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e  CK?.  **.  ** In
d440: 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63  voke the given c
d450: 61 6c 6c 62 61 63 6b 20 74 6f 20 61 75 74 68 6f  allback to autho
d460: 72 69 7a 65 20 65 61 63 68 20 53 51 4c 20 6f 70  rize each SQL op
d470: 65 72 61 74 69 6f 6e 20 61 73 20 69 74 20 69 73  eration as it is
d480: 0a 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 64 2e 20  .  ** compiled. 
d490: 20 35 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65   5 arguments are
d4a0: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
d4b0: 20 63 61 6c 6c 62 61 63 6b 20 62 65 66 6f 72 65   callback before
d4c0: 20 69 74 20 69 73 0a 20 20 2a 2a 20 69 6e 76 6f   it is.  ** invo
d4d0: 6b 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ked:.  **.  **  
d4e0: 20 28 31 29 20 54 68 65 20 61 75 74 68 6f 72 69   (1) The authori
d4f0: 7a 61 74 69 6f 6e 20 74 79 70 65 20 28 65 78 3a  zation type (ex:
d500: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
d510: 41 42 4c 45 2c 20 53 51 4c 49 54 45 5f 49 4e 53  ABLE, SQLITE_INS
d520: 45 52 54 2c 20 2e 2e 2e 29 0a 20 20 2a 2a 20 20  ERT, ...).  **  
d530: 20 28 32 29 20 46 69 72 73 74 20 64 65 73 63 72   (2) First descr
d540: 69 70 74 69 76 65 20 6e 61 6d 65 20 28 64 65 70  iptive name (dep
d550: 65 6e 64 73 20 6f 6e 20 61 75 74 68 6f 72 69 7a  ends on authoriz
d560: 61 74 69 6f 6e 20 74 79 70 65 29 0a 20 20 2a 2a  ation type).  **
d570: 20 20 20 28 33 29 20 53 65 63 6f 6e 64 20 64 65     (3) Second de
d580: 73 63 72 69 70 74 69 76 65 20 6e 61 6d 65 0a 20  scriptive name. 
d590: 20 2a 2a 20 20 20 28 34 29 20 4e 61 6d 65 20 6f   **   (4) Name o
d5a0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28  f the database (
d5b0: 65 78 3a 20 22 6d 61 69 6e 22 2c 20 22 74 65 6d  ex: "main", "tem
d5c0: 70 22 29 0a 20 20 2a 2a 20 20 20 28 35 29 20 4e  p").  **   (5) N
d5d0: 61 6d 65 20 6f 66 20 74 72 69 67 67 65 72 20 74  ame of trigger t
d5e0: 68 61 74 20 69 73 20 64 6f 69 6e 67 20 74 68 65  hat is doing the
d5f0: 20 61 63 63 65 73 73 0a 20 20 2a 2a 0a 20 20 2a   access.  **.  *
d600: 2a 20 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 73  * The callback s
d610: 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 6f 6e 20  hould return on 
d620: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
d630: 20 73 74 72 69 6e 67 73 3a 20 53 51 4c 49 54 45   strings: SQLITE
d640: 5f 4f 4b 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45  _OK,.  ** SQLITE
d650: 5f 49 47 4e 4f 52 45 2c 20 6f 72 20 53 51 4c 49  _IGNORE, or SQLI
d660: 54 45 5f 44 45 4e 59 2e 20 20 41 6e 79 20 6f 74  TE_DENY.  Any ot
d670: 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65  her return value
d680: 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20   is an error..  
d690: 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20  **.  ** If this 
d6a0: 6d 65 74 68 6f 64 20 69 73 20 69 6e 76 6f 6b 65  method is invoke
d6b0: 64 20 77 69 74 68 20 6e 6f 20 61 72 67 75 6d 65  d with no argume
d6c0: 6e 74 73 2c 20 74 68 65 20 63 75 72 72 65 6e 74  nts, the current
d6d0: 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 0a 20   authorization. 
d6e0: 20 2a 2a 20 63 61 6c 6c 62 61 63 6b 20 73 74 72   ** callback str
d6f0: 69 6e 67 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ing is returned.
d700: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
d710: 41 55 54 48 4f 52 49 5a 45 52 3a 20 7b 0a 23 69  AUTHORIZER: {.#i
d720: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
d730: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
d740: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
d750: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 61 75 74  ult(interp, "aut
d760: 68 6f 72 69 7a 61 74 69 6f 6e 20 6e 6f 74 20 61  horization not a
d770: 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 69 73  vailable in this
d780: 20 62 75 69 6c 64 22 2c 20 30 29 3b 0a 20 20 20   build", 0);.   
d790: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
d7a0: 52 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28  R;.#else.    if(
d7b0: 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20   objc>3 ){.     
d7c0: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
d7d0: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
d7e0: 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29  v, "?CALLBACK?")
d7f0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
d800: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65  CL_ERROR;.    }e
d810: 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20  lse if( objc==2 
d820: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  ){.      if( pDb
d830: 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 20  ->zAuth ){.     
d840: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
d850: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d  ult(interp, pDb-
d860: 3e 7a 41 75 74 68 2c 20 30 29 3b 0a 20 20 20 20  >zAuth, 0);.    
d870: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
d880: 20 20 20 20 20 63 68 61 72 20 2a 7a 41 75 74 68       char *zAuth
d890: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b  ;.      int len;
d8a0: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
d8b0: 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 20 20 20  zAuth ){.       
d8c0: 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
d8d0: 41 75 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Auth);.      }. 
d8e0: 20 20 20 20 20 7a 41 75 74 68 20 3d 20 54 63 6c       zAuth = Tcl
d8f0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
d900: 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29  j(objv[2], &len)
d910: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41 75 74  ;.      if( zAut
d920: 68 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20  h && len>0 ){.  
d930: 20 20 20 20 20 20 70 44 62 2d 3e 7a 41 75 74 68        pDb->zAuth
d940: 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65   = Tcl_Alloc( le
d950: 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20  n + 1 );.       
d960: 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 41 75   memcpy(pDb->zAu
d970: 74 68 2c 20 7a 41 75 74 68 2c 20 6c 65 6e 2b 31  th, zAuth, len+1
d980: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
d990: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 41 75          pDb->zAu
d9a0: 74 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  th = 0;.      }.
d9b0: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
d9c0: 41 75 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20  Auth ){.        
d9d0: 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e  pDb->interp = in
d9e0: 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71  terp;.        sq
d9f0: 6c 69 74 65 33 5f 73 65 74 5f 61 75 74 68 6f 72  lite3_set_author
da00: 69 7a 65 72 28 70 44 62 2d 3e 64 62 2c 20 61 75  izer(pDb->db, au
da10: 74 68 5f 63 61 6c 6c 62 61 63 6b 2c 20 70 44 62  th_callback, pDb
da20: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
da30: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
da40: 73 65 74 5f 61 75 74 68 6f 72 69 7a 65 72 28 70  set_authorizer(p
da50: 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20  Db->db, 0, 0);. 
da60: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
da70: 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  dif.    break;. 
da80: 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20   }..  /*    $db 
da90: 62 61 63 6b 75 70 20 3f 44 41 54 41 42 41 53 45  backup ?DATABASE
daa0: 3f 20 46 49 4c 45 4e 41 4d 45 0a 20 20 2a 2a 0a  ? FILENAME.  **.
dab0: 20 20 2a 2a 20 4f 70 65 6e 20 6f 72 20 63 72 65    ** Open or cre
dac0: 61 74 65 20 61 20 64 61 74 61 62 61 73 65 20 66  ate a database f
dad0: 69 6c 65 20 6e 61 6d 65 64 20 46 49 4c 45 4e 41  ile named FILENA
dae0: 4d 45 2e 20 20 54 72 61 6e 73 66 65 72 20 74 68  ME.  Transfer th
daf0: 65 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f  e.  ** content o
db00: 66 20 6c 6f 63 61 6c 20 64 61 74 61 62 61 73 65  f local database
db10: 20 44 41 54 41 42 41 53 45 20 28 64 65 66 61 75   DATABASE (defau
db20: 6c 74 3a 20 22 6d 61 69 6e 22 29 20 69 6e 74 6f  lt: "main") into
db30: 20 74 68 65 0a 20 20 2a 2a 20 46 49 4c 45 4e 41   the.  ** FILENA
db40: 4d 45 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  ME database..  *
db50: 2f 0a 20 20 63 61 73 65 20 44 42 5f 42 41 43 4b  /.  case DB_BACK
db60: 55 50 3a 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  UP: {.    const 
db70: 63 68 61 72 20 2a 7a 44 65 73 74 46 69 6c 65 3b  char *zDestFile;
db80: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
db90: 2a 7a 53 72 63 44 62 3b 0a 20 20 20 20 73 71 6c  *zSrcDb;.    sql
dba0: 69 74 65 33 20 2a 70 44 65 73 74 3b 0a 20 20 20  ite3 *pDest;.   
dbb0: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20   sqlite3_backup 
dbc0: 2a 70 42 61 63 6b 75 70 3b 0a 0a 20 20 20 20 69  *pBackup;..    i
dbd0: 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20  f( objc==3 ){.  
dbe0: 20 20 20 20 7a 53 72 63 44 62 20 3d 20 22 6d 61      zSrcDb = "ma
dbf0: 69 6e 22 3b 0a 20 20 20 20 20 20 7a 44 65 73 74  in";.      zDest
dc00: 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  File = Tcl_GetSt
dc10: 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
dc20: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a     }else if( obj
dc30: 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 7a 53  c==4 ){.      zS
dc40: 72 63 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74  rcDb = Tcl_GetSt
dc50: 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
dc60: 20 20 20 20 20 7a 44 65 73 74 46 69 6c 65 20 3d       zDestFile =
dc70: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
dc80: 62 6a 76 5b 33 5d 29 3b 0a 20 20 20 20 7d 65 6c  bjv[3]);.    }el
dc90: 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72  se{.      Tcl_Wr
dca0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
dcb0: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 44 41  p, 2, objv, "?DA
dcc0: 54 41 42 41 53 45 3f 20 46 49 4c 45 4e 41 4d 45  TABASE? FILENAME
dcd0: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
dce0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
dcf0: 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
dd00: 65 33 5f 6f 70 65 6e 28 7a 44 65 73 74 46 69 6c  e3_open(zDestFil
dd10: 65 2c 20 26 70 44 65 73 74 29 3b 0a 20 20 20 20  e, &pDest);.    
dd20: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
dd30: 4b 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  K ){.      Tcl_A
dd40: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
dd50: 72 70 2c 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e  rp, "cannot open
dd60: 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65   target database
dd70: 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  : ",.           
dd80: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
dd90: 44 65 73 74 29 2c 20 28 63 68 61 72 2a 29 30 29  Dest), (char*)0)
dda0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
ddb0: 63 6c 6f 73 65 28 70 44 65 73 74 29 3b 0a 20 20  close(pDest);.  
ddc0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
ddd0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
dde0: 70 42 61 63 6b 75 70 20 3d 20 73 71 6c 69 74 65  pBackup = sqlite
ddf0: 33 5f 62 61 63 6b 75 70 5f 69 6e 69 74 28 70 44  3_backup_init(pD
de00: 65 73 74 2c 20 22 6d 61 69 6e 22 2c 20 70 44 62  est, "main", pDb
de10: 2d 3e 64 62 2c 20 7a 53 72 63 44 62 29 3b 0a 20  ->db, zSrcDb);. 
de20: 20 20 20 69 66 28 20 70 42 61 63 6b 75 70 3d 3d     if( pBackup==
de30: 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  0 ){.      Tcl_A
de40: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
de50: 72 70 2c 20 22 62 61 63 6b 75 70 20 66 61 69 6c  rp, "backup fail
de60: 65 64 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20  ed: ",.         
de70: 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67    sqlite3_errmsg
de80: 28 70 44 65 73 74 29 2c 20 28 63 68 61 72 2a 29  (pDest), (char*)
de90: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
dea0: 33 5f 63 6c 6f 73 65 28 70 44 65 73 74 29 3b 0a  3_close(pDest);.
deb0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
dec0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
ded0: 20 20 77 68 69 6c 65 28 20 20 28 72 63 20 3d 20    while(  (rc = 
dee0: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 73  sqlite3_backup_s
def0: 74 65 70 28 70 42 61 63 6b 75 70 2c 31 30 30 29  tep(pBackup,100)
df00: 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 7d  )==SQLITE_OK ){}
df10: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63  .    sqlite3_bac
df20: 6b 75 70 5f 66 69 6e 69 73 68 28 70 42 61 63 6b  kup_finish(pBack
df30: 75 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  up);.    if( rc=
df40: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
df50: 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f        rc = TCL_O
df60: 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
df70: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
df80: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61  sult(interp, "ba
df90: 63 6b 75 70 20 66 61 69 6c 65 64 3a 20 22 2c 0a  ckup failed: ",.
dfa0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
dfb0: 65 33 5f 65 72 72 6d 73 67 28 70 44 65 73 74 29  e3_errmsg(pDest)
dfc0: 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
dfd0: 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f     rc = TCL_ERRO
dfe0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  R;.    }.    sql
dff0: 69 74 65 33 5f 63 6c 6f 73 65 28 70 44 65 73 74  ite3_close(pDest
e000: 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
e010: 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 62  }..  /*    $db b
e020: 75 73 79 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20  usy ?CALLBACK?. 
e030: 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20   **.  ** Invoke 
e040: 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62 61  the given callba
e050: 63 6b 20 69 66 20 61 6e 20 53 51 4c 20 73 74 61  ck if an SQL sta
e060: 74 65 6d 65 6e 74 20 61 74 74 65 6d 70 74 73 20  tement attempts 
e070: 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 6c  to open.  ** a l
e080: 6f 63 6b 65 64 20 64 61 74 61 62 61 73 65 20 66  ocked database f
e090: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ile..  */.  case
e0a0: 20 44 42 5f 42 55 53 59 3a 20 7b 0a 20 20 20 20   DB_BUSY: {.    
e0b0: 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20  if( objc>3 ){.  
e0c0: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
e0d0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
e0e0: 6f 62 6a 76 2c 20 22 43 41 4c 4c 42 41 43 4b 22  objv, "CALLBACK"
e0f0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
e100: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
e110: 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32  else if( objc==2
e120: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44   ){.      if( pD
e130: 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20 20  b->zBusy ){.    
e140: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
e150: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62  sult(interp, pDb
e160: 2d 3e 7a 42 75 73 79 2c 20 30 29 3b 0a 20 20 20  ->zBusy, 0);.   
e170: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
e180: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 42 75 73        char *zBus
e190: 79 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  y;.      int len
e1a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  ;.      if( pDb-
e1b0: 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20 20 20 20  >zBusy ){.      
e1c0: 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e    Tcl_Free(pDb->
e1d0: 7a 42 75 73 79 29 3b 0a 20 20 20 20 20 20 7d 0a  zBusy);.      }.
e1e0: 20 20 20 20 20 20 7a 42 75 73 79 20 3d 20 54 63        zBusy = Tc
e1f0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
e200: 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e  bj(objv[2], &len
e210: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 42 75  );.      if( zBu
e220: 73 79 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20  sy && len>0 ){. 
e230: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 42 75 73         pDb->zBus
e240: 79 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c  y = Tcl_Alloc( l
e250: 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20  en + 1 );.      
e260: 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 42    memcpy(pDb->zB
e270: 75 73 79 2c 20 7a 42 75 73 79 2c 20 6c 65 6e 2b  usy, zBusy, len+
e280: 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
e290: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 42  .        pDb->zB
e2a0: 75 73 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  usy = 0;.      }
e2b0: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
e2c0: 7a 42 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20  zBusy ){.       
e2d0: 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69   pDb->interp = i
e2e0: 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73  nterp;.        s
e2f0: 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64  qlite3_busy_hand
e300: 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20 44 62 42  ler(pDb->db, DbB
e310: 75 73 79 48 61 6e 64 6c 65 72 2c 20 70 44 62 29  usyHandler, pDb)
e320: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
e330: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
e340: 75 73 79 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d  usy_handler(pDb-
e350: 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  >db, 0, 0);.    
e360: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72    }.    }.    br
e370: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
e380: 20 20 20 24 64 62 20 63 61 63 68 65 20 66 6c 75     $db cache flu
e390: 73 68 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20  sh.  **     $db 
e3a0: 63 61 63 68 65 20 73 69 7a 65 20 6e 0a 20 20 2a  cache size n.  *
e3b0: 2a 0a 20 20 2a 2a 20 46 6c 75 73 68 20 74 68 65  *.  ** Flush the
e3c0: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
e3d0: 65 6e 74 20 63 61 63 68 65 2c 20 6f 72 20 73 65  ent cache, or se
e3e0: 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  t the maximum nu
e3f0: 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 63 61 63  mber of.  ** cac
e400: 68 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  hed statements..
e410: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43    */.  case DB_C
e420: 41 43 48 45 3a 20 7b 0a 20 20 20 20 63 68 61 72  ACHE: {.    char
e430: 20 2a 73 75 62 43 6d 64 3b 0a 20 20 20 20 69 6e   *subCmd;.    in
e440: 74 20 6e 3b 0a 0a 20 20 20 20 69 66 28 20 6f 62  t n;..    if( ob
e450: 6a 63 3c 3d 32 20 29 7b 0a 20 20 20 20 20 20 54  jc<=2 ){.      T
e460: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
e470: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
e480: 20 22 63 61 63 68 65 20 6f 70 74 69 6f 6e 20 3f   "cache option ?
e490: 61 72 67 3f 22 29 3b 0a 20 20 20 20 20 20 72 65  arg?");.      re
e4a0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
e4b0: 20 20 20 20 7d 0a 20 20 20 20 73 75 62 43 6d 64      }.    subCmd
e4c0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
e4d0: 46 72 6f 6d 4f 62 6a 28 20 6f 62 6a 76 5b 32 5d  FromObj( objv[2]
e4e0: 2c 20 30 20 29 3b 0a 20 20 20 20 69 66 28 20 2a  , 0 );.    if( *
e4f0: 73 75 62 43 6d 64 3d 3d 27 66 27 20 26 26 20 73  subCmd=='f' && s
e500: 74 72 63 6d 70 28 73 75 62 43 6d 64 2c 22 66 6c  trcmp(subCmd,"fl
e510: 75 73 68 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ush")==0 ){.    
e520: 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
e530: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  .        Tcl_Wro
e540: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
e550: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 66 6c 75 73  , 2, objv, "flus
e560: 68 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  h");.        ret
e570: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
e580: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
e590: 20 20 20 20 66 6c 75 73 68 53 74 6d 74 43 61 63      flushStmtCac
e5a0: 68 65 28 20 70 44 62 20 29 3b 0a 20 20 20 20 20  he( pDb );.     
e5b0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
e5c0: 20 2a 73 75 62 43 6d 64 3d 3d 27 73 27 20 26 26   *subCmd=='s' &&
e5d0: 20 73 74 72 63 6d 70 28 73 75 62 43 6d 64 2c 22   strcmp(subCmd,"
e5e0: 73 69 7a 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  size")==0 ){.   
e5f0: 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29     if( objc!=4 )
e600: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72  {.        Tcl_Wr
e610: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
e620: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 73 69 7a  p, 2, objv, "siz
e630: 65 20 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72  e n");.        r
e640: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
e650: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
e660: 20 20 20 20 20 20 69 66 28 20 54 43 4c 5f 45 52        if( TCL_ER
e670: 52 4f 52 3d 3d 54 63 6c 5f 47 65 74 49 6e 74 46  ROR==Tcl_GetIntF
e680: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
e690: 62 6a 76 5b 33 5d 2c 20 26 6e 29 20 29 7b 0a 20  bjv[3], &n) ){. 
e6a0: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70           Tcl_App
e6b0: 65 6e 64 52 65 73 75 6c 74 28 20 69 6e 74 65 72  endResult( inter
e6c0: 70 2c 20 22 63 61 6e 6e 6f 74 20 63 6f 6e 76 65  p, "cannot conve
e6d0: 72 74 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  rt \"", .       
e6e0: 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
e6f0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
e700: 76 5b 33 5d 2c 30 29 2c 20 22 5c 22 20 74 6f 20  v[3],0), "\" to 
e710: 69 6e 74 65 67 65 72 22 2c 20 30 29 3b 0a 20 20  integer", 0);.  
e720: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
e730: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
e740: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e750: 20 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20     if( n<0 ){.  
e760: 20 20 20 20 20 20 20 20 20 20 66 6c 75 73 68 53            flushS
e770: 74 6d 74 43 61 63 68 65 28 20 70 44 62 20 29 3b  tmtCache( pDb );
e780: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d  .            n =
e790: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65   0;.          }e
e7a0: 6c 73 65 20 69 66 28 20 6e 3e 4d 41 58 5f 50 52  lse if( n>MAX_PR
e7b0: 45 50 41 52 45 44 5f 53 54 4d 54 53 20 29 7b 0a  EPARED_STMTS ){.
e7c0: 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20              n = 
e7d0: 4d 41 58 5f 50 52 45 50 41 52 45 44 5f 53 54 4d  MAX_PREPARED_STM
e7e0: 54 53 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  TS;.          }.
e7f0: 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 6d            pDb->m
e800: 61 78 53 74 6d 74 20 3d 20 6e 3b 0a 20 20 20 20  axStmt = n;.    
e810: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
e820: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54    }else{.      T
e830: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
e840: 20 69 6e 74 65 72 70 2c 20 22 62 61 64 20 6f 70   interp, "bad op
e850: 74 69 6f 6e 20 5c 22 22 2c 20 0a 20 20 20 20 20  tion \"", .     
e860: 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
e870: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
e880: 5d 2c 30 29 2c 20 22 5c 22 3a 20 6d 75 73 74 20  ],0), "\": must 
e890: 62 65 20 66 6c 75 73 68 20 6f 72 20 73 69 7a 65  be flush or size
e8a0: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74  ", 0);.      ret
e8b0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
e8c0: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
e8d0: 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 20 24 64    }..  /*     $d
e8e0: 62 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 0a 20  b changes.  **. 
e8f0: 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e   ** Return the n
e900: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68  umber of rows th
e910: 61 74 20 77 65 72 65 20 6d 6f 64 69 66 69 65 64  at were modified
e920: 2c 20 69 6e 73 65 72 74 65 64 2c 20 6f 72 20 64  , inserted, or d
e930: 65 6c 65 74 65 64 20 62 79 0a 20 20 2a 2a 20 74  eleted by.  ** t
e940: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 49  he most recent I
e950: 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72  NSERT, UPDATE or
e960: 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e   DELETE statemen
e970: 74 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67  t, not including
e980: 20 0a 20 20 2a 2a 20 61 6e 79 20 63 68 61 6e 67   .  ** any chang
e990: 65 73 20 6d 61 64 65 20 62 79 20 74 72 69 67 67  es made by trigg
e9a0: 65 72 20 70 72 6f 67 72 61 6d 73 2e 0a 20 20 2a  er programs..  *
e9b0: 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 48 41 4e  /.  case DB_CHAN
e9c0: 47 45 53 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f  GES: {.    Tcl_O
e9d0: 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20  bj *pResult;.   
e9e0: 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
e9f0: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
ea00: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
ea10: 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20  , objv, "");.   
ea20: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
ea30: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ROR;.    }.    p
ea40: 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74  Result = Tcl_Get
ea50: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
ea60: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 49 6e  );.    Tcl_SetIn
ea70: 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 73 71  tObj(pResult, sq
ea80: 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 70 44  lite3_changes(pD
ea90: 62 2d 3e 64 62 29 29 3b 0a 20 20 20 20 62 72 65  b->db));.    bre
eaa0: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
eab0: 20 24 64 62 20 63 6c 6f 73 65 0a 20 20 2a 2a 0a   $db close.  **.
eac0: 20 20 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68    ** Shutdown th
ead0: 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2f 0a  e database.  */.
eae0: 20 20 63 61 73 65 20 44 42 5f 43 4c 4f 53 45 3a    case DB_CLOSE:
eaf0: 20 7b 0a 20 20 20 20 54 63 6c 5f 44 65 6c 65 74   {.    Tcl_Delet
eb00: 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  eCommand(interp,
eb10: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
eb20: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
eb30: 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  ));.    break;. 
eb40: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
eb50: 20 20 24 64 62 20 63 6f 6c 6c 61 74 65 20 4e 41    $db collate NA
eb60: 4d 45 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20  ME SCRIPT.  **. 
eb70: 20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77   ** Create a new
eb80: 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   SQL collation f
eb90: 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e  unction called N
eba0: 41 4d 45 2e 20 20 57 68 65 6e 65 76 65 72 0a 20  AME.  Whenever. 
ebb0: 20 2a 2a 20 74 68 61 74 20 66 75 6e 63 74 69 6f   ** that functio
ebc0: 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 6e 76  n is called, inv
ebd0: 6f 6b 65 20 53 43 52 49 50 54 20 74 6f 20 65 76  oke SCRIPT to ev
ebe0: 61 6c 75 61 74 65 20 74 68 65 20 66 75 6e 63 74  aluate the funct
ebf0: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ion..  */.  case
ec00: 20 44 42 5f 43 4f 4c 4c 41 54 45 3a 20 7b 0a 20   DB_COLLATE: {. 
ec10: 20 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70     SqlCollate *p
ec20: 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 63 68 61  Collate;.    cha
ec30: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 68  r *zName;.    ch
ec40: 61 72 20 2a 7a 53 63 72 69 70 74 3b 0a 20 20 20  ar *zScript;.   
ec50: 20 69 6e 74 20 6e 53 63 72 69 70 74 3b 0a 20 20   int nScript;.  
ec60: 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b    if( objc!=4 ){
ec70: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
ec80: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
ec90: 32 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 20 53  2, objv, "NAME S
eca0: 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72  CRIPT");.      r
ecb0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
ecc0: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65  .    }.    zName
ecd0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
ece0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
ecf0: 20 30 29 3b 0a 20 20 20 20 7a 53 63 72 69 70 74   0);.    zScript
ed00: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
ed10: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c  FromObj(objv[3],
ed20: 20 26 6e 53 63 72 69 70 74 29 3b 0a 20 20 20 20   &nScript);.    
ed30: 70 43 6f 6c 6c 61 74 65 20 3d 20 28 53 71 6c 43  pCollate = (SqlC
ed40: 6f 6c 6c 61 74 65 2a 29 54 63 6c 5f 41 6c 6c 6f  ollate*)Tcl_Allo
ed50: 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 6f 6c 6c  c( sizeof(*pColl
ed60: 61 74 65 29 20 2b 20 6e 53 63 72 69 70 74 20 2b  ate) + nScript +
ed70: 20 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43   1 );.    if( pC
ed80: 6f 6c 6c 61 74 65 3d 3d 30 20 29 20 72 65 74 75  ollate==0 ) retu
ed90: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
eda0: 20 20 70 43 6f 6c 6c 61 74 65 2d 3e 69 6e 74 65    pCollate->inte
edb0: 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20  rp = interp;.   
edc0: 20 70 43 6f 6c 6c 61 74 65 2d 3e 70 4e 65 78 74   pCollate->pNext
edd0: 20 3d 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65   = pDb->pCollate
ede0: 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65 2d 3e  ;.    pCollate->
edf0: 7a 53 63 72 69 70 74 20 3d 20 28 63 68 61 72 2a  zScript = (char*
ee00: 29 26 70 43 6f 6c 6c 61 74 65 5b 31 5d 3b 0a 20  )&pCollate[1];. 
ee10: 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65     pDb->pCollate
ee20: 20 3d 20 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20   = pCollate;.   
ee30: 20 6d 65 6d 63 70 79 28 70 43 6f 6c 6c 61 74 65   memcpy(pCollate
ee40: 2d 3e 7a 53 63 72 69 70 74 2c 20 7a 53 63 72 69  ->zScript, zScri
ee50: 70 74 2c 20 6e 53 63 72 69 70 74 2b 31 29 3b 0a  pt, nScript+1);.
ee60: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
ee70: 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
ee80: 28 70 44 62 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c  (pDb->db, zName,
ee90: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20   SQLITE_UTF8, . 
eea0: 20 20 20 20 20 20 20 70 43 6f 6c 6c 61 74 65 2c         pCollate,
eeb0: 20 74 63 6c 53 71 6c 43 6f 6c 6c 61 74 65 29 20   tclSqlCollate) 
eec0: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  ){.      Tcl_Set
eed0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
eee0: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 65  char *)sqlite3_e
eef0: 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20  rrmsg(pDb->db), 
ef00: 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20  TCL_VOLATILE);. 
ef10: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
ef20: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
ef30: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
ef40: 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 63  *.  **     $db c
ef50: 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 20  ollation_needed 
ef60: 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a  SCRIPT.  **.  **
ef70: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 51   Create a new SQ
ef80: 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63  L collation func
ef90: 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45  tion called NAME
efa0: 2e 20 20 57 68 65 6e 65 76 65 72 0a 20 20 2a 2a  .  Whenever.  **
efb0: 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 69   that function i
efc0: 73 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65  s called, invoke
efd0: 20 53 43 52 49 50 54 20 74 6f 20 65 76 61 6c 75   SCRIPT to evalu
efe0: 61 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  ate the function
eff0: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
f000: 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4e 45 45 44 45  _COLLATION_NEEDE
f010: 44 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a  D: {.    if( obj
f020: 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=3 ){.      Tc
f030: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
f040: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
f050: 22 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20  "SCRIPT");.     
f060: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
f070: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  R;.    }.    if(
f080: 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65   pDb->pCollateNe
f090: 65 64 65 64 20 29 7b 0a 20 20 20 20 20 20 54 63  eded ){.      Tc
f0a0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
f0b0: 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64  Db->pCollateNeed
f0c0: 65 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ed);.    }.    p
f0d0: 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64  Db->pCollateNeed
f0e0: 65 64 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  ed = Tcl_Duplica
f0f0: 74 65 4f 62 6a 28 6f 62 6a 76 5b 32 5d 29 3b 0a  teObj(objv[2]);.
f100: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
f110: 6f 75 6e 74 28 70 44 62 2d 3e 70 43 6f 6c 6c 61  ount(pDb->pColla
f120: 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 73  teNeeded);.    s
f130: 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e  qlite3_collation
f140: 5f 6e 65 65 64 65 64 28 70 44 62 2d 3e 64 62 2c  _needed(pDb->db,
f150: 20 70 44 62 2c 20 74 63 6c 43 6f 6c 6c 61 74 65   pDb, tclCollate
f160: 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 62 72 65  Needed);.    bre
f170: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
f180: 20 24 64 62 20 63 6f 6d 6d 69 74 5f 68 6f 6f 6b   $db commit_hook
f190: 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a   ?CALLBACK?.  **
f1a0: 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  .  ** Invoke the
f1b0: 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20   given callback 
f1c0: 6a 75 73 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d  just before comm
f1d0: 69 74 74 69 6e 67 20 65 76 65 72 79 20 53 51 4c  itting every SQL
f1e0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
f1f0: 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 62 61  ** If the callba
f200: 63 6b 20 74 68 72 6f 77 73 20 61 6e 20 65 78 63  ck throws an exc
f210: 65 70 74 69 6f 6e 20 6f 72 20 72 65 74 75 72 6e  eption or return
f220: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
f230: 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61   the.  ** transa
f240: 63 74 69 6f 6e 20 69 73 20 61 62 6f 72 74 65 64  ction is aborted
f250: 2e 20 20 49 66 20 43 41 4c 4c 42 41 43 4b 20 69  .  If CALLBACK i
f260: 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  s an empty strin
f270: 67 2c 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 0a  g, the callback.
f280: 20 20 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64    ** is disabled
f290: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
f2a0: 5f 43 4f 4d 4d 49 54 5f 48 4f 4f 4b 3a 20 7b 0a  _COMMIT_HOOK: {.
f2b0: 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29      if( objc>3 )
f2c0: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
f2d0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
f2e0: 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c   2, objv, "?CALL
f2f0: 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72  BACK?");.      r
f300: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
f310: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
f320: 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  bjc==2 ){.      
f330: 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74  if( pDb->zCommit
f340: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
f350: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
f360: 65 72 70 2c 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69  erp, pDb->zCommi
f370: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 0);.      }. 
f380: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f390: 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 0a 20  char *zCommit;. 
f3a0: 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20       int len;.  
f3b0: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 43 6f      if( pDb->zCo
f3c0: 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  mmit ){.        
f3d0: 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 43  Tcl_Free(pDb->zC
f3e0: 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a  ommit);.      }.
f3f0: 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20        zCommit = 
f400: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
f410: 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c  mObj(objv[2], &l
f420: 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  en);.      if( z
f430: 43 6f 6d 6d 69 74 20 26 26 20 6c 65 6e 3e 30 20  Commit && len>0 
f440: 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
f450: 7a 43 6f 6d 6d 69 74 20 3d 20 54 63 6c 5f 41 6c  zCommit = Tcl_Al
f460: 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a  loc( len + 1 );.
f470: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
f480: 44 62 2d 3e 7a 43 6f 6d 6d 69 74 2c 20 7a 43 6f  Db->zCommit, zCo
f490: 6d 6d 69 74 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20  mmit, len+1);.  
f4a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f4b0: 20 20 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20     pDb->zCommit 
f4c0: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
f4d0: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d     if( pDb->zCom
f4e0: 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  mit ){.        p
f4f0: 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74  Db->interp = int
f500: 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  erp;.        sql
f510: 69 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b  ite3_commit_hook
f520: 28 70 44 62 2d 3e 64 62 2c 20 44 62 43 6f 6d 6d  (pDb->db, DbComm
f530: 69 74 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b  itHandler, pDb);
f540: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
f550: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f        sqlite3_co
f560: 6d 6d 69 74 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64  mmit_hook(pDb->d
f570: 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  b, 0, 0);.      
f580: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  }.    }.    brea
f590: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20  k;.  }..  /*    
f5a0: 24 64 62 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c  $db complete SQL
f5b0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72  .  **.  ** Retur
f5c0: 6e 20 54 52 55 45 20 69 66 20 53 51 4c 20 69 73  n TRUE if SQL is
f5d0: 20 61 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c 20   a complete SQL 
f5e0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 52 65 74 75  statement.  Retu
f5f0: 72 6e 20 46 41 4c 53 45 20 69 66 0a 20 20 2a 2a  rn FALSE if.  **
f600: 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 69 6e 65   additional line
f610: 73 20 6f 66 20 69 6e 70 75 74 20 61 72 65 20 6e  s of input are n
f620: 65 65 64 65 64 2e 20 20 54 68 69 73 20 69 73 20  eeded.  This is 
f630: 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 0a 20  similar to the. 
f640: 20 2a 2a 20 62 75 69 6c 74 2d 69 6e 20 22 69 6e   ** built-in "in
f650: 66 6f 20 63 6f 6d 70 6c 65 74 65 22 20 63 6f 6d  fo complete" com
f660: 6d 61 6e 64 20 6f 66 20 54 63 6c 2e 0a 20 20 2a  mand of Tcl..  *
f670: 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f 4d 50  /.  case DB_COMP
f680: 4c 45 54 45 3a 20 7b 0a 23 69 66 6e 64 65 66 20  LETE: {.#ifndef 
f690: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
f6a0: 4c 45 54 45 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  LETE.    Tcl_Obj
f6b0: 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20 20 69   *pResult;.    i
f6c0: 6e 74 20 69 73 43 6f 6d 70 6c 65 74 65 3b 0a 20  nt isComplete;. 
f6d0: 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29     if( objc!=3 )
f6e0: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
f6f0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
f700: 20 32 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 22 29   2, objv, "SQL")
f710: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
f720: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
f730: 20 20 20 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d      isComplete =
f740: 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74   sqlite3_complet
f750: 65 28 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  e( Tcl_GetString
f760: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
f770: 20 30 29 20 29 3b 0a 20 20 20 20 70 52 65 73 75   0) );.    pResu
f780: 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52  lt = Tcl_GetObjR
f790: 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
f7a0: 20 20 20 54 63 6c 5f 53 65 74 42 6f 6f 6c 65 61     Tcl_SetBoolea
f7b0: 6e 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 69 73  nObj(pResult, is
f7c0: 43 6f 6d 70 6c 65 74 65 29 3b 0a 23 65 6e 64 69  Complete);.#endi
f7d0: 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  f.    break;.  }
f7e0: 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 63 6f  ..  /*    $db co
f7f0: 70 79 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f  py conflict-algo
f800: 72 69 74 68 6d 20 74 61 62 6c 65 20 66 69 6c 65  rithm table file
f810: 6e 61 6d 65 20 3f 53 45 50 41 52 41 54 4f 52 3f  name ?SEPARATOR?
f820: 20 3f 4e 55 4c 4c 49 4e 44 49 43 41 54 4f 52 3f   ?NULLINDICATOR?
f830: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f 70 79 20  .  **.  ** Copy 
f840: 64 61 74 61 20 69 6e 74 6f 20 74 61 62 6c 65 20  data into table 
f850: 66 72 6f 6d 20 66 69 6c 65 6e 61 6d 65 2c 20 6f  from filename, o
f860: 70 74 69 6f 6e 61 6c 6c 79 20 75 73 69 6e 67 20  ptionally using 
f870: 53 45 50 41 52 41 54 4f 52 0a 20 20 2a 2a 20 61  SEPARATOR.  ** a
f880: 73 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74  s column separat
f890: 6f 72 73 2e 20 20 49 66 20 61 20 63 6f 6c 75 6d  ors.  If a colum
f8a0: 6e 20 63 6f 6e 74 61 69 6e 73 20 61 20 6e 75 6c  n contains a nul
f8b0: 6c 20 73 74 72 69 6e 67 2c 20 6f 72 20 74 68 65  l string, or the
f8c0: 0a 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 4e  .  ** value of N
f8d0: 55 4c 4c 49 4e 44 49 43 41 54 4f 52 2c 20 61 20  ULLINDICATOR, a 
f8e0: 4e 55 4c 4c 20 69 73 20 69 6e 73 65 72 74 65 64  NULL is inserted
f8f0: 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 2e   for the column.
f900: 0a 20 20 2a 2a 20 63 6f 6e 66 6c 69 63 74 2d 61  .  ** conflict-a
f910: 6c 67 6f 72 69 74 68 6d 20 69 73 20 6f 6e 65 20  lgorithm is one 
f920: 6f 66 20 74 68 65 20 73 71 6c 69 74 65 20 63 6f  of the sqlite co
f930: 6e 66 6c 69 63 74 20 61 6c 67 6f 72 69 74 68 6d  nflict algorithm
f940: 73 3a 0a 20 20 2a 2a 20 20 20 20 72 6f 6c 6c 62  s:.  **    rollb
f950: 61 63 6b 2c 20 61 62 6f 72 74 2c 20 66 61 69 6c  ack, abort, fail
f960: 2c 20 69 67 6e 6f 72 65 2c 20 72 65 70 6c 61 63  , ignore, replac
f970: 65 0a 20 20 2a 2a 20 4f 6e 20 73 75 63 63 65 73  e.  ** On succes
f980: 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75  s, return the nu
f990: 6d 62 65 72 20 6f 66 20 6c 69 6e 65 73 20 70 72  mber of lines pr
f9a0: 6f 63 65 73 73 65 64 2c 20 6e 6f 74 20 6e 65 63  ocessed, not nec
f9b0: 65 73 73 61 72 69 6c 79 20 73 61 6d 65 0a 20 20  essarily same.  
f9c0: 2a 2a 20 61 73 20 27 64 62 20 63 68 61 6e 67 65  ** as 'db change
f9d0: 73 27 20 64 75 65 20 74 6f 20 63 6f 6e 66 6c 69  s' due to confli
f9e0: 63 74 2d 61 6c 67 6f 72 69 74 68 6d 20 73 65 6c  ct-algorithm sel
f9f0: 65 63 74 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ected..  **.  **
fa00: 20 54 68 69 73 20 63 6f 64 65 20 69 73 20 62 61   This code is ba
fa10: 73 69 63 61 6c 6c 79 20 61 6e 20 69 6d 70 6c 65  sically an imple
fa20: 6d 65 6e 74 61 74 69 6f 6e 2f 65 6e 68 61 6e 63  mentation/enhanc
fa30: 65 6d 65 6e 74 20 6f 66 0a 20 20 2a 2a 20 74 68  ement of.  ** th
fa40: 65 20 73 71 6c 69 74 65 33 20 73 68 65 6c 6c 2e  e sqlite3 shell.
fa50: 63 20 22 2e 69 6d 70 6f 72 74 22 20 63 6f 6d 6d  c ".import" comm
fa60: 61 6e 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  and..  **.  ** T
fa70: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 75 73 61 67  his command usag
fa80: 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  e is equivalent 
fa90: 74 6f 20 74 68 65 20 73 71 6c 69 74 65 32 2e 78  to the sqlite2.x
faa0: 20 43 4f 50 59 20 73 74 61 74 65 6d 65 6e 74 2c   COPY statement,
fab0: 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 6d 70 6f  .  ** which impo
fac0: 72 74 73 20 66 69 6c 65 20 64 61 74 61 20 69 6e  rts file data in
fad0: 74 6f 20 61 20 74 61 62 6c 65 20 75 73 69 6e 67  to a table using
fae0: 20 74 68 65 20 50 6f 73 74 67 72 65 53 51 4c 20   the PostgreSQL 
faf0: 43 4f 50 59 20 66 69 6c 65 20 66 6f 72 6d 61 74  COPY file format
fb00: 3a 0a 20 20 2a 2a 20 20 20 24 64 62 20 63 6f 70  :.  **   $db cop
fb10: 79 20 24 63 6f 6e 66 6c 69 74 5f 61 6c 67 6f 20  y $conflit_algo 
fb20: 24 74 61 62 6c 65 5f 6e 61 6d 65 20 24 66 69 6c  $table_name $fil
fb30: 65 6e 61 6d 65 20 5c 74 20 5c 5c 4e 0a 20 20 2a  ename \t \\N.  *
fb40: 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f 50 59  /.  case DB_COPY
fb50: 3a 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54  : {.    char *zT
fb60: 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  able;           
fb70: 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 64 61      /* Insert da
fb80: 74 61 20 69 6e 74 6f 20 74 68 69 73 20 74 61 62  ta into this tab
fb90: 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  le */.    char *
fba0: 7a 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20  zFile;          
fbb0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c        /* The fil
fbc0: 65 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20  e from which to 
fbd0: 65 78 74 72 61 63 74 20 64 61 74 61 20 2a 2f 0a  extract data */.
fbe0: 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6e 66 6c      char *zConfl
fbf0: 69 63 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ict;            
fc00: 2f 2a 20 54 68 65 20 63 6f 6e 66 6c 69 63 74 20  /* The conflict 
fc10: 61 6c 67 6f 72 69 74 68 6d 20 74 6f 20 75 73 65  algorithm to use
fc20: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
fc30: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20  stmt *pStmt;    
fc40: 20 20 20 20 2f 2a 20 41 20 73 74 61 74 65 6d 65      /* A stateme
fc50: 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43  nt */.    int nC
fc60: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
fc70: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
fc80: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
fc90: 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69  e table */.    i
fca0: 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20  nt nByte;       
fcb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
fcc0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
fcd0: 20 61 6e 20 53 51 4c 20 73 74 72 69 6e 67 20 2a   an SQL string *
fce0: 2f 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 20  /.    int i, j; 
fcf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd00: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
fd10: 72 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53  rs */.    int nS
fd20: 65 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ep;             
fd30: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
fd40: 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 53 65 70  of bytes in zSep
fd50: 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4e  [] */.    int nN
fd60: 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ull;            
fd70: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
fd80: 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 4e 75 6c  of bytes in zNul
fd90: 6c 5b 5d 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  l[] */.    char 
fda0: 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20  *zSql;          
fdb0: 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 53 51 4c         /* An SQL
fdc0: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
fdd0: 20 20 63 68 61 72 20 2a 7a 4c 69 6e 65 3b 20 20    char *zLine;  
fde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fdf0: 20 41 20 73 69 6e 67 6c 65 20 6c 69 6e 65 20 6f   A single line o
fe00: 66 20 69 6e 70 75 74 20 66 72 6f 6d 20 74 68 65  f input from the
fe10: 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61   file */.    cha
fe20: 72 20 2a 2a 61 7a 43 6f 6c 3b 20 20 20 20 20 20  r **azCol;      
fe30: 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4c 69 6e           /* zLin
fe40: 65 5b 5d 20 62 72 6f 6b 65 6e 20 75 70 20 69 6e  e[] broken up in
fe50: 74 6f 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  to columns */.  
fe60: 20 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b    char *zCommit;
fe70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fe80: 20 48 6f 77 20 74 6f 20 63 6f 6d 6d 69 74 20 63   How to commit c
fe90: 68 61 6e 67 65 73 20 2a 2f 0a 20 20 20 20 46 49  hanges */.    FI
fea0: 4c 45 20 2a 69 6e 3b 20 20 20 20 20 20 20 20 20  LE *in;         
feb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
fec0: 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20   input file */. 
fed0: 20 20 20 69 6e 74 20 6c 69 6e 65 6e 6f 20 3d 20     int lineno = 
fee0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
fef0: 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 6f 66  * Line number of
ff00: 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20   input file */. 
ff10: 20 20 20 63 68 61 72 20 7a 4c 69 6e 65 4e 75 6d     char zLineNum
ff20: 5b 38 30 5d 3b 20 20 20 20 20 20 20 20 20 20 2f  [80];          /
ff30: 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 70 72  * Line number pr
ff40: 69 6e 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20  int buffer */.  
ff50: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75    Tcl_Obj *pResu
ff60: 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  lt;           /*
ff70: 20 69 6e 74 65 72 70 20 72 65 73 75 6c 74 20 2a   interp result *
ff80: 2f 0a 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 65  /..    char *zSe
ff90: 70 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 75  p;.    char *zNu
ffa0: 6c 6c 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  ll;.    if( objc
ffb0: 3c 35 20 7c 7c 20 6f 62 6a 63 3e 37 20 29 7b 0a  <5 || objc>7 ){.
ffc0: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
ffd0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
ffe0: 2c 20 6f 62 6a 76 2c 20 0a 20 20 20 20 20 20 20  , objv, .       
fff0: 20 20 22 43 4f 4e 46 4c 49 43 54 2d 41 4c 47 4f    "CONFLICT-ALGO
10000 52 49 54 48 4d 20 54 41 42 4c 45 20 46 49 4c 45  RITHM TABLE FILE
10010 4e 41 4d 45 20 3f 53 45 50 41 52 41 54 4f 52 3f  NAME ?SEPARATOR?
10020 20 3f 4e 55 4c 4c 49 4e 44 49 43 41 54 4f 52 3f   ?NULLINDICATOR?
10030 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
10040 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
10050 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 3d  }.    if( objc>=
10060 36 20 29 7b 0a 20 20 20 20 20 20 7a 53 65 70 20  6 ){.      zSep 
10070 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
10080 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 35 5d 2c 20  romObj(objv[5], 
10090 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
100a0 20 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 74 22       zSep = "\t"
100b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
100c0 6f 62 6a 63 3e 3d 37 20 29 7b 0a 20 20 20 20 20  objc>=7 ){.     
100d0 20 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f 47 65 74   zNull = Tcl_Get
100e0 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
100f0 6a 76 5b 36 5d 2c 20 30 29 3b 0a 20 20 20 20 7d  jv[6], 0);.    }
10100 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4e 75 6c  else{.      zNul
10110 6c 20 3d 20 22 22 3b 0a 20 20 20 20 7d 0a 20 20  l = "";.    }.  
10120 20 20 7a 43 6f 6e 66 6c 69 63 74 20 3d 20 54 63    zConflict = Tc
10130 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
10140 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a  bj(objv[2], 0);.
10150 20 20 20 20 7a 54 61 62 6c 65 20 3d 20 54 63 6c      zTable = Tcl
10160 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
10170 6a 28 6f 62 6a 76 5b 33 5d 2c 20 30 29 3b 0a 20  j(objv[3], 0);. 
10180 20 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47     zFile = Tcl_G
10190 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
101a0 6f 62 6a 76 5b 34 5d 2c 20 30 29 3b 0a 20 20 20  objv[4], 0);.   
101b0 20 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e 33 30   nSep = strlen30
101c0 28 7a 53 65 70 29 3b 0a 20 20 20 20 6e 4e 75 6c  (zSep);.    nNul
101d0 6c 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 4e 75  l = strlen30(zNu
101e0 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 65  ll);.    if( nSe
101f0 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63  p==0 ){.      Tc
10200 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
10210 6e 74 65 72 70 2c 22 45 72 72 6f 72 3a 20 6e 6f  nterp,"Error: no
10220 6e 2d 6e 75 6c 6c 20 73 65 70 61 72 61 74 6f 72  n-null separator
10230 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f   required for co
10240 70 79 22 2c 30 29 3b 0a 20 20 20 20 20 20 72 65  py",0);.      re
10250 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
10260 20 20 20 20 7d 0a 20 20 20 20 69 66 28 73 74 72      }.    if(str
10270 63 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22  cmp(zConflict, "
10280 72 6f 6c 6c 62 61 63 6b 22 29 20 21 3d 20 30 20  rollback") != 0 
10290 26 26 0a 20 20 20 20 20 20 20 73 74 72 63 6d 70  &&.       strcmp
102a0 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 61 62 6f  (zConflict, "abo
102b0 72 74 22 20 20 20 29 20 21 3d 20 30 20 26 26 0a  rt"   ) != 0 &&.
102c0 20 20 20 20 20 20 20 73 74 72 63 6d 70 28 7a 43         strcmp(zC
102d0 6f 6e 66 6c 69 63 74 2c 20 22 66 61 69 6c 22 20  onflict, "fail" 
102e0 20 20 20 29 20 21 3d 20 30 20 26 26 0a 20 20 20     ) != 0 &&.   
102f0 20 20 20 20 73 74 72 63 6d 70 28 7a 43 6f 6e 66      strcmp(zConf
10300 6c 69 63 74 2c 20 22 69 67 6e 6f 72 65 22 20 20  lict, "ignore"  
10310 29 20 21 3d 20 30 20 26 26 0a 20 20 20 20 20 20  ) != 0 &&.      
10320 20 73 74 72 63 6d 70 28 7a 43 6f 6e 66 6c 69 63   strcmp(zConflic
10330 74 2c 20 22 72 65 70 6c 61 63 65 22 20 29 20 21  t, "replace" ) !
10340 3d 20 30 20 29 20 7b 0a 20 20 20 20 20 20 54 63  = 0 ) {.      Tc
10350 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
10360 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 5c  nterp, "Error: \
10370 22 22 2c 20 7a 43 6f 6e 66 6c 69 63 74 2c 20 0a  "", zConflict, .
10380 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c              "\",
10390 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69   conflict-algori
103a0 74 68 6d 20 6d 75 73 74 20 62 65 20 6f 6e 65 20  thm must be one 
103b0 6f 66 3a 20 72 6f 6c 6c 62 61 63 6b 2c 20 22 0a  of: rollback, ".
103c0 20 20 20 20 20 20 20 20 20 20 20 20 22 61 62 6f              "abo
103d0 72 74 2c 20 66 61 69 6c 2c 20 69 67 6e 6f 72 65  rt, fail, ignore
103e0 2c 20 6f 72 20 72 65 70 6c 61 63 65 22 2c 20 30  , or replace", 0
103f0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
10400 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
10410 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  .    zSql = sqli
10420 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c  te3_mprintf("SEL
10430 45 43 54 20 2a 20 46 52 4f 4d 20 27 25 71 27 22  ECT * FROM '%q'"
10440 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 69  , zTable);.    i
10450 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20  f( zSql==0 ){.  
10460 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
10470 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72  sult(interp, "Er
10480 72 6f 72 3a 20 6e 6f 20 73 75 63 68 20 74 61 62  ror: no such tab
10490 6c 65 3a 20 22 2c 20 7a 54 61 62 6c 65 2c 20 30  le: ", zTable, 0
104a0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
104b0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
104c0 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 73 74 72  .    nByte = str
104d0 6c 65 6e 33 30 28 7a 53 71 6c 29 3b 0a 20 20 20  len30(zSql);.   
104e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
104f0 65 70 61 72 65 28 70 44 62 2d 3e 64 62 2c 20 7a  epare(pDb->db, z
10500 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
10510 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
10520 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20  _free(zSql);.   
10530 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
10540 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
10550 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72  t(interp, "Error
10560 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  : ", sqlite3_err
10570 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 30 29  msg(pDb->db), 0)
10580 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 30  ;.      nCol = 0
10590 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
105a0 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65     nCol = sqlite
105b0 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70  3_column_count(p
105c0 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Stmt);.    }.   
105d0 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
105e0 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66  e(pStmt);.    if
105f0 28 20 6e 43 6f 6c 3d 3d 30 20 29 20 7b 0a 20 20  ( nCol==0 ) {.  
10600 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
10610 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
10620 7a 53 71 6c 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e  zSql = malloc( n
10630 42 79 74 65 20 2b 20 35 30 20 2b 20 6e 43 6f 6c  Byte + 50 + nCol
10640 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 53  *2 );.    if( zS
10650 71 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20 20  ql==0 ) {.      
10660 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
10670 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a  (interp, "Error:
10680 20 63 61 6e 27 74 20 6d 61 6c 6c 6f 63 28 29 22   can't malloc()"
10690 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , 0);.      retu
106a0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
106b0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
106c0 73 6e 70 72 69 6e 74 66 28 6e 42 79 74 65 2b 35  snprintf(nByte+5
106d0 30 2c 20 7a 53 71 6c 2c 20 22 49 4e 53 45 52 54  0, zSql, "INSERT
106e0 20 4f 52 20 25 71 20 49 4e 54 4f 20 27 25 71 27   OR %q INTO '%q'
106f0 20 56 41 4c 55 45 53 28 3f 22 2c 0a 20 20 20 20   VALUES(?",.    
10700 20 20 20 20 20 7a 43 6f 6e 66 6c 69 63 74 2c 20       zConflict, 
10710 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 6a 20 3d  zTable);.    j =
10720 20 73 74 72 6c 65 6e 33 30 28 7a 53 71 6c 29 3b   strlen30(zSql);
10730 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
10740 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
10750 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 2c    zSql[j++] = ',
10760 27 3b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b  ';.      zSql[j+
10770 2b 5d 20 3d 20 27 3f 27 3b 0a 20 20 20 20 7d 0a  +] = '?';.    }.
10780 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20      zSql[j++] = 
10790 27 29 27 3b 0a 20 20 20 20 7a 53 71 6c 5b 6a 5d  ')';.    zSql[j]
107a0 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73   = 0;.    rc = s
107b0 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 70  qlite3_prepare(p
107c0 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  Db->db, zSql, -1
107d0 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
107e0 20 20 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20    free(zSql);.  
107f0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
10800 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
10810 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f  lt(interp, "Erro
10820 72 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  r: ", sqlite3_er
10830 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 30  rmsg(pDb->db), 0
10840 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10850 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
10860 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
10870 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
10880 20 20 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a      in = fopen(z
10890 46 69 6c 65 2c 20 22 72 62 22 29 3b 0a 20 20 20  File, "rb");.   
108a0 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20   if( in==0 ){.  
108b0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
108c0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72  sult(interp, "Er
108d0 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e  ror: cannot open
108e0 20 66 69 6c 65 3a 20 22 2c 20 7a 46 69 6c 65 2c   file: ", zFile,
108f0 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71   NULL);.      sq
10900 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
10910 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74  Stmt);.      ret
10920 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
10930 20 20 20 7d 0a 20 20 20 20 61 7a 43 6f 6c 20 3d     }.    azCol =
10940 20 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28   malloc( sizeof(
10950 61 7a 43 6f 6c 5b 30 5d 29 2a 28 6e 43 6f 6c 2b  azCol[0])*(nCol+
10960 31 29 20 29 3b 0a 20 20 20 20 69 66 28 20 61 7a  1) );.    if( az
10970 43 6f 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20  Col==0 ) {.     
10980 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
10990 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72  t(interp, "Error
109a0 3a 20 63 61 6e 27 74 20 6d 61 6c 6c 6f 63 28 29  : can't malloc()
109b0 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 63 6c  ", 0);.      fcl
109c0 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 20 20 72  ose(in);.      r
109d0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
109e0 0a 20 20 20 20 7d 0a 20 20 20 20 28 76 6f 69 64  .    }.    (void
109f0 29 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44  )sqlite3_exec(pD
10a00 62 2d 3e 64 62 2c 20 22 42 45 47 49 4e 22 2c 20  b->db, "BEGIN", 
10a10 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7a 43  0, 0, 0);.    zC
10a20 6f 6d 6d 69 74 20 3d 20 22 43 4f 4d 4d 49 54 22  ommit = "COMMIT"
10a30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4c  ;.    while( (zL
10a40 69 6e 65 20 3d 20 6c 6f 63 61 6c 5f 67 65 74 6c  ine = local_getl
10a50 69 6e 65 28 30 2c 20 69 6e 29 29 21 3d 30 20 29  ine(0, in))!=0 )
10a60 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 3b  {.      char *z;
10a70 0a 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b  .      lineno++;
10a80 0a 20 20 20 20 20 20 61 7a 43 6f 6c 5b 30 5d 20  .      azCol[0] 
10a90 3d 20 7a 4c 69 6e 65 3b 0a 20 20 20 20 20 20 66  = zLine;.      f
10aa0 6f 72 28 69 3d 30 2c 20 7a 3d 7a 4c 69 6e 65 3b  or(i=0, z=zLine;
10ab0 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20 20   *z; z++){.     
10ac0 20 20 20 69 66 28 20 2a 7a 3d 3d 7a 53 65 70 5b     if( *z==zSep[
10ad0 30 5d 20 26 26 20 73 74 72 6e 63 6d 70 28 7a 2c  0] && strncmp(z,
10ae0 20 7a 53 65 70 2c 20 6e 53 65 70 29 3d 3d 30 20   zSep, nSep)==0 
10af0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 7a 20  ){.          *z 
10b00 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69  = 0;.          i
10b10 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ++;.          if
10b20 28 20 69 3c 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  ( i<nCol ){.    
10b30 20 20 20 20 20 20 20 20 61 7a 43 6f 6c 5b 69 5d          azCol[i]
10b40 20 3d 20 26 7a 5b 6e 53 65 70 5d 3b 0a 20 20 20   = &z[nSep];.   
10b50 20 20 20 20 20 20 20 20 20 7a 20 2b 3d 20 6e 53           z += nS
10b60 65 70 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  ep-1;.          
10b70 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
10b80 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 2b    }.      if( i+
10b90 31 21 3d 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20  1!=nCol ){.     
10ba0 20 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20     char *zErr;. 
10bb0 20 20 20 20 20 20 20 69 6e 74 20 6e 45 72 72 20         int nErr 
10bc0 3d 20 73 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  = strlen30(zFile
10bd0 29 20 2b 20 32 30 30 3b 0a 20 20 20 20 20 20 20  ) + 200;.       
10be0 20 7a 45 72 72 20 3d 20 6d 61 6c 6c 6f 63 28 6e   zErr = malloc(n
10bf0 45 72 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Err);.        if
10c00 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 20 20  ( zErr ){.      
10c10 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
10c20 69 6e 74 66 28 6e 45 72 72 2c 20 7a 45 72 72 2c  intf(nErr, zErr,
10c30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22 45  .             "E
10c40 72 72 6f 72 3a 20 25 73 20 6c 69 6e 65 20 25 64  rror: %s line %d
10c50 3a 20 65 78 70 65 63 74 65 64 20 25 64 20 63 6f  : expected %d co
10c60 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 62 75  lumns of data bu
10c70 74 20 66 6f 75 6e 64 20 25 64 22 2c 0a 20 20 20  t found %d",.   
10c80 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65 2c            zFile,
10c90 20 6c 69 6e 65 6e 6f 2c 20 6e 43 6f 6c 2c 20 69   lineno, nCol, i
10ca0 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 54  +1);.          T
10cb0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
10cc0 69 6e 74 65 72 70 2c 20 7a 45 72 72 2c 20 30 29  interp, zErr, 0)
10cd0 3b 0a 20 20 20 20 20 20 20 20 20 20 66 72 65 65  ;.          free
10ce0 28 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 20 20  (zErr);.        
10cf0 7d 0a 20 20 20 20 20 20 20 20 7a 43 6f 6d 6d 69  }.        zCommi
10d00 74 20 3d 20 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a  t = "ROLLBACK";.
10d10 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
10d20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
10d30 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
10d40 2b 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 63  +){.        /* c
10d50 68 65 63 6b 20 66 6f 72 20 6e 75 6c 6c 20 64 61  heck for null da
10d60 74 61 2c 20 69 66 20 73 6f 2c 20 62 69 6e 64 20  ta, if so, bind 
10d70 61 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20 20  as null */.     
10d80 20 20 20 69 66 28 20 28 6e 4e 75 6c 6c 3e 30 20     if( (nNull>0 
10d90 26 26 20 73 74 72 63 6d 70 28 61 7a 43 6f 6c 5b  && strcmp(azCol[
10da0 69 5d 2c 20 7a 4e 75 6c 6c 29 3d 3d 30 29 0a 20  i], zNull)==0). 
10db0 20 20 20 20 20 20 20 20 20 7c 7c 20 73 74 72 6c           || strl
10dc0 65 6e 33 30 28 61 7a 43 6f 6c 5b 69 5d 29 3d 3d  en30(azCol[i])==
10dd0 30 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  0 .        ){.  
10de0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
10df0 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c  bind_null(pStmt,
10e00 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 7d   i+1);.        }
10e10 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
10e20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
10e30 74 28 70 53 74 6d 74 2c 20 69 2b 31 2c 20 61 7a  t(pStmt, i+1, az
10e40 43 6f 6c 5b 69 5d 2c 20 2d 31 2c 20 53 51 4c 49  Col[i], -1, SQLI
10e50 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
10e60 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
10e70 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70      sqlite3_step
10e80 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72  (pStmt);.      r
10e90 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
10ea0 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  t(pStmt);.      
10eb0 66 72 65 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20  free(zLine);.   
10ec0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
10ed0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
10ee0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
10ef0 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 3a 20  (interp,"Error: 
10f00 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
10f10 67 28 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a  g(pDb->db), 0);.
10f20 20 20 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20          zCommit 
10f30 3d 20 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20  = "ROLLBACK";.  
10f40 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10f50 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66     }.    }.    f
10f60 72 65 65 28 61 7a 43 6f 6c 29 3b 0a 20 20 20 20  ree(azCol);.    
10f70 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20  fclose(in);.    
10f80 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
10f90 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 28 76 6f  (pStmt);.    (vo
10fa0 69 64 29 73 71 6c 69 74 65 33 5f 65 78 65 63 28  id)sqlite3_exec(
10fb0 70 44 62 2d 3e 64 62 2c 20 7a 43 6f 6d 6d 69 74  pDb->db, zCommit
10fc0 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20  , 0, 0, 0);..   
10fd0 20 69 66 28 20 7a 43 6f 6d 6d 69 74 5b 30 5d 20   if( zCommit[0] 
10fe0 3d 3d 20 27 43 27 20 29 7b 0a 20 20 20 20 20 20  == 'C' ){.      
10ff0 2f 2a 20 73 75 63 63 65 73 73 2c 20 73 65 74 20  /* success, set 
11000 72 65 73 75 6c 74 20 61 73 20 6e 75 6d 62 65 72  result as number
11010 20 6f 66 20 6c 69 6e 65 73 20 70 72 6f 63 65 73   of lines proces
11020 73 65 64 20 2a 2f 0a 20 20 20 20 20 20 70 52 65  sed */.      pRe
11030 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62  sult = Tcl_GetOb
11040 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  jResult(interp);
11050 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 49 6e  .      Tcl_SetIn
11060 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 6c 69  tObj(pResult, li
11070 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63 20  neno);.      rc 
11080 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 65  = TCL_OK;.    }e
11090 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 66 61  lse{.      /* fa
110a0 69 6c 75 72 65 2c 20 61 70 70 65 6e 64 20 6c 69  ilure, append li
110b0 6e 65 6e 6f 20 77 68 65 72 65 20 66 61 69 6c 65  neno where faile
110c0 64 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  d */.      sqlit
110d0 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
110e0 6f 66 28 7a 4c 69 6e 65 4e 75 6d 29 2c 20 7a 4c  of(zLineNum), zL
110f0 69 6e 65 4e 75 6d 2c 22 25 64 22 2c 6c 69 6e 65  ineNum,"%d",line
11100 6e 6f 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 41  no);.      Tcl_A
11110 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
11120 72 70 2c 22 2c 20 66 61 69 6c 65 64 20 77 68 69  rp,", failed whi
11130 6c 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 69  le processing li
11140 6e 65 3a 20 22 2c 7a 4c 69 6e 65 4e 75 6d 2c 30  ne: ",zLineNum,0
11150 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43  );.      rc = TC
11160 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
11170 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
11180 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20   /*.  **    $db 
11190 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65  enable_load_exte
111a0 6e 73 69 6f 6e 20 42 4f 4f 4c 45 41 4e 0a 20 20  nsion BOOLEAN.  
111b0 2a 2a 0a 20 20 2a 2a 20 54 75 72 6e 20 74 68 65  **.  ** Turn the
111c0 20 65 78 74 65 6e 73 69 6f 6e 20 6c 6f 61 64 69   extension loadi
111d0 6e 67 20 66 65 61 74 75 72 65 20 6f 6e 20 6f 72  ng feature on or
111e0 20 6f 66 66 2e 20 20 49 74 20 69 66 20 6f 66 66   off.  It if off
111f0 20 62 79 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74   by.  ** default
11200 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
11210 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54  _ENABLE_LOAD_EXT
11220 45 4e 53 49 4f 4e 3a 20 7b 0a 23 69 66 6e 64 65  ENSION: {.#ifnde
11230 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  f SQLITE_OMIT_LO
11240 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20  AD_EXTENSION.   
11250 20 69 6e 74 20 6f 6e 6f 66 66 3b 0a 20 20 20 20   int onoff;.    
11260 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
11270 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
11280 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
11290 20 6f 62 6a 76 2c 20 22 42 4f 4f 4c 45 41 4e 22   objv, "BOOLEAN"
112a0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
112b0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
112c0 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74  .    if( Tcl_Get
112d0 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
112e0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
112f0 26 6f 6e 6f 66 66 29 20 29 7b 0a 20 20 20 20 20  &onoff) ){.     
11300 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
11310 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  R;.    }.    sql
11320 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64  ite3_enable_load
11330 5f 65 78 74 65 6e 73 69 6f 6e 28 70 44 62 2d 3e  _extension(pDb->
11340 64 62 2c 20 6f 6e 6f 66 66 29 3b 0a 20 20 20 20  db, onoff);.    
11350 62 72 65 61 6b 3b 0a 23 65 6c 73 65 0a 20 20 20  break;.#else.   
11360 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
11370 74 28 69 6e 74 65 72 70 2c 20 22 65 78 74 65 6e  t(interp, "exten
11380 73 69 6f 6e 20 6c 6f 61 64 69 6e 67 20 69 73 20  sion loading is 
11390 74 75 72 6e 65 64 20 6f 66 66 20 61 74 20 63 6f  turned off at co
113a0 6d 70 69 6c 65 2d 74 69 6d 65 22 2c 0a 20 20 20  mpile-time",.   
113b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113c0 20 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e    0);.    return
113d0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6e 64   TCL_ERROR;.#end
113e0 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  if.  }..  /*.  *
113f0 2a 20 20 20 20 24 64 62 20 65 72 72 6f 72 63 6f  *    $db errorco
11400 64 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74  de.  **.  ** Ret
11410 75 72 6e 20 74 68 65 20 6e 75 6d 65 72 69 63 20  urn the numeric 
11420 65 72 72 6f 72 20 63 6f 64 65 20 74 68 61 74 20  error code that 
11430 77 61 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  was returned by 
11440 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a  the most recent.
11450 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c    ** call to sql
11460 69 74 65 33 5f 65 78 65 63 28 29 2e 0a 20 20 2a  ite3_exec()..  *
11470 2f 0a 20 20 63 61 73 65 20 44 42 5f 45 52 52 4f  /.  case DB_ERRO
11480 52 43 4f 44 45 3a 20 7b 0a 20 20 20 20 54 63 6c  RCODE: {.    Tcl
11490 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
114a0 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
114b0 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65 72 72 63  Obj(sqlite3_errc
114c0 6f 64 65 28 70 44 62 2d 3e 64 62 29 29 29 3b 0a  ode(pDb->db)));.
114d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
114e0 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62    /*.  **    $db
114f0 20 65 78 69 73 74 73 20 24 73 71 6c 0a 20 20 2a   exists $sql.  *
11500 2a 20 20 20 20 24 64 62 20 6f 6e 65 63 6f 6c 75  *    $db onecolu
11510 6d 6e 20 24 73 71 6c 0a 20 20 2a 2a 0a 20 20 2a  mn $sql.  **.  *
11520 2a 20 54 68 65 20 6f 6e 65 63 6f 6c 75 6d 6e 20  * The onecolumn 
11530 6d 65 74 68 6f 64 20 69 73 20 74 68 65 20 65 71  method is the eq
11540 75 69 76 61 6c 65 6e 74 20 6f 66 3a 0a 20 20 2a  uivalent of:.  *
11550 2a 20 20 20 20 20 6c 69 6e 64 65 78 20 5b 24 64  *     lindex [$d
11560 62 20 65 76 61 6c 20 24 73 71 6c 5d 20 30 0a 20  b eval $sql] 0. 
11570 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 45 58   */.  case DB_EX
11580 49 53 54 53 3a 20 0a 20 20 63 61 73 65 20 44 42  ISTS: .  case DB
11590 5f 4f 4e 45 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20  _ONECOLUMN: {.  
115a0 20 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20    DbEvalContext 
115b0 73 45 76 61 6c 3b 0a 20 20 20 20 69 66 28 20 6f  sEval;.    if( o
115c0 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc!=3 ){.      
115d0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
115e0 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
115f0 2c 20 22 53 51 4c 22 29 3b 0a 20 20 20 20 20 20  , "SQL");.      
11600 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
11610 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 62 45  ;.    }..    dbE
11620 76 61 6c 49 6e 69 74 28 26 73 45 76 61 6c 2c 20  valInit(&sEval, 
11630 70 44 62 2c 20 6f 62 6a 76 5b 32 5d 2c 20 30 29  pDb, objv[2], 0)
11640 3b 0a 20 20 20 20 72 63 20 3d 20 64 62 45 76 61  ;.    rc = dbEva
11650 6c 53 74 65 70 28 26 73 45 76 61 6c 29 3b 0a 20  lStep(&sEval);. 
11660 20 20 20 69 66 28 20 63 68 6f 69 63 65 3d 3d 44     if( choice==D
11670 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 20 29 7b 0a 20  B_ONECOLUMN ){. 
11680 20 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c       if( rc==TCL
11690 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 54  _OK ){.        T
116a0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
116b0 69 6e 74 65 72 70 2c 20 64 62 45 76 61 6c 43 6f  interp, dbEvalCo
116c0 6c 75 6d 6e 56 61 6c 75 65 28 26 73 45 76 61 6c  lumnValue(&sEval
116d0 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  , 0));.      }el
116e0 73 65 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 42  se if( rc==TCL_B
116f0 52 45 41 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  REAK ){.        
11700 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28  Tcl_ResetResult(
11710 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 20 20 7d  interp);.      }
11720 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72  .    }else if( r
11730 63 3d 3d 54 43 4c 5f 42 52 45 41 4b 20 7c 7c 20  c==TCL_BREAK || 
11740 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20  rc==TCL_OK ){.  
11750 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
11760 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
11770 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 72  _NewBooleanObj(r
11780 63 3d 3d 54 43 4c 5f 4f 4b 29 29 3b 0a 20 20 20  c==TCL_OK));.   
11790 20 7d 0a 20 20 20 20 64 62 45 76 61 6c 46 69 6e   }.    dbEvalFin
117a0 61 6c 69 7a 65 28 26 73 45 76 61 6c 29 3b 0a 0a  alize(&sEval);..
117b0 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f      if( rc==TCL_
117c0 42 52 45 41 4b 20 29 7b 0a 20 20 20 20 20 20 72  BREAK ){.      r
117d0 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20  c = TCL_OK;.    
117e0 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
117f0 0a 20 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20  .   .  /*.  **  
11800 20 20 24 64 62 20 65 76 61 6c 20 24 73 71 6c 20    $db eval $sql 
11810 3f 61 72 72 61 79 3f 20 3f 7b 20 20 2e 2e 2e 63  ?array? ?{  ...c
11820 6f 64 65 2e 2e 2e 20 7d 3f 0a 20 20 2a 2a 0a 20  ode... }?.  **. 
11830 20 2a 2a 20 54 68 65 20 53 51 4c 20 73 74 61 74   ** The SQL stat
11840 65 6d 65 6e 74 20 69 6e 20 24 73 71 6c 20 69 73  ement in $sql is
11850 20 65 76 61 6c 75 61 74 65 64 2e 20 20 46 6f 72   evaluated.  For
11860 20 65 61 63 68 20 72 6f 77 2c 20 74 68 65 20 76   each row, the v
11870 61 6c 75 65 73 20 61 72 65 0a 20 20 2a 2a 20 70  alues are.  ** p
11880 6c 61 63 65 64 20 69 6e 20 65 6c 65 6d 65 6e 74  laced in element
11890 73 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 6e  s of the array n
118a0 61 6d 65 64 20 22 61 72 72 61 79 22 20 61 6e 64  amed "array" and
118b0 20 2e 2e 2e 63 6f 64 65 2e 2e 2e 20 69 73 20 65   ...code... is e
118c0 78 65 63 75 74 65 64 2e 0a 20 20 2a 2a 20 49 66  xecuted..  ** If
118d0 20 22 61 72 72 61 79 22 20 61 6e 64 20 22 63 6f   "array" and "co
118e0 64 65 22 20 61 72 65 20 6f 6d 69 74 74 65 64 2c  de" are omitted,
118f0 20 74 68 65 6e 20 6e 6f 20 63 61 6c 6c 62 61 63   then no callbac
11900 6b 20 69 73 20 65 76 65 72 79 20 69 6e 76 6f 6b  k is every invok
11910 65 64 2e 0a 20 20 2a 2a 20 49 66 20 22 61 72 72  ed..  ** If "arr
11920 61 79 22 20 69 73 20 61 6e 20 65 6d 70 74 79 20  ay" is an empty 
11930 73 74 72 69 6e 67 2c 20 74 68 65 6e 20 74 68 65  string, then the
11940 20 76 61 6c 75 65 73 20 61 72 65 20 70 6c 61 63   values are plac
11950 65 64 20 69 6e 20 76 61 72 69 61 62 6c 65 73 0a  ed in variables.
11960 20 20 2a 2a 20 74 68 61 74 20 68 61 76 65 20 74    ** that have t
11970 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20  he same name as 
11980 74 68 65 20 66 69 65 6c 64 73 20 65 78 74 72 61  the fields extra
11990 63 74 65 64 20 62 79 20 74 68 65 20 71 75 65 72  cted by the quer
119a0 79 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  y..  */.  case D
119b0 42 5f 45 56 41 4c 3a 20 7b 0a 20 20 20 20 69 66  B_EVAL: {.    if
119c0 28 20 6f 62 6a 63 3c 33 20 7c 7c 20 6f 62 6a 63  ( objc<3 || objc
119d0 3e 35 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  >5 ){.      Tcl_
119e0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
119f0 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53  erp, 2, objv, "S
11a00 51 4c 20 3f 41 52 52 41 59 2d 4e 41 4d 45 3f 20  QL ?ARRAY-NAME? 
11a10 3f 53 43 52 49 50 54 3f 22 29 3b 0a 20 20 20 20  ?SCRIPT?");.    
11a20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
11a30 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  OR;.    }..    i
11a40 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20  f( objc==3 ){.  
11a50 20 20 20 20 44 62 45 76 61 6c 43 6f 6e 74 65 78      DbEvalContex
11a60 74 20 73 45 76 61 6c 3b 0a 20 20 20 20 20 20 54  t sEval;.      T
11a70 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 20 3d 20 54  cl_Obj *pRet = T
11a80 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20  cl_NewObj();.   
11a90 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
11aa0 75 6e 74 28 70 52 65 74 29 3b 0a 20 20 20 20 20  unt(pRet);.     
11ab0 20 64 62 45 76 61 6c 49 6e 69 74 28 26 73 45 76   dbEvalInit(&sEv
11ac0 61 6c 2c 20 70 44 62 2c 20 6f 62 6a 76 5b 32 5d  al, pDb, objv[2]
11ad0 2c 20 30 29 3b 0a 20 20 20 20 20 20 77 68 69 6c  , 0);.      whil
11ae0 65 28 20 54 43 4c 5f 4f 4b 3d 3d 28 72 63 20 3d  e( TCL_OK==(rc =
11af0 20 64 62 45 76 61 6c 53 74 65 70 28 26 73 45 76   dbEvalStep(&sEv
11b00 61 6c 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20  al)) ){.        
11b10 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 69  int i;.        i
11b20 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20  nt nCol;.       
11b30 20 64 62 45 76 61 6c 52 6f 77 49 6e 66 6f 28 26   dbEvalRowInfo(&
11b40 73 45 76 61 6c 2c 20 26 6e 43 6f 6c 2c 20 30 29  sEval, &nCol, 0)
11b50 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
11b60 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
11b70 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4c  .          Tcl_L
11b80 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
11b90 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74  ent(interp, pRet
11ba0 2c 20 64 62 45 76 61 6c 43 6f 6c 75 6d 6e 56 61  , dbEvalColumnVa
11bb0 6c 75 65 28 26 73 45 76 61 6c 2c 20 69 29 29 3b  lue(&sEval, i));
11bc0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
11bd0 20 7d 0a 20 20 20 20 20 20 64 62 45 76 61 6c 46   }.      dbEvalF
11be0 69 6e 61 6c 69 7a 65 28 26 73 45 76 61 6c 29 3b  inalize(&sEval);
11bf0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 54  .      if( rc==T
11c00 43 4c 5f 42 52 45 41 4b 20 29 7b 0a 20 20 20 20  CL_BREAK ){.    
11c10 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
11c20 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65  sult(interp, pRe
11c30 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  t);.        rc =
11c40 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d   TCL_OK;.      }
11c50 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52  .      Tcl_DecrR
11c60 65 66 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20  efCount(pRet);. 
11c70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11c80 43 6c 69 65 6e 74 44 61 74 61 20 63 64 5b 32 5d  ClientData cd[2]
11c90 3b 0a 20 20 20 20 20 20 44 62 45 76 61 6c 43 6f  ;.      DbEvalCo
11ca0 6e 74 65 78 74 20 2a 70 3b 0a 20 20 20 20 20 20  ntext *p;.      
11cb0 54 63 6c 5f 4f 62 6a 20 2a 70 41 72 72 61 79 20  Tcl_Obj *pArray 
11cc0 3d 20 30 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f  = 0;.      Tcl_O
11cd0 62 6a 20 2a 70 53 63 72 69 70 74 3b 0a 0a 20 20  bj *pScript;..  
11ce0 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 35 20      if( objc==5 
11cf0 26 26 20 2a 28 63 68 61 72 20 2a 29 54 63 6c 5f  && *(char *)Tcl_
11d00 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33  GetString(objv[3
11d10 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41  ]) ){.        pA
11d20 72 72 61 79 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a  rray = objv[3];.
11d30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53        }.      pS
11d40 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 6f 62 6a  cript = objv[obj
11d50 63 2d 31 5d 3b 0a 20 20 20 20 20 20 54 63 6c 5f  c-1];.      Tcl_
11d60 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63  IncrRefCount(pSc
11d70 72 69 70 74 29 3b 0a 20 20 20 20 20 20 0a 20 20  ript);.      .  
11d80 20 20 20 20 70 20 3d 20 28 44 62 45 76 61 6c 43      p = (DbEvalC
11d90 6f 6e 74 65 78 74 20 2a 29 54 63 6c 5f 41 6c 6c  ontext *)Tcl_All
11da0 6f 63 28 73 69 7a 65 6f 66 28 44 62 45 76 61 6c  oc(sizeof(DbEval
11db0 43 6f 6e 74 65 78 74 29 29 3b 0a 20 20 20 20 20  Context));.     
11dc0 20 64 62 45 76 61 6c 49 6e 69 74 28 70 2c 20 70   dbEvalInit(p, p
11dd0 44 62 2c 20 6f 62 6a 76 5b 32 5d 2c 20 70 41 72  Db, objv[2], pAr
11de0 72 61 79 29 3b 0a 0a 20 20 20 20 20 20 63 64 5b  ray);..      cd[
11df0 30 5d 20 3d 20 28 76 6f 69 64 20 2a 29 70 3b 0a  0] = (void *)p;.
11e00 20 20 20 20 20 20 63 64 5b 31 5d 20 3d 20 28 76        cd[1] = (v
11e10 6f 69 64 20 2a 29 70 53 63 72 69 70 74 3b 0a 20  oid *)pScript;. 
11e20 20 20 20 20 20 72 63 20 3d 20 44 62 45 76 61 6c       rc = DbEval
11e30 4e 65 78 74 43 6d 64 28 63 64 2c 20 69 6e 74 65  NextCmd(cd, inte
11e40 72 70 2c 20 54 43 4c 5f 4f 4b 29 3b 0a 20 20 20  rp, TCL_OK);.   
11e50 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
11e60 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
11e70 20 24 64 62 20 66 75 6e 63 74 69 6f 6e 20 4e 41   $db function NA
11e80 4d 45 20 5b 2d 61 72 67 63 6f 75 6e 74 20 4e 5d  ME [-argcount N]
11e90 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a   SCRIPT.  **.  *
11ea0 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53  * Create a new S
11eb0 51 4c 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  QL function call
11ec0 65 64 20 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76  ed NAME.  Whenev
11ed0 65 72 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e  er that function
11ee0 20 69 73 0a 20 20 2a 2a 20 63 61 6c 6c 65 64 2c   is.  ** called,
11ef0 20 69 6e 76 6f 6b 65 20 53 43 52 49 50 54 20 74   invoke SCRIPT t
11f00 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 66  o evaluate the f
11f10 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  unction..  */.  
11f20 63 61 73 65 20 44 42 5f 46 55 4e 43 54 49 4f 4e  case DB_FUNCTION
11f30 3a 20 7b 0a 20 20 20 20 53 71 6c 46 75 6e 63 20  : {.    SqlFunc 
11f40 2a 70 46 75 6e 63 3b 0a 20 20 20 20 54 63 6c 5f  *pFunc;.    Tcl_
11f50 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 0a 20 20  Obj *pScript;.  
11f60 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
11f70 20 20 20 69 6e 74 20 6e 41 72 67 20 3d 20 2d 31     int nArg = -1
11f80 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d  ;.    if( objc==
11f90 36 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  6 ){.      const
11fa0 20 63 68 61 72 20 2a 7a 20 3d 20 54 63 6c 5f 47   char *z = Tcl_G
11fb0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d  etString(objv[3]
11fc0 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  );.      int n =
11fd0 20 73 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20   strlen30(z);.  
11fe0 20 20 20 20 69 66 28 20 6e 3e 32 20 26 26 20 73      if( n>2 && s
11ff0 74 72 6e 63 6d 70 28 7a 2c 20 22 2d 61 72 67 63  trncmp(z, "-argc
12000 6f 75 6e 74 22 2c 6e 29 3d 3d 30 20 29 7b 0a 20  ount",n)==0 ){. 
12010 20 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47         if( Tcl_G
12020 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
12030 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 6e  erp, objv[4], &n
12040 41 72 67 29 20 29 20 72 65 74 75 72 6e 20 54 43  Arg) ) return TC
12050 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  L_ERROR;.       
12060 20 69 66 28 20 6e 41 72 67 3c 30 20 29 7b 0a 20   if( nArg<0 ){. 
12070 20 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70           Tcl_App
12080 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
12090 2c 20 22 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  , "number of arg
120a0 75 6d 65 6e 74 73 20 6d 75 73 74 20 62 65 20 6e  uments must be n
120b0 6f 6e 2d 6e 65 67 61 74 69 76 65 22 2c 0a 20 20  on-negative",.  
120c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120d0 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
120e0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  0);.          re
120f0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
12100 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12110 7d 0a 20 20 20 20 20 20 70 53 63 72 69 70 74 20  }.      pScript 
12120 3d 20 6f 62 6a 76 5b 35 5d 3b 0a 20 20 20 20 7d  = objv[5];.    }
12130 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 21 3d 34  else if( objc!=4
12140 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
12150 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
12160 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d  p, 2, objv, "NAM
12170 45 20 5b 2d 61 72 67 63 6f 75 6e 74 20 4e 5d 20  E [-argcount N] 
12180 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20  SCRIPT");.      
12190 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
121a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
121b0 20 20 20 70 53 63 72 69 70 74 20 3d 20 6f 62 6a     pScript = obj
121c0 76 5b 33 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  v[3];.    }.    
121d0 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53  zName = Tcl_GetS
121e0 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
121f0 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20 70 46  v[2], 0);.    pF
12200 75 6e 63 20 3d 20 66 69 6e 64 53 71 6c 46 75 6e  unc = findSqlFun
12210 63 28 70 44 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  c(pDb, zName);. 
12220 20 20 20 69 66 28 20 70 46 75 6e 63 3d 3d 30 20     if( pFunc==0 
12230 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
12240 4f 52 3b 0a 20 20 20 20 69 66 28 20 70 46 75 6e  OR;.    if( pFun
12250 63 2d 3e 70 53 63 72 69 70 74 20 29 7b 0a 20 20  c->pScript ){.  
12260 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
12270 6f 75 6e 74 28 70 46 75 6e 63 2d 3e 70 53 63 72  ount(pFunc->pScr
12280 69 70 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ipt);.    }.    
12290 70 46 75 6e 63 2d 3e 70 53 63 72 69 70 74 20 3d  pFunc->pScript =
122a0 20 70 53 63 72 69 70 74 3b 0a 20 20 20 20 54 63   pScript;.    Tc
122b0 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
122c0 53 63 72 69 70 74 29 3b 0a 20 20 20 20 70 46 75  Script);.    pFu
122d0 6e 63 2d 3e 75 73 65 45 76 61 6c 4f 62 6a 76 20  nc->useEvalObjv 
122e0 3d 20 73 61 66 65 54 6f 55 73 65 45 76 61 6c 4f  = safeToUseEvalO
122f0 62 6a 76 28 69 6e 74 65 72 70 2c 20 70 53 63 72  bjv(interp, pScr
12300 69 70 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  ipt);.    rc = s
12310 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
12320 6e 63 74 69 6f 6e 28 70 44 62 2d 3e 64 62 2c 20  nction(pDb->db, 
12330 7a 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c  zName, nArg, SQL
12340 49 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20  ITE_UTF8,.      
12350 20 20 70 46 75 6e 63 2c 20 74 63 6c 53 71 6c 46    pFunc, tclSqlF
12360 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  unc, 0, 0);.    
12370 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
12380 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
12390 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
123a0 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
123b0 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73  nterp, (char *)s
123c0 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44  qlite3_errmsg(pD
123d0 62 2d 3e 64 62 29 2c 20 54 43 4c 5f 56 4f 4c 41  b->db), TCL_VOLA
123e0 54 49 4c 45 29 3b 0a 20 20 20 20 7d 0a 20 20 20  TILE);.    }.   
123f0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
12400 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 69  *.  **     $db i
12410 6e 63 72 62 6c 6f 62 20 3f 2d 72 65 61 64 6f 6e  ncrblob ?-readon
12420 6c 79 3f 20 3f 44 42 3f 20 54 41 42 4c 45 20 43  ly? ?DB? TABLE C
12430 4f 4c 55 4d 4e 20 52 4f 57 49 44 0a 20 20 2a 2f  OLUMN ROWID.  */
12440 0a 20 20 63 61 73 65 20 44 42 5f 49 4e 43 52 42  .  case DB_INCRB
12450 4c 4f 42 3a 20 7b 0a 23 69 66 64 65 66 20 53 51  LOB: {.#ifdef SQ
12460 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
12470 4f 42 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  OB.    Tcl_Appen
12480 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
12490 22 69 6e 63 72 62 6c 6f 62 20 6e 6f 74 20 61 76  "incrblob not av
124a0 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 69 73 20  ailable in this 
124b0 62 75 69 6c 64 22 2c 20 30 29 3b 0a 20 20 20 20  build", 0);.    
124c0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
124d0 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69 6e 74 20  ;.#else.    int 
124e0 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20 30 3b 0a  isReadonly = 0;.
124f0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
12500 7a 44 62 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20  zDb = "main";.  
12510 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
12520 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  able;.    const 
12530 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 3b 0a 20  char *zColumn;. 
12540 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 69     Tcl_WideInt i
12550 52 6f 77 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  Row;..    /* Che
12560 63 6b 20 66 6f 72 20 74 68 65 20 2d 72 65 61 64  ck for the -read
12570 6f 6e 6c 79 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20  only option */. 
12580 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 26 26     if( objc>3 &&
12590 20 73 74 72 63 6d 70 28 54 63 6c 5f 47 65 74 53   strcmp(Tcl_GetS
125a0 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20  tring(objv[2]), 
125b0 22 2d 72 65 61 64 6f 6e 6c 79 22 29 3d 3d 30 20  "-readonly")==0 
125c0 29 7b 0a 20 20 20 20 20 20 69 73 52 65 61 64 6f  ){.      isReado
125d0 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a  nly = 1;.    }..
125e0 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 28 35      if( objc!=(5
125f0 2b 69 73 52 65 61 64 6f 6e 6c 79 29 20 26 26 20  +isReadonly) && 
12600 6f 62 6a 63 21 3d 28 36 2b 69 73 52 65 61 64 6f  objc!=(6+isReado
12610 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 54 63  nly) ){.      Tc
12620 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
12630 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
12640 22 3f 2d 72 65 61 64 6f 6e 6c 79 3f 20 3f 44 42  "?-readonly? ?DB
12650 3f 20 54 41 42 4c 45 20 43 4f 4c 55 4d 4e 20 52  ? TABLE COLUMN R
12660 4f 57 49 44 22 29 3b 0a 20 20 20 20 20 20 72 65  OWID");.      re
12670 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
12680 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 6f      }..    if( o
12690 62 6a 63 3d 3d 28 36 2b 69 73 52 65 61 64 6f 6e  bjc==(6+isReadon
126a0 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 7a 44 62  ly) ){.      zDb
126b0 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
126c0 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 7d  (objv[2]);.    }
126d0 0a 20 20 20 20 7a 54 61 62 6c 65 20 3d 20 54 63  .    zTable = Tc
126e0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
126f0 5b 6f 62 6a 63 2d 33 5d 29 3b 0a 20 20 20 20 7a  [objc-3]);.    z
12700 43 6f 6c 75 6d 6e 20 3d 20 54 63 6c 5f 47 65 74  Column = Tcl_Get
12710 53 74 72 69 6e 67 28 6f 62 6a 76 5b 6f 62 6a 63  String(objv[objc
12720 2d 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 54  -2]);.    rc = T
12730 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f  cl_GetWideIntFro
12740 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
12750 76 5b 6f 62 6a 63 2d 31 5d 2c 20 26 69 52 6f 77  v[objc-1], &iRow
12760 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  );..    if( rc==
12770 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  TCL_OK ){.      
12780 72 63 20 3d 20 63 72 65 61 74 65 49 6e 63 72 62  rc = createIncrb
12790 6c 6f 62 43 68 61 6e 6e 65 6c 28 0a 20 20 20 20  lobChannel(.    
127a0 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20 70 44        interp, pD
127b0 62 2c 20 7a 44 62 2c 20 7a 54 61 62 6c 65 2c 20  b, zDb, zTable, 
127c0 7a 43 6f 6c 75 6d 6e 2c 20 69 52 6f 77 2c 20 69  zColumn, iRow, i
127d0 73 52 65 61 64 6f 6e 6c 79 0a 20 20 20 20 20 20  sReadonly.      
127e0 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
127f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
12800 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64    /*.  **     $d
12810 62 20 69 6e 74 65 72 72 75 70 74 0a 20 20 2a 2a  b interrupt.  **
12820 0a 20 20 2a 2a 20 49 6e 74 65 72 72 75 70 74 20  .  ** Interrupt 
12830 74 68 65 20 65 78 65 63 75 74 69 6f 6e 20 6f 66  the execution of
12840 20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74 20   the inner-most 
12850 53 51 4c 20 69 6e 74 65 72 70 72 65 74 65 72 2e  SQL interpreter.
12860 20 20 54 68 69 73 0a 20 20 2a 2a 20 63 61 75 73    This.  ** caus
12870 65 73 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  es the SQL state
12880 6d 65 6e 74 20 74 6f 20 72 65 74 75 72 6e 20 61  ment to return a
12890 6e 20 65 72 72 6f 72 20 6f 66 20 53 51 4c 49 54  n error of SQLIT
128a0 45 5f 49 4e 54 45 52 52 55 50 54 2e 0a 20 20 2a  E_INTERRUPT..  *
128b0 2f 0a 20 20 63 61 73 65 20 44 42 5f 49 4e 54 45  /.  case DB_INTE
128c0 52 52 55 50 54 3a 20 7b 0a 20 20 20 20 73 71 6c  RRUPT: {.    sql
128d0 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28 70  ite3_interrupt(p
128e0 44 62 2d 3e 64 62 29 3b 0a 20 20 20 20 62 72 65  Db->db);.    bre
128f0 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
12900 2a 2a 20 20 20 20 20 24 64 62 20 6e 75 6c 6c 76  **     $db nullv
12910 61 6c 75 65 20 3f 53 54 52 49 4e 47 3f 0a 20 20  alue ?STRING?.  
12920 2a 2a 0a 20 20 2a 2a 20 43 68 61 6e 67 65 20 74  **.  ** Change t
12930 65 78 74 20 75 73 65 64 20 77 68 65 6e 20 61 20  ext used when a 
12940 4e 55 4c 4c 20 63 6f 6d 65 73 20 62 61 63 6b 20  NULL comes back 
12950 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
12960 65 2e 20 49 66 20 3f 53 54 52 49 4e 47 3f 0a 20  e. If ?STRING?. 
12970 20 2a 2a 20 69 73 20 6e 6f 74 20 70 72 65 73 65   ** is not prese
12980 6e 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  nt, then the cur
12990 72 65 6e 74 20 73 74 72 69 6e 67 20 75 73 65 64  rent string used
129a0 20 66 6f 72 20 4e 55 4c 4c 20 69 73 20 72 65 74   for NULL is ret
129b0 75 72 6e 65 64 2e 0a 20 20 2a 2a 20 49 66 20 53  urned..  ** If S
129c0 54 52 49 4e 47 20 69 73 20 70 72 65 73 65 6e 74  TRING is present
129d0 2c 20 74 68 65 6e 20 53 54 52 49 4e 47 20 69 73  , then STRING is
129e0 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2a 0a   returned..  **.
129f0 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 4e    */.  case DB_N
12a00 55 4c 4c 56 41 4c 55 45 3a 20 7b 0a 20 20 20 20  ULLVALUE: {.    
12a10 69 66 28 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f  if( objc!=2 && o
12a20 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc!=3 ){.      
12a30 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
12a40 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
12a50 2c 20 22 4e 55 4c 4c 56 41 4c 55 45 22 29 3b 0a  , "NULLVALUE");.
12a60 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
12a70 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
12a80 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b    if( objc==3 ){
12a90 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a  .      int len;.
12aa0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 75 6c        char *zNul
12ab0 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  l = Tcl_GetStrin
12ac0 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
12ad0 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69  , &len);.      i
12ae0 66 28 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 29 7b  f( pDb->zNull ){
12af0 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65  .        Tcl_Fre
12b00 65 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20  e(pDb->zNull);. 
12b10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
12b20 20 7a 4e 75 6c 6c 20 26 26 20 6c 65 6e 3e 30 20   zNull && len>0 
12b30 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
12b40 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f 41 6c 6c 6f  zNull = Tcl_Allo
12b50 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20  c( len + 1 );.  
12b60 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62        memcpy(pDb
12b70 2d 3e 7a 4e 75 6c 6c 2c 20 7a 4e 75 6c 6c 2c 20  ->zNull, zNull, 
12b80 6c 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 44  len);.        pD
12b90 62 2d 3e 7a 4e 75 6c 6c 5b 6c 65 6e 5d 20 3d 20  b->zNull[len] = 
12ba0 27 5c 30 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73  '\0';.      }els
12bb0 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  e{.        pDb->
12bc0 7a 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20  zNull = 0;.     
12bd0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c   }.    }.    Tcl
12be0 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
12bf0 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72  terp, Tcl_NewStr
12c00 69 6e 67 4f 62 6a 28 70 44 62 2d 3e 7a 4e 75 6c  ingObj(pDb->zNul
12c10 6c 2c 20 2d 31 29 29 3b 0a 20 20 20 20 62 72 65  l, -1));.    bre
12c20 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
12c30 2a 2a 20 20 20 20 20 24 64 62 20 6c 61 73 74 5f  **     $db last_
12c40 69 6e 73 65 72 74 5f 72 6f 77 69 64 20 0a 20 20  insert_rowid .  
12c50 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 61  **.  ** Return a
12c60 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
12c70 69 73 20 74 68 65 20 52 4f 57 49 44 20 66 6f 72  is the ROWID for
12c80 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
12c90 20 69 6e 73 65 72 74 2e 0a 20 20 2a 2f 0a 20 20   insert..  */.  
12ca0 63 61 73 65 20 44 42 5f 4c 41 53 54 5f 49 4e 53  case DB_LAST_INS
12cb0 45 52 54 5f 52 4f 57 49 44 3a 20 7b 0a 20 20 20  ERT_ROWID: {.   
12cc0 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c   Tcl_Obj *pResul
12cd0 74 3b 0a 20 20 20 20 54 63 6c 5f 57 69 64 65 49  t;.    Tcl_WideI
12ce0 6e 74 20 72 6f 77 69 64 3b 0a 20 20 20 20 69 66  nt rowid;.    if
12cf0 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
12d00 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
12d10 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
12d20 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 20 20  bjv, "");.      
12d30 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
12d40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 6f 77 69  ;.    }.    rowi
12d50 64 20 3d 20 73 71 6c 69 74 65 33 5f 6c 61 73 74  d = sqlite3_last
12d60 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 70 44  _insert_rowid(pD
12d70 62 2d 3e 64 62 29 3b 0a 20 20 20 20 70 52 65 73  b->db);.    pRes
12d80 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a  ult = Tcl_GetObj
12d90 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
12da0 20 20 20 20 54 63 6c 5f 53 65 74 57 69 64 65 49      Tcl_SetWideI
12db0 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 72  ntObj(pResult, r
12dc0 6f 77 69 64 29 3b 0a 20 20 20 20 62 72 65 61 6b  owid);.    break
12dd0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
12de0 20 54 68 65 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d   The DB_ONECOLUM
12df0 4e 20 6d 65 74 68 6f 64 20 69 73 20 69 6d 70 6c  N method is impl
12e00 65 6d 65 6e 74 65 64 20 74 6f 67 65 74 68 65 72  emented together
12e10 20 77 69 74 68 20 44 42 5f 45 58 49 53 54 53 2e   with DB_EXISTS.
12e20 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 20 20 20 24  .  */..  /*    $
12e30 64 62 20 70 72 6f 67 72 65 73 73 20 3f 4e 20 43  db progress ?N C
12e40 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 20 0a 20  ALLBACK?.  ** . 
12e50 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67   ** Invoke the g
12e60 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 65 76  iven callback ev
12e70 65 72 79 20 4e 20 76 69 72 74 75 61 6c 20 6d 61  ery N virtual ma
12e80 63 68 69 6e 65 20 6f 70 63 6f 64 65 73 20 77 68  chine opcodes wh
12e90 69 6c 65 20 65 78 65 63 75 74 69 6e 67 0a 20 20  ile executing.  
12ea0 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f  ** queries..  */
12eb0 0a 20 20 63 61 73 65 20 44 42 5f 50 52 4f 47 52  .  case DB_PROGR
12ec0 45 53 53 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f  ESS: {.    if( o
12ed0 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  bjc==2 ){.      
12ee0 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65  if( pDb->zProgre
12ef0 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  ss ){.        Tc
12f00 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
12f10 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 50 72 6f  nterp, pDb->zPro
12f20 67 72 65 73 73 2c 20 30 29 3b 0a 20 20 20 20 20  gress, 0);.     
12f30 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
12f40 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20   objc==4 ){.    
12f50 20 20 63 68 61 72 20 2a 7a 50 72 6f 67 72 65 73    char *zProgres
12f60 73 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  s;.      int len
12f70 3b 0a 20 20 20 20 20 20 69 6e 74 20 4e 3b 0a 20  ;.      int N;. 
12f80 20 20 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21       if( TCL_OK!
12f90 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f  =Tcl_GetIntFromO
12fa0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
12fb0 32 5d 2c 20 26 4e 29 20 29 7b 0a 20 20 20 20 20  2], &N) ){.     
12fc0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
12fd0 52 4f 52 3b 0a 20 20 20 20 20 20 7d 3b 0a 20 20  ROR;.      };.  
12fe0 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72      if( pDb->zPr
12ff0 6f 67 72 65 73 73 20 29 7b 0a 20 20 20 20 20 20  ogress ){.      
13000 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e    Tcl_Free(pDb->
13010 7a 50 72 6f 67 72 65 73 73 29 3b 0a 20 20 20 20  zProgress);.    
13020 20 20 7d 0a 20 20 20 20 20 20 7a 50 72 6f 67 72    }.      zProgr
13030 65 73 73 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ess = Tcl_GetStr
13040 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
13050 33 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20  3], &len);.     
13060 20 69 66 28 20 7a 50 72 6f 67 72 65 73 73 20 26   if( zProgress &
13070 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20  & len>0 ){.     
13080 20 20 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73     pDb->zProgres
13090 73 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c  s = Tcl_Alloc( l
130a0 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20  en + 1 );.      
130b0 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 50    memcpy(pDb->zP
130c0 72 6f 67 72 65 73 73 2c 20 7a 50 72 6f 67 72 65  rogress, zProgre
130d0 73 73 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20  ss, len+1);.    
130e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
130f0 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20   pDb->zProgress 
13100 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  = 0;.      }.#if
13110 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13120 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41  _PROGRESS_CALLBA
13130 43 4b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  CK.      if( pDb
13140 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29 7b 0a 20  ->zProgress ){. 
13150 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65         pDb->inte
13160 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20  rp = interp;.   
13170 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f       sqlite3_pro
13180 67 72 65 73 73 5f 68 61 6e 64 6c 65 72 28 70 44  gress_handler(pD
13190 62 2d 3e 64 62 2c 20 4e 2c 20 44 62 50 72 6f 67  b->db, N, DbProg
131a0 72 65 73 73 48 61 6e 64 6c 65 72 2c 20 70 44 62  ressHandler, pDb
131b0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
131c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
131d0 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65 72  progress_handler
131e0 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 2c 20  (pDb->db, 0, 0, 
131f0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  0);.      }.#end
13200 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  if.    }else{.  
13210 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
13220 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
13230 6f 62 6a 76 2c 20 22 4e 20 43 41 4c 4c 42 41 43  objv, "N CALLBAC
13240 4b 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  K");.      retur
13250 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
13260 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
13270 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 70  }..  /*    $db p
13280 72 6f 66 69 6c 65 20 3f 43 41 4c 4c 42 41 43 4b  rofile ?CALLBACK
13290 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b 65  ?.  **.  ** Make
132a0 20 61 72 72 61 6e 67 65 6d 65 6e 74 73 20 74 6f   arrangements to
132b0 20 69 6e 76 6f 6b 65 20 74 68 65 20 43 41 4c 4c   invoke the CALL
132c0 42 41 43 4b 20 72 6f 75 74 69 6e 65 20 61 66 74  BACK routine aft
132d0 65 72 20 65 61 63 68 20 53 51 4c 20 73 74 61 74  er each SQL stat
132e0 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 61 74 20  ement.  ** that 
132f0 68 61 73 20 72 75 6e 2e 20 20 54 68 65 20 74 65  has run.  The te
13300 78 74 20 6f 66 20 74 68 65 20 53 51 4c 20 61 6e  xt of the SQL an
13310 64 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  d the amount of 
13320 65 6c 61 70 73 65 20 74 69 6d 65 20 61 72 65 0a  elapse time are.
13330 20 20 2a 2a 20 61 70 70 65 6e 64 65 64 20 74 6f    ** appended to
13340 20 43 41 4c 4c 42 41 43 4b 20 62 65 66 6f 72 65   CALLBACK before
13350 20 74 68 65 20 73 63 72 69 70 74 20 69 73 20 72   the script is r
13360 75 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  un..  */.  case 
13370 44 42 5f 50 52 4f 46 49 4c 45 3a 20 7b 0a 20 20  DB_PROFILE: {.  
13380 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a    if( objc>3 ){.
13390 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
133a0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
133b0 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41  , objv, "?CALLBA
133c0 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74  CK?");.      ret
133d0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
133e0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a     }else if( obj
133f0 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66  c==2 ){.      if
13400 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20  ( pDb->zProfile 
13410 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41  ){.        Tcl_A
13420 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
13430 72 70 2c 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c  rp, pDb->zProfil
13440 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  e, 0);.      }. 
13450 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13460 63 68 61 72 20 2a 7a 50 72 6f 66 69 6c 65 3b 0a  char *zProfile;.
13470 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20        int len;. 
13480 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50       if( pDb->zP
13490 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  rofile ){.      
134a0 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e    Tcl_Free(pDb->
134b0 7a 50 72 6f 66 69 6c 65 29 3b 0a 20 20 20 20 20  zProfile);.     
134c0 20 7d 0a 20 20 20 20 20 20 7a 50 72 6f 66 69 6c   }.      zProfil
134d0 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
134e0 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
134f0 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69  , &len);.      i
13500 66 28 20 7a 50 72 6f 66 69 6c 65 20 26 26 20 6c  f( zProfile && l
13510 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  en>0 ){.        
13520 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 3d 20  pDb->zProfile = 
13530 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b  Tcl_Alloc( len +
13540 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65   1 );.        me
13550 6d 63 70 79 28 70 44 62 2d 3e 7a 50 72 6f 66 69  mcpy(pDb->zProfi
13560 6c 65 2c 20 7a 50 72 6f 66 69 6c 65 2c 20 6c 65  le, zProfile, le
13570 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  n+1);.      }els
13580 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  e{.        pDb->
13590 7a 50 72 6f 66 69 6c 65 20 3d 20 30 3b 0a 20 20  zProfile = 0;.  
135a0 20 20 20 20 7d 0a 23 69 66 20 21 64 65 66 69 6e      }.#if !defin
135b0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ed(SQLITE_OMIT_T
135c0 52 41 43 45 29 20 26 26 20 21 64 65 66 69 6e 65  RACE) && !define
135d0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  d(SQLITE_OMIT_FL
135e0 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20  OATING_POINT).  
135f0 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72      if( pDb->zPr
13600 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  ofile ){.       
13610 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69   pDb->interp = i
13620 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73  nterp;.        s
13630 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65 28 70  qlite3_profile(p
13640 44 62 2d 3e 64 62 2c 20 44 62 50 72 6f 66 69 6c  Db->db, DbProfil
13650 65 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a  eHandler, pDb);.
13660 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
13670 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f       sqlite3_pro
13680 66 69 6c 65 28 70 44 62 2d 3e 64 62 2c 20 30 2c  file(pDb->db, 0,
13690 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e   0);.      }.#en
136a0 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 62 72  dif.    }.    br
136b0 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
136c0 20 2a 2a 20 20 20 20 20 24 64 62 20 72 65 6b 65   **     $db reke
136d0 79 20 4b 45 59 0a 20 20 2a 2a 0a 20 20 2a 2a 20  y KEY.  **.  ** 
136e0 43 68 61 6e 67 65 20 74 68 65 20 65 6e 63 72 79  Change the encry
136f0 70 74 69 6f 6e 20 6b 65 79 20 6f 6e 20 74 68 65  ption key on the
13700 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20   currently open 
13710 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20  database..  */. 
13720 20 63 61 73 65 20 44 42 5f 52 45 4b 45 59 3a 20   case DB_REKEY: 
13730 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
13740 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 69 6e  HAS_CODEC.    in
13750 74 20 6e 4b 65 79 3b 0a 20 20 20 20 76 6f 69 64  t nKey;.    void
13760 20 2a 70 4b 65 79 3b 0a 23 65 6e 64 69 66 0a 20   *pKey;.#endif. 
13770 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29     if( objc!=3 )
13780 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
13790 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
137a0 20 32 2c 20 6f 62 6a 76 2c 20 22 4b 45 59 22 29   2, objv, "KEY")
137b0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
137c0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
137d0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
137e0 53 5f 43 4f 44 45 43 0a 20 20 20 20 70 4b 65 79  S_CODEC.    pKey
137f0 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72   = Tcl_GetByteAr
13800 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  rayFromObj(objv[
13810 32 5d 2c 20 26 6e 4b 65 79 29 3b 0a 20 20 20 20  2], &nKey);.    
13820 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 6b  rc = sqlite3_rek
13830 65 79 28 70 44 62 2d 3e 64 62 2c 20 70 4b 65 79  ey(pDb->db, pKey
13840 2c 20 6e 4b 65 79 29 3b 0a 20 20 20 20 69 66 28  , nKey);.    if(
13850 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c   rc ){.      Tcl
13860 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
13870 74 65 72 70 2c 20 73 71 6c 69 74 65 33 5f 65 72  terp, sqlite3_er
13880 72 73 74 72 28 72 63 29 2c 20 30 29 3b 0a 20 20  rstr(rc), 0);.  
13890 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52      rc = TCL_ERR
138a0 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  OR;.    }.#endif
138b0 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
138c0 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 72 65 73  .  /*    $db res
138d0 74 6f 72 65 20 3f 44 41 54 41 42 41 53 45 3f 20  tore ?DATABASE? 
138e0 46 49 4c 45 4e 41 4d 45 0a 20 20 2a 2a 0a 20 20  FILENAME.  **.  
138f0 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61  ** Open a databa
13900 73 65 20 66 69 6c 65 20 6e 61 6d 65 64 20 46 49  se file named FI
13910 4c 45 4e 41 4d 45 2e 20 20 54 72 61 6e 73 66 65  LENAME.  Transfe
13920 72 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 0a 20  r the content . 
13930 20 2a 2a 20 6f 66 20 46 49 4c 45 4e 41 4d 45 20   ** of FILENAME 
13940 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 64  into the local d
13950 61 74 61 62 61 73 65 20 44 41 54 41 42 41 53 45  atabase DATABASE
13960 20 28 64 65 66 61 75 6c 74 3a 20 22 6d 61 69 6e   (default: "main
13970 22 29 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ")..  */.  case 
13980 44 42 5f 52 45 53 54 4f 52 45 3a 20 7b 0a 20 20  DB_RESTORE: {.  
13990 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
139a0 72 63 46 69 6c 65 3b 0a 20 20 20 20 63 6f 6e 73  rcFile;.    cons
139b0 74 20 63 68 61 72 20 2a 7a 44 65 73 74 44 62 3b  t char *zDestDb;
139c0 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 70 53  .    sqlite3 *pS
139d0 72 63 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  rc;.    sqlite3_
139e0 62 61 63 6b 75 70 20 2a 70 42 61 63 6b 75 70 3b  backup *pBackup;
139f0 0a 20 20 20 20 69 6e 74 20 6e 54 69 6d 65 6f 75  .    int nTimeou
13a00 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20  t = 0;..    if( 
13a10 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20  objc==3 ){.     
13a20 20 7a 44 65 73 74 44 62 20 3d 20 22 6d 61 69 6e   zDestDb = "main
13a30 22 3b 0a 20 20 20 20 20 20 7a 53 72 63 46 69 6c  ";.      zSrcFil
13a40 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
13a50 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20  g(objv[2]);.    
13a60 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d  }else if( objc==
13a70 34 20 29 7b 0a 20 20 20 20 20 20 7a 44 65 73 74  4 ){.      zDest
13a80 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  Db = Tcl_GetStri
13a90 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20  ng(objv[2]);.   
13aa0 20 20 20 7a 53 72 63 46 69 6c 65 20 3d 20 54 63     zSrcFile = Tc
13ab0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
13ac0 5b 33 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  [3]);.    }else{
13ad0 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
13ae0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
13af0 32 2c 20 6f 62 6a 76 2c 20 22 3f 44 41 54 41 42  2, objv, "?DATAB
13b00 41 53 45 3f 20 46 49 4c 45 4e 41 4d 45 22 29 3b  ASE? FILENAME");
13b10 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
13b20 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
13b30 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
13b40 6f 70 65 6e 5f 76 32 28 7a 53 72 63 46 69 6c 65  open_v2(zSrcFile
13b50 2c 20 26 70 53 72 63 2c 20 53 51 4c 49 54 45 5f  , &pSrc, SQLITE_
13b60 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 2c 20 30  OPEN_READONLY, 0
13b70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
13b80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13b90 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
13ba0 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 61 6e 6e  lt(interp, "cann
13bb0 6f 74 20 6f 70 65 6e 20 73 6f 75 72 63 65 20 64  ot open source d
13bc0 61 74 61 62 61 73 65 3a 20 22 2c 0a 20 20 20 20  atabase: ",.    
13bd0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65         sqlite3_e
13be0 72 72 6d 73 67 28 70 53 72 63 29 2c 20 28 63 68  rrmsg(pSrc), (ch
13bf0 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 73 71  ar*)0);.      sq
13c00 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 53 72 63  lite3_close(pSrc
13c10 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
13c20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
13c30 0a 20 20 20 20 70 42 61 63 6b 75 70 20 3d 20 73  .    pBackup = s
13c40 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 69 6e  qlite3_backup_in
13c50 69 74 28 70 44 62 2d 3e 64 62 2c 20 7a 44 65 73  it(pDb->db, zDes
13c60 74 44 62 2c 20 70 53 72 63 2c 20 22 6d 61 69 6e  tDb, pSrc, "main
13c70 22 29 3b 0a 20 20 20 20 69 66 28 20 70 42 61 63  ");.    if( pBac
13c80 6b 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  kup==0 ){.      
13c90 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
13ca0 28 69 6e 74 65 72 70 2c 20 22 72 65 73 74 6f 72  (interp, "restor
13cb0 65 20 66 61 69 6c 65 64 3a 20 22 2c 0a 20 20 20  e failed: ",.   
13cc0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
13cd0 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c  errmsg(pDb->db),
13ce0 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
13cf0 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28    sqlite3_close(
13d00 70 53 72 63 29 3b 0a 20 20 20 20 20 20 72 65 74  pSrc);.      ret
13d10 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
13d20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20     }.    while( 
13d30 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 61  (rc = sqlite3_ba
13d40 63 6b 75 70 5f 73 74 65 70 28 70 42 61 63 6b 75  ckup_step(pBacku
13d50 70 2c 31 30 30 29 29 3d 3d 53 51 4c 49 54 45 5f  p,100))==SQLITE_
13d60 4f 4b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  OK.             
13d70 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42   || rc==SQLITE_B
13d80 55 53 59 20 29 7b 0a 20 20 20 20 20 20 69 66 28  USY ){.      if(
13d90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
13da0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
13db0 6e 54 69 6d 65 6f 75 74 2b 2b 20 3e 3d 20 33 20  nTimeout++ >= 3 
13dc0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
13dd0 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 31   sqlite3_sleep(1
13de0 30 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  00);.      }.   
13df0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62   }.    sqlite3_b
13e00 61 63 6b 75 70 5f 66 69 6e 69 73 68 28 70 42 61  ackup_finish(pBa
13e10 63 6b 75 70 29 3b 0a 20 20 20 20 69 66 28 20 72  ckup);.    if( r
13e20 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
13e30 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c  {.      rc = TCL
13e40 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  _OK;.    }else i
13e50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
13e60 53 59 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  SY || rc==SQLITE
13e70 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 20  _LOCKED ){.     
13e80 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
13e90 74 28 69 6e 74 65 72 70 2c 20 22 72 65 73 74 6f  t(interp, "resto
13ea0 72 65 20 66 61 69 6c 65 64 3a 20 73 6f 75 72 63  re failed: sourc
13eb0 65 20 64 61 74 61 62 61 73 65 20 62 75 73 79 22  e database busy"
13ec0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
13ed0 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
13ee0 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54  0);.      rc = T
13ef0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65  CL_ERROR;.    }e
13f00 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  lse{.      Tcl_A
13f10 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
13f20 72 70 2c 20 22 72 65 73 74 6f 72 65 20 66 61 69  rp, "restore fai
13f30 6c 65 64 3a 20 22 2c 0a 20 20 20 20 20 20 20 20  led: ",.        
13f40 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73     sqlite3_errms
13f50 67 28 70 44 62 2d 3e 64 62 29 2c 20 28 63 68 61  g(pDb->db), (cha
13f60 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 63 20  r*)0);.      rc 
13f70 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  = TCL_ERROR;.   
13f80 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63   }.    sqlite3_c
13f90 6c 6f 73 65 28 70 53 72 63 29 3b 0a 20 20 20 20  lose(pSrc);.    
13fa0 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
13fb0 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 73 74  .  **     $db st
13fc0 61 74 75 73 20 28 73 74 65 70 7c 73 6f 72 74 7c  atus (step|sort|
13fd0 61 75 74 6f 69 6e 64 65 78 29 0a 20 20 2a 2a 0a  autoindex).  **.
13fe0 20 20 2a 2a 20 44 69 73 70 6c 61 79 20 53 51 4c    ** Display SQL
13ff0 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46  ITE_STMTSTATUS_F
14000 55 4c 4c 53 43 41 4e 5f 53 54 45 50 20 6f 72 20  ULLSCAN_STEP or 
14010 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 53 54 4d  .  ** SQLITE_STM
14020 54 53 54 41 54 55 53 5f 53 4f 52 54 20 66 6f 72  TSTATUS_SORT for
14030 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
14040 20 65 76 61 6c 2e 0a 20 20 2a 2f 0a 20 20 63 61   eval..  */.  ca
14050 73 65 20 44 42 5f 53 54 41 54 55 53 3a 20 7b 0a  se DB_STATUS: {.
14060 20 20 20 20 69 6e 74 20 76 3b 0a 20 20 20 20 63      int v;.    c
14070 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 3b 0a  onst char *zOp;.
14080 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20      if( objc!=3 
14090 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
140a0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
140b0 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 28 73 74 65  , 2, objv, "(ste
140c0 70 7c 73 6f 72 74 7c 61 75 74 6f 69 6e 64 65 78  p|sort|autoindex
140d0 29 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  )");.      retur
140e0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
140f0 20 7d 0a 20 20 20 20 7a 4f 70 20 3d 20 54 63 6c   }.    zOp = Tcl
14100 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
14110 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72  2]);.    if( str
14120 63 6d 70 28 7a 4f 70 2c 20 22 73 74 65 70 22 29  cmp(zOp, "step")
14130 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 76 20 3d  ==0 ){.      v =
14140 20 70 44 62 2d 3e 6e 53 74 65 70 3b 0a 20 20 20   pDb->nStep;.   
14150 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
14160 70 28 7a 4f 70 2c 20 22 73 6f 72 74 22 29 3d 3d  p(zOp, "sort")==
14170 30 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 70  0 ){.      v = p
14180 44 62 2d 3e 6e 53 6f 72 74 3b 0a 20 20 20 20 7d  Db->nSort;.    }
14190 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
141a0 7a 4f 70 2c 20 22 61 75 74 6f 69 6e 64 65 78 22  zOp, "autoindex"
141b0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 76 20  )==0 ){.      v 
141c0 3d 20 70 44 62 2d 3e 6e 49 6e 64 65 78 3b 0a 20  = pDb->nIndex;. 
141d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
141e0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
141f0 28 69 6e 74 65 72 70 2c 20 0a 20 20 20 20 20 20  (interp, .      
14200 20 20 20 20 20 20 22 62 61 64 20 61 72 67 75 6d        "bad argum
14210 65 6e 74 3a 20 73 68 6f 75 6c 64 20 62 65 20 61  ent: should be a
14220 75 74 6f 69 6e 64 65 78 2c 20 73 74 65 70 2c 20  utoindex, step, 
14230 6f 72 20 73 6f 72 74 22 2c 20 0a 20 20 20 20 20  or sort", .     
14240 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 30 29         (char*)0)
14250 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
14260 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
14270 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
14280 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
14290 5f 4e 65 77 49 6e 74 4f 62 6a 28 76 29 29 3b 0a  _NewIntObj(v));.
142a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20      break;.  }. 
142b0 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20   .  /*.  **     
142c0 24 64 62 20 74 69 6d 65 6f 75 74 20 4d 49 4c 4c  $db timeout MILL
142d0 45 53 45 43 4f 4e 44 53 0a 20 20 2a 2a 0a 20 20  ESECONDS.  **.  
142e0 2a 2a 20 44 65 6c 61 79 20 66 6f 72 20 74 68 65  ** Delay for the
142f0 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69   number of milli
14300 73 65 63 6f 6e 64 73 20 73 70 65 63 69 66 69 65  seconds specifie
14310 64 20 77 68 65 6e 20 61 20 66 69 6c 65 20 69 73  d when a file is
14320 20 6c 6f 63 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20   locked..  */.  
14330 63 61 73 65 20 44 42 5f 54 49 4d 45 4f 55 54 3a  case DB_TIMEOUT:
14340 20 7b 0a 20 20 20 20 69 6e 74 20 6d 73 3b 0a 20   {.    int ms;. 
14350 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29     if( objc!=3 )
14360 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
14370 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
14380 20 32 2c 20 6f 62 6a 76 2c 20 22 4d 49 4c 4c 49   2, objv, "MILLI
14390 53 45 43 4f 4e 44 53 22 29 3b 0a 20 20 20 20 20  SECONDS");.     
143a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
143b0 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  R;.    }.    if(
143c0 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
143d0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
143e0 32 5d 2c 20 26 6d 73 29 20 29 20 72 65 74 75 72  2], &ms) ) retur
143f0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
14400 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69   sqlite3_busy_ti
14410 6d 65 6f 75 74 28 70 44 62 2d 3e 64 62 2c 20 6d  meout(pDb->db, m
14420 73 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  s);.    break;. 
14430 20 7d 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20   }.  .  /*.  ** 
14440 20 20 20 20 24 64 62 20 74 6f 74 61 6c 5f 63 68      $db total_ch
14450 61 6e 67 65 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20  anges.  **.  ** 
14460 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
14470 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77  r of rows that w
14480 65 72 65 20 6d 6f 64 69 66 69 65 64 2c 20 69 6e  ere modified, in
14490 73 65 72 74 65 64 2c 20 6f 72 20 64 65 6c 65 74  serted, or delet
144a0 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74  ed .  ** since t
144b0 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
144c0 6c 65 20 77 61 73 20 63 72 65 61 74 65 64 2e 0a  le was created..
144d0 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 54    */.  case DB_T
144e0 4f 54 41 4c 5f 43 48 41 4e 47 45 53 3a 20 7b 0a  OTAL_CHANGES: {.
144f0 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65      Tcl_Obj *pRe
14500 73 75 6c 74 3b 0a 20 20 20 20 69 66 28 20 6f 62  sult;.    if( ob
14510 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 54  jc!=2 ){.      T
14520 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
14530 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
14540 20 22 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75   "");.      retu
14550 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
14560 20 20 7d 0a 20 20 20 20 70 52 65 73 75 6c 74 20    }.    pResult 
14570 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75  = Tcl_GetObjResu
14580 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  lt(interp);.    
14590 54 63 6c 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52  Tcl_SetIntObj(pR
145a0 65 73 75 6c 74 2c 20 73 71 6c 69 74 65 33 5f 74  esult, sqlite3_t
145b0 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 70 44 62  otal_changes(pDb
145c0 2d 3e 64 62 29 29 3b 0a 20 20 20 20 62 72 65 61  ->db));.    brea
145d0 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20  k;.  }..  /*    
145e0 24 64 62 20 74 72 61 63 65 20 3f 43 41 4c 4c 42  $db trace ?CALLB
145f0 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d  ACK?.  **.  ** M
14600 61 6b 65 20 61 72 72 61 6e 67 65 6d 65 6e 74 73  ake arrangements
14610 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 43   to invoke the C
14620 41 4c 4c 42 41 43 4b 20 72 6f 75 74 69 6e 65 20  ALLBACK routine 
14630 66 6f 72 20 65 61 63 68 20 53 51 4c 20 73 74 61  for each SQL sta
14640 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 61 74  tement.  ** that
14650 20 69 73 20 65 78 65 63 75 74 65 64 2e 20 20 54   is executed.  T
14660 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 53  he text of the S
14670 51 4c 20 69 73 20 61 70 70 65 6e 64 65 64 20 74  QL is appended t
14680 6f 20 43 41 4c 4c 42 41 43 4b 20 62 65 66 6f 72  o CALLBACK befor
14690 65 0a 20 20 2a 2a 20 69 74 20 69 73 20 65 78 65  e.  ** it is exe
146a0 63 75 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61  cuted..  */.  ca
146b0 73 65 20 44 42 5f 54 52 41 43 45 3a 20 7b 0a 20  se DB_TRACE: {. 
146c0 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b     if( objc>3 ){
146d0 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
146e0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
146f0 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42  2, objv, "?CALLB
14700 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65  ACK?");.      re
14710 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
14720 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62      }else if( ob
14730 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69  jc==2 ){.      i
14740 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29  f( pDb->zTrace )
14750 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70  {.        Tcl_Ap
14760 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
14770 70 2c 20 70 44 62 2d 3e 7a 54 72 61 63 65 2c 20  p, pDb->zTrace, 
14780 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
14790 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61  }else{.      cha
147a0 72 20 2a 7a 54 72 61 63 65 3b 0a 20 20 20 20 20  r *zTrace;.     
147b0 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20   int len;.      
147c0 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 20  if( pDb->zTrace 
147d0 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46  ){.        Tcl_F
147e0 72 65 65 28 70 44 62 2d 3e 7a 54 72 61 63 65 29  ree(pDb->zTrace)
147f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14800 7a 54 72 61 63 65 20 3d 20 54 63 6c 5f 47 65 74  zTrace = Tcl_Get
14810 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
14820 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20  jv[2], &len);.  
14830 20 20 20 20 69 66 28 20 7a 54 72 61 63 65 20 26      if( zTrace &
14840 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20  & len>0 ){.     
14850 20 20 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 3d     pDb->zTrace =
14860 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20   Tcl_Alloc( len 
14870 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d  + 1 );.        m
14880 65 6d 63 70 79 28 70 44 62 2d 3e 7a 54 72 61 63  emcpy(pDb->zTrac
14890 65 2c 20 7a 54 72 61 63 65 2c 20 6c 65 6e 2b 31  e, zTrace, len+1
148a0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
148b0 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 54 72          pDb->zTr
148c0 61 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ace = 0;.      }
148d0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
148e0 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29  LITE_OMIT_TRACE)
148f0 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
14900 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
14910 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20 20 20 69  G_POINT).      i
14920 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29  f( pDb->zTrace )
14930 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69  {.        pDb->i
14940 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a  nterp = interp;.
14950 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
14960 74 72 61 63 65 28 70 44 62 2d 3e 64 62 2c 20 44  trace(pDb->db, D
14970 62 54 72 61 63 65 48 61 6e 64 6c 65 72 2c 20 70  bTraceHandler, p
14980 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Db);.      }else
14990 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
149a0 33 5f 74 72 61 63 65 28 70 44 62 2d 3e 64 62 2c  3_trace(pDb->db,
149b0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
149c0 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
149d0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
149e0 2a 20 20 20 20 24 64 62 20 74 72 61 6e 73 61 63  *    $db transac
149f0 74 69 6f 6e 20 5b 2d 64 65 66 65 72 72 65 64 7c  tion [-deferred|
14a00 2d 69 6d 6d 65 64 69 61 74 65 7c 2d 65 78 63 6c  -immediate|-excl
14a10 75 73 69 76 65 5d 20 53 43 52 49 50 54 0a 20 20  usive] SCRIPT.  
14a20 2a 2a 0a 20 20 2a 2a 20 53 74 61 72 74 20 61 20  **.  ** Start a 
14a30 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  new transaction 
14a40 28 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61  (if we are not a
14a50 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 6d 69  lready in the mi
14a60 64 73 74 20 6f 66 20 61 0a 20 20 2a 2a 20 74 72  dst of a.  ** tr
14a70 61 6e 73 61 63 74 69 6f 6e 29 20 61 6e 64 20 65  ansaction) and e
14a80 78 65 63 75 74 65 20 74 68 65 20 54 43 4c 20 73  xecute the TCL s
14a90 63 72 69 70 74 20 53 43 52 49 50 54 2e 20 20 41  cript SCRIPT.  A
14aa0 66 74 65 72 20 53 43 52 49 50 54 0a 20 20 2a 2a  fter SCRIPT.  **
14ab0 20 63 6f 6d 70 6c 65 74 65 73 2c 20 65 69 74 68   completes, eith
14ac0 65 72 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72  er commit the tr
14ad0 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 72 6f 6c  ansaction or rol
14ae0 6c 20 69 74 20 62 61 63 6b 20 69 66 20 53 43 52  l it back if SCR
14af0 49 50 54 0a 20 20 2a 2a 20 74 68 72 6f 77 73 20  IPT.  ** throws 
14b00 61 6e 20 65 78 63 65 70 74 69 6f 6e 2e 20 20 4f  an exception.  O
14b10 72 20 69 66 20 6e 6f 20 6e 65 77 20 74 72 61 6e  r if no new tran
14b20 73 61 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74  sation was start
14b30 65 64 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a  ed, do nothing..
14b40 20 20 2a 2a 20 70 61 73 73 20 74 68 65 20 65 78    ** pass the ex
14b50 63 65 70 74 69 6f 6e 20 6f 6e 20 75 70 20 74 68  ception on up th
14b60 65 20 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20  e stack..  **.  
14b70 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ** This command 
14b80 77 61 73 20 69 6e 73 70 69 72 65 64 20 62 79 20  was inspired by 
14b90 44 61 76 65 20 54 68 6f 6d 61 73 27 73 20 74 61  Dave Thomas's ta
14ba0 6c 6b 20 6f 6e 20 52 75 62 79 20 61 74 20 74 68  lk on Ruby at th
14bb0 65 0a 20 20 2a 2a 20 32 30 30 35 20 4f 27 52 65  e.  ** 2005 O'Re
14bc0 69 6c 6c 79 20 4f 70 65 6e 20 53 6f 75 72 63 65  illy Open Source
14bd0 20 43 6f 6e 76 65 6e 74 69 6f 6e 20 28 4f 53 43   Convention (OSC
14be0 4f 4e 29 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ON)..  */.  case
14bf0 20 44 42 5f 54 52 41 4e 53 41 43 54 49 4f 4e 3a   DB_TRANSACTION:
14c00 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a   {.    Tcl_Obj *
14c10 70 53 63 72 69 70 74 3b 0a 20 20 20 20 63 6f 6e  pScript;.    con
14c20 73 74 20 63 68 61 72 20 2a 7a 42 65 67 69 6e 20  st char *zBegin 
14c30 3d 20 22 53 41 56 45 50 4f 49 4e 54 20 5f 74 63  = "SAVEPOINT _tc
14c40 6c 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22 3b 0a  l_transaction";.
14c50 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20      if( objc!=3 
14c60 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  && objc!=4 ){.  
14c70 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
14c80 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
14c90 6f 62 6a 76 2c 20 22 5b 54 59 50 45 5d 20 53 43  objv, "[TYPE] SC
14ca0 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65  RIPT");.      re
14cb0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
14cc0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
14cd0 44 62 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Db->nTransaction
14ce0 3d 3d 30 20 26 26 20 6f 62 6a 63 3d 3d 34 20 29  ==0 && objc==4 )
14cf0 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  {.      static c
14d00 6f 6e 73 74 20 63 68 61 72 20 2a 54 54 59 50 45  onst char *TTYPE
14d10 5f 73 74 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  _strs[] = {.    
14d20 20 20 20 20 22 64 65 66 65 72 72 65 64 22 2c 20      "deferred", 
14d30 20 20 22 65 78 63 6c 75 73 69 76 65 22 2c 20 20    "exclusive",  
14d40 22 69 6d 6d 65 64 69 61 74 65 22 2c 20 30 0a 20  "immediate", 0. 
14d50 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 65 6e       };.      en
14d60 75 6d 20 54 54 59 50 45 5f 65 6e 75 6d 20 7b 0a  um TTYPE_enum {.
14d70 20 20 20 20 20 20 20 20 54 54 59 50 45 5f 44 45          TTYPE_DE
14d80 46 45 52 52 45 44 2c 20 54 54 59 50 45 5f 45 58  FERRED, TTYPE_EX
14d90 43 4c 55 53 49 56 45 2c 20 54 54 59 50 45 5f 49  CLUSIVE, TTYPE_I
14da0 4d 4d 45 44 49 41 54 45 0a 20 20 20 20 20 20 7d  MMEDIATE.      }
14db0 3b 0a 20 20 20 20 20 20 69 6e 74 20 74 74 79 70  ;.      int ttyp
14dc0 65 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c  e;.      if( Tcl
14dd0 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a  _GetIndexFromObj
14de0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
14df0 2c 20 54 54 59 50 45 5f 73 74 72 73 2c 20 22 74  , TTYPE_strs, "t
14e00 72 61 6e 73 61 63 74 69 6f 6e 20 74 79 70 65 22  ransaction type"
14e10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
14e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e30 30 2c 20 26 74 74 79 70 65 29 20 29 7b 0a 20 20  0, &ttype) ){.  
14e40 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
14e50 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
14e60 20 20 20 20 20 20 73 77 69 74 63 68 28 20 28 65        switch( (e
14e70 6e 75 6d 20 54 54 59 50 45 5f 65 6e 75 6d 29 74  num TTYPE_enum)t
14e80 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 20 20  type ){.        
14e90 63 61 73 65 20 54 54 59 50 45 5f 44 45 46 45 52  case TTYPE_DEFER
14ea0 52 45 44 3a 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70  RED:    /* no-op
14eb0 20 2a 2f 3b 20 20 20 20 20 20 20 20 20 20 20 20   */;            
14ec0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14ed0 20 20 20 20 63 61 73 65 20 54 54 59 50 45 5f 45      case TTYPE_E
14ee0 58 43 4c 55 53 49 56 45 3a 20 20 20 7a 42 65 67  XCLUSIVE:   zBeg
14ef0 69 6e 20 3d 20 22 42 45 47 49 4e 20 45 58 43 4c  in = "BEGIN EXCL
14f00 55 53 49 56 45 22 3b 20 20 62 72 65 61 6b 3b 0a  USIVE";  break;.
14f10 20 20 20 20 20 20 20 20 63 61 73 65 20 54 54 59          case TTY
14f20 50 45 5f 49 4d 4d 45 44 49 41 54 45 3a 20 20 20  PE_IMMEDIATE:   
14f30 7a 42 65 67 69 6e 20 3d 20 22 42 45 47 49 4e 20  zBegin = "BEGIN 
14f40 49 4d 4d 45 44 49 41 54 45 22 3b 20 20 62 72 65  IMMEDIATE";  bre
14f50 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
14f60 7d 0a 20 20 20 20 70 53 63 72 69 70 74 20 3d 20  }.    pScript = 
14f70 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 3b 0a 0a 20  objv[objc-1];.. 
14f80 20 20 20 2f 2a 20 52 75 6e 20 74 68 65 20 53 51     /* Run the SQ
14f90 4c 69 74 65 20 42 45 47 49 4e 20 63 6f 6d 6d 61  Lite BEGIN comma
14fa0 6e 64 20 74 6f 20 6f 70 65 6e 20 61 20 74 72 61  nd to open a tra
14fb0 6e 73 61 63 74 69 6f 6e 20 6f 72 20 73 61 76 65  nsaction or save
14fc0 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20 20 20 70 44  point. */.    pD
14fd0 62 2d 3e 64 69 73 61 62 6c 65 41 75 74 68 2b 2b  b->disableAuth++
14fe0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
14ff0 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62 2c  e3_exec(pDb->db,
15000 20 7a 42 65 67 69 6e 2c 20 30 2c 20 30 2c 20 30   zBegin, 0, 0, 0
15010 29 3b 0a 20 20 20 20 70 44 62 2d 3e 64 69 73 61  );.    pDb->disa
15020 62 6c 65 41 75 74 68 2d 2d 3b 0a 20 20 20 20 69  bleAuth--;.    i
15030 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
15040 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
15050 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
15060 70 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  p, sqlite3_errms
15070 67 28 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a  g(pDb->db), 0);.
15080 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
15090 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
150a0 20 20 70 44 62 2d 3e 6e 54 72 61 6e 73 61 63 74    pDb->nTransact
150b0 69 6f 6e 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 49  ion++;..    /* I
150c0 66 20 75 73 69 6e 67 20 4e 52 45 2c 20 73 63 68  f using NRE, sch
150d0 65 64 75 6c 65 20 61 20 63 61 6c 6c 62 61 63 6b  edule a callback
150e0 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 73   to invoke the s
150f0 63 72 69 70 74 20 70 53 63 72 69 70 74 2c 20 74  cript pScript, t
15100 68 65 6e 0a 20 20 20 20 2a 2a 20 61 20 73 65 63  hen.    ** a sec
15110 6f 6e 64 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20  ond callback to 
15120 63 6f 6d 6d 69 74 20 28 6f 72 20 72 6f 6c 6c 62  commit (or rollb
15130 61 63 6b 29 20 74 68 65 20 74 72 61 6e 73 61 63  ack) the transac
15140 74 69 6f 6e 20 6f 72 20 73 61 76 65 70 6f 69 6e  tion or savepoin
15150 74 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 65 64 20  t.    ** opened 
15160 61 62 6f 76 65 2e 20 49 66 20 6e 6f 74 20 75 73  above. If not us
15170 69 6e 67 20 4e 52 45 2c 20 65 76 61 6c 75 61 74  ing NRE, evaluat
15180 65 20 74 68 65 20 73 63 72 69 70 74 20 64 69 72  e the script dir
15190 65 63 74 6c 79 2c 20 74 68 65 6e 0a 20 20 20 20  ectly, then.    
151a0 2a 2a 20 63 61 6c 6c 20 66 75 6e 63 74 69 6f 6e  ** call function
151b0 20 44 62 54 72 61 6e 73 50 6f 73 74 43 6d 64 28   DbTransPostCmd(
151c0 29 20 74 6f 20 63 6f 6d 6d 69 74 20 28 6f 72 20  ) to commit (or 
151d0 72 6f 6c 6c 62 61 63 6b 29 20 74 68 65 20 74 72  rollback) the tr
151e0 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 20 20 2a  ansaction .    *
151f0 2a 20 6f 72 20 73 61 76 65 70 6f 69 6e 74 2e 20  * or savepoint. 
15200 20 2a 2f 0a 20 20 20 20 69 66 28 20 44 62 55 73   */.    if( DbUs
15210 65 4e 72 65 28 29 20 29 7b 0a 20 20 20 20 20 20  eNre() ){.      
15220 54 63 6c 5f 4e 52 41 64 64 43 61 6c 6c 62 61 63  Tcl_NRAddCallbac
15230 6b 28 69 6e 74 65 72 70 2c 20 44 62 54 72 61 6e  k(interp, DbTran
15240 73 50 6f 73 74 43 6d 64 2c 20 63 64 2c 20 30 2c  sPostCmd, cd, 0,
15250 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 54 63   0, 0);.      Tc
15260 6c 5f 4e 52 45 76 61 6c 4f 62 6a 28 69 6e 74 65  l_NREvalObj(inte
15270 72 70 2c 20 70 53 63 72 69 70 74 2c 20 30 29 3b  rp, pScript, 0);
15280 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
15290 20 20 72 63 20 3d 20 44 62 54 72 61 6e 73 50 6f    rc = DbTransPo
152a0 73 74 43 6d 64 28 26 63 64 2c 20 69 6e 74 65 72  stCmd(&cd, inter
152b0 70 2c 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78  p, Tcl_EvalObjEx
152c0 28 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74  (interp, pScript
152d0 2c 20 30 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  , 0));.    }.   
152e0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
152f0 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 75 6e  *.  **    $db un
15300 6c 6f 63 6b 5f 6e 6f 74 69 66 79 20 3f 73 63 72  lock_notify ?scr
15310 69 70 74 3f 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ipt?.  */.  case
15320 20 44 42 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46   DB_UNLOCK_NOTIF
15330 59 3a 20 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  Y: {.#ifndef SQL
15340 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43  ITE_ENABLE_UNLOC
15350 4b 5f 4e 4f 54 49 46 59 0a 20 20 20 20 54 63 6c  K_NOTIFY.    Tcl
15360 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
15370 74 65 72 70 2c 20 22 75 6e 6c 6f 63 6b 5f 6e 6f  terp, "unlock_no
15380 74 69 66 79 20 6e 6f 74 20 61 76 61 69 6c 61 62  tify not availab
15390 6c 65 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64  le in this build
153a0 22 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20  ", 0);.    rc = 
153b0 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65  TCL_ERROR;.#else
153c0 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  .    if( objc!=2
153d0 20 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20   && objc!=3 ){. 
153e0 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
153f0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
15400 20 6f 62 6a 76 2c 20 22 3f 53 43 52 49 50 54 3f   objv, "?SCRIPT?
15410 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54  ");.      rc = T
15420 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65  CL_ERROR;.    }e
15430 6c 73 65 7b 0a 20 20 20 20 20 20 76 6f 69 64 20  lse{.      void 
15440 28 2a 78 4e 6f 74 69 66 79 29 28 76 6f 69 64 20  (*xNotify)(void 
15450 2a 2a 2c 20 69 6e 74 29 20 3d 20 30 3b 0a 20 20  **, int) = 0;.  
15460 20 20 20 20 76 6f 69 64 20 2a 70 4e 6f 74 69 66      void *pNotif
15470 79 41 72 67 20 3d 20 30 3b 0a 0a 20 20 20 20 20  yArg = 0;..     
15480 20 69 66 28 20 70 44 62 2d 3e 70 55 6e 6c 6f 63   if( pDb->pUnloc
15490 6b 4e 6f 74 69 66 79 20 29 7b 0a 20 20 20 20 20  kNotify ){.     
154a0 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
154b0 75 6e 74 28 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b  unt(pDb->pUnlock
154c0 4e 6f 74 69 66 79 29 3b 0a 20 20 20 20 20 20 20  Notify);.       
154d0 20 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74   pDb->pUnlockNot
154e0 69 66 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ify = 0;.      }
154f0 0a 20 20 0a 20 20 20 20 20 20 69 66 28 20 6f 62  .  .      if( ob
15500 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 20  jc==3 ){.       
15510 20 78 4e 6f 74 69 66 79 20 3d 20 44 62 55 6e 6c   xNotify = DbUnl
15520 6f 63 6b 4e 6f 74 69 66 79 3b 0a 20 20 20 20 20  ockNotify;.     
15530 20 20 20 70 4e 6f 74 69 66 79 41 72 67 20 3d 20     pNotifyArg = 
15540 28 76 6f 69 64 20 2a 29 70 44 62 3b 0a 20 20 20  (void *)pDb;.   
15550 20 20 20 20 20 70 44 62 2d 3e 70 55 6e 6c 6f 63       pDb->pUnloc
15560 6b 4e 6f 74 69 66 79 20 3d 20 6f 62 6a 76 5b 32  kNotify = objv[2
15570 5d 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 49  ];.        Tcl_I
15580 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d  ncrRefCount(pDb-
15590 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 29 3b  >pUnlockNotify);
155a0 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  .      }.  .    
155b0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 75 6e    if( sqlite3_un
155c0 6c 6f 63 6b 5f 6e 6f 74 69 66 79 28 70 44 62 2d  lock_notify(pDb-
155d0 3e 64 62 2c 20 78 4e 6f 74 69 66 79 2c 20 70 4e  >db, xNotify, pN
155e0 6f 74 69 66 79 41 72 67 29 20 29 7b 0a 20 20 20  otifyArg) ){.   
155f0 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
15600 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71  esult(interp, sq
15610 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62  lite3_errmsg(pDb
15620 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 20  ->db), 0);.     
15630 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f     rc = TCL_ERRO
15640 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  R;.      }.    }
15650 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61  .#endif.    brea
15660 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
15670 2a 20 20 20 20 24 64 62 20 77 61 6c 5f 68 6f 6f  *    $db wal_hoo
15680 6b 20 3f 73 63 72 69 70 74 3f 0a 20 20 2a 2a 20  k ?script?.  ** 
15690 20 20 20 24 64 62 20 75 70 64 61 74 65 5f 68 6f     $db update_ho
156a0 6f 6b 20 3f 73 63 72 69 70 74 3f 0a 20 20 2a 2a  ok ?script?.  **
156b0 20 20 20 20 24 64 62 20 72 6f 6c 6c 62 61 63 6b      $db rollback
156c0 5f 68 6f 6f 6b 20 3f 73 63 72 69 70 74 3f 0a 20  _hook ?script?. 
156d0 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 57 41   */.  case DB_WA
156e0 4c 5f 48 4f 4f 4b 3a 20 0a 20 20 63 61 73 65 20  L_HOOK: .  case 
156f0 44 42 5f 55 50 44 41 54 45 5f 48 4f 4f 4b 3a 20  DB_UPDATE_HOOK: 
15700 0a 20 20 63 61 73 65 20 44 42 5f 52 4f 4c 4c 42  .  case DB_ROLLB
15710 41 43 4b 5f 48 4f 4f 4b 3a 20 7b 0a 0a 20 20 20  ACK_HOOK: {..   
15720 20 2f 2a 20 73 65 74 20 70 70 48 6f 6f 6b 20 74   /* set ppHook t
15730 6f 20 70 6f 69 6e 74 20 61 74 20 70 55 70 64 61  o point at pUpda
15740 74 65 48 6f 6f 6b 20 6f 72 20 70 52 6f 6c 6c 62  teHook or pRollb
15750 61 63 6b 48 6f 6f 6b 2c 20 64 65 70 65 6e 64 69  ackHook, dependi
15760 6e 67 20 6f 6e 20 0a 20 20 20 20 2a 2a 20 77 68  ng on .    ** wh
15770 65 74 68 65 72 20 5b 24 64 62 20 75 70 64 61 74  ether [$db updat
15780 65 5f 68 6f 6f 6b 5d 20 6f 72 20 5b 24 64 62 20  e_hook] or [$db 
15790 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 5d 20 77  rollback_hook] w
157a0 61 73 20 69 6e 76 6f 6b 65 64 2e 0a 20 20 20 20  as invoked..    
157b0 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  */.    Tcl_Obj *
157c0 2a 70 70 48 6f 6f 6b 3b 20 0a 20 20 20 20 69 66  *ppHook; .    if
157d0 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f 55 50 44  ( choice==DB_UPD
157e0 41 54 45 5f 48 4f 4f 4b 20 29 7b 0a 20 20 20 20  ATE_HOOK ){.    
157f0 20 20 70 70 48 6f 6f 6b 20 3d 20 26 70 44 62 2d    ppHook = &pDb-
15800 3e 70 55 70 64 61 74 65 48 6f 6f 6b 3b 0a 20 20  >pUpdateHook;.  
15810 20 20 7d 65 6c 73 65 20 69 66 28 20 63 68 6f 69    }else if( choi
15820 63 65 3d 3d 44 42 5f 57 41 4c 5f 48 4f 4f 4b 20  ce==DB_WAL_HOOK 
15830 29 7b 0a 20 20 20 20 20 20 70 70 48 6f 6f 6b 20  ){.      ppHook 
15840 3d 20 26 70 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b  = &pDb->pWalHook
15850 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
15860 20 20 20 70 70 48 6f 6f 6b 20 3d 20 26 70 44 62     ppHook = &pDb
15870 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3b  ->pRollbackHook;
15880 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
15890 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21  objc!=2 && objc!
158a0 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 54 63 6c  =3 ){.       Tcl
158b0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
158c0 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
158d0 3f 53 43 52 49 50 54 3f 22 29 3b 0a 20 20 20 20  ?SCRIPT?");.    
158e0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
158f0 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
15900 66 28 20 2a 70 70 48 6f 6f 6b 20 29 7b 0a 20 20  f( *ppHook ){.  
15910 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
15920 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 2a 70 70  sult(interp, *pp
15930 48 6f 6f 6b 29 3b 0a 20 20 20 20 20 20 69 66 28  Hook);.      if(
15940 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20   objc==3 ){.    
15950 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
15960 6f 75 6e 74 28 2a 70 70 48 6f 6f 6b 29 3b 0a 20  ount(*ppHook);. 
15970 20 20 20 20 20 20 20 2a 70 70 48 6f 6f 6b 20 3d         *ppHook =
15980 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
15990 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d  }.    if( objc==
159a0 33 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  3 ){.      asser
159b0 74 28 20 21 28 2a 70 70 48 6f 6f 6b 29 20 29 3b  t( !(*ppHook) );
159c0 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47  .      if( Tcl_G
159d0 65 74 43 68 61 72 4c 65 6e 67 74 68 28 6f 62 6a  etCharLength(obj
159e0 76 5b 32 5d 29 3e 30 20 29 7b 0a 20 20 20 20 20  v[2])>0 ){.     
159f0 20 20 20 2a 70 70 48 6f 6f 6b 20 3d 20 6f 62 6a     *ppHook = obj
15a00 76 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20 54 63  v[2];.        Tc
15a10 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 2a  l_IncrRefCount(*
15a20 70 70 48 6f 6f 6b 29 3b 0a 20 20 20 20 20 20 7d  ppHook);.      }
15a30 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69  .    }..    sqli
15a40 74 65 33 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28  te3_update_hook(
15a50 70 44 62 2d 3e 64 62 2c 20 28 70 44 62 2d 3e 70  pDb->db, (pDb->p
15a60 55 70 64 61 74 65 48 6f 6f 6b 3f 44 62 55 70 64  UpdateHook?DbUpd
15a70 61 74 65 48 61 6e 64 6c 65 72 3a 30 29 2c 20 70  ateHandler:0), p
15a80 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
15a90 5f 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28 70  _rollback_hook(p
15aa0 44 62 2d 3e 64 62 2c 28 70 44 62 2d 3e 70 52 6f  Db->db,(pDb->pRo
15ab0 6c 6c 62 61 63 6b 48 6f 6f 6b 3f 44 62 52 6f 6c  llbackHook?DbRol
15ac0 6c 62 61 63 6b 48 61 6e 64 6c 65 72 3a 30 29 2c  lbackHandler:0),
15ad0 70 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pDb);.    sqlite
15ae0 33 5f 77 61 6c 5f 68 6f 6f 6b 28 70 44 62 2d 3e  3_wal_hook(pDb->
15af0 64 62 2c 28 70 44 62 2d 3e 70 57 61 6c 48 6f 6f  db,(pDb->pWalHoo
15b00 6b 3f 44 62 57 61 6c 48 61 6e 64 6c 65 72 3a 30  k?DbWalHandler:0
15b10 29 2c 70 44 62 29 3b 0a 0a 20 20 20 20 62 72 65  ),pDb);..    bre
15b20 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
15b30 20 24 64 62 20 76 65 72 73 69 6f 6e 0a 20 20 2a   $db version.  *
15b40 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68  *.  ** Return th
15b50 65 20 76 65 72 73 69 6f 6e 20 73 74 72 69 6e 67  e version string
15b60 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61   for this databa
15b70 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  se..  */.  case 
15b80 44 42 5f 56 45 52 53 49 4f 4e 3a 20 7b 0a 20 20  DB_VERSION: {.  
15b90 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
15ba0 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
15bb0 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69  sqlite3_libversi
15bc0 6f 6e 28 29 2c 20 54 43 4c 5f 53 54 41 54 49 43  on(), TCL_STATIC
15bd0 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
15be0 7d 0a 0a 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 6f  }...  } /* End o
15bf0 66 20 74 68 65 20 53 57 49 54 43 48 20 73 74 61  f the SWITCH sta
15c00 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 72 65 74 75  tement */.  retu
15c10 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 53 51  rn rc;.}..#if SQ
15c20 4c 49 54 45 5f 54 43 4c 5f 4e 52 45 0a 2f 2a 0a  LITE_TCL_NRE./*.
15c30 2a 2a 20 41 64 61 70 74 6f 72 20 74 68 61 74 20  ** Adaptor that 
15c40 70 72 6f 76 69 64 65 73 20 61 6e 20 6f 62 6a 43  provides an objC
15c50 6d 64 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  md interface to 
15c60 74 68 65 20 4e 52 45 2d 65 6e 61 62 6c 65 64 0a  the NRE-enabled.
15c70 2a 2a 20 69 6e 74 65 72 66 61 63 65 20 69 6d 70  ** interface imp
15c80 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a  lementation..*/.
15c90 73 74 61 74 69 63 20 69 6e 74 20 44 62 4f 62 6a  static int DbObj
15ca0 43 6d 64 41 64 61 70 74 6f 72 28 0a 20 20 76 6f  CmdAdaptor(.  vo
15cb0 69 64 20 2a 63 64 2c 0a 20 20 54 63 6c 5f 49 6e  id *cd,.  Tcl_In
15cc0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
15cd0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
15ce0 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76 0a  Obj *const*objv.
15cf0 29 7b 0a 20 20 72 65 74 75 72 6e 20 54 63 6c 5f  ){.  return Tcl_
15d00 4e 52 43 61 6c 6c 4f 62 6a 50 72 6f 63 28 69 6e  NRCallObjProc(in
15d10 74 65 72 70 2c 20 44 62 4f 62 6a 43 6d 64 2c 20  terp, DbObjCmd, 
15d20 63 64 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b  cd, objc, objv);
15d30 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
15d40 49 54 45 5f 54 43 4c 5f 4e 52 45 20 2a 2f 0a 0a  ITE_TCL_NRE */..
15d50 2f 2a 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 20  /*.**   sqlite3 
15d60 44 42 4e 41 4d 45 20 46 49 4c 45 4e 41 4d 45 20  DBNAME FILENAME 
15d70 3f 2d 76 66 73 20 56 46 53 4e 41 4d 45 3f 20 3f  ?-vfs VFSNAME? ?
15d80 2d 6b 65 79 20 4b 45 59 3f 20 3f 2d 72 65 61 64  -key KEY? ?-read
15d90 6f 6e 6c 79 20 42 4f 4f 4c 45 41 4e 3f 0a 2a 2a  only BOOLEAN?.**
15da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15db0 20 20 20 20 20 20 20 20 20 20 20 3f 2d 63 72 65             ?-cre
15dc0 61 74 65 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d 6e  ate BOOLEAN? ?-n
15dd0 6f 6d 75 74 65 78 20 42 4f 4f 4c 45 41 4e 3f 0a  omutex BOOLEAN?.
15de0 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  **.** This is th
15df0 65 20 6d 61 69 6e 20 54 63 6c 20 63 6f 6d 6d 61  e main Tcl comma
15e00 6e 64 2e 20 20 57 68 65 6e 20 74 68 65 20 22 73  nd.  When the "s
15e10 71 6c 69 74 65 22 20 54 63 6c 20 63 6f 6d 6d 61  qlite" Tcl comma
15e20 6e 64 20 69 73 0a 2a 2a 20 69 6e 76 6f 6b 65 64  nd is.** invoked
15e30 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
15e40 75 6e 73 20 74 6f 20 70 72 6f 63 65 73 73 20 74  uns to process t
15e50 68 61 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a  hat command..**.
15e60 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67  ** The first arg
15e70 75 6d 65 6e 74 2c 20 44 42 4e 41 4d 45 2c 20 69  ument, DBNAME, i
15e80 73 20 61 6e 20 61 72 62 69 74 72 61 72 79 20 6e  s an arbitrary n
15e90 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 0a 2a 2a  ame for a new.**
15ea0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
15eb0 74 69 6f 6e 2e 20 20 54 68 69 73 20 63 6f 6d 6d  tion.  This comm
15ec0 61 6e 64 20 63 72 65 61 74 65 73 20 61 20 6e 65  and creates a ne
15ed0 77 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 64 0a  w command named.
15ee0 2a 2a 20 44 42 4e 41 4d 45 20 74 68 61 74 20 69  ** DBNAME that i
15ef0 73 20 75 73 65 64 20 74 6f 20 63 6f 6e 74 72 6f  s used to contro
15f00 6c 20 74 68 61 74 20 63 6f 6e 6e 65 63 74 69 6f  l that connectio
15f10 6e 2e 20 20 54 68 65 20 64 61 74 61 62 61 73 65  n.  The database
15f20 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  .** connection i
15f30 73 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74  s deleted when t
15f40 68 65 20 44 42 4e 41 4d 45 20 63 6f 6d 6d 61 6e  he DBNAME comman
15f50 64 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  d is deleted..**
15f60 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61  .** The second a
15f70 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e  rgument is the n
15f80 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
15f90 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2f 0a  ase file..**.*/.
15fa0 73 74 61 74 69 63 20 69 6e 74 20 44 62 4d 61 69  static int DbMai
15fb0 6e 28 76 6f 69 64 20 2a 63 64 2c 20 54 63 6c 5f  n(void *cd, Tcl_
15fc0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
15fd0 69 6e 74 20 6f 62 6a 63 2c 54 63 6c 5f 4f 62 6a  int objc,Tcl_Obj
15fe0 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76 29 7b 0a 20   *const*objv){. 
15ff0 20 53 71 6c 69 74 65 44 62 20 2a 70 3b 0a 20 20   SqliteDb *p;.  
16000 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
16010 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73  ;.  char *zErrMs
16020 67 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f  g;.  int i;.  co
16030 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b  nst char *zFile;
16040 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
16050 56 66 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 66  Vfs = 0;.  int f
16060 6c 61 67 73 3b 0a 20 20 54 63 6c 5f 44 53 74 72  lags;.  Tcl_DStr
16070 69 6e 67 20 74 72 61 6e 73 6c 61 74 65 64 46 69  ing translatedFi
16080 6c 65 6e 61 6d 65 3b 0a 23 69 66 64 65 66 20 53  lename;.#ifdef S
16090 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
160a0 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d 20 30    void *pKey = 0
160b0 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20 30  ;.  int nKey = 0
160c0 3b 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74 20 72  ;.#endif.  int r
160d0 63 3b 0a 0a 20 20 2f 2a 20 49 6e 20 6e 6f 72 6d  c;..  /* In norm
160e0 61 6c 20 75 73 65 2c 20 65 61 63 68 20 54 43 4c  al use, each TCL
160f0 20 69 6e 74 65 72 70 72 65 74 65 72 20 72 75 6e   interpreter run
16100 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 74 68  s in a single th
16110 72 65 61 64 2e 20 20 53 6f 0a 20 20 2a 2a 20 62  read.  So.  ** b
16120 79 20 64 65 66 61 75 6c 74 2c 20 77 65 20 63 61  y default, we ca
16130 6e 20 74 75 72 6e 20 6f 66 20 6d 75 74 65 78 69  n turn of mutexi
16140 6e 67 20 6f 6e 20 53 51 4c 69 74 65 20 64 61 74  ng on SQLite dat
16150 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
16160 73 2e 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 2c  s..  ** However,
16170 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72   for testing pur
16180 70 6f 73 65 73 20 69 74 20 69 73 20 75 73 65 66  poses it is usef
16190 75 6c 20 74 6f 20 68 61 76 65 20 6d 75 74 65 78  ul to have mutex
161a0 65 73 20 74 75 72 6e 65 64 0a 20 20 2a 2a 20 6f  es turned.  ** o
161b0 6e 2e 20 20 53 6f 2c 20 62 79 20 64 65 66 61 75  n.  So, by defau
161c0 6c 74 2c 20 6d 75 74 65 78 65 73 20 64 65 66 61  lt, mutexes defa
161d0 75 6c 74 20 6f 66 66 2e 20 20 42 75 74 20 69 66  ult off.  But if
161e0 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 0a 20   compiled with. 
161f0 20 2a 2a 20 53 51 4c 49 54 45 5f 54 43 4c 5f 44   ** SQLITE_TCL_D
16200 45 46 41 55 4c 54 5f 46 55 4c 4c 4d 55 54 45 58  EFAULT_FULLMUTEX
16210 20 74 68 65 6e 20 6d 75 74 65 78 65 73 20 64 65   then mutexes de
16220 66 61 75 6c 74 20 6f 6e 2e 0a 20 20 2a 2f 0a 23  fault on..  */.#
16230 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 43 4c  ifdef SQLITE_TCL
16240 5f 44 45 46 41 55 4c 54 5f 46 55 4c 4c 4d 55 54  _DEFAULT_FULLMUT
16250 45 58 0a 20 20 66 6c 61 67 73 20 3d 20 53 51 4c  EX.  flags = SQL
16260 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
16270 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
16280 5f 43 52 45 41 54 45 20 7c 20 53 51 4c 49 54 45  _CREATE | SQLITE
16290 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 3b  _OPEN_FULLMUTEX;
162a0 0a 23 65 6c 73 65 0a 20 20 66 6c 61 67 73 20 3d  .#else.  flags =
162b0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
162c0 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f  DWRITE | SQLITE_
162d0 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 20 53 51  OPEN_CREATE | SQ
162e0 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45  LITE_OPEN_NOMUTE
162f0 58 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  X;.#endif..  if(
16300 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20   objc==2 ){.    
16310 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65 74 53 74  zArg = Tcl_GetSt
16320 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
16330 5b 31 5d 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  [1], 0);.    if(
16340 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 76   strcmp(zArg,"-v
16350 65 72 73 69 6f 6e 22 29 3d 3d 30 20 29 7b 0a 20  ersion")==0 ){. 
16360 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
16370 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 73 71 6c  esult(interp,sql
16380 69 74 65 33 5f 76 65 72 73 69 6f 6e 2c 30 29 3b  ite3_version,0);
16390 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
163a0 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  L_OK;.    }.    
163b0 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c  if( strcmp(zArg,
163c0 22 2d 68 61 73 2d 63 6f 64 65 63 22 29 3d 3d 30  "-has-codec")==0
163d0 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   ){.#ifdef SQLIT
163e0 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20  E_HAS_CODEC.    
163f0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
16400 6c 74 28 69 6e 74 65 72 70 2c 22 31 22 2c 30 29  lt(interp,"1",0)
16410 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 54 63  ;.#else.      Tc
16420 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
16430 6e 74 65 72 70 2c 22 30 22 2c 30 29 3b 0a 23 65  nterp,"0",0);.#e
16440 6e 64 69 66 0a 20 20 20 20 20 20 72 65 74 75 72  ndif.      retur
16450 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  n TCL_OK;.    }.
16460 20 20 7d 0a 20 20 66 6f 72 28 69 3d 33 3b 20 69    }.  for(i=3; i
16470 2b 31 3c 6f 62 6a 63 3b 20 69 2b 3d 32 29 7b 0a  +1<objc; i+=2){.
16480 20 20 20 20 7a 41 72 67 20 3d 20 54 63 6c 5f 47      zArg = Tcl_G
16490 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69 5d  etString(objv[i]
164a0 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  );.    if( strcm
164b0 70 28 7a 41 72 67 2c 22 2d 6b 65 79 22 29 3d 3d  p(zArg,"-key")==
164c0 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  0 ){.#ifdef SQLI
164d0 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20  TE_HAS_CODEC.   
164e0 20 20 20 70 4b 65 79 20 3d 20 54 63 6c 5f 47 65     pKey = Tcl_Ge
164f0 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62  tByteArrayFromOb
16500 6a 28 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 6e 4b  j(objv[i+1], &nK
16510 65 79 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ey);.#endif.    
16520 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
16530 28 7a 41 72 67 2c 20 22 2d 76 66 73 22 29 3d 3d  (zArg, "-vfs")==
16540 30 20 29 7b 0a 20 20 20 20 20 20 7a 56 66 73 20  0 ){.      zVfs 
16550 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
16560 6f 62 6a 76 5b 69 2b 31 5d 29 3b 0a 20 20 20 20  objv[i+1]);.    
16570 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
16580 28 7a 41 72 67 2c 20 22 2d 72 65 61 64 6f 6e 6c  (zArg, "-readonl
16590 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  y")==0 ){.      
165a0 69 6e 74 20 62 3b 0a 20 20 20 20 20 20 69 66 28  int b;.      if(
165b0 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46   Tcl_GetBooleanF
165c0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
165d0 62 6a 76 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20  bjv[i+1], &b) ) 
165e0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
165f0 3b 0a 20 20 20 20 20 20 69 66 28 20 62 20 29 7b  ;.      if( b ){
16600 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 26  .        flags &
16610 3d 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  = ~(SQLITE_OPEN_
16620 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
16630 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20  _OPEN_CREATE);. 
16640 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20         flags |= 
16650 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
16660 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ONLY;.      }els
16670 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  e{.        flags
16680 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e   &= ~SQLITE_OPEN
16690 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20  _READONLY;.     
166a0 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49     flags |= SQLI
166b0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
166c0 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
166d0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
166e0 7a 41 72 67 2c 20 22 2d 63 72 65 61 74 65 22 29  zArg, "-create")
166f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
16700 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63   b;.      if( Tc
16710 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
16720 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
16730 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20 72 65 74  [i+1], &b) ) ret
16740 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
16750 20 20 20 20 20 69 66 28 20 62 20 26 26 20 28 66       if( b && (f
16760 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
16770 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3d 3d 30 20  EN_READONLY)==0 
16780 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  ){.        flags
16790 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   |= SQLITE_OPEN_
167a0 43 52 45 41 54 45 3b 0a 20 20 20 20 20 20 7d 65  CREATE;.      }e
167b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 61  lse{.        fla
167c0 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50  gs &= ~SQLITE_OP
167d0 45 4e 5f 43 52 45 41 54 45 3b 0a 20 20 20 20 20  EN_CREATE;.     
167e0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
167f0 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d   strcmp(zArg, "-
16800 6e 6f 6d 75 74 65 78 22 29 3d 3d 30 20 29 7b 0a  nomutex")==0 ){.
16810 20 20 20 20 20 20 69 6e 74 20 62 3b 0a 20 20 20        int b;.   
16820 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f     if( Tcl_GetBo
16830 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
16840 65 72 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20  erp, objv[i+1], 
16850 26 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  &b) ) return TCL
16860 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 69 66  _ERROR;.      if
16870 28 20 62 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ( b ){.        f
16880 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
16890 50 45 4e 5f 4e 4f 4d 55 54 45 58 3b 0a 20 20 20  PEN_NOMUTEX;.   
168a0 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53       flags &= ~S
168b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d  QLITE_OPEN_FULLM
168c0 55 54 45 58 3b 0a 20 20 20 20 20 20 7d 65 6c 73  UTEX;.      }els
168d0 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  e{.        flags
168e0 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e   &= ~SQLITE_OPEN
168f0 5f 4e 4f 4d 55 54 45 58 3b 0a 20 20 20 20 20 20  _NOMUTEX;.      
16900 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
16910 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d 66  strcmp(zArg, "-f
16920 75 6c 6c 6d 75 74 65 78 22 29 3d 3d 30 20 29 7b  ullmutex")==0 ){
16930 0a 20 20 20 20 20 20 69 6e 74 20 62 3b 0a 20 20  .      int b;.  
16940 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42      if( Tcl_GetB
16950 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
16960 74 65 72 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c  terp, objv[i+1],
16970 20 26 62 29 20 29 20 72 65 74 75 72 6e 20 54 43   &b) ) return TC
16980 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 69  L_ERROR;.      i
16990 66 28 20 62 20 29 7b 0a 20 20 20 20 20 20 20 20  f( b ){.        
169a0 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
169b0 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 3b 0a  OPEN_FULLMUTEX;.
169c0 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d          flags &=
169d0 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f   ~SQLITE_OPEN_NO
169e0 4d 55 54 45 58 3b 0a 20 20 20 20 20 20 7d 65 6c  MUTEX;.      }el
169f0 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67  se{.        flag
16a00 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45  s &= ~SQLITE_OPE
16a10 4e 5f 46 55 4c 4c 4d 55 54 45 58 3b 0a 20 20 20  N_FULLMUTEX;.   
16a20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
16a30 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20  f( strcmp(zArg, 
16a40 22 2d 75 72 69 22 29 3d 3d 30 20 29 7b 0a 20 20  "-uri")==0 ){.  
16a50 20 20 20 20 69 6e 74 20 62 3b 0a 20 20 20 20 20      int b;.     
16a60 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c   if( Tcl_GetBool
16a70 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
16a80 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 62  p, objv[i+1], &b
16a90 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
16aa0 52 52 4f 52 3b 0a 20 20 20 20 20 20 69 66 28 20  RROR;.      if( 
16ab0 62 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61  b ){.        fla
16ac0 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45  gs |= SQLITE_OPE
16ad0 4e 5f 55 52 49 3b 0a 20 20 20 20 20 20 7d 65 6c  N_URI;.      }el
16ae0 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67  se{.        flag
16af0 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45  s &= ~SQLITE_OPE
16b00 4e 5f 55 52 49 3b 0a 20 20 20 20 20 20 7d 0a 20  N_URI;.      }. 
16b10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16b20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
16b30 28 69 6e 74 65 72 70 2c 20 22 75 6e 6b 6e 6f 77  (interp, "unknow
16b40 6e 20 6f 70 74 69 6f 6e 3a 20 22 2c 20 7a 41 72  n option: ", zAr
16b50 67 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  g, (char*)0);.  
16b60 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
16b70 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  RROR;.    }.  }.
16b80 20 20 69 66 28 20 6f 62 6a 63 3c 33 20 7c 7c 20    if( objc<3 || 
16b90 28 6f 62 6a 63 26 31 29 21 3d 31 20 29 7b 0a 20  (objc&1)!=1 ){. 
16ba0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
16bb0 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
16bc0 62 6a 76 2c 20 0a 20 20 20 20 20 20 22 48 41 4e  bjv, .      "HAN
16bd0 44 4c 45 20 46 49 4c 45 4e 41 4d 45 20 3f 2d 76  DLE FILENAME ?-v
16be0 66 73 20 56 46 53 4e 41 4d 45 3f 20 3f 2d 72 65  fs VFSNAME? ?-re
16bf0 61 64 6f 6e 6c 79 20 42 4f 4f 4c 45 41 4e 3f 20  adonly BOOLEAN? 
16c00 3f 2d 63 72 65 61 74 65 20 42 4f 4f 4c 45 41 4e  ?-create BOOLEAN
16c10 3f 22 0a 20 20 20 20 20 20 22 20 3f 2d 6e 6f 6d  ?".      " ?-nom
16c20 75 74 65 78 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d  utex BOOLEAN? ?-
16c30 66 75 6c 6c 6d 75 74 65 78 20 42 4f 4f 4c 45 41  fullmutex BOOLEA
16c40 4e 3f 20 3f 2d 75 72 69 20 42 4f 4f 4c 45 41 4e  N? ?-uri BOOLEAN
16c50 3f 22 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ?".#ifdef SQLITE
16c60 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 20  _HAS_CODEC.     
16c70 20 22 20 3f 2d 6b 65 79 20 43 4f 44 45 43 4b 45   " ?-key CODECKE
16c80 59 3f 22 0a 23 65 6e 64 69 66 0a 20 20 20 20 29  Y?".#endif.    )
16c90 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
16ca0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 45  _ERROR;.  }.  zE
16cb0 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70 20 3d  rrMsg = 0;.  p =
16cc0 20 28 53 71 6c 69 74 65 44 62 2a 29 54 63 6c 5f   (SqliteDb*)Tcl_
16cd0 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  Alloc( sizeof(*p
16ce0 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ) );.  if( p==0 
16cf0 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65  ){.    Tcl_SetRe
16d00 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6d 61  sult(interp, "ma
16d10 6c 6c 6f 63 20 66 61 69 6c 65 64 22 2c 20 54 43  lloc failed", TC
16d20 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72  L_STATIC);.    r
16d30 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
16d40 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 2c  .  }.  memset(p,
16d50 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b   0, sizeof(*p));
16d60 0a 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47  .  zFile = Tcl_G
16d70 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
16d80 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 7a  objv[2], 0);.  z
16d90 46 69 6c 65 20 3d 20 54 63 6c 5f 54 72 61 6e 73  File = Tcl_Trans
16da0 6c 61 74 65 46 69 6c 65 4e 61 6d 65 28 69 6e 74  lateFileName(int
16db0 65 72 70 2c 20 7a 46 69 6c 65 2c 20 26 74 72 61  erp, zFile, &tra
16dc0 6e 73 6c 61 74 65 64 46 69 6c 65 6e 61 6d 65 29  nslatedFilename)
16dd0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
16de0 5f 6f 70 65 6e 5f 76 32 28 7a 46 69 6c 65 2c 20  _open_v2(zFile, 
16df0 26 70 2d 3e 64 62 2c 20 66 6c 61 67 73 2c 20 7a  &p->db, flags, z
16e00 56 66 73 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72  Vfs);.  Tcl_DStr
16e10 69 6e 67 46 72 65 65 28 26 74 72 61 6e 73 6c 61  ingFree(&transla
16e20 74 65 64 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  tedFilename);.  
16e30 69 66 28 20 70 2d 3e 64 62 20 29 7b 0a 20 20 20  if( p->db ){.   
16e40 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
16e50 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
16e60 70 2d 3e 64 62 29 20 29 7b 0a 20 20 20 20 20 20  p->db) ){.      
16e70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
16e80 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20  3_mprintf("%s", 
16e90 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
16ea0 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 73 71  ->db));.      sq
16eb0 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64  lite3_close(p->d
16ec0 62 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64 62 20  b);.      p->db 
16ed0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 0;.    }.  }el
16ee0 73 65 7b 0a 20 20 20 20 7a 45 72 72 4d 73 67 20  se{.    zErrMsg 
16ef0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
16f00 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f  f("%s", sqlite3_
16f10 65 72 72 73 74 72 28 72 63 29 29 3b 0a 20 20 7d  errstr(rc));.  }
16f20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
16f30 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 70  AS_CODEC.  if( p
16f40 2d 3e 64 62 20 29 7b 0a 20 20 20 20 73 71 6c 69  ->db ){.    sqli
16f50 74 65 33 5f 6b 65 79 28 70 2d 3e 64 62 2c 20 70  te3_key(p->db, p
16f60 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 7d 0a  Key, nKey);.  }.
16f70 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e  #endif.  if( p->
16f80 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c  db==0 ){.    Tcl
16f90 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
16fa0 70 2c 20 7a 45 72 72 4d 73 67 2c 20 54 43 4c 5f  p, zErrMsg, TCL_
16fb0 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 54  VOLATILE);.    T
16fc0 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70  cl_Free((char*)p
16fd0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
16fe0 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ree(zErrMsg);.  
16ff0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
17000 4f 52 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 78  OR;.  }.  p->max
17010 53 74 6d 74 20 3d 20 4e 55 4d 5f 50 52 45 50 41  Stmt = NUM_PREPA
17020 52 45 44 5f 53 54 4d 54 53 3b 0a 20 20 70 2d 3e  RED_STMTS;.  p->
17030 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b  interp = interp;
17040 0a 20 20 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65  .  zArg = Tcl_Ge
17050 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
17060 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 69 66  bjv[1], 0);.  if
17070 28 20 44 62 55 73 65 4e 72 65 28 29 20 29 7b 0a  ( DbUseNre() ){.
17080 20 20 20 20 54 63 6c 5f 4e 52 43 72 65 61 74 65      Tcl_NRCreate
17090 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
170a0 7a 41 72 67 2c 20 44 62 4f 62 6a 43 6d 64 41 64  zArg, DbObjCmdAd
170b0 61 70 74 6f 72 2c 20 44 62 4f 62 6a 43 6d 64 2c  aptor, DbObjCmd,
170c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
170d0 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
170e0 70 2c 20 44 62 44 65 6c 65 74 65 43 6d 64 29 3b  p, DbDeleteCmd);
170f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63  .  }else{.    Tc
17100 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
17110 6e 64 28 69 6e 74 65 72 70 2c 20 7a 41 72 67 2c  nd(interp, zArg,
17120 20 44 62 4f 62 6a 43 6d 64 2c 20 28 63 68 61 72   DbObjCmd, (char
17130 2a 29 70 2c 20 44 62 44 65 6c 65 74 65 43 6d 64  *)p, DbDeleteCmd
17140 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
17150 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
17160 20 50 72 6f 76 69 64 65 20 61 20 64 75 6d 6d 79   Provide a dummy
17170 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 20 69   Tcl_InitStubs i
17180 66 20 77 65 20 61 72 65 20 75 73 69 6e 67 20 74  f we are using t
17190 68 69 73 20 61 73 20 61 20 73 74 61 74 69 63 0a  his as a static.
171a0 2a 2a 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23  ** library..*/.#
171b0 69 66 6e 64 65 66 20 55 53 45 5f 54 43 4c 5f 53  ifndef USE_TCL_S
171c0 54 55 42 53 0a 23 20 75 6e 64 65 66 20 20 54 63  TUBS.# undef  Tc
171d0 6c 5f 49 6e 69 74 53 74 75 62 73 0a 23 20 64 65  l_InitStubs.# de
171e0 66 69 6e 65 20 54 63 6c 5f 49 6e 69 74 53 74 75  fine Tcl_InitStu
171f0 62 73 28 61 2c 62 2c 63 29 20 54 43 4c 5f 56 45  bs(a,b,c) TCL_VE
17200 52 53 49 4f 4e 0a 23 65 6e 64 69 66 0a 0a 2f 2a  RSION.#endif../*
17210 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65  .** Make sure we
17220 20 68 61 76 65 20 61 20 50 41 43 4b 41 47 45 5f   have a PACKAGE_
17230 56 45 52 53 49 4f 4e 20 6d 61 63 72 6f 20 64 65  VERSION macro de
17240 66 69 6e 65 64 2e 20 20 54 68 69 73 20 77 69 6c  fined.  This wil
17250 6c 20 62 65 0a 2a 2a 20 64 65 66 69 6e 65 64 20  l be.** defined 
17260 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 62 79  automatically by
17270 20 74 68 65 20 54 45 41 20 6d 61 6b 65 66 69 6c   the TEA makefil
17280 65 2e 20 20 42 75 74 20 6f 74 68 65 72 20 6d 61  e.  But other ma
17290 6b 65 66 69 6c 65 73 0a 2a 2a 20 64 6f 20 6e 6f  kefiles.** do no
172a0 74 20 64 65 66 69 6e 65 20 69 74 2e 0a 2a 2f 0a  t define it..*/.
172b0 23 69 66 6e 64 65 66 20 50 41 43 4b 41 47 45 5f  #ifndef PACKAGE_
172c0 56 45 52 53 49 4f 4e 0a 23 20 64 65 66 69 6e 65  VERSION.# define
172d0 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e   PACKAGE_VERSION
172e0 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 0a   SQLITE_VERSION.
172f0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
17300 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f  itialize this mo
17310 64 75 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  dule..**.** This
17320 20 54 63 6c 20 6d 6f 64 75 6c 65 20 63 6f 6e 74   Tcl module cont
17330 61 69 6e 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67  ains only a sing
17340 6c 65 20 6e 65 77 20 54 63 6c 20 63 6f 6d 6d 61  le new Tcl comma
17350 6e 64 20 6e 61 6d 65 64 20 22 73 71 6c 69 74 65  nd named "sqlite
17360 22 2e 0a 2a 2a 20 28 48 65 6e 63 65 20 74 68 65  "..** (Hence the
17370 72 65 20 69 73 20 6e 6f 20 6e 61 6d 65 73 70 61  re is no namespa
17380 63 65 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f  ce.  There is no
17390 20 70 6f 69 6e 74 20 69 6e 20 75 73 69 6e 67 20   point in using 
173a0 61 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69  a namespace.** i
173b0 66 20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e 20  f the extension 
173c0 6f 6e 6c 79 20 73 75 70 70 6c 69 65 73 20 6f 6e  only supplies on
173d0 65 20 6e 65 77 20 6e 61 6d 65 21 29 20 20 54 68  e new name!)  Th
173e0 65 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d 61  e "sqlite" comma
173f0 6e 64 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f  nd is.** used to
17400 20 6f 70 65 6e 20 61 20 6e 65 77 20 53 51 4c 69   open a new SQLi
17410 74 65 20 64 61 74 61 62 61 73 65 2e 20 20 53 65  te database.  Se
17420 65 20 74 68 65 20 44 62 4d 61 69 6e 28 29 20 72  e the DbMain() r
17430 6f 75 74 69 6e 65 20 61 62 6f 76 65 0a 2a 2a 20  outine above.** 
17440 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
17450 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a  nformation..**.*
17460 2a 20 54 68 65 20 45 58 54 45 52 4e 20 6d 61 63  * The EXTERN mac
17470 72 6f 73 20 61 72 65 20 72 65 71 75 69 72 65 64  ros are required
17480 20 62 79 20 54 43 4c 20 69 6e 20 6f 72 64 65 72   by TCL in order
17490 20 74 6f 20 77 6f 72 6b 20 6f 6e 20 77 69 6e 64   to work on wind
174a0 6f 77 73 2e 0a 2a 2f 0a 45 58 54 45 52 4e 20 69  ows..*/.EXTERN i
174b0 6e 74 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28  nt Sqlite3_Init(
174c0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
174d0 72 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  rp){.  int rc = 
174e0 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 69 6e  Tcl_InitStubs(in
174f0 74 65 72 70 2c 20 22 38 2e 34 22 2c 20 30 29 3d  terp, "8.4", 0)=
17500 3d 30 20 3f 20 54 43 4c 5f 45 52 52 4f 52 20 3a  =0 ? TCL_ERROR :
17510 20 54 43 4c 5f 4f 4b 3b 0a 20 20 69 66 28 20 72   TCL_OK;.  if( r
17520 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20  c==TCL_OK ){.   
17530 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
17540 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 73  mmand(interp, "s
17550 71 6c 69 74 65 33 22 2c 20 28 54 63 6c 5f 4f 62  qlite3", (Tcl_Ob
17560 6a 43 6d 64 50 72 6f 63 2a 29 44 62 4d 61 69 6e  jCmdProc*)DbMain
17570 2c 20 30 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66  , 0, 0);.#ifndef
17580 20 53 51 4c 49 54 45 5f 33 5f 53 55 46 46 49 58   SQLITE_3_SUFFIX
17590 5f 4f 4e 4c 59 0a 20 20 20 20 2f 2a 20 54 68 65  _ONLY.    /* The
175a0 20 22 73 71 6c 69 74 65 22 20 61 6c 69 61 73 20   "sqlite" alias 
175b0 69 73 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64 2e  is undocumented.
175c0 20 20 49 74 20 69 73 20 68 65 72 65 20 6f 6e 6c    It is here onl
175d0 79 20 74 6f 20 73 75 70 70 6f 72 74 0a 20 20 20  y to support.   
175e0 20 2a 2a 20 6c 65 67 61 63 79 20 73 63 72 69 70   ** legacy scrip
175f0 74 73 2e 20 20 41 6c 6c 20 6e 65 77 20 73 63 72  ts.  All new scr
17600 69 70 74 73 20 73 68 6f 75 6c 64 20 75 73 65 20  ipts should use 
17610 6f 6e 6c 79 20 74 68 65 20 22 73 71 6c 69 74 65  only the "sqlite
17620 33 22 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e  3".    ** comman
17630 64 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 43 72  d. */.    Tcl_Cr
17640 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
17650 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 22 2c  nterp, "sqlite",
17660 20 28 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63   (Tcl_ObjCmdProc
17670 2a 29 44 62 4d 61 69 6e 2c 20 30 2c 20 30 29 3b  *)DbMain, 0, 0);
17680 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d  .#endif.    rc =
17690 20 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28   Tcl_PkgProvide(
176a0 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33  interp, "sqlite3
176b0 22 2c 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49  ", PACKAGE_VERSI
176c0 4f 4e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ON);.  }.  retur
176d0 6e 20 72 63 3b 0a 7d 0a 45 58 54 45 52 4e 20 69  n rc;.}.EXTERN i
176e0 6e 74 20 54 63 6c 73 71 6c 69 74 65 33 5f 49 6e  nt Tclsqlite3_In
176f0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  it(Tcl_Interp *i
17700 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20 53  nterp){ return S
17710 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74 65  qlite3_Init(inte
17720 72 70 29 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e  rp); }.EXTERN in
17730 74 20 53 71 6c 69 74 65 33 5f 55 6e 6c 6f 61 64  t Sqlite3_Unload
17740 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
17750 65 72 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  erp, int flags){
17760 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20   return TCL_OK; 
17770 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 54 63 6c  }.EXTERN int Tcl
17780 73 71 6c 69 74 65 33 5f 55 6e 6c 6f 61 64 28 54  sqlite3_Unload(T
17790 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
177a0 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 20 72  p, int flags){ r
177b0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a  eturn TCL_OK; }.
177c0 0a 2f 2a 20 42 65 63 61 75 73 65 20 69 74 20 61  ./* Because it a
177d0 63 63 65 73 73 65 73 20 74 68 65 20 66 69 6c 65  ccesses the file
177e0 2d 73 79 73 74 65 6d 20 61 6e 64 20 75 73 65 73  -system and uses
177f0 20 70 65 72 73 69 73 74 65 6e 74 20 73 74 61 74   persistent stat
17800 65 2c 20 53 51 4c 69 74 65 0a 2a 2a 20 69 73 20  e, SQLite.** is 
17810 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 20 61  not considered a
17820 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 73  ppropriate for s
17830 61 66 65 20 69 6e 74 65 72 70 72 65 74 65 72 73  afe interpreters
17840 2e 20 20 48 65 6e 63 65 2c 20 77 65 20 64 65 6c  .  Hence, we del
17850 69 62 65 72 61 74 65 6c 79 0a 2a 2a 20 6f 6d 69  iberately.** omi
17860 74 20 74 68 65 20 5f 53 61 66 65 49 6e 69 74 28  t the _SafeInit(
17870 29 20 69 6e 74 65 72 66 61 63 65 73 2e 0a 2a 2f  ) interfaces..*/
17880 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
17890 5f 33 5f 53 55 46 46 49 58 5f 4f 4e 4c 59 0a 69  _3_SUFFIX_ONLY.i
178a0 6e 74 20 53 71 6c 69 74 65 5f 49 6e 69 74 28 54  nt Sqlite_Init(T
178b0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
178c0 70 29 7b 20 72 65 74 75 72 6e 20 53 71 6c 69 74  p){ return Sqlit
178d0 65 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  e3_Init(interp);
178e0 20 7d 0a 69 6e 74 20 54 63 6c 73 71 6c 69 74 65   }.int Tclsqlite
178f0 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
17900 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72   *interp){ retur
17910 6e 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69  n Sqlite3_Init(i
17920 6e 74 65 72 70 29 3b 20 7d 0a 69 6e 74 20 53 71  nterp); }.int Sq
17930 6c 69 74 65 5f 55 6e 6c 6f 61 64 28 54 63 6c 5f  lite_Unload(Tcl_
17940 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
17950 69 6e 74 20 66 6c 61 67 73 29 7b 20 72 65 74 75  int flags){ retu
17960 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 69 6e 74  rn TCL_OK; }.int
17970 20 54 63 6c 73 71 6c 69 74 65 5f 55 6e 6c 6f 61   Tclsqlite_Unloa
17980 64 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  d(Tcl_Interp *in
17990 74 65 72 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  terp, int flags)
179a0 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b  { return TCL_OK;
179b0 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65   }.#endif..#ifde
179c0 66 20 54 43 4c 53 48 0a 2f 2a 2a 2a 2a 2a 2a 2a  f TCLSH./*******
179d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
179e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
179f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17a10 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66  ******.** All of
17a20 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 66   the code that f
17a30 6f 6c 6c 6f 77 73 20 69 73 20 75 73 65 64 20 74  ollows is used t
17a40 6f 20 62 75 69 6c 64 20 73 74 61 6e 64 61 6c 6f  o build standalo
17a50 6e 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  ne TCL interpret
17a60 65 72 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20  ers.** that are 
17a70 73 74 61 74 69 63 61 6c 6c 79 20 6c 69 6e 6b 65  statically linke
17a80 64 20 77 69 74 68 20 53 51 4c 69 74 65 2e 20 20  d with SQLite.  
17a90 45 6e 61 62 6c 65 20 74 68 65 73 65 20 62 79 20  Enable these by 
17aa0 63 6f 6d 70 69 6c 69 6e 67 0a 2a 2a 20 77 69 74  compiling.** wit
17ab0 68 20 2d 44 54 43 4c 53 48 3d 6e 20 77 68 65 72  h -DTCLSH=n wher
17ac0 65 20 6e 20 63 61 6e 20 62 65 20 31 20 6f 72 20  e n can be 1 or 
17ad0 32 2e 20 20 41 6e 20 6e 20 6f 66 20 31 20 67 65  2.  An n of 1 ge
17ae0 6e 65 72 61 74 65 73 20 61 20 73 74 61 6e 64 61  nerates a standa
17af0 72 64 0a 2a 2a 20 74 63 6c 73 68 20 62 75 74 20  rd.** tclsh but 
17b00 77 69 74 68 20 53 51 4c 69 74 65 20 62 75 69 6c  with SQLite buil
17b10 74 20 69 6e 2e 20 20 41 6e 20 6e 20 6f 66 20 32  t in.  An n of 2
17b20 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 53   generates the S
17b30 51 4c 69 74 65 20 73 70 61 63 65 0a 2a 2a 20 61  QLite space.** a
17b40 6e 61 6c 79 73 69 73 20 70 72 6f 67 72 61 6d 2e  nalysis program.
17b50 0a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  .*/..#if defined
17b60 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c  (SQLITE_TEST) ||
17b70 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
17b80 54 43 4c 4d 44 35 29 0a 2f 2a 0a 20 2a 20 54 68  TCLMD5)./*. * Th
17b90 69 73 20 63 6f 64 65 20 69 6d 70 6c 65 6d 65 6e  is code implemen
17ba0 74 73 20 74 68 65 20 4d 44 35 20 6d 65 73 73 61  ts the MD5 messa
17bb0 67 65 2d 64 69 67 65 73 74 20 61 6c 67 6f 72 69  ge-digest algori
17bc0 74 68 6d 2e 0a 20 2a 20 54 68 65 20 61 6c 67 6f  thm.. * The algo
17bd0 72 69 74 68 6d 20 69 73 20 64 75 65 20 74 6f 20  rithm is due to 
17be0 52 6f 6e 20 52 69 76 65 73 74 2e 20 20 54 68 69  Ron Rivest.  Thi
17bf0 73 20 63 6f 64 65 20 77 61 73 0a 20 2a 20 77 72  s code was. * wr
17c00 69 74 74 65 6e 20 62 79 20 43 6f 6c 69 6e 20 50  itten by Colin P
17c10 6c 75 6d 62 20 69 6e 20 31 39 39 33 2c 20 6e 6f  lumb in 1993, no
17c20 20 63 6f 70 79 72 69 67 68 74 20 69 73 20 63 6c   copyright is cl
17c30 61 69 6d 65 64 2e 0a 20 2a 20 54 68 69 73 20 63  aimed.. * This c
17c40 6f 64 65 20 69 73 20 69 6e 20 74 68 65 20 70 75  ode is in the pu
17c50 62 6c 69 63 20 64 6f 6d 61 69 6e 3b 20 64 6f 20  blic domain; do 
17c60 77 69 74 68 20 69 74 20 77 68 61 74 20 79 6f 75  with it what you
17c70 20 77 69 73 68 2e 0a 20 2a 0a 20 2a 20 45 71 75   wish.. *. * Equ
17c80 69 76 61 6c 65 6e 74 20 63 6f 64 65 20 69 73 20  ivalent code is 
17c90 61 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20 52  available from R
17ca0 53 41 20 44 61 74 61 20 53 65 63 75 72 69 74 79  SA Data Security
17cb0 2c 20 49 6e 63 2e 0a 20 2a 20 54 68 69 73 20 63  , Inc.. * This c
17cc0 6f 64 65 20 68 61 73 20 62 65 65 6e 20 74 65 73  ode has been tes
17cd0 74 65 64 20 61 67 61 69 6e 73 74 20 74 68 61 74  ted against that
17ce0 2c 20 61 6e 64 20 69 73 20 65 71 75 69 76 61 6c  , and is equival
17cf0 65 6e 74 2c 0a 20 2a 20 65 78 63 65 70 74 20 74  ent,. * except t
17d00 68 61 74 20 79 6f 75 20 64 6f 6e 27 74 20 6e 65  hat you don't ne
17d10 65 64 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 77  ed to include tw
17d20 6f 20 70 61 67 65 73 20 6f 66 20 6c 65 67 61 6c  o pages of legal
17d30 65 73 65 0a 20 2a 20 77 69 74 68 20 65 76 65 72  ese. * with ever
17d40 79 20 63 6f 70 79 2e 0a 20 2a 0a 20 2a 20 54 6f  y copy.. *. * To
17d50 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6d 65 73   compute the mes
17d60 73 61 67 65 20 64 69 67 65 73 74 20 6f 66 20 61  sage digest of a
17d70 20 63 68 75 6e 6b 20 6f 66 20 62 79 74 65 73 2c   chunk of bytes,
17d80 20 64 65 63 6c 61 72 65 20 61 6e 0a 20 2a 20 4d   declare an. * M
17d90 44 35 43 6f 6e 74 65 78 74 20 73 74 72 75 63 74  D5Context struct
17da0 75 72 65 2c 20 70 61 73 73 20 69 74 20 74 6f 20  ure, pass it to 
17db0 4d 44 35 49 6e 69 74 2c 20 63 61 6c 6c 20 4d 44  MD5Init, call MD
17dc0 35 55 70 64 61 74 65 20 61 73 0a 20 2a 20 6e 65  5Update as. * ne
17dd0 65 64 65 64 20 6f 6e 20 62 75 66 66 65 72 73 20  eded on buffers 
17de0 66 75 6c 6c 20 6f 66 20 62 79 74 65 73 2c 20 61  full of bytes, a
17df0 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 4d 44 35  nd then call MD5
17e00 46 69 6e 61 6c 2c 20 77 68 69 63 68 0a 20 2a 20  Final, which. * 
17e10 77 69 6c 6c 20 66 69 6c 6c 20 61 20 73 75 70 70  will fill a supp
17e20 6c 69 65 64 20 31 36 2d 62 79 74 65 20 61 72 72  lied 16-byte arr
17e30 61 79 20 77 69 74 68 20 74 68 65 20 64 69 67 65  ay with the dige
17e40 73 74 2e 0a 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 49  st.. */../*. * I
17e50 66 20 63 6f 6d 70 69 6c 65 64 20 6f 6e 20 61 20  f compiled on a 
17e60 6d 61 63 68 69 6e 65 20 74 68 61 74 20 64 6f 65  machine that doe
17e70 73 6e 27 74 20 68 61 76 65 20 61 20 33 32 2d 62  sn't have a 32-b
17e80 69 74 20 69 6e 74 65 67 65 72 2c 0a 20 2a 20 79  it integer,. * y
17e90 6f 75 20 6a 75 73 74 20 73 65 74 20 22 75 69 6e  ou just set "uin
17ea0 74 33 32 22 20 74 6f 20 74 68 65 20 61 70 70 72  t32" to the appr
17eb0 6f 70 72 69 61 74 65 20 64 61 74 61 74 79 70 65  opriate datatype
17ec0 20 66 6f 72 20 61 6e 0a 20 2a 20 75 6e 73 69 67   for an. * unsig
17ed0 6e 65 64 20 33 32 2d 62 69 74 20 69 6e 74 65 67  ned 32-bit integ
17ee0 65 72 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  er.  For example
17ef0 3a 0a 20 2a 0a 20 2a 20 20 20 20 20 20 20 63 63  :. *. *       cc
17f00 20 2d 44 75 69 6e 74 33 32 3d 27 75 6e 73 69 67   -Duint32='unsig
17f10 6e 65 64 20 6c 6f 6e 67 27 20 6d 64 35 2e 63 0a  ned long' md5.c.
17f20 20 2a 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 75   *. */.#ifndef u
17f30 69 6e 74 33 32 0a 23 20 20 64 65 66 69 6e 65 20  int32.#  define 
17f40 75 69 6e 74 33 32 20 75 6e 73 69 67 6e 65 64 20  uint32 unsigned 
17f50 69 6e 74 0a 23 65 6e 64 69 66 0a 0a 73 74 72 75  int.#endif..stru
17f60 63 74 20 4d 44 35 43 6f 6e 74 65 78 74 20 7b 0a  ct MD5Context {.
17f70 20 20 69 6e 74 20 69 73 49 6e 69 74 3b 0a 20 20    int isInit;.  
17f80 75 69 6e 74 33 32 20 62 75 66 5b 34 5d 3b 0a 20  uint32 buf[4];. 
17f90 20 75 69 6e 74 33 32 20 62 69 74 73 5b 32 5d 3b   uint32 bits[2];
17fa0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
17fb0 20 69 6e 5b 36 34 5d 3b 0a 7d 3b 0a 74 79 70 65   in[64];.};.type
17fc0 64 65 66 20 73 74 72 75 63 74 20 4d 44 35 43 6f  def struct MD5Co
17fd0 6e 74 65 78 74 20 4d 44 35 43 6f 6e 74 65 78 74  ntext MD5Context
17fe0 3b 0a 0a 2f 2a 0a 20 2a 20 4e 6f 74 65 3a 20 74  ;../*. * Note: t
17ff0 68 69 73 20 63 6f 64 65 20 69 73 20 68 61 72 6d  his code is harm
18000 6c 65 73 73 20 6f 6e 20 6c 69 74 74 6c 65 2d 65  less on little-e
18010 6e 64 69 61 6e 20 6d 61 63 68 69 6e 65 73 2e 0a  ndian machines..
18020 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
18030 62 79 74 65 52 65 76 65 72 73 65 20 28 75 6e 73  byteReverse (uns
18040 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c  igned char *buf,
18050 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 73 29   unsigned longs)
18060 7b 0a 20 20 20 20 20 20 20 20 75 69 6e 74 33 32  {.        uint32
18070 20 74 3b 0a 20 20 20 20 20 20 20 20 64 6f 20 7b   t;.        do {
18080 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18090 20 74 20 3d 20 28 75 69 6e 74 33 32 29 28 28 75   t = (uint32)((u
180a0 6e 73 69 67 6e 65 64 29 62 75 66 5b 33 5d 3c 3c  nsigned)buf[3]<<
180b0 38 20 7c 20 62 75 66 5b 32 5d 29 20 3c 3c 20 31  8 | buf[2]) << 1
180c0 36 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  6 |.            
180d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180e0 28 28 75 6e 73 69 67 6e 65 64 29 62 75 66 5b 31  ((unsigned)buf[1
180f0 5d 3c 3c 38 20 7c 20 62 75 66 5b 30 5d 29 3b 0a  ]<<8 | buf[0]);.
18100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18110 2a 28 75 69 6e 74 33 32 20 2a 29 62 75 66 20 3d  *(uint32 *)buf =
18120 20 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   t;.            
18130 20 20 20 20 62 75 66 20 2b 3d 20 34 3b 0a 20 20      buf += 4;.  
18140 20 20 20 20 20 20 7d 20 77 68 69 6c 65 20 28 2d        } while (-
18150 2d 6c 6f 6e 67 73 29 3b 0a 7d 0a 2f 2a 20 54 68  -longs);.}./* Th
18160 65 20 66 6f 75 72 20 63 6f 72 65 20 66 75 6e 63  e four core func
18170 74 69 6f 6e 73 20 2d 20 46 31 20 69 73 20 6f 70  tions - F1 is op
18180 74 69 6d 69 7a 65 64 20 73 6f 6d 65 77 68 61 74  timized somewhat
18190 20 2a 2f 0a 0a 2f 2a 20 23 64 65 66 69 6e 65 20   */../* #define 
181a0 46 31 28 78 2c 20 79 2c 20 7a 29 20 28 78 20 26  F1(x, y, z) (x &
181b0 20 79 20 7c 20 7e 78 20 26 20 7a 29 20 2a 2f 0a   y | ~x & z) */.
181c0 23 64 65 66 69 6e 65 20 46 31 28 78 2c 20 79 2c  #define F1(x, y,
181d0 20 7a 29 20 28 7a 20 5e 20 28 78 20 26 20 28 79   z) (z ^ (x & (y
181e0 20 5e 20 7a 29 29 29 0a 23 64 65 66 69 6e 65 20   ^ z))).#define 
181f0 46 32 28 78 2c 20 79 2c 20 7a 29 20 46 31 28 7a  F2(x, y, z) F1(z
18200 2c 20 78 2c 20 79 29 0a 23 64 65 66 69 6e 65 20  , x, y).#define 
18210 46 33 28 78 2c 20 79 2c 20 7a 29 20 28 78 20 5e  F3(x, y, z) (x ^
18220 20 79 20 5e 20 7a 29 0a 23 64 65 66 69 6e 65 20   y ^ z).#define 
18230 46 34 28 78 2c 20 79 2c 20 7a 29 20 28 79 20 5e  F4(x, y, z) (y ^
18240 20 28 78 20 7c 20 7e 7a 29 29 0a 0a 2f 2a 20 54   (x | ~z))../* T
18250 68 69 73 20 69 73 20 74 68 65 20 63 65 6e 74 72  his is the centr
18260 61 6c 20 73 74 65 70 20 69 6e 20 74 68 65 20 4d  al step in the M
18270 44 35 20 61 6c 67 6f 72 69 74 68 6d 2e 20 2a 2f  D5 algorithm. */
18280 0a 23 64 65 66 69 6e 65 20 4d 44 35 53 54 45 50  .#define MD5STEP
18290 28 66 2c 20 77 2c 20 78 2c 20 79 2c 20 7a 2c 20  (f, w, x, y, z, 
182a0 64 61 74 61 2c 20 73 29 20 5c 0a 20 20 20 20 20  data, s) \.     
182b0 20 20 20 28 20 77 20 2b 3d 20 66 28 78 2c 20 79     ( w += f(x, y
182c0 2c 20 7a 29 20 2b 20 64 61 74 61 2c 20 20 77 20  , z) + data,  w 
182d0 3d 20 77 3c 3c 73 20 7c 20 77 3e 3e 28 33 32 2d  = w<<s | w>>(32-
182e0 73 29 2c 20 20 77 20 2b 3d 20 78 20 29 0a 0a 2f  s),  w += x )../
182f0 2a 0a 20 2a 20 54 68 65 20 63 6f 72 65 20 6f 66  *. * The core of
18300 20 74 68 65 20 4d 44 35 20 61 6c 67 6f 72 69 74   the MD5 algorit
18310 68 6d 2c 20 74 68 69 73 20 61 6c 74 65 72 73 20  hm, this alters 
18320 61 6e 20 65 78 69 73 74 69 6e 67 20 4d 44 35 20  an existing MD5 
18330 68 61 73 68 20 74 6f 0a 20 2a 20 72 65 66 6c 65  hash to. * refle
18340 63 74 20 74 68 65 20 61 64 64 69 74 69 6f 6e 20  ct the addition 
18350 6f 66 20 31 36 20 6c 6f 6e 67 77 6f 72 64 73 20  of 16 longwords 
18360 6f 66 20 6e 65 77 20 64 61 74 61 2e 20 20 4d 44  of new data.  MD
18370 35 55 70 64 61 74 65 20 62 6c 6f 63 6b 73 0a 20  5Update blocks. 
18380 2a 20 74 68 65 20 64 61 74 61 20 61 6e 64 20 63  * the data and c
18390 6f 6e 76 65 72 74 73 20 62 79 74 65 73 20 69 6e  onverts bytes in
183a0 74 6f 20 6c 6f 6e 67 77 6f 72 64 73 20 66 6f 72  to longwords for
183b0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 20   this routine.. 
183c0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 4d  */.static void M
183d0 44 35 54 72 61 6e 73 66 6f 72 6d 28 75 69 6e 74  D5Transform(uint
183e0 33 32 20 62 75 66 5b 34 5d 2c 20 63 6f 6e 73 74  32 buf[4], const
183f0 20 75 69 6e 74 33 32 20 69 6e 5b 31 36 5d 29 7b   uint32 in[16]){
18400 0a 20 20 20 20 20 20 20 20 72 65 67 69 73 74 65  .        registe
18410 72 20 75 69 6e 74 33 32 20 61 2c 20 62 2c 20 63  r uint32 a, b, c
18420 2c 20 64 3b 0a 0a 20 20 20 20 20 20 20 20 61 20  , d;..        a 
18430 3d 20 62 75 66 5b 30 5d 3b 0a 20 20 20 20 20 20  = buf[0];.      
18440 20 20 62 20 3d 20 62 75 66 5b 31 5d 3b 0a 20 20    b = buf[1];.  
18450 20 20 20 20 20 20 63 20 3d 20 62 75 66 5b 32 5d        c = buf[2]
18460 3b 0a 20 20 20 20 20 20 20 20 64 20 3d 20 62 75  ;.        d = bu
18470 66 5b 33 5d 3b 0a 0a 20 20 20 20 20 20 20 20 4d  f[3];..        M
18480 44 35 53 54 45 50 28 46 31 2c 20 61 2c 20 62 2c  D5STEP(F1, a, b,
18490 20 63 2c 20 64 2c 20 69 6e 5b 20 30 5d 2b 30 78   c, d, in[ 0]+0x
184a0 64 37 36 61 61 34 37 38 2c 20 20 37 29 3b 0a 20  d76aa478,  7);. 
184b0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
184c0 31 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69  1, d, a, b, c, i
184d0 6e 5b 20 31 5d 2b 30 78 65 38 63 37 62 37 35 36  n[ 1]+0xe8c7b756
184e0 2c 20 31 32 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 12);.        M
184f0 44 35 53 54 45 50 28 46 31 2c 20 63 2c 20 64 2c  D5STEP(F1, c, d,
18500 20 61 2c 20 62 2c 20 69 6e 5b 20 32 5d 2b 30 78   a, b, in[ 2]+0x
18510 32 34 32 30 37 30 64 62 2c 20 31 37 29 3b 0a 20  242070db, 17);. 
18520 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
18530 31 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  1, b, c, d, a, i
18540 6e 5b 20 33 5d 2b 30 78 63 31 62 64 63 65 65 65  n[ 3]+0xc1bdceee
18550 2c 20 32 32 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 22);.        M
18560 44 35 53 54 45 50 28 46 31 2c 20 61 2c 20 62 2c  D5STEP(F1, a, b,
18570 20 63 2c 20 64 2c 20 69 6e 5b 20 34 5d 2b 30 78   c, d, in[ 4]+0x
18580 66 35 37 63 30 66 61 66 2c 20 20 37 29 3b 0a 20  f57c0faf,  7);. 
18590 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
185a0 31 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69  1, d, a, b, c, i
185b0 6e 5b 20 35 5d 2b 30 78 34 37 38 37 63 36 32 61  n[ 5]+0x4787c62a
185c0 2c 20 31 32 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 12);.        M
185d0 44 35 53 54 45 50 28 46 31 2c 20 63 2c 20 64 2c  D5STEP(F1, c, d,
185e0 20 61 2c 20 62 2c 20 69 6e 5b 20 36 5d 2b 30 78   a, b, in[ 6]+0x
185f0 61 38 33 30 34 36 31 33 2c 20 31 37 29 3b 0a 20  a8304613, 17);. 
18600 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
18610 31 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  1, b, c, d, a, i
18620 6e 5b 20 37 5d 2b 30 78 66 64 34 36 39 35 30 31  n[ 7]+0xfd469501
18630 2c 20 32 32 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 22);.        M
18640 44 35 53 54 45 50 28 46 31 2c 20 61 2c 20 62 2c  D5STEP(F1, a, b,
18650 20 63 2c 20 64 2c 20 69 6e 5b 20 38 5d 2b 30 78   c, d, in[ 8]+0x
18660 36 39 38 30 39 38 64 38 2c 20 20 37 29 3b 0a 20  698098d8,  7);. 
18670 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
18680 31 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69  1, d, a, b, c, i
18690 6e 5b 20 39 5d 2b 30 78 38 62 34 34 66 37 61 66  n[ 9]+0x8b44f7af
186a0 2c 20 31 32 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 12);.        M
186b0 44 35 53 54 45 50 28 46 31 2c 20 63 2c 20 64 2c  D5STEP(F1, c, d,
186c0 20 61 2c 20 62 2c 20 69 6e 5b 31 30 5d 2b 30 78   a, b, in[10]+0x
186d0 66 66 66 66 35 62 62 31 2c 20 31 37 29 3b 0a 20  ffff5bb1, 17);. 
186e0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
186f0 31 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  1, b, c, d, a, i
18700 6e 5b 31 31 5d 2b 30 78 38 39 35 63 64 37 62 65  n[11]+0x895cd7be
18710 2c 20 32 32 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 22);.        M
18720 44 35 53 54 45 50 28 46 31 2c 20 61 2c 20 62 2c  D5STEP(F1, a, b,
18730 20 63 2c 20 64 2c 20 69 6e 5b 31 32 5d 2b 30 78   c, d, in[12]+0x
18740 36 62 39 30 31 31 32 32 2c 20 20 37 29 3b 0a 20  6b901122,  7);. 
18750 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
18760 31 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69  1, d, a, b, c, i
18770 6e 5b 31 33 5d 2b 30 78 66 64 39 38 37 31 39 33  n[13]+0xfd987193
18780 2c 20 31 32 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 12);.        M
18790 44 35 53 54 45 50 28 46 31 2c 20 63 2c 20 64 2c  D5STEP(F1, c, d,
187a0 20 61 2c 20 62 2c 20 69 6e 5b 31 34 5d 2b 30 78   a, b, in[14]+0x
187b0 61 36 37 39 34 33 38 65 2c 20 31 37 29 3b 0a 20  a679438e, 17);. 
187c0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
187d0 31 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  1, b, c, d, a, i
187e0 6e 5b 31 35 5d 2b 30 78 34 39 62 34 30 38 32 31  n[15]+0x49b40821
187f0 2c 20 32 32 29 3b 0a 0a 20 20 20 20 20 20 20 20  , 22);..        
18800 4d 44 35 53 54 45 50 28 46 32 2c 20 61 2c 20 62  MD5STEP(F2, a, b
18810 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 31 5d 2b 30  , c, d, in[ 1]+0
18820 78 66 36 31 65 32 35 36 32 2c 20 20 35 29 3b 0a  xf61e2562,  5);.
18830 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
18840 46 32 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20  F2, d, a, b, c, 
18850 69 6e 5b 20 36 5d 2b 30 78 63 30 34 30 62 33 34  in[ 6]+0xc040b34
18860 30 2c 20 20 39 29 3b 0a 20 20 20 20 20 20 20 20  0,  9);.        
18870 4d 44 35 53 54 45 50 28 46 32 2c 20 63 2c 20 64  MD5STEP(F2, c, d
18880 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 31 5d 2b 30  , a, b, in[11]+0
18890 78 32 36 35 65 35 61 35 31 2c 20 31 34 29 3b 0a  x265e5a51, 14);.
188a0 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
188b0 46 32 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20  F2, b, c, d, a, 
188c0 69 6e 5b 20 30 5d 2b 30 78 65 39 62 36 63 37 61  in[ 0]+0xe9b6c7a
188d0 61 2c 20 32 30 29 3b 0a 20 20 20 20 20 20 20 20  a, 20);.        
188e0 4d 44 35 53 54 45 50 28 46 32 2c 20 61 2c 20 62  MD5STEP(F2, a, b
188f0 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 35 5d 2b 30  , c, d, in[ 5]+0
18900 78 64 36 32 66 31 30 35 64 2c 20 20 35 29 3b 0a  xd62f105d,  5);.
18910 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
18920 46 32 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20  F2, d, a, b, c, 
18930 69 6e 5b 31 30 5d 2b 30 78 30 32 34 34 31 34 35  in[10]+0x0244145
18940 33 2c 20 20 39 29 3b 0a 20 20 20 20 20 20 20 20  3,  9);.        
18950 4d 44 35 53 54 45 50 28 46 32 2c 20 63 2c 20 64  MD5STEP(F2, c, d
18960 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 35 5d 2b 30  , a, b, in[15]+0
18970 78 64 38 61 31 65 36 38 31 2c 20 31 34 29 3b 0a  xd8a1e681, 14);.
18980 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
18990 46 32 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20  F2, b, c, d, a, 
189a0 69 6e 5b 20 34 5d 2b 30 78 65 37 64 33 66 62 63  in[ 4]+0xe7d3fbc
189b0 38 2c 20 32 30 29 3b 0a 20 20 20 20 20 20 20 20  8, 20);.        
189c0 4d 44 35 53 54 45 50 28 46 32 2c 20 61 2c 20 62  MD5STEP(F2, a, b
189d0 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 39 5d 2b 30  , c, d, in[ 9]+0
189e0 78 32 31 65 31 63 64 65 36 2c 20 20 35 29 3b 0a  x21e1cde6,  5);.
189f0 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
18a00 46 32 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20  F2, d, a, b, c, 
18a10 69 6e 5b 31 34 5d 2b 30 78 63 33 33 37 30 37 64  in[14]+0xc33707d
18a20 36 2c 20 20 39 29 3b 0a 20 20 20 20 20 20 20 20  6,  9);.        
18a30 4d 44 35 53 54 45 50 28 46 32 2c 20 63 2c 20 64  MD5STEP(F2, c, d
18a40 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 33 5d 2b 30  , a, b, in[ 3]+0
18a50 78 66 34 64 35 30 64 38 37 2c 20 31 34 29 3b 0a  xf4d50d87, 14);.
18a60 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
18a70 46 32 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20  F2, b, c, d, a, 
18a80 69 6e 5b 20 38 5d 2b 30 78 34 35 35 61 31 34 65  in[ 8]+0x455a14e
18a90 64 2c 20 32 30 29 3b 0a 20 20 20 20 20 20 20 20  d, 20);.        
18aa0 4d 44 35 53 54 45 50 28 46 32 2c 20 61 2c 20 62  MD5STEP(F2, a, b
18ab0 2c 20 63 2c 20 64 2c 20 69 6e 5b 31 33 5d 2b 30  , c, d, in[13]+0
18ac0 78 61 39 65 33 65 39 30 35 2c 20 20 35 29 3b 0a  xa9e3e905,  5);.
18ad0 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
18ae0 46 32 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20  F2, d, a, b, c, 
18af0 69 6e 5b 20 32 5d 2b 30 78 66 63 65 66 61 33 66  in[ 2]+0xfcefa3f
18b00 38 2c 20 20 39 29 3b 0a 20 20 20 20 20 20 20 20  8,  9);.        
18b10 4d 44 35 53 54 45 50 28 46 32 2c 20 63 2c 20 64  MD5STEP(F2, c, d
18b20 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 37 5d 2b 30  , a, b, in[ 7]+0
18b30 78 36 37 36 66 30 32 64 39 2c 20 31 34 29 3b 0a  x676f02d9, 14);.
18b40 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
18b50 46 32 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20  F2, b, c, d, a, 
18b60 69 6e 5b 31 32 5d 2b 30 78 38 64 32 61 34 63 38  in[12]+0x8d2a4c8
18b70 61 2c 20 32 30 29 3b 0a 0a 20 20 20 20 20 20 20  a, 20);..       
18b80 20 4d 44 35 53 54 45 50 28 46 33 2c 20 61 2c 20   MD5STEP(F3, a, 
18b90 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 35 5d 2b  b, c, d, in[ 5]+
18ba0 30 78 66 66 66 61 33 39 34 32 2c 20 20 34 29 3b  0xfffa3942,  4);
18bb0 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
18bc0 28 46 33 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c  (F3, d, a, b, c,
18bd0 20 69 6e 5b 20 38 5d 2b 30 78 38 37 37 31 66 36   in[ 8]+0x8771f6
18be0 38 31 2c 20 31 31 29 3b 0a 20 20 20 20 20 20 20  81, 11);.       
18bf0 20 4d 44 35 53 54 45 50 28 46 33 2c 20 63 2c 20   MD5STEP(F3, c, 
18c00 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 31 5d 2b  d, a, b, in[11]+
18c10 30 78 36 64 39 64 36 31 32 32 2c 20 31 36 29 3b  0x6d9d6122, 16);
18c20 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
18c30 28 46 33 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c  (F3, b, c, d, a,
18c40 20 69 6e 5b 31 34 5d 2b 30 78 66 64 65 35 33 38   in[14]+0xfde538
18c50 30 63 2c 20 32 33 29 3b 0a 20 20 20 20 20 20 20  0c, 23);.       
18c60 20 4d 44 35 53 54 45 50 28 46 33 2c 20 61 2c 20   MD5STEP(F3, a, 
18c70 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 31 5d 2b  b, c, d, in[ 1]+
18c80 30 78 61 34 62 65 65 61 34 34 2c 20 20 34 29 3b  0xa4beea44,  4);
18c90 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
18ca0 28 46 33 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c  (F3, d, a, b, c,
18cb0 20 69 6e 5b 20 34 5d 2b 30 78 34 62 64 65 63 66   in[ 4]+0x4bdecf
18cc0 61 39 2c 20 31 31 29 3b 0a 20 20 20 20 20 20 20  a9, 11);.       
18cd0 20 4d 44 35 53 54 45 50 28 46 33 2c 20 63 2c 20   MD5STEP(F3, c, 
18ce0 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 37 5d 2b  d, a, b, in[ 7]+
18cf0 30 78 66 36 62 62 34 62 36 30 2c 20 31 36 29 3b  0xf6bb4b60, 16);
18d00 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
18d10 28 46 33 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c  (F3, b, c, d, a,
18d20 20 69 6e 5b 31 30 5d 2b 30 78 62 65 62 66 62 63   in[10]+0xbebfbc
18d30 37 30 2c 20 32 33 29 3b 0a 20 20 20 20 20 20 20  70, 23);.       
18d40 20 4d 44 35 53 54 45 50 28 46 33 2c 20 61 2c 20   MD5STEP(F3, a, 
18d50 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 31 33 5d 2b  b, c, d, in[13]+
18d60 30 78 32 38 39 62 37 65 63 36 2c 20 20 34 29 3b  0x289b7ec6,  4);
18d70 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
18d80 28 46 33 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c  (F3, d, a, b, c,
18d90 20 69 6e 5b 20 30 5d 2b 30 78 65 61 61 31 32 37   in[ 0]+0xeaa127
18da0 66 61 2c 20 31 31 29 3b 0a 20 20 20 20 20 20 20  fa, 11);.       
18db0 20 4d 44 35 53 54 45 50 28 46 33 2c 20 63 2c 20   MD5STEP(F3, c, 
18dc0 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 33 5d 2b  d, a, b, in[ 3]+
18dd0 30 78 64 34 65 66 33 30 38 35 2c 20 31 36 29 3b  0xd4ef3085, 16);
18de0 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
18df0 28 46 33 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c  (F3, b, c, d, a,
18e00 20 69 6e 5b 20 36 5d 2b 30 78 30 34 38 38 31 64   in[ 6]+0x04881d
18e10 30 35 2c 20 32 33 29 3b 0a 20 20 20 20 20 20 20  05, 23);.       
18e20 20 4d 44 35 53 54 45 50 28 46 33 2c 20 61 2c 20   MD5STEP(F3, a, 
18e30 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 39 5d 2b  b, c, d, in[ 9]+
18e40 30 78 64 39 64 34 64 30 33 39 2c 20 20 34 29 3b  0xd9d4d039,  4);
18e50 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
18e60 28 46 33 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c  (F3, d, a, b, c,
18e70 20 69 6e 5b 31 32 5d 2b 30 78 65 36 64 62 39 39   in[12]+0xe6db99
18e80 65 35 2c 20 31 31 29 3b 0a 20 20 20 20 20 20 20  e5, 11);.       
18e90 20 4d 44 35 53 54 45 50 28 46 33 2c 20 63 2c 20   MD5STEP(F3, c, 
18ea0 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 35 5d 2b  d, a, b, in[15]+
18eb0 30 78 31 66 61 32 37 63 66 38 2c 20 31 36 29 3b  0x1fa27cf8, 16);
18ec0 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
18ed0 28 46 33 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c  (F3, b, c, d, a,
18ee0 20 69 6e 5b 20 32 5d 2b 30 78 63 34 61 63 35 36   in[ 2]+0xc4ac56
18ef0 36 35 2c 20 32 33 29 3b 0a 0a 20 20 20 20 20 20  65, 23);..      
18f00 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 61 2c    MD5STEP(F4, a,
18f10 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 30 5d   b, c, d, in[ 0]
18f20 2b 30 78 66 34 32 39 32 32 34 34 2c 20 20 36 29  +0xf4292244,  6)
18f30 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
18f40 50 28 46 34 2c 20 64 2c 20 61 2c 20 62 2c 20 63  P(F4, d, a, b, c
18f50 2c 20 69 6e 5b 20 37 5d 2b 30 78 34 33 32 61 66  , in[ 7]+0x432af
18f60 66 39 37 2c 20 31 30 29 3b 0a 20 20 20 20 20 20  f97, 10);.      
18f70 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 63 2c    MD5STEP(F4, c,
18f80 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 34 5d   d, a, b, in[14]
18f90 2b 30 78 61 62 39 34 32 33 61 37 2c 20 31 35 29  +0xab9423a7, 15)
18fa0 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
18fb0 50 28 46 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61  P(F4, b, c, d, a
18fc0 2c 20 69 6e 5b 20 35 5d 2b 30 78 66 63 39 33 61  , in[ 5]+0xfc93a
18fd0 30 33 39 2c 20 32 31 29 3b 0a 20 20 20 20 20 20  039, 21);.      
18fe0 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 61 2c    MD5STEP(F4, a,
18ff0 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 31 32 5d   b, c, d, in[12]
19000 2b 30 78 36 35 35 62 35 39 63 33 2c 20 20 36 29  +0x655b59c3,  6)
19010 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
19020 50 28 46 34 2c 20 64 2c 20 61 2c 20 62 2c 20 63  P(F4, d, a, b, c
19030 2c 20 69 6e 5b 20 33 5d 2b 30 78 38 66 30 63 63  , in[ 3]+0x8f0cc
19040 63 39 32 2c 20 31 30 29 3b 0a 20 20 20 20 20 20  c92, 10);.      
19050 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 63 2c    MD5STEP(F4, c,
19060 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 30 5d   d, a, b, in[10]
19070 2b 30 78 66 66 65 66 66 34 37 64 2c 20 31 35 29  +0xffeff47d, 15)
19080 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
19090 50 28 46 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61  P(F4, b, c, d, a
190a0 2c 20 69 6e 5b 20 31 5d 2b 30 78 38 35 38 34 35  , in[ 1]+0x85845
190b0 64 64 31 2c 20 32 31 29 3b 0a 20 20 20 20 20 20  dd1, 21);.      
190c0 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 61 2c    MD5STEP(F4, a,
190d0 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 38 5d   b, c, d, in[ 8]
190e0 2b 30 78 36 66 61 38 37 65 34 66 2c 20 20 36 29  +0x6fa87e4f,  6)
190f0 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
19100 50 28 46 34 2c 20 64 2c 20 61 2c 20 62 2c 20 63  P(F4, d, a, b, c
19110 2c 20 69 6e 5b 31 35 5d 2b 30 78 66 65 32 63 65  , in[15]+0xfe2ce
19120 36 65 30 2c 20 31 30 29 3b 0a 20 20 20 20 20 20  6e0, 10);.      
19130 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 63 2c    MD5STEP(F4, c,
19140 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 36 5d   d, a, b, in[ 6]
19150 2b 30 78 61 33 30 31 34 33 31 34 2c 20 31 35 29  +0xa3014314, 15)
19160 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
19170 50 28 46 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61  P(F4, b, c, d, a
19180 2c 20 69 6e 5b 31 33 5d 2b 30 78 34 65 30 38 31  , in[13]+0x4e081
19190 31 61 31 2c 20 32 31 29 3b 0a 20 20 20 20 20 20  1a1, 21);.      
191a0 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 61 2c    MD5STEP(F4, a,
191b0 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 34 5d   b, c, d, in[ 4]
191c0 2b 30 78 66 37 35 33 37 65 38 32 2c 20 20 36 29  +0xf7537e82,  6)
191d0 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
191e0 50 28 46 34 2c 20 64 2c 20 61 2c 20 62 2c 20 63  P(F4, d, a, b, c
191f0 2c 20 69 6e 5b 31 31 5d 2b 30 78 62 64 33 61 66  , in[11]+0xbd3af
19200 32 33 35 2c 20 31 30 29 3b 0a 20 20 20 20 20 20  235, 10);.      
19210 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 63 2c    MD5STEP(F4, c,
19220 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 32 5d   d, a, b, in[ 2]
19230 2b 30 78 32 61 64 37 64 32 62 62 2c 20 31 35 29  +0x2ad7d2bb, 15)
19240 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
19250 50 28 46 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61  P(F4, b, c, d, a
19260 2c 20 69 6e 5b 20 39 5d 2b 30 78 65 62 38 36 64  , in[ 9]+0xeb86d
19270 33 39 31 2c 20 32 31 29 3b 0a 0a 20 20 20 20 20  391, 21);..     
19280 20 20 20 62 75 66 5b 30 5d 20 2b 3d 20 61 3b 0a     buf[0] += a;.
19290 20 20 20 20 20 20 20 20 62 75 66 5b 31 5d 20 2b          buf[1] +
192a0 3d 20 62 3b 0a 20 20 20 20 20 20 20 20 62 75 66  = b;.        buf
192b0 5b 32 5d 20 2b 3d 20 63 3b 0a 20 20 20 20 20 20  [2] += c;.      
192c0 20 20 62 75 66 5b 33 5d 20 2b 3d 20 64 3b 0a 7d    buf[3] += d;.}
192d0 0a 0a 2f 2a 0a 20 2a 20 53 74 61 72 74 20 4d 44  ../*. * Start MD
192e0 35 20 61 63 63 75 6d 75 6c 61 74 69 6f 6e 2e 20  5 accumulation. 
192f0 20 53 65 74 20 62 69 74 20 63 6f 75 6e 74 20 74   Set bit count t
19300 6f 20 30 20 61 6e 64 20 62 75 66 66 65 72 20 74  o 0 and buffer t
19310 6f 20 6d 79 73 74 65 72 69 6f 75 73 0a 20 2a 20  o mysterious. * 
19320 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 63  initialization c
19330 6f 6e 73 74 61 6e 74 73 2e 0a 20 2a 2f 0a 73 74  onstants.. */.st
19340 61 74 69 63 20 76 6f 69 64 20 4d 44 35 49 6e 69  atic void MD5Ini
19350 74 28 4d 44 35 43 6f 6e 74 65 78 74 20 2a 63 74  t(MD5Context *ct
19360 78 29 7b 0a 20 20 20 20 20 20 20 20 63 74 78 2d  x){.        ctx-
19370 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20  >isInit = 1;.   
19380 20 20 20 20 20 63 74 78 2d 3e 62 75 66 5b 30 5d       ctx->buf[0]
19390 20 3d 20 30 78 36 37 34 35 32 33 30 31 3b 0a 20   = 0x67452301;. 
193a0 20 20 20 20 20 20 20 63 74 78 2d 3e 62 75 66 5b         ctx->buf[
193b0 31 5d 20 3d 20 30 78 65 66 63 64 61 62 38 39 3b  1] = 0xefcdab89;
193c0 0a 20 20 20 20 20 20 20 20 63 74 78 2d 3e 62 75  .        ctx->bu
193d0 66 5b 32 5d 20 3d 20 30 78 39 38 62 61 64 63 66  f[2] = 0x98badcf
193e0 65 3b 0a 20 20 20 20 20 20 20 20 63 74 78 2d 3e  e;.        ctx->
193f0 62 75 66 5b 33 5d 20 3d 20 30 78 31 30 33 32 35  buf[3] = 0x10325
19400 34 37 36 3b 0a 20 20 20 20 20 20 20 20 63 74 78  476;.        ctx
19410 2d 3e 62 69 74 73 5b 30 5d 20 3d 20 30 3b 0a 20  ->bits[0] = 0;. 
19420 20 20 20 20 20 20 20 63 74 78 2d 3e 62 69 74 73         ctx->bits
19430 5b 31 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20  [1] = 0;.}../*. 
19440 2a 20 55 70 64 61 74 65 20 63 6f 6e 74 65 78 74  * Update context
19450 20 74 6f 20 72 65 66 6c 65 63 74 20 74 68 65 20   to reflect the 
19460 63 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 20 6f 66  concatenation of
19470 20 61 6e 6f 74 68 65 72 20 62 75 66 66 65 72 20   another buffer 
19480 66 75 6c 6c 0a 20 2a 20 6f 66 20 62 79 74 65 73  full. * of bytes
19490 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 0a 76 6f  .. */.static .vo
194a0 69 64 20 4d 44 35 55 70 64 61 74 65 28 4d 44 35  id MD5Update(MD5
194b0 43 6f 6e 74 65 78 74 20 2a 63 74 78 2c 20 63 6f  Context *ctx, co
194c0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
194d0 72 20 2a 62 75 66 2c 20 75 6e 73 69 67 6e 65 64  r *buf, unsigned
194e0 20 69 6e 74 20 6c 65 6e 29 7b 0a 20 20 20 20 20   int len){.     
194f0 20 20 20 75 69 6e 74 33 32 20 74 3b 0a 0a 20 20     uint32 t;..  
19500 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20        /* Update 
19510 62 69 74 63 6f 75 6e 74 20 2a 2f 0a 0a 20 20 20  bitcount */..   
19520 20 20 20 20 20 74 20 3d 20 63 74 78 2d 3e 62 69       t = ctx->bi
19530 74 73 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69  ts[0];.        i
19540 66 20 28 28 63 74 78 2d 3e 62 69 74 73 5b 30 5d  f ((ctx->bits[0]
19550 20 3d 20 74 20 2b 20 28 28 75 69 6e 74 33 32 29   = t + ((uint32)
19560 6c 65 6e 20 3c 3c 20 33 29 29 20 3c 20 74 29 0a  len << 3)) < t).
19570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19580 63 74 78 2d 3e 62 69 74 73 5b 31 5d 2b 2b 3b 20  ctx->bits[1]++; 
19590 2f 2a 20 43 61 72 72 79 20 66 72 6f 6d 20 6c 6f  /* Carry from lo
195a0 77 20 74 6f 20 68 69 67 68 20 2a 2f 0a 20 20 20  w to high */.   
195b0 20 20 20 20 20 63 74 78 2d 3e 62 69 74 73 5b 31       ctx->bits[1
195c0 5d 20 2b 3d 20 6c 65 6e 20 3e 3e 20 32 39 3b 0a  ] += len >> 29;.
195d0 0a 20 20 20 20 20 20 20 20 74 20 3d 20 28 74 20  .        t = (t 
195e0 3e 3e 20 33 29 20 26 20 30 78 33 66 3b 20 20 20  >> 3) & 0x3f;   
195f0 20 2f 2a 20 42 79 74 65 73 20 61 6c 72 65 61 64   /* Bytes alread
19600 79 20 69 6e 20 73 68 73 49 6e 66 6f 2d 3e 64 61  y in shsInfo->da
19610 74 61 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f  ta */..        /
19620 2a 20 48 61 6e 64 6c 65 20 61 6e 79 20 6c 65 61  * Handle any lea
19630 64 69 6e 67 20 6f 64 64 2d 73 69 7a 65 64 20 63  ding odd-sized c
19640 68 75 6e 6b 73 20 2a 2f 0a 0a 20 20 20 20 20 20  hunks */..      
19650 20 20 69 66 20 28 20 74 20 29 20 7b 0a 20 20 20    if ( t ) {.   
19660 20 20 20 20 20 20 20 20 20 20 20 20 20 75 6e 73               uns
19670 69 67 6e 65 64 20 63 68 61 72 20 2a 70 20 3d 20  igned char *p = 
19680 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
19690 29 63 74 78 2d 3e 69 6e 20 2b 20 74 3b 0a 0a 20  )ctx->in + t;.. 
196a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
196b0 20 3d 20 36 34 2d 74 3b 0a 20 20 20 20 20 20 20   = 64-t;.       
196c0 20 20 20 20 20 20 20 20 20 69 66 20 28 6c 65 6e           if (len
196d0 20 3c 20 74 29 20 7b 0a 20 20 20 20 20 20 20 20   < t) {.        
196e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196f0 6d 65 6d 63 70 79 28 70 2c 20 62 75 66 2c 20 6c  memcpy(p, buf, l
19700 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  en);.           
19710 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
19720 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  urn;.           
19730 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
19740 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 2c         memcpy(p,
19750 20 62 75 66 2c 20 74 29 3b 0a 20 20 20 20 20 20   buf, t);.      
19760 20 20 20 20 20 20 20 20 20 20 62 79 74 65 52 65            byteRe
19770 76 65 72 73 65 28 63 74 78 2d 3e 69 6e 2c 20 31  verse(ctx->in, 1
19780 36 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  6);.            
19790 20 20 20 20 4d 44 35 54 72 61 6e 73 66 6f 72 6d      MD5Transform
197a0 28 63 74 78 2d 3e 62 75 66 2c 20 28 75 69 6e 74  (ctx->buf, (uint
197b0 33 32 20 2a 29 63 74 78 2d 3e 69 6e 29 3b 0a 20  32 *)ctx->in);. 
197c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
197d0 75 66 20 2b 3d 20 74 3b 0a 20 20 20 20 20 20 20  uf += t;.       
197e0 20 20 20 20 20 20 20 20 20 6c 65 6e 20 2d 3d 20           len -= 
197f0 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  t;.        }..  
19800 20 20 20 20 20 20 2f 2a 20 50 72 6f 63 65 73 73        /* Process
19810 20 64 61 74 61 20 69 6e 20 36 34 2d 62 79 74 65   data in 64-byte
19820 20 63 68 75 6e 6b 73 20 2a 2f 0a 0a 20 20 20 20   chunks */..    
19830 20 20 20 20 77 68 69 6c 65 20 28 6c 65 6e 20 3e      while (len >
19840 3d 20 36 34 29 20 7b 0a 20 20 20 20 20 20 20 20  = 64) {.        
19850 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 63          memcpy(c
19860 74 78 2d 3e 69 6e 2c 20 62 75 66 2c 20 36 34 29  tx->in, buf, 64)
19870 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
19880 20 20 62 79 74 65 52 65 76 65 72 73 65 28 63 74    byteReverse(ct
19890 78 2d 3e 69 6e 2c 20 31 36 29 3b 0a 20 20 20 20  x->in, 16);.    
198a0 20 20 20 20 20 20 20 20 20 20 20 20 4d 44 35 54              MD5T
198b0 72 61 6e 73 66 6f 72 6d 28 63 74 78 2d 3e 62 75  ransform(ctx->bu
198c0 66 2c 20 28 75 69 6e 74 33 32 20 2a 29 63 74 78  f, (uint32 *)ctx
198d0 2d 3e 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  ->in);.         
198e0 20 20 20 20 20 20 20 62 75 66 20 2b 3d 20 36 34         buf += 64
198f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
19900 20 20 6c 65 6e 20 2d 3d 20 36 34 3b 0a 20 20 20    len -= 64;.   
19910 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
19920 2f 2a 20 48 61 6e 64 6c 65 20 61 6e 79 20 72 65  /* Handle any re
19930 6d 61 69 6e 69 6e 67 20 62 79 74 65 73 20 6f 66  maining bytes of
19940 20 64 61 74 61 2e 20 2a 2f 0a 0a 20 20 20 20 20   data. */..     
19950 20 20 20 6d 65 6d 63 70 79 28 63 74 78 2d 3e 69     memcpy(ctx->i
19960 6e 2c 20 62 75 66 2c 20 6c 65 6e 29 3b 0a 7d 0a  n, buf, len);.}.
19970 0a 2f 2a 0a 20 2a 20 46 69 6e 61 6c 20 77 72 61  ./*. * Final wra
19980 70 75 70 20 2d 20 70 61 64 20 74 6f 20 36 34 2d  pup - pad to 64-
19990 62 79 74 65 20 62 6f 75 6e 64 61 72 79 20 77 69  byte boundary wi
199a0 74 68 20 74 68 65 20 62 69 74 20 70 61 74 74 65  th the bit patte
199b0 72 6e 20 0a 20 2a 20 31 20 30 2a 20 28 36 34 2d  rn . * 1 0* (64-
199c0 62 69 74 20 63 6f 75 6e 74 20 6f 66 20 62 69 74  bit count of bit
199d0 73 20 70 72 6f 63 65 73 73 65 64 2c 20 4d 53 42  s processed, MSB
199e0 2d 66 69 72 73 74 29 0a 20 2a 2f 0a 73 74 61 74  -first). */.stat
199f0 69 63 20 76 6f 69 64 20 4d 44 35 46 69 6e 61 6c  ic void MD5Final
19a00 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64  (unsigned char d
19a10 69 67 65 73 74 5b 31 36 5d 2c 20 4d 44 35 43 6f  igest[16], MD5Co
19a20 6e 74 65 78 74 20 2a 63 74 78 29 7b 0a 20 20 20  ntext *ctx){.   
19a30 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 6f       unsigned co
19a40 75 6e 74 3b 0a 20 20 20 20 20 20 20 20 75 6e 73  unt;.        uns
19a50 69 67 6e 65 64 20 63 68 61 72 20 2a 70 3b 0a 0a  igned char *p;..
19a60 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 75          /* Compu
19a70 74 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  te number of byt
19a80 65 73 20 6d 6f 64 20 36 34 20 2a 2f 0a 20 20 20  es mod 64 */.   
19a90 20 20 20 20 20 63 6f 75 6e 74 20 3d 20 28 63 74       count = (ct
19aa0 78 2d 3e 62 69 74 73 5b 30 5d 20 3e 3e 20 33 29  x->bits[0] >> 3)
19ab0 20 26 20 30 78 33 46 3b 0a 0a 20 20 20 20 20 20   & 0x3F;..      
19ac0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 66 69 72    /* Set the fir
19ad0 73 74 20 63 68 61 72 20 6f 66 20 70 61 64 64 69  st char of paddi
19ae0 6e 67 20 74 6f 20 30 78 38 30 2e 20 20 54 68 69  ng to 0x80.  Thi
19af0 73 20 69 73 20 73 61 66 65 20 73 69 6e 63 65 20  s is safe since 
19b00 74 68 65 72 65 20 69 73 0a 20 20 20 20 20 20 20  there is.       
19b10 20 20 20 20 61 6c 77 61 79 73 20 61 74 20 6c 65      always at le
19b20 61 73 74 20 6f 6e 65 20 62 79 74 65 20 66 72 65  ast one byte fre
19b30 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 20 3d  e */.        p =
19b40 20 63 74 78 2d 3e 69 6e 20 2b 20 63 6f 75 6e 74   ctx->in + count
19b50 3b 0a 20 20 20 20 20 20 20 20 2a 70 2b 2b 20 3d  ;.        *p++ =
19b60 20 30 78 38 30 3b 0a 0a 20 20 20 20 20 20 20 20   0x80;..        
19b70 2f 2a 20 42 79 74 65 73 20 6f 66 20 70 61 64 64  /* Bytes of padd
19b80 69 6e 67 20 6e 65 65 64 65 64 20 74 6f 20 6d 61  ing needed to ma
19b90 6b 65 20 36 34 20 62 79 74 65 73 20 2a 2f 0a 20  ke 64 bytes */. 
19ba0 20 20 20 20 20 20 20 63 6f 75 6e 74 20 3d 20 36         count = 6
19bb0 34 20 2d 20 31 20 2d 20 63 6f 75 6e 74 3b 0a 0a  4 - 1 - count;..
19bc0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 64 20 6f          /* Pad o
19bd0 75 74 20 74 6f 20 35 36 20 6d 6f 64 20 36 34 20  ut to 56 mod 64 
19be0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 20 28 63  */.        if (c
19bf0 6f 75 6e 74 20 3c 20 38 29 20 7b 0a 20 20 20 20  ount < 8) {.    
19c00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
19c10 77 6f 20 6c 6f 74 73 20 6f 66 20 70 61 64 64 69  wo lots of paddi
19c20 6e 67 3a 20 20 50 61 64 20 74 68 65 20 66 69 72  ng:  Pad the fir
19c30 73 74 20 62 6c 6f 63 6b 20 74 6f 20 36 34 20 62  st block to 64 b
19c40 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ytes */.        
19c50 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70          memset(p
19c60 2c 20 30 2c 20 63 6f 75 6e 74 29 3b 0a 20 20 20  , 0, count);.   
19c70 20 20 20 20 20 20 20 20 20 20 20 20 20 62 79 74               byt
19c80 65 52 65 76 65 72 73 65 28 63 74 78 2d 3e 69 6e  eReverse(ctx->in
19c90 2c 20 31 36 29 3b 0a 20 20 20 20 20 20 20 20 20  , 16);.         
19ca0 20 20 20 20 20 20 20 4d 44 35 54 72 61 6e 73 66         MD5Transf
19cb0 6f 72 6d 28 63 74 78 2d 3e 62 75 66 2c 20 28 75  orm(ctx->buf, (u
19cc0 69 6e 74 33 32 20 2a 29 63 74 78 2d 3e 69 6e 29  int32 *)ctx->in)
19cd0 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
19ce0 20 20 20 2f 2a 20 4e 6f 77 20 66 69 6c 6c 20 74     /* Now fill t
19cf0 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 77 69  he next block wi
19d00 74 68 20 35 36 20 62 79 74 65 73 20 2a 2f 0a 20  th 56 bytes */. 
19d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
19d20 65 6d 73 65 74 28 63 74 78 2d 3e 69 6e 2c 20 30  emset(ctx->in, 0
19d30 2c 20 35 36 29 3b 0a 20 20 20 20 20 20 20 20 7d  , 56);.        }
19d40 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
19d50 20 20 20 20 20 20 20 20 2f 2a 20 50 61 64 20 62          /* Pad b
19d60 6c 6f 63 6b 20 74 6f 20 35 36 20 62 79 74 65 73  lock to 56 bytes
19d70 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
19d80 20 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c      memset(p, 0,
19d90 20 63 6f 75 6e 74 2d 38 29 3b 0a 20 20 20 20 20   count-8);.     
19da0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 79 74     }.        byt
19db0 65 52 65 76 65 72 73 65 28 63 74 78 2d 3e 69 6e  eReverse(ctx->in
19dc0 2c 20 31 34 29 3b 0a 0a 20 20 20 20 20 20 20 20  , 14);..        
19dd0 2f 2a 20 41 70 70 65 6e 64 20 6c 65 6e 67 74 68  /* Append length
19de0 20 69 6e 20 62 69 74 73 20 61 6e 64 20 74 72 61   in bits and tra
19df0 6e 73 66 6f 72 6d 20 2a 2f 0a 20 20 20 20 20 20  nsform */.      
19e00 20 20 28 28 75 69 6e 74 33 32 20 2a 29 63 74 78    ((uint32 *)ctx
19e10 2d 3e 69 6e 29 5b 20 31 34 20 5d 20 3d 20 63 74  ->in)[ 14 ] = ct
19e20 78 2d 3e 62 69 74 73 5b 30 5d 3b 0a 20 20 20 20  x->bits[0];.    
19e30 20 20 20 20 28 28 75 69 6e 74 33 32 20 2a 29 63      ((uint32 *)c
19e40 74 78 2d 3e 69 6e 29 5b 20 31 35 20 5d 20 3d 20  tx->in)[ 15 ] = 
19e50 63 74 78 2d 3e 62 69 74 73 5b 31 5d 3b 0a 0a 20  ctx->bits[1];.. 
19e60 20 20 20 20 20 20 20 4d 44 35 54 72 61 6e 73 66         MD5Transf
19e70 6f 72 6d 28 63 74 78 2d 3e 62 75 66 2c 20 28 75  orm(ctx->buf, (u
19e80 69 6e 74 33 32 20 2a 29 63 74 78 2d 3e 69 6e 29  int32 *)ctx->in)
19e90 3b 0a 20 20 20 20 20 20 20 20 62 79 74 65 52 65  ;.        byteRe
19ea0 76 65 72 73 65 28 28 75 6e 73 69 67 6e 65 64 20  verse((unsigned 
19eb0 63 68 61 72 20 2a 29 63 74 78 2d 3e 62 75 66 2c  char *)ctx->buf,
19ec0 20 34 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d   4);.        mem
19ed0 63 70 79 28 64 69 67 65 73 74 2c 20 63 74 78 2d  cpy(digest, ctx-
19ee0 3e 62 75 66 2c 20 31 36 29 3b 0a 7d 0a 0a 2f 2a  >buf, 16);.}../*
19ef0 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 31 32  .** Convert a 12
19f00 38 2d 62 69 74 20 4d 44 35 20 64 69 67 65 73 74  8-bit MD5 digest
19f10 20 69 6e 74 6f 20 61 20 33 32 2d 64 69 67 69 74   into a 32-digit
19f20 20 62 61 73 65 2d 31 36 20 6e 75 6d 62 65 72 2e   base-16 number.
19f30 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
19f40 4d 44 35 44 69 67 65 73 74 54 6f 42 61 73 65 31  MD5DigestToBase1
19f50 36 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  6(unsigned char 
19f60 2a 64 69 67 65 73 74 2c 20 63 68 61 72 20 2a 7a  *digest, char *z
19f70 42 75 66 29 7b 0a 20 20 73 74 61 74 69 63 20 63  Buf){.  static c
19f80 68 61 72 20 63 6f 6e 73 74 20 7a 45 6e 63 6f 64  har const zEncod
19f90 65 5b 5d 20 3d 20 22 30 31 32 33 34 35 36 37 38  e[] = "012345678
19fa0 39 61 62 63 64 65 66 22 3b 0a 20 20 69 6e 74 20  9abcdef";.  int 
19fb0 69 2c 20 6a 3b 0a 0a 20 20 66 6f 72 28 6a 3d 69  i, j;..  for(j=i
19fc0 3d 30 3b 20 69 3c 31 36 3b 20 69 2b 2b 29 7b 0a  =0; i<16; i++){.
19fd0 20 20 20 20 69 6e 74 20 61 20 3d 20 64 69 67 65      int a = dige
19fe0 73 74 5b 69 5d 3b 0a 20 20 20 20 7a 42 75 66 5b  st[i];.    zBuf[
19ff0 6a 2b 2b 5d 20 3d 20 7a 45 6e 63 6f 64 65 5b 28  j++] = zEncode[(
1a000 61 3e 3e 34 29 26 30 78 66 5d 3b 0a 20 20 20 20  a>>4)&0xf];.    
1a010 7a 42 75 66 5b 6a 2b 2b 5d 20 3d 20 7a 45 6e 63  zBuf[j++] = zEnc
1a020 6f 64 65 5b 61 20 26 20 30 78 66 5d 3b 0a 20 20  ode[a & 0xf];.  
1a030 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b  }.  zBuf[j] = 0;
1a040 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  .}.../*.** Conve
1a050 72 74 20 61 20 31 32 38 2d 62 69 74 20 4d 44 35  rt a 128-bit MD5
1a060 20 64 69 67 65 73 74 20 69 6e 74 6f 20 73 65 71   digest into seq
1a070 75 65 6e 63 79 20 6f 66 20 65 69 67 68 74 20 35  uency of eight 5
1a080 2d 64 69 67 69 74 20 69 6e 74 65 67 65 72 73 0a  -digit integers.
1a090 2a 2a 20 65 61 63 68 20 72 65 70 72 65 73 65 6e  ** each represen
1a0a0 74 69 6e 67 20 31 36 20 62 69 74 73 20 6f 66 20  ting 16 bits of 
1a0b0 74 68 65 20 64 69 67 65 73 74 20 61 6e 64 20 73  the digest and s
1a0c0 65 70 61 72 61 74 65 64 20 66 72 6f 6d 20 65 61  eparated from ea
1a0d0 63 68 0a 2a 2a 20 6f 74 68 65 72 20 62 79 20 61  ch.** other by a
1a0e0 20 22 2d 22 20 63 68 61 72 61 63 74 65 72 2e 0a   "-" character..
1a0f0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 4d  */.static void M
1a100 44 35 44 69 67 65 73 74 54 6f 42 61 73 65 31 30  D5DigestToBase10
1a110 78 38 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  x8(unsigned char
1a120 20 64 69 67 65 73 74 5b 31 36 5d 2c 20 63 68 61   digest[16], cha
1a130 72 20 7a 44 69 67 65 73 74 5b 35 30 5d 29 7b 0a  r zDigest[50]){.
1a140 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 75 6e    int i, j;.  un
1a150 73 69 67 6e 65 64 20 69 6e 74 20 78 3b 0a 20 20  signed int x;.  
1a160 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 31 36 3b  for(i=j=0; i<16;
1a170 20 69 2b 3d 32 29 7b 0a 20 20 20 20 78 20 3d 20   i+=2){.    x = 
1a180 64 69 67 65 73 74 5b 69 5d 2a 32 35 36 20 2b 20  digest[i]*256 + 
1a190 64 69 67 65 73 74 5b 69 2b 31 5d 3b 0a 20 20 20  digest[i+1];.   
1a1a0 20 69 66 28 20 69 3e 30 20 29 20 7a 44 69 67 65   if( i>0 ) zDige
1a1b0 73 74 5b 6a 2b 2b 5d 20 3d 20 27 2d 27 3b 0a 20  st[j++] = '-';. 
1a1c0 20 20 20 73 70 72 69 6e 74 66 28 26 7a 44 69 67     sprintf(&zDig
1a1d0 65 73 74 5b 6a 5d 2c 20 22 25 30 35 75 22 2c 20  est[j], "%05u", 
1a1e0 78 29 3b 0a 20 20 20 20 6a 20 2b 3d 20 35 3b 0a  x);.    j += 5;.
1a1f0 20 20 7d 0a 20 20 7a 44 69 67 65 73 74 5b 6a 5d    }.  zDigest[j]
1a200 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41   = 0;.}../*.** A
1a210 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 66 6f 72   TCL command for
1a220 20 6d 64 35 2e 20 20 54 68 65 20 61 72 67 75 6d   md5.  The argum
1a230 65 6e 74 20 69 73 20 74 68 65 20 74 65 78 74 20  ent is the text 
1a240 74 6f 20 62 65 20 68 61 73 68 65 64 2e 20 20 54  to be hashed.  T
1a250 68 65 0a 2a 2a 20 52 65 73 75 6c 74 20 69 73 20  he.** Result is 
1a260 74 68 65 20 68 61 73 68 20 69 6e 20 62 61 73 65  the hash in base
1a270 36 34 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20  64.  .*/.static 
1a280 69 6e 74 20 6d 64 35 5f 63 6d 64 28 76 6f 69 64  int md5_cmd(void
1a290 2a 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  *cd, Tcl_Interp 
1a2a0 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 61 72 67  *interp, int arg
1a2b0 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  c, const char **
1a2c0 61 72 67 76 29 7b 0a 20 20 4d 44 35 43 6f 6e 74  argv){.  MD5Cont
1a2d0 65 78 74 20 63 74 78 3b 0a 20 20 75 6e 73 69 67  ext ctx;.  unsig
1a2e0 6e 65 64 20 63 68 61 72 20 64 69 67 65 73 74 5b  ned char digest[
1a2f0 31 36 5d 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  16];.  char zBuf
1a300 5b 35 30 5d 3b 0a 20 20 76 6f 69 64 20 28 2a 63  [50];.  void (*c
1a310 6f 6e 76 65 72 74 65 72 29 28 75 6e 73 69 67 6e  onverter)(unsign
1a320 65 64 20 63 68 61 72 2a 2c 20 63 68 61 72 2a 29  ed char*, char*)
1a330 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32  ;..  if( argc!=2
1a340 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1a350 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1a360 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
1a370 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
1a380 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 20  gv[0], .        
1a390 22 20 54 45 58 54 5c 22 22 2c 20 30 29 3b 0a 20  " TEXT\"", 0);. 
1a3a0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1a3b0 52 4f 52 3b 0a 20 20 7d 0a 20 20 4d 44 35 49 6e  ROR;.  }.  MD5In
1a3c0 69 74 28 26 63 74 78 29 3b 0a 20 20 4d 44 35 55  it(&ctx);.  MD5U
1a3d0 70 64 61 74 65 28 26 63 74 78 2c 20 28 75 6e 73  pdate(&ctx, (uns
1a3e0 69 67 6e 65 64 20 63 68 61 72 2a 29 61 72 67 76  igned char*)argv
1a3f0 5b 31 5d 2c 20 28 75 6e 73 69 67 6e 65 64 29 73  [1], (unsigned)s
1a400 74 72 6c 65 6e 28 61 72 67 76 5b 31 5d 29 29 3b  trlen(argv[1]));
1a410 0a 20 20 4d 44 35 46 69 6e 61 6c 28 64 69 67 65  .  MD5Final(dige
1a420 73 74 2c 20 26 63 74 78 29 3b 0a 20 20 63 6f 6e  st, &ctx);.  con
1a430 76 65 72 74 65 72 20 3d 20 28 76 6f 69 64 28 2a  verter = (void(*
1a440 29 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a  )(unsigned char*
1a450 2c 63 68 61 72 2a 29 29 63 64 3b 0a 20 20 63 6f  ,char*))cd;.  co
1a460 6e 76 65 72 74 65 72 28 64 69 67 65 73 74 2c 20  nverter(digest, 
1a470 7a 42 75 66 29 3b 0a 20 20 54 63 6c 5f 41 70 70  zBuf);.  Tcl_App
1a480 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1a490 2c 20 7a 42 75 66 2c 20 28 63 68 61 72 2a 29 30  , zBuf, (char*)0
1a4a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
1a4b0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 54  OK;.}../*.** A T
1a4c0 43 4c 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 74 61  CL command to ta
1a4d0 6b 65 20 74 68 65 20 6d 64 35 20 68 61 73 68 20  ke the md5 hash 
1a4e0 6f 66 20 61 20 66 69 6c 65 2e 20 20 54 68 65 20  of a file.  The 
1a4f0 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0a  argument is the.
1a500 2a 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66  ** name of the f
1a510 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
1a520 6e 74 20 6d 64 35 66 69 6c 65 5f 63 6d 64 28 76  nt md5file_cmd(v
1a530 6f 69 64 2a 63 64 2c 20 54 63 6c 5f 49 6e 74 65  oid*cd, Tcl_Inte
1a540 72 70 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 61  rp*interp, int a
1a550 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rgc, const char 
1a560 2a 2a 61 72 67 76 29 7b 0a 20 20 46 49 4c 45 20  **argv){.  FILE 
1a570 2a 69 6e 3b 0a 20 20 4d 44 35 43 6f 6e 74 65 78  *in;.  MD5Contex
1a580 74 20 63 74 78 3b 0a 20 20 76 6f 69 64 20 28 2a  t ctx;.  void (*
1a590 63 6f 6e 76 65 72 74 65 72 29 28 75 6e 73 69 67  converter)(unsig
1a5a0 6e 65 64 20 63 68 61 72 2a 2c 20 63 68 61 72 2a  ned char*, char*
1a5b0 29 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  );.  unsigned ch
1a5c0 61 72 20 64 69 67 65 73 74 5b 31 36 5d 3b 0a 20  ar digest[16];. 
1a5d0 20 63 68 61 72 20 7a 42 75 66 5b 31 30 32 34 30   char zBuf[10240
1a5e0 5d 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 21 3d  ];..  if( argc!=
1a5f0 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
1a600 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1a610 2c 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20  ,"wrong # args: 
1a620 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
1a630 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20  rgv[0], .       
1a640 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20   " FILENAME\"", 
1a650 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1a660 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1a670 69 6e 20 3d 20 66 6f 70 65 6e 28 61 72 67 76 5b  in = fopen(argv[
1a680 31 5d 2c 22 72 62 22 29 3b 0a 20 20 69 66 28 20  1],"rb");.  if( 
1a690 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c  in==0 ){.    Tcl
1a6a0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1a6b0 74 65 72 70 2c 22 75 6e 61 62 6c 65 20 74 6f 20  terp,"unable to 
1a6c0 6f 70 65 6e 20 66 69 6c 65 20 5c 22 22 2c 20 61  open file \"", a
1a6d0 72 67 76 5b 31 5d 2c 20 0a 20 20 20 20 20 20 20  rgv[1], .       
1a6e0 20 20 22 5c 22 20 66 6f 72 20 72 65 61 64 69 6e    "\" for readin
1a6f0 67 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  g", 0);.    retu
1a700 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1a710 7d 0a 20 20 4d 44 35 49 6e 69 74 28 26 63 74 78  }.  MD5Init(&ctx
1a720 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20  );.  for(;;){.  
1a730 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 6e 20 3d    int n;.    n =
1a740 20 28 69 6e 74 29 66 72 65 61 64 28 7a 42 75 66   (int)fread(zBuf
1a750 2c 20 31 2c 20 73 69 7a 65 6f 66 28 7a 42 75 66  , 1, sizeof(zBuf
1a760 29 2c 20 69 6e 29 3b 0a 20 20 20 20 69 66 28 20  ), in);.    if( 
1a770 6e 3c 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  n<=0 ) break;.  
1a780 20 20 4d 44 35 55 70 64 61 74 65 28 26 63 74 78    MD5Update(&ctx
1a790 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
1a7a0 2a 29 7a 42 75 66 2c 20 28 75 6e 73 69 67 6e 65  *)zBuf, (unsigne
1a7b0 64 29 6e 29 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f  d)n);.  }.  fclo
1a7c0 73 65 28 69 6e 29 3b 0a 20 20 4d 44 35 46 69 6e  se(in);.  MD5Fin
1a7d0 61 6c 28 64 69 67 65 73 74 2c 20 26 63 74 78 29  al(digest, &ctx)
1a7e0 3b 0a 20 20 63 6f 6e 76 65 72 74 65 72 20 3d 20  ;.  converter = 
1a7f0 28 76 6f 69 64 28 2a 29 28 75 6e 73 69 67 6e 65  (void(*)(unsigne
1a800 64 20 63 68 61 72 2a 2c 63 68 61 72 2a 29 29 63  d char*,char*))c
1a810 64 3b 0a 20 20 63 6f 6e 76 65 72 74 65 72 28 64  d;.  converter(d
1a820 69 67 65 73 74 2c 20 7a 42 75 66 29 3b 0a 20 20  igest, zBuf);.  
1a830 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1a840 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 28  (interp, zBuf, (
1a850 63 68 61 72 2a 29 30 29 3b 0a 20 20 72 65 74 75  char*)0);.  retu
1a860 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1a870 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 74 68 65  .** Register the
1a880 20 66 6f 75 72 20 6e 65 77 20 54 43 4c 20 63 6f   four new TCL co
1a890 6d 6d 61 6e 64 73 20 66 6f 72 20 67 65 6e 65 72  mmands for gener
1a8a0 61 74 69 6e 67 20 4d 44 35 20 63 68 65 63 6b 73  ating MD5 checks
1a8b0 75 6d 73 0a 2a 2a 20 77 69 74 68 20 74 68 65 20  ums.** with the 
1a8c0 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 2e  TCL interpreter.
1a8d0 0a 2a 2f 0a 69 6e 74 20 4d 64 35 5f 49 6e 69 74  .*/.int Md5_Init
1a8e0 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
1a8f0 65 72 70 29 7b 0a 20 20 54 63 6c 5f 43 72 65 61  erp){.  Tcl_Crea
1a900 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  teCommand(interp
1a910 2c 20 22 6d 64 35 22 2c 20 28 54 63 6c 5f 43 6d  , "md5", (Tcl_Cm
1a920 64 50 72 6f 63 2a 29 6d 64 35 5f 63 6d 64 2c 0a  dProc*)md5_cmd,.
1a930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a940 20 20 20 20 4d 44 35 44 69 67 65 73 74 54 6f 42      MD5DigestToB
1a950 61 73 65 31 36 2c 20 30 29 3b 0a 20 20 54 63 6c  ase16, 0);.  Tcl
1a960 5f 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69  _CreateCommand(i
1a970 6e 74 65 72 70 2c 20 22 6d 64 35 2d 31 30 78 38  nterp, "md5-10x8
1a980 22 2c 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a  ", (Tcl_CmdProc*
1a990 29 6d 64 35 5f 63 6d 64 2c 0a 20 20 20 20 20 20  )md5_cmd,.      
1a9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4d 44                MD
1a9b0 35 44 69 67 65 73 74 54 6f 42 61 73 65 31 30 78  5DigestToBase10x
1a9c0 38 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72 65  8, 0);.  Tcl_Cre
1a9d0 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ateCommand(inter
1a9e0 70 2c 20 22 6d 64 35 66 69 6c 65 22 2c 20 28 54  p, "md5file", (T
1a9f0 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 6d 64 35 66  cl_CmdProc*)md5f
1aa00 69 6c 65 5f 63 6d 64 2c 0a 20 20 20 20 20 20 20  ile_cmd,.       
1aa10 20 20 20 20 20 20 20 20 20 20 20 20 20 4d 44 35               MD5
1aa20 44 69 67 65 73 74 54 6f 42 61 73 65 31 36 2c 20  DigestToBase16, 
1aa30 30 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65  0);.  Tcl_Create
1aa40 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
1aa50 22 6d 64 35 66 69 6c 65 2d 31 30 78 38 22 2c 20  "md5file-10x8", 
1aa60 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 6d 64  (Tcl_CmdProc*)md
1aa70 35 66 69 6c 65 5f 63 6d 64 2c 0a 20 20 20 20 20  5file_cmd,.     
1aa80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4d                 M
1aa90 44 35 44 69 67 65 73 74 54 6f 42 61 73 65 31 30  D5DigestToBase10
1aaa0 78 38 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  x8, 0);.  return
1aab0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69   TCL_OK;.}.#endi
1aac0 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c  f /* defined(SQL
1aad0 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66  ITE_TEST) || def
1aae0 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 43 4c 4d  ined(SQLITE_TCLM
1aaf0 44 35 29 20 2a 2f 0a 0a 23 69 66 20 64 65 66 69  D5) */..#if defi
1ab00 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
1ab10 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 74 65  ./*.** During te
1ab20 73 74 69 6e 67 2c 20 74 68 65 20 73 70 65 63 69  sting, the speci
1ab30 61 6c 20 6d 64 35 73 75 6d 28 29 20 61 67 67 72  al md5sum() aggr
1ab40 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 69  egate function i
1ab50 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 20  s available..** 
1ab60 69 6e 73 69 64 65 20 53 51 4c 69 74 65 2e 20 20  inside SQLite.  
1ab70 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  The following ro
1ab80 75 74 69 6e 65 73 20 69 6d 70 6c 65 6d 65 6e 74  utines implement
1ab90 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 2e 0a   that function..
1aba0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  */.static void m
1abb0 64 35 73 74 65 70 28 73 71 6c 69 74 65 33 5f 63  d5step(sqlite3_c
1abc0 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
1abd0 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
1abe0 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29  e3_value **argv)
1abf0 7b 0a 20 20 4d 44 35 43 6f 6e 74 65 78 74 20 2a  {.  MD5Context *
1ac00 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  p;.  int i;.  if
1ac10 28 20 61 72 67 63 3c 31 20 29 20 72 65 74 75 72  ( argc<1 ) retur
1ac20 6e 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  n;.  p = sqlite3
1ac30 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65  _aggregate_conte
1ac40 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65  xt(context, size
1ac50 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70  of(*p));.  if( p
1ac60 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
1ac70 69 66 28 20 21 70 2d 3e 69 73 49 6e 69 74 20 29  if( !p->isInit )
1ac80 7b 0a 20 20 20 20 4d 44 35 49 6e 69 74 28 70 29  {.    MD5Init(p)
1ac90 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
1aca0 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20   i<argc; i++){. 
1acb0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1acc0 44 61 74 61 20 3d 20 28 63 68 61 72 2a 29 73 71  Data = (char*)sq
1acd0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
1ace0 28 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 69  (argv[i]);.    i
1acf0 66 28 20 7a 44 61 74 61 20 29 7b 0a 20 20 20 20  f( zData ){.    
1ad00 20 20 4d 44 35 55 70 64 61 74 65 28 70 2c 20 28    MD5Update(p, (
1ad10 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a  unsigned char*)z
1ad20 44 61 74 61 2c 20 28 69 6e 74 29 73 74 72 6c 65  Data, (int)strle
1ad30 6e 28 7a 44 61 74 61 29 29 3b 0a 20 20 20 20 7d  n(zData));.    }
1ad40 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
1ad50 69 64 20 6d 64 35 66 69 6e 61 6c 69 7a 65 28 73  id md5finalize(s
1ad60 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
1ad70 63 6f 6e 74 65 78 74 29 7b 0a 20 20 4d 44 35 43  context){.  MD5C
1ad80 6f 6e 74 65 78 74 20 2a 70 3b 0a 20 20 75 6e 73  ontext *p;.  uns
1ad90 69 67 6e 65 64 20 63 68 61 72 20 64 69 67 65 73  igned char diges
1ada0 74 5b 31 36 5d 3b 0a 20 20 63 68 61 72 20 7a 42  t[16];.  char zB
1adb0 75 66 5b 33 33 5d 3b 0a 20 20 70 20 3d 20 73 71  uf[33];.  p = sq
1adc0 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f  lite3_aggregate_
1add0 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  context(context,
1ade0 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
1adf0 4d 44 35 46 69 6e 61 6c 28 64 69 67 65 73 74 2c  MD5Final(digest,
1ae00 70 29 3b 0a 20 20 4d 44 35 44 69 67 65 73 74 54  p);.  MD5DigestT
1ae10 6f 42 61 73 65 31 36 28 64 69 67 65 73 74 2c 20  oBase16(digest, 
1ae20 7a 42 75 66 29 3b 0a 20 20 73 71 6c 69 74 65 33  zBuf);.  sqlite3
1ae30 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e  _result_text(con
1ae40 74 65 78 74 2c 20 7a 42 75 66 2c 20 2d 31 2c 20  text, zBuf, -1, 
1ae50 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
1ae60 29 3b 0a 7d 0a 69 6e 74 20 4d 64 35 5f 52 65 67  );.}.int Md5_Reg
1ae70 69 73 74 65 72 28 73 71 6c 69 74 65 33 20 2a 64  ister(sqlite3 *d
1ae80 62 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73  b){.  int rc = s
1ae90 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
1aea0 6e 63 74 69 6f 6e 28 64 62 2c 20 22 6d 64 35 73  nction(db, "md5s
1aeb0 75 6d 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  um", -1, SQLITE_
1aec0 55 54 46 38 2c 20 30 2c 20 30 2c 20 0a 20 20 20  UTF8, 0, 0, .   
1aed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 64                md
1aef0 35 73 74 65 70 2c 20 6d 64 35 66 69 6e 61 6c 69  5step, md5finali
1af00 7a 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6f  ze);.  sqlite3_o
1af10 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74 69 6f 6e  verload_function
1af20 28 64 62 2c 20 22 6d 64 35 73 75 6d 22 2c 20 2d  (db, "md5sum", -
1af30 31 29 3b 20 20 2f 2a 20 54 6f 20 65 78 65 72 63  1);  /* To exerc
1af40 69 73 65 20 74 68 69 73 20 41 50 49 20 2a 2f 0a  ise this API */.
1af50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
1af60 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
1af70 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 2a 2f  (SQLITE_TEST) */
1af80 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  .../*.** If the 
1af90 6d 61 63 72 6f 20 54 43 4c 53 48 20 69 73 20 6f  macro TCLSH is o
1afa0 6e 65 2c 20 74 68 65 6e 20 70 75 74 20 69 6e 20  ne, then put in 
1afb0 63 6f 64 65 20 74 68 69 73 20 66 6f 72 20 74 68  code this for th
1afc0 65 0a 2a 2a 20 22 6d 61 69 6e 22 20 72 6f 75 74  e.** "main" rout
1afd0 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e  ine that will in
1afe0 69 74 69 61 6c 69 7a 65 20 54 63 6c 20 61 6e 64  itialize Tcl and
1aff0 20 74 61 6b 65 20 69 6e 70 75 74 20 66 72 6f 6d   take input from
1b000 0a 2a 2a 20 73 74 61 6e 64 61 72 64 20 69 6e 70  .** standard inp
1b010 75 74 2c 20 6f 72 20 69 66 20 61 20 66 69 6c 65  ut, or if a file
1b020 20 69 73 20 6e 61 6d 65 64 20 6f 6e 20 74 68 65   is named on the
1b030 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 0a 2a 2a   command line.**
1b040 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   the TCL interpr
1b050 65 74 65 72 20 72 65 61 64 73 20 61 6e 64 20 65  eter reads and e
1b060 76 61 6c 75 61 74 65 73 20 74 68 61 74 20 66 69  valuates that fi
1b070 6c 65 2e 0a 2a 2f 0a 23 69 66 20 54 43 4c 53 48  le..*/.#if TCLSH
1b080 3d 3d 31 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  ==1.static const
1b090 20 63 68 61 72 20 2a 74 63 6c 73 68 5f 6d 61 69   char *tclsh_mai
1b0a0 6e 5f 6c 6f 6f 70 28 76 6f 69 64 29 7b 0a 20 20  n_loop(void){.  
1b0b0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
1b0c0 72 20 7a 4d 61 69 6e 6c 6f 6f 70 5b 5d 20 3d 0a  r zMainloop[] =.
1b0d0 20 20 20 20 22 73 65 74 20 6c 69 6e 65 20 7b 7d      "set line {}
1b0e0 5c 6e 22 0a 20 20 20 20 22 77 68 69 6c 65 20 7b  \n".    "while {
1b0f0 21 5b 65 6f 66 20 73 74 64 69 6e 5d 7d 20 7b 5c  ![eof stdin]} {\
1b100 6e 22 0a 20 20 20 20 20 20 22 69 66 20 7b 24 6c  n".      "if {$l
1b110 69 6e 65 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22 0a  ine!=\"\"} {\n".
1b120 20 20 20 20 20 20 20 20 22 70 75 74 73 20 2d 6e          "puts -n
1b130 6f 6e 65 77 6c 69 6e 65 20 5c 22 3e 20 5c 22 5c  onewline \"> \"\
1b140 6e 22 0a 20 20 20 20 20 20 22 7d 20 65 6c 73 65  n".      "} else
1b150 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 70   {\n".        "p
1b160 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 5c  uts -nonewline \
1b170 22 25 20 5c 22 5c 6e 22 0a 20 20 20 20 20 20 22  "% \"\n".      "
1b180 7d 5c 6e 22 0a 20 20 20 20 20 20 22 66 6c 75 73  }\n".      "flus
1b190 68 20 73 74 64 6f 75 74 5c 6e 22 0a 20 20 20 20  h stdout\n".    
1b1a0 20 20 22 61 70 70 65 6e 64 20 6c 69 6e 65 20 5b    "append line [
1b1b0 67 65 74 73 20 73 74 64 69 6e 5d 5c 6e 22 0a 20  gets stdin]\n". 
1b1c0 20 20 20 20 20 22 69 66 20 7b 5b 69 6e 66 6f 20       "if {[info 
1b1d0 63 6f 6d 70 6c 65 74 65 20 24 6c 69 6e 65 5d 7d  complete $line]}
1b1e0 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 69   {\n".        "i
1b1f0 66 20 7b 5b 63 61 74 63 68 20 7b 75 70 6c 65 76  f {[catch {uplev
1b200 65 6c 20 23 30 20 24 6c 69 6e 65 7d 20 72 65 73  el #0 $line} res
1b210 75 6c 74 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 20  ult]} {\n".     
1b220 20 20 20 20 20 22 70 75 74 73 20 73 74 64 65 72       "puts stder
1b230 72 20 5c 22 45 72 72 6f 72 3a 20 24 72 65 73 75  r \"Error: $resu
1b240 6c 74 5c 22 5c 6e 22 0a 20 20 20 20 20 20 20 20  lt\"\n".        
1b250 22 7d 20 65 6c 73 65 69 66 20 7b 24 72 65 73 75  "} elseif {$resu
1b260 6c 74 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22 0a 20  lt!=\"\"} {\n". 
1b270 20 20 20 20 20 20 20 20 20 22 70 75 74 73 20 24           "puts $
1b280 72 65 73 75 6c 74 5c 6e 22 0a 20 20 20 20 20 20  result\n".      
1b290 20 20 22 7d 5c 6e 22 0a 20 20 20 20 20 20 20 20    "}\n".        
1b2a0 22 73 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e 22 0a  "set line {}\n".
1b2b0 20 20 20 20 20 20 22 7d 20 65 6c 73 65 20 7b 5c        "} else {\
1b2c0 6e 22 0a 20 20 20 20 20 20 20 20 22 61 70 70 65  n".        "appe
1b2d0 6e 64 20 6c 69 6e 65 20 5c 5c 6e 5c 6e 22 0a 20  nd line \\n\n". 
1b2e0 20 20 20 20 20 22 7d 5c 6e 22 0a 20 20 20 20 22       "}\n".    "
1b2f0 7d 5c 6e 22 0a 20 20 3b 0a 20 20 72 65 74 75 72  }\n".  ;.  retur
1b300 6e 20 7a 4d 61 69 6e 6c 6f 6f 70 3b 0a 7d 0a 23  n zMainloop;.}.#
1b310 65 6e 64 69 66 0a 23 69 66 20 54 43 4c 53 48 3d  endif.#if TCLSH=
1b320 3d 32 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  =2.static const 
1b330 63 68 61 72 20 2a 74 63 6c 73 68 5f 6d 61 69 6e  char *tclsh_main
1b340 5f 6c 6f 6f 70 28 76 6f 69 64 29 3b 0a 23 65 6e  _loop(void);.#en
1b350 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
1b360 54 45 5f 54 45 53 54 0a 73 74 61 74 69 63 20 76  TE_TEST.static v
1b370 6f 69 64 20 69 6e 69 74 5f 61 6c 6c 28 54 63 6c  oid init_all(Tcl
1b380 5f 49 6e 74 65 72 70 20 2a 29 3b 0a 73 74 61 74  _Interp *);.stat
1b390 69 63 20 69 6e 74 20 69 6e 69 74 5f 61 6c 6c 5f  ic int init_all_
1b3a0 63 6d 64 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  cmd(.  ClientDat
1b3b0 61 20 63 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  a cd,.  Tcl_Inte
1b3c0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1b3d0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1b3e0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1b3f0 29 7b 0a 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ){..  Tcl_Interp
1b400 20 2a 73 6c 61 76 65 3b 0a 20 20 69 66 28 20 6f   *slave;.  if( o
1b410 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
1b420 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
1b430 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
1b440 22 53 4c 41 56 45 22 29 3b 0a 20 20 20 20 72 65  "SLAVE");.    re
1b450 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1b460 20 20 7d 0a 0a 20 20 73 6c 61 76 65 20 3d 20 54    }..  slave = T
1b470 63 6c 5f 47 65 74 53 6c 61 76 65 28 69 6e 74 65  cl_GetSlave(inte
1b480 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
1b490 67 28 6f 62 6a 76 5b 31 5d 29 29 3b 0a 20 20 69  g(objv[1]));.  i
1b4a0 66 28 20 21 73 6c 61 76 65 20 29 7b 0a 20 20 20  f( !slave ){.   
1b4b0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1b4c0 52 3b 0a 20 20 7d 0a 0a 20 20 69 6e 69 74 5f 61  R;.  }..  init_a
1b4d0 6c 6c 28 73 6c 61 76 65 29 3b 0a 20 20 72 65 74  ll(slave);.  ret
1b4e0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1b4f0 2a 0a 2a 2a 20 54 63 6c 63 6d 64 3a 20 64 62 5f  *.** Tclcmd: db_
1b500 75 73 65 5f 6c 65 67 61 63 79 5f 70 72 65 70 61  use_legacy_prepa
1b510 72 65 20 44 42 20 42 4f 4f 4c 45 41 4e 0a 2a 2a  re DB BOOLEAN.**
1b520 0a 2a 2a 20 20 20 54 68 65 20 66 69 72 73 74 20  .**   The first 
1b530 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
1b540 20 63 6f 6d 6d 61 6e 64 20 6d 75 73 74 20 62 65   command must be
1b550 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6d 6d   a database comm
1b560 61 6e 64 20 63 72 65 61 74 65 64 20 62 79 0a 2a  and created by.*
1b570 2a 20 20 20 5b 73 71 6c 69 74 65 33 5d 2e 20 49  *   [sqlite3]. I
1b580 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
1b590 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c 20 74  ument is true, t
1b5a0 68 65 6e 20 74 68 65 20 68 61 6e 64 6c 65 20 69  hen the handle i
1b5b0 73 20 63 6f 6e 66 69 67 75 72 65 64 0a 2a 2a 20  s configured.** 
1b5c0 20 20 74 6f 20 75 73 65 20 74 68 65 20 73 71 6c    to use the sql
1b5d0 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
1b5e0 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 70 72  ) function to pr
1b5f0 65 70 61 72 65 20 73 74 61 74 65 6d 65 6e 74 73  epare statements
1b600 2e 20 49 66 20 69 74 0a 2a 2a 20 20 20 69 73 20  . If it.**   is 
1b610 66 61 6c 73 65 2c 20 73 71 6c 69 74 65 33 5f 70  false, sqlite3_p
1b620 72 65 70 61 72 65 28 29 2e 0a 2a 2f 0a 73 74 61  repare()..*/.sta
1b630 74 69 63 20 69 6e 74 20 64 62 5f 75 73 65 5f 6c  tic int db_use_l
1b640 65 67 61 63 79 5f 70 72 65 70 61 72 65 5f 63 6d  egacy_prepare_cm
1b650 64 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  d(.  ClientData 
1b660 63 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  cd,.  Tcl_Interp
1b670 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1b680 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1b690 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1b6a0 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 63  .  Tcl_CmdInfo c
1b6b0 6d 64 49 6e 66 6f 3b 0a 20 20 53 71 6c 69 74 65  mdInfo;.  Sqlite
1b6c0 44 62 20 2a 70 44 62 3b 0a 20 20 69 6e 74 20 62  Db *pDb;.  int b
1b6d0 50 72 65 70 61 72 65 3b 0a 0a 20 20 69 66 28 20  Prepare;..  if( 
1b6e0 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
1b6f0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
1b700 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
1b710 20 22 44 42 20 42 4f 4f 4c 45 41 4e 22 29 3b 0a   "DB BOOLEAN");.
1b720 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1b730 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
1b740 20 21 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64   !Tcl_GetCommand
1b750 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 54 63 6c  Info(interp, Tcl
1b760 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1b770 31 5d 29 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29  1]), &cmdInfo) )
1b780 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1b790 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1b7a0 6e 6f 20 73 75 63 68 20 64 62 3a 20 22 2c 20 54  no such db: ", T
1b7b0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1b7c0 76 5b 31 5d 29 2c 20 28 63 68 61 72 2a 29 30 29  v[1]), (char*)0)
1b7d0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1b7e0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 44  _ERROR;.  }.  pD
1b7f0 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63  b = (SqliteDb*)c
1b800 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74  mdInfo.objClient
1b810 44 61 74 61 3b 0a 20 20 69 66 28 20 54 63 6c 5f  Data;.  if( Tcl_
1b820 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62  GetBooleanFromOb
1b830 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
1b840 5d 2c 20 26 62 50 72 65 70 61 72 65 29 20 29 7b  ], &bPrepare) ){
1b850 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1b860 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 70 44  ERROR;.  }..  pD
1b870 62 2d 3e 62 4c 65 67 61 63 79 50 72 65 70 61 72  b->bLegacyPrepar
1b880 65 20 3d 20 62 50 72 65 70 61 72 65 3b 0a 0a 20  e = bPrepare;.. 
1b890 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74   Tcl_ResetResult
1b8a0 28 69 6e 74 65 72 70 29 3b 0a 20 20 72 65 74 75  (interp);.  retu
1b8b0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e  rn TCL_OK;.}.#en
1b8c0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69  dif../*.** Confi
1b8d0 67 75 72 65 20 74 68 65 20 69 6e 74 65 72 70 72  gure the interpr
1b8e0 65 74 65 72 20 70 61 73 73 65 64 20 61 73 20 74  eter passed as t
1b8f0 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
1b900 74 20 74 6f 20 68 61 76 65 20 61 63 63 65 73 73  t to have access
1b910 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f 6d 6d 61  .** to the comma
1b920 6e 64 73 20 61 6e 64 20 6c 69 6e 6b 65 64 20 76  nds and linked v
1b930 61 72 69 61 62 6c 65 73 20 74 68 61 74 20 6d 61  ariables that ma
1b940 6b 65 20 75 70 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  ke up:.**.**   *
1b950 20 74 68 65 20 5b 73 71 6c 69 74 65 33 5d 20 65   the [sqlite3] e
1b960 78 74 65 6e 73 69 6f 6e 20 69 74 73 65 6c 66 2c  xtension itself,
1b970 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 53   .**.**   * If S
1b980 51 4c 49 54 45 5f 54 43 4c 4d 44 35 20 6f 72 20  QLITE_TCLMD5 or 
1b990 53 51 4c 49 54 45 5f 54 45 53 54 20 69 73 20 64  SQLITE_TEST is d
1b9a0 65 66 69 6e 65 64 2c 20 74 68 65 20 4d 64 35 20  efined, the Md5 
1b9b0 63 6f 6d 6d 61 6e 64 73 2c 20 61 6e 64 0a 2a 2a  commands, and.**
1b9c0 0a 2a 2a 20 20 20 2a 20 49 66 20 53 51 4c 49 54  .**   * If SQLIT
1b9d0 45 5f 54 45 53 54 20 69 73 20 73 65 74 2c 20 74  E_TEST is set, t
1b9e0 68 65 20 76 61 72 69 6f 75 73 20 74 65 73 74 20  he various test 
1b9f0 69 6e 74 65 72 66 61 63 65 73 20 75 73 65 64 20  interfaces used 
1ba00 62 79 20 74 68 65 20 54 63 6c 0a 2a 2a 20 20 20  by the Tcl.**   
1ba10 20 20 74 65 73 74 20 73 75 69 74 65 2e 0a 2a 2f    test suite..*/
1ba20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 69  .static void ini
1ba30 74 5f 61 6c 6c 28 54 63 6c 5f 49 6e 74 65 72 70  t_all(Tcl_Interp
1ba40 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 53 71 6c   *interp){.  Sql
1ba50 69 74 65 33 5f 49 6e 69 74 28 69 6e 74 65 72 70  ite3_Init(interp
1ba60 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  );..#if defined(
1ba70 53 51 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c 20  SQLITE_TEST) || 
1ba80 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
1ba90 43 4c 4d 44 35 29 0a 20 20 4d 64 35 5f 49 6e 69  CLMD5).  Md5_Ini
1baa0 74 28 69 6e 74 65 72 70 29 3b 0a 23 65 6e 64 69  t(interp);.#endi
1bab0 66 0a 0a 20 20 2f 2a 20 49 6e 73 74 61 6c 6c 20  f..  /* Install 
1bac0 74 68 65 20 5b 72 65 67 69 73 74 65 72 5f 64 62  the [register_db
1bad0 73 74 61 74 5f 76 74 61 62 5d 20 63 6f 6d 6d 61  stat_vtab] comma
1bae0 6e 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  nd to access the
1baf0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a   implementation.
1bb00 20 20 2a 2a 20 6f 66 20 76 69 72 74 75 61 6c 20    ** of virtual 
1bb10 74 61 62 6c 65 20 64 62 73 74 61 74 20 28 73 6f  table dbstat (so
1bb20 75 72 63 65 20 66 69 6c 65 20 74 65 73 74 5f 73  urce file test_s
1bb30 74 61 74 2e 63 29 2e 20 54 68 69 73 20 63 6f 6d  tat.c). This com
1bb40 6d 61 6e 64 20 69 73 0a 20 20 2a 2a 20 72 65 71  mand is.  ** req
1bb50 75 69 72 65 64 20 66 6f 72 20 74 65 73 74 66 69  uired for testfi
1bb60 78 74 75 72 65 20 61 6e 64 20 73 71 6c 69 74 65  xture and sqlite
1bb70 33 5f 61 6e 61 6c 79 7a 65 72 2c 20 62 75 74 20  3_analyzer, but 
1bb80 6e 6f 74 20 62 79 20 74 68 65 20 70 72 6f 64 75  not by the produ
1bb90 63 74 69 6f 6e 0a 20 20 2a 2a 20 54 63 6c 20 65  ction.  ** Tcl e
1bba0 78 74 65 6e 73 69 6f 6e 2e 20 20 2a 2f 0a 23 69  xtension.  */.#i
1bbb0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1bbc0 5f 54 45 53 54 29 20 7c 7c 20 54 43 4c 53 48 3d  _TEST) || TCLSH=
1bbd0 3d 32 0a 20 20 7b 0a 20 20 20 20 65 78 74 65 72  =2.  {.    exter
1bbe0 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1bbf0 53 74 61 74 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  Stat_Init(Tcl_In
1bc00 74 65 72 70 2a 29 3b 0a 20 20 20 20 53 71 6c 69  terp*);.    Sqli
1bc10 74 65 74 65 73 74 53 74 61 74 5f 49 6e 69 74 28  tetestStat_Init(
1bc20 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 23 65 6e  interp);.  }.#en
1bc30 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
1bc40 54 45 5f 54 45 53 54 0a 20 20 7b 0a 20 20 20 20  TE_TEST.  {.    
1bc50 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1bc60 65 63 6f 6e 66 69 67 5f 49 6e 69 74 28 54 63 6c  econfig_Init(Tcl
1bc70 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1bc80 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1bc90 74 65 73 74 31 5f 49 6e 69 74 28 54 63 6c 5f 49  test1_Init(Tcl_I
1bca0 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1bcb0 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1bcc0 73 74 32 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  st2_Init(Tcl_Int
1bcd0 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1bce0 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1bcf0 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  3_Init(Tcl_Inter
1bd00 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1bd10 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 34 5f  int Sqlitetest4_
1bd20 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1bd30 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
1bd40 74 20 53 71 6c 69 74 65 74 65 73 74 35 5f 49 6e  t Sqlitetest5_In
1bd50 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1bd60 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1bd70 53 71 6c 69 74 65 74 65 73 74 36 5f 49 6e 69 74  Sqlitetest6_Init
1bd80 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1bd90 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1bda0 6c 69 74 65 74 65 73 74 37 5f 49 6e 69 74 28 54  litetest7_Init(T
1bdb0 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1bdc0 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1bdd0 74 65 74 65 73 74 38 5f 49 6e 69 74 28 54 63 6c  tetest8_Init(Tcl
1bde0 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1bdf0 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1be00 74 65 73 74 39 5f 49 6e 69 74 28 54 63 6c 5f 49  test9_Init(Tcl_I
1be10 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1be20 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1be30 73 74 61 73 79 6e 63 5f 49 6e 69 74 28 54 63 6c  stasync_Init(Tcl
1be40 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1be50 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1be60 74 65 73 74 5f 61 75 74 6f 65 78 74 5f 49 6e 69  test_autoext_Ini
1be70 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
1be80 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1be90 71 6c 69 74 65 74 65 73 74 5f 64 65 6d 6f 76 66  qlitetest_demovf
1bea0 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  s_Init(Tcl_Inter
1beb0 70 20 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  p *);.    extern
1bec0 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f   int Sqlitetest_
1bed0 66 75 6e 63 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  func_Init(Tcl_In
1bee0 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
1bef0 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1bf00 74 5f 68 65 78 69 6f 5f 49 6e 69 74 28 54 63 6c  t_hexio_Init(Tcl
1bf10 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1bf20 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1bf30 74 65 73 74 5f 69 6e 69 74 5f 49 6e 69 74 28 54  test_init_Init(T
1bf40 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1bf50 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1bf60 74 65 74 65 73 74 5f 6d 61 6c 6c 6f 63 5f 49 6e  tetest_malloc_In
1bf70 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1bf80 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1bf90 53 71 6c 69 74 65 74 65 73 74 5f 6d 75 74 65 78  Sqlitetest_mutex
1bfa0 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1bfb0 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1bfc0 6e 74 20 53 71 6c 69 74 65 74 65 73 74 73 63 68  nt Sqlitetestsch
1bfd0 65 6d 61 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  ema_Init(Tcl_Int
1bfe0 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1bff0 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1c000 73 73 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  sse_Init(Tcl_Int
1c010 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1c020 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1c030 74 63 6c 76 61 72 5f 49 6e 69 74 28 54 63 6c 5f  tclvar_Init(Tcl_
1c040 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
1c050 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1c060 65 73 74 66 73 5f 49 6e 69 74 28 54 63 6c 5f 49  estfs_Init(Tcl_I
1c070 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1c080 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1c090 73 74 54 68 72 65 61 64 5f 49 6e 69 74 28 54 63  stThread_Init(Tc
1c0a0 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1c0b0 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1c0c0 65 74 65 73 74 4f 6e 65 66 69 6c 65 5f 49 6e 69  etestOnefile_Ini
1c0d0 74 28 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  t();.    extern 
1c0e0 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 4f 73  int SqlitetestOs
1c0f0 69 6e 73 74 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  inst_Init(Tcl_In
1c100 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
1c110 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1c120 74 62 61 63 6b 75 70 5f 49 6e 69 74 28 54 63 6c  tbackup_Init(Tcl
1c130 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1c140 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1c150 74 65 73 74 69 6e 74 61 72 72 61 79 5f 49 6e 69  testintarray_Ini
1c160 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
1c170 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1c180 71 6c 69 74 65 74 65 73 74 76 66 73 5f 49 6e 69  qlitetestvfs_Ini
1c190 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29 3b  t(Tcl_Interp *);
1c1a0 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1c1b0 53 71 6c 69 74 65 74 65 73 74 72 74 72 65 65 5f  Sqlitetestrtree_
1c1c0 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1c1d0 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
1c1e0 74 20 53 71 6c 69 74 65 71 75 6f 74 61 5f 49 6e  t Sqlitequota_In
1c1f0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1c200 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1c210 53 71 6c 69 74 65 6d 75 6c 74 69 70 6c 65 78 5f  Sqlitemultiplex_
1c220 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1c230 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
1c240 74 20 53 71 6c 69 74 65 53 75 70 65 72 6c 6f 63  t SqliteSuperloc
1c250 6b 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  k_Init(Tcl_Inter
1c260 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1c270 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 53 79  int SqlitetestSy
1c280 73 63 61 6c 6c 5f 49 6e 69 74 28 54 63 6c 5f 49  scall_Init(Tcl_I
1c290 6e 74 65 72 70 2a 29 3b 0a 0a 23 69 66 20 64 65  nterp*);..#if de
1c2a0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
1c2b0 42 4c 45 5f 46 54 53 33 29 20 7c 7c 20 64 65 66  BLE_FTS3) || def
1c2c0 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
1c2d0 4c 45 5f 46 54 53 34 29 0a 20 20 20 20 65 78 74  LE_FTS4).    ext
1c2e0 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1c2f0 73 74 66 74 73 33 5f 49 6e 69 74 28 54 63 6c 5f  stfts3_Init(Tcl_
1c300 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 3b  Interp *interp);
1c310 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
1c320 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 5a 49  SQLITE_ENABLE_ZI
1c330 50 56 46 53 0a 20 20 20 20 65 78 74 65 72 6e 20  PVFS.    extern 
1c340 69 6e 74 20 5a 69 70 76 66 73 5f 49 6e 69 74 28  int Zipvfs_Init(
1c350 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1c360 20 20 5a 69 70 76 66 73 5f 49 6e 69 74 28 69 6e    Zipvfs_Init(in
1c370 74 65 72 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  terp);.#endif.. 
1c380 20 20 20 53 71 6c 69 74 65 63 6f 6e 66 69 67 5f     Sqliteconfig_
1c390 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
1c3a0 20 20 53 71 6c 69 74 65 74 65 73 74 31 5f 49 6e    Sqlitetest1_In
1c3b0 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1c3c0 53 71 6c 69 74 65 74 65 73 74 32 5f 49 6e 69 74  Sqlitetest2_Init
1c3d0 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1c3e0 6c 69 74 65 74 65 73 74 33 5f 49 6e 69 74 28 69  litetest3_Init(i
1c3f0 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1c400 74 65 74 65 73 74 34 5f 49 6e 69 74 28 69 6e 74  tetest4_Init(int
1c410 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1c420 74 65 73 74 35 5f 49 6e 69 74 28 69 6e 74 65 72  test5_Init(inter
1c430 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
1c440 73 74 36 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  st6_Init(interp)
1c450 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
1c460 37 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  7_Init(interp);.
1c470 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 38 5f      Sqlitetest8_
1c480 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
1c490 20 20 53 71 6c 69 74 65 74 65 73 74 39 5f 49 6e    Sqlitetest9_In
1c4a0 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1c4b0 53 71 6c 69 74 65 74 65 73 74 61 73 79 6e 63 5f  Sqlitetestasync_
1c4c0 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
1c4d0 20 20 53 71 6c 69 74 65 74 65 73 74 5f 61 75 74    Sqlitetest_aut
1c4e0 6f 65 78 74 5f 49 6e 69 74 28 69 6e 74 65 72 70  oext_Init(interp
1c4f0 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
1c500 74 5f 64 65 6d 6f 76 66 73 5f 49 6e 69 74 28 69  t_demovfs_Init(i
1c510 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1c520 74 65 74 65 73 74 5f 66 75 6e 63 5f 49 6e 69 74  tetest_func_Init
1c530 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1c540 6c 69 74 65 74 65 73 74 5f 68 65 78 69 6f 5f 49  litetest_hexio_I
1c550 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1c560 20 53 71 6c 69 74 65 74 65 73 74 5f 69 6e 69 74   Sqlitetest_init
1c570 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
1c580 20 20 20 53 71 6c 69 74 65 74 65 73 74 5f 6d 61     Sqlitetest_ma
1c590 6c 6c 6f 63 5f 49 6e 69 74 28 69 6e 74 65 72 70  lloc_Init(interp
1c5a0 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
1c5b0 74 5f 6d 75 74 65 78 5f 49 6e 69 74 28 69 6e 74  t_mutex_Init(int
1c5c0 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1c5d0 74 65 73 74 73 63 68 65 6d 61 5f 49 6e 69 74 28  testschema_Init(
1c5e0 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
1c5f0 69 74 65 74 65 73 74 74 63 6c 76 61 72 5f 49 6e  itetesttclvar_In
1c600 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1c610 53 71 6c 69 74 65 74 65 73 74 66 73 5f 49 6e 69  Sqlitetestfs_Ini
1c620 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
1c630 71 6c 69 74 65 74 65 73 74 54 68 72 65 61 64 5f  qlitetestThread_
1c640 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
1c650 20 20 53 71 6c 69 74 65 74 65 73 74 4f 6e 65 66    SqlitetestOnef
1c660 69 6c 65 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  ile_Init(interp)
1c670 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
1c680 4f 73 69 6e 73 74 5f 49 6e 69 74 28 69 6e 74 65  Osinst_Init(inte
1c690 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
1c6a0 65 73 74 62 61 63 6b 75 70 5f 49 6e 69 74 28 69  estbackup_Init(i
1c6b0 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1c6c0 74 65 74 65 73 74 69 6e 74 61 72 72 61 79 5f 49  tetestintarray_I
1c6d0 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1c6e0 20 53 71 6c 69 74 65 74 65 73 74 76 66 73 5f 49   Sqlitetestvfs_I
1c6f0 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1c700 20 53 71 6c 69 74 65 74 65 73 74 72 74 72 65 65   Sqlitetestrtree
1c710 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
1c720 20 20 20 53 71 6c 69 74 65 71 75 6f 74 61 5f 49     Sqlitequota_I
1c730 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1c740 20 53 71 6c 69 74 65 6d 75 6c 74 69 70 6c 65 78   Sqlitemultiplex
1c750 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
1c760 20 20 20 53 71 6c 69 74 65 53 75 70 65 72 6c 6f     SqliteSuperlo
1c770 63 6b 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  ck_Init(interp);
1c780 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 53  .    SqlitetestS
1c790 79 73 63 61 6c 6c 5f 49 6e 69 74 28 69 6e 74 65  yscall_Init(inte
1c7a0 72 70 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65  rp);..#if define
1c7b0 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
1c7c0 46 54 53 33 29 20 7c 7c 20 64 65 66 69 6e 65 64  FTS3) || defined
1c7d0 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46  (SQLITE_ENABLE_F
1c7e0 54 53 34 29 0a 20 20 20 20 53 71 6c 69 74 65 74  TS4).    Sqlitet
1c7f0 65 73 74 66 74 73 33 5f 49 6e 69 74 28 69 6e 74  estfts3_Init(int
1c800 65 72 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  erp);.#endif..  
1c810 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
1c820 6f 6d 6d 61 6e 64 28 0a 20 20 20 20 20 20 20 20  ommand(.        
1c830 69 6e 74 65 72 70 2c 20 22 6c 6f 61 64 5f 74 65  interp, "load_te
1c840 73 74 66 69 78 74 75 72 65 5f 65 78 74 65 6e 73  stfixture_extens
1c850 69 6f 6e 73 22 2c 20 69 6e 69 74 5f 61 6c 6c 5f  ions", init_all_
1c860 63 6d 64 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b  cmd, 0, 0.    );
1c870 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
1c880 62 6a 43 6f 6d 6d 61 6e 64 28 0a 20 20 20 20 20  bjCommand(.     
1c890 20 20 20 69 6e 74 65 72 70 2c 20 22 64 62 5f 75     interp, "db_u
1c8a0 73 65 5f 6c 65 67 61 63 79 5f 70 72 65 70 61 72  se_legacy_prepar
1c8b0 65 22 2c 20 64 62 5f 75 73 65 5f 6c 65 67 61 63  e", db_use_legac
1c8c0 79 5f 70 72 65 70 61 72 65 5f 63 6d 64 2c 20 30  y_prepare_cmd, 0
1c8d0 2c 20 30 0a 20 20 20 20 29 3b 0a 0a 23 69 66 64  , 0.    );..#ifd
1c8e0 65 66 20 53 51 4c 49 54 45 5f 53 53 45 0a 20 20  ef SQLITE_SSE.  
1c8f0 20 20 53 71 6c 69 74 65 74 65 73 74 73 73 65 5f    Sqlitetestsse_
1c900 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 23 65  Init(interp);.#e
1c910 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ndif.  }.#endif.
1c920 7d 0a 0a 23 64 65 66 69 6e 65 20 54 43 4c 53 48  }..#define TCLSH
1c930 5f 4d 41 49 4e 20 6d 61 69 6e 20 20 20 2f 2a 20  _MAIN main   /* 
1c940 4e 65 65 64 65 64 20 74 6f 20 66 61 6b 65 20 6f  Needed to fake o
1c950 75 74 20 6d 6b 74 63 6c 61 70 70 20 2a 2f 0a 69  ut mktclapp */.i
1c960 6e 74 20 54 43 4c 53 48 5f 4d 41 49 4e 28 69 6e  nt TCLSH_MAIN(in
1c970 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61  t argc, char **a
1c980 72 67 76 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65  rgv){.  Tcl_Inte
1c990 72 70 20 2a 69 6e 74 65 72 70 3b 0a 0a 23 69 66  rp *interp;..#if
1c9a0 20 21 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32   !defined(_WIN32
1c9b0 5f 57 43 45 29 0a 20 20 69 66 28 20 67 65 74 65  _WCE).  if( gete
1c9c0 6e 76 28 22 42 52 45 41 4b 22 29 20 29 7b 0a 20  nv("BREAK") ){. 
1c9d0 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
1c9e0 72 2c 0a 20 20 20 20 20 20 20 20 22 61 74 74 61  r,.        "atta
1c9f0 63 68 20 64 65 62 75 67 67 65 72 20 74 6f 20 70  ch debugger to p
1ca00 72 6f 63 65 73 73 20 25 64 20 61 6e 64 20 70 72  rocess %d and pr
1ca10 65 73 73 20 61 6e 79 20 6b 65 79 20 74 6f 20 63  ess any key to c
1ca20 6f 6e 74 69 6e 75 65 2e 5c 6e 22 2c 0a 20 20 20  ontinue.\n",.   
1ca30 20 20 20 20 20 47 45 54 50 49 44 28 29 29 3b 0a       GETPID());.
1ca40 20 20 20 20 66 67 65 74 63 28 73 74 64 69 6e 29      fgetc(stdin)
1ca50 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
1ca60 2f 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 5f  /* Call sqlite3_
1ca70 73 68 75 74 64 6f 77 6e 28 29 20 6f 6e 63 65 20  shutdown() once 
1ca80 62 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79  before doing any
1ca90 74 68 69 6e 67 20 65 6c 73 65 2e 20 54 68 69 73  thing else. This
1caa0 20 69 73 20 74 6f 0a 20 20 2a 2a 20 74 65 73 74   is to.  ** test
1cab0 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f 73 68   that sqlite3_sh
1cac0 75 74 64 6f 77 6e 28 29 20 63 61 6e 20 62 65 20  utdown() can be 
1cad0 73 61 66 65 6c 79 20 63 61 6c 6c 65 64 20 62 79  safely called by
1cae0 20 61 20 70 72 6f 63 65 73 73 20 62 65 66 6f 72   a process befor
1caf0 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 69  e.  ** sqlite3_i
1cb00 6e 69 74 69 61 6c 69 7a 65 28 29 20 69 73 2e 20  nitialize() is. 
1cb10 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 68 75  */.  sqlite3_shu
1cb20 74 64 6f 77 6e 28 29 3b 0a 0a 20 20 54 63 6c 5f  tdown();..  Tcl_
1cb30 46 69 6e 64 45 78 65 63 75 74 61 62 6c 65 28 61  FindExecutable(a
1cb40 72 67 76 5b 30 5d 29 3b 0a 20 20 69 6e 74 65 72  rgv[0]);.  inter
1cb50 70 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 49 6e  p = Tcl_CreateIn
1cb60 74 65 72 70 28 29 3b 0a 0a 23 69 66 20 54 43 4c  terp();..#if TCL
1cb70 53 48 3d 3d 32 0a 20 20 73 71 6c 69 74 65 33 5f  SH==2.  sqlite3_
1cb80 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f  config(SQLITE_CO
1cb90 4e 46 49 47 5f 53 49 4e 47 4c 45 54 48 52 45 41  NFIG_SINGLETHREA
1cba0 44 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 6e  D);.#endif..  in
1cbb0 69 74 5f 61 6c 6c 28 69 6e 74 65 72 70 29 3b 0a  it_all(interp);.
1cbc0 20 20 69 66 28 20 61 72 67 63 3e 3d 32 20 29 7b    if( argc>=2 ){
1cbd0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
1cbe0 63 68 61 72 20 7a 41 72 67 63 5b 33 32 5d 3b 0a  char zArgc[32];.
1cbf0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
1cc00 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 41 72 67  intf(sizeof(zArg
1cc10 63 29 2c 20 7a 41 72 67 63 2c 20 22 25 64 22 2c  c), zArgc, "%d",
1cc20 20 61 72 67 63 2d 28 33 2d 54 43 4c 53 48 29 29   argc-(3-TCLSH))
1cc30 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72  ;.    Tcl_SetVar
1cc40 28 69 6e 74 65 72 70 2c 22 61 72 67 63 22 2c 20  (interp,"argc", 
1cc50 7a 41 72 67 63 2c 20 54 43 4c 5f 47 4c 4f 42 41  zArgc, TCL_GLOBA
1cc60 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 54 63 6c  L_ONLY);.    Tcl
1cc70 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 22  _SetVar(interp,"
1cc80 61 72 67 76 30 22 2c 61 72 67 76 5b 31 5d 2c 54  argv0",argv[1],T
1cc90 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b  CL_GLOBAL_ONLY);
1cca0 0a 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28  .    Tcl_SetVar(
1ccb0 69 6e 74 65 72 70 2c 22 61 72 67 76 22 2c 20 22  interp,"argv", "
1ccc0 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e  ", TCL_GLOBAL_ON
1ccd0 4c 59 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 33  LY);.    for(i=3
1cce0 2d 54 43 4c 53 48 3b 20 69 3c 61 72 67 63 3b 20  -TCLSH; i<argc; 
1ccf0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  i++){.      Tcl_
1cd00 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 20 22  SetVar(interp, "
1cd10 61 72 67 76 22 2c 20 61 72 67 76 5b 69 5d 2c 0a  argv", argv[i],.
1cd20 20 20 20 20 20 20 20 20 20 20 54 43 4c 5f 47 4c            TCL_GL
1cd30 4f 42 41 4c 5f 4f 4e 4c 59 20 7c 20 54 43 4c 5f  OBAL_ONLY | TCL_
1cd40 4c 49 53 54 5f 45 4c 45 4d 45 4e 54 20 7c 20 54  LIST_ELEMENT | T
1cd50 43 4c 5f 41 50 50 45 4e 44 5f 56 41 4c 55 45 29  CL_APPEND_VALUE)
1cd60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1cd70 54 43 4c 53 48 3d 3d 31 20 26 26 20 54 63 6c 5f  TCLSH==1 && Tcl_
1cd80 45 76 61 6c 46 69 6c 65 28 69 6e 74 65 72 70 2c  EvalFile(interp,
1cd90 20 61 72 67 76 5b 31 5d 29 21 3d 54 43 4c 5f 4f   argv[1])!=TCL_O
1cda0 4b 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  K ){.      const
1cdb0 20 63 68 61 72 20 2a 7a 49 6e 66 6f 20 3d 20 54   char *zInfo = T
1cdc0 63 6c 5f 47 65 74 56 61 72 28 69 6e 74 65 72 70  cl_GetVar(interp
1cdd0 2c 20 22 65 72 72 6f 72 49 6e 66 6f 22 2c 20 54  , "errorInfo", T
1cde0 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b  CL_GLOBAL_ONLY);
1cdf0 0a 20 20 20 20 20 20 69 66 28 20 7a 49 6e 66 6f  .      if( zInfo
1ce00 3d 3d 30 20 29 20 7a 49 6e 66 6f 20 3d 20 54 63  ==0 ) zInfo = Tc
1ce10 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
1ce20 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 20  t(interp);.     
1ce30 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
1ce40 22 25 73 3a 20 25 73 5c 6e 22 2c 20 2a 61 72 67  "%s: %s\n", *arg
1ce50 76 2c 20 7a 49 6e 66 6f 29 3b 0a 20 20 20 20 20  v, zInfo);.     
1ce60 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
1ce70 0a 20 20 7d 0a 20 20 69 66 28 20 54 43 4c 53 48  .  }.  if( TCLSH
1ce80 3d 3d 32 20 7c 7c 20 61 72 67 63 3c 3d 31 20 29  ==2 || argc<=1 )
1ce90 7b 0a 20 20 20 20 54 63 6c 5f 47 6c 6f 62 61 6c  {.    Tcl_Global
1cea0 45 76 61 6c 28 69 6e 74 65 72 70 2c 20 74 63 6c  Eval(interp, tcl
1ceb0 73 68 5f 6d 61 69 6e 5f 6c 6f 6f 70 28 29 29 3b  sh_main_loop());
1cec0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
1ced0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 54 43 4c  .}.#endif /* TCL
1cee0 53 48 20 2a 2f 0a                                SH */.